From 22c9d768b1f568a8ec812e7c83f174dbe97235cb Mon Sep 17 00:00:00 2001 From: Dmitri Soshnikov Date: Thu, 19 Aug 2021 15:01:14 +0300 Subject: [PATCH] Continue work on prob and statistics --- .../04-stats-and-probability/README.md | 78 +++++- .../04-stats-and-probability/notebook.ipynb | 253 +++++++++++++++++- 2 files changed, 321 insertions(+), 10 deletions(-) diff --git a/1-Introduction/04-stats-and-probability/README.md b/1-Introduction/04-stats-and-probability/README.md index 504b6c0f..f2fa0c22 100644 --- a/1-Introduction/04-stats-and-probability/README.md +++ b/1-Introduction/04-stats-and-probability/README.md @@ -51,7 +51,7 @@ To help us understand the distribution of data, it is helpful to talk about **qu Graphically we can represent relationship between median and quartiles in a diagram called the **box plot**: -![Box Plot](images/boxplot_explanation.png) + Here we also computer **inter-quartile range** IQR=Q3-Q1, and so-called **outliers** - values, that lie outside the boundaries [Q1-1.5*IQR,Q3+1.5*IQR]. @@ -92,6 +92,82 @@ If we plot the histogram of the generated samples we will see the picture very s *Normal Distribution with mean=0 and std.dev=1* +## Confidence Intervals + +When we talk about weights of baseball players, we assume that there is certain **random variable W** that corresponds to ideal probability distribution of weights of all baseball players. Our sequence of weights corresponds to a subset of all baseball players that we call **population**. An interesting question is, can we know the parameters of distribution of W, i.e. mean and variance? + +The easiest answer would be to calculate mean and variance of our sample. However, it could happen that our random sample does not accurately represent complete population. Thus it makes sense to talk about **confidence interval**. + +Suppose we have a sample X1, ..., Xn from our distribution. Each time we draw a sample from our distribution, we would end up with different mean value μ. Thus μ can be considered to be a random variable. A **confidence interval** with confidence p is a pair of values (Lp,Rp), such that **P**(Lp≤μ≤Rp) = p, i.e. a probability of measured mean value falling within the interval equals to p. + +It does beyond our short intro to discuss how those confidence intervals are calculated. Some more details can be found [on Wikipedia](https://en.wikipedia.org/wiki/Confidence_interval). An example of calculating confidence interval for weights and heights is given in the [accompanying notebooks](notebook.ipynb). + +| p | Weight mean | +|-----|-----------| +| 0.85 | 201.73±0.94 | +| 0.90 | 201.73±1.08 | +| 0.95 | 201.73±1.28 | + +Notice that the higher is the confidence probability, the wider is the confidence interval. + +## Hypothesis Testing + +In our baseball players dataset, there are different player roles, that can be summarized below (look at the [accompanying notebook](notebook.ipynb) to see how this table can be calculated): + +| Role | Height | Weight | Count | +|------|--------|--------|-------| +| Catcher | 72.723684 | 204.328947 | 76 | +| Designated_Hitter | 74.222222 | 220.888889 | 18 | +| First_Baseman | 74.000000 | 213.109091 | 55 | +| Outfielder | 73.010309 | 199.113402 | 194 | +| Relief_Pitcher | 74.374603 | 203.517460 | 315 | +| Second_Baseman | 71.362069 | 184.344828 | 58 | +| Shortstop | 71.903846 | 182.923077 | 52 | +| Starting_Pitcher | 74.719457 | 205.163636 | 221 | +| Third_Baseman | 73.044444 | 200.955556 | 45 | + +We can notice that the mean heights of first basemen is higher that that of second basemen. Thus, we may be tempted to conclude that **first basemen are higher than second basemen**. + +> This statement is called **a hypothesis**, because we do not know whether the fact is actually true or not. + +However, it is not always obvious whether we can make this conclusion. From the discussion above we know that each mean has an associated confidence interval, and thus this difference can just be a statistical error. We need some more formal way to test our hypothesis. + +Let's compute confidence intervals separately for heights of first and second basemen: + +| Confidence | First Basemen | Second Basemen | +|------------|---------------|----------------| +| 0.85 | 73.62..74.38 | 71.04..71.69 | +| 0.90 | 73.56..74.44 | 70.99..71.73 | +| 0.95 | 73.47..74.53 | 70.92..71.81 | + +We can see that under no confidence the intervals overlap. That proves our hypothesis that first basemen are higher than second basemen. + +More formally, the problem we are solving is to see if **two probability distributions are the same**, or at least have the same parameters. Depending on the distribution, we need to use different tests for that. If we know that our distributions are normal, we can apply **[Student t-test](https://en.wikipedia.org/wiki/Student%27s_t-test)**. + +In Student t-test, we compute so-called **t-value**, which indicates the difference between means, taking into account the variance. It is demonstrated that t-value follows **student distribution**, which allows us to get the threshold value for a given confidence level **p** (this can be computed, or looked up in the numerical tables). We then compare t-value to this threshold to approve or reject the hypothesis. + +In Python, we can use **SciPy** package, which includes `ttest_ind` function (in addition to many other useful statistical functions!). It computes the t-value for us, and also does the reverse lookup of confidence p-value, so that we can just look at the confidence to draw the conclusion. + +For example, our comparison between heights of first and second basemen give us the following results: +```python +from scipy.stats import ttest_ind + +tval, pval = ttest_ind(df.loc[df['Role']=='First_Baseman',['Height']], df.loc[df['Role']=='Designated_Hitter',['Height']],equal_var=False) +print(f"T-value = {tval[0]:.2f}\nP-value: {pval[0]}") +``` +``` +T-value = 7.65 +P-value: 9.137321189738925e-12 +``` +In our case, p-value is very low, meaning that there is strong evidence supporting that first basemen are taller. + +> **Challenge**: Use the sample code in the notebook to test other hypothesis that: (1) First basemen and older that second basemen; (2) First basemen and taller than third basemen; (3) Shortstops are taller than second basemen + + +There are different types of hypothesis that we might want to test, for example: +* To prove that a given sample follows some distribution. In our case we have assumed that heights are normally distributed, but that needs formal statistical verification. +* To prove that a mean value of a sample corresponds to some predefined value +* To prove that ## Law of Large Numbers and Central Limit Theorem diff --git a/1-Introduction/04-stats-and-probability/notebook.ipynb b/1-Introduction/04-stats-and-probability/notebook.ipynb index c94d8b3a..8b83ab72 100644 --- a/1-Introduction/04-stats-and-probability/notebook.ipynb +++ b/1-Introduction/04-stats-and-probability/notebook.ipynb @@ -93,9 +93,9 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 168, "source": [ - "df = pd.read_csv(\"../../data/SOCR_MLB.tsv\",sep='\\t',header=None,names=['Name','Team','Rome','Height','Weight','Age'])\r\n", + "df = pd.read_csv(\"../../data/SOCR_MLB.tsv\",sep='\\t',header=None,names=['Name','Team','Role','Height','Weight','Age'])\r\n", "df" ], "outputs": [ @@ -103,7 +103,7 @@ "output_type": "execute_result", "data": { "text/plain": [ - " Name Team Rome Height Weight Age\n", + " Name Team Role Height Weight Age\n", "0 Adam_Donachie BAL Catcher 74 180.0 22.99\n", "1 Paul_Bako BAL Catcher 74 215.0 34.69\n", "2 Ramon_Hernandez BAL Catcher 72 210.0 30.78\n", @@ -139,7 +139,7 @@ " \n", " Name\n", " Team\n", - " Rome\n", + " Role\n", " Height\n", " Weight\n", " Age\n", @@ -252,7 +252,7 @@ ] }, "metadata": {}, - "execution_count": 26 + "execution_count": 168 } ], "metadata": {} @@ -298,10 +298,10 @@ }, { "cell_type": "code", - "execution_count": 148, + "execution_count": 158, "source": [ "plt.figure(figsize=(10,2))\r\n", - "plt.boxplot(df['Height'],vert=False)\r\n", + "plt.boxplot(df['Height'],vert=False,showmeans=True)\r\n", "plt.grid(color='gray',linestyle='dotted')\r\n", "plt.show()" ], @@ -312,8 +312,8 @@ "text/plain": [ "
" ], - "image/svg+xml": "\r\n\r\n\r\n \r\n \r\n \r\n \r\n 2021-08-17T12:38:47.369488\r\n image/svg+xml\r\n \r\n \r\n Matplotlib v3.4.2, https://matplotlib.org/\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", - "image/png": "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fb3h+RPxAQAAAOBIsNMCAAAAIKOxaAEAAACQ0Vi0AAAAAMhoLFoAAAAAZDQWLQAAAAAyGouWDLRt2zYZMmSIFBQUSJs2beS0006TZcuW1X59z549MnLkSCkqKpLWrVvLSSedJFOmTPFx4uDo3r27RCKRg95uv/12ERFRVRk3bpwUFhZK69at5YILLpBVq1b5PHVwHK5vMpmU+++/X3r37i1t27aVwsJCGTp0qGzfvt3vsQOjsevvD916660SiURk8uTJ3g8aUE3pu3r1arnyyislPz9f8vLypF+/frJ582Yfpw6Oxvry2NY8qVRKHnzwQenRo4e0bt1ajjvuOHnooYfEdd3a7+Ex7sdrrC+PcR5QZJTvvvtOu3XrpsOGDdN//OMfumnTJv3ggw90/fr1td9z8803a3FxsZaXl+umTZv0+eef12g0qrNnz/Zx8mD49ttvdceOHbVv8+fPVxHR8vJyVVUtKSnRvLw8ffPNN3XFihV6/fXX67HHHqtVVVX+Dh4Qh+u7e/duvfjii/X111/XNWvW6OLFi/Wss87Svn37+j12YDR2/a3x1ltv6amnnqqFhYVaWlrqy6xB1Fjf9evX69FHH62jR4/WiooK3bBhg86dO1d37tzp7+AB0VhfHtua55FHHtGCggKdO3eubtq0SWfOnKlHHXWUTp48ufZ7eIz78Rrry2OcPRYtGeb+++/X/v37H/Z7evXqpQ899FCdz/Xp00cffPBBy9FC6a677tLi4mJ1XVdd19VOnTppSUlJ7df379+v+fn5OnXqVB+nDK4f9m3IZ599piKi//73vz2eLBwa6rt161bt3Lmzrly5Urt168aipRnq973++ut1yJAhPk8VHvX78tjWPJdffrnedNNNdT539dVX115neYxrnsb6NoTHuJbF8bAMM2fOHDnjjDPkuuuuk44dO8rpp58uL7zwQp3v6d+/v8yZM0e2bdsmqirl5eWydu1aGThwoE9TB5PjOFJWViY33XSTRCIR2bRpk3zzzTcyYMCA2u/Jzc2V888/XxYtWuTjpMFUv29DKisrJRKJSPv27b0dLgQa6uu6rtxwww0yevRo6dWrl88TBlv9vq7ryjvvvCM/+9nPZODAgdKxY0c566yzZPbs2X6PGkgNXX95bGue/v37y4cffihr164VEZEvvvhCPvnkExk0aJCICI9xzdRY34bwGNfC/F41oa7c3FzNzc3V3//+91pRUaFTp07VVq1a6Z///Ofa70kkEjp06FAVEY3FYpqTk6N/+ctffJw6mF5//XWNRqO6bds2VVX99NNPVURq/7vGLbfcogMGDPBjxECr37e+77//Xvv27au//e1vPZ4sHBrqO2HCBL3kkktqf3PNTsuPV7/vjh07VES0TZs2OmnSJP3888/1scce00gkogsWLPB52uBp6PrLY1vzuK6rDzzwgEYiEY3FYhqJRHTChAm1X+cxrnka61sfj3EtL+brigkHcV1XzjjjDJkwYYKIiJx++umyatUqmTJligwdOlRERJ5++mlZsmSJzJkzR7p16yYff/yxjBgxQo499li5+OKL/Rw/UGbMmCGXXXaZFBYW1vl8/V0BVT3kTgEO7VB9RQ48YfHXv/61uK4r8Xjch+mCr37fZcuWyVNPPSUVFRVcX1tA/b41T7a96qqrZNSoUSIictppp8miRYtk6tSpcv755/s2axA1dP/AY1vzvP7661JWViavvvqq9OrVS5YvXy533323FBYWyo033lj7fTzG/ThN7SvCY5wZv1dNqKtr1646fPjwOp+Lx+NaWFioqqr79u3T7OxsnTt3bp3vGT58uA4cONCzOYPu66+/1qysrDpP8NywYYOKiFZUVNT53iuvvFKHDh3q9YiB1lDfGo7j6ODBg/XnP/+57tq1y4fpgq+hvqWlpRqJRDQajda+iYhmZWVpt27d/Bs2gBrqm0gkNBaL6cMPP1zne8eMGaNnn3221yMGWkN9eWxrvqKiIn322WfrfO7hhx/WE044QVV5jGuuxvrW4DHODs9pyTDnnHOOfPXVV3U+t3btWunWrZuIHFi9J5NJycqq+39dNBqt87KGOLwXX3xROnbsKJdffnnt53r06CGdOnWS+fPn137OcRz56KOP5Oyzz/ZjzMBqqK/Igevvr371K1m3bp188MEHUlBQ4NOEwdZQ3xtuuEH+9a9/yfLly2vfCgsLZfTo0TJv3jwfpw2ehvrm5OTImWeeedj7ZzRNQ315bGu+ffv2HbYfj3HN01hfER7jzPm9akJdn332mcZiMX300Ud13bp1+sorr2ibNm20rKys9nvOP/987dWrl5aXl+vGjRv1xRdf1FatWmk8Hvdx8uBIp9PatWtXvf/++w/6WklJiebn5+usWbN0xYoV+pvf/IaXgzxCh+qbTCb1yiuv1KKiIl2+fHmdlz5NJBI+TRs8h7v+1sdzWo7c4frOmjVLs7Ozddq0abpu3Tp95plnNBqN6sKFC32YNJgO15fHtua58cYbtXPnzrUvyTtr1izt0KGDjhkzpvZ7eIz78Rrry2OcPRYtGeivf/2rnnLKKZqbm6snnniiTps2rc7Xd+zYocOGDdPCwkJt1aqVnnDCCTpx4sRDvqws6po3b56KiH711VcHfc11XR07dqx26tRJc3Nz9bzzztMVK1b4MGVwHarvpk2bVEQafKv/d0ZwaIe7/tbHouXINdZ3xowZ2rNnT23VqpWeeuqp/A2RI3S4vjy2NU9VVZXedddd2rVrV23VqpUed9xx+sc//rHOD8w8xv14jfXlMc5eRFXV8+0dAAAAAGgintMCAAAAIKOxaAEAAACQ0Vi0AAAAAMhoLFoAAAAAZDQWLQAAAAAyGosWAAAAABmNRQsAAACAjMaiBQAAAEBGY9ECAAAAIKOxaAEAAACQ0Vi0AAAAAMho/wfzKwSzHfhGNAAAAABJRU5ErkJggg==" + "image/svg+xml": "\r\n\r\n\r\n \r\n \r\n \r\n \r\n 2021-08-17T13:50:40.404536\r\n image/svg+xml\r\n \r\n \r\n Matplotlib v3.4.2, https://matplotlib.org/\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAy0AAADFCAYAAABZ7x10AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAlCUlEQVR4nO3de3RV5Z3/8c+5JEEwwE9YLgwBRqGtFhkVZXTUepkqVP2Nsux1ZhRdXkYHrS22oDPjGvBSZLXViNgYEZZOG+soLVKGdkRsQRFwpEQcQZGr5Y6L8WcSRM5tf39/MMmYEG4m373PPr5fa2UlJseV57w5Z+88eZ59kjAzEwAAAAAUqWTUAwAAAACAQ2HSAgAAAKCoMWkBAAAAUNSYtAAAAAAoakxaAAAAABQ1Ji0AAAAAihqTFgAAAABFLR32NwyCQNu3b1dlZaUSiUTY3x4AAABAkTAzNTc3q6qqSsnkwddTQp+0bN++XQMGDAj72wIAAAAoUlu2bFF1dfVBvx76pKWyslLS/oH17Nkz7G8fa4VCQW+//baGDRumVCoV9XBKDn190dcXfX3R1xd9fdHXF307p6mpSQMGDGidIxxMwswspDFJ2j+wXr16qbGxkUkLAAAA8Dl2pHMDLsSPkWw2q5kzZyqbzUY9lJJEX1/09UVfX/T1RV9f9PVF33AwaYmRVCqlc845h6VHJ/T1RV9f9PVFX1/09UVfX/QNB9vDAAAAAESC7WElKJvNqra2luVHJ/T1RV9f9PVFX1/09UVfX/QNB5OWGEmn0xo5cqTS6dBf9O1zgb6+6OuLvr7o64u+vujri77hYHsYAAAAgEiwPawEZTIZPfzww8pkMlEPpSTR1xd9fdHXF3190dcXfX3RNxystMRIEATatm2b+vfvr2SS+WZXo68v+vqiry/6+qKvL/r6om/nHOncgEkLAAAAgEiwPawEZTIZPfjggyw/OqGvL/r6oq8v+vqiry/6+qJvOFhpiZEgCLR792717duX5UcH9PVFX1/09UVfX/T1RV9f9O0ctocBAAAAKGpsDytBmUxG9957L8uPTujri76+6OuLvr7o64u+vugbDlZaYsTM1NzcrMrKSiUSiaiHU3Lo64u+vujri76+6OuLvr7o2zmstJSoioqKqIdQ0ujri76+6OuLvr7o64u+vujrj0lLjGSzWU2ZMkXZbDbqoZQk+vqiry/6+qKvL/r6oq8v+oaD7WExYmbKZrMqLy9n+dEBfX3R1xd9fdHXF3190dcXfTuH7WEliou8fNHXF3190dcXfX3R1xd9fdHXH5OWGMlms6qpqWH50Ql9fdHXF3190dcXfX3R1xd9w8H2MAAAAACRYHtYCQqCQB988IGCIIh6KCWJvr7o64u+vujri76+6OuLvuFg0hIjuVxOM2fOVC6Xi3ooJYm+vujri76+6OuLvr7o64u+4WB7GAAAAIBIsD2sBAVBoC1btrD86IS+vujri76+6OuLvr7o64u+4WDSEiO5XE6zZs1i+dEJfX3R1xd9fdHXF3190dcXfcPB9jAAAAAAkWB7WAkKgkDr169n+dEJfX3R1xd9fdHXF3190dcXfcPBpCVG8vm8XnrpJeXz+aiHUpLo64u+vujri76+6OuLvr7oGw62hwEAAACIBNvDSlChUNDq1atVKBSiHkpJoq8v+vqiry/6+qKvL/r6om84mLTESKFQ0Ouvv86Twgl9fdHXF3190dcXfX3R1xd9w8H2MAAAAACRYHtYCSoUCmpoaGAm74S+vujri76+6OuLvr7o64u+4WDSEiOFQkHvvPMOTwon9PVFX1/09UVfX/T1RV9f9A0H28MAAAAARILtYSUon89r2bJlvA64E/r6oq8v+vqiry/6+qKvL/qGg0lLjJiZtm7dqpAXxz436OuLvr7o64u+vujri76+6BsOtocBAAAAiATbw0pQPp/XokWLWH50Ql9f9PVFX1/09UVfX/T1Rd9wMGmJETNTU1MTy49O6OuLvr7o64u+vujri76+6BsOtocBAAAAiATbw0pQPp/X/PnzWX50Ql9f9PVFX1/09UVfX/T1Rd9wMGkBAAAAUNTYHgYAAAAgEmwPK0G5XE5z585VLpeLeiglib6+6OuLvr7o64u+vujri77hYNISI4lEQj179lQikYh6KCWJvr7o64u+vujri76+6OuLvuFgexgAAACASLA9rATlcjnNmjWL5Ucn9PVFX1/09UVfX/T1RV9f9A0Hk5YYSSQSqq6uZvnRCX190dcXfX3R1xd9fdHXF33DwfYwAAAAAJFge1gJymazqq+vVzabjXooJYm+vujri76+6OuLvr7o64u+4WDSEiOpVEpf/vKXlUqloh5KSaKvL/r6oq8v+vqiry/6+qJvONgeBgAAACASbA8r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+vfv32a/J7oGj99Da38tS3uHu7Yl2Pamkk9epODmRUr2P8NjiF2q2K8JaI/jg6+49S32x2/7a1q6devW2nffvn1c09JJ7cebTCZb+wZBUHTjLZVrWor/yNCFysvLNW7cOO3atUvV1dWaPn26tm/frunTp6u6ulq7du3SuHHjiuIB1pGW31K0vEfXyuVymjVrVuv1VuhaPH4Pzsw07c1pSijR4dcTSmjam9MOue+Xvr44Pviib9fq1auXBg8eLEnq0aOHvva1r2nKlCn62te+1jphGTx4cFFMWKT4/XzWfrx1dXWaMWOG6urqinK8qVRKDz30kObNm6fRo0e3efWw0aNHa968efrpT38ayYTlaHzu/grZj3/8Y0lSTU2NbrnlltbPp9NpjR8/vvXrxajlwV8sT4JSU1FRoTvvvDPqYZQsHr8Hlwty2vnxTpk6npSYTDs/3qlckFN5quN+5f+zfaXlPboWxwdf9O1669evb33Z4wULFmjBggWtXxs8eLDWr18f4egOFLefzz493ttuu63188U63quvvlq/+tWv9IMf/EDnnntu6+dPPPFE/epXv9LVV18d4eiOzFFPWvbs2dPmgb5p0yatXLlSxx13nAYOHNilg/Py4x//WA888IBqa2u1YcMGDR48WGPHji36H6ZaXrGm5T26VhAE2rhxo0466aRYbE+IGx6/B1eeKte//d9/04f7PjzobY7rdtxBJyzS/lcNS37qPboWxwdf9PWxfv16NTY26vLLL2/t+7vf/a5oVljai9vPZy3jfeyxx/Tmm2/qjDPO0O23316047366qt11VVXafHixdqxY4dOOOEEfeUrXyn6FZYWRz1p+eMf/6iLL7649b9bfjNy3XXX6emnn+6ygXkrLy/X97///aiHcVQKhUKb9+ha+XxeL730km666aaiPeDEGY/fQ+vXo5/69ej3mf//QiGv5Kfeo2txfPBFXz+9evXSwoULNWPGjFj0jdvPZ+Xl5br99ttj0zeVSumiiy6KehifSacuxP8sorwQP+727t2rNWvW6OSTT27zh6KAOCj2C1djjz8uCYSG8zHQdbgQvwRVVFS0vqHrFQoFrV69mpUAJ6y0+Cr8z7a7AtvvXHB88BW3vt27d9fw4cNjM2GJW9+4oW84mLTESKFQ0Ouvv86Twgl9fXFNi68gKLR5j67F8cEXfX3R1xd9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vujri76+6OuLvr7o2zktc4LDraOEPmlpbm6WJA0YMCDsbw0AAACgCDU3N6tXr14H/Xro28OCIND27dtVWVmpRCIR5reOvaamJg0YMEBbtmxha50D+vqiry/6+qKvL/r6oq8v+naOmam5uVlVVVVKJg9+uX3oKy3JZFLV1dVhf9uS0rNnT54Ujujri76+6OuLvr7o64u+vuj72R1qhaUFrx4GAAAAoKgxaQEAAABQ1Ji0xEhFRYUmTpyoioqKqIdSkujri76+6OuLvr7o64u+vugbjtAvxAcAAACAo8FKCwAAAICixqQFAAAAQFFj0gIAAACgqDFpAQAAAFDUmLQAAAAAKGpMWorQtm3bdM0116hPnz7q3r27Tj/9dK1YsaL163v27NHtt9+u6upqHXPMMTrllFP0+OOPRzji+PizP/szJRKJA95uu+02SZKZadKkSaqqqtIxxxyjiy66SKtXr4541PFxqL65XE533XWXhg0bph49eqiqqkpjxozR9u3box52bBzu8ftpt9xyixKJhB555JHwBxpTR9L33Xff1ZVXXqlevXqpsrJS55xzjjZv3hzhqOPjcH05t3VOPp/XPffcoxNPPFHHHHOMTjrpJN13330KgqD1NpzjPrvD9eUcFwJDUfnwww9t0KBBdv3119t//ud/2qZNm+zll1+29evXt97mpptussGDB9vChQtt06ZN9sQTT1gqlbI5c+ZEOPJ4+OCDD2zHjh2tbwsWLDBJtnDhQjMzmzJlilVWVtqvf/1re/vtt+3b3/62nXDCCdbU1BTtwGPiUH0/+ugju+SSS+y5556zNWvW2LJly+zss8+2M888M+phx8bhHr8tXnjhBTvttNOsqqrKampqIhlrHB2u7/r16+24446z8ePHW0NDg23YsMHmzZtnu3btinbgMXG4vpzbOueBBx6wPn362Lx582zTpk02a9YsO/bYY+2RRx5pvQ3nuM/ucH05x/lj0lJk7rrrLjv//PMPeZuhQ4fafffd1+Zzw4cPt3vuucdzaCXpe9/7ng0ePNiCILAgCKxfv342ZcqU1q/v27fPevXqZXV1dRGOMr4+3bcjb7zxhkmyP/3pTyGPrDR01Hfr1q3Wv39/W7VqlQ0aNIhJSye07/vtb3/brrnmmohHVTra9+Xc1jlXXHGF3XDDDW0+d/XVV7c+ZjnHdc7h+naEc1zXYntYkZk7d67OOussffOb39Txxx+vM844Q08++WSb25x//vmaO3eutm3bJjPTwoULtXbtWo0aNSqiUcdTNptVfX29brjhBiUSCW3atEk7d+7UyJEjW29TUVGhCy+8UEuXLo1wpPHUvm9HGhsblUgk1Lt373AHVwI66hsEga699lqNHz9eQ4cOjXiE8da+bxAE+u1vf6svfvGLGjVqlI4//nidffbZmjNnTtRDjaWOHr+c2zrn/PPP1+9//3utXbtWkvTWW2/ptdde0+WXXy5JnOM66XB9O8I5rotFPWtCWxUVFVZRUWH/+I//aA0NDVZXV2fdunWzf/3Xf229TSaTsTFjxpgkS6fTVl5ebj//+c8jHHU8Pffcc5ZKpWzbtm1mZrZkyRKT1PrfLW6++WYbOXJkFEOMtfZ92/vkk0/szDPPtL/7u78LeWSloaO+kydPtksvvbT1N9estHx27fvu2LHDJFn37t3t4YcftjfffNMefPBBSyQStmjRoohHGz8dPX45t3VOEAR29913WyKRsHQ6bYlEwiZPntz6dc5xnXO4vu1xjut66UhnTDhAEAQ666yzNHnyZEnSGWecodWrV+vxxx/XmDFjJEmPPvqoXn/9dc2dO1eDBg3Sq6++qrFjx+qEE07QJZdcEuXwY2XmzJm67LLLVFVV1ebz7VcFzOygKwU4uIP1lfZfsPid73xHQRCotrY2gtHFX/u+K1as0NSpU9XQ0MDjtQu079tyse1VV12lcePGSZJOP/10LV26VHV1dbrwwgsjG2scdXR84NzWOc8995zq6+v1y1/+UkOHDtXKlSv1/e9/X1VVVbruuutab8c57rM50r4S5zg3Uc+a0NbAgQPtxhtvbPO52tpaq6qqMjOzvXv3WllZmc2bN6/NbW688UYbNWpUaOOMu/fff9+SyWSbCzw3bNhgkqyhoaHNba+88kobM2ZM2EOMtY76tshmszZ69Gj78z//c9u9e3cEo4u/jvrW1NRYIpGwVCrV+ibJksmkDRo0KLrBxlBHfTOZjKXTabv//vvb3HbChAl27rnnhj3EWOuoL+e2zquurrbHHnuszefuv/9++9KXvmRmnOM663B9W3CO88M1LUXmvPPO03vvvdfmc2vXrtWgQYMk7Z+953I5JZNt/+lSqVSblzXEoT311FM6/vjjdcUVV7R+7sQTT1S/fv20YMGC1s9ls1m98sorOvfcc6MYZmx11Ffa//j91re+pXXr1unll19Wnz59IhphvHXU99prr9V//dd/aeXKla1vVVVVGj9+vObPnx/haOOno77l5eUaMWLEIY/PODId9eXc1nl79+49ZD/OcZ1zuL4S5zh3Uc+a0NYbb7xh6XTafvSjH9m6devsmWeese7du1t9fX3rbS688EIbOnSoLVy40DZu3GhPPfWUdevWzWprayMceXwUCgUbOHCg3XXXXQd8bcqUKdarVy+bPXu2vf322/Y3f/M3vBzkUTpY31wuZ1deeaVVV1fbypUr27z0aSaTiWi08XOox297XNNy9A7Vd/bs2VZWVmbTp0+3devW2bRp0yyVStnixYsjGGk8Haov57bOue6666x///6tL8k7e/Zs69u3r02YMKH1NpzjPrvD9eUc549JSxH693//dzv11FOtoqLCTj75ZJs+fXqbr+/YscOuv/56q6qqsm7dutmXvvQle+ihhw76srJoa/78+SbJ3nvvvQO+FgSBTZw40fr162cVFRV2wQUX2Ntvvx3BKOPrYH03bdpkkjp8a/93RnBwh3r8tsek5egdru/MmTNtyJAh1q1bNzvttNP4GyJH6VB9Obd1TlNTk33ve9+zgQMHWrdu3eykk06yf/7nf27zAzPnuM/ucH05x/lLmJmFvrwDAAAAAEeIa1oAAAAAFDUmLQAAAACKGpMWAAAAAEWNSQsAAACAosakBQAAAEBRY9ICAAAAoKgxaQEAAABQ1Ji0AAAAAChqTFoAAAAAFDUmLQAAAACKGpMWAAAAAEXt/wNU43GrtGZYZQAAAABJRU5ErkJggg==" }, "metadata": {} } @@ -499,6 +499,241 @@ ], "metadata": {} }, + { + "cell_type": "markdown", + "source": [ + "## Confidence Intervals\r\n", + "\r\n", + "Let's now calculate confidence intervals for the weights and heights of baseball players. We will use the code [from this stackoverflow discussion](https://stackoverflow.com/questions/15033511/compute-a-confidence-interval-from-sample-data):" + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 181, + "source": [ + "import scipy.stats\r\n", + "\r\n", + "def mean_confidence_interval(data, confidence=0.95):\r\n", + " a = 1.0 * np.array(data)\r\n", + " n = len(a)\r\n", + " m, se = np.mean(a), scipy.stats.sem(a)\r\n", + " h = se * scipy.stats.t.ppf((1 + confidence) / 2., n-1)\r\n", + " return m, h\r\n", + "\r\n", + "for p in [0.85, 0.9, 0.95]:\r\n", + " m, h = mean_confidence_interval(df['Weight'].fillna(method='pad'),p)\r\n", + " print(f\"p={p:.2f}, mean = {m:.2f}±{h:.2f}\")" + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "p=0.85, mean = 201.73±0.94\n", + "p=0.90, mean = 201.73±1.08\n", + "p=0.95, mean = 201.73±1.28\n" + ] + } + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Hypothesis Testing\r\n", + "\r\n", + "Let's explore different roles in our baseball players dataset:" + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 175, + "source": [ + "df.groupby('Role').agg({ 'Height' : 'mean', 'Weight' : 'mean', 'Age' : 'count'}).rename(columns={ 'Age' : 'Count'})" + ], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " Height Weight Count\n", + "Role \n", + "Catcher 72.723684 204.328947 76\n", + "Designated_Hitter 74.222222 220.888889 18\n", + "First_Baseman 74.000000 213.109091 55\n", + "Outfielder 73.010309 199.113402 194\n", + "Relief_Pitcher 74.374603 203.517460 315\n", + "Second_Baseman 71.362069 184.344828 58\n", + "Shortstop 71.903846 182.923077 52\n", + "Starting_Pitcher 74.719457 205.163636 221\n", + "Third_Baseman 73.044444 200.955556 45" + ], + "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", + "
HeightWeightCount
Role
Catcher72.723684204.32894776
Designated_Hitter74.222222220.88888918
First_Baseman74.000000213.10909155
Outfielder73.010309199.113402194
Relief_Pitcher74.374603203.517460315
Second_Baseman71.362069184.34482858
Shortstop71.903846182.92307752
Starting_Pitcher74.719457205.163636221
Third_Baseman73.044444200.95555645
\n", + "
" + ] + }, + "metadata": {}, + "execution_count": 175 + } + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Let's test the hypothesis that First Basemen are higher then Second Basemen. The simplest way to do it is to test the confidence intervals:" + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 188, + "source": [ + "for p in [0.85,0.9,0.95]:\r\n", + " m1, h1 = mean_confidence_interval(df.loc[df['Role']=='First_Baseman',['Height']],p)\r\n", + " m2, h2 = mean_confidence_interval(df.loc[df['Role']=='Second_Baseman',['Height']],p)\r\n", + " print(f'Conf={p:.2f}, 1st basemen height: {m1-h1[0]:.2f}..{m1+h1[0]:.2f}, 2nd basemen height: {m2-h2[0]:.2f}..{m2+h2[0]:.2f}')" + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Conf=0.85, 1st basemen height: 73.62..74.38, 2nd basemen height: 71.04..71.69\n", + "Conf=0.90, 1st basemen height: 73.56..74.44, 2nd basemen height: 70.99..71.73\n", + "Conf=0.95, 1st basemen height: 73.47..74.53, 2nd basemen height: 70.92..71.81\n" + ] + } + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We can see that intervals do not overlap.\r\n", + "\r\n", + "More statistically correct way to prove the hypothesis is to use **Student t-test**:" + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 200, + "source": [ + "from scipy.stats import ttest_ind\r\n", + "\r\n", + "tval, pval = ttest_ind(df.loc[df['Role']=='First_Baseman',['Height']], df.loc[df['Role']=='Second_Baseman',['Height']],equal_var=False)\r\n", + "print(f\"T-value = {tval[0]:.2f}\\nP-value: {pval[0]}\")" + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "T-value = 7.65\n", + "P-value: 9.137321189738925e-12\n" + ] + } + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Two values returned by the `ttest_ind` functions are:\r\n", + "* p-value can be considered as the probability of two distributions having the same mean. In our case, it is very low, meaning that there is strong evidence supporting that first basemen are taller\r\n", + "* t-value is the intermediate value of normalized mean difference that is used in t-test, and it is compared against threshold value for a given confidence value " + ], + "metadata": {} + }, { "cell_type": "markdown", "source": [