{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Simple Analysis of Beer Data from the [Craft Beers Data Set](https://github.com/nickhould/craft-beers-dataset)\n",
"\n",
"Accompanies post on [Practical Business Python](https://pbpython.com)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import seaborn as sns\n",
"import plotly.express as px"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"sns.set_style('whitegrid')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"df_beers = pd.read_csv('https://github.com/nickhould/craft-beers-dataset/blob/master/data/processed/beers.csv?raw=True', index_col=0)\n",
"df_breweries = pd.read_csv('https://github.com/nickhould/craft-beers-dataset/blob/master/data/processed/breweries.csv?raw=True', index_col=0)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" abv | \n",
" ibu | \n",
" id | \n",
" name | \n",
" style | \n",
" brewery_id | \n",
" ounces | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.050 | \n",
" NaN | \n",
" 1436 | \n",
" Pub Beer | \n",
" American Pale Lager | \n",
" 408 | \n",
" 12.0 | \n",
"
\n",
" \n",
" 1 | \n",
" 0.066 | \n",
" NaN | \n",
" 2265 | \n",
" Devil's Cup | \n",
" American Pale Ale (APA) | \n",
" 177 | \n",
" 12.0 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.071 | \n",
" NaN | \n",
" 2264 | \n",
" Rise of the Phoenix | \n",
" American IPA | \n",
" 177 | \n",
" 12.0 | \n",
"
\n",
" \n",
" 3 | \n",
" 0.090 | \n",
" NaN | \n",
" 2263 | \n",
" Sinister | \n",
" American Double / Imperial IPA | \n",
" 177 | \n",
" 12.0 | \n",
"
\n",
" \n",
" 4 | \n",
" 0.075 | \n",
" NaN | \n",
" 2262 | \n",
" Sex and Candy | \n",
" American IPA | \n",
" 177 | \n",
" 12.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" abv ibu id name style \\\n",
"0 0.050 NaN 1436 Pub Beer American Pale Lager \n",
"1 0.066 NaN 2265 Devil's Cup American Pale Ale (APA) \n",
"2 0.071 NaN 2264 Rise of the Phoenix American IPA \n",
"3 0.090 NaN 2263 Sinister American Double / Imperial IPA \n",
"4 0.075 NaN 2262 Sex and Candy American IPA \n",
"\n",
" brewery_id ounces \n",
"0 408 12.0 \n",
"1 177 12.0 \n",
"2 177 12.0 \n",
"3 177 12.0 \n",
"4 177 12.0 "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_beers.head()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Int64Index: 2410 entries, 0 to 2409\n",
"Data columns (total 7 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 abv 2348 non-null float64\n",
" 1 ibu 1405 non-null float64\n",
" 2 id 2410 non-null int64 \n",
" 3 name 2410 non-null object \n",
" 4 style 2405 non-null object \n",
" 5 brewery_id 2410 non-null int64 \n",
" 6 ounces 2410 non-null float64\n",
"dtypes: float64(3), int64(2), object(2)\n",
"memory usage: 150.6+ KB\n"
]
}
],
"source": [
"df_beers.info()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" name | \n",
" city | \n",
" state | \n",
" id | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" NorthGate Brewing | \n",
" Minneapolis | \n",
" MN | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" Against the Grain Brewery | \n",
" Louisville | \n",
" KY | \n",
" 1 | \n",
"
\n",
" \n",
" 2 | \n",
" Jack's Abby Craft Lagers | \n",
" Framingham | \n",
" MA | \n",
" 2 | \n",
"
\n",
" \n",
" 3 | \n",
" Mike Hess Brewing Company | \n",
" San Diego | \n",
" CA | \n",
" 3 | \n",
"
\n",
" \n",
" 4 | \n",
" Fort Point Beer Company | \n",
" San Francisco | \n",
" CA | \n",
" 4 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name city state id\n",
"0 NorthGate Brewing Minneapolis MN 0\n",
"1 Against the Grain Brewery Louisville KY 1\n",
"2 Jack's Abby Craft Lagers Framingham MA 2\n",
"3 Mike Hess Brewing Company San Diego CA 3\n",
"4 Fort Point Beer Company San Francisco CA 4"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_breweries.head()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Int64Index: 558 entries, 0 to 557\n",
"Data columns (total 4 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 name 558 non-null object\n",
" 1 city 558 non-null object\n",
" 2 state 558 non-null object\n",
" 3 id 558 non-null int64 \n",
"dtypes: int64(1), object(3)\n",
"memory usage: 21.8+ KB\n"
]
}
],
"source": [
"df_breweries.info()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"all_beer = pd.merge(df_beers, df_breweries, how='left', \n",
" left_on=\"brewery_id\", \n",
" right_on=\"id\", \n",
" suffixes=('_beer', '_brewery'))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" abv | \n",
" ibu | \n",
" id_beer | \n",
" name_beer | \n",
" style | \n",
" brewery_id | \n",
" ounces | \n",
" name_brewery | \n",
" city | \n",
" state | \n",
" id_brewery | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.050 | \n",
" NaN | \n",
" 1436 | \n",
" Pub Beer | \n",
" American Pale Lager | \n",
" 408 | \n",
" 12.0 | \n",
" 10 Barrel Brewing Company | \n",
" Bend | \n",
" OR | \n",
" 408 | \n",
"
\n",
" \n",
" 1 | \n",
" 0.066 | \n",
" NaN | \n",
" 2265 | \n",
" Devil's Cup | \n",
" American Pale Ale (APA) | \n",
" 177 | \n",
" 12.0 | \n",
" 18th Street Brewery | \n",
" Gary | \n",
" IN | \n",
" 177 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.071 | \n",
" NaN | \n",
" 2264 | \n",
" Rise of the Phoenix | \n",
" American IPA | \n",
" 177 | \n",
" 12.0 | \n",
" 18th Street Brewery | \n",
" Gary | \n",
" IN | \n",
" 177 | \n",
"
\n",
" \n",
" 3 | \n",
" 0.090 | \n",
" NaN | \n",
" 2263 | \n",
" Sinister | \n",
" American Double / Imperial IPA | \n",
" 177 | \n",
" 12.0 | \n",
" 18th Street Brewery | \n",
" Gary | \n",
" IN | \n",
" 177 | \n",
"
\n",
" \n",
" 4 | \n",
" 0.075 | \n",
" NaN | \n",
" 2262 | \n",
" Sex and Candy | \n",
" American IPA | \n",
" 177 | \n",
" 12.0 | \n",
" 18th Street Brewery | \n",
" Gary | \n",
" IN | \n",
" 177 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" abv ibu id_beer name_beer style \\\n",
"0 0.050 NaN 1436 Pub Beer American Pale Lager \n",
"1 0.066 NaN 2265 Devil's Cup American Pale Ale (APA) \n",
"2 0.071 NaN 2264 Rise of the Phoenix American IPA \n",
"3 0.090 NaN 2263 Sinister American Double / Imperial IPA \n",
"4 0.075 NaN 2262 Sex and Candy American IPA \n",
"\n",
" brewery_id ounces name_brewery city state id_brewery \n",
"0 408 12.0 10 Barrel Brewing Company Bend OR 408 \n",
"1 177 12.0 18th Street Brewery Gary IN 177 \n",
"2 177 12.0 18th Street Brewery Gary IN 177 \n",
"3 177 12.0 18th Street Brewery Gary IN 177 \n",
"4 177 12.0 18th Street Brewery Gary IN 177 "
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"all_beer.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Check for empty values"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"abv 62\n",
"ibu 1005\n",
"id_beer 0\n",
"name_beer 0\n",
"style 5\n",
"brewery_id 0\n",
"ounces 0\n",
"name_brewery 0\n",
"city 0\n",
"state 0\n",
"id_brewery 0\n",
"dtype: int64"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"all_beer.isna().sum()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Int64Index: 2410 entries, 0 to 2409\n",
"Data columns (total 11 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 abv 2348 non-null float64\n",
" 1 ibu 1405 non-null float64\n",
" 2 id_beer 2410 non-null int64 \n",
" 3 name_beer 2410 non-null object \n",
" 4 style 2405 non-null object \n",
" 5 brewery_id 2410 non-null int64 \n",
" 6 ounces 2410 non-null float64\n",
" 7 name_brewery 2410 non-null object \n",
" 8 city 2410 non-null object \n",
" 9 state 2410 non-null object \n",
" 10 id_brewery 2410 non-null int64 \n",
"dtypes: float64(3), int64(3), object(5)\n",
"memory usage: 225.9+ KB\n"
]
}
],
"source": [
"all_beer.info()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"