{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [ "hide-input", "output-scoll" ] }, "outputs": [], "source": [ "#Install the necessary dependencies\n", "import os\n", "import sys\n", "!{sys.executable} -m pip install --quiet pandas scikit-learn numpy matplotlib jupyterlab_myst ipython python_utils" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "remove-cell" ] }, "source": [ "---\n", "license:\n", " code: MIT\n", " content: CC-BY-4.0\n", "github: https://github.com/ocademy-ai/machine-learning\n", "venue: By Ocademy\n", "open_access: true\n", "bibliography:\n", " - https://raw.githubusercontent.com/ocademy-ai/machine-learning/main/open-machine-learning-jupyter-book/references.bib\n", "---" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "# Managing data\n", "\n", "## Build a regression model using Scikit-learn: prepare and visualize data\n", "\n", ":::{figure} https://static-1300131294.cos.ap-shanghai.myqcloud.com/images/ml-regression/data-visualization.png\n", "---\n", "name: 'Data visualization infographic'\n", "width: 90%\n", "---\n", "Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded)\n", ":::\n", "\n", "## Introduction\n", "\n", "Now that you are set up with the tools you need to start tackling machine learning model building with Scikit-learn, you are ready to start asking questions of your data. As you work with data and apply ML solutions, it's very important to understand how to ask the right question to properly unlock the potentials of your dataset.\n", "\n", "In this section, you will learn:\n", "\n", "- How to prepare your data for model-building.\n", "- How to use Matplotlib for data visualization.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ":::{seealso}\n", "Click to watch : Preparing and Visualizing data video.\n", ":::" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [ "hide-input", "output-scoll" ] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", "
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.display import HTML\n", "display(HTML(\"\"\"\n", "
\n", " \n", "
\n", "\"\"\"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Asking the right question of your data\n", "\n", "The question you need answered will determine what type of Machine Learning algorithms you will leverage. And the quality of the answer you get back will be heavily dependent on the nature of your data.\n", "\n", "Take a look at the [data](https://static-1300131294.cos.ap-shanghai.myqcloud.com/data/us-pumpkins.csv) provided for this section. You can open this .csv file in VS Code. A quick skim immediately shows that there are blanks and a mix of strings and numeric data. There's also a strange column called 'Package' where the data is a mix between 'sacks', 'bins' and other values. The data, in fact, is a bit of a mess.\n", "\n", "In fact, it is not very common to be gifted a dataset that is completely ready to use to create a Machine Learning model out of the box. In this section, you will learn how to prepare a raw dataset using standard Python libraries. You will also learn various techniques to visualize the data.\n", "\n", "## Case study: 'the pumpkin market'\n", "\n", "You will find a .csv file in the root `/assets/data/` folder called us-pumpkins.csv which includes 1757 lines of data about the market for pumpkins, sorted into groupings by city. This is raw data extracted from the [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) distributed by the United States Department of Agriculture.\n", "\n", "### Preparing data\n", "\n", "This data is in the public domain. It can be downloaded in many separate files, per city, from the USDA website. To avoid too many separate files, we have concatenated all the city data into one spreadsheet, thus we have already _prepared_ the data a bit. Next, let's take a closer look at the data.\n", "\n", "### The pumpkin data - early conclusions\n", "\n", "What do you notice about this data? You already saw that there is a mix of strings, numbers, blanks and strange values that you need to make sense of.\n", "\n", "What question can you ask of this data, using a Regression technique? What about \"Predict the price of a pumpkin for sale during a given month\". Looking again at the data, there are some changes you need to make to create the data structure necessary for the task.\n", "\n", "## Exercise - analyze the pumpkin data\n", "\n", "Let's use [Pandas](https://pandas.pydata.org/), a very useful tool for shaping data, to analyze and prepare this pumpkin data.\n", "\n", "### First, check for missing dates\n", "\n", "You will first need to take steps to check for missing dates:\n", "\n", "1. Convert the dates to a month format (these are US dates, so the format is `MM/DD/YYYY`).\n", "2. Extract the month to a new column.\n", "\n", "Open the [managing-data.ipynb](https://github.com/ocademy-ai/machine-learning/open-machine-learning-jupyter-book/ml-fundamentals/regression/managing-data.ipynb) file in Visual Studio Code and import the spreadsheet in to a new Pandas dataframe.\n", "\n", "1 . Use the `head()` function to view the first five rows.\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [ "hide-input", "output-scoll" ] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
City NameTypePackageVarietySub VarietyGradeDateLow PriceHigh PriceMostly Low...Unit of SaleQualityConditionAppearanceStorageCropRepackTrans ModeUnnamed: 24Unnamed: 25
0BALTIMORENaN24 inch binsNaNNaNNaN4/29/17270.0280.0270.0...NaNNaNNaNNaNNaNNaNENaNNaNNaN
1BALTIMORENaN24 inch binsNaNNaNNaN5/6/17270.0280.0270.0...NaNNaNNaNNaNNaNNaNENaNNaNNaN
2BALTIMORENaN24 inch binsHOWDEN TYPENaNNaN9/24/16160.0160.0160.0...NaNNaNNaNNaNNaNNaNNNaNNaNNaN
3BALTIMORENaN24 inch binsHOWDEN TYPENaNNaN9/24/16160.0160.0160.0...NaNNaNNaNNaNNaNNaNNNaNNaNNaN
4BALTIMORENaN24 inch binsHOWDEN TYPENaNNaN11/5/1690.0100.090.0...NaNNaNNaNNaNNaNNaNNNaNNaNNaN
\n", "

5 rows × 26 columns

\n", "
" ], "text/plain": [ " City Name Type Package Variety Sub Variety Grade Date \\\n", "0 BALTIMORE NaN 24 inch bins NaN NaN NaN 4/29/17 \n", "1 BALTIMORE NaN 24 inch bins NaN NaN NaN 5/6/17 \n", "2 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n", "3 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n", "4 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 11/5/16 \n", "\n", " Low Price High Price Mostly Low ... Unit of Sale Quality Condition \\\n", "0 270.0 280.0 270.0 ... NaN NaN NaN \n", "1 270.0 280.0 270.0 ... NaN NaN NaN \n", "2 160.0 160.0 160.0 ... NaN NaN NaN \n", "3 160.0 160.0 160.0 ... NaN NaN NaN \n", "4 90.0 100.0 90.0 ... NaN NaN NaN \n", "\n", " Appearance Storage Crop Repack Trans Mode Unnamed: 24 Unnamed: 25 \n", "0 NaN NaN NaN E NaN NaN NaN \n", "1 NaN NaN NaN E NaN NaN NaN \n", "2 NaN NaN NaN N NaN NaN NaN \n", "3 NaN NaN NaN N NaN NaN NaN \n", "4 NaN NaN NaN N NaN NaN NaN \n", "\n", "[5 rows x 26 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "pumpkins = pd.read_csv('https://static-1300131294.cos.ap-shanghai.myqcloud.com/data/us-pumpkins.csv')\n", "pumpkins.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ":::{note}\n", "What function would you use to view the last five rows?\n", ":::\n", "\n", "2 . Check if there is missing data in the current dataframe:\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [ "hide-input", "output-scoll" ] }, "outputs": [ { "data": { "text/plain": [ "City Name 0\n", "Type 1712\n", "Package 0\n", "Variety 5\n", "Sub Variety 1461\n", "Grade 1757\n", "Date 0\n", "Low Price 0\n", "High Price 0\n", "Mostly Low 103\n", "Mostly High 103\n", "Origin 3\n", "Origin District 1626\n", "Item Size 279\n", "Color 616\n", "Environment 1757\n", "Unit of Sale 1595\n", "Quality 1757\n", "Condition 1757\n", "Appearance 1757\n", "Storage 1757\n", "Crop 1757\n", "Repack 0\n", "Trans Mode 1757\n", "Unnamed: 24 1757\n", "Unnamed: 25 1654\n", "dtype: int64" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pumpkins.isnull().sum()" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "3 . To make your dataframe easier to work with, drop several of its columns, using `drop()`, keeping only the columns you need:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [ "hide-input", "output-scoll" ] }, "outputs": [], "source": [ "new_columns = ['Package', 'Month', 'Low Price', 'High Price', 'Date']\n", "pumpkins = pumpkins.drop([c for c in pumpkins.columns if c not in new_columns], axis=1)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Second, determine average price of pumpkin\n", "\n", "Think about how to determine the average price of a pumpkin in a given month. What columns would you pick for this task? Hint: you'll need 3 columns.\n", "\n", "Solution: take the average of the `Low Price` and `High Price` columns to populate the new Price column, and convert the Date column to only show the month. Fortunately, according to the check above, there is no missing data for dates or prices.\n", "\n", "1 . To calculate the average, add the following code:\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "tags": [ "hide-input", "output-scoll" ] }, "outputs": [], "source": [ "price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2\n", "month = pd.DatetimeIndex(pumpkins['Date']).month\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ":::{seealso}\n", "Feel free to print any data you'd like to check using `print(month)`.\n", ":::\n", "\n", "2 . Now, copy your converted data into a fresh Pandas dataframe:\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "tags": [ "hide-input", "output-scoll" ] }, "outputs": [], "source": [ "new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Printing out your dataframe will show you a clean, tidy dataset on which you can build your new regression model.\n", "\n", "### But wait! There's something odd here\n", "\n", "If you look at the `Package` column, pumpkins are sold in many different configurations. Some are sold in '1 1/9 bushel' measures, and some in '1/2 bushel' measures, some per pumpkin, some per pound, and some in big boxes with varying widths.\n", "\n", ":::{note}\n", "Pumpkins seem very hard to weigh consistently.\n", ":::\n", "\n", "Digging into the original data, it's interesting that anything with `Unit of Sale` equalling 'EACH' or 'PER BIN' also have the `Package` type per inch, per bin, or 'each'. Pumpkins seem to be very hard to weigh consistently, so let's filter them by selecting only pumpkins with the string 'bushel' in their `Package` column.\n", "\n", "1. Add a filter at the top of the file, under the initial .csv import:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "tags": [ "hide-input", "output-scoll" ] }, "outputs": [], "source": [ "pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you print the data now, you can see that you are only getting the 415 or so rows of data containing pumpkins by the bushel.\n", "\n", "### But wait! There's one more thing to do\n", "\n", "Did you notice that the bushel amount varies per row? You need to normalize the pricing so that you show the pricing per bushel, so do some math to standardize it.\n", "\n", "1. Add these lines after the block creating the new_pumpkins dataframe:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "tags": [ "hide-input", "output-scoll" ] }, "outputs": [], "source": [ "new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)\n", "\n", "new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ":::{seealso}\n", "According to [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), a bushel's weight depends on the type of produce, as it's a volume measurement. \"A bushel of tomatoes, for example, is supposed to weigh 56 pounds... Leaves and greens take up more space with less weight, so a bushel of spinach is only 20 pounds.\" It's all pretty complicated! Let's not bother with making a bushel-to-pound conversion, and instead price by the bushel. All this study of bushels of pumpkins, however, goes to show how very important it is to understand the nature of your data!\n", ":::\n", "\n", "Now, you can analyze the pricing per unit based on their bushel measurement. If you print out the data one more time, you can see how it's standardized.\n", "\n", ":::{seealso}\n", "Did you notice that pumpkins sold by the half-bushel are very expensive? Can you figure out why? Hint: little pumpkins are way pricier than big ones, probably because there are so many more of them per bushel, given the unused space taken by one big hollow pie pumpkin.\n", ":::\n", "\n", "## Visualization strategies\n", "\n", "Part of the data scientist's role is to demonstrate the quality and nature of the data they are working with. To do this, they often create interesting visualizations, or plots, graphs, and charts, showing different aspects of data. In this way, they are able to visually show relationships and gaps that are otherwise hard to uncover.\n", "\n", "Visualizations can also help determine the machine learning technique most appropriate for the data. A scatterplot that seems to follow a line, for example, indicates that the data is a good candidate for a linear regression exercise.\n", "\n", "One data visualization library that works well in Jupyter notebooks is [Matplotlib](https://matplotlib.org/) (which you also saw in the previous lesson).\n", "\n", ":::{seealso}\n", "Get more experience with data visualization in [these tutorials](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott).\n", ":::\n", "\n", "## Exercise - experiment with Matplotlib\n", "\n", "Try to create some basic plots to display the new dataframe you just created. What would a basic line plot show?\n", "\n", "1 . Import Matplotlib at the top of the file, under the Pandas import:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "tags": [ "hide-input", "output-scoll" ] }, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "2 . Rerun the entire notebook to refresh.\n", "\n", "3 . At the bottom of the notebook, add a cell to plot the data as a box:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "tags": [ "hide-input", "output-scoll" ] }, "outputs": [ { "data": { "image/png": "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YMZZJAozzgIYKhJx/iakAACAAWPGWQAAMGIQUgAAgJEIKQAAwEiEFAAAYCRCCgAAMBIhBQAAGImQAgAAjERIAQAARiKkAAAAIxk3v3ZoAtxAIJDkSgAAgF2h87aTE9kbF1Lq6+slSUVFRUmuBAAA9FV9fb18Pp8j6zLu/+4JBoP64IMPlJ2dLZfLFf8BfRAIBFRUVKSjR4/y/wINIvo9Oej35KDfk4N+T46u/Z6dna36+noVFBTI7Xbm1yTGfZLidrtVWFiY0G14vV524iSg35ODfk8O+j056PfkCPW7U5+ghPDDWQAAYCRCCgAAMNKICikZGRlaunSpMjIykl3KiEK/Jwf9nhz0e3LQ78mR6H437oezAAAA0gj7JAUAAAwdhBQAAGAkQgoAADASIQUAABhpxISU3/zmNyouLpbH49HUqVO1bdu2ZJc0pG3dulVz5sxRQUGBXC6X/vM//7Pb/ZZladmyZSooKFBmZqa++tWv6q233urWpqWlRbfffrtOPfVUjRo1SnPnztWxY8cG8VkMLeXl5brggguUnZ2t3NxcfeMb39CBAwe6taHfE2PlypWaNGlSeMKqadOm6eWXXw7fT78nXnl5uVwul+64447wMvrdecuWLZPL5ep2y8vLC98/6H1ujQBr16610tLSrFWrVlmVlZXWokWLrFGjRlmHDx9OdmlD1saNG61//ud/tl544QVLkrVu3bpu999///1Wdna29cILL1j79u2zrrnmGis/P98KBALhNrfccot1+umnW5s3b7YqKiqsSy+91DrvvPOs9vb2QX42Q8PXv/5166mnnrL2799v7dmzx7rqqqus8ePHWw0NDeE29HtirF+/3nrppZesAwcOWAcOHLCWLFlipaWlWfv377csi35PtB07dlgTJ060Jk2aZC1atCi8nH533tKlS61zzjnHqq6uDt9qa2vD9w92n4+IkFJWVmbdcsst3ZadddZZ1t13352kioaXniElGAxaeXl51v333x9e1tzcbPl8PuvRRx+1LMuyPvnkEystLc1au3ZtuM37779vud1ua9OmTYNW+1BWW1trSbK2bNliWRb9PtjGjBlj/fa3v6XfE6y+vt76whe+YG3evNmaMWNGOKTQ74mxdOlS67zzzot4XzL6fNh/3dPa2qpdu3bpiiuu6Lb8iiuu0BtvvJGkqoa3qqoq1dTUdOvzjIwMzZgxI9znu3btUltbW7c2BQUFKi0t5XWxye/3S5JycnIk0e+DpaOjQ2vXrtXJkyc1bdo0+j3BbrvtNl111VW6/PLLuy2n3xPn3XffVUFBgYqLi3Xttdfq4MGDkpLT58b9B4NO+/jjj9XR0aFx48Z1Wz5u3DjV1NQkqarhLdSvkfr88OHD4Tbp6ekaM2ZMrza8LvFZlqUf/ehHuvjii1VaWiqJfk+0ffv2adq0aWpubtbo0aO1bt06lZSUhA+89Lvz1q5dq4qKCu3cubPXfezvifHlL39Zzz77rM4880x9+OGHuvfee3XhhRfqrbfeSkqfD/uQEuJyubr9bVlWr2VwVn/6nNfFnoULF2rv3r16/fXXe91HvyfGF7/4Re3Zs0effPKJXnjhBd14443asmVL+H763VlHjx7VokWL9Mc//lEejydqO/rdWVdeeWX43+eee66mTZumz3/+83rmmWf0la98RdLg9vmw/7rn1FNPVUpKSq8EV1tb2ysNwhmhX4LH6vO8vDy1trbqxIkTUdsgsttvv13r16/Xq6++qsLCwvBy+j2x0tPTdcYZZ+j8889XeXm5zjvvPP3qV7+i3xNk165dqq2t1dSpU5WamqrU1FRt2bJFDz/8sFJTU8P9Rr8n1qhRo3Tuuefq3XffTcq+PuxDSnp6uqZOnarNmzd3W75582ZdeOGFSapqeCsuLlZeXl63Pm9tbdWWLVvCfT516lSlpaV1a1NdXa39+/fzukRhWZYWLlyoF198Ua+88oqKi4u73U+/Dy7LstTS0kK/J8jXvvY17du3T3v27Anfzj//fH3ve9/Tnj179LnPfY5+HwQtLS16++23lZ+fn5x9vc8/tR2CQpcgP/HEE1ZlZaV1xx13WKNGjbIOHTqU7NKGrPr6emv37t3W7t27LUnWL37xC2v37t3hy7rvv/9+y+fzWS+++KK1b98+67rrrot4mVphYaH1pz/9yaqoqLAuu+wyLg2M4dZbb7V8Pp/12muvdbs8sLGxMdyGfk+MxYsXW1u3brWqqqqsvXv3WkuWLLHcbrf1xz/+0bIs+n2wdL26x7Lo90T4x3/8R+u1116zDh48aL355pvW1VdfbWVnZ4fPl4Pd5yMipFiWZf3617+2JkyYYKWnp1tTpkwJX7aJ/nn11VctSb1uN954o2VZnZeqLV261MrLy7MyMjKsSy65xNq3b1+3dTQ1NVkLFy60cnJyrMzMTOvqq6+2jhw5koRnMzRE6m9J1lNPPRVuQ78nxk033RQ+fpx22mnW1772tXBAsSz6fbD0DCn0u/NC856kpaVZBQUF1re+9S3rrbfeCt8/2H3usizL6tdnQAAAAAk07H+TAgAAhiZCCgAAMBIhBQAAGImQAgAAjERIAQAARiKkAAAAIxFSAACAkQgpAADASIQUAABgJEIKAAAwEiEFAAAYiZACAACM9H8AkIXaqBPnCS0AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "price = new_pumpkins.Price\n", "month = new_pumpkins.Month\n", "plt.scatter(price, month)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ":::{note}\n", "A scatterplot showing price to month relationship.\n", ":::\n", "\n", "Is this a useful plot? Does anything about it surprise you?\n", "\n", "It's not particularly useful as all it does is display in your data as a spread of points in a given month.\n", "\n", "### Make it useful\n", "\n", "To get charts to display useful data, you usually need to group the data somehow. Let's try creating a plot where the y axis shows the months and the data demonstrates the distribution of data.\n", "\n", "1. Add a cell to create a grouped bar chart:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "tags": [ "hide-input", "output-scoll" ] }, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Pumpkin Price')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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AAAAXA1lBwAA2BplBwAA2BplBwAA2BplB/ACzvMHAP9li0vPAV8LCQnRrl271LRpU19HAfxWXl6e5s6dq5ycHOXl5SkgIECJiYm6//77NXjwYAUEBPg6ImyKIzvXQW5uroYMGeLrGCouLlZOTo6+/PLLCmPnz5/Xa6+95oNU7vbv36/58+frH//4hyTpH//4h4YNG6YhQ4Zow4YNPk536QaWl1vKyso0bdo0a93fnDp1SrNmzdKIESP0wgsvKDc319eR9MUXX+jw4cPW+uLFi9W+fXslJCSoQ4cOWrp0qQ/T/cuoUaP08ccf+zrGL5o9e7YGDRqkN998U5K0aNEiNWvWTLfeeqsmTpyoixcv+jTftm3b1LRpU61cuVLnz5/XV199pTvvvFNhYWEaO3as7r77bhUVFfk0I2zMG08ex9Xt3LnT1KhRw6cZDhw4YBo1amQcDoepUaOGSUlJMceOHbPGXS6XzzOuXr3aBAcHm+joaFOzZk2zevVqU69ePdOpUyfTsWNHExgYaD744AOfZnQ4HKZly5YmNTXVbXE4HKZ169YmNTXVpKWl+TSjMcbExcWZ48ePG2OM+eabb4zT6TROp9N07tzZNGjQwERGRpr9+/f7NOMdd9xhNmzYYIwx5tVXXzWhoaHmySefNHPnzjUZGRmmdu3aZt68eT7NaIyx/s40adLETJs2zeTl5fk6UgXPP/+8CQ8PN7179zZOp9NMmzbN1K1b17zwwgsmKyvL1KtXz/y///f/fJqxffv2JjMz01pftGiRadOmjTHGmJMnT5qWLVuaJ5980lfx3Jw5c8a88sorZvDgwea+++4z6enpZvDgwebVV181Z86c8XW8X+Ryucxzzz3n6xiW3NxcU1RUVGF7aWmp2bRp03XJQNnxgnffffeqy8yZM31eJO6//37TvXt383//93/m4MGDpkePHiYxMdF8++23xhj/KDtt27Y1kyZNMsYY88Ybb5ioqCgzceJEa3zixImmc+fOvopnjDEmKyvLJCYmVihdgYGBZt++fT5KVZHD4TA//PCDMcaYfv36mdTUVHP27FljjDHnz5833bt3Nw899JAvI5patWpZ33933HGH+Z//+R+38ddff900a9bMF9HcOBwOs379evPUU0+ZmJgYExQUZHr27GlWrlxpysrKfB3PGGPMjTfeaN5++21jzKUfrgICAszi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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')\n", "plt.ylabel(\"Pumpkin Price\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ":::{note}\n", "A bar chart showing price to month relationship.\n", ":::\n", "\n", "This is a more useful data visualization! It seems to indicate that the highest price for pumpkins occurs in September and October. Does that meet your expectation? Why or why not?\n", "\n", "## Self study\n", "\n", "Take a look at the many ways to visualize data. Make a list of the various libraries available and note which are best for given types of tasks, for example 2D visualizations vs. 3D visualizations. What do you discover?\n", "\n", "## Your turn! 🚀\n", "\n", "Explore the different types of visualization that Matplotlib offers. Which types are most appropriate for regression problems?\n", "\n", "Assignment - [Exploring visualization](https://github.com/ocademy-ai/machine-learning/open-machine-learning-jupyter-book/assignments/ml-fundamentals/exploring-visualizations.md)\n", "\n", "## Acknowledgments\n", "\n", "Thanks to Microsoft for creating the open-source course [ML-For-Beginners](https://github.com/microsoft/ML-For-Beginners). It inspires the majority of the content in this chapter.\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.4" } }, "nbformat": 4, "nbformat_minor": 4 }