{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Sampling and Testing the Penguins\n",
"\n",
"This notebook uses the [Palmer Penguins data](https://github.com/allisonhorst/palmerpenguins) to demonstrate confidence intervals and two-sample hypothesis tests, both using parametric methods and the bootstrap.\n",
"\n",
"Our question: What are the average values of various penguin dimensions (bill length and depth, flipper length, and body mass)? Do these dimensions differ between penguin species?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setup\n",
"\n",
"Python modules:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import scipy.stats as sps\n",
"import statsmodels.api as sm\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Set up a random number generator:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"rng = np.random.default_rng(20200913)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Load the Penguin data:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
species
\n",
"
island
\n",
"
bill_length_mm
\n",
"
bill_depth_mm
\n",
"
flipper_length_mm
\n",
"
body_mass_g
\n",
"
sex
\n",
"
year
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Adelie
\n",
"
Torgersen
\n",
"
39.1
\n",
"
18.7
\n",
"
181.0
\n",
"
3750.0
\n",
"
male
\n",
"
2007
\n",
"
\n",
"
\n",
"
1
\n",
"
Adelie
\n",
"
Torgersen
\n",
"
39.5
\n",
"
17.4
\n",
"
186.0
\n",
"
3800.0
\n",
"
female
\n",
"
2007
\n",
"
\n",
"
\n",
"
2
\n",
"
Adelie
\n",
"
Torgersen
\n",
"
40.3
\n",
"
18.0
\n",
"
195.0
\n",
"
3250.0
\n",
"
female
\n",
"
2007
\n",
"
\n",
"
\n",
"
3
\n",
"
Adelie
\n",
"
Torgersen
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
2007
\n",
"
\n",
"
\n",
"
4
\n",
"
Adelie
\n",
"
Torgersen
\n",
"
36.7
\n",
"
19.3
\n",
"
193.0
\n",
"
3450.0
\n",
"
female
\n",
"
2007
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" species island bill_length_mm bill_depth_mm flipper_length_mm \\\n",
"0 Adelie Torgersen 39.1 18.7 181.0 \n",
"1 Adelie Torgersen 39.5 17.4 186.0 \n",
"2 Adelie Torgersen 40.3 18.0 195.0 \n",
"3 Adelie Torgersen NaN NaN NaN \n",
"4 Adelie Torgersen 36.7 19.3 193.0 \n",
"\n",
" body_mass_g sex year \n",
"0 3750.0 male 2007 \n",
"1 3800.0 female 2007 \n",
"2 3250.0 female 2007 \n",
"3 NaN NaN 2007 \n",
"4 3450.0 female 2007 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"penguins = pd.read_csv('../penguins.csv')\n",
"penguins.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Some of these names are cumbersome to deal with. I'm going to give them shorter names:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"penguins.rename(columns={\n",
" 'bill_length_mm': 'BillLength',\n",
" 'bill_depth_mm': 'BillDepth',\n",
" 'flipper_length_mm': 'FlipperLength',\n",
" 'body_mass_g': 'Mass'\n",
"}, inplace=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A few things will be eaiser if we also split out penguins by species:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
species
\n",
"
island
\n",
"
BillLength
\n",
"
BillDepth
\n",
"
FlipperLength
\n",
"
Mass
\n",
"
sex
\n",
"
year
\n",
"
\n",
" \n",
" \n",
"
\n",
"
276
\n",
"
Chinstrap
\n",
"
Dream
\n",
"
46.5
\n",
"
17.9
\n",
"
192.0
\n",
"
3500.0
\n",
"
female
\n",
"
2007
\n",
"
\n",
"
\n",
"
277
\n",
"
Chinstrap
\n",
"
Dream
\n",
"
50.0
\n",
"
19.5
\n",
"
196.0
\n",
"
3900.0
\n",
"
male
\n",
"
2007
\n",
"
\n",
"
\n",
"
278
\n",
"
Chinstrap
\n",
"
Dream
\n",
"
51.3
\n",
"
19.2
\n",
"
193.0
\n",
"
3650.0
\n",
"
male
\n",
"
2007
\n",
"
\n",
"
\n",
"
279
\n",
"
Chinstrap
\n",
"
Dream
\n",
"
45.4
\n",
"
18.7
\n",
"
188.0
\n",
"
3525.0
\n",
"
female
\n",
"
2007
\n",
"
\n",
"
\n",
"
280
\n",
"
Chinstrap
\n",
"
Dream
\n",
"
52.7
\n",
"
19.8
\n",
"
197.0
\n",
"
3725.0
\n",
"
male
\n",
"
2007
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" species island BillLength BillDepth FlipperLength Mass sex \\\n",
"276 Chinstrap Dream 46.5 17.9 192.0 3500.0 female \n",
"277 Chinstrap Dream 50.0 19.5 196.0 3900.0 male \n",
"278 Chinstrap Dream 51.3 19.2 193.0 3650.0 male \n",
"279 Chinstrap Dream 45.4 18.7 188.0 3525.0 female \n",
"280 Chinstrap Dream 52.7 19.8 197.0 3725.0 male \n",
"\n",
" year \n",
"276 2007 \n",
"277 2007 \n",
"278 2007 \n",
"279 2007 \n",
"280 2007 "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"chinstraps = penguins[penguins['species'] == 'Chinstrap']\n",
"chinstraps.head()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"adelies = penguins[penguins['species'] == 'Adelie']\n",
"gentoos = penguins[penguins['species'] == 'Gentoo']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That's all we need right now!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Confidence Intervals\n",
"\n",
"Remember that $s/\\sqrt{n}$ is the **standard error** of the mean. The SciPy [`sem`](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.sem.html) function computes the standard error of the mean. We can multiply this by 1.96 to get the distance between the sample mean and the edge of the confidence interval.\n",
"\n",
"So let's write a function that returns the 95% CI of the mean of some data:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def mean_ci95(xs):\n",
" mean = np.mean(xs)\n",
" err = sps.sem(xs)\n",
" width = 1.96 * err\n",
" return mean - width, mean + width"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Warmup: Chinstrap Flippers\n",
"\n",
"As a warmup, let's compute confidence intervals for the chinstrap flipper length. We will do this with both the standard error and with the bootstrap.\n",
"\n",
"Let's get the mean & SD of the Chinstrap penguins:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(195.8235294117647, 7.131894258578146, 68)"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"p_mean = chinstraps['FlipperLength'].mean()\n",
"p_std = chinstraps['FlipperLength'].std() # defaults to sample SD\n",
"p_n = len(chinstraps)\n",
"p_mean, p_std, p_n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"What's the confidence interval?"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(194.12838574870136, 197.51867307482803)"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean_ci95(chinstraps['FlipperLength'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's bootstrap the chinstraps, and compute the percentile 95% confidence interval for them:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([194.14705882, 197.5 ])"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"boot_means = [np.mean(rng.choice(chinstraps['FlipperLength'], p_n)) for i in range(10000)]\n",
"np.quantile(boot_means, [0.025, 0.975])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And let's see the distribution of that bootstrap sample mean:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Density')"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sns.distplot(boot_means)\n",
"plt.xlabel('Sample Mean')\n",
"plt.ylabel('Density')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Penguin Statistics\n",
"\n",
"With that warmup, let's look at our various biometrics."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Parametric Estimates\n",
"\n",
"We're going to compute CIs for several measurements, but we don't want to repeat all of our code.\n",
"\n",
"Pandas `groupby` let us *apply* a function to each group, which can in turn return a series or a data frame.\n",
"\n",
"Let's write a function that, given a series of penguin data, returns our statistics:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"def mean_estimate(vals):\n",
" # vals is a series of measurements of a single variable\n",
" mean = vals.mean()\n",
" se = vals.sem() # Pandas has an SEM function too.\n",
" \n",
" ci_width = 1.96 * se\n",
" return pd.Series({\n",
" 'mean': mean,\n",
" 'std': vals.std(),\n",
" 'count': vals.count(),\n",
" 'se': vals.sem(),\n",
" 'ci_width': ci_width,\n",
" 'ci_min': mean - ci_width,\n",
" 'ci_max': mean + ci_width\n",
" })"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Flipper Length\n",
"\n",
"Now we can do this to the flipper length:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
mean
\n",
"
std
\n",
"
count
\n",
"
se
\n",
"
ci_width
\n",
"
ci_min
\n",
"
ci_max
\n",
"
\n",
"
\n",
"
species
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
Adelie
\n",
"
189.953642
\n",
"
6.539457
\n",
"
151.0
\n",
"
0.532173
\n",
"
1.043060
\n",
"
188.910582
\n",
"
190.996702
\n",
"
\n",
"
\n",
"
Chinstrap
\n",
"
195.823529
\n",
"
7.131894
\n",
"
68.0
\n",
"
0.864869
\n",
"
1.695144
\n",
"
194.128386
\n",
"
197.518673
\n",
"
\n",
"
\n",
"
Gentoo
\n",
"
217.186992
\n",
"
6.484976
\n",
"
123.0
\n",
"
0.584731
\n",
"
1.146072
\n",
"
216.040920
\n",
"
218.333064
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" mean std count se ci_width ci_min \\\n",
"species \n",
"Adelie 189.953642 6.539457 151.0 0.532173 1.043060 188.910582 \n",
"Chinstrap 195.823529 7.131894 68.0 0.864869 1.695144 194.128386 \n",
"Gentoo 217.186992 6.484976 123.0 0.584731 1.146072 216.040920 \n",
"\n",
" ci_max \n",
"species \n",
"Adelie 190.996702 \n",
"Chinstrap 197.518673 \n",
"Gentoo 218.333064 "
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"penguins.groupby('species')['FlipperLength'].apply(mean_estimate).unstack()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The confidence intervals don't overlap. Chinstrap and Adelie are the closest.\n",
"\n",
"> **Note:** The `unstack` function pivots the innermost level of a hierarchical index to be column labels. Try without it to see what changes!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Bill Length"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"