{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [ "remove_input" ] }, "outputs": [], "source": [ "path_data = '../../data/'\n", "\n", "import numpy as np\n", "import pandas as pd\n", "\n", "\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "plt.style.use('fivethirtyeight')\n", "\n", "import warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Cross-Classifying by More than One Variable\n", "\n", "When individuals have multiple features, there are many different ways to classify them. For example, if we have a population of college students for each of whom we have recorded a major and the number of years in college, then the students could be classified by major, or by year, or by a combination of major and year.\n", "\n", "The `group` method also allows us to classify individuals according to multiple variables. This is called *cross-classifying*." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Two Variables: Counting the Number in Each Paired Category\n", "The table `more_cones` records the flavor, color, and price of six ice cream cones." ] }, { "cell_type": "code", "execution_count": 2, "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", "
FlavorColorPrice
0strawberrypink3.55
1chocolatelight brown4.75
2chocolatedark brown5.25
3strawberrypink5.25
4chocolatedark brown5.25
5bubblegumpink4.75
\n", "
" ], "text/plain": [ " Flavor Color Price\n", "0 strawberry pink 3.55\n", "1 chocolate light brown 4.75\n", "2 chocolate dark brown 5.25\n", "3 strawberry pink 5.25\n", "4 chocolate dark brown 5.25\n", "5 bubblegum pink 4.75" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "more_cones = pd.DataFrame({\n", " 'Flavor':np.array(['strawberry', 'chocolate', 'chocolate', 'strawberry', 'chocolate', 'bubblegum']),\n", " 'Color':np.array(['pink', 'light brown', 'dark brown', 'pink', 'dark brown', 'pink']),\n", " 'Price':np.array([3.55, 4.75, 5.25, 5.25, 5.25, 4.75])}\n", ")\n", "\n", "more_cones" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We know how to use `group` to count the number of cones of each flavor:" ] }, { "cell_type": "code", "execution_count": 3, "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", "
ColorPrice
Flavor
bubblegum11
chocolate33
strawberry22
\n", "
" ], "text/plain": [ " Color Price\n", "Flavor \n", "bubblegum 1 1\n", "chocolate 3 3\n", "strawberry 2 2" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "more_cones.groupby('Flavor').count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Or**, using the aggregation framework .." ] }, { "cell_type": "code", "execution_count": 4, "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", "
count
Flavor
bubblegum1
chocolate3
strawberry2
\n", "
" ], "text/plain": [ " count\n", "Flavor \n", "bubblegum 1\n", "chocolate 3\n", "strawberry 2" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "more_cones.groupby(['Flavor']).Flavor.agg('count').to_frame('count')#.reset_index()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the aggregation and resetting the index give .." ] }, { "cell_type": "code", "execution_count": 5, "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", "
Flavorcount
0bubblegum1
1chocolate3
2strawberry2
\n", "
" ], "text/plain": [ " Flavor count\n", "0 bubblegum 1\n", "1 chocolate 3\n", "2 strawberry 2" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "more_cones.groupby(['Flavor']).Flavor.agg('count').to_frame('count').reset_index()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But now each cone has a color as well. To classify the cones by both flavor and color, we will pass a list of labels as an argument to `group`. The resulting table has one row for every *unique combination* of values that appear together in the grouped columns. As before, a single argument (a list, in this case, but an array would work too) gives row counts." ] }, { "cell_type": "code", "execution_count": 6, "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", "
ColorPrice
Flavor
bubblegum11
chocolate33
strawberry22
\n", "
" ], "text/plain": [ " Color Price\n", "Flavor \n", "bubblegum 1 1\n", "chocolate 3 3\n", "strawberry 2 2" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "more_cones.groupby('Flavor').count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Although there are six cones, there are only four unique combinations of flavor and color. Two of the cones were dark brown chocolate, and two pink strawberry." ] }, { "cell_type": "code", "execution_count": 7, "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", "
Price
FlavorColor
bubblegumpink1
chocolatedark brown2
light brown1
strawberrypink2
\n", "
" ], "text/plain": [ " Price\n", "Flavor Color \n", "bubblegum pink 1\n", "chocolate dark brown 2\n", " light brown 1\n", "strawberry pink 2" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "more_cones.groupby(['Flavor', 'Color']).count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Or** .." ] }, { "cell_type": "code", "execution_count": 8, "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", "
count
FlavorColor
bubblegumpink1
chocolatedark brown2
light brown1
strawberrypink2
\n", "
" ], "text/plain": [ " count\n", "Flavor Color \n", "bubblegum pink 1\n", "chocolate dark brown 2\n", " light brown 1\n", "strawberry pink 2" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "more_cones.groupby(['Flavor', 'Color']).Flavor.agg('count').to_frame('count')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Or** .." ] }, { "cell_type": "code", "execution_count": 9, "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", "
FlavorColorcount
0bubblegumpink1
1chocolatedark brown2
2chocolatelight brown1
3strawberrypink2
\n", "
" ], "text/plain": [ " Flavor Color count\n", "0 bubblegum pink 1\n", "1 chocolate dark brown 2\n", "2 chocolate light brown 1\n", "3 strawberry pink 2" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "more_cones.groupby(['Flavor', 'Color']).Flavor.agg('count').to_frame('count').reset_index()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Two Variables: Finding a Characteristic of Each Paired Category\n", "A second argument aggregates all other columns that are not in the list of grouped columns." ] }, { "cell_type": "code", "execution_count": 10, "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", "
Price
FlavorColor
bubblegumpink4.75
chocolatedark brown10.50
light brown4.75
strawberrypink8.80
\n", "
" ], "text/plain": [ " Price\n", "Flavor Color \n", "bubblegum pink 4.75\n", "chocolate dark brown 10.50\n", " light brown 4.75\n", "strawberry pink 8.80" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "more_cones.groupby(['Flavor', 'Color']).sum()\n", "\n", "#Or ..\n", "\n", "#more_cones.groupby(['Flavor', 'Color']).Price.agg('sum').to_frame('Price sum').reset_index()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Three or More Variables.** You can use `group` to classify rows by three or more categorical variables. Just include them all in the list that is the first argument. But cross-classifying by multiple variables can become complex, as the number of distinct combinations of categories can be quite large. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pivot Tables: Rearranging the Output of `group`\n", "Many uses of cross-classification involve just two categorical variables, like `Flavor` and `Color` in the example above. In these cases it is possible to display the results of the classification in a different kind of table, called a *pivot table*. Pivot tables, also known as *contingency tables*, make it easier to work with data that have been classified according to two variables.\n", "\n", "Recall the use of `group` to count the number of cones in each paired category of flavor and color:" ] }, { "cell_type": "code", "execution_count": 11, "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", "
FlavorColorcount
0bubblegumpink1
1chocolatedark brown2
2chocolatelight brown1
3strawberrypink2
\n", "
" ], "text/plain": [ " Flavor Color count\n", "0 bubblegum pink 1\n", "1 chocolate dark brown 2\n", "2 chocolate light brown 1\n", "3 strawberry pink 2" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "more_cones_pivot = more_cones.groupby(['Flavor', 'Color']).Color.agg('count').to_frame('count').reset_index()\n", "\n", "more_cones_pivot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The same data can be displayed differenly using the Table method `pivot`. Ignore the code for a moment, and just examine the table of outcomes.\n", "\n", "[Pandas pivot](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.pivot.html)" ] }, { "cell_type": "code", "execution_count": 12, "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", "
Flavorbubblegumchocolatestrawberry
Color
dark brown0.02.00.0
light brown0.01.00.0
pink1.00.02.0
\n", "
" ], "text/plain": [ "Flavor bubblegum chocolate strawberry\n", "Color \n", "dark brown 0.0 2.0 0.0\n", "light brown 0.0 1.0 0.0\n", "pink 1.0 0.0 2.0" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#more_cones_pivot.pivot(index='Color', columns='Flavor', values='count').fillna(0).reset_index()\n", "\n", "#Or\n", "\n", "more_cones_pivot.pivot(index='Color', columns='Flavor', values='count').fillna(0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice how this df displays all nine possible pairs of flavor and color, including pairs like \"dark brown bubblegum\" that don't exist in our data. Notice also that the count in each pair appears in the body of the DataFrame: to find the number of light brown chocolate cones, run your eye along the row `light brown` until it meets the column `chocolate`.\n", "\n", "The `groupby` method takes a list of two labels because it is flexible: it could take one or three or more. On the other hand, `pivot` always takes **two** column labels, one to determine the columns and one to determine the rows." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**`pivot`** \n", "\n", "The `pivot` method is closely related to the `groupby` method: it groups together rows that share a combination of values. It differs from `groupby` because it organizes the resulting values in a grid. The first argument to `pivot` is the label of a column that contains the values that will be used to form new columns in the result. The second argument is the label of a column used for the rows. The result gives the count of all rows of the original table that share the combination of column and row values.\n", "\n", "Like `groupby`, `pivot` can be used with additional arguments to find characteristics of each paired category. An optional third argument called `values` indicates a column of values that will replace the counts in each cell of the grid.\n", "\n", "All of these values will not be displayed, however; the fourth argument `aggfunc` indicates how to collect them all into one aggregated value to be displayed in the cell.\n", "\n", "An example will help clarify this. Here is `pivot` being used to find the total price of the cones in each cell. \n", "\n", "pd.pivot_table(*dataframe*, values='data upon which aggfunc acts', index= ,columns= , aggfunc=*aggregation function*).fillna(0)*replace NaN with 0*" ] }, { "cell_type": "code", "execution_count": 13, "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", "
Flavorbubblegumchocolatestrawberry
Color
dark brown0.0010.500.0
light brown0.004.750.0
pink4.750.008.8
\n", "
" ], "text/plain": [ "Flavor bubblegum chocolate strawberry\n", "Color \n", "dark brown 0.00 10.50 0.0\n", "light brown 0.00 4.75 0.0\n", "pink 4.75 0.00 8.8" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.pivot_table(more_cones, values='Price', index=['Color'], columns=['Flavor'], aggfunc=np.sum).fillna(0)\n", "\n", "#what happens when we add '.reset_index()' to the code?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And here is `group` doing the same thing." ] }, { "cell_type": "code", "execution_count": 14, "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", "
Price
FlavorColor
bubblegumpink4.75
chocolatedark brown10.50
light brown4.75
strawberrypink8.80
\n", "
" ], "text/plain": [ " Price\n", "Flavor Color \n", "bubblegum pink 4.75\n", "chocolate dark brown 10.50\n", " light brown 4.75\n", "strawberry pink 8.80" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "more_cones.groupby(['Flavor', 'Color']).sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Though the numbers in both tables are the same, table produced by `pivot` is easier to read and lends itself more easily to analysis. The advantage of `pivot` is that it places grouped values into adjacent columns, so that they can be combined and compared." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example: Education and Income of Californian Adults\n", "The State of California's Open Data Portal is a rich source of information about the lives of Californians. It is our source of a [dataset](http://data.ca.gov/dataset/ca-educational-attainment-personal-income) on educational attainment and personal income among Californians over the years 2008 to 2014. The data are derived from the U.S. Census Current Population Survey.\n", "\n", "For each year, the table records the `Population Count` of Californians in many different combinations of age, gender, educational attainment, and personal income. We will study only the data for the year 2014." ] }, { "cell_type": "code", "execution_count": 15, "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", "
YearAgeGenderEducational AttainmentPersonal IncomePopulation Count
8851/1/14 0:0018 to 64FemaleNo high school diplomaH: 75,000 and over2058
8861/1/14 0:0065 to 80+MaleNo high school diplomaH: 75,000 and over2153
8941/1/14 0:0065 to 80+FemaleNo high school diplomaG: 50,000 to 74,9994666
8951/1/14 0:0065 to 80+FemaleHigh school or equivalentH: 75,000 and over7122
8961/1/14 0:0065 to 80+FemaleNo high school diplomaF: 35,000 to 49,9997261
8971/1/14 0:0065 to 80+MaleNo high school diplomaG: 50,000 to 74,9998569
9001/1/14 0:0018 to 64FemaleNo high school diplomaG: 50,000 to 74,99914635
9011/1/14 0:0065 to 80+MaleNo high school diplomaF: 35,000 to 49,99915212
9021/1/14 0:0065 to 80+MaleCollege, less than 4-yr degreeB: 5,000 to 9,99915423
9031/1/14 0:0065 to 80+FemaleBachelor's degree or higherA: 0 to 4,99915459
\n", "
" ], "text/plain": [ " Year Age Gender Educational Attainment \\\n", "885 1/1/14 0:00 18 to 64 Female No high school diploma \n", "886 1/1/14 0:00 65 to 80+ Male No high school diploma \n", "894 1/1/14 0:00 65 to 80+ Female No high school diploma \n", "895 1/1/14 0:00 65 to 80+ Female High school or equivalent \n", "896 1/1/14 0:00 65 to 80+ Female No high school diploma \n", "897 1/1/14 0:00 65 to 80+ Male No high school diploma \n", "900 1/1/14 0:00 18 to 64 Female No high school diploma \n", "901 1/1/14 0:00 65 to 80+ Male No high school diploma \n", "902 1/1/14 0:00 65 to 80+ Male College, less than 4-yr degree \n", "903 1/1/14 0:00 65 to 80+ Female Bachelor's degree or higher \n", "\n", " Personal Income Population Count \n", "885 H: 75,000 and over 2058 \n", "886 H: 75,000 and over 2153 \n", "894 G: 50,000 to 74,999 4666 \n", "895 H: 75,000 and over 7122 \n", "896 F: 35,000 to 49,999 7261 \n", "897 G: 50,000 to 74,999 8569 \n", "900 G: 50,000 to 74,999 14635 \n", "901 F: 35,000 to 49,999 15212 \n", "902 B: 5,000 to 9,999 15423 \n", "903 A: 0 to 4,999 15459 " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "full_table = pd.read_csv(path_data + 'educ_inc.csv')\n", "\n", "ca_2014 = full_table[(full_table['Year'] == '1/1/14 0:00') & (full_table['Age'] != '00 to 17')]\n", "\n", "ca_2014.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each row of the table corresponds to a combination of age, gender, educational level, and income. There are 127 such combinations in all! \n", "\n", "As a first step it is a good idea to start with just one or two variables. We will focus on just one pair: educational attainment and personal income. " ] }, { "cell_type": "code", "execution_count": 16, "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", "
Educational AttainmentPersonal IncomePopulation Count
885No high school diplomaH: 75,000 and over2058
886No high school diplomaH: 75,000 and over2153
894No high school diplomaG: 50,000 to 74,9994666
895High school or equivalentH: 75,000 and over7122
896No high school diplomaF: 35,000 to 49,9997261
897No high school diplomaG: 50,000 to 74,9998569
900No high school diplomaG: 50,000 to 74,99914635
901No high school diplomaF: 35,000 to 49,99915212
902College, less than 4-yr degreeB: 5,000 to 9,99915423
903Bachelor's degree or higherA: 0 to 4,99915459
\n", "
" ], "text/plain": [ " Educational Attainment Personal Income Population Count\n", "885 No high school diploma H: 75,000 and over 2058\n", "886 No high school diploma H: 75,000 and over 2153\n", "894 No high school diploma G: 50,000 to 74,999 4666\n", "895 High school or equivalent H: 75,000 and over 7122\n", "896 No high school diploma F: 35,000 to 49,999 7261\n", "897 No high school diploma G: 50,000 to 74,999 8569\n", "900 No high school diploma G: 50,000 to 74,999 14635\n", "901 No high school diploma F: 35,000 to 49,999 15212\n", "902 College, less than 4-yr degree B: 5,000 to 9,999 15423\n", "903 Bachelor's degree or higher A: 0 to 4,999 15459" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "educ_inc = ca_2014[['Educational Attainment', 'Personal Income', 'Population Count']]\n", "\n", "educ_inc.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's start by looking at educational level alone. The categories of this variable have been subdivided by the different levels of income. So we will group the table by `Educational Attainment` and `sum` the `Population Count` in each category." ] }, { "cell_type": "code", "execution_count": 17, "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", "
Population Count sum
Educational Attainment
Bachelor's degree or higher8525698
College, less than 4-yr degree7775497
High school or equivalent6294141
No high school diploma4258277
\n", "
" ], "text/plain": [ " Population Count sum\n", "Educational Attainment \n", "Bachelor's degree or higher 8525698\n", "College, less than 4-yr degree 7775497\n", "High school or equivalent 6294141\n", "No high school diploma 4258277" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "education = educ_inc[['Educational Attainment', 'Population Count']]\n", "\n", "educ_totals = education.groupby('Educational Attainment').sum()\n", "\n", "educ_totals = educ_totals.rename(columns={'Population Count': 'Population Count sum'})#.reset_index()\n", "\n", "educ_totals" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are only four categories of educational attainment. The counts are so large that is is more helpful to look at percents. For this, we will use the function `percents` that we defined in an earlier section. It converts an array of numbers to an array of percents out of the total in the input array." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "def percents(array_x):\n", " return np.round( (array_x/sum(array_x))*100, 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now have the distribution of educational attainment among adult Californians. More than 30% have a Bachelor's degree or higher, while almost 16% lack a high school diploma." ] }, { "cell_type": "code", "execution_count": 19, "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", "
Population Count sumPopulation Percent
Educational Attainment
Bachelor's degree or higher852569831.75
College, less than 4-yr degree777549728.96
High school or equivalent629414123.44
No high school diploma425827715.86
\n", "
" ], "text/plain": [ " Population Count sum Population Percent\n", "Educational Attainment \n", "Bachelor's degree or higher 8525698 31.75\n", "College, less than 4-yr degree 7775497 28.96\n", "High school or equivalent 6294141 23.44\n", "No high school diploma 4258277 15.86" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "educ_distribution = educ_totals.copy()\n", "\n", "educ_distribution['Population Percent'] = percents(educ_totals.iloc[:,0])\n", "\n", "educ_distribution" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "By using `pivot`, we can get a contingency table (a table of counts) of adult Californians cross-classified by `Educational Attainment` and `Personal Income`." ] }, { "cell_type": "code", "execution_count": 20, "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", "
Educational AttainmentBachelor's degree or higherCollege, less than 4-yr degreeHigh school or equivalentNo high school diploma
Personal Income
A: 0 to 4,99957549198501111618731204529
B: 5,000 to 9,999326020810641626499597039
C: 10,000 to 14,999452449798596692661664607
D: 15,000 to 24,99977368413452571252377875498
E: 25,000 to 34,9996938841091642929218464564
F: 35,000 to 49,99911227911112421782804260579
G: 50,000 to 74,9991594681883826525517132516
H: 75,000 and over298669874810332319258945
\n", "
" ], "text/plain": [ "Educational Attainment Bachelor's degree or higher \\\n", "Personal Income \n", "A: 0 to 4,999 575491 \n", "B: 5,000 to 9,999 326020 \n", "C: 10,000 to 14,999 452449 \n", "D: 15,000 to 24,999 773684 \n", "E: 25,000 to 34,999 693884 \n", "F: 35,000 to 49,999 1122791 \n", "G: 50,000 to 74,999 1594681 \n", "H: 75,000 and over 2986698 \n", "\n", "Educational Attainment College, less than 4-yr degree \\\n", "Personal Income \n", "A: 0 to 4,999 985011 \n", "B: 5,000 to 9,999 810641 \n", "C: 10,000 to 14,999 798596 \n", "D: 15,000 to 24,999 1345257 \n", "E: 25,000 to 34,999 1091642 \n", "F: 35,000 to 49,999 1112421 \n", "G: 50,000 to 74,999 883826 \n", "H: 75,000 and over 748103 \n", "\n", "Educational Attainment High school or equivalent No high school diploma \n", "Personal Income \n", "A: 0 to 4,999 1161873 1204529 \n", "B: 5,000 to 9,999 626499 597039 \n", "C: 10,000 to 14,999 692661 664607 \n", "D: 15,000 to 24,999 1252377 875498 \n", "E: 25,000 to 34,999 929218 464564 \n", "F: 35,000 to 49,999 782804 260579 \n", "G: 50,000 to 74,999 525517 132516 \n", "H: 75,000 and over 323192 58945 " ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "totals = pd.pivot_table(educ_inc, values='Population Count',\n", " index='Personal Income', columns='Educational Attainment', aggfunc=np.sum)\n", "totals" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here you see the power of `pivot` over other cross-classification methods. Each column of counts is a distribution of personal income at a specific level of educational attainment. Converting the counts to percents allows us to compare the four distributions." ] }, { "cell_type": "code", "execution_count": 21, "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", "
Personal IncomeBachelor's degree or higherCollege, less than 4-yr degreeHigh school or equivalentNo high school diploma
0A: 0 to 4,9996.7512.6718.4628.29
1B: 5,000 to 9,9993.8210.439.9514.02
2C: 10,000 to 14,9995.3110.2711.0015.61
3D: 15,000 to 24,9999.0717.3019.9020.56
4E: 25,000 to 34,9998.1414.0414.7610.91
5F: 35,000 to 49,99913.1714.3112.446.12
6G: 50,000 to 74,99918.7011.378.353.11
7H: 75,000 and over35.039.625.131.38
\n", "
" ], "text/plain": [ " Personal Income Bachelor's degree or higher \\\n", "0 A: 0 to 4,999 6.75 \n", "1 B: 5,000 to 9,999 3.82 \n", "2 C: 10,000 to 14,999 5.31 \n", "3 D: 15,000 to 24,999 9.07 \n", "4 E: 25,000 to 34,999 8.14 \n", "5 F: 35,000 to 49,999 13.17 \n", "6 G: 50,000 to 74,999 18.70 \n", "7 H: 75,000 and over 35.03 \n", "\n", " College, less than 4-yr degree High school or equivalent \\\n", "0 12.67 18.46 \n", "1 10.43 9.95 \n", "2 10.27 11.00 \n", "3 17.30 19.90 \n", "4 14.04 14.76 \n", "5 14.31 12.44 \n", "6 11.37 8.35 \n", "7 9.62 5.13 \n", "\n", " No high school diploma \n", "0 28.29 \n", "1 14.02 \n", "2 15.61 \n", "3 20.56 \n", "4 10.91 \n", "5 6.12 \n", "6 3.11 \n", "7 1.38 " ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "distributions = pd.DataFrame({\n", " \"Bachelor's degree or higher\":percents(totals.iloc[:,0]),\n", " 'College, less than 4-yr degree':percents(totals.iloc[:,1]),\n", " 'High school or equivalent':percents(totals.iloc[:,2]),\n", " 'No high school diploma':percents(totals.iloc[:,3])\n", " })\n", "\n", "distributions.reset_index()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create a 'Barh' chart\n", "\n", "To be used as the data source in a horizontal bar chart the index must be converted to an array then included as a column in the DataFrame." ] }, { "cell_type": "code", "execution_count": 22, "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", "
Bachelor's degree or higherCollege, less than 4-yr degreeHigh school or equivalentNo high school diplomaPersonal Income
Personal Income
A: 0 to 4,9996.7512.6718.4628.29A: 0 to 4,999
B: 5,000 to 9,9993.8210.439.9514.02B: 5,000 to 9,999
C: 10,000 to 14,9995.3110.2711.0015.61C: 10,000 to 14,999
D: 15,000 to 24,9999.0717.3019.9020.56D: 15,000 to 24,999
E: 25,000 to 34,9998.1414.0414.7610.91E: 25,000 to 34,999
F: 35,000 to 49,99913.1714.3112.446.12F: 35,000 to 49,999
G: 50,000 to 74,99918.7011.378.353.11G: 50,000 to 74,999
H: 75,000 and over35.039.625.131.38H: 75,000 and over
\n", "
" ], "text/plain": [ " Bachelor's degree or higher \\\n", "Personal Income \n", "A: 0 to 4,999 6.75 \n", "B: 5,000 to 9,999 3.82 \n", "C: 10,000 to 14,999 5.31 \n", "D: 15,000 to 24,999 9.07 \n", "E: 25,000 to 34,999 8.14 \n", "F: 35,000 to 49,999 13.17 \n", "G: 50,000 to 74,999 18.70 \n", "H: 75,000 and over 35.03 \n", "\n", " College, less than 4-yr degree \\\n", "Personal Income \n", "A: 0 to 4,999 12.67 \n", "B: 5,000 to 9,999 10.43 \n", "C: 10,000 to 14,999 10.27 \n", "D: 15,000 to 24,999 17.30 \n", "E: 25,000 to 34,999 14.04 \n", "F: 35,000 to 49,999 14.31 \n", "G: 50,000 to 74,999 11.37 \n", "H: 75,000 and over 9.62 \n", "\n", " High school or equivalent No high school diploma \\\n", "Personal Income \n", "A: 0 to 4,999 18.46 28.29 \n", "B: 5,000 to 9,999 9.95 14.02 \n", "C: 10,000 to 14,999 11.00 15.61 \n", "D: 15,000 to 24,999 19.90 20.56 \n", "E: 25,000 to 34,999 14.76 10.91 \n", "F: 35,000 to 49,999 12.44 6.12 \n", "G: 50,000 to 74,999 8.35 3.11 \n", "H: 75,000 and over 5.13 1.38 \n", "\n", " Personal Income \n", "Personal Income \n", "A: 0 to 4,999 A: 0 to 4,999 \n", "B: 5,000 to 9,999 B: 5,000 to 9,999 \n", "C: 10,000 to 14,999 C: 10,000 to 14,999 \n", "D: 15,000 to 24,999 D: 15,000 to 24,999 \n", "E: 25,000 to 34,999 E: 25,000 to 34,999 \n", "F: 35,000 to 49,999 F: 35,000 to 49,999 \n", "G: 50,000 to 74,999 G: 50,000 to 74,999 \n", "H: 75,000 and over H: 75,000 and over " ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "personalIncome = np.array(distributions.index)\n", "\n", "distributions['Personal Income'] = personalIncome\n", "\n", "distributions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At a glance, you can see that over 35% of those with Bachelor's degrees or higher had incomes of $\\$75,000$ and over, whereas fewer than 10% of the people in the other education categories had that level of income. \n", "\n", "The bar chart below compares the personal income distributions of adult Californians who have no high diploma with those who have completed a Bachelor's degree or higher. The difference in the distributions is striking. There is a clear positive association between educational attainment and personal income." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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qRSpqalVWRsREREREX1AFG5OHj16BAcHhzK3a2pqIicnp0qKIiIiIiKiD4/C95yIxeJyV0bOnj0Lc3PzqqiJSGGGvS7UdAm1RkpKCqRSaU2XUatwTomIiCpH4ZWTvn37Yu3atbhx44YwpqKiAgA4ePAgtm3bhv79+1d9hURERERE9EFQuDmZNm0aTE1N0alTJ4wcORIqKipYsmQJunbtCm9vbzg5OSEgIKA6ayUiIiIiolpM4eZER0cHv/32GyZOnIhHjx6hbt26OHnyJHJychAUFIS9e/eibt261VkrERERERHVYpV6CWPdunUxadIkTJo0qbrqISIiIiKiD5TCKydERERERETVqVIrJ48ePcLWrVuRmpqKrKwsuRcxAq9ukF+9enWVFkhERERERB8GhZuTAwcOYMSIEcjNzYWamhq0tbVLxBQ/vYuIiIiIiKiyFG5Opk+fDiMjI6xevRotW7ZkI0JERERERFVK4XtO0tPTMWbMGLRq1YqNCRERERERVTmFm5MWLVrg8ePH1VkLERERERF9wBS+rCskJATe3t7o2LEjOnbsWJ01ESlMJFpW0yUQVYusrK9qugQiIqL/nMLNSevWrfHtt9+iX79+MDExgbGxMdTU1ORiVFRUEBMTU+VFEhERERFR7adwc7Jt2zb4+flBJpMhLy+Pl3gREREREVGVqtRlXXZ2dti0aRPMzMyqsyYiIiIiIvoAKXxD/KNHjzB8+HA2JkREREREVC0Ubk7atGmDO3fuVGctRERERET0AVO4OVm4cCF2796Nbdu2VWc9RERERET0gVL4npMvvvgCL1++xJgxY/DVV1+hcePGpT6t6+TJk1VeJBERERER1X4KNyf6+vowMDBA06ZNq7MeIiIiIiL6QCncnOzfv7866yAiIiIiog+cwvecEBERERERVSeFV04AoLCwEJs3b8Zvv/2Gu3fvAgDMzMzQo0cPDB48uMQ9KERERERERIpSuDl5+vQp+vfvj3PnzqF+/fqwsLCATCZDXFwc9u/fj59++gk7d+6Ejo5OddZLRERERES1lMKXdYWEhOD8+fP49ttvcePGDcTHxyMhIQE3b95EaGgozp07h5CQkOqslYiIiIiIajGFm5N9+/bBx8cHY8eOhYaGhjCurq6OMWPGYPjw4di7d2+1FElERERERLWfws1JZmYm7Ozsytxub2+PzMzM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yoskIiIiIqLaT+Hm5LPPPoOKikp11kJERERERB8whZuTyMjI6qyDiIiIiIg+cAo3J0TKyLDXhZouodZISUmBVCqt6TKIiIjoA6bwDfEAcPfuXUyYMAFOTk4wNTVFYmIiACAzMxOTJk3ChQsXqqNGIiIiIiL6ACi8cpKcnIyePXuiqKgIbdq0wd27d4X3nujp6eH06dPIy8vDypUrq61YIiIiIiKqvRRuTmbPng0dHR0cPnwYampqaNq0qdz27t27Y/fu3VVdHxERERERfSAUvqzr+PHjGDlyJAwNDUt9apepqSkePHhQpcUREREREdGHQ+HmpKCgANra2mVu/+eff6CmplYlRRERERER0YdH4ebE3t4eCQkJpW6TyWTYu3cvnJycqqouIiIiIiL6wCjcnPj5+WHPnj347rvv8OTJEwBAUVERrl+/Dl9fX5w/fx5ffvlltRVKRERERES1m8I3xA8YMAD37t3D/PnzsWDBAmEMANTU1BASEoJu3bpVT5VERERERFTrVeoljF999RU8PT0RExODW7duoaioCJaWlujbty/Mzc2rq0YiIiIiIvoAVNic5OXl4cCBA0hNTUWjRo3Qo0cPjBs37r+ojYiIiIiIPiDlNifp6elwd3fH7du3IZPJAADa2trYsmUL2rdv/58USFQekWhZTZdAREooK+urmi6BiIjeQrk3xIeEhCA1NRXjxo3Dli1bEBoaCk1NTUydOvW/qo+IiIiIiD4Q5a6cHDlyBIMHD0ZISIgwZmhoiJEjR+L+/fswNjau9gKJiIiIiOjDUO7KSXp6OlxcXOTGPvroI8hkMvz999/VWhgREREREX1Yym1OCgsLUbduXbmx4s+5ubnVVxUREREREX1wKnxaV2pqKs6ePSt8fvr0KQAgJSUF9evXLxHfunXrKiyPiIiIiIg+FBU2J6GhoQgNDS0x/uZN8TKZDCoqKsLb44mIiIiIiCqj3OYkPDz8v6qDiIiIiIg+cOU2J0OGDPmv6iAiIiIiog9cuTfEExERERER/VfYnBARERERkVJgc0JEREREREqBzQkRERERESkFNidERERERKQU2JwQEREREZFSYHNCRERERERKgc0JEREREREpBTYnRERERESkFGq8OcnIyMC0adPg5OQEQ0ND2NnZwdPTE7/99lul8vzxxx8YNGgQ7OzsIBKJsGnTphIxMpkM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ERERESkFNidERERERKQU2JwQEREREZFSYHNCRERERERKgc0JEREREREpBTYnRERERESkFNicEBERERGRUmBzQkRERERESoHNCRERERERKQU2J0REREREpBTq1HQBRO/CsNeFmi6h1khJSYFUKq3pMoiIiOgDxpUTIiIiIiJSCmxOiIiIiIhIKbA5ISIiIiIipcDmhIiIiIiIlAKbEyIiIiIiUgpsToiIiIiISCmwOSEiIiIiIqXA5oSIiIiIiJQCmxMiIiIiIlIKbE6IiIiIiEgp1KnpAojehUi0rKZLICIFZWV9VdMlEBGRkuPKCRERERERKQU2J0REREREpBTYnBARERERkVJgc0JEREREREqBzQkRERERESkFNidERERERKQU2JwQEREREZFSYHNCRERERERKgc0JEREREREpBTYnRERERESkFNicEBERERGRUmBzQkRERERESoHNCRERERERKQU2J0REREREpBTYnBARERERkVJgc0JEREREREqBzQkRERERESkFNidERERERKQUakVz4ufnB5FIJHxZWVlh4MCBuH79+jvnEolE6Nq1a4X7JSYmolOnThCLxWjRogWio6NLxOzZswcuLi4wNDSEi4sL9u7dWyJmzZo1cHR0hFgsRqdOnXD8+PFyj7tp0yYYGxsrfoLlyMjIgJ+fH2xtbdG4cWMMGDAAN2/erHC/1atXw9nZGRKJBG3atMHPP/8stz0/Px9hYWFwcnKCWCxG+/btcfjwYbmYZ8+eITAwEM2bN4dEIkH37t1x7ty5KjkvIiIiIno/1IrmBABcXV2RnJyM5ORk7Ny5Ey9evMDQoUPfOVdycjK2bdtWbnxqaio+//xzODs7Iz4+HhMnTsTUqVOxZ88eISYpKQm+vr7w8vJCQkICvLy8MHz4cJw5c0aI2blzJwIDAzFp0iTEx8fD2dkZXl5euHfv3ludR2XIZDJ4e3vj1q1b2LRpE+Lj42FqagoPDw/k5OSUud+PP/6IOXPmYOrUqTh58iSCgoIwZcoUHDx4UIgJCQnB2rVrERYWhlOnTsHX1xdDhw7FxYsXhZgJEybgyJEjiIyMxPHjx9G5c2f069cPaWlp1XreRERERKQ8ak1zoqmpCbFYDLFYDCcnJ4wbNw7Xr1/Hixcv3imXWCxGw4YNy41fu3YtJBIJFi5cCBsbGwwbNgyDBw/GypUr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kydPMG3aNAQFBSEiIgKBgYEYPHgw8vLy4OLigu3bt8s9vexNDx8+xPTp05GRkQGxWIxBgwZh6tSpcjFvnnthYSHCw8Nx48YNqKuro0OHDvjtt9/kLsfKzc3F/PnzkZqaCm1tbXTr1g1RUVEQiURCzNOnTxEcHIy0tDQ0bNgQffv2xYwZM4SVJyIiIiKq/VSysrLKvkGBSuXu7g5ra2ssW7aspkv5zynbuWfsd6rpEmqMYa8LVZpPGW+Ke99xTqse57TqcU6rHue06nFOq4cyzmutWTn5r2RnZ+PGjRvYuHFjTZfyn/uQz52IiIiIqh+bk0rS1dXF9evXa7qMGvEhnzsRERERVb9a+7QuIiIiIiJ6v7A5ISIiIiIipcDmhIiIiIiIlAKbEyIiIiIiUgpsToiIiIiISCmwOSEiIiIiIqXA5oSIiIiIiJQCmxMiIiIiIlIKbE6IiIiIiEgpsDkhIiIiIiKlwOaEiIiIiIiUApsTIiIiIiJSCmxOiIiIiIhIKdSp6QKI3oVhrws1XQIRERERVRGunBARERERkVJgc0JEREREREqBzQkRERERESkFNidERERERKQU2JwQEREREZFSYHNCRERERERKgc0JEREREREpBTYnRERERESkFNicEBERERGRUmBzQkRERERESqFOTRdA9C5EomU1XQIREdEHJSvrq5ougWoxrpwQEREREZFSYHNCRERERERKgc0JEREREREpBTYnRERERESkFNicEBERERGRUmBzQkRERERESoHNCRERERERKQU2J0REREREpBTYnBARERERkVJgc0JEREREREqBzQkRERERESkFNidERERERKQU2JwQEREREZFSYHNCRERERERKgc0JEREREREpBTYnRERERESkFNicEBERERGRUmBzQkRERERESoHNSRW6ePEiGjVqhB49erx1jqysLIwePRpmZmYwMzPD6NGjkZWVVe4+vXr1wpQpU976mKXJzMyEnZ0dRCIRMjMzy43NyMiAn58fbG1t0bhxYwwYMAA3b96Ui7l9+za8vb3RpEkTmJqaYvjw4cjIyJCLuXDhAvr16wczMzNYWloiICAAz58/r9LzIiIiIiLlxeakCq1fvx4jRozA1atXkZyc/FY5Ro4ciUuXLmHbtm3Yvn07Ll26hDFjxlRxpRUbN24cHBwcKoyTyWTw9vbGrVu3sGnT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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "distributions[['Personal Income',\n", " \"Bachelor's degree or higher\",\n", " 'No high school diploma']].plot.barh('Personal Income',\n", " width=0.8,\n", " figsize=(10,8),\n", " color=('goldenrod','navy'))\n", "plt.ylabel('Personal Income')\n", "\n", "plt.show()" ] } ], "metadata": { "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.6.12" } }, "nbformat": 4, "nbformat_minor": 1 }