{ "cells": [ { "cell_type": "markdown", "id": "237143ab", "metadata": {}, "source": [ "# Getting Started with Exploratory Data Analysis\n", "\n", "Now we get to start actual data science!\n", "\n", "\n", "Our goal this week is to explore the actual data, the values, in a dataset to get a basic idea of what is in the data. \n", "\n", "Summarizing and Visualizing Data are **very** important\n", "\n", "- People cannot interpret high dimensional or large samples quickly\n", "- Important in EDA to help you make decisions about the rest of your analysis\n", "- Important in how you report your results\n", "- Summaries are similar calculations to performance metrics we will see later\n", "- visualizations are often essential in debugging models\n", "\n", "\n", "**THEREFORE**\n", "- You have [a lot of chances](https://rhodyprog4ds.github.io/BrownFall22/syllabus/achievements.html#assignments-and-skills) to earn summarize and visualize\n", "- we will be picky when we assess if you earned them or not" ] }, { "cell_type": "code", "execution_count": 1, "id": "23ce0782", "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "id": "20568e84", "metadata": {}, "source": [ "## Staying Organized\n", "\n", "- See the new {ref}`resource:file-structure` section.\n", "- Be sure to accept assignments and close the feedback PR if you will not work on them\n", "\n", "## Loading Data and Examining Structure" ] }, { "cell_type": "code", "execution_count": 2, "id": "d5736bca", "metadata": {}, "outputs": [], "source": [ "coffee_data_url = 'https://raw.githubusercontent.com/jldbc/coffee-quality-database/master/data/robusta_data_cleaned.csv'\n", "coffee_df = pd.read_csv(coffee_data_url,index_col=0)" ] }, { "cell_type": "markdown", "id": "e44baf9a", "metadata": {}, "source": [ "So far, we've loaded data in a few different ways and then we've examined\n", "DataFrames as a data structure, looking at what different attributes they have\n", "and what some of the methods are, and how to get data into them." ] }, { "cell_type": "code", "execution_count": 3, "id": "0ae7ec98", "metadata": {}, "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", "
SpeciesOwnerCountry.of.OriginFarm.NameLot.NumberMillICO.NumberCompanyAltitudeRegion...ColorCategory.Two.DefectsExpirationCertification.BodyCertification.AddressCertification.Contactunit_of_measurementaltitude_low_metersaltitude_high_metersaltitude_mean_meters
1Robustaankole coffee producers coopUgandakyangundu cooperative societyNaNankole coffee producers0ankole coffee producers coop1488sheema south western...Green2June 26th, 2015Uganda Coffee Development Authoritye36d0270932c3b657e96b7b0278dfd85dc0fe74303077a1c6bac60e6f514691634a7f6eb5c85aae8m1488.01488.01488.0
2Robustanishant gurjerIndiasethuraman estate kaapi royale25sethuraman estate14/1148/2017/21kaapi royale3170chikmagalur karnataka indua...NaN2October 31st, 2018Specialty Coffee Associationff7c18ad303d4b603ac3f8cff7e611ffc735e720352d0cf7f3e9be14dad7df644ad65efc27605ae2m3170.03170.03170.0
\n", "

2 rows × 43 columns

\n", "
" ], "text/plain": [ " Species Owner Country.of.Origin \\\n", "1 Robusta ankole coffee producers coop Uganda \n", "2 Robusta nishant gurjer India \n", "\n", " Farm.Name Lot.Number Mill \\\n", "1 kyangundu cooperative society NaN ankole coffee producers \n", "2 sethuraman estate kaapi royale 25 sethuraman estate \n", "\n", " ICO.Number Company Altitude \\\n", "1 0 ankole coffee producers coop 1488 \n", "2 14/1148/2017/21 kaapi royale 3170 \n", "\n", " Region ... Color Category.Two.Defects \\\n", "1 sheema south western ... Green 2 \n", "2 chikmagalur karnataka indua ... NaN 2 \n", "\n", " Expiration Certification.Body \\\n", "1 June 26th, 2015 Uganda Coffee Development Authority \n", "2 October 31st, 2018 Specialty Coffee Association \n", "\n", " Certification.Address \\\n", "1 e36d0270932c3b657e96b7b0278dfd85dc0fe743 \n", "2 ff7c18ad303d4b603ac3f8cff7e611ffc735e720 \n", "\n", " Certification.Contact unit_of_measurement \\\n", "1 03077a1c6bac60e6f514691634a7f6eb5c85aae8 m \n", "2 352d0cf7f3e9be14dad7df644ad65efc27605ae2 m \n", "\n", " altitude_low_meters altitude_high_meters altitude_mean_meters \n", "1 1488.0 1488.0 1488.0 \n", "2 3170.0 3170.0 3170.0 \n", "\n", "[2 rows x 43 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_df.head(2)" ] }, { "cell_type": "markdown", "id": "3dd6078e", "metadata": {}, "source": [ "From here we can see a few sample values of most of the column and we can be sure that the data loaded correctly.\n", "\n", "\n", "```{admonition} Try it Yourself\n", "What other tools have we learned to examine a DataFrame and when might you use them?\n", "```\n", "\n", "\n", "We can also get more structural information with the [`info`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.info.html) method.\n", "\n", "More information on this can also be found in the [dtypes](https://pandas.pydata.org/docs/user_guide/basics.html#basics-dtypes) attribute. Including that the type is the [most general](https://pandas.pydata.org/docs/user_guide/basics.html#basics-dtypes:~:text=If%20a%20pandas%20object%20contains%20data%20with%20multiple%20dtypes%20in%20a%20single%20column%2C%20the%20dtype%20of%20the%20column%20will%20be%20chosen%20to%20accommodate%20all%20of%20the%20data%20types%20(object%20is%20the%20most%20general).) if there are multiple types in the column.\n", "\n", "````{margin}\n", "```{hint}\n", "There is also a related [`select_dtypes`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.select_dtypes.html#pandas.DataFrame.select_dtypes) method.\n", "```\n", "````" ] }, { "cell_type": "code", "execution_count": 4, "id": "173e9f7a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Int64Index: 28 entries, 1 to 28\n", "Data columns (total 43 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 Species 28 non-null object \n", " 1 Owner 28 non-null object \n", " 2 Country.of.Origin 28 non-null object \n", " 3 Farm.Name 25 non-null object \n", " 4 Lot.Number 6 non-null object \n", " 5 Mill 20 non-null object \n", " 6 ICO.Number 17 non-null object \n", " 7 Company 28 non-null object \n", " 8 Altitude 25 non-null object \n", " 9 Region 26 non-null object \n", " 10 Producer 26 non-null object \n", " 11 Number.of.Bags 28 non-null int64 \n", " 12 Bag.Weight 28 non-null object \n", " 13 In.Country.Partner 28 non-null object \n", " 14 Harvest.Year 28 non-null int64 \n", " 15 Grading.Date 28 non-null object \n", " 16 Owner.1 28 non-null object \n", " 17 Variety 3 non-null object \n", " 18 Processing.Method 10 non-null object \n", " 19 Fragrance...Aroma 28 non-null float64\n", " 20 Flavor 28 non-null float64\n", " 21 Aftertaste 28 non-null float64\n", " 22 Salt...Acid 28 non-null float64\n", " 23 Bitter...Sweet 28 non-null float64\n", " 24 Mouthfeel 28 non-null float64\n", " 25 Uniform.Cup 28 non-null float64\n", " 26 Clean.Cup 28 non-null float64\n", " 27 Balance 28 non-null float64\n", " 28 Cupper.Points 28 non-null float64\n", " 29 Total.Cup.Points 28 non-null float64\n", " 30 Moisture 28 non-null float64\n", " 31 Category.One.Defects 28 non-null int64 \n", " 32 Quakers 28 non-null int64 \n", " 33 Color 26 non-null object \n", " 34 Category.Two.Defects 28 non-null int64 \n", " 35 Expiration 28 non-null object \n", " 36 Certification.Body 28 non-null object \n", " 37 Certification.Address 28 non-null object \n", " 38 Certification.Contact 28 non-null object \n", " 39 unit_of_measurement 28 non-null object \n", " 40 altitude_low_meters 25 non-null float64\n", " 41 altitude_high_meters 25 non-null float64\n", " 42 altitude_mean_meters 25 non-null float64\n", "dtypes: float64(15), int64(5), object(23)\n", "memory usage: 9.6+ KB\n" ] } ], "source": [ "coffee_df.info()" ] }, { "cell_type": "markdown", "id": "cd14a6ea", "metadata": {}, "source": [ "## Summary Statistics\n", "\n", "Now, we can actually start to analyze the data itself.\n", "\n", "The [`describe`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.describe.html) method provides us with a set of summary statistics that broadly\n", "describe the data overall." ] }, { "cell_type": "code", "execution_count": 5, "id": "9b7b9977", "metadata": {}, "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", " \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", "
Number.of.BagsHarvest.YearFragrance...AromaFlavorAftertasteSalt...AcidBitter...SweetMouthfeelUniform.CupClean.CupBalanceCupper.PointsTotal.Cup.PointsMoistureCategory.One.DefectsQuakersCategory.Two.Defectsaltitude_low_metersaltitude_high_metersaltitude_mean_meters
count28.00000028.00000028.00000028.00000028.00000028.00000028.00000028.00000028.00000028.00000028.00000028.00000028.00000028.00000028.00000028.028.00000025.0000025.00000025.000000
mean168.0000002013.9642867.7025007.6307147.5596437.6571437.6757147.5067869.9042869.9282147.5417867.76142980.8689290.0657142.9642860.01.8928571367.600001387.6000001377.600000
std143.2263171.3466600.2961560.3036560.3424690.2617730.3170630.7251520.2387530.2110300.5260760.3305072.4412330.05846412.3572800.02.601129838.06205831.884207833.980216
min1.0000002012.0000006.7500006.6700006.5000006.8300006.6700005.0800009.3300009.3300005.2500006.92000073.7500000.0000000.0000000.00.00000040.0000040.00000040.000000
25%1.0000002013.0000007.5800007.5600007.3975007.5600007.5800007.50000010.00000010.0000007.5000007.58000080.1700000.0000000.0000000.00.000000795.00000795.000000795.000000
50%170.0000002014.0000007.6700007.7100007.6700007.7100007.7500007.67000010.00000010.0000007.6700007.83000081.5000000.1000000.0000000.01.0000001095.000001200.0000001100.000000
75%320.0000002015.0000007.9200007.8300007.7700007.8300007.8300007.83000010.00000010.0000007.8300007.92000082.5200000.1200000.0000000.02.0000001488.000001488.0000001488.000000
max320.0000002017.0000008.3300008.0800007.9200008.0000008.4200008.25000010.00000010.0000008.0000008.58000083.7500000.13000063.0000000.09.0000003170.000003170.0000003170.000000
\n", "
" ], "text/plain": [ " Number.of.Bags Harvest.Year Fragrance...Aroma Flavor Aftertaste \\\n", "count 28.000000 28.000000 28.000000 28.000000 28.000000 \n", "mean 168.000000 2013.964286 7.702500 7.630714 7.559643 \n", "std 143.226317 1.346660 0.296156 0.303656 0.342469 \n", "min 1.000000 2012.000000 6.750000 6.670000 6.500000 \n", "25% 1.000000 2013.000000 7.580000 7.560000 7.397500 \n", "50% 170.000000 2014.000000 7.670000 7.710000 7.670000 \n", "75% 320.000000 2015.000000 7.920000 7.830000 7.770000 \n", "max 320.000000 2017.000000 8.330000 8.080000 7.920000 \n", "\n", " Salt...Acid Bitter...Sweet Mouthfeel Uniform.Cup Clean.Cup \\\n", "count 28.000000 28.000000 28.000000 28.000000 28.000000 \n", "mean 7.657143 7.675714 7.506786 9.904286 9.928214 \n", "std 0.261773 0.317063 0.725152 0.238753 0.211030 \n", "min 6.830000 6.670000 5.080000 9.330000 9.330000 \n", "25% 7.560000 7.580000 7.500000 10.000000 10.000000 \n", "50% 7.710000 7.750000 7.670000 10.000000 10.000000 \n", "75% 7.830000 7.830000 7.830000 10.000000 10.000000 \n", "max 8.000000 8.420000 8.250000 10.000000 10.000000 \n", "\n", " Balance Cupper.Points Total.Cup.Points Moisture \\\n", "count 28.000000 28.000000 28.000000 28.000000 \n", "mean 7.541786 7.761429 80.868929 0.065714 \n", "std 0.526076 0.330507 2.441233 0.058464 \n", "min 5.250000 6.920000 73.750000 0.000000 \n", "25% 7.500000 7.580000 80.170000 0.000000 \n", "50% 7.670000 7.830000 81.500000 0.100000 \n", "75% 7.830000 7.920000 82.520000 0.120000 \n", "max 8.000000 8.580000 83.750000 0.130000 \n", "\n", " Category.One.Defects Quakers Category.Two.Defects \\\n", "count 28.000000 28.0 28.000000 \n", "mean 2.964286 0.0 1.892857 \n", "std 12.357280 0.0 2.601129 \n", "min 0.000000 0.0 0.000000 \n", "25% 0.000000 0.0 0.000000 \n", "50% 0.000000 0.0 1.000000 \n", "75% 0.000000 0.0 2.000000 \n", "max 63.000000 0.0 9.000000 \n", "\n", " altitude_low_meters altitude_high_meters altitude_mean_meters \n", "count 25.00000 25.000000 25.000000 \n", "mean 1367.60000 1387.600000 1377.600000 \n", "std 838.06205 831.884207 833.980216 \n", "min 40.00000 40.000000 40.000000 \n", "25% 795.00000 795.000000 795.000000 \n", "50% 1095.00000 1200.000000 1100.000000 \n", "75% 1488.00000 1488.000000 1488.000000 \n", "max 3170.00000 3170.000000 3170.000000 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_df.describe()" ] }, { "cell_type": "markdown", "id": "f404050e", "metadata": {}, "source": [ "From this, we can draw several conclusions. FOr example straightforward ones like:\n", "- the smallest number of bags rated is 1 and at least 25% of the coffees rates only had 1 bag\n", "- the first ratings included were 2012 and last in 2017 (min & max)\n", "- the mean Mouthfeel was 7.5\n", "- Category One defects are not very common ( the 75th% is 0)\n", "\n", "Or more nuanced ones that compare across variables like\n", "- the raters scored coffee higher on Uniformity.Cup and Clean.Cup than other scores (mean score; only on the ones that seem to have a scale of up to 8/10)\n", "- the coffee varied more in Mouthfeel and Balance that most other scores (the std; only on the ones that seem to have a scale of of up to 8/10)\n", "- there are 3 ratings with no altitude (count of other variables is 28; alt is 25\n", "\n", "And these all give us a sense of the values and the distribution or spread fo the data in each column.\n", "\n", "\n", "We can use the descriptive statistics on individual columns as well." ] }, { "cell_type": "code", "execution_count": 6, "id": "b63e3a9a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 28.000000\n", "mean 7.541786\n", "std 0.526076\n", "min 5.250000\n", "25% 7.500000\n", "50% 7.670000\n", "75% 7.830000\n", "max 8.000000\n", "Name: Balance, dtype: float64" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_df['Balance'].describe()" ] }, { "cell_type": "markdown", "id": "3d3f42de", "metadata": {}, "source": [ "To dig in on what the quantiles really mean, we can compute one manually.\n", "\n", "First, we sort the data, then for the 25%, we select the point in index 6 because\n", "becaues there are 28 values." ] }, { "cell_type": "code", "execution_count": 7, "id": "32f4d9f3", "metadata": {}, "outputs": [], "source": [ "balance_sorted = coffee_df['Balance'].sort_values().values" ] }, { "cell_type": "markdown", "id": "b82b2cc8", "metadata": {}, "source": [ "What value of `x` to pick out 25%" ] }, { "cell_type": "code", "execution_count": 8, "id": "2eb6b9b9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7.5" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = 6\n", "balance_sorted[x]" ] }, { "cell_type": "markdown", "id": "35ba92b4", "metadata": {}, "source": [ "````{margin}\n", "```{admonition} further reading\n", "On the [documentation page for describe](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.describe.html) the \"\n", " See Also\" shows the links to the documentation of most of the individual functions. This is a good way to learn about other things, or find something when you are not quite sure what it would be named. Go to a function thats similar to what you want and then look at the related functions.\n", "```\n", "````\n", "\n", "\n", "We can also extract each of the statistics that the `describe` method calculates individually, by name. The quantiles\n", "are tricky, we cannot just `.25%()` to get the 25% percentile, we have to use the\n", "`quantile` method and pass it a value between 0 and 1." ] }, { "cell_type": "code", "execution_count": 9, "id": "7b0f1456", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7.83" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_df['Flavor'].quantile(.8)" ] }, { "cell_type": "markdown", "id": "efa82bb7", "metadata": {}, "source": [ "Calculate the mean of `Aftertaste`" ] }, { "cell_type": "code", "execution_count": 10, "id": "2505518d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7.559642857142856" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_df['Aftertaste'].mean()" ] }, { "cell_type": "markdown", "id": "64324c6a", "metadata": {}, "source": [ "## Describing Nonnumerical Variables\n", "\n", "There are different columns in the describe than the the whole dataset:" ] }, { "cell_type": "code", "execution_count": 11, "id": "da97ffd2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Species', 'Owner', 'Country.of.Origin', 'Farm.Name', 'Lot.Number',\n", " 'Mill', 'ICO.Number', 'Company', 'Altitude', 'Region', 'Producer',\n", " 'Number.of.Bags', 'Bag.Weight', 'In.Country.Partner', 'Harvest.Year',\n", " 'Grading.Date', 'Owner.1', 'Variety', 'Processing.Method',\n", " 'Fragrance...Aroma', 'Flavor', 'Aftertaste', 'Salt...Acid',\n", " 'Bitter...Sweet', 'Mouthfeel', 'Uniform.Cup', 'Clean.Cup', 'Balance',\n", " 'Cupper.Points', 'Total.Cup.Points', 'Moisture', 'Category.One.Defects',\n", " 'Quakers', 'Color', 'Category.Two.Defects', 'Expiration',\n", " 'Certification.Body', 'Certification.Address', 'Certification.Contact',\n", " 'unit_of_measurement', 'altitude_low_meters', 'altitude_high_meters',\n", " 'altitude_mean_meters'],\n", " dtype='object')" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_df.columns" ] }, { "cell_type": "code", "execution_count": 12, "id": "f183c092", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Number.of.Bags', 'Harvest.Year', 'Fragrance...Aroma', 'Flavor',\n", " 'Aftertaste', 'Salt...Acid', 'Bitter...Sweet', 'Mouthfeel',\n", " 'Uniform.Cup', 'Clean.Cup', 'Balance', 'Cupper.Points',\n", " 'Total.Cup.Points', 'Moisture', 'Category.One.Defects', 'Quakers',\n", " 'Category.Two.Defects', 'altitude_low_meters', 'altitude_high_meters',\n", " 'altitude_mean_meters'],\n", " dtype='object')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_df.describe().columns" ] }, { "cell_type": "markdown", "id": "c1408686", "metadata": {}, "source": [ "We can get the prevalence of each one with `value_counts`" ] }, { "cell_type": "code", "execution_count": 13, "id": "514fd3f5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Green 20\n", "Blue-Green 3\n", "Bluish-Green 2\n", "None 1\n", "Name: Color, dtype: int64" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_df['Color'].value_counts()" ] }, { "cell_type": "markdown", "id": "b7dbf67f", "metadata": {}, "source": [ "```{admonition} Try it Yourself\n", "Note `value_counts` does not count the `NaN` values, but `count` counts all of the\n", "not missing values and the shape of the DataFrame is the total number of rows.\n", "How can you get the number of missing Colors?\n", "```\n", "\n", "Describe only operates on the numerical columns, but we might want to know about the others. We can get the number of each value with `value_counts`" ] }, { "cell_type": "code", "execution_count": 14, "id": "493000b9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "India 13\n", "Uganda 10\n", "United States 2\n", "Ecuador 2\n", "Vietnam 1\n", "Name: Country.of.Origin, dtype: int64" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_df['Country.of.Origin'].value_counts()" ] }, { "cell_type": "markdown", "id": "418e4d3b", "metadata": {}, "source": [ "We can get the name of the most common country out of this Series using `idmax`" ] }, { "cell_type": "code", "execution_count": 15, "id": "6009aa51", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'India'" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_df['Country.of.Origin'].value_counts().idxmax()" ] }, { "cell_type": "markdown", "id": "8c758735", "metadata": {}, "source": [ "Or see only how many different values with the related:" ] }, { "cell_type": "code", "execution_count": 16, "id": "724d827d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_df['Country.of.Origin'].nunique()" ] }, { "cell_type": "markdown", "id": "e8602c91", "metadata": {}, "source": [ "We can also use the mode function, which works on both numerical or nonnumerical" ] }, { "cell_type": "code", "execution_count": 17, "id": "00dcc6c7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 India\n", "Name: Country.of.Origin, dtype: object" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_df['Country.of.Origin'].mode()" ] }, { "cell_type": "markdown", "id": "a1a88245", "metadata": {}, "source": [ "## Basic Plotting\n", "\n", "Pandas give us basic plotting capability built right into DataFrames." ] }, { "cell_type": "code", "execution_count": 18, "id": "61cfd66d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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K1asMKxWq3H27Fnj66+/NoKDg4309PSrbs+ZDB061PDw8DACAgJK3N544w3jxx9/NKxWq7Fz585SH/vSSy8ZLVu2LLHsX//6lxEdHX3Z7RUUFBhBQUHGN998YxhG2Y7/lClTjNDQUCMzM9O+znfffWdYrVbj6NGj9v2IiIgwcnJyKvAquK4dO3YYkoylS5fal3Xr1s146KGHDMO49Bg1bNjQmDVrVonneO2114xOnToZhnH5z7ay/D642Pr16w1JRkZGhmEYhrF06VJDkrF48WL7OuPHjzckGXv37rUve+KJJ4y+ffuW7QU4z+U7JRefZ6tTp469zbRjxw5FRUUpMjLSfn+nTp2u+pwffPCB2rRpo5o1ayowMFBTpkxxy/89V7W0tDQdO3ZM7du3ty/z8PBQmzZtSqy3e/duPfDAA4qNjVVwcLC9hXzxMbjw2NepU0eSShz7Dh06lFj/4mOfmZmpZ599Vk2bNlVISIgCAwO1Y8cOtzzWN9xwQ4n/FV/4PimrLVu26NVXX7V3NwIDA/XYY4/pyJEjys7OrvD7bdCgQTp8+LAWLFigfv36admyZWrduvVlOznFKnr8tmzZounTp5fYj759+6qwsFDJycm6+eabFR0drdjYWD388MOaOXNmuVvQZunVq5cSExNL3J588kklJiaqXr16aty4cYWf+9ixY3rssccUFxcnm82m4OBgZWZm2l/vshz/HTt2qGXLlgoICLAv69KliwoLC7Vz5077subNm7v9HMnFrrvuOnXu3Fn/+c9/JEl79uzRihUrNHz48EvWzcrK0t69ezV8+PAS/45ff/31Eqe6L+dqvw82btyoAQMGqH79+goKClKPHj0kXfl3cEREhPz9/RUbG1tiWXl/z7j8oKuXl1eJny0WyyVt/vL44osv9Oyzz+qf//ynOnXqpKCgIP3jH//Q2rVrr7VUtxccHKy0tLRLlp85c6Zcf856wIABio6O1tSpUxUZGanCwkI1a9ZMubm5Jda78NgXzwuU59g/++yzWrRokd555x01atRIfn5+uvvuuy/ZjrMqz+vtiPdJZmamXnnlFd11112X3Ofr61uu5yrt8TfffLNuvvlmvfDCC3r00Uf10ksvldoyLlbR45eZmaknnnhC8fHxl9xXv359eXt7a9OmTVq2bJl++uknvfjii3r55Ze1fv16p7+KLCAgQI0a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\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/home/runner/work/BrownFall22/BrownFall22/_build/jupyter_execute/notes/2022-09-19_34_1.png" } }, "output_type": "display_data" } ], "source": [ "coffee_df['Country.of.Origin'].value_counts().plot()" ] }, { "cell_type": "markdown", "id": "fc8dc2cf", "metadata": {}, "source": [ "It defaults to a line graph, which is not very informative in this case, so we can use the `kind` parameter to change it to a bar graph." ] }, { "cell_type": "code", "execution_count": 19, "id": "95b06d02", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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kSEPDw95eHjowIED2rJli77//nutWrVKrVu31qeffmp11Erpm2++UVBQkH1527Zt6tmzp325bdu2PNDKxaxevVp16tSxOobbWLhwoeLi4hQbG6urV6/an4cTEBCguXPnWhvOAO52QaVUv359PfHEE1qwYIH9aY4lJSUaPXq0fH19tXLlSj333HOaMGGC/adxOE5QUJCys7MVHBys7777ThkZGUpISLBvv3btWpnHScOMNm3alBoVtNlsys3N1cWLF/XGG29YmMy9zJ8/X2+99Zb69++vmTNn2tfHxMRo3LhxFiYzg/KBSumdd97Rp59+ai8e0g+zzEeOHKn77rtPM2bM0AsvvKCOHTtamLLyio2N1cSJEzVr1iytW7dOPj4+pf6sDx06pCZNmliY0H3degbLLZ6enrrjjjvUqVMn3X333daEckPZ2dlq06ZNmfXe3t4qKCiwIJFZlA9USt9//72OHTum5s2bl1p/7Ngx+/Bm9erVufPFSV5++WU98sgjeuihh1SrVi0tWbJEXl5e9u2LFi1St27dLEzovqZMmWJ1BOiHW54PHjxY5s3OqampCg8PtyiVOZQPVEpPPvmkhg0bpr/+9a9q27atJGnv3r2aMWOGBg8eLOmHeQgtW7a0MmalVa9ePaWnpysvL0+1atUqc+vgv//9b9WqVcuidO7tww8/VJUqVdS9e/dS6zdu3KiSkpJSc3PgPHFxcRoxYoRu3Lghm82mPXv2aMWKFUpMTNTbb79tdTyn424XVErFxcWaOXOmFixYoPPnz0v6YR7CyJEjNWHCBFWpUkVnzpyRp6en7rrrLovTAuZERkZq5syZio2NLbU+NTVVEyZMUGZmpkXJ3M/y5cv10ksv6eTJk5Kkhg0bKiEhQcOGDbM4mfNRPlDp3bp10M/Pz+IkgPVq1Kiho0ePlnmx3+nTp9WyZUu3mG/gagoLC3X9+nUFBgZaHcUYLrugUvm5J5j6+/urefPmGjdunLp27WpBMsA1+Pv769SpU2XKR1ZWlmrWrGlNKDfn4+MjHx8fq2MYRflApfJz98dfvXpV+/fvV+/evbV69Wr16dPHbDDARfTr109jxozR2rVr7XccZWVlaezYserbt6/F6Sq36OhopaWlKSAgoMwtzz+VkZFhMJl5lA9UKj99fftPRUVFKTExkfIBtzV79mz16NFDd999t32+01dffaWOHTvqlVdesThd5davXz+dO3dOAQEBZW55djfM+YBbOXHihDp06KArV65YHaXS2rBhw2/el5+0rWGz2bR582YdPHhQNWrUUGRkpB588EGrY7kFT09PtW3bVsOGDdPjjz8uX19fqyNZgvIBt3L48GF17dpVubm5VkeptH78YDfph/fp/Pi/mR8PNd965gqcLzY2VitWrJC/v78kaebMmXruuedUu3ZtSdLly5fVsWNH3rfjZNu3b9fixYu1evVqlZSU6LHHHtOwYcPc7oGHvNsFbuWdd95RVFSU1TEqtZKSEvvn448/VlRUlD766CNdvXpVV69e1Ycffqjo6GilpqZaHdWtbNy4UUVFRfblGTNmlBoB/P7773X8+HErormVjh07atGiRfr66681f/58ZWdn66GHHlLz5s01a9Yst/nBiJEPVCpxcXHlrs/Ly1NGRoZOnDih9PR0/eEPfzCczD1FREQoKSlJDzzwQKn127dv1/Dhw3X06FGLkrkfT09P5ebm2m/n9PX1VWZmpsLCwiRJ58+fV8OGDRmNskBWVpYWL16sZcuWKTc3Vz169Lity5cVERNOUakcOHCg3PV+fn7q2rWrUlJSFBoaajiV+zp58qR9WP/H/P39dfr0aeN5AFfUtGlT/fWvf1Xjxo0VHx+vDz74wOpITkf5QKWydetWqyPgR9q2bau4uDgtW7ZMQUFBkn74CXv8+PFq166dxenci4eHR5lbO3m3kfXS09O1aNEirVmzRp6enho4cKBbPOGU8gHAaRYtWqQBAwaoUaNGCg4OliTl5OSoWbNmWrdunbXh3IzNZtNTTz0lb29vSdKNGzf03HPP2R8s9uP5IHCuc+fOKTk5WcnJycrKytJ9992nefPmaeDAgW7zoDfmfABwKpvNpk2bNunYsWOSpPDwcHXp0oWfug0bOnTob9pv8eLFTk7i3nr27KnNmzerXr16Gjx4sJ5++mm1aNHC6ljGUT4AGHHjxg15e3tTOuDW+vbtq2HDhql3795l3vbsTigfAJympKRE06dPV1JSks6fP68TJ04oLCxMkyZNUkhIiFtc2wZQFs/5AOA006ZNU3JysmbPni0vLy/7+oiICL399tsWJgNgJcoHAKdZunSp3nzzTQ0aNKjUEHPr1q3tc0AAuB/KBwCnOXv2rJo2bVpmfUlJiW7evGlBIgCugPIBwGnuuecebd++vcz61atXq02bNhYkAuAKeM4HAKeZPHmyhgwZorNnz6qkpEQpKSk6fvy4li5dqvfff9/qeAAswt0uAJxq+/btmjp1qjIzM3X9+nVFR0dr8uTJ6tatm9XRAFiE8gEAAIxizgcApwkLC9Ply5fLrL969ar9baoA3A/lA4DTnD59utxXtBcVFens2bMWJALgCphwCsDhNmzYYP/1xo0b5e/vb18uLi5WWlqaQkJCLEgGwBUw5wOAw3l6/jCo6uHhoZ/+F1OtWjWFhITo1VdfVe/eva2IB8BilA8AThMaGqq9e/eqXr16VkcB4EIoHwAAwCjmfABwqHnz5mn48OGqXr265s2b94v7jho1ylAqAK6EkQ8ADhUaGqp9+/apbt26Cg0N/dn9PDw8dOrUKYPJALgKygcAADCK53wAAACjmPMBwGmKi4uVnJystLQ0XbhwQSUlJaW2b9myxaJkAKxE+QDgNKNHj1ZycrJ69eqliIgIeXh4WB0JgAtgzgcAp6lXr56WLl2q2NhYq6MAcCHM+QDgNF5eXmratKnVMQC4GMoHAKcZO3asXnvttTKPWAfg3rjsAsBpBgwYoK1bt6pOnTpq2bKlqlWrVmp7SkqKRckAWIkJpwCcpnbt2howYIDVMQC4GEY+AACAUcz5AAAARnHZBYDDBQQElPtMD39/fzVv3lzjxo1T165dLUgGwBVw2QWAwy1ZsqTc9VevXtX+/fu1atUqrV69Wn369DGcDIAroHwAMG7OnDlavXq1du7caXUUABagfAAw7sSJE+rQoYOuXLlidRQAFmDCKQDjioqK5OXlZXUMABahfAAw7p133lFUVJTVMQBYhLtdADhcXFxcuevz8vKUkZGhEydOKD093XAqAK6C8gHA4Q4cOFDuej8/P3Xt2lUpKSkKDQ01nAqAq2DCKQAAMIo5HwAAwCjKBwAAMIryAQAAjKJ8AAAAoygfAADAKMoHAAAwivIBAACMonwAAACjKB8AAMCo/wd9FJVfxk/segAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/home/runner/work/BrownFall22/BrownFall22/_build/jupyter_execute/notes/2022-09-19_36_1.png" } }, "output_type": "display_data" } ], "source": [ "coffee_df['Country.of.Origin'].value_counts().plot(kind='bar')" ] }, { "cell_type": "markdown", "id": "63d5b2ca", "metadata": {}, "source": [ "## Matching Questions to Summary Statistics\n", "\n", "When we brainstorm more questions that we can answer with summary statistics or that we might want to ask of this data, the ones that come to mind are often actually dependent on two variables. For example are two scores correlated? or what country has the highest rated coffe on `Flavor`? \n", "\n", "We'll come back to more detailed questions like this on Friday, but to start we can look at how numerical variables vary by categorical (nonnumerical) variables by grouping the data.\n", "\n", "\n", "Above we saw which country had the most ratings (remember one row is one rating), but what if we wanted to see the mean number of bags per country?" ] }, { "cell_type": "code", "execution_count": 20, "id": "2e7ff7cf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Country.of.Origin\n", "Ecuador 1.000000\n", "India 230.076923\n", "Uganda 160.900000\n", "United States 50.500000\n", "Vietnam 1.000000\n", "Name: Number.of.Bags, dtype: float64" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_df.groupby('Country.of.Origin')['Number.of.Bags'].mean()" ] }, { "cell_type": "markdown", "id": "721485ba", "metadata": {}, "source": [ "```{important}\n", "This data is only about coffee that was [rated by a particular agency](https://github.com/jldbc/coffee-quality-database/) it is not economic data, so we cannot, for example conclude which country *produces* the amount of data. If we had economic dataset, a `Number.of.Bags` columns's mean would tell us exactly that, but the context of the dataset defines what a row means and therefore how we can interpret the **every single statistic** we calculate.\n", "```\n", "\n", "\n", "\n", "\n", "## Questions after class\n", "\n", "\n", "### Can arrays be used in Jupyter Notebook?\n", "\n", "Jupyter runs a fully powered python interpreter, so all python can work inside it.\n", "\n", "\n", "#### why did coffee_df['Country.of.Origin'].max() say vietnam?\n", "\n", "That applies a the `max` function to the `'Country.of.Origin'` column, without counting how many times the values occur.\n", "\n", "\n", "\n", "#### Why, in the groupby function the first column is in between parenthesis nd the second one between brackets?\n", "\n", "The inside parenthesis is the parameter of the groupby function, we could instead do it this way:" ] }, { "cell_type": "code", "execution_count": 21, "id": "616f1b15", "metadata": {}, "outputs": [], "source": [ "coffee_grouped = coffee_df.groupby('Country.of.Origin')" ] }, { "cell_type": "markdown", "id": "07ddb6aa", "metadata": {}, "source": [ "Then we can use `coffee_grouped` for different things" ] }, { "cell_type": "code", "execution_count": 22, "id": "7346f9c4", "metadata": {}, "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", " \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", "
Number.of.BagsHarvest.Year...altitude_high_metersaltitude_mean_meters
countmeanstdmin25%50%75%maxcountmean...75%maxcountmeanstdmin25%50%75%max
Country.of.Origin
Ecuador2.01.0000000.0000001.01.001.01.001.02.02016.000000...40.0040.01.040.000000NaN40.040.0040.040.0040.0
India13.0230.076923110.2802961.0140.00300.0320.00320.013.02014.384615...1500.003170.012.01421.6666671021.022957750.0750.001000.01500.003170.0
Uganda10.0160.900000163.6903921.02.25160.0320.00320.010.02013.300000...1488.001745.010.01354.500000220.0425461095.01203.001308.51488.001745.0
United States2.050.50000070.0035711.025.7550.575.25100.02.02013.000000...2448.753000.02.01897.5000001559.170453795.01346.251897.52448.753000.0
Vietnam1.01.000000NaN1.01.001.01.001.01.02013.000000...NaNNaN0.0NaNNaNNaNNaNNaNNaNNaN
\n", "

5 rows × 160 columns

\n", "
" ], "text/plain": [ " Number.of.Bags \\\n", " count mean std min 25% 50% \n", "Country.of.Origin \n", "Ecuador 2.0 1.000000 0.000000 1.0 1.00 1.0 \n", "India 13.0 230.076923 110.280296 1.0 140.00 300.0 \n", "Uganda 10.0 160.900000 163.690392 1.0 2.25 160.0 \n", "United States 2.0 50.500000 70.003571 1.0 25.75 50.5 \n", "Vietnam 1.0 1.000000 NaN 1.0 1.00 1.0 \n", "\n", " Harvest.Year ... \\\n", " 75% max count mean ... \n", "Country.of.Origin ... \n", "Ecuador 1.00 1.0 2.0 2016.000000 ... \n", "India 320.00 320.0 13.0 2014.384615 ... \n", "Uganda 320.00 320.0 10.0 2013.300000 ... \n", "United States 75.25 100.0 2.0 2013.000000 ... \n", "Vietnam 1.00 1.0 1.0 2013.000000 ... \n", "\n", " altitude_high_meters altitude_mean_meters \\\n", " 75% max count \n", "Country.of.Origin \n", "Ecuador 40.00 40.0 1.0 \n", "India 1500.00 3170.0 12.0 \n", "Uganda 1488.00 1745.0 10.0 \n", "United States 2448.75 3000.0 2.0 \n", "Vietnam NaN NaN 0.0 \n", "\n", " \\\n", " mean std min 25% 50% 75% \n", "Country.of.Origin \n", "Ecuador 40.000000 NaN 40.0 40.00 40.0 40.00 \n", "India 1421.666667 1021.022957 750.0 750.00 1000.0 1500.00 \n", "Uganda 1354.500000 220.042546 1095.0 1203.00 1308.5 1488.00 \n", "United States 1897.500000 1559.170453 795.0 1346.25 1897.5 2448.75 \n", "Vietnam NaN NaN NaN NaN NaN NaN \n", "\n", " \n", " max \n", "Country.of.Origin \n", "Ecuador 40.0 \n", "India 3170.0 \n", "Uganda 1745.0 \n", "United States 3000.0 \n", "Vietnam NaN \n", "\n", "[5 rows x 160 columns]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_grouped.describe()" ] }, { "cell_type": "markdown", "id": "4da47b40", "metadata": {}, "source": [ "or as we did before" ] }, { "cell_type": "code", "execution_count": 23, "id": "fab1491a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Country.of.Origin\n", "Ecuador 1.000000\n", "India 230.076923\n", "Uganda 160.900000\n", "United States 50.500000\n", "Vietnam 1.000000\n", "Name: Number.of.Bags, dtype: float64" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_grouped['Number.of.Bags'].mean()" ] }, { "cell_type": "markdown", "id": "eb89cca6", "metadata": {}, "source": [ "The second one is to index ([see last week's notes for more on indexing](2022-09-16)) the DataFrame and pick out one column. It makes the DataFrame have fewer columns before applying mean to the whole object. \n", "\n", "We could make a smaller DataFrame first, then group, then mean" ] }, { "cell_type": "code", "execution_count": 24, "id": "220edb1a", "metadata": {}, "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", "
Number.of.BagsCountry.of.Origin
1300Uganda
2320India
3300India
4320Uganda
51Uganda
\n", "
" ], "text/plain": [ " Number.of.Bags Country.of.Origin\n", "1 300 Uganda\n", "2 320 India\n", "3 300 India\n", "4 320 Uganda\n", "5 1 Uganda" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_country_bags_df= coffee_df[['Number.of.Bags','Country.of.Origin']]\n", "coffee_country_bags_df.head()" ] }, { "cell_type": "markdown", "id": "1659c0ce", "metadata": {}, "source": [ "There are two sets of square brackets because putting a comma it would try to index along rows with one and columns with the other, to select multiple in one dimension you need to pass a list." ] }, { "cell_type": "code", "execution_count": 25, "id": "92d9d555", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "list" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(['Number.of.Bags','Country.of.Origin'])" ] }, { "cell_type": "markdown", "id": "9dc7b093", "metadata": {}, "source": [ "If you do not put square `[]` or curly `{}` brackets around items, Python implicitly treats them as if there are parenthesis`()`" ] }, { "cell_type": "code", "execution_count": 26, "id": "66429c17", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tuple" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(('Number.of.Bags','Country.of.Origin'))" ] }, { "cell_type": "markdown", "id": "3b405e7a", "metadata": {}, "source": [ "and tuples are treated separately ." ] }, { "cell_type": "code", "execution_count": 27, "id": "43567033", "metadata": {}, "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", "
Number.of.Bags
Country.of.Origin
Ecuador1.000000
India230.076923
Uganda160.900000
United States50.500000
Vietnam1.000000
\n", "
" ], "text/plain": [ " Number.of.Bags\n", "Country.of.Origin \n", "Ecuador 1.000000\n", "India 230.076923\n", "Uganda 160.900000\n", "United States 50.500000\n", "Vietnam 1.000000" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coffee_country_bags_df.groupby('Country.of.Origin').mean()" ] }, { "cell_type": "markdown", "id": "41870927", "metadata": {}, "source": [ "#### A quick recap of how .info() counts non-null and dtype for each column would be great. Thanks!\n", "\n", "above\n", "\n", "#### Can you plot a graph that uses two columns in a dataset?\n", "Yes, we will see that on Wednesday.\n", "\n", "#### Are there any other data types as important as dataframes in pandas?\n", "\n", "DataFrames are the main type provided by pandas, there are also Series which is conceptually a single column, groupby objects which is basically a list of (DataFrame,label) tuples, and some indexing, but all of these exist to support creating and operating on DataFrames.\n", "\n", "#### Will we be utilizing any other packages /libraries mentioned than the ones for visualizing data that we talked about today?\n", "\n", "We will use pandas for basic plots and seaborn for more advanced plots. There are other libraries for visualization like plotly for interactive plots, but those are more advanced than we need or for specialized use cases. However, the way these type of libraries are designed, is that the special use case ones are for when the basic ones do not do what you need and they often have common patterns.\n", "\n", "#### When displaying two categories like we did at the end could you measure a different thing for each category? Like count for one and mean for the other?\n", "\n", "Yes! We will likely not do this in class, but it is a small extension from what we have covered and uses the [pandas aggregrate](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.aggregate.html) method.\n", "\n", "```{hint}\n", "This is expected for visualize level 3\n", "```\n", "\n", "\n", "#### How in depth will we go with graphing data and looking at it systemically to find patterns?\n", "\n", "At some level, that is what we sill do for the rest of the semester. We will not cover everything there is to know about graphing, there are whole courses on data visualization. Most of the pattern-finding we will do is machine learning. \n", "\n", "\n", "### Assignment\n", "\n", "#### For assignment 2, how do I find appropriate datasets online?\n", "\n", "I collated the ones that I recommend on the [datasets](datasets) page. Then find something that is of interest to you. \n", "\n", "#### How do you import a .py file from GitHub? Is there a way to do that without downloading it locally?\n", "\n", "It does need to be local in order to import it as a module. \n", "\n", "Ideally, you will work with all of your assignment repos locally either following the instructions in [the notes from last class](ghoffline)" ] } ], "metadata": { "jupytext": { "text_representation": { "extension": ".md", "format_name": "myst", "format_version": 0.13, "jupytext_version": "1.14.1" } }, "kernelspec": { "display_name": "Python 3", "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.9.16" }, "source_map": [ 12, 33, 35, 44, 47, 53, 55, 75, 77, 86, 88, 106, 108, 115, 117, 121, 124, 140, 142, 146, 148, 153, 157, 159, 162, 164, 175, 177, 182, 184, 188, 190, 194, 196, 202, 204, 207, 209, 220, 222, 250, 252, 255, 257, 259, 261, 267, 270, 273, 275, 278, 280, 286, 288 ] }, "nbformat": 4, "nbformat_minor": 5 }