diff --git a/Topic01/Basic-Plots.ipynb b/Topic01/Basic-Plots.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..3e795a70a853c88ed09b435e1a6d95ba065ee055 --- /dev/null +++ b/Topic01/Basic-Plots.ipynb @@ -0,0 +1,268 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Import Matplotlib" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Basic Bar Chart" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# prepare categorical data\n", + "x = ['Nuclear', 'Hydro', 'Gas', 'Oil', 'Coal', 'Biofuel']\n", + "# numeric values\n", + "energy_2010 = [7, 5, 16, 21, 23, 9]\n", + "# prepare where to place values on the X axis\n", + "x_pos = list(range(len(x)))\n", + "# plot the bars\n", + "plt.bar(x_pos, energy_2010, color='blue')\n", + "plt.xlabel(\"Energy Source\")\n", + "plt.ylabel(\"Energy Output (GJ)\")\n", + "plt.title(\"Energy output from various fuel sources in 2010\")\n", + "# assign x labels as the categorical data\n", + "plt.xticks(x_pos, x)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Grouped Bar Chart" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x = ['Nuclear', 'Hydro', 'Gas', 'Oil', 'Coal', 'Biofuel']\n", + "# numeric values\n", + "energy_2010 = [7, 5, 16, 21, 23, 9]\n", + "energy_2020 = [7, 5, 13, 26, 23, 6]\n", + "# prepare where to place values on the X axis\n", + "x_pos1 = list(range(len(x)))\n", + "width = 0.35\n", + "x_pos2 = [x+width for x in x_pos1]\n", + " \n", + "plt.bar(x_pos1, energy_2010, width, label='2010')\n", + "plt.bar(x_pos2 , energy_2020, width,\n", + " label='2020')\n", + "\n", + "plt.xlabel(\"Energy Source\")\n", + "plt.ylabel(\"Energy Output (GJ)\")\n", + "plt.title(\"Energy output from various fuel sources\")\n", + "\n", + "x_pos3 = [x+width/2 for x in x_pos1]\n", + "plt.xticks(x_pos3, x)\n", + "plt.legend(loc='best')\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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ZtaopI595DBnzhz23ntvhg4dyrBhw7jooosAWLJkCaNHj2bIkCGMHj2apUuz81oigpNPPpnBgwczfPhwHn300dXrmjRpEkOGDGHIkCFMmjSp5PbaqhqJ/0jWdPNAdnODsen5WGBKFWIws/bo6ORZqccGomvXrpx//vk888wzPPjgg1xyySXMnDmTCRMmMGrUKGbNmsWoUaOYMGECALfddhuzZs1i1qxZXHrppXz5y18Gsi+Ks88+m4ceeohp06Zx9tlnr/6yaI+KJn5JmwCjye5MVDABGC1pVpo2oZIxmJlVW79+/dhll10A6NGjB0OHDmXu3LlMmTKFsWOzdu/YsWO58cbsRmJTpkzh6KOPRhK77747y5YtY/78+dxxxx2MHj2aXr16scUWWzB69Ghuv739t4muaK2eiHgD6N1s3GKys3zMzDq92bNn89hjj7HbbruxYMEC+vXL7vLYr18/Fi7Merrnzp3Ltttuu3qZ/v37M3fu3BbHt1ddFGkzqysbUJdDWb4XR8W99tprHHrooVx44YX07NmzxflK3RdFUovj28slG8zMKmDFihUceuihHHXUURxyyCEA9O3bl/nz5wMwf/58ttoqO5u9f//+zJkzZ/WyTU1NbL311i2Oby8nfjOzDhYRHH/88QwdOpRvfOMbq8cfdNBBq8/MmTRpEmPGjFk9/vLLLyciePDBB9lss83o168f++67L1OnTmXp0qUsXbqUqVOnsu+++7Y7Pnf1mFnnVoMurb/97W9MnjyZnXfemREjRgBw3nnnMX78eA477DAmTpzIgAEDuPba7PKm/fffn1tvvZXBgwezySabcNlllwHQq1cvzjzzTHbddVcAvvvd79KrV692x1cX99wdOXJk+EYsVjc6Yx9/He3TM888w9ChQ2sdSdWV2m9Jj0TEyObzuqvHzKzBOPGbmTUYJ34zswbjxG9m1mCc+M3MGowTv5lZg/F5/GbWqensjj0VNb7X+mmwc+bM4eijj+bFF19ko402Yty4cZxyyiksWbKEww8/nNmzZzNw4ECuueYatthiC5599lmOPfZYHn30Uc4991xOO+201eu6/fbbOeWUU1i1ahUnnHAC48ePb/c+uMVvZtbB2lqWuVevXvz0pz9dK+EDrFq1ipNOOonbbruNmTNncuWVVzJz5sx2x+fEb2bWwdpalnmrrbZi1113pVu3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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x = ['Nuclear', 'Hydro', 'Gas', 'Oil', 'Coal', 'Biofuel']\n", + "# numeric values\n", + "energy_2000 = [7, 5, 16, 21, 23, 9]\n", + "energy_2010 = [7, 5, 16, 21, 23, 9]\n", + "energy_2020 = [7, 5, 13, 26, 23, 6]\n", + "\n", + "# prepare where to place values on the X axis\n", + "x_pos = list(range(len(x)))\n", + "\n", + "# plot the data\n", + "# pay attention to how to configure the bottom parameter\n", + "plt.bar(x_pos, energy_2000, width=0.8, label='2000', color='red', bottom=[sum(x) for x in zip(energy_2010, energy_2020)])\n", + "plt.bar(x_pos, energy_2010, width=0.8, label='2010', color='green', bottom=energy_2020)\n", + "plt.bar(x_pos, energy_2020, width=0.8, label='2020', color='blue')\n", + "\n", + "plt.xticks(x_pos, x)\n", + "plt.xlabel(\"Energy Source\")\n", + "plt.ylabel(\"Energy Output (GJ)\")\n", + "plt.title(\"Energy output from various fuel sources\")\n", + "plt.legend(loc='best')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Histogram Plot" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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kADPPOM7QVw6DLhbD/kOERHq6+S1bdtW69ev1969e9WmTRstXrxYnTt3PqXv+bOf/ew0pYsLIyxAAnAn0sy0KxmoipKBvmNEg/o6NYMGDdLChfU3P6yoqNDw4cMbPtuzZ49Gjhypnj176sorr9Srr74qSdq7d69uvvlmFRcX62//9m+1d+/ehmMKCwv1xz/+UZJ0ww03qEePHvrqV7961HOOcnJy9Mgjj6hbt27q06eP6urqmuNHzSoaFiABzHwniMsHUwarekpmQ/KfZ9TXqbn55pv18ssva9++fVq7dq169+7d8Nnjjz+uq6++WitWrNCSJUt0//33a8+ePXr66ad11llnae3atXrkkUfqn3/VhB/96EeqqqrSypUr9YMf/KDhwYp79uxRnz59tGbNGn3ta1/Ts88+2yw/azbRsAAAPh8mTqzvvo58HXkIZuNtR57m3KnTX7b16FG/razs6H2beKJzU4qLi1VdXa2Kigpdd911R3322muvafLkySopKVH//v21b98+ffjhh/rFL36h73znOw3HFxcXN/m9f/CDHzSMonz00Ud67733JEmtWrVqWCfTo0cPVVdXZ3SqQsQaFgDA58PEiX9pSBpr6kFJTTUjM2fWf52EoUOH6r777tPSpUsbRkHqf2unuXPn6vLLLz/mGDvB0NbSpUv1+uuv69e//rXOOuushoZHks4444yG41u2bKmDBw+eVO6QMMICJECGFxx87rXp0lOvd+npO0Y0qK9TN3LkSD366KMqKio6avuAAQM0bdo0HXkQ8dtvvy1J+trXvqbZs2dLktavX6+1a9ce8z137typc845R2eddZZ+97vf6Te/+U2Wfwq/aFiABJg/33eCuHQcNkF3DpvgO0Y0qK9TV1BQoLFjxx6zffz48Tpw4ICKi4vVtWtXjR8/XpL093//99q9e7eKi4v1z//8z+rV69iHSQwcOFAHDx5UcXGxxo8frz59+mT95/DJXIzPDE8pLS11R65LBz7PhgxJ9j8qhQ8uPK3fb+ucSZonZb1pqZ58fVa/f3OJtb42bNigK664wncMHEdTfz5mVuWcK21qf9awAAmwYIHvBHHZu2mFrvUdIiLUF0LAlBAAAAgeDQsAAAgeU0JAAkS8FM2Lix5YoELfISJCfSEEjLAACXCSt4b43Nq1ulLDV1f6jhEN6gshoGEBEuCuu3wn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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(1, figsize=(9, 7))\n", + "\n", + "x = np.random.normal(loc=3.0,scale=1.0,size=1000)\n", + "\n", + "plt.hist(x) \n", + "plt.axvline(np.mean(x), color='k', linestyle='dashed', label = 'Mean',linewidth=1)\n", + "plt.axvline(np.median(x), color='r', linestyle='dashed', label = 'Median',linewidth=1)\n", + "\n", + "std_dev = np.std(x)\n", + "plt.axvline(np.mean(x)+std_dev, color='b', linestyle='dashed', label = 'Mean +/- STD',linewidth=1)\n", + "plt.axvline(np.mean(x)-std_dev, color='b', linestyle='dashed', linewidth=1)\n", + "\n", + "plt.ylabel('Counts')\n", + "plt.xlabel('Data')\n", + "plt.legend(loc='best')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Boxplot" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# fake up some data\n", + "spread = np.random.rand(50) * 100\n", + "center = np.ones(25) * 50\n", + "flier_high = np.random.rand(10) * 100 + 100\n", + "flier_low = np.random.rand(10) * -100\n", + "data = np.concatenate((spread, center, flier_high, flier_low))\n", + "\n", + "#fig1, ax1 = plt.subplots()\n", + "#ax1.set_title('Basic Plot')\n", + "plt.boxplot(data)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Topic02/Diabetes.csv b/Topic02/Diabetes.csv new file mode 100644 index 0000000000000000000000000000000000000000..d3f1f2eca50e4ab62608f70af61aa79dbe978517 --- /dev/null +++ b/Topic02/Diabetes.csv @@ -0,0 +1,769 @@ +Pregnancies,Glucose,BloodPressure,SkinThickness,Insulin,BMI,DiabetesPedigreeFunction,Age,Outcome +6,148.0,72,35,,33.6,0.627,50.0,1 +1,85.0,66,29,,26.6,0.35100000000000003,31.0,0 +8,183.0,64,0,,23.3,0.672,32.0,1 +1,89.0,66,23,94.0,28.1,0.16699999999999998,21.0,0 +0,137.0,40,35,168.0,43.1,2.2880000000000003,33.0,1 +5,116.0,74,0,,25.6,0.201,30.0,0 +3,78.0,50,32,88.0,31.0,0.248,26.0,1 +10,115.0,0,0,,35.3,0.134,29.0,0 +2,197.0,70,45,543.0,30.5,0.158,53.0,1 +8,125.0,96,0,,,0.23199999999999998,54.0,1 +4,110.0,92,0,,37.6,0.191,30.0,0 +10,168.0,74,0,,38.0,0.537,34.0,1 +10,139.0,80,0,,27.1,1.4409999999999998,57.0,0 +1,189.0,60,23,846.0,30.1,0.39799999999999996,59.0,1 +5,166.0,72,19,175.0,25.8,0.5870000000000001,51.0,1 +7,100.0,0,0,,30.0,0.484,32.0,1 +0,118.0,84,47,230.0,45.8,0.551,31.0,1 +7,107.0,74,0,,29.6,0.254,31.0,1 +1,103.0,30,38,83.0,43.3,0.183,33.0,0 +1,115.0,70,30,96.0,34.6,0.529,32.0,1 +3,126.0,88,41,235.0,39.3,0.7040000000000001,27.0,0 +8,99.0,84,0,,35.4,0.38799999999999996,50.0,0 +7,196.0,90,0,,39.8,0.451,41.0,1 +9,119.0,80,35,,29.0,0.263,29.0,1 +11,143.0,94,33,146.0,36.6,0.254,51.0,1 +10,125.0,70,26,115.0,31.1,0.205,41.0,1 +7,147.0,76,0,,39.4,0.257,43.0,1 +1,97.0,66,15,140.0,23.2,0.48700000000000004,22.0,0 +13,145.0,82,19,110.0,22.2,0.245,57.0,0 +5,117.0,92,0,,34.1,0.337,38.0,0 +5,109.0,75,26,,36.0,0.546,60.0,0 +3,158.0,76,36,245.0,31.6,0.851,28.0,1 +3,88.0,58,11,54.0,24.8,0.267,22.0,0 +6,92.0,92,0,,19.9,0.188,28.0,0 +10,122.0,78,31,,27.6,0.512,45.0,0 +4,103.0,60,33,192.0,24.0,0.966,33.0,0 +11,138.0,76,0,,33.2,0.42,35.0,0 +9,102.0,76,37,,32.9,0.665,46.0,1 +2,90.0,68,42,,38.2,0.503,27.0,1 +4,111.0,72,47,207.0,37.1,1.39,56.0,1 +3,180.0,64,25,70.0,34.0,0.271,26.0,0 +7,133.0,84,0,,40.2,0.696,37.0,0 +7,106.0,92,18,,22.7,0.235,48.0,0 +9,171.0,110,24,240.0,45.4,0.721,54.0,1 +7,159.0,64,0,,27.4,0.294,40.0,0 +0,180.0,66,39,,42.0,1.893,25.0,1 +1,146.0,56,0,,29.7,0.564,29.0,0 +2,71.0,70,27,,28.0,0.586,22.0,0 +7,103.0,66,32,,39.1,0.344,31.0,1 +7,105.0,0,0,,,0.305,24.0,0 +1,103.0,80,11,82.0,19.4,0.491,22.0,0 +1,101.0,50,15,36.0,24.2,0.526,26.0,0 +5,88.0,66,21,23.0,24.4,0.342,30.0,0 +8,176.0,90,34,300.0,33.7,0.467,58.0,1 +7,150.0,66,42,342.0,34.7,0.718,42.0,0 +1,73.0,50,10,,23.0,0.248,21.0,0 +7,187.0,68,39,304.0,37.7,0.254,41.0,1 +0,100.0,88,60,110.0,46.8,0.9620000000000001,31.0,0 +0,146.0,82,0,,40.5,1.781,44.0,0 +0,105.0,64,41,142.0,41.5,0.17300000000000001,22.0,0 +2,84.0,0,0,,,0.304,21.0,0 +8,133.0,72,0,,32.9,0.27,39.0,1 +5,44.0,62,0,,25.0,0.5870000000000001,36.0,0 +2,141.0,58,34,128.0,25.4,0.6990000000000001,24.0,0 +7,114.0,66,0,,32.8,0.258,42.0,1 +5,99.0,74,27,,29.0,0.203,32.0,0 +0,109.0,88,30,,32.5,0.855,38.0,1 +2,109.0,92,0,,42.7,0.845,54.0,0 +1,95.0,66,13,38.0,19.6,0.33399999999999996,25.0,0 +4,146.0,85,27,100.0,28.9,0.18899999999999997,27.0,0 +2,100.0,66,20,90.0,32.9,0.867,28.0,1 +5,139.0,64,35,140.0,28.6,0.41100000000000003,26.0,0 +13,126.0,90,0,,43.4,0.583,42.0,1 +4,129.0,86,20,270.0,35.1,0.231,23.0,0 +1,79.0,75,30,,32.0,0.396,22.0,0 +1,,48,20,,24.7,0.14,22.0,0 +7,62.0,78,0,,32.6,0.391,41.0,0 +5,95.0,72,33,,37.7,0.37,27.0,0 +0,131.0,0,0,,43.2,0.27,26.0,1 +2,112.0,66,22,,25.0,0.307,24.0,0 +3,113.0,44,13,,22.4,0.14,22.0,0 +2,74.0,0,0,,,0.102,22.0,0 +7,83.0,78,26,71.0,29.3,0.767,36.0,0 +0,101.0,65,28,,24.6,0.237,22.0,0 +5,137.0,108,0,,48.8,0.22699999999999998,37.0,1 +2,110.0,74,29,125.0,32.4,0.698,27.0,0 +13,106.0,72,54,,36.6,0.17800000000000002,45.0,0 +2,100.0,68,25,71.0,38.5,0.324,26.0,0 +15,136.0,70,32,110.0,37.1,0.153,43.0,1 +1,107.0,68,19,,26.5,0.165,24.0,0 +1,80.0,55,0,,19.1,0.258,21.0,0 +4,123.0,80,15,176.0,32.0,0.44299999999999995,34.0,0 +7,81.0,78,40,48.0,46.7,0.261,42.0,0 +4,134.0,72,0,,23.8,0.27699999999999997,60.0,1 +2,142.0,82,18,64.0,24.7,0.7609999999999999,21.0,0 +6,144.0,72,27,228.0,33.9,0.255,40.0,0 +2,92.0,62,28,,31.6,0.13,24.0,0 +1,71.0,48,18,76.0,20.4,0.32299999999999995,22.0,0 +6,93.0,50,30,64.0,28.7,0.35600000000000004,23.0,0 +1,122.0,90,51,220.0,49.7,0.325,31.0,1 +1,163.0,72,0,,39.0,1.222,33.0,1 +1,151.0,60,0,,26.1,0.179,22.0,0 +0,125.0,96,0,,22.5,0.262,21.0,0 +1,81.0,72,18,40.0,26.6,0.28300000000000003,24.0,0 +2,85.0,65,0,,39.6,0.93,27.0,0 +1,126.0,56,29,152.0,28.7,0.8009999999999999,21.0,0 +1,96.0,122,0,,22.4,0.207,27.0,0 +4,144.0,58,28,140.0,29.5,0.287,37.0,0 +3,83.0,58,31,18.0,34.3,0.336,25.0,0 +0,95.0,85,25,36.0,37.4,0.247,24.0,1 +3,171.0,72,33,135.0,33.3,0.19899999999999998,24.0,1 +8,155.0,62,26,495.0,34.0,0.5429999999999999,46.0,1 +1,89.0,76,34,37.0,31.2,0.192,23.0,0 +4,76.0,62,0,,34.0,0.391,25.0,0 +7,160.0,54,32,175.0,30.5,0.588,39.0,1 +4,146.0,92,0,,31.2,0.539,61.0,1 +5,124.0,74,0,,34.0,0.22,38.0,1 +5,78.0,48,0,,33.7,0.654,25.0,0 +4,97.0,60,23,,28.2,0.44299999999999995,22.0,0 +4,99.0,76,15,51.0,23.2,0.223,21.0,0 +0,162.0,76,56,100.0,53.2,0.759,25.0,1 +6,111.0,64,39,,34.2,0.26,24.0,0 +2,107.0,74,30,100.0,33.6,0.40399999999999997,23.0,0 +5,132.0,80,0,,26.8,0.18600000000000003,69.0,0 +0,113.0,76,0,,33.3,0.278,23.0,1 +1,88.0,30,42,99.0,55.0,0.496,26.0,1 +3,120.0,70,30,135.0,42.9,0.452,30.0,0 +1,118.0,58,36,94.0,33.3,0.261,23.0,0 +1,117.0,88,24,145.0,34.5,0.40299999999999997,40.0,1 +0,105.0,84,0,,27.9,0.741,62.0,1 +4,173.0,70,14,168.0,29.7,0.361,33.0,1 +9,122.0,56,0,,33.3,1.114,33.0,1 +3,170.0,64,37,225.0,34.5,0.35600000000000004,30.0,1 +8,84.0,74,31,,38.3,0.457,39.0,0 +2,96.0,68,13,49.0,21.1,0.647,26.0,0 +2,125.0,60,20,140.0,33.8,0.08800000000000001,31.0,0 +0,100.0,70,26,50.0,30.8,0.597,21.0,0 +0,93.0,60,25,92.0,28.7,0.532,22.0,0 +0,129.0,80,0,,31.2,0.703,29.0,0 +5,105.0,72,29,325.0,36.9,0.159,28.0,0 +3,128.0,78,0,,21.1,0.268,55.0,0 +5,106.0,82,30,,39.5,0.28600000000000003,38.0,0 +2,108.0,52,26,63.0,32.5,0.318,22.0,0 +10,108.0,66,0,,32.4,0.272,42.0,1 +4,154.0,62,31,284.0,32.8,0.237,23.0,0 +0,102.0,75,23,,,0.5720000000000001,21.0,0 +9,57.0,80,37,,32.8,0.096,41.0,0 +2,106.0,64,35,119.0,30.5,1.4,34.0,0 +5,147.0,78,0,,33.7,0.218,65.0,0 +2,90.0,70,17,,27.3,0.085,22.0,0 +1,136.0,74,50,204.0,37.4,0.39899999999999997,24.0,0 +4,114.0,65,0,,21.9,0.43200000000000005,37.0,0 +9,156.0,86,28,155.0,34.3,1.189,42.0,1 +1,153.0,82,42,485.0,40.6,0.687,23.0,0 +8,188.0,78,0,,47.9,0.13699999999999998,43.0,1 +7,152.0,88,44,,50.0,0.337,36.0,1 +2,99.0,52,15,94.0,24.6,0.637,21.0,0 +1,109.0,56,21,135.0,25.2,0.833,23.0,0 +2,88.0,74,19,53.0,29.0,0.22899999999999998,22.0,0 +17,163.0,72,41,114.0,40.9,0.8170000000000001,47.0,1 +4,151.0,90,38,,29.7,0.294,36.0,0 +7,102.0,74,40,105.0,37.2,0.204,45.0,0 +0,114.0,80,34,285.0,44.2,0.16699999999999998,27.0,0 +2,100.0,64,23,,29.7,0.368,21.0,0 +0,131.0,88,0,,31.6,0.743,32.0,1 +6,104.0,74,18,156.0,29.9,0.722,41.0,1 +3,148.0,66,25,,32.5,0.256,22.0,0 +4,120.0,68,0,,29.6,0.7090000000000001,34.0,0 +4,110.0,66,0,,31.9,0.47100000000000003,29.0,0 +3,111.0,90,12,78.0,28.4,0.495,29.0,0 +6,102.0,82,0,,30.8,0.18,36.0,1 +6,134.0,70,23,130.0,35.4,0.542,29.0,1 +2,87.0,0,23,,28.9,0.773,25.0,0 +1,79.0,60,42,48.0,43.5,0.6779999999999999,23.0,0 +2,75.0,64,24,55.0,29.7,0.37,33.0,0 +8,179.0,72,42,130.0,32.7,0.7190000000000001,36.0,1 +6,85.0,78,0,,31.2,0.382,42.0,0 +0,129.0,110,46,130.0,67.1,0.319,26.0,1 +5,143.0,78,0,,45.0,0.19,47.0,0 +5,130.0,82,0,,39.1,0.956,37.0,1 +6,87.0,80,0,,23.2,0.084,32.0,0 +0,119.0,64,18,92.0,34.9,0.725,23.0,0 +1,,74,20,23.0,27.7,0.299,21.0,0 +5,73.0,60,0,,26.8,0.268,27.0,0 +4,141.0,74,0,,27.6,0.244,40.0,0 +7,194.0,68,28,,35.9,0.745,41.0,1 +8,181.0,68,36,495.0,30.1,0.615,60.0,1 +1,128.0,98,41,58.0,32.0,1.321,33.0,1 +8,109.0,76,39,114.0,27.9,0.64,31.0,1 +5,139.0,80,35,160.0,31.6,0.361,25.0,1 +3,111.0,62,0,,22.6,0.142,21.0,0 +9,123.0,70,44,94.0,33.1,0.374,40.0,0 +7,159.0,66,0,,30.4,0.38299999999999995,36.0,1 +11,135.0,0,0,,52.3,0.578,40.0,1 +8,85.0,55,20,,24.4,0.136,42.0,0 +5,158.0,84,41,210.0,39.4,0.395,29.0,1 +1,105.0,58,0,,24.3,0.187,21.0,0 +3,107.0,62,13,48.0,22.9,0.6779999999999999,23.0,1 +4,109.0,64,44,99.0,34.8,0.905,26.0,1 +4,148.0,60,27,318.0,30.9,0.15,29.0,1 +0,113.0,80,16,,31.0,0.8740000000000001,21.0,0 +1,138.0,82,0,,40.1,0.23600000000000002,28.0,0 +0,108.0,68,20,,27.3,0.787,32.0,0 +2,99.0,70,16,44.0,20.4,0.235,27.0,0 +6,103.0,72,32,190.0,37.7,0.324,55.0,0 +5,111.0,72,28,,23.9,0.40700000000000003,27.0,0 +8,196.0,76,29,280.0,37.5,0.605,57.0,1 +5,162.0,104,0,,37.7,0.151,52.0,1 +1,96.0,64,27,87.0,33.2,0.289,21.0,0 +7,184.0,84,33,,35.5,0.355,41.0,1 +2,81.0,60,22,,27.7,0.29,25.0,0 +0,147.0,85,54,,42.8,0.375,24.0,0 +7,179.0,95,31,,34.2,0.16399999999999998,60.0,0 +0,140.0,65,26,130.0,42.6,0.431,24.0,1 +9,112.0,82,32,175.0,34.2,0.26,36.0,1 +12,151.0,70,40,271.0,41.8,0.742,38.0,1 +5,109.0,62,41,129.0,35.8,0.514,25.0,1 +6,125.0,68,30,120.0,30.0,0.46399999999999997,32.0,0 +5,85.0,74,22,,29.0,1.224,32.0,1 +5,112.0,66,0,,37.8,0.261,41.0,1 +0,177.0,60,29,478.0,34.6,1.072,21.0,1 +2,158.0,90,0,,31.6,0.805,66.0,1 +7,119.0,0,0,,25.2,0.209,37.0,0 +7,142.0,60,33,190.0,28.8,0.687,61.0,0 +1,100.0,66,15,56.0,23.6,0.6659999999999999,26.0,0 +1,87.0,78,27,32.0,34.6,0.10099999999999999,22.0,0 +0,101.0,76,0,,35.7,0.198,26.0,0 +3,162.0,52,38,,37.2,0.652,24.0,1 +4,197.0,70,39,744.0,36.7,2.329,31.0,0 +0,117.0,80,31,53.0,45.2,0.08900000000000001,24.0,0 +4,142.0,86,0,,44.0,0.645,22.0,1 +6,134.0,80,37,370.0,46.2,0.23800000000000002,46.0,1 +1,79.0,80,25,37.0,25.4,0.583,22.0,0 +4,122.0,68,0,,35.0,0.39399999999999996,29.0,0 +3,74.0,68,28,45.0,29.7,0.293,23.0,0 +4,171.0,72,0,,43.6,0.479,26.0,1 +7,181.0,84,21,192.0,35.9,0.586,51.0,1 +0,179.0,90,27,,44.1,0.6859999999999999,23.0,1 +9,164.0,84,21,,30.8,0.831,32.0,1 +0,104.0,76,0,,18.4,0.5820000000000001,27.0,0 +1,91.0,64,24,,29.2,0.192,21.0,0 +4,91.0,70,32,88.0,33.1,0.446,22.0,0 +3,139.0,54,0,,25.6,0.402,22.0,1 +6,119.0,50,22,176.0,27.1,1.318,33.0,1 +2,146.0,76,35,194.0,38.2,0.32899999999999996,29.0,0 +9,184.0,85,15,,30.0,1.213,49.0,1 +10,122.0,68,0,,31.2,0.258,41.0,0 +0,165.0,90,33,680.0,52.3,0.42700000000000005,23.0,0 +9,124.0,70,33,402.0,35.4,0.282,34.0,0 +1,111.0,86,19,,30.1,0.14300000000000002,23.0,0 +9,106.0,52,0,,31.2,0.38,42.0,0 +2,129.0,84,0,,28.0,0.284,27.0,0 +2,90.0,80,14,55.0,24.4,0.249,24.0,0 +0,86.0,68,32,,35.8,0.23800000000000002,25.0,0 +12,92.0,62,7,258.0,27.6,0.9259999999999999,44.0,1 +1,113.0,64,35,,33.6,0.5429999999999999,21.0,1 +3,111.0,56,39,,30.1,0.557,30.0,0 +2,114.0,68,22,,28.7,0.092,25.0,0 +1,193.0,50,16,375.0,25.9,0.655,24.0,0 +11,155.0,76,28,150.0,33.3,1.3530000000000002,51.0,1 +3,191.0,68,15,130.0,30.9,0.299,34.0,0 +3,141.0,0,0,,30.0,0.7609999999999999,27.0,1 +4,95.0,70,32,,32.1,0.612,24.0,0 +3,142.0,80,15,,32.4,0.2,63.0,0 +4,123.0,62,0,,32.0,0.226,35.0,1 +5,96.0,74,18,67.0,33.6,0.997,43.0,0 +0,138.0,0,0,,36.3,0.9329999999999999,25.0,1 +2,128.0,64,42,,40.0,1.101,24.0,0 +0,102.0,52,0,,25.1,0.078,21.0,0 +2,146.0,0,0,,27.5,0.24,28.0,1 +10,101.0,86,37,,45.6,1.136,38.0,1 +2,108.0,62,32,56.0,25.2,0.128,21.0,0 +3,122.0,78,0,,23.0,0.254,40.0,0 +1,71.0,78,50,45.0,33.2,0.42200000000000004,21.0,0 +13,106.0,70,0,,34.2,0.251,52.0,0 +2,100.0,70,52,57.0,40.5,0.677,25.0,0 +7,106.0,60,24,,26.5,0.29600000000000004,29.0,1 +0,104.0,64,23,116.0,27.8,0.45399999999999996,23.0,0 +5,114.0,74,0,,24.9,0.7440000000000001,57.0,0 +2,108.0,62,10,278.0,25.3,0.8809999999999999,22.0,0 +0,146.0,70,0,,37.9,0.33399999999999996,28.0,1 +10,129.0,76,28,122.0,35.9,0.28,39.0,0 +7,133.0,88,15,155.0,32.4,0.262,37.0,0 +7,161.0,86,0,,30.4,0.165,47.0,1 +2,108.0,80,0,,27.0,0.259,52.0,1 +7,136.0,74,26,135.0,26.0,0.647,51.0,0 +5,155.0,84,44,545.0,38.7,0.619,34.0,0 +1,119.0,86,39,220.0,45.6,0.8079999999999999,29.0,1 +4,96.0,56,17,49.0,20.8,0.34,26.0,0 +5,108.0,72,43,75.0,36.1,0.263,33.0,0 +0,78.0,88,29,40.0,36.9,0.434,21.0,0 +0,107.0,62,30,74.0,36.6,0.757,25.0,1 +2,128.0,78,37,182.0,43.3,1.224,31.0,1 +1,128.0,48,45,194.0,40.5,0.613,24.0,1 +0,161.0,50,0,,21.9,0.254,65.0,0 +6,151.0,62,31,120.0,35.5,0.6920000000000001,28.0,0 +2,146.0,70,38,360.0,28.0,0.337,29.0,1 +0,126.0,84,29,215.0,30.7,0.52,24.0,0 +14,100.0,78,25,184.0,36.6,0.41200000000000003,46.0,1 +8,112.0,72,0,,23.6,0.84,58.0,0 +0,167.0,0,0,,32.3,0.8390000000000001,30.0,1 +2,144.0,58,33,135.0,31.6,0.42200000000000004,25.0,1 +5,77.0,82,41,42.0,35.8,0.156,35.0,0 +5,115.0,98,0,,52.9,0.209,28.0,1 +3,150.0,76,0,,21.0,0.207,37.0,0 +2,120.0,76,37,105.0,39.7,0.215,29.0,0 +10,161.0,68,23,132.0,25.5,0.326,47.0,1 +0,137.0,68,14,148.0,24.8,0.14300000000000002,21.0,0 +0,128.0,68,19,180.0,30.5,1.391,25.0,1 +2,124.0,68,28,205.0,32.9,0.875,30.0,1 +6,80.0,66,30,,26.2,0.313,41.0,0 +0,106.0,70,37,148.0,39.4,0.605,22.0,0 +2,155.0,74,17,96.0,26.6,0.433,27.0,1 +3,113.0,50,10,85.0,29.5,0.626,25.0,0 +7,109.0,80,31,,35.9,1.127,43.0,1 +2,112.0,68,22,94.0,34.1,0.315,26.0,0 +3,99.0,80,11,64.0,19.3,0.284,30.0,0 +3,182.0,74,0,,30.5,0.345,29.0,1 +3,115.0,66,39,140.0,38.1,0.15,28.0,0 +6,194.0,78,0,,23.5,0.129,59.0,1 +4,129.0,60,12,231.0,27.5,0.527,31.0,0 +3,112.0,74,30,,31.6,0.19699999999999998,25.0,1 +0,124.0,70,20,,27.4,0.254,36.0,1 +13,152.0,90,33,29.0,26.8,0.731,43.0,1 +2,112.0,75,32,,35.7,0.14800000000000002,21.0,0 +1,157.0,72,21,168.0,25.6,0.12300000000000001,24.0,0 +1,122.0,64,32,156.0,35.1,0.6920000000000001,30.0,1 +10,179.0,70,0,,35.1,0.2,37.0,0 +2,102.0,86,36,120.0,45.5,0.127,23.0,1 +6,105.0,70,32,68.0,30.8,0.122,37.0,0 +8,118.0,72,19,,23.1,1.476,46.0,0 +2,87.0,58,16,52.0,32.7,0.166,25.0,0 +1,180.0,0,0,,43.3,0.282,41.0,1 +12,106.0,80,0,,23.6,0.13699999999999998,44.0,0 +1,95.0,60,18,58.0,23.9,0.26,22.0,0 +0,165.0,76,43,255.0,47.9,0.259,26.0,0 +0,117.0,0,0,,33.8,0.932,44.0,0 +5,115.0,76,0,,31.2,0.34299999999999997,44.0,1 +9,152.0,78,34,171.0,34.2,0.893,33.0,1 +7,178.0,84,0,,39.9,0.331,41.0,1 +1,130.0,70,13,105.0,25.9,0.47200000000000003,22.0,0 +1,95.0,74,21,73.0,25.9,0.6729999999999999,36.0,0 +1,,68,35,,32.0,0.389,22.0,0 +5,122.0,86,0,,34.7,0.29,33.0,0 +8,95.0,72,0,,36.8,0.485,57.0,0 +8,126.0,88,36,108.0,38.5,0.349,49.0,0 +1,139.0,46,19,83.0,28.7,0.654,22.0,0 +3,116.0,0,0,,23.5,0.187,23.0,0 +3,99.0,62,19,74.0,21.8,0.27899999999999997,26.0,0 +5,,80,32,,41.0,0.34600000000000003,37.0,1 +4,92.0,80,0,,42.2,0.237,29.0,0 +4,137.0,84,0,,31.2,0.252,30.0,0 +3,61.0,82,28,,34.4,0.243,46.0,0 +1,90.0,62,12,43.0,27.2,0.58,24.0,0 +3,90.0,78,0,,42.7,0.5589999999999999,21.0,0 +9,165.0,88,0,,30.4,0.302,49.0,1 +1,125.0,50,40,167.0,33.3,0.9620000000000001,28.0,1 +13,129.0,0,30,,39.9,0.569,44.0,1 +12,88.0,74,40,54.0,35.3,0.37799999999999995,48.0,0 +1,196.0,76,36,249.0,36.5,0.875,29.0,1 +5,189.0,64,33,325.0,31.2,0.583,29.0,1 +5,158.0,70,0,,29.8,0.207,63.0,0 +5,103.0,108,37,,39.2,0.305,65.0,0 +4,146.0,78,0,,38.5,0.52,67.0,1 +4,147.0,74,25,293.0,34.9,0.385,30.0,0 +5,99.0,54,28,83.0,34.0,0.499,30.0,0 +6,124.0,72,0,,27.6,0.368,29.0,1 +0,101.0,64,17,,21.0,0.252,21.0,0 +3,81.0,86,16,66.0,27.5,0.306,22.0,0 +1,133.0,102,28,140.0,32.8,0.23399999999999999,45.0,1 +3,173.0,82,48,465.0,38.4,2.137,25.0,1 +0,118.0,64,23,89.0,,1.7309999999999999,21.0,0 +0,84.0,64,22,66.0,35.8,0.545,21.0,0 +2,105.0,58,40,94.0,34.9,0.225,25.0,0 +2,122.0,52,43,158.0,36.2,0.816,28.0,0 +12,140.0,82,43,325.0,39.2,0.528,58.0,1 +0,98.0,82,15,84.0,25.2,0.299,22.0,0 +1,87.0,60,37,75.0,37.2,0.509,22.0,0 +4,156.0,75,0,,48.3,0.23800000000000002,32.0,1 +0,93.0,100,39,72.0,43.4,1.021,35.0,0 +1,107.0,72,30,82.0,30.8,0.821,24.0,0 +0,105.0,68,22,,20.0,0.23600000000000002,22.0,0 +1,109.0,60,8,182.0,25.4,0.9470000000000001,21.0,0 +1,90.0,62,18,59.0,25.1,1.268,25.0,0 +1,125.0,70,24,110.0,24.3,0.221,25.0,0 +1,119.0,54,13,50.0,22.3,0.205,24.0,0 +5,116.0,74,29,,32.3,0.66,35.0,1 +8,105.0,100,36,,43.3,0.239,45.0,1 +5,144.0,82,26,285.0,32.0,0.452,58.0,1 +3,100.0,68,23,81.0,31.6,0.9490000000000001,28.0,0 +1,100.0,66,29,196.0,32.0,0.444,42.0,0 +5,166.0,76,0,,45.7,0.34,27.0,1 +1,131.0,64,14,415.0,23.7,0.389,21.0,0 +4,116.0,72,12,87.0,22.1,0.46299999999999997,37.0,0 +4,158.0,78,0,,32.9,0.8029999999999999,31.0,1 +2,127.0,58,24,275.0,27.7,1.6,25.0,0 +3,96.0,56,34,115.0,24.7,0.9440000000000001,39.0,0 +0,131.0,66,40,,34.3,0.196,22.0,1 +3,82.0,70,0,,21.1,0.389,25.0,0 +3,193.0,70,31,,34.9,0.24100000000000002,25.0,1 +4,95.0,64,0,,32.0,0.161,31.0,1 +6,137.0,61,0,,24.2,0.151,55.0,0 +5,136.0,84,41,88.0,35.0,0.28600000000000003,35.0,1 +9,72.0,78,25,,31.6,0.28,38.0,0 +5,168.0,64,0,,32.9,0.135,41.0,1 +2,123.0,48,32,165.0,42.1,0.52,26.0,0 +4,115.0,72,0,,28.9,0.376,46.0,1 +0,101.0,62,0,,21.9,0.336,25.0,0 +8,197.0,74,0,,25.9,1.1909999999999998,39.0,1 +1,172.0,68,49,579.0,42.4,0.7020000000000001,28.0,1 +6,102.0,90,39,,35.7,0.674,28.0,0 +1,112.0,72,30,176.0,34.4,0.528,25.0,0 +1,143.0,84,23,310.0,42.4,1.0759999999999998,22.0,0 +1,143.0,74,22,61.0,26.2,0.256,21.0,0 +0,138.0,60,35,167.0,34.6,0.534,21.0,1 +3,173.0,84,33,474.0,35.7,0.258,22.0,1 +1,97.0,68,21,,27.2,1.095,22.0,0 +4,144.0,82,32,,38.5,0.5539999999999999,37.0,1 +1,83.0,68,0,,18.2,0.624,27.0,0 +3,129.0,64,29,115.0,26.4,0.21899999999999997,28.0,1 +1,119.0,88,41,170.0,45.3,0.507,26.0,0 +2,94.0,68,18,76.0,26.0,0.561,21.0,0 +0,102.0,64,46,78.0,40.6,0.496,21.0,0 +2,115.0,64,22,,30.8,0.42100000000000004,21.0,0 +8,151.0,78,32,210.0,42.9,0.516,36.0,1 +4,184.0,78,39,277.0,37.0,0.264,31.0,1 +0,94.0,0,0,,,0.256,25.0,0 +1,181.0,64,30,180.0,34.1,0.32799999999999996,38.0,1 +0,135.0,94,46,145.0,40.6,0.284,26.0,0 +1,95.0,82,25,180.0,35.0,0.233,43.0,1 +2,99.0,0,0,,22.2,0.10800000000000001,23.0,0 +3,89.0,74,16,85.0,30.4,0.551,38.0,0 +1,80.0,74,11,60.0,30.0,0.527,22.0,0 +2,139.0,75,0,,25.6,0.16699999999999998,29.0,0 +1,90.0,68,8,,24.5,1.138,36.0,0 +0,141.0,0,0,,42.4,0.205,29.0,1 +12,140.0,85,33,,37.4,0.244,41.0,0 +5,147.0,75,0,,29.9,0.434,28.0,0 +1,97.0,70,15,,18.2,0.147,21.0,0 +6,107.0,88,0,,36.8,0.727,31.0,0 +0,189.0,104,25,,34.3,0.435,41.0,1 +2,83.0,66,23,50.0,32.2,0.49700000000000005,22.0,0 +4,117.0,64,27,120.0,33.2,0.23,24.0,0 +8,108.0,70,0,,30.5,0.955,33.0,1 +4,117.0,62,12,,29.7,0.38,30.0,1 +0,180.0,78,63,14.0,59.4,2.42,25.0,1 +1,100.0,72,12,70.0,25.3,0.6579999999999999,28.0,0 +0,95.0,80,45,92.0,36.5,0.33,26.0,0 +0,104.0,64,37,64.0,33.6,0.51,22.0,1 +0,120.0,74,18,63.0,30.5,0.285,26.0,0 +1,82.0,64,13,95.0,21.2,0.415,23.0,0 +2,134.0,70,0,,28.9,0.542,23.0,1 +0,91.0,68,32,210.0,39.9,0.381,25.0,0 +2,119.0,0,0,,19.6,0.8320000000000001,72.0,0 +2,100.0,54,28,105.0,37.8,0.498,24.0,0 +14,175.0,62,30,,33.6,0.212,38.0,1 +1,135.0,54,0,,26.7,0.687,62.0,0 +5,86.0,68,28,71.0,30.2,0.364,24.0,0 +10,148.0,84,48,237.0,37.6,1.001,51.0,1 +9,134.0,74,33,60.0,25.9,0.46,81.0,0 +9,120.0,72,22,56.0,20.8,0.733,48.0,0 +1,71.0,62,0,,21.8,0.41600000000000004,26.0,0 +8,74.0,70,40,49.0,35.3,0.705,39.0,0 +5,88.0,78,30,,27.6,0.258,37.0,0 +10,115.0,98,0,,24.0,1.022,34.0,0 +0,124.0,56,13,105.0,21.8,0.452,21.0,0 +0,74.0,52,10,36.0,27.8,0.26899999999999996,22.0,0 +0,97.0,64,36,100.0,36.8,0.6,25.0,0 +8,120.0,0,0,,30.0,0.183,38.0,1 +6,154.0,78,41,140.0,46.1,0.5710000000000001,27.0,0 +1,144.0,82,40,,41.3,0.607,28.0,0 +0,137.0,70,38,,33.2,0.17,22.0,0 +0,119.0,66,27,,38.8,0.259,22.0,0 +7,136.0,90,0,,29.9,0.21,50.0,0 +4,114.0,64,0,,28.9,0.126,24.0,0 +0,137.0,84,27,,27.3,0.231,59.0,0 +2,105.0,80,45,191.0,33.7,0.711,29.0,1 +7,114.0,76,17,110.0,23.8,0.466,31.0,0 +8,126.0,74,38,75.0,25.9,0.162,39.0,0 +4,132.0,86,31,,28.0,0.419,63.0,0 +3,158.0,70,30,328.0,35.5,0.344,35.0,1 +0,123.0,88,37,,35.2,0.19699999999999998,29.0,0 +4,85.0,58,22,49.0,27.8,0.306,28.0,0 +0,84.0,82,31,125.0,38.2,0.233,23.0,0 +0,145.0,0,0,,44.2,0.63,31.0,1 +0,135.0,68,42,250.0,42.3,0.365,24.0,1 +1,139.0,62,41,480.0,40.7,0.536,21.0,0 +0,173.0,78,32,265.0,46.5,1.159,58.0,0 +4,99.0,72,17,,25.6,0.294,28.0,0 +8,194.0,80,0,,26.1,0.551,67.0,0 +2,83.0,65,28,66.0,36.8,0.629,24.0,0 +2,89.0,90,30,,33.5,0.292,42.0,0 +4,99.0,68,38,,32.8,0.145,33.0,0 +4,125.0,70,18,122.0,28.9,1.1440000000000001,45.0,1 +3,80.0,0,0,,,0.174,22.0,0 +6,166.0,74,0,,26.6,0.304,66.0,0 +5,110.0,68,0,,26.0,0.292,30.0,0 +2,81.0,72,15,76.0,30.1,0.547,25.0,0 +7,195.0,70,33,145.0,25.1,0.163,55.0,1 +6,154.0,74,32,193.0,29.3,0.8390000000000001,39.0,0 +2,117.0,90,19,71.0,25.2,0.313,21.0,0 +3,84.0,72,32,,37.2,0.267,28.0,0 +6,,68,41,,39.0,0.727,41.0,1 +7,94.0,64,25,79.0,33.3,0.738,41.0,0 +3,96.0,78,39,,37.3,0.23800000000000002,40.0,0 +10,75.0,82,0,,33.3,0.263,38.0,0 +0,180.0,90,26,90.0,36.5,0.314,35.0,1 +1,130.0,60,23,170.0,28.6,0.6920000000000001,21.0,0 +2,84.0,50,23,76.0,30.4,0.968,21.0,0 +8,120.0,78,0,,25.0,0.409,64.0,0 +12,84.0,72,31,,29.7,0.297,46.0,1 +0,139.0,62,17,210.0,22.1,0.207,21.0,0 +9,91.0,68,0,,24.2,0.2,58.0,0 +2,91.0,62,0,,27.3,0.525,22.0,0 +3,99.0,54,19,86.0,25.6,0.154,24.0,0 +3,163.0,70,18,105.0,31.6,0.268,28.0,1 +9,145.0,88,34,165.0,30.3,0.7709999999999999,53.0,1 +7,125.0,86,0,,37.6,0.304,51.0,0 +13,76.0,60,0,,32.8,0.18,41.0,0 +6,129.0,90,7,326.0,19.6,0.5820000000000001,60.0,0 +2,68.0,70,32,66.0,25.0,0.187,25.0,0 +3,124.0,80,33,130.0,33.2,0.305,26.0,0 +6,114.0,0,0,,,0.18899999999999997,26.0,0 +9,130.0,70,0,,34.2,0.652,45.0,1 +3,125.0,58,0,,31.6,0.151,24.0,0 +3,87.0,60,18,,21.8,0.444,21.0,0 +1,97.0,64,19,82.0,18.2,0.299,21.0,0 +3,116.0,74,15,105.0,26.3,0.107,24.0,0 +0,117.0,66,31,188.0,30.8,0.493,22.0,0 +0,111.0,65,0,,24.6,0.66,31.0,0 +2,122.0,60,18,106.0,29.8,0.7170000000000001,22.0,0 +0,107.0,76,0,,45.3,0.6859999999999999,24.0,0 +1,86.0,66,52,65.0,41.3,0.917,29.0,0 +6,91.0,0,0,,29.8,0.501,31.0,0 +1,77.0,56,30,56.0,33.3,1.251,24.0,0 +4,132.0,0,0,,32.9,0.302,23.0,1 +0,105.0,90,0,,29.6,0.19699999999999998,46.0,0 +0,57.0,60,0,,21.7,0.735,67.0,0 +0,127.0,80,37,210.0,36.3,0.804,23.0,0 +3,129.0,92,49,155.0,36.4,0.968,32.0,1 +8,100.0,74,40,215.0,39.4,0.6609999999999999,43.0,1 +3,128.0,72,25,190.0,32.4,0.5489999999999999,27.0,1 +10,90.0,85,32,,34.9,0.825,56.0,1 +4,84.0,90,23,56.0,39.5,0.159,25.0,0 +1,88.0,78,29,76.0,32.0,0.365,29.0,0 +8,186.0,90,35,225.0,34.5,0.423,37.0,1 +5,187.0,76,27,207.0,43.6,1.034,53.0,1 +4,131.0,68,21,166.0,33.1,0.16,28.0,0 +1,164.0,82,43,67.0,32.8,0.341,50.0,0 +4,189.0,110,31,,28.5,0.68,37.0,0 +1,116.0,70,28,,27.4,0.204,21.0,0 +3,84.0,68,30,106.0,31.9,0.591,25.0,0 +6,114.0,88,0,,27.8,0.247,66.0,0 +1,88.0,62,24,44.0,29.9,0.42200000000000004,23.0,0 +1,84.0,64,23,115.0,36.9,0.47100000000000003,28.0,0 +7,124.0,70,33,215.0,25.5,0.161,37.0,0 +1,97.0,70,40,,38.1,0.218,30.0,0 +8,110.0,76,0,,27.8,0.237,58.0,0 +11,103.0,68,40,,46.2,0.126,42.0,0 +11,85.0,74,0,,30.1,0.3,35.0,0 +6,125.0,76,0,,33.8,0.121,54.0,1 +0,198.0,66,32,274.0,41.3,0.502,28.0,1 +1,87.0,68,34,77.0,37.6,0.401,24.0,0 +6,99.0,60,19,54.0,26.9,0.49700000000000005,32.0,0 +0,91.0,80,0,,32.4,0.601,27.0,0 +2,95.0,54,14,88.0,26.1,0.748,22.0,0 +1,99.0,72,30,18.0,38.6,0.41200000000000003,21.0,0 +6,92.0,62,32,126.0,32.0,0.085,46.0,0 +4,154.0,72,29,126.0,31.3,0.33799999999999997,37.0,0 +0,121.0,66,30,165.0,34.3,0.203,33.0,1 +3,78.0,70,0,,32.5,0.27,39.0,0 +2,130.0,96,0,,22.6,0.268,21.0,0 +3,111.0,58,31,44.0,29.5,0.43,22.0,0 +2,98.0,60,17,120.0,34.7,0.198,22.0,0 +1,143.0,86,30,330.0,30.1,0.892,23.0,0 +1,119.0,44,47,63.0,35.5,0.28,25.0,0 +6,108.0,44,20,130.0,24.0,0.813,35.0,0 +2,118.0,80,0,,42.9,0.693,21.0,1 +10,133.0,68,0,,27.0,0.245,36.0,0 +2,197.0,70,99,,34.7,0.575,62.0,1 +0,151.0,90,46,,42.1,0.371,21.0,1 +6,109.0,60,27,,25.0,0.20600000000000002,27.0,0 +12,121.0,78,17,,26.5,0.259,62.0,0 +8,100.0,76,0,,38.7,0.19,42.0,0 +8,124.0,76,24,600.0,28.7,0.687,52.0,1 +1,93.0,56,11,,22.5,0.41700000000000004,22.0,0 +8,143.0,66,0,,34.9,0.129,41.0,1 +6,103.0,66,0,,24.3,0.249,29.0,0 +3,176.0,86,27,156.0,33.3,1.1540000000000001,52.0,1 +0,73.0,0,0,,21.1,0.342,25.0,0 +11,111.0,84,40,,46.8,0.925,45.0,1 +2,112.0,78,50,140.0,39.4,0.175,24.0,0 +3,132.0,80,0,,34.4,0.402,44.0,1 +2,82.0,52,22,115.0,28.5,1.699,25.0,0 +6,123.0,72,45,230.0,33.6,0.733,34.0,0 +0,188.0,82,14,185.0,32.0,0.682,22.0,1 +0,67.0,76,0,,45.3,0.19399999999999998,46.0,0 +1,89.0,24,19,25.0,27.8,0.5589999999999999,21.0,0 +1,173.0,74,0,,36.8,0.08800000000000001,38.0,1 +1,109.0,38,18,120.0,23.1,0.40700000000000003,26.0,0 +1,108.0,88,19,,27.1,0.4,24.0,0 +6,96.0,0,0,,23.7,0.19,28.0,0 +1,124.0,74,36,,27.8,0.1,30.0,0 +7,150.0,78,29,126.0,35.2,0.6920000000000001,54.0,1 +4,183.0,0,0,,28.4,0.212,36.0,1 +1,124.0,60,32,,35.8,0.514,21.0,0 +1,181.0,78,42,293.0,40.0,1.258,22.0,1 +1,92.0,62,25,41.0,19.5,0.48200000000000004,25.0,0 +0,152.0,82,39,272.0,41.5,0.27,27.0,0 +1,111.0,62,13,182.0,24.0,0.138,23.0,0 +3,106.0,54,21,158.0,30.9,0.292,24.0,0 +3,174.0,58,22,194.0,32.9,0.593,36.0,1 +7,168.0,88,42,321.0,38.2,0.787,40.0,1 +6,105.0,80,28,,32.5,0.878,26.0,0 +11,138.0,74,26,144.0,36.1,0.557,50.0,1 +3,106.0,72,0,,25.8,0.207,27.0,0 +6,117.0,96,0,,28.7,0.157,30.0,0 +2,68.0,62,13,15.0,20.1,0.257,23.0,0 +9,112.0,82,24,,28.2,1.2819999999999998,50.0,1 +0,119.0,0,0,,32.4,0.141,24.0,1 +2,112.0,86,42,160.0,38.4,0.24600000000000002,28.0,0 +2,92.0,76,20,,24.2,1.6980000000000002,28.0,0 +6,183.0,94,0,,40.8,1.4609999999999999,45.0,0 +0,94.0,70,27,115.0,43.5,0.34700000000000003,21.0,0 +2,108.0,64,0,,30.8,0.158,21.0,0 +4,90.0,88,47,54.0,37.7,0.36200000000000004,29.0,0 +0,125.0,68,0,,24.7,0.20600000000000002,21.0,0 +0,132.0,78,0,,32.4,0.39299999999999996,21.0,0 +5,128.0,80,0,,34.6,0.14400000000000002,45.0,0 +4,94.0,65,22,,24.7,0.14800000000000002,21.0,0 +7,114.0,64,0,,27.4,0.732,34.0,1 +0,102.0,78,40,90.0,34.5,0.23800000000000002,24.0,0 +2,111.0,60,0,,26.2,0.34299999999999997,23.0,0 +1,128.0,82,17,183.0,27.5,0.115,22.0,0 +10,92.0,62,0,,25.9,0.16699999999999998,31.0,0 +13,104.0,72,0,,31.2,0.465,38.0,1 +5,104.0,74,0,,28.8,0.153,48.0,0 +2,94.0,76,18,66.0,31.6,0.649,23.0,0 +7,97.0,76,32,91.0,40.9,0.871,32.0,1 +1,100.0,74,12,46.0,19.5,0.149,28.0,0 +0,102.0,86,17,105.0,29.3,0.695,27.0,0 +4,128.0,70,0,,34.3,0.303,24.0,0 +6,147.0,80,0,,29.5,0.17800000000000002,50.0,1 +4,90.0,0,0,,28.0,0.61,31.0,0 +3,103.0,72,30,152.0,27.6,0.73,27.0,0 +2,157.0,74,35,440.0,39.4,0.134,30.0,0 +1,167.0,74,17,144.0,23.4,0.447,33.0,1 +0,179.0,50,36,159.0,37.8,0.455,22.0,1 +11,136.0,84,35,130.0,28.3,0.26,42.0,1 +0,107.0,60,25,,26.4,0.133,23.0,0 +1,91.0,54,25,100.0,25.2,0.23399999999999999,23.0,0 +1,117.0,60,23,106.0,33.8,0.466,27.0,0 +5,123.0,74,40,77.0,34.1,0.26899999999999996,28.0,0 +2,120.0,54,0,,26.8,0.455,27.0,0 +1,106.0,70,28,135.0,34.2,0.142,22.0,0 +2,155.0,52,27,540.0,38.7,0.24,25.0,1 +2,101.0,58,35,90.0,21.8,0.155,22.0,0 +1,120.0,80,48,200.0,38.9,1.162,41.0,0 +11,127.0,106,0,,39.0,0.19,51.0,0 +3,80.0,82,31,70.0,34.2,1.2919999999999998,27.0,1 +10,162.0,84,0,,27.7,0.182,54.0,0 +1,199.0,76,43,,42.9,1.3940000000000001,22.0,1 +8,167.0,106,46,231.0,37.6,0.165,43.0,1 +9,145.0,80,46,130.0,37.9,0.637,40.0,1 +6,115.0,60,39,,33.7,0.245,40.0,1 +1,112.0,80,45,132.0,34.8,0.217,24.0,0 +4,145.0,82,18,,32.5,0.235,70.0,1 +10,111.0,70,27,,27.5,0.141,40.0,1 +6,98.0,58,33,190.0,34.0,0.43,43.0,0 +9,154.0,78,30,100.0,30.9,0.16399999999999998,45.0,0 +6,165.0,68,26,168.0,33.6,0.631,49.0,0 +1,99.0,58,10,,25.4,0.551,21.0,0 +10,68.0,106,23,49.0,35.5,0.285,47.0,0 +3,123.0,100,35,240.0,57.3,0.88,22.0,0 +8,91.0,82,0,,35.6,0.5870000000000001,68.0,0 +6,195.0,70,0,,30.9,0.32799999999999996,31.0,1 +9,156.0,86,0,,24.8,0.23,53.0,1 +0,93.0,60,0,,35.3,0.263,25.0,0 +3,121.0,52,0,,36.0,0.127,25.0,1 +2,101.0,58,17,265.0,24.2,0.614,23.0,0 +2,56.0,56,28,45.0,24.2,0.332,22.0,0 +0,162.0,76,36,,49.6,0.364,26.0,1 +0,95.0,64,39,105.0,44.6,0.366,22.0,0 +4,125.0,80,0,,32.3,0.536,27.0,1 +5,136.0,82,0,,,0.64,69.0,0 +2,129.0,74,26,205.0,33.2,0.591,25.0,0 +3,130.0,64,0,,23.1,0.314,22.0,0 +1,107.0,50,19,,28.3,0.18100000000000002,29.0,0 +1,140.0,74,26,180.0,24.1,0.828,23.0,0 +1,144.0,82,46,180.0,46.1,0.335,46.0,1 +8,107.0,80,0,,24.6,0.856,34.0,0 +13,158.0,114,0,,42.3,0.257,44.0,1 +2,121.0,70,32,95.0,39.1,0.8859999999999999,23.0,0 +7,129.0,68,49,125.0,38.5,0.439,43.0,1 +2,90.0,60,0,,23.5,0.191,25.0,0 +7,142.0,90,24,480.0,30.4,0.128,43.0,1 +3,169.0,74,19,125.0,29.9,0.268,31.0,1 +0,99.0,0,0,,25.0,0.253,22.0,0 +4,127.0,88,11,155.0,34.5,0.598,28.0,0 +4,118.0,70,0,,44.5,0.904,26.0,0 +2,122.0,76,27,200.0,35.9,0.483,26.0,0 +6,125.0,78,31,,27.6,0.565,49.0,1 +1,168.0,88,29,,35.0,0.905,52.0,1 +2,129.0,0,0,,38.5,0.304,41.0,0 +4,110.0,76,20,100.0,28.4,0.11800000000000001,27.0,0 +6,80.0,80,36,,39.8,0.177,28.0,0 +10,115.0,0,0,,,0.261,30.0,1 +2,127.0,46,21,335.0,34.4,0.17600000000000002,22.0,0 +9,164.0,78,0,,32.8,0.14800000000000002,45.0,1 +2,93.0,64,32,160.0,38.0,0.674,23.0,1 +3,158.0,64,13,387.0,31.2,0.295,24.0,0 +5,126.0,78,27,22.0,29.6,0.439,40.0,0 +10,129.0,62,36,,41.2,0.441,38.0,1 +0,134.0,58,20,291.0,26.4,0.35200000000000004,21.0,0 +3,102.0,74,0,,29.5,0.121,32.0,0 +7,187.0,50,33,392.0,33.9,0.826,34.0,1 +3,173.0,78,39,185.0,33.8,0.97,31.0,1 +10,94.0,72,18,,23.1,0.595,56.0,0 +1,108.0,60,46,178.0,35.5,0.415,24.0,0 +5,97.0,76,27,,35.6,0.37799999999999995,52.0,1 +4,83.0,86,19,,29.3,0.317,34.0,0 +1,114.0,66,36,200.0,38.1,0.289,21.0,0 +1,149.0,68,29,127.0,29.3,0.349,42.0,1 +5,117.0,86,30,105.0,39.1,0.251,42.0,0 +1,111.0,94,0,,32.8,0.265,45.0,0 +4,112.0,78,40,,39.4,0.23600000000000002,38.0,0 +1,116.0,78,29,180.0,36.1,0.496,25.0,0 +0,141.0,84,26,,32.4,0.433,22.0,0 +2,175.0,88,0,,22.9,0.326,22.0,0 +2,92.0,52,0,,30.1,0.141,22.0,0 +3,130.0,78,23,79.0,28.4,0.32299999999999995,34.0,1 +8,120.0,86,0,,28.4,0.259,22.0,1 +2,174.0,88,37,120.0,44.5,0.6459999999999999,24.0,1 +2,106.0,56,27,165.0,29.0,0.426,22.0,0 +2,105.0,75,0,,23.3,0.56,53.0,0 +4,95.0,60,32,,35.4,0.284,28.0,0 +0,126.0,86,27,120.0,27.4,0.515,21.0,0 +8,65.0,72,23,,32.0,0.6,42.0,0 +2,99.0,60,17,160.0,36.6,0.45299999999999996,21.0,0 +1,102.0,74,0,,39.5,0.293,42.0,1 +11,120.0,80,37,150.0,42.3,0.785,48.0,1 +3,102.0,44,20,94.0,30.8,0.4,26.0,0 +1,109.0,58,18,116.0,28.5,0.21899999999999997,22.0,0 +9,140.0,94,0,,32.7,0.7340000000000001,45.0,1 +13,153.0,88,37,140.0,40.6,1.1740000000000002,39.0,0 +12,100.0,84,33,105.0,30.0,0.488,46.0,0 +1,147.0,94,41,,49.3,0.358,27.0,1 +1,81.0,74,41,57.0,46.3,1.0959999999999999,32.0,0 +3,187.0,70,22,200.0,36.4,0.408,36.0,1 +6,162.0,62,0,,24.3,0.17800000000000002,50.0,1 +4,136.0,70,0,,31.2,1.182,22.0,1 +1,121.0,78,39,74.0,39.0,0.261,28.0,0 +3,108.0,62,24,,26.0,0.223,25.0,0 +0,181.0,88,44,510.0,43.3,0.222,26.0,1 +8,154.0,78,32,,32.4,0.44299999999999995,45.0,1 +1,128.0,88,39,110.0,36.5,1.057,37.0,1 +7,137.0,90,41,,32.0,0.391,39.0,0 +0,123.0,72,0,,36.3,0.258,52.0,1 +1,106.0,76,0,,37.5,0.19699999999999998,26.0,0 +6,190.0,92,0,,35.5,0.278,66.0,1 +2,88.0,58,26,16.0,28.4,0.7659999999999999,22.0,0 +9,170.0,74,31,,44.0,0.40299999999999997,43.0,1 +9,89.0,62,0,,22.5,0.142,33.0,0 +10,101.0,76,48,180.0,32.9,0.171,63.0,0 +2,122.0,70,27,,36.8,0.34,27.0,0 +5,121.0,72,23,112.0,26.2,0.245,30.0,0 +1,126.0,60,0,,30.1,0.349,47.0,1 +1,93.0,70,31,,30.4,0.315,23.0,0 diff --git a/Topic02/MissingData-Correlation.ipynb b/Topic02/MissingData-Correlation.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..c656056b13721472619f0e784948fe9e8ff2b23c --- /dev/null +++ b/Topic02/MissingData-Correlation.ipynb @@ -0,0 +1,212 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Import Libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load Diabetes Data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_csv(\"Diabetes.csv\")\n", + "data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## View Missing Values" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# If the data uses '?' for missing values then we can replace them with a NaN\n", + "#data.replace('?', np.NaN, inplace=True)\n", + "\n", + "# using isnull() function \n", + "# View each column and how many missing values it has\n", + "print(data.isnull().sum())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "374/768" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Deal with Missing Values" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## Insulin has a large number of missing values .. so we can drop that column\n", + "data = data.drop('Insulin', axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "### Replace missing values in each column with the mean or median of that column\n", + "#data.fillna(data.mean(), inplace=True)\n", + "data.fillna(data.median(), inplace=True)\n", + "\n", + "# Or drop rows with missing values\n", + "# data = data.dropna()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(data.isnull().sum())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Scatter Matrix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sns.pairplot(data, hue=\"Outcome\", diag_kind = 'hist');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Correlation Matrix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data.corr()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(9,9))\n", + "sns.heatmap(np.abs(data.corr()), annot=True, cmap=\"viridis\", fmt=\"0.2f\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Histogram Plots" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# https://seaborn.pydata.org/generated/seaborn.distplot.html\n", + "for i,col in enumerate(data.columns[:-1]):\n", + " plt.figure(i)\n", + " sns.distplot(data[col], kde=True, rug=True);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Topic04/Significance-Tests.ipynb b/Topic04/Significance-Tests.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..80fcb6b7e962ae3c72cb690c1ceefeb615e99b26 --- /dev/null +++ b/Topic04/Significance-Tests.ipynb @@ -0,0 +1,249 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Import Libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from random import randrange\n", + "import pandas as pd\n", + "import numpy as np\n", + "from scipy.stats import ttest_ind\n", + "from scipy.stats import ttest_1samp\n", + "from scipy.stats import chi2_contingency\n", + "from scipy.stats import f_oneway\n", + "from statsmodels.stats.power import TTestIndPower" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## One-way One Sample t-Test (team height example from the slides in topic 4 part 2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## generate some heights for 18 players in our team\n", + "## Notice that your results can be different as we're generating random numbers\n", + "team_heights = []\n", + "for i in range(18):\n", + " team_heights.append(randrange(180,205))\n", + "\n", + "print(team_heights)\n", + "print(f\"Average player height in our team = {np.mean(team_heights):.5f}\")\n", + "print(f\"STD of player height in our team = {np.std(team_heights):.5f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## popmean is the mean player height in the league as was explained in the lecture\n", + "tscore, pvalue = ttest_1samp(team_heights, popmean=201)\n", + "print(\"t Statistic: \", tscore) \n", + "print(f'p-value for single sided test: {pvalue / 2:.5f}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## One-way Two Sample t-Test (Sleep apnoea events example from the slides in topic 4 part 2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## generate some numbers for people who followed the diet\n", + "## Notice that your results can be different as we're generating random numbers\n", + "diet = []\n", + "for i in range(13):\n", + " diet.append(randrange(3,9))\n", + "print(diet)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## generate some numbers for people who did not follow the diet\n", + "## Notice that your results can be different as we're generating random numbers\n", + "nodiet = []\n", + "for i in range(14):\n", + " nodiet.append(randrange(4,10))\n", + "print(nodiet)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## Run the t-test and extract the p-value\n", + "## We divide the resulting p-value by 2 beause this is a single-sided t-test\n", + "## Please read the documentation of the ttest_ind function\n", + "res = ttest_ind(diet, nodiet, equal_var=False)\n", + "print(f'p-value for single sided test: {res.pvalue / 2:.5f}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## One-way ANOVA for multiple groups\n", + "https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.f_oneway.html\n", + "\n", + "Data from: http://www.biostathandbook.com/onewayanova.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tillamook = [0.0571, 0.0813, 0.0831, 0.0976, 0.0817, 0.0859, 0.0735,\n", + " 0.0659, 0.0923, 0.0836]\n", + "newport = [0.0873, 0.0662, 0.0672, 0.0819, 0.0749, 0.0649, 0.0835,\n", + " 0.0725]\n", + "petersburg = [0.0974, 0.1352, 0.0817, 0.1016, 0.0968, 0.1064, 0.105]\n", + "magadan = [0.1033, 0.0915, 0.0781, 0.0685, 0.0677, 0.0697, 0.0764,\n", + " 0.0689]\n", + "tvarminne = [0.0703, 0.1026, 0.0956, 0.0973, 0.1039, 0.1045]\n", + "res = f_oneway(tillamook, newport, petersburg, magadan, tvarminne)\n", + "print(f'p-value for one-sided ANOVA : {res.pvalue :.5f}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Chi-square test" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a1 = [8, 6, 6, 4]\n", + "a2 = [6, 6, 6, 6]\n", + "a3 = [4, 5, 5, 7]\n", + "a4 = [5, 6, 6, 7]\n", + "a5 = [7, 7, 5, 4]\n", + "a6 = [5, 5, 7, 7]\n", + "dice = np.array([a1, a2, a3, a4, a5, a6])\n", + "df = pd.DataFrame(dice, columns=['Exp1','Exp2','Exp3','Exp4'])\n", + "df.index = ['One','Two','Three','Four','Five','Six']\n", + "#df.sum(axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "chi2_stat, p_val, dof, ct = chi2_contingency(dice)\n", + "print(\"Chi2 Stat = \", chi2_stat)\n", + "\n", + "print(\"Degrees of Freedom =\", dof)\n", + "\n", + "print(\"p-value =\", p_val)\n", + "\n", + "print(\"Contingency Table:\")\n", + "print(ct)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Power Analysis\n", + "\n", + "* Effect Size: The minimum size of the effect that you hope to be able to detect in a statistical test, such as β€œa 20% improvement in click rates”.\n", + "* Statistical Power: The probability of detecting a given effect size with a given sample size (i.e. The probability of accepting the alternative hypothesis if it is true).\n", + "* Sample Size: The number of observations in the sample.\n", + "* Significance level: The statistical significance level at which the test will be conducted (e.g. alpha. which is often set to 5% or 0.05).\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# estimate required sample size using power analysis\n", + "# parameters for power analysis\n", + "effect = 0.88\n", + "power = 0.85\n", + "alpha = 0.05\n", + "\n", + "# perform power analysis\n", + "pow_analysis = TTestIndPower()\n", + "result = pow_analysis.solve_power(effect, power=power, alpha=alpha)\n", + "\n", + "print(f'Sample Size: {result:.2f}')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Topic05/LinReg.ipynb b/Topic05/LinReg.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..e70a1180401370b0d7578029b0c2b17100eea100 --- /dev/null +++ b/Topic05/LinReg.ipynb @@ -0,0 +1,354 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Import Libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from scipy.optimize import curve_fit\n", + "from scipy.stats import linregress \n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.model_selection import train_test_split\n", + "import statsmodels.api as sm" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Simple Data for Simple Linear Regression" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Independent variable\n", + "x = np.array([210,290,250,500,310,430,455,380,535,510])\n", + "# Dependent variable\n", + "y = np.array([5,7,6,13,8,11,12,10,15,14])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plot Data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Plot the data along\n", + "plt.figure(figsize=(6,6), dpi=100)\n", + "plt.plot(x, y, 'o', label='original data')\n", + "plt.xlabel('Distance in KM') # X axis data label\n", + "plt.ylabel('Delivery Time in Days') # Y axis data label\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Means of indep and dep variables\n", + "xbar = np.mean(x)\n", + "ybar = np.mean(y)\n", + "# Apply equations to find b and a\n", + "b = np.sum((x - xbar)*(y - ybar)) / np.sum((x - xbar)**2)\n", + "a = ybar - b * xbar\n", + "# Plug in the values of the dep variable into the line equation to obtain yhat\n", + "yhat = a + b * x\n", + "\n", + "# Compute the error (i.e. residuals)\n", + "error = y - yhat\n", + "\n", + "# Compute metrics\n", + "SE = error**2 # squared error\n", + "MSE = np.mean(SE) # mean squared error\n", + "RMSE = np.sqrt(MSE) # Root Mean Squared Error, RMSE\n", + "\n", + "SST = np.sum((y - ybar)**2)\n", + "SSR = np.sum((yhat - ybar)**2)\n", + "Rsquared = SSR/SST\n", + "print('RMSE =',RMSE)\n", + "print('Rsquared =',Rsquared)\n", + "# This should give you the same result for Rsquared\n", + "#Rsquared = 1.0 - (np.var(error) / np.var(y))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Plot the data along with the fitted line:\n", + "plt.figure(figsize=(6,6), dpi=100)\n", + "plt.plot(x, y, 'o', label='original data')\n", + "plt.plot(x, yhat, 's', label='predicted data')\n", + "plt.xlabel('Distance in KM') # X axis data label\n", + "plt.ylabel('Delivery Time in Days') # Y axis data label\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plot original points, fitted line and residuals" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "f = plt.figure(figsize=(6,6), dpi=100)\n", + "axes = f.add_subplot(111)\n", + "\n", + "# first the raw data as a scatter plot\n", + "axes.plot(x, y, 'o')\n", + "\n", + "# now the model as a line plot\n", + "axes.plot(x, yhat)\n", + "\n", + "# now add individual line for each point\n", + "for i in range(len(x)):\n", + " lineXdata = (x[i], x[i]) # same X\n", + " lineYdata = (y[i], yhat[i]) # different Y\n", + " plt.plot(lineXdata, lineYdata)\n", + "\n", + "axes.set_xlabel('X Data') # X axis data label\n", + "axes.set_ylabel('Y Data') # Y axis data label\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Use existing package to fit model and confirm results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# function to apply simple linear regression\n", + "def func(x, b, a):\n", + " return a + b*x\n", + "\n", + "# curve fit the data\n", + "fitted_params, pcov = curve_fit(func, x, y)\n", + "\n", + "model_predictions = func(x, *fitted_params) \n", + "\n", + "absError = model_predictions - y\n", + "\n", + "SE = np.square(absError) # squared errors\n", + "MSE = np.mean(SE) # mean squared errors\n", + "RMSE = np.sqrt(MSE) # Root Mean Squared Error, RMSE\n", + "Rsquared = 1.0 - (np.var(absError) / np.var(y))\n", + "print('RMSE =', RMSE)\n", + "print('Rsquared=', Rsquared)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Use another existing package to fit model and confirm results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "slope, intercept, r_value, p_value, std_err = linregress(x, y)\n", + "print(\"slope: %f intercept: %f\" % (slope, intercept))\n", + "print(\"p-value: \", p_value/2)\n", + "#To get coefficient of determination (R-squared):\n", + "print(\"Rsquared: %f\" % r_value**2)\n", + "\n", + "\n", + "#Plot the data along with the fitted line:\n", + "plt.figure(figsize=(6,6), dpi=100)\n", + "plt.plot(x, y, 'o', label='original data')\n", + "plt.plot(x, intercept + slope*x, 'r', label='fitted line')\n", + "plt.xlabel('Distance in KM') # X axis data label\n", + "plt.ylabel('Delivery Time in Days') # Y axis data label\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multiple Linear Regression\n", + "\n", + "1. We would like to investigate the pasture rent structure with respect to the grass variety over\n", + " various districts in Minnesota. The data set β€œpasture-data.csv” provides 67 rows of data.\n", + "2. The data columns include:\n", + " - I, index\n", + " - X1, the rent per arable acre (dollars)\n", + " - X2, the number of milk cows per square mile\n", + " - X3, the difference between pasturage and arable land\n", + " - Y, the rental price per acre for this variety of grass (dollars)\n", + "3. We seek a model of the form:\n", + " Y = B0 + B1 * X1 + B2 * X2 + B3 * X3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# load the data\n", + "data = pd.read_csv(\"pasture-data.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# get x data .. only features, no index and outcome variables\n", + "X = data.iloc[:,1:-1]\n", + "\n", + "# this is the outcome variable\n", + "y = data.iloc[:,-1]\n", + "\n", + "# Create the train and test data\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5)\n", + "\n", + "\n", + "# Create linear regression object\n", + "regr = LinearRegression()\n", + "\n", + "# Train the model using the training sets\n", + "regr.fit(X_train, y_train)\n", + "\n", + "# Make predictions using the testing set\n", + "y_pred = regr.predict(X_test)\n", + "\n", + "# Compute residuals\n", + "residuals = (y_test - y_pred)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plot residuals " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot residuals\n", + "plt.scatter(range(len(residuals)),residuals)\n", + "plt.axhline(y=0, color='r', linestyle='-')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot residuals\n", + "plt.hist(residuals)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Obtain details of significance tests and CIs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mod = sm.OLS(y,X)\n", + "model = mod.fit()\n", + "model.summary2()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Topic05/pasture-data.csv b/Topic05/pasture-data.csv new file mode 100644 index 0000000000000000000000000000000000000000..851d5b32e1330d89a0e2bc1d85b0da3e3b4c960c --- /dev/null +++ b/Topic05/pasture-data.csv @@ -0,0 +1,68 @@ +I,X1,X2,X3,Y +1,15.5,17.25,0.24,18.38 +2,22.29,18.51,0.2,20 +3,12.36,11.13,0.12,11.5 +4,31.84,5.54,0.12,25 +5,83.9,5.44,0.04,62.5 +6,72.25,20.37,0.05,82.5 +7,27.14,31.2,0.27,25 +8,40.41,4.29,0.1,30.67 +9,12.42,8.69,0.41,12 +10,69.42,6.63,0.04,61.25 +11,48.46,27.4,0.12,60 +12,69,31.23,0.08,67.5 +13,26.09,28.5,0.21,31 +14,62.83,29.98,0.17,60 +15,77.06,13.59,0.05,72.5 +16,58.83,45.46,0.16,60.33 +17,59.48,35.9,0.32,49.75 +18,9,8.89,0.08,8.5 +19,20.64,23.81,0.24,36.5 +20,81.4,4.54,0.05,60 +21,18.92,29.62,0.72,16.25 +22,50.32,21.36,0.19,50 +23,21.33,1.53,0.1,11.6 +24,46.85,5.42,0.08,35 +25,65.94,22.1,0.09,75 +26,38.68,14.55,0.17,31.56 +27,51.19,7.59,0.13,48.5 +28,59.42,49.86,0.13,77.5 +29,24.64,11.46,0.21,21.67 +30,26.94,2.48,0.1,19.75 +31,46.2,31.62,0.26,56 +32,26.86,53.73,0.43,25 +33,20,40.18,0.56,40 +34,62.52,15.89,0.05,56.67 +35,66,14.25,0.15,51.79 +36,71.41,21.37,0.05,96.67 +37,65,13.24,0.08,50.83 +38,36.28,5.85,0.1,34.33 +39,59.88,32.99,0.21,48.75 +40,23.62,28.89,0.24,25.8 +41,24.2,6.29,0.06,20 +42,17.09,33.34,0.66,16 +43,44.56,16.7,0.15,48.67 +44,34.46,4.2,0.03,20.78 +45,31.55,23.47,0.19,32.5 +46,26.94,8.28,0.1,19 +47,58.71,7.4,0.04,51.5 +48,65.74,7.71,0.02,49.17 +49,69.05,46.18,0.22,85 +50,57.54,14.98,0.11,58.76 +51,21.73,6.58,0.06,19.33 +52,6.17,13.68,0.18,5 +53,51,50.5,0.24,65 +54,18.25,16.12,0.32,20 +55,69.88,31.48,0.07,62.5 +56,26.68,58.6,0.23,35 +57,75.73,35.43,0.05,99.17 +58,41.77,4.53,0.08,40.25 +59,48.5,6.82,0.08,39.17 +60,21.89,43.7,0.36,37.5 +61,38.33,2.83,0.04,26.25 +62,53.95,42.54,0.25,52.14 +63,17.17,24.16,0.36,22.5 +64,82,7.89,0.03,90 +65,40.6,3.27,0.02,28 +66,53.89,53.16,0.24,50 +67,54.17,5.57,0.06,24.5 \ No newline at end of file diff --git a/Topic06/Diabetes.csv b/Topic06/Diabetes.csv new file mode 100644 index 0000000000000000000000000000000000000000..d3f1f2eca50e4ab62608f70af61aa79dbe978517 --- /dev/null +++ b/Topic06/Diabetes.csv @@ -0,0 +1,769 @@ +Pregnancies,Glucose,BloodPressure,SkinThickness,Insulin,BMI,DiabetesPedigreeFunction,Age,Outcome +6,148.0,72,35,,33.6,0.627,50.0,1 +1,85.0,66,29,,26.6,0.35100000000000003,31.0,0 +8,183.0,64,0,,23.3,0.672,32.0,1 +1,89.0,66,23,94.0,28.1,0.16699999999999998,21.0,0 +0,137.0,40,35,168.0,43.1,2.2880000000000003,33.0,1 +5,116.0,74,0,,25.6,0.201,30.0,0 +3,78.0,50,32,88.0,31.0,0.248,26.0,1 +10,115.0,0,0,,35.3,0.134,29.0,0 +2,197.0,70,45,543.0,30.5,0.158,53.0,1 +8,125.0,96,0,,,0.23199999999999998,54.0,1 +4,110.0,92,0,,37.6,0.191,30.0,0 +10,168.0,74,0,,38.0,0.537,34.0,1 +10,139.0,80,0,,27.1,1.4409999999999998,57.0,0 +1,189.0,60,23,846.0,30.1,0.39799999999999996,59.0,1 +5,166.0,72,19,175.0,25.8,0.5870000000000001,51.0,1 +7,100.0,0,0,,30.0,0.484,32.0,1 +0,118.0,84,47,230.0,45.8,0.551,31.0,1 +7,107.0,74,0,,29.6,0.254,31.0,1 +1,103.0,30,38,83.0,43.3,0.183,33.0,0 +1,115.0,70,30,96.0,34.6,0.529,32.0,1 +3,126.0,88,41,235.0,39.3,0.7040000000000001,27.0,0 +8,99.0,84,0,,35.4,0.38799999999999996,50.0,0 +7,196.0,90,0,,39.8,0.451,41.0,1 +9,119.0,80,35,,29.0,0.263,29.0,1 +11,143.0,94,33,146.0,36.6,0.254,51.0,1 +10,125.0,70,26,115.0,31.1,0.205,41.0,1 +7,147.0,76,0,,39.4,0.257,43.0,1 +1,97.0,66,15,140.0,23.2,0.48700000000000004,22.0,0 +13,145.0,82,19,110.0,22.2,0.245,57.0,0 +5,117.0,92,0,,34.1,0.337,38.0,0 +5,109.0,75,26,,36.0,0.546,60.0,0 +3,158.0,76,36,245.0,31.6,0.851,28.0,1 +3,88.0,58,11,54.0,24.8,0.267,22.0,0 +6,92.0,92,0,,19.9,0.188,28.0,0 +10,122.0,78,31,,27.6,0.512,45.0,0 +4,103.0,60,33,192.0,24.0,0.966,33.0,0 +11,138.0,76,0,,33.2,0.42,35.0,0 +9,102.0,76,37,,32.9,0.665,46.0,1 +2,90.0,68,42,,38.2,0.503,27.0,1 +4,111.0,72,47,207.0,37.1,1.39,56.0,1 +3,180.0,64,25,70.0,34.0,0.271,26.0,0 +7,133.0,84,0,,40.2,0.696,37.0,0 +7,106.0,92,18,,22.7,0.235,48.0,0 +9,171.0,110,24,240.0,45.4,0.721,54.0,1 +7,159.0,64,0,,27.4,0.294,40.0,0 +0,180.0,66,39,,42.0,1.893,25.0,1 +1,146.0,56,0,,29.7,0.564,29.0,0 +2,71.0,70,27,,28.0,0.586,22.0,0 +7,103.0,66,32,,39.1,0.344,31.0,1 +7,105.0,0,0,,,0.305,24.0,0 +1,103.0,80,11,82.0,19.4,0.491,22.0,0 +1,101.0,50,15,36.0,24.2,0.526,26.0,0 +5,88.0,66,21,23.0,24.4,0.342,30.0,0 +8,176.0,90,34,300.0,33.7,0.467,58.0,1 +7,150.0,66,42,342.0,34.7,0.718,42.0,0 +1,73.0,50,10,,23.0,0.248,21.0,0 +7,187.0,68,39,304.0,37.7,0.254,41.0,1 +0,100.0,88,60,110.0,46.8,0.9620000000000001,31.0,0 +0,146.0,82,0,,40.5,1.781,44.0,0 +0,105.0,64,41,142.0,41.5,0.17300000000000001,22.0,0 +2,84.0,0,0,,,0.304,21.0,0 +8,133.0,72,0,,32.9,0.27,39.0,1 +5,44.0,62,0,,25.0,0.5870000000000001,36.0,0 +2,141.0,58,34,128.0,25.4,0.6990000000000001,24.0,0 +7,114.0,66,0,,32.8,0.258,42.0,1 +5,99.0,74,27,,29.0,0.203,32.0,0 +0,109.0,88,30,,32.5,0.855,38.0,1 +2,109.0,92,0,,42.7,0.845,54.0,0 +1,95.0,66,13,38.0,19.6,0.33399999999999996,25.0,0 +4,146.0,85,27,100.0,28.9,0.18899999999999997,27.0,0 +2,100.0,66,20,90.0,32.9,0.867,28.0,1 +5,139.0,64,35,140.0,28.6,0.41100000000000003,26.0,0 +13,126.0,90,0,,43.4,0.583,42.0,1 +4,129.0,86,20,270.0,35.1,0.231,23.0,0 +1,79.0,75,30,,32.0,0.396,22.0,0 +1,,48,20,,24.7,0.14,22.0,0 +7,62.0,78,0,,32.6,0.391,41.0,0 +5,95.0,72,33,,37.7,0.37,27.0,0 +0,131.0,0,0,,43.2,0.27,26.0,1 +2,112.0,66,22,,25.0,0.307,24.0,0 +3,113.0,44,13,,22.4,0.14,22.0,0 +2,74.0,0,0,,,0.102,22.0,0 +7,83.0,78,26,71.0,29.3,0.767,36.0,0 +0,101.0,65,28,,24.6,0.237,22.0,0 +5,137.0,108,0,,48.8,0.22699999999999998,37.0,1 +2,110.0,74,29,125.0,32.4,0.698,27.0,0 +13,106.0,72,54,,36.6,0.17800000000000002,45.0,0 +2,100.0,68,25,71.0,38.5,0.324,26.0,0 +15,136.0,70,32,110.0,37.1,0.153,43.0,1 +1,107.0,68,19,,26.5,0.165,24.0,0 +1,80.0,55,0,,19.1,0.258,21.0,0 +4,123.0,80,15,176.0,32.0,0.44299999999999995,34.0,0 +7,81.0,78,40,48.0,46.7,0.261,42.0,0 +4,134.0,72,0,,23.8,0.27699999999999997,60.0,1 +2,142.0,82,18,64.0,24.7,0.7609999999999999,21.0,0 +6,144.0,72,27,228.0,33.9,0.255,40.0,0 +2,92.0,62,28,,31.6,0.13,24.0,0 +1,71.0,48,18,76.0,20.4,0.32299999999999995,22.0,0 +6,93.0,50,30,64.0,28.7,0.35600000000000004,23.0,0 +1,122.0,90,51,220.0,49.7,0.325,31.0,1 +1,163.0,72,0,,39.0,1.222,33.0,1 +1,151.0,60,0,,26.1,0.179,22.0,0 +0,125.0,96,0,,22.5,0.262,21.0,0 +1,81.0,72,18,40.0,26.6,0.28300000000000003,24.0,0 +2,85.0,65,0,,39.6,0.93,27.0,0 +1,126.0,56,29,152.0,28.7,0.8009999999999999,21.0,0 +1,96.0,122,0,,22.4,0.207,27.0,0 +4,144.0,58,28,140.0,29.5,0.287,37.0,0 +3,83.0,58,31,18.0,34.3,0.336,25.0,0 +0,95.0,85,25,36.0,37.4,0.247,24.0,1 +3,171.0,72,33,135.0,33.3,0.19899999999999998,24.0,1 +8,155.0,62,26,495.0,34.0,0.5429999999999999,46.0,1 +1,89.0,76,34,37.0,31.2,0.192,23.0,0 +4,76.0,62,0,,34.0,0.391,25.0,0 +7,160.0,54,32,175.0,30.5,0.588,39.0,1 +4,146.0,92,0,,31.2,0.539,61.0,1 +5,124.0,74,0,,34.0,0.22,38.0,1 +5,78.0,48,0,,33.7,0.654,25.0,0 +4,97.0,60,23,,28.2,0.44299999999999995,22.0,0 +4,99.0,76,15,51.0,23.2,0.223,21.0,0 +0,162.0,76,56,100.0,53.2,0.759,25.0,1 +6,111.0,64,39,,34.2,0.26,24.0,0 +2,107.0,74,30,100.0,33.6,0.40399999999999997,23.0,0 +5,132.0,80,0,,26.8,0.18600000000000003,69.0,0 +0,113.0,76,0,,33.3,0.278,23.0,1 +1,88.0,30,42,99.0,55.0,0.496,26.0,1 +3,120.0,70,30,135.0,42.9,0.452,30.0,0 +1,118.0,58,36,94.0,33.3,0.261,23.0,0 +1,117.0,88,24,145.0,34.5,0.40299999999999997,40.0,1 +0,105.0,84,0,,27.9,0.741,62.0,1 +4,173.0,70,14,168.0,29.7,0.361,33.0,1 +9,122.0,56,0,,33.3,1.114,33.0,1 +3,170.0,64,37,225.0,34.5,0.35600000000000004,30.0,1 +8,84.0,74,31,,38.3,0.457,39.0,0 +2,96.0,68,13,49.0,21.1,0.647,26.0,0 +2,125.0,60,20,140.0,33.8,0.08800000000000001,31.0,0 +0,100.0,70,26,50.0,30.8,0.597,21.0,0 +0,93.0,60,25,92.0,28.7,0.532,22.0,0 +0,129.0,80,0,,31.2,0.703,29.0,0 +5,105.0,72,29,325.0,36.9,0.159,28.0,0 +3,128.0,78,0,,21.1,0.268,55.0,0 +5,106.0,82,30,,39.5,0.28600000000000003,38.0,0 +2,108.0,52,26,63.0,32.5,0.318,22.0,0 +10,108.0,66,0,,32.4,0.272,42.0,1 +4,154.0,62,31,284.0,32.8,0.237,23.0,0 +0,102.0,75,23,,,0.5720000000000001,21.0,0 +9,57.0,80,37,,32.8,0.096,41.0,0 +2,106.0,64,35,119.0,30.5,1.4,34.0,0 +5,147.0,78,0,,33.7,0.218,65.0,0 +2,90.0,70,17,,27.3,0.085,22.0,0 +1,136.0,74,50,204.0,37.4,0.39899999999999997,24.0,0 +4,114.0,65,0,,21.9,0.43200000000000005,37.0,0 +9,156.0,86,28,155.0,34.3,1.189,42.0,1 +1,153.0,82,42,485.0,40.6,0.687,23.0,0 +8,188.0,78,0,,47.9,0.13699999999999998,43.0,1 +7,152.0,88,44,,50.0,0.337,36.0,1 +2,99.0,52,15,94.0,24.6,0.637,21.0,0 +1,109.0,56,21,135.0,25.2,0.833,23.0,0 +2,88.0,74,19,53.0,29.0,0.22899999999999998,22.0,0 +17,163.0,72,41,114.0,40.9,0.8170000000000001,47.0,1 +4,151.0,90,38,,29.7,0.294,36.0,0 +7,102.0,74,40,105.0,37.2,0.204,45.0,0 +0,114.0,80,34,285.0,44.2,0.16699999999999998,27.0,0 +2,100.0,64,23,,29.7,0.368,21.0,0 +0,131.0,88,0,,31.6,0.743,32.0,1 +6,104.0,74,18,156.0,29.9,0.722,41.0,1 +3,148.0,66,25,,32.5,0.256,22.0,0 +4,120.0,68,0,,29.6,0.7090000000000001,34.0,0 +4,110.0,66,0,,31.9,0.47100000000000003,29.0,0 +3,111.0,90,12,78.0,28.4,0.495,29.0,0 +6,102.0,82,0,,30.8,0.18,36.0,1 +6,134.0,70,23,130.0,35.4,0.542,29.0,1 +2,87.0,0,23,,28.9,0.773,25.0,0 +1,79.0,60,42,48.0,43.5,0.6779999999999999,23.0,0 +2,75.0,64,24,55.0,29.7,0.37,33.0,0 +8,179.0,72,42,130.0,32.7,0.7190000000000001,36.0,1 +6,85.0,78,0,,31.2,0.382,42.0,0 +0,129.0,110,46,130.0,67.1,0.319,26.0,1 +5,143.0,78,0,,45.0,0.19,47.0,0 +5,130.0,82,0,,39.1,0.956,37.0,1 +6,87.0,80,0,,23.2,0.084,32.0,0 +0,119.0,64,18,92.0,34.9,0.725,23.0,0 +1,,74,20,23.0,27.7,0.299,21.0,0 +5,73.0,60,0,,26.8,0.268,27.0,0 +4,141.0,74,0,,27.6,0.244,40.0,0 +7,194.0,68,28,,35.9,0.745,41.0,1 +8,181.0,68,36,495.0,30.1,0.615,60.0,1 +1,128.0,98,41,58.0,32.0,1.321,33.0,1 +8,109.0,76,39,114.0,27.9,0.64,31.0,1 +5,139.0,80,35,160.0,31.6,0.361,25.0,1 +3,111.0,62,0,,22.6,0.142,21.0,0 +9,123.0,70,44,94.0,33.1,0.374,40.0,0 +7,159.0,66,0,,30.4,0.38299999999999995,36.0,1 +11,135.0,0,0,,52.3,0.578,40.0,1 +8,85.0,55,20,,24.4,0.136,42.0,0 +5,158.0,84,41,210.0,39.4,0.395,29.0,1 +1,105.0,58,0,,24.3,0.187,21.0,0 +3,107.0,62,13,48.0,22.9,0.6779999999999999,23.0,1 +4,109.0,64,44,99.0,34.8,0.905,26.0,1 +4,148.0,60,27,318.0,30.9,0.15,29.0,1 +0,113.0,80,16,,31.0,0.8740000000000001,21.0,0 +1,138.0,82,0,,40.1,0.23600000000000002,28.0,0 +0,108.0,68,20,,27.3,0.787,32.0,0 +2,99.0,70,16,44.0,20.4,0.235,27.0,0 +6,103.0,72,32,190.0,37.7,0.324,55.0,0 +5,111.0,72,28,,23.9,0.40700000000000003,27.0,0 +8,196.0,76,29,280.0,37.5,0.605,57.0,1 +5,162.0,104,0,,37.7,0.151,52.0,1 +1,96.0,64,27,87.0,33.2,0.289,21.0,0 +7,184.0,84,33,,35.5,0.355,41.0,1 +2,81.0,60,22,,27.7,0.29,25.0,0 +0,147.0,85,54,,42.8,0.375,24.0,0 +7,179.0,95,31,,34.2,0.16399999999999998,60.0,0 +0,140.0,65,26,130.0,42.6,0.431,24.0,1 +9,112.0,82,32,175.0,34.2,0.26,36.0,1 +12,151.0,70,40,271.0,41.8,0.742,38.0,1 +5,109.0,62,41,129.0,35.8,0.514,25.0,1 +6,125.0,68,30,120.0,30.0,0.46399999999999997,32.0,0 +5,85.0,74,22,,29.0,1.224,32.0,1 +5,112.0,66,0,,37.8,0.261,41.0,1 +0,177.0,60,29,478.0,34.6,1.072,21.0,1 +2,158.0,90,0,,31.6,0.805,66.0,1 +7,119.0,0,0,,25.2,0.209,37.0,0 +7,142.0,60,33,190.0,28.8,0.687,61.0,0 +1,100.0,66,15,56.0,23.6,0.6659999999999999,26.0,0 +1,87.0,78,27,32.0,34.6,0.10099999999999999,22.0,0 +0,101.0,76,0,,35.7,0.198,26.0,0 +3,162.0,52,38,,37.2,0.652,24.0,1 +4,197.0,70,39,744.0,36.7,2.329,31.0,0 +0,117.0,80,31,53.0,45.2,0.08900000000000001,24.0,0 +4,142.0,86,0,,44.0,0.645,22.0,1 +6,134.0,80,37,370.0,46.2,0.23800000000000002,46.0,1 +1,79.0,80,25,37.0,25.4,0.583,22.0,0 +4,122.0,68,0,,35.0,0.39399999999999996,29.0,0 +3,74.0,68,28,45.0,29.7,0.293,23.0,0 +4,171.0,72,0,,43.6,0.479,26.0,1 +7,181.0,84,21,192.0,35.9,0.586,51.0,1 +0,179.0,90,27,,44.1,0.6859999999999999,23.0,1 +9,164.0,84,21,,30.8,0.831,32.0,1 +0,104.0,76,0,,18.4,0.5820000000000001,27.0,0 +1,91.0,64,24,,29.2,0.192,21.0,0 +4,91.0,70,32,88.0,33.1,0.446,22.0,0 +3,139.0,54,0,,25.6,0.402,22.0,1 +6,119.0,50,22,176.0,27.1,1.318,33.0,1 +2,146.0,76,35,194.0,38.2,0.32899999999999996,29.0,0 +9,184.0,85,15,,30.0,1.213,49.0,1 +10,122.0,68,0,,31.2,0.258,41.0,0 +0,165.0,90,33,680.0,52.3,0.42700000000000005,23.0,0 +9,124.0,70,33,402.0,35.4,0.282,34.0,0 +1,111.0,86,19,,30.1,0.14300000000000002,23.0,0 +9,106.0,52,0,,31.2,0.38,42.0,0 +2,129.0,84,0,,28.0,0.284,27.0,0 +2,90.0,80,14,55.0,24.4,0.249,24.0,0 +0,86.0,68,32,,35.8,0.23800000000000002,25.0,0 +12,92.0,62,7,258.0,27.6,0.9259999999999999,44.0,1 +1,113.0,64,35,,33.6,0.5429999999999999,21.0,1 +3,111.0,56,39,,30.1,0.557,30.0,0 +2,114.0,68,22,,28.7,0.092,25.0,0 +1,193.0,50,16,375.0,25.9,0.655,24.0,0 +11,155.0,76,28,150.0,33.3,1.3530000000000002,51.0,1 +3,191.0,68,15,130.0,30.9,0.299,34.0,0 +3,141.0,0,0,,30.0,0.7609999999999999,27.0,1 +4,95.0,70,32,,32.1,0.612,24.0,0 +3,142.0,80,15,,32.4,0.2,63.0,0 +4,123.0,62,0,,32.0,0.226,35.0,1 +5,96.0,74,18,67.0,33.6,0.997,43.0,0 +0,138.0,0,0,,36.3,0.9329999999999999,25.0,1 +2,128.0,64,42,,40.0,1.101,24.0,0 +0,102.0,52,0,,25.1,0.078,21.0,0 +2,146.0,0,0,,27.5,0.24,28.0,1 +10,101.0,86,37,,45.6,1.136,38.0,1 +2,108.0,62,32,56.0,25.2,0.128,21.0,0 +3,122.0,78,0,,23.0,0.254,40.0,0 +1,71.0,78,50,45.0,33.2,0.42200000000000004,21.0,0 +13,106.0,70,0,,34.2,0.251,52.0,0 +2,100.0,70,52,57.0,40.5,0.677,25.0,0 +7,106.0,60,24,,26.5,0.29600000000000004,29.0,1 +0,104.0,64,23,116.0,27.8,0.45399999999999996,23.0,0 +5,114.0,74,0,,24.9,0.7440000000000001,57.0,0 +2,108.0,62,10,278.0,25.3,0.8809999999999999,22.0,0 +0,146.0,70,0,,37.9,0.33399999999999996,28.0,1 +10,129.0,76,28,122.0,35.9,0.28,39.0,0 +7,133.0,88,15,155.0,32.4,0.262,37.0,0 +7,161.0,86,0,,30.4,0.165,47.0,1 +2,108.0,80,0,,27.0,0.259,52.0,1 +7,136.0,74,26,135.0,26.0,0.647,51.0,0 +5,155.0,84,44,545.0,38.7,0.619,34.0,0 +1,119.0,86,39,220.0,45.6,0.8079999999999999,29.0,1 +4,96.0,56,17,49.0,20.8,0.34,26.0,0 +5,108.0,72,43,75.0,36.1,0.263,33.0,0 +0,78.0,88,29,40.0,36.9,0.434,21.0,0 +0,107.0,62,30,74.0,36.6,0.757,25.0,1 +2,128.0,78,37,182.0,43.3,1.224,31.0,1 +1,128.0,48,45,194.0,40.5,0.613,24.0,1 +0,161.0,50,0,,21.9,0.254,65.0,0 +6,151.0,62,31,120.0,35.5,0.6920000000000001,28.0,0 +2,146.0,70,38,360.0,28.0,0.337,29.0,1 +0,126.0,84,29,215.0,30.7,0.52,24.0,0 +14,100.0,78,25,184.0,36.6,0.41200000000000003,46.0,1 +8,112.0,72,0,,23.6,0.84,58.0,0 +0,167.0,0,0,,32.3,0.8390000000000001,30.0,1 +2,144.0,58,33,135.0,31.6,0.42200000000000004,25.0,1 +5,77.0,82,41,42.0,35.8,0.156,35.0,0 +5,115.0,98,0,,52.9,0.209,28.0,1 +3,150.0,76,0,,21.0,0.207,37.0,0 +2,120.0,76,37,105.0,39.7,0.215,29.0,0 +10,161.0,68,23,132.0,25.5,0.326,47.0,1 +0,137.0,68,14,148.0,24.8,0.14300000000000002,21.0,0 +0,128.0,68,19,180.0,30.5,1.391,25.0,1 +2,124.0,68,28,205.0,32.9,0.875,30.0,1 +6,80.0,66,30,,26.2,0.313,41.0,0 +0,106.0,70,37,148.0,39.4,0.605,22.0,0 +2,155.0,74,17,96.0,26.6,0.433,27.0,1 +3,113.0,50,10,85.0,29.5,0.626,25.0,0 +7,109.0,80,31,,35.9,1.127,43.0,1 +2,112.0,68,22,94.0,34.1,0.315,26.0,0 +3,99.0,80,11,64.0,19.3,0.284,30.0,0 +3,182.0,74,0,,30.5,0.345,29.0,1 +3,115.0,66,39,140.0,38.1,0.15,28.0,0 +6,194.0,78,0,,23.5,0.129,59.0,1 +4,129.0,60,12,231.0,27.5,0.527,31.0,0 +3,112.0,74,30,,31.6,0.19699999999999998,25.0,1 +0,124.0,70,20,,27.4,0.254,36.0,1 +13,152.0,90,33,29.0,26.8,0.731,43.0,1 +2,112.0,75,32,,35.7,0.14800000000000002,21.0,0 +1,157.0,72,21,168.0,25.6,0.12300000000000001,24.0,0 +1,122.0,64,32,156.0,35.1,0.6920000000000001,30.0,1 +10,179.0,70,0,,35.1,0.2,37.0,0 +2,102.0,86,36,120.0,45.5,0.127,23.0,1 +6,105.0,70,32,68.0,30.8,0.122,37.0,0 +8,118.0,72,19,,23.1,1.476,46.0,0 +2,87.0,58,16,52.0,32.7,0.166,25.0,0 +1,180.0,0,0,,43.3,0.282,41.0,1 +12,106.0,80,0,,23.6,0.13699999999999998,44.0,0 +1,95.0,60,18,58.0,23.9,0.26,22.0,0 +0,165.0,76,43,255.0,47.9,0.259,26.0,0 +0,117.0,0,0,,33.8,0.932,44.0,0 +5,115.0,76,0,,31.2,0.34299999999999997,44.0,1 +9,152.0,78,34,171.0,34.2,0.893,33.0,1 +7,178.0,84,0,,39.9,0.331,41.0,1 +1,130.0,70,13,105.0,25.9,0.47200000000000003,22.0,0 +1,95.0,74,21,73.0,25.9,0.6729999999999999,36.0,0 +1,,68,35,,32.0,0.389,22.0,0 +5,122.0,86,0,,34.7,0.29,33.0,0 +8,95.0,72,0,,36.8,0.485,57.0,0 +8,126.0,88,36,108.0,38.5,0.349,49.0,0 +1,139.0,46,19,83.0,28.7,0.654,22.0,0 +3,116.0,0,0,,23.5,0.187,23.0,0 +3,99.0,62,19,74.0,21.8,0.27899999999999997,26.0,0 +5,,80,32,,41.0,0.34600000000000003,37.0,1 +4,92.0,80,0,,42.2,0.237,29.0,0 +4,137.0,84,0,,31.2,0.252,30.0,0 +3,61.0,82,28,,34.4,0.243,46.0,0 +1,90.0,62,12,43.0,27.2,0.58,24.0,0 +3,90.0,78,0,,42.7,0.5589999999999999,21.0,0 +9,165.0,88,0,,30.4,0.302,49.0,1 +1,125.0,50,40,167.0,33.3,0.9620000000000001,28.0,1 +13,129.0,0,30,,39.9,0.569,44.0,1 +12,88.0,74,40,54.0,35.3,0.37799999999999995,48.0,0 +1,196.0,76,36,249.0,36.5,0.875,29.0,1 +5,189.0,64,33,325.0,31.2,0.583,29.0,1 +5,158.0,70,0,,29.8,0.207,63.0,0 +5,103.0,108,37,,39.2,0.305,65.0,0 +4,146.0,78,0,,38.5,0.52,67.0,1 +4,147.0,74,25,293.0,34.9,0.385,30.0,0 +5,99.0,54,28,83.0,34.0,0.499,30.0,0 +6,124.0,72,0,,27.6,0.368,29.0,1 +0,101.0,64,17,,21.0,0.252,21.0,0 +3,81.0,86,16,66.0,27.5,0.306,22.0,0 +1,133.0,102,28,140.0,32.8,0.23399999999999999,45.0,1 +3,173.0,82,48,465.0,38.4,2.137,25.0,1 +0,118.0,64,23,89.0,,1.7309999999999999,21.0,0 +0,84.0,64,22,66.0,35.8,0.545,21.0,0 +2,105.0,58,40,94.0,34.9,0.225,25.0,0 +2,122.0,52,43,158.0,36.2,0.816,28.0,0 +12,140.0,82,43,325.0,39.2,0.528,58.0,1 +0,98.0,82,15,84.0,25.2,0.299,22.0,0 +1,87.0,60,37,75.0,37.2,0.509,22.0,0 +4,156.0,75,0,,48.3,0.23800000000000002,32.0,1 +0,93.0,100,39,72.0,43.4,1.021,35.0,0 +1,107.0,72,30,82.0,30.8,0.821,24.0,0 +0,105.0,68,22,,20.0,0.23600000000000002,22.0,0 +1,109.0,60,8,182.0,25.4,0.9470000000000001,21.0,0 +1,90.0,62,18,59.0,25.1,1.268,25.0,0 +1,125.0,70,24,110.0,24.3,0.221,25.0,0 +1,119.0,54,13,50.0,22.3,0.205,24.0,0 +5,116.0,74,29,,32.3,0.66,35.0,1 +8,105.0,100,36,,43.3,0.239,45.0,1 +5,144.0,82,26,285.0,32.0,0.452,58.0,1 +3,100.0,68,23,81.0,31.6,0.9490000000000001,28.0,0 +1,100.0,66,29,196.0,32.0,0.444,42.0,0 +5,166.0,76,0,,45.7,0.34,27.0,1 +1,131.0,64,14,415.0,23.7,0.389,21.0,0 +4,116.0,72,12,87.0,22.1,0.46299999999999997,37.0,0 +4,158.0,78,0,,32.9,0.8029999999999999,31.0,1 +2,127.0,58,24,275.0,27.7,1.6,25.0,0 +3,96.0,56,34,115.0,24.7,0.9440000000000001,39.0,0 +0,131.0,66,40,,34.3,0.196,22.0,1 +3,82.0,70,0,,21.1,0.389,25.0,0 +3,193.0,70,31,,34.9,0.24100000000000002,25.0,1 +4,95.0,64,0,,32.0,0.161,31.0,1 +6,137.0,61,0,,24.2,0.151,55.0,0 +5,136.0,84,41,88.0,35.0,0.28600000000000003,35.0,1 +9,72.0,78,25,,31.6,0.28,38.0,0 +5,168.0,64,0,,32.9,0.135,41.0,1 +2,123.0,48,32,165.0,42.1,0.52,26.0,0 +4,115.0,72,0,,28.9,0.376,46.0,1 +0,101.0,62,0,,21.9,0.336,25.0,0 +8,197.0,74,0,,25.9,1.1909999999999998,39.0,1 +1,172.0,68,49,579.0,42.4,0.7020000000000001,28.0,1 +6,102.0,90,39,,35.7,0.674,28.0,0 +1,112.0,72,30,176.0,34.4,0.528,25.0,0 +1,143.0,84,23,310.0,42.4,1.0759999999999998,22.0,0 +1,143.0,74,22,61.0,26.2,0.256,21.0,0 +0,138.0,60,35,167.0,34.6,0.534,21.0,1 +3,173.0,84,33,474.0,35.7,0.258,22.0,1 +1,97.0,68,21,,27.2,1.095,22.0,0 +4,144.0,82,32,,38.5,0.5539999999999999,37.0,1 +1,83.0,68,0,,18.2,0.624,27.0,0 +3,129.0,64,29,115.0,26.4,0.21899999999999997,28.0,1 +1,119.0,88,41,170.0,45.3,0.507,26.0,0 +2,94.0,68,18,76.0,26.0,0.561,21.0,0 +0,102.0,64,46,78.0,40.6,0.496,21.0,0 +2,115.0,64,22,,30.8,0.42100000000000004,21.0,0 +8,151.0,78,32,210.0,42.9,0.516,36.0,1 +4,184.0,78,39,277.0,37.0,0.264,31.0,1 +0,94.0,0,0,,,0.256,25.0,0 +1,181.0,64,30,180.0,34.1,0.32799999999999996,38.0,1 +0,135.0,94,46,145.0,40.6,0.284,26.0,0 +1,95.0,82,25,180.0,35.0,0.233,43.0,1 +2,99.0,0,0,,22.2,0.10800000000000001,23.0,0 +3,89.0,74,16,85.0,30.4,0.551,38.0,0 +1,80.0,74,11,60.0,30.0,0.527,22.0,0 +2,139.0,75,0,,25.6,0.16699999999999998,29.0,0 +1,90.0,68,8,,24.5,1.138,36.0,0 +0,141.0,0,0,,42.4,0.205,29.0,1 +12,140.0,85,33,,37.4,0.244,41.0,0 +5,147.0,75,0,,29.9,0.434,28.0,0 +1,97.0,70,15,,18.2,0.147,21.0,0 +6,107.0,88,0,,36.8,0.727,31.0,0 +0,189.0,104,25,,34.3,0.435,41.0,1 +2,83.0,66,23,50.0,32.2,0.49700000000000005,22.0,0 +4,117.0,64,27,120.0,33.2,0.23,24.0,0 +8,108.0,70,0,,30.5,0.955,33.0,1 +4,117.0,62,12,,29.7,0.38,30.0,1 +0,180.0,78,63,14.0,59.4,2.42,25.0,1 +1,100.0,72,12,70.0,25.3,0.6579999999999999,28.0,0 +0,95.0,80,45,92.0,36.5,0.33,26.0,0 +0,104.0,64,37,64.0,33.6,0.51,22.0,1 +0,120.0,74,18,63.0,30.5,0.285,26.0,0 +1,82.0,64,13,95.0,21.2,0.415,23.0,0 +2,134.0,70,0,,28.9,0.542,23.0,1 +0,91.0,68,32,210.0,39.9,0.381,25.0,0 +2,119.0,0,0,,19.6,0.8320000000000001,72.0,0 +2,100.0,54,28,105.0,37.8,0.498,24.0,0 +14,175.0,62,30,,33.6,0.212,38.0,1 +1,135.0,54,0,,26.7,0.687,62.0,0 +5,86.0,68,28,71.0,30.2,0.364,24.0,0 +10,148.0,84,48,237.0,37.6,1.001,51.0,1 +9,134.0,74,33,60.0,25.9,0.46,81.0,0 +9,120.0,72,22,56.0,20.8,0.733,48.0,0 +1,71.0,62,0,,21.8,0.41600000000000004,26.0,0 +8,74.0,70,40,49.0,35.3,0.705,39.0,0 +5,88.0,78,30,,27.6,0.258,37.0,0 +10,115.0,98,0,,24.0,1.022,34.0,0 +0,124.0,56,13,105.0,21.8,0.452,21.0,0 +0,74.0,52,10,36.0,27.8,0.26899999999999996,22.0,0 +0,97.0,64,36,100.0,36.8,0.6,25.0,0 +8,120.0,0,0,,30.0,0.183,38.0,1 +6,154.0,78,41,140.0,46.1,0.5710000000000001,27.0,0 +1,144.0,82,40,,41.3,0.607,28.0,0 +0,137.0,70,38,,33.2,0.17,22.0,0 +0,119.0,66,27,,38.8,0.259,22.0,0 +7,136.0,90,0,,29.9,0.21,50.0,0 +4,114.0,64,0,,28.9,0.126,24.0,0 +0,137.0,84,27,,27.3,0.231,59.0,0 +2,105.0,80,45,191.0,33.7,0.711,29.0,1 +7,114.0,76,17,110.0,23.8,0.466,31.0,0 +8,126.0,74,38,75.0,25.9,0.162,39.0,0 +4,132.0,86,31,,28.0,0.419,63.0,0 +3,158.0,70,30,328.0,35.5,0.344,35.0,1 +0,123.0,88,37,,35.2,0.19699999999999998,29.0,0 +4,85.0,58,22,49.0,27.8,0.306,28.0,0 +0,84.0,82,31,125.0,38.2,0.233,23.0,0 +0,145.0,0,0,,44.2,0.63,31.0,1 +0,135.0,68,42,250.0,42.3,0.365,24.0,1 +1,139.0,62,41,480.0,40.7,0.536,21.0,0 +0,173.0,78,32,265.0,46.5,1.159,58.0,0 +4,99.0,72,17,,25.6,0.294,28.0,0 +8,194.0,80,0,,26.1,0.551,67.0,0 +2,83.0,65,28,66.0,36.8,0.629,24.0,0 +2,89.0,90,30,,33.5,0.292,42.0,0 +4,99.0,68,38,,32.8,0.145,33.0,0 +4,125.0,70,18,122.0,28.9,1.1440000000000001,45.0,1 +3,80.0,0,0,,,0.174,22.0,0 +6,166.0,74,0,,26.6,0.304,66.0,0 +5,110.0,68,0,,26.0,0.292,30.0,0 +2,81.0,72,15,76.0,30.1,0.547,25.0,0 +7,195.0,70,33,145.0,25.1,0.163,55.0,1 +6,154.0,74,32,193.0,29.3,0.8390000000000001,39.0,0 +2,117.0,90,19,71.0,25.2,0.313,21.0,0 +3,84.0,72,32,,37.2,0.267,28.0,0 +6,,68,41,,39.0,0.727,41.0,1 +7,94.0,64,25,79.0,33.3,0.738,41.0,0 +3,96.0,78,39,,37.3,0.23800000000000002,40.0,0 +10,75.0,82,0,,33.3,0.263,38.0,0 +0,180.0,90,26,90.0,36.5,0.314,35.0,1 +1,130.0,60,23,170.0,28.6,0.6920000000000001,21.0,0 +2,84.0,50,23,76.0,30.4,0.968,21.0,0 +8,120.0,78,0,,25.0,0.409,64.0,0 +12,84.0,72,31,,29.7,0.297,46.0,1 +0,139.0,62,17,210.0,22.1,0.207,21.0,0 +9,91.0,68,0,,24.2,0.2,58.0,0 +2,91.0,62,0,,27.3,0.525,22.0,0 +3,99.0,54,19,86.0,25.6,0.154,24.0,0 +3,163.0,70,18,105.0,31.6,0.268,28.0,1 +9,145.0,88,34,165.0,30.3,0.7709999999999999,53.0,1 +7,125.0,86,0,,37.6,0.304,51.0,0 +13,76.0,60,0,,32.8,0.18,41.0,0 +6,129.0,90,7,326.0,19.6,0.5820000000000001,60.0,0 +2,68.0,70,32,66.0,25.0,0.187,25.0,0 +3,124.0,80,33,130.0,33.2,0.305,26.0,0 +6,114.0,0,0,,,0.18899999999999997,26.0,0 +9,130.0,70,0,,34.2,0.652,45.0,1 +3,125.0,58,0,,31.6,0.151,24.0,0 +3,87.0,60,18,,21.8,0.444,21.0,0 +1,97.0,64,19,82.0,18.2,0.299,21.0,0 +3,116.0,74,15,105.0,26.3,0.107,24.0,0 +0,117.0,66,31,188.0,30.8,0.493,22.0,0 +0,111.0,65,0,,24.6,0.66,31.0,0 +2,122.0,60,18,106.0,29.8,0.7170000000000001,22.0,0 +0,107.0,76,0,,45.3,0.6859999999999999,24.0,0 +1,86.0,66,52,65.0,41.3,0.917,29.0,0 +6,91.0,0,0,,29.8,0.501,31.0,0 +1,77.0,56,30,56.0,33.3,1.251,24.0,0 +4,132.0,0,0,,32.9,0.302,23.0,1 +0,105.0,90,0,,29.6,0.19699999999999998,46.0,0 +0,57.0,60,0,,21.7,0.735,67.0,0 +0,127.0,80,37,210.0,36.3,0.804,23.0,0 +3,129.0,92,49,155.0,36.4,0.968,32.0,1 +8,100.0,74,40,215.0,39.4,0.6609999999999999,43.0,1 +3,128.0,72,25,190.0,32.4,0.5489999999999999,27.0,1 +10,90.0,85,32,,34.9,0.825,56.0,1 +4,84.0,90,23,56.0,39.5,0.159,25.0,0 +1,88.0,78,29,76.0,32.0,0.365,29.0,0 +8,186.0,90,35,225.0,34.5,0.423,37.0,1 +5,187.0,76,27,207.0,43.6,1.034,53.0,1 +4,131.0,68,21,166.0,33.1,0.16,28.0,0 +1,164.0,82,43,67.0,32.8,0.341,50.0,0 +4,189.0,110,31,,28.5,0.68,37.0,0 +1,116.0,70,28,,27.4,0.204,21.0,0 +3,84.0,68,30,106.0,31.9,0.591,25.0,0 +6,114.0,88,0,,27.8,0.247,66.0,0 +1,88.0,62,24,44.0,29.9,0.42200000000000004,23.0,0 +1,84.0,64,23,115.0,36.9,0.47100000000000003,28.0,0 +7,124.0,70,33,215.0,25.5,0.161,37.0,0 +1,97.0,70,40,,38.1,0.218,30.0,0 +8,110.0,76,0,,27.8,0.237,58.0,0 +11,103.0,68,40,,46.2,0.126,42.0,0 +11,85.0,74,0,,30.1,0.3,35.0,0 +6,125.0,76,0,,33.8,0.121,54.0,1 +0,198.0,66,32,274.0,41.3,0.502,28.0,1 +1,87.0,68,34,77.0,37.6,0.401,24.0,0 +6,99.0,60,19,54.0,26.9,0.49700000000000005,32.0,0 +0,91.0,80,0,,32.4,0.601,27.0,0 +2,95.0,54,14,88.0,26.1,0.748,22.0,0 +1,99.0,72,30,18.0,38.6,0.41200000000000003,21.0,0 +6,92.0,62,32,126.0,32.0,0.085,46.0,0 +4,154.0,72,29,126.0,31.3,0.33799999999999997,37.0,0 +0,121.0,66,30,165.0,34.3,0.203,33.0,1 +3,78.0,70,0,,32.5,0.27,39.0,0 +2,130.0,96,0,,22.6,0.268,21.0,0 +3,111.0,58,31,44.0,29.5,0.43,22.0,0 +2,98.0,60,17,120.0,34.7,0.198,22.0,0 +1,143.0,86,30,330.0,30.1,0.892,23.0,0 +1,119.0,44,47,63.0,35.5,0.28,25.0,0 +6,108.0,44,20,130.0,24.0,0.813,35.0,0 +2,118.0,80,0,,42.9,0.693,21.0,1 +10,133.0,68,0,,27.0,0.245,36.0,0 +2,197.0,70,99,,34.7,0.575,62.0,1 +0,151.0,90,46,,42.1,0.371,21.0,1 +6,109.0,60,27,,25.0,0.20600000000000002,27.0,0 +12,121.0,78,17,,26.5,0.259,62.0,0 +8,100.0,76,0,,38.7,0.19,42.0,0 +8,124.0,76,24,600.0,28.7,0.687,52.0,1 +1,93.0,56,11,,22.5,0.41700000000000004,22.0,0 +8,143.0,66,0,,34.9,0.129,41.0,1 +6,103.0,66,0,,24.3,0.249,29.0,0 +3,176.0,86,27,156.0,33.3,1.1540000000000001,52.0,1 +0,73.0,0,0,,21.1,0.342,25.0,0 +11,111.0,84,40,,46.8,0.925,45.0,1 +2,112.0,78,50,140.0,39.4,0.175,24.0,0 +3,132.0,80,0,,34.4,0.402,44.0,1 +2,82.0,52,22,115.0,28.5,1.699,25.0,0 +6,123.0,72,45,230.0,33.6,0.733,34.0,0 +0,188.0,82,14,185.0,32.0,0.682,22.0,1 +0,67.0,76,0,,45.3,0.19399999999999998,46.0,0 +1,89.0,24,19,25.0,27.8,0.5589999999999999,21.0,0 +1,173.0,74,0,,36.8,0.08800000000000001,38.0,1 +1,109.0,38,18,120.0,23.1,0.40700000000000003,26.0,0 +1,108.0,88,19,,27.1,0.4,24.0,0 +6,96.0,0,0,,23.7,0.19,28.0,0 +1,124.0,74,36,,27.8,0.1,30.0,0 +7,150.0,78,29,126.0,35.2,0.6920000000000001,54.0,1 +4,183.0,0,0,,28.4,0.212,36.0,1 +1,124.0,60,32,,35.8,0.514,21.0,0 +1,181.0,78,42,293.0,40.0,1.258,22.0,1 +1,92.0,62,25,41.0,19.5,0.48200000000000004,25.0,0 +0,152.0,82,39,272.0,41.5,0.27,27.0,0 +1,111.0,62,13,182.0,24.0,0.138,23.0,0 +3,106.0,54,21,158.0,30.9,0.292,24.0,0 +3,174.0,58,22,194.0,32.9,0.593,36.0,1 +7,168.0,88,42,321.0,38.2,0.787,40.0,1 +6,105.0,80,28,,32.5,0.878,26.0,0 +11,138.0,74,26,144.0,36.1,0.557,50.0,1 +3,106.0,72,0,,25.8,0.207,27.0,0 +6,117.0,96,0,,28.7,0.157,30.0,0 +2,68.0,62,13,15.0,20.1,0.257,23.0,0 +9,112.0,82,24,,28.2,1.2819999999999998,50.0,1 +0,119.0,0,0,,32.4,0.141,24.0,1 +2,112.0,86,42,160.0,38.4,0.24600000000000002,28.0,0 +2,92.0,76,20,,24.2,1.6980000000000002,28.0,0 +6,183.0,94,0,,40.8,1.4609999999999999,45.0,0 +0,94.0,70,27,115.0,43.5,0.34700000000000003,21.0,0 +2,108.0,64,0,,30.8,0.158,21.0,0 +4,90.0,88,47,54.0,37.7,0.36200000000000004,29.0,0 +0,125.0,68,0,,24.7,0.20600000000000002,21.0,0 +0,132.0,78,0,,32.4,0.39299999999999996,21.0,0 +5,128.0,80,0,,34.6,0.14400000000000002,45.0,0 +4,94.0,65,22,,24.7,0.14800000000000002,21.0,0 +7,114.0,64,0,,27.4,0.732,34.0,1 +0,102.0,78,40,90.0,34.5,0.23800000000000002,24.0,0 +2,111.0,60,0,,26.2,0.34299999999999997,23.0,0 +1,128.0,82,17,183.0,27.5,0.115,22.0,0 +10,92.0,62,0,,25.9,0.16699999999999998,31.0,0 +13,104.0,72,0,,31.2,0.465,38.0,1 +5,104.0,74,0,,28.8,0.153,48.0,0 +2,94.0,76,18,66.0,31.6,0.649,23.0,0 +7,97.0,76,32,91.0,40.9,0.871,32.0,1 +1,100.0,74,12,46.0,19.5,0.149,28.0,0 +0,102.0,86,17,105.0,29.3,0.695,27.0,0 +4,128.0,70,0,,34.3,0.303,24.0,0 +6,147.0,80,0,,29.5,0.17800000000000002,50.0,1 +4,90.0,0,0,,28.0,0.61,31.0,0 +3,103.0,72,30,152.0,27.6,0.73,27.0,0 +2,157.0,74,35,440.0,39.4,0.134,30.0,0 +1,167.0,74,17,144.0,23.4,0.447,33.0,1 +0,179.0,50,36,159.0,37.8,0.455,22.0,1 +11,136.0,84,35,130.0,28.3,0.26,42.0,1 +0,107.0,60,25,,26.4,0.133,23.0,0 +1,91.0,54,25,100.0,25.2,0.23399999999999999,23.0,0 +1,117.0,60,23,106.0,33.8,0.466,27.0,0 +5,123.0,74,40,77.0,34.1,0.26899999999999996,28.0,0 +2,120.0,54,0,,26.8,0.455,27.0,0 +1,106.0,70,28,135.0,34.2,0.142,22.0,0 +2,155.0,52,27,540.0,38.7,0.24,25.0,1 +2,101.0,58,35,90.0,21.8,0.155,22.0,0 +1,120.0,80,48,200.0,38.9,1.162,41.0,0 +11,127.0,106,0,,39.0,0.19,51.0,0 +3,80.0,82,31,70.0,34.2,1.2919999999999998,27.0,1 +10,162.0,84,0,,27.7,0.182,54.0,0 +1,199.0,76,43,,42.9,1.3940000000000001,22.0,1 +8,167.0,106,46,231.0,37.6,0.165,43.0,1 +9,145.0,80,46,130.0,37.9,0.637,40.0,1 +6,115.0,60,39,,33.7,0.245,40.0,1 +1,112.0,80,45,132.0,34.8,0.217,24.0,0 +4,145.0,82,18,,32.5,0.235,70.0,1 +10,111.0,70,27,,27.5,0.141,40.0,1 +6,98.0,58,33,190.0,34.0,0.43,43.0,0 +9,154.0,78,30,100.0,30.9,0.16399999999999998,45.0,0 +6,165.0,68,26,168.0,33.6,0.631,49.0,0 +1,99.0,58,10,,25.4,0.551,21.0,0 +10,68.0,106,23,49.0,35.5,0.285,47.0,0 +3,123.0,100,35,240.0,57.3,0.88,22.0,0 +8,91.0,82,0,,35.6,0.5870000000000001,68.0,0 +6,195.0,70,0,,30.9,0.32799999999999996,31.0,1 +9,156.0,86,0,,24.8,0.23,53.0,1 +0,93.0,60,0,,35.3,0.263,25.0,0 +3,121.0,52,0,,36.0,0.127,25.0,1 +2,101.0,58,17,265.0,24.2,0.614,23.0,0 +2,56.0,56,28,45.0,24.2,0.332,22.0,0 +0,162.0,76,36,,49.6,0.364,26.0,1 +0,95.0,64,39,105.0,44.6,0.366,22.0,0 +4,125.0,80,0,,32.3,0.536,27.0,1 +5,136.0,82,0,,,0.64,69.0,0 +2,129.0,74,26,205.0,33.2,0.591,25.0,0 +3,130.0,64,0,,23.1,0.314,22.0,0 +1,107.0,50,19,,28.3,0.18100000000000002,29.0,0 +1,140.0,74,26,180.0,24.1,0.828,23.0,0 +1,144.0,82,46,180.0,46.1,0.335,46.0,1 +8,107.0,80,0,,24.6,0.856,34.0,0 +13,158.0,114,0,,42.3,0.257,44.0,1 +2,121.0,70,32,95.0,39.1,0.8859999999999999,23.0,0 +7,129.0,68,49,125.0,38.5,0.439,43.0,1 +2,90.0,60,0,,23.5,0.191,25.0,0 +7,142.0,90,24,480.0,30.4,0.128,43.0,1 +3,169.0,74,19,125.0,29.9,0.268,31.0,1 +0,99.0,0,0,,25.0,0.253,22.0,0 +4,127.0,88,11,155.0,34.5,0.598,28.0,0 +4,118.0,70,0,,44.5,0.904,26.0,0 +2,122.0,76,27,200.0,35.9,0.483,26.0,0 +6,125.0,78,31,,27.6,0.565,49.0,1 +1,168.0,88,29,,35.0,0.905,52.0,1 +2,129.0,0,0,,38.5,0.304,41.0,0 +4,110.0,76,20,100.0,28.4,0.11800000000000001,27.0,0 +6,80.0,80,36,,39.8,0.177,28.0,0 +10,115.0,0,0,,,0.261,30.0,1 +2,127.0,46,21,335.0,34.4,0.17600000000000002,22.0,0 +9,164.0,78,0,,32.8,0.14800000000000002,45.0,1 +2,93.0,64,32,160.0,38.0,0.674,23.0,1 +3,158.0,64,13,387.0,31.2,0.295,24.0,0 +5,126.0,78,27,22.0,29.6,0.439,40.0,0 +10,129.0,62,36,,41.2,0.441,38.0,1 +0,134.0,58,20,291.0,26.4,0.35200000000000004,21.0,0 +3,102.0,74,0,,29.5,0.121,32.0,0 +7,187.0,50,33,392.0,33.9,0.826,34.0,1 +3,173.0,78,39,185.0,33.8,0.97,31.0,1 +10,94.0,72,18,,23.1,0.595,56.0,0 +1,108.0,60,46,178.0,35.5,0.415,24.0,0 +5,97.0,76,27,,35.6,0.37799999999999995,52.0,1 +4,83.0,86,19,,29.3,0.317,34.0,0 +1,114.0,66,36,200.0,38.1,0.289,21.0,0 +1,149.0,68,29,127.0,29.3,0.349,42.0,1 +5,117.0,86,30,105.0,39.1,0.251,42.0,0 +1,111.0,94,0,,32.8,0.265,45.0,0 +4,112.0,78,40,,39.4,0.23600000000000002,38.0,0 +1,116.0,78,29,180.0,36.1,0.496,25.0,0 +0,141.0,84,26,,32.4,0.433,22.0,0 +2,175.0,88,0,,22.9,0.326,22.0,0 +2,92.0,52,0,,30.1,0.141,22.0,0 +3,130.0,78,23,79.0,28.4,0.32299999999999995,34.0,1 +8,120.0,86,0,,28.4,0.259,22.0,1 +2,174.0,88,37,120.0,44.5,0.6459999999999999,24.0,1 +2,106.0,56,27,165.0,29.0,0.426,22.0,0 +2,105.0,75,0,,23.3,0.56,53.0,0 +4,95.0,60,32,,35.4,0.284,28.0,0 +0,126.0,86,27,120.0,27.4,0.515,21.0,0 +8,65.0,72,23,,32.0,0.6,42.0,0 +2,99.0,60,17,160.0,36.6,0.45299999999999996,21.0,0 +1,102.0,74,0,,39.5,0.293,42.0,1 +11,120.0,80,37,150.0,42.3,0.785,48.0,1 +3,102.0,44,20,94.0,30.8,0.4,26.0,0 +1,109.0,58,18,116.0,28.5,0.21899999999999997,22.0,0 +9,140.0,94,0,,32.7,0.7340000000000001,45.0,1 +13,153.0,88,37,140.0,40.6,1.1740000000000002,39.0,0 +12,100.0,84,33,105.0,30.0,0.488,46.0,0 +1,147.0,94,41,,49.3,0.358,27.0,1 +1,81.0,74,41,57.0,46.3,1.0959999999999999,32.0,0 +3,187.0,70,22,200.0,36.4,0.408,36.0,1 +6,162.0,62,0,,24.3,0.17800000000000002,50.0,1 +4,136.0,70,0,,31.2,1.182,22.0,1 +1,121.0,78,39,74.0,39.0,0.261,28.0,0 +3,108.0,62,24,,26.0,0.223,25.0,0 +0,181.0,88,44,510.0,43.3,0.222,26.0,1 +8,154.0,78,32,,32.4,0.44299999999999995,45.0,1 +1,128.0,88,39,110.0,36.5,1.057,37.0,1 +7,137.0,90,41,,32.0,0.391,39.0,0 +0,123.0,72,0,,36.3,0.258,52.0,1 +1,106.0,76,0,,37.5,0.19699999999999998,26.0,0 +6,190.0,92,0,,35.5,0.278,66.0,1 +2,88.0,58,26,16.0,28.4,0.7659999999999999,22.0,0 +9,170.0,74,31,,44.0,0.40299999999999997,43.0,1 +9,89.0,62,0,,22.5,0.142,33.0,0 +10,101.0,76,48,180.0,32.9,0.171,63.0,0 +2,122.0,70,27,,36.8,0.34,27.0,0 +5,121.0,72,23,112.0,26.2,0.245,30.0,0 +1,126.0,60,0,,30.1,0.349,47.0,1 +1,93.0,70,31,,30.4,0.315,23.0,0 diff --git a/Topic06/LogisticReg-ModelFitting.ipynb b/Topic06/LogisticReg-ModelFitting.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..5685f334dc569847a4bee70d99350e8ad84903b3 --- /dev/null +++ b/Topic06/LogisticReg-ModelFitting.ipynb @@ -0,0 +1,160 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Load Input Data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd \n", + "\n", + "# Loading the diabetes dataset \n", + "data = pd.read_csv('Diabetes.csv')\n", + "# Remove rows that contain missing values\n", + "data = data.dropna()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "X = data[['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',\n", + " 'BMI', 'DiabetesPedigreeFunction', 'Age']]\n", + "\n", + "y = data['Outcome']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "X.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Logistic Regression using SKLearn" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.linear_model import LogisticRegression\n", + "\n", + "clf = LogisticRegression(random_state=0, max_iter = 300).fit(X, y)\n", + "\n", + "# Display the coefficients\n", + "print(clf.coef_, clf.intercept_)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Logistic Regression using StatsModels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# importing libraries \n", + "import statsmodels.api as sm \n", + "\n", + "# building the model and fitting the data \n", + "log_reg = sm.Logit(y, X).fit() " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# printing the summary table \n", + "print(log_reg.summary()) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# printing the summary table \n", + "print(log_reg.summary2())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Explanation of some of the terms in the summary table:\n", + "\n", + "#### Coef: \n", + "The coefficients of the input variables in the regression equation (remember how to interpret them?).\n", + "#### Log-Likelihood: \n", + "The natural logarithm of the Maximum Likelihood Estimation (MLE) function. We mentioned previously that MLE is the optimisation process for finding the set of parameters which result in best fit.\n", + "#### LL-Null: \n", + "The value of log-likelihood of the model when no independent variable is included (only an intercept is included).\n", + "#### Pseudo R-squ.: \n", + "This is a substitute for the R-squared value in Least Squares linear regression. It is the ratio of the log-likelihood of the null model to that of the full model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Topic07/XGBoost.ipynb b/Topic07/XGBoost.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..40e14854e91a956b3b072813d2d1a9f17ff3edb3 --- /dev/null +++ b/Topic07/XGBoost.ipynb @@ -0,0 +1,176 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Import Libraries" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from xgboost import XGBClassifier\n", + "from sklearn import datasets\n", + "from xgboost import plot_importance\n", + "from matplotlib import pyplot" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# import warnings filter\n", + "from warnings import simplefilter\n", + "# ignore all future warnings\n", + "simplefilter(action='ignore', category=FutureWarning)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Load Iris Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# import iris dataset\n", + "iris = datasets.load_iris()\n", + "X = iris.data\n", + "y = iris.target" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", + " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", + " 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", + " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", + " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", + " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", + " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fit XGBoost Multi-class Classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# define model\n", + "model = XGBClassifier(objective= 'multi:softprob', use_label_encoder=False)\n", + "\n", + "# fit model\n", + "model.fit(X, y);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Extract Feature Importance" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Available importance_types = \n", + "# ['weight', 'gain', 'cover', 'total_gain', 'total_cover']\n", + "f = 'gain'\n", + "model.get_booster().get_score(importance_type= f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Plot Feature Importance" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot feature importance\n", + "plot_importance(model, importance_type='gain', show_values=False, xlabel='Gain')\n", + "pyplot.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot feature importance\n", + "plot_importance(model, importance_type='weight', show_values=False, xlabel='Weight')\n", + "pyplot.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Topic08/Customer Churn Preds - Imbalaced Data.ipynb b/Topic08/Customer Churn Preds - Imbalaced Data.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..d65616a52ea4d840050338e91ed7aee4eb860ef0 --- /dev/null +++ b/Topic08/Customer Churn Preds - Imbalaced Data.ipynb @@ -0,0 +1,326 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Customer Churn Preds .. Imbalaced Data\n", + "# Scenario: Imagine you have trained and fine-tuned your model and used it to make predictions\n", + "=========================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Import Libraries and Load Data\n", + "\n", + "## Customers that belong to class 0 are normal\n", + "## Customers that belong to class 1 require follow up" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "from sklearn.metrics import classification_report, confusion_matrix\n", + "import itertools\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# import warnings filter\n", + "from warnings import simplefilter\n", + "# ignore all future warnings\n", + "simplefilter(action='ignore', category=FutureWarning)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv(r'churn_preds.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Function to Plot Confusion Matrix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Reference: \n", + "# https://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html\n", + "def plot_confusion_matrix(cm, classes,\n", + " normalize=False,\n", + " title='Confusion matrix',\n", + " cmap=plt.cm.Blues):\n", + " \"\"\"\n", + " This function prints and plots the confusion matrix.\n", + " Normalization can be applied by setting `normalize=True`.\n", + " \"\"\"\n", + " if normalize:\n", + " cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n", + " #print(\"Normalized confusion matrix\")\n", + " #else:\n", + " # print('Confusion matrix, without normalization')\n", + "\n", + " #print(cm)\n", + "\n", + " plt.imshow(cm, interpolation='nearest', cmap=cmap)\n", + " plt.title(title)\n", + " plt.colorbar()\n", + " tick_marks = np.arange(len(classes))\n", + " plt.xticks(tick_marks, classes, rotation=45)\n", + " plt.yticks(tick_marks, classes)\n", + "\n", + " fmt = '.2f' if normalize else 'd'\n", + " thresh = cm.max() / 2.\n", + " for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n", + " plt.text(j, i, format(cm[i, j], fmt),\n", + " horizontalalignment=\"center\",\n", + " color=\"white\" if cm[i, j] > thresh else \"black\")\n", + "\n", + " plt.ylabel('True label')\n", + " plt.xlabel('Predicted label')\n", + " plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Remember: Class 1 is the class of interest (customers that require follow up)ΒΆ\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Create confusion matrix\n", + "cnf_matrix = confusion_matrix(df['Actual'], df['Predicted'],labels=[1,0])\n", + "\n", + "# Plot confusion matrix\n", + "plt.figure()\n", + "plot_confusion_matrix(cnf_matrix, classes=['Followup','Normal'],\n", + " title='Confusion Matrix')\n", + "print('Among the positive customers, the model predicted 106 of them correctly and mis-classified 53 as normal')\n", + "print('Among the negative customers, the model predicted 928 of them correctly and mis-classified 13 as positive')\n", + "print('===============')\n", + "# Plot confusion matrix\n", + "plt.figure()\n", + "plot_confusion_matrix(cnf_matrix, classes=['Followup','Normal'],\n", + " title='Confusion Matrix - Fraction', normalize=True)\n", + "print('When viewed as a percentage, the model missed 33% of positive customers and 1% are false alarms')\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot Actual, Predicted and Probability values" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "normal = df[df['Actual']==0]\n", + "followup = df[df['Actual']==1]\n", + "plt.figure()\n", + "plt.scatter(df.index,df['Actual'],label='actual')\n", + "plt.scatter(normal.index,normal['Predicted_Proba_Class1'],label='normal')\n", + "plt.scatter(followup.index,followup['Predicted_Proba_Class1'],label='followup')\n", + "plt.plot([df.index.min(),df.index.max()],[0.5,0.5],color='r')\n", + "plt.xlim(left=0)\n", + "plt.xlabel('Sample')\n", + "plt.ylabel('Predicted Probability')\n", + "plt.title('Followup / Normal')\n", + "plt.legend(loc=0)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* The model has done a decent job with negative customers\n", + "* However, there are lots of positive customers with a probability < 0.5 and the model is classifying them as negative\n", + "\n", + "#### One approach to improve Recall is to lower the threshold so we can identify more positive customers\n", + "* Let's say every customer that needs to be followed up has some cost associated with it (say ```$10```)\n", + "* We can ignore true negatives as no action is needed with them\n", + "* False negatives can be highly costly as it's a missed opportuinty to address some customer concern or an issue raised by the customer\n", + "* Let's say that cost is ```$50 ```\n", + "\n", + "\n", + "#### Finding the optimal cutoff\n", + "\n", + "```txt\n", + "$50 * FN(C) + $0 * TN(C) + $10 * FP(C) + $10 * TP(C)\n", + "```\n", + "\n", + "FN(C) means that the false negative percentage is a function of the cutoff, C, and similar for TN, FP, and TP. We need to find the cutoff, C, where the result of the expression is smallest.\n", + "\n", + "A straightforward way to do this, is to simply run a simulation over a large number of possible cutoffs. We test 100 possible values in the for loop below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pd.crosstab(index=df['Actual'],columns=np.where(df['Predicted_Proba_Class1'] > .5, 1, 0))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cutoffs = np.arange(0.1, .9, 0.01)\n", + "costs = []\n", + "for c in cutoffs:\n", + " costs.append(np.sum(np.sum(np.array([[0, 10], [50, 10]]) * \n", + " pd.crosstab(index=df['Actual'],columns=np.where(df['Predicted_Proba_Class1'] > c, 1, 0)))))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "costs = np.array(costs)\n", + "plt.plot(cutoffs, costs)\n", + "plt.ylabel('Cost')\n", + "plt.xlabel('Cutoff')\n", + "plt.show()\n", + "\n", + "print('Cost is minimized near a cutoff of:', cutoffs[np.argmin(costs)], 'for a cost of:', np.min(costs))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "normal = df[df['Actual']==0]\n", + "followup = df[df['Actual']==1]\n", + "plt.figure()\n", + "plt.scatter(df.index,df['Actual'],label='actual')\n", + "plt.scatter(normal.index,normal['Predicted_Proba_Class1'],label='normal')\n", + "plt.scatter(followup.index,followup['Predicted_Proba_Class1'],label='followup')\n", + "plt.plot([df.index.min(),df.index.max()+50],[cutoffs[np.argmin(costs)],cutoffs[np.argmin(costs)]],color='r',linewidth=3)\n", + "plt.xlim(left=0)\n", + "plt.xlabel('Sample')\n", + "plt.ylabel('Predicted Probability')\n", + "plt.title('Followup / Normal')\n", + "plt.legend(loc=0)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Compute confusion matrix\n", + "cnf_matrix = confusion_matrix(df['Actual'], np.where(df['Predicted_Proba_Class1'] > cutoffs[np.argmin(costs)], 1, 0),labels=[1,0])\n", + "\n", + "# Plot confusion matrix\n", + "plt.figure()\n", + "plot_confusion_matrix(cnf_matrix, classes=['Followup','Normal'],\n", + " title='Confusion Matrix at {0:0.2f}'.format(cutoffs[np.argmin(costs)]), normalize=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Compute confusion matrix\n", + "cnf_matrix = confusion_matrix(df['Actual'], np.where(df['Predicted_Proba_Class1'] > .5, 1, 0),labels=[1,0])\n", + "\n", + "# Plot confusion matrix\n", + "plt.figure()\n", + "plot_confusion_matrix(cnf_matrix, classes=['Followup','Normal'],\n", + " title='Confusion Matrix at 0.5', normalize=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### If you compare the two confusion matrices, we can now identify 79% of the positives compared to the 67% when cutoff was 0.5\n", + "\n", + "### For a classifier, finding the optimal cutoff based on business cost is a great approach" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Topic08/churn_preds.csv b/Topic08/churn_preds.csv new file mode 100644 index 0000000000000000000000000000000000000000..45b50032ac1ef1e3c7c2d62d48a0309735a83e8c --- /dev/null +++ b/Topic08/churn_preds.csv @@ -0,0 +1,1101 @@ +Actual,Predicted,Predicted_Proba_Class1 +0.0,0.0,0.013995248 +0.0,0.0,0.013041114 +1.0,1.0,0.64138925 +0.0,0.0,0.22187224 +0.0,0.0,0.022160767 +0.0,0.0,0.02183627 +1.0,1.0,0.54057413 +0.0,0.0,0.033372793 +1.0,0.0,0.029956082 +0.0,0.0,0.034430027 +0.0,0.0,0.043609258 +0.0,0.0,0.19053552 +1.0,0.0,0.02893574 +0.0,0.0,0.017650034 +0.0,0.0,0.020241395 +0.0,0.0,0.14628834 +0.0,0.0,0.010797155 +0.0,0.0,0.02058936 +0.0,0.0,0.023619745 +0.0,0.0,0.032502256 +0.0,0.0,0.02703347 +0.0,0.0,0.10959765 +0.0,0.0,0.0032179158 +1.0,0.0,0.03341475 +0.0,0.0,0.048238173 +0.0,0.0,0.041794766 +0.0,0.0,0.01820161 +0.0,0.0,0.014890576 +0.0,0.0,0.01682557 +0.0,0.0,0.03657127 +1.0,1.0,0.9891017 +0.0,0.0,0.029890815 +0.0,0.0,0.026391117 +0.0,1.0,0.6229261 +0.0,0.0,0.023851003 +0.0,0.0,0.0125598265 +0.0,0.0,0.08522868 +0.0,0.0,0.31489286 +0.0,0.0,0.24841045 +1.0,0.0,0.017165283 +0.0,0.0,0.22556153 +0.0,0.0,0.01563578 +0.0,0.0,0.016881738 +1.0,1.0,0.7662821 +0.0,0.0,0.016971009 +0.0,0.0,0.023612527 +0.0,0.0,0.091447055 +1.0,1.0,0.71958816 +0.0,0.0,0.05076159 +0.0,0.0,0.04714461 +0.0,0.0,0.026287308 +0.0,0.0,0.019600276 +0.0,0.0,0.08325401 +0.0,0.0,0.020905145 +0.0,0.0,0.028063131 +0.0,0.0,0.022938795 +0.0,0.0,0.020787872 +0.0,0.0,0.02655729 +0.0,0.0,0.08867734 +0.0,0.0,0.039441273 +1.0,1.0,0.8126975 +0.0,0.0,0.024536978 +0.0,0.0,0.033546556 +0.0,0.0,0.023941768 +0.0,0.0,0.1651439 +0.0,0.0,0.09379702 +0.0,0.0,0.02814728 +0.0,0.0,0.018716324 +0.0,0.0,0.03598925 +0.0,0.0,0.034932032 +0.0,0.0,0.021093061 +0.0,0.0,0.023739787 +0.0,0.0,0.03911059 +0.0,0.0,0.019304186 +0.0,0.0,0.18896069 +0.0,0.0,0.016391382 +0.0,0.0,0.22758618 +0.0,0.0,0.2728753 +0.0,0.0,0.03524826 +1.0,0.0,0.023435425 +0.0,1.0,0.6671327 +0.0,0.0,0.27963194 +0.0,0.0,0.24266504 +0.0,0.0,0.04572187 +1.0,1.0,0.57265604 +0.0,0.0,0.018409198 +0.0,0.0,0.040097013 +0.0,0.0,0.0142564075 +0.0,0.0,0.02058936 +0.0,0.0,0.023695135 +0.0,0.0,0.033117287 +0.0,0.0,0.07751435 +0.0,0.0,0.021858087 +0.0,0.0,0.09051634 +1.0,0.0,0.40479472 +0.0,0.0,0.11158981 +0.0,0.0,0.031535696 +0.0,0.0,0.061576594 +0.0,0.0,0.010481536 +0.0,0.0,0.0183793 +0.0,0.0,0.017857535 +0.0,0.0,0.02225527 +0.0,1.0,0.5411773 +0.0,0.0,0.02445614 +0.0,0.0,0.017893398 +0.0,0.0,0.023634903 +0.0,0.0,0.018014329 +0.0,0.0,0.017966816 +0.0,0.0,0.017760498 +0.0,0.0,0.015527334 +0.0,0.0,0.07593744 +1.0,1.0,0.9472786 +0.0,0.0,0.024039436 +0.0,0.0,0.039080136 +0.0,0.0,0.034862686 +0.0,0.0,0.03914927 +0.0,0.0,0.01616269 +0.0,0.0,0.095182955 +0.0,0.0,0.024766937 +0.0,0.0,0.059372563 +0.0,0.0,0.023447013 +0.0,0.0,0.01627966 +0.0,0.0,0.01622324 +0.0,0.0,0.023264822 +0.0,0.0,0.014309859 +0.0,0.0,0.46353585 +0.0,0.0,0.014031041 +0.0,0.0,0.42599854 +0.0,0.0,0.03249887 +0.0,0.0,0.094859265 +0.0,0.0,0.0042236485 +0.0,0.0,0.02618547 +0.0,0.0,0.017525561 +0.0,0.0,0.46190527 +0.0,0.0,0.045588665 +0.0,0.0,0.029337734 +0.0,0.0,0.0742371 +0.0,0.0,0.012432084 +0.0,0.0,0.02174814 +0.0,0.0,0.026038062 +0.0,0.0,0.037884492 +0.0,0.0,0.019849332 +0.0,0.0,0.06934387 +0.0,0.0,0.051128212 +1.0,1.0,0.76745677 +0.0,0.0,0.018521141 +0.0,0.0,0.024435109 +1.0,1.0,0.76306385 +0.0,0.0,0.013537351 +0.0,0.0,0.023360968 +0.0,0.0,0.025761282 +0.0,0.0,0.268481 +0.0,0.0,0.040385753 +1.0,0.0,0.27062896 +0.0,0.0,0.01648546 +0.0,0.0,0.009286039 +0.0,0.0,0.09536473 +0.0,0.0,0.016211128 +0.0,0.0,0.03905113 +0.0,0.0,0.03412229 +1.0,0.0,0.24012122 +0.0,0.0,0.016415263 +0.0,1.0,0.6494084 +0.0,0.0,0.12354284 +1.0,1.0,0.7257717 +0.0,0.0,0.02687448 +0.0,0.0,0.023559399 +0.0,0.0,0.033256046 +0.0,0.0,0.031614482 +0.0,0.0,0.026456237 +0.0,0.0,0.020464147 +0.0,0.0,0.015437498 +0.0,0.0,0.24636228 +0.0,0.0,0.03001646 +0.0,0.0,0.02256896 +0.0,0.0,0.039821398 +0.0,0.0,0.025346993 +0.0,0.0,0.036858827 +0.0,0.0,0.059446156 +0.0,0.0,0.018921945 +0.0,0.0,0.02001916 +0.0,0.0,0.05536426 +0.0,0.0,0.033791468 +0.0,0.0,0.15301599 +1.0,1.0,0.59322864 +0.0,0.0,0.108523674 +0.0,0.0,0.054830633 +0.0,0.0,0.07788137 +0.0,0.0,0.08728552 +0.0,0.0,0.026354238 +0.0,0.0,0.01681215 +1.0,1.0,0.8662422 +1.0,0.0,0.019020777 +0.0,0.0,0.021804882 +1.0,0.0,0.021371037 +1.0,0.0,0.28267345 +0.0,0.0,0.01218482 +0.0,0.0,0.020265155 +0.0,0.0,0.014569804 +0.0,0.0,0.056371186 +0.0,0.0,0.022100914 +0.0,0.0,0.06200991 +0.0,0.0,0.03847458 +0.0,0.0,0.052764308 +0.0,0.0,0.041293822 +0.0,0.0,0.008341898 +0.0,0.0,0.02316649 +0.0,0.0,0.08634426 +0.0,0.0,0.011700132 +0.0,0.0,0.029508043 +0.0,0.0,0.04520328 +0.0,0.0,0.031808514 +0.0,0.0,0.048528813 +0.0,0.0,0.018154036 +0.0,0.0,0.06410737 +0.0,0.0,0.16062564 +1.0,0.0,0.04787949 +0.0,0.0,0.029573843 +1.0,1.0,0.7586136 +1.0,0.0,0.34942415 +0.0,0.0,0.21961029 +1.0,1.0,0.76507694 +0.0,0.0,0.019181743 +0.0,1.0,0.6077871 +0.0,0.0,0.023869028 +0.0,0.0,0.015962468 +0.0,0.0,0.009009225 +0.0,0.0,0.016293557 +0.0,0.0,0.03510883 +0.0,0.0,0.09618947 +0.0,0.0,0.014742792 +0.0,0.0,0.011751831 +0.0,0.0,0.01767598 +0.0,0.0,0.023170415 +0.0,0.0,0.013133694 +1.0,1.0,0.63827974 +0.0,0.0,0.009666455 +0.0,0.0,0.15972729 +0.0,0.0,0.02242357 +0.0,0.0,0.03978421 +0.0,0.0,0.019208083 +0.0,0.0,0.010005892 +0.0,0.0,0.021498865 +0.0,0.0,0.13479932 +0.0,0.0,0.016613474 +1.0,1.0,0.9353009 +0.0,0.0,0.01893662 +0.0,0.0,0.028298913 +0.0,0.0,0.0147347255 +0.0,0.0,0.023984628 +1.0,1.0,0.6774097 +0.0,1.0,0.5984942 +0.0,0.0,0.014592525 +0.0,0.0,0.017922087 +0.0,0.0,0.028811598 +0.0,0.0,0.02748829 +0.0,0.0,0.053905696 +0.0,0.0,0.06055982 +0.0,0.0,0.026151562 +1.0,0.0,0.015741047 +0.0,0.0,0.023264822 +0.0,0.0,0.14337894 +0.0,1.0,0.5789938 +0.0,0.0,0.016257033 +0.0,0.0,0.24495341 +0.0,0.0,0.028801275 +1.0,1.0,0.8773699 +0.0,0.0,0.030120376 +0.0,0.0,0.026965119 +0.0,0.0,0.020779006 +0.0,0.0,0.19504978 +0.0,0.0,0.012185842 +1.0,1.0,0.71507907 +0.0,0.0,0.019237196 +0.0,0.0,0.12410144 +1.0,1.0,0.73834205 +0.0,0.0,0.023923919 +0.0,0.0,0.06678667 +0.0,0.0,0.014911342 +0.0,0.0,0.1262147 +0.0,0.0,0.0117510725 +0.0,0.0,0.014681945 +1.0,1.0,0.7522529 +1.0,0.0,0.03470518 +0.0,0.0,0.041382276 +0.0,0.0,0.41231593 +0.0,0.0,0.32856327 +1.0,1.0,0.9398797 +0.0,0.0,0.017971192 +0.0,0.0,0.14099994 +0.0,0.0,0.022306215 +1.0,0.0,0.014168336 +0.0,0.0,0.05204912 +0.0,0.0,0.010063236 +0.0,0.0,0.026269587 +0.0,0.0,0.42691255 +1.0,1.0,0.84997153 +0.0,0.0,0.033540975 +0.0,0.0,0.030472336 +0.0,0.0,0.46821368 +0.0,0.0,0.034881145 +0.0,0.0,0.0176809 +0.0,0.0,0.016548062 +0.0,0.0,0.016330618 +0.0,0.0,0.05775067 +0.0,0.0,0.038362164 +0.0,0.0,0.013859326 +0.0,0.0,0.017080097 +1.0,0.0,0.030047227 +0.0,0.0,0.020917643 +1.0,1.0,0.7040241 +1.0,1.0,0.82896364 +0.0,0.0,0.006984111 +0.0,0.0,0.046287566 +0.0,0.0,0.018374307 +0.0,0.0,0.025771068 +0.0,0.0,0.014909634 +1.0,0.0,0.08232964 +0.0,0.0,0.017847227 +0.0,0.0,0.047664955 +0.0,0.0,0.040231958 +0.0,0.0,0.025383683 +0.0,0.0,0.04077143 +0.0,0.0,0.056601275 +0.0,0.0,0.018694166 +0.0,0.0,0.21651982 +0.0,0.0,0.035923164 +0.0,0.0,0.020617248 +0.0,0.0,0.090322845 +0.0,0.0,0.02928489 +0.0,0.0,0.14996831 +0.0,0.0,0.024585068 +0.0,0.0,0.10613382 +0.0,0.0,0.027517598 +0.0,0.0,0.03230854 +0.0,0.0,0.038874295 +0.0,0.0,0.01545597 +0.0,0.0,0.041414674 +0.0,0.0,0.06584226 +0.0,0.0,0.14924297 +0.0,0.0,0.03470518 +0.0,0.0,0.018367639 +0.0,0.0,0.2867633 +0.0,0.0,0.04966938 +0.0,0.0,0.026902797 +0.0,0.0,0.020785179 +1.0,1.0,0.7481281 +0.0,0.0,0.014965526 +0.0,0.0,0.110164255 +0.0,0.0,0.022962863 +0.0,0.0,0.03172841 +0.0,0.0,0.013594013 +0.0,0.0,0.03266775 +0.0,0.0,0.01610524 +0.0,0.0,0.008104403 +0.0,0.0,0.025901848 +0.0,0.0,0.05171712 +0.0,0.0,0.015520244 +1.0,0.0,0.34846467 +0.0,0.0,0.016423533 +0.0,0.0,0.096337125 +0.0,0.0,0.026555955 +0.0,0.0,0.08010879 +0.0,0.0,0.0071596187 +0.0,0.0,0.050294723 +0.0,0.0,0.07339502 +0.0,0.0,0.011503967 +0.0,0.0,0.018407337 +0.0,0.0,0.08329938 +0.0,0.0,0.045137886 +1.0,1.0,0.98297256 +0.0,0.0,0.09277184 +1.0,1.0,0.7545738 +0.0,0.0,0.019461662 +0.0,0.0,0.019975666 +1.0,0.0,0.3667102 +1.0,0.0,0.008245072 +0.0,0.0,0.015909072 +0.0,0.0,0.25487888 +0.0,0.0,0.03263471 +0.0,0.0,0.16114527 +0.0,0.0,0.020789467 +0.0,0.0,0.017656691 +0.0,0.0,0.0474314 +0.0,0.0,0.040231958 +0.0,0.0,0.152691 +0.0,0.0,0.019418435 +1.0,1.0,0.94287086 +0.0,0.0,0.015667502 +0.0,0.0,0.15540092 +0.0,0.0,0.015860783 +0.0,0.0,0.12349633 +0.0,0.0,0.02669269 +0.0,0.0,0.01931179 +0.0,0.0,0.02948419 +0.0,0.0,0.023500083 +0.0,0.0,0.022180893 +1.0,1.0,0.6372692 +0.0,0.0,0.04877759 +1.0,1.0,0.97758317 +0.0,0.0,0.030669203 +0.0,0.0,0.010882266 +0.0,0.0,0.01680453 +0.0,0.0,0.02242357 +0.0,0.0,0.11542107 +0.0,0.0,0.028736437 +1.0,1.0,0.7854789 +0.0,0.0,0.026184376 +0.0,0.0,0.026513204 +0.0,0.0,0.0086799115 +1.0,1.0,0.8187608 +0.0,0.0,0.015446793 +1.0,1.0,0.70175165 +1.0,0.0,0.46618846 +0.0,0.0,0.012777942 +1.0,0.0,0.019961312 +0.0,0.0,0.03919804 +0.0,0.0,0.016335767 +1.0,1.0,0.738156 +1.0,1.0,0.9773538 +0.0,0.0,0.024236722 +0.0,0.0,0.031408936 +0.0,0.0,0.06360247 +0.0,0.0,0.04092143 +0.0,0.0,0.042565234 +0.0,0.0,0.102468975 +0.0,0.0,0.032869674 +0.0,0.0,0.025727784 +1.0,1.0,0.96261156 +0.0,0.0,0.016414907 +0.0,0.0,0.028329829 +0.0,0.0,0.033558283 +0.0,0.0,0.008834594 +1.0,1.0,0.7144446 +1.0,1.0,0.92768526 +0.0,0.0,0.023923919 +1.0,1.0,0.6671327 +0.0,0.0,0.052008066 +0.0,0.0,0.2462441 +0.0,0.0,0.013019124 +0.0,0.0,0.008821922 +1.0,0.0,0.45689824 +0.0,0.0,0.055676397 +0.0,0.0,0.025117463 +0.0,0.0,0.00712331 +0.0,0.0,0.041595932 +0.0,0.0,0.021174708 +0.0,0.0,0.03146361 +1.0,0.0,0.47559044 +0.0,0.0,0.03938595 +0.0,0.0,0.03739956 +0.0,0.0,0.07542298 +0.0,0.0,0.2829368 +1.0,0.0,0.04735491 +0.0,0.0,0.043591462 +0.0,0.0,0.01978596 +1.0,1.0,0.6717365 +1.0,1.0,0.9431881 +0.0,0.0,0.029519388 +0.0,0.0,0.028431207 +0.0,0.0,0.014722387 +0.0,0.0,0.019352676 +0.0,0.0,0.08431545 +0.0,0.0,0.023277478 +0.0,0.0,0.027632948 +0.0,0.0,0.013663632 +0.0,0.0,0.017382024 +0.0,0.0,0.020442767 +0.0,0.0,0.048186895 +0.0,0.0,0.0530478 +0.0,0.0,0.118428245 +1.0,1.0,0.50956804 +0.0,0.0,0.018873885 +0.0,0.0,0.011969633 +0.0,0.0,0.029048223 +0.0,0.0,0.18392879 +0.0,0.0,0.11992017 +0.0,0.0,0.015470778 +0.0,0.0,0.057389583 +0.0,0.0,0.034584768 +0.0,0.0,0.06272757 +0.0,0.0,0.0293298 +1.0,1.0,0.736495 +1.0,1.0,0.7301817 +0.0,0.0,0.032233384 +1.0,1.0,0.88834095 +0.0,0.0,0.065032385 +0.0,0.0,0.10219426 +0.0,0.0,0.024267966 +0.0,0.0,0.01203336 +0.0,0.0,0.075344026 +0.0,0.0,0.025761282 +0.0,0.0,0.02323087 +1.0,1.0,0.75757724 +0.0,0.0,0.123955026 +0.0,0.0,0.015647769 +0.0,0.0,0.020512981 +0.0,0.0,0.023090662 +0.0,0.0,0.03206392 +1.0,1.0,0.5708829 +0.0,0.0,0.011227126 +0.0,0.0,0.024253964 +1.0,1.0,0.89603376 +0.0,0.0,0.02432515 +0.0,0.0,0.010027198 +1.0,1.0,0.6888784 +0.0,0.0,0.01752326 +0.0,0.0,0.020548824 +0.0,0.0,0.013646363 +1.0,1.0,0.89109087 +1.0,1.0,0.7906933 +0.0,0.0,0.029550131 +0.0,0.0,0.021517677 +0.0,0.0,0.023322307 +0.0,0.0,0.020059895 +0.0,0.0,0.13606799 +0.0,0.0,0.029038277 +0.0,0.0,0.024815625 +0.0,0.0,0.011725318 +0.0,0.0,0.057936862 +0.0,0.0,0.02358956 +0.0,0.0,0.014539397 +0.0,0.0,0.020859936 +0.0,0.0,0.041569136 +0.0,0.0,0.03548545 +0.0,0.0,0.03617691 +0.0,0.0,0.016033133 +0.0,0.0,0.018855346 +1.0,1.0,0.92003614 +0.0,1.0,0.7276374 +0.0,0.0,0.17205581 +0.0,0.0,0.03718145 +0.0,0.0,0.037044674 +0.0,0.0,0.114754036 +1.0,0.0,0.0168402 +0.0,0.0,0.016500777 +0.0,0.0,0.04568653 +0.0,0.0,0.022436017 +0.0,0.0,0.073448256 +0.0,0.0,0.034909695 +0.0,0.0,0.12761065 +0.0,0.0,0.009124775 +0.0,0.0,0.35110003 +1.0,0.0,0.023500083 +0.0,0.0,0.023845056 +0.0,0.0,0.011561686 +0.0,0.0,0.014182549 +0.0,0.0,0.026203156 +0.0,0.0,0.029150866 +0.0,0.0,0.023561308 +0.0,0.0,0.017836923 +1.0,0.0,0.08382069 +0.0,0.0,0.040370803 +0.0,0.0,0.037005037 +0.0,0.0,0.017465726 +0.0,0.0,0.028470607 +0.0,0.0,0.014618211 +0.0,0.0,0.02396314 +0.0,0.0,0.013694578 +0.0,0.0,0.48666266 +1.0,0.0,0.012628736 +0.0,0.0,0.07444832 +0.0,0.0,0.056650743 +0.0,0.0,0.01786877 +0.0,0.0,0.035087444 +0.0,0.0,0.031159151 +0.0,0.0,0.06997725 +1.0,1.0,0.9477712 +0.0,0.0,0.010538335 +0.0,0.0,0.30666563 +0.0,0.0,0.012801518 +0.0,0.0,0.041946895 +0.0,0.0,0.045235287 +0.0,0.0,0.033859942 +0.0,0.0,0.010375292 +1.0,1.0,0.74627405 +0.0,0.0,0.006550551 +0.0,0.0,0.06982529 +0.0,0.0,0.022567786 +0.0,0.0,0.24025717 +0.0,0.0,0.011848268 +0.0,0.0,0.01761343 +0.0,0.0,0.035140764 +0.0,0.0,0.053389024 +0.0,0.0,0.027762296 +0.0,0.0,0.026943779 +1.0,1.0,0.80961484 +0.0,0.0,0.06366624 +1.0,0.0,0.012855044 +0.0,0.0,0.018654814 +0.0,0.0,0.22558057 +0.0,0.0,0.02664166 +0.0,0.0,0.061702427 +0.0,0.0,0.015730007 +1.0,1.0,0.7664522 +0.0,0.0,0.012680814 +0.0,0.0,0.049780857 +0.0,0.0,0.030103574 +0.0,0.0,0.07271162 +0.0,0.0,0.02354864 +0.0,0.0,0.019338394 +0.0,0.0,0.042553015 +0.0,0.0,0.018374544 +0.0,0.0,0.030680466 +1.0,0.0,0.014402629 +0.0,0.0,0.018773403 +0.0,0.0,0.053675946 +0.0,0.0,0.022000702 +0.0,0.0,0.019234443 +0.0,0.0,0.09940713 +1.0,1.0,0.95455086 +0.0,0.0,0.023328682 +0.0,0.0,0.038228918 +0.0,0.0,0.03452409 +0.0,0.0,0.058285892 +0.0,0.0,0.020843891 +1.0,1.0,0.5862008 +0.0,0.0,0.10689223 +1.0,1.0,0.8266826 +1.0,1.0,0.98857737 +0.0,0.0,0.116543435 +0.0,0.0,0.044565476 +0.0,0.0,0.057010923 +1.0,1.0,0.76085377 +1.0,1.0,0.7881917 +1.0,1.0,0.6171633 +0.0,0.0,0.018661955 +0.0,0.0,0.1658779 +0.0,0.0,0.044780035 +0.0,0.0,0.028944107 +0.0,0.0,0.03125095 +1.0,0.0,0.38595462 +0.0,0.0,0.02433824 +0.0,0.0,0.014687697 +0.0,0.0,0.007980981 +0.0,0.0,0.026942039 +1.0,0.0,0.13275766 +0.0,0.0,0.018983005 +1.0,1.0,0.92742896 +0.0,0.0,0.023093965 +0.0,0.0,0.096810326 +0.0,0.0,0.018825501 +0.0,0.0,0.102597035 +0.0,0.0,0.0054196874 +1.0,1.0,0.91815937 +1.0,1.0,0.9848098 +0.0,0.0,0.015845325 +0.0,0.0,0.014130044 +0.0,0.0,0.09972135 +0.0,0.0,0.016801938 +0.0,1.0,0.7075778 +0.0,0.0,0.0073942626 +0.0,0.0,0.032779828 +0.0,0.0,0.030350566 +0.0,0.0,0.061283965 +0.0,0.0,0.06766545 +0.0,0.0,0.016836885 +0.0,0.0,0.02901775 +0.0,0.0,0.038507007 +0.0,0.0,0.019470949 +0.0,0.0,0.02838956 +0.0,0.0,0.021850375 +0.0,0.0,0.4398757 +0.0,0.0,0.07355665 +0.0,0.0,0.017795227 +0.0,0.0,0.01084804 +0.0,0.0,0.022023173 +0.0,0.0,0.03728741 +0.0,0.0,0.017878052 +0.0,0.0,0.4815953 +0.0,0.0,0.19032744 +0.0,0.0,0.020137466 +0.0,0.0,0.023587322 +0.0,0.0,0.009044009 +1.0,0.0,0.29558712 +0.0,0.0,0.36480305 +0.0,0.0,0.024741188 +0.0,0.0,0.071590506 +0.0,0.0,0.015930623 +1.0,1.0,0.73337823 +0.0,0.0,0.022952644 +1.0,0.0,0.35686636 +0.0,0.0,0.014892625 +0.0,0.0,0.13301848 +0.0,0.0,0.047518052 +0.0,0.0,0.03381458 +0.0,0.0,0.02244631 +0.0,0.0,0.10813855 +0.0,0.0,0.02968753 +0.0,0.0,0.023923919 +0.0,0.0,0.06628923 +0.0,0.0,0.024790447 +0.0,0.0,0.02421558 +0.0,0.0,0.01408484 +0.0,0.0,0.06735869 +0.0,0.0,0.34714037 +0.0,0.0,0.01202763 +0.0,0.0,0.0047792466 +0.0,0.0,0.02754553 +0.0,0.0,0.008936341 +0.0,0.0,0.18858726 +0.0,0.0,0.035927124 +0.0,0.0,0.05938665 +0.0,0.0,0.059543107 +0.0,0.0,0.055454977 +0.0,0.0,0.2627433 +0.0,0.0,0.014252782 +0.0,0.0,0.028241754 +0.0,0.0,0.22364695 +0.0,0.0,0.048826575 +0.0,0.0,0.019469844 +0.0,0.0,0.013019859 +0.0,0.0,0.26681328 +0.0,0.0,0.016632315 +1.0,0.0,0.0363124 +0.0,1.0,0.58549124 +0.0,0.0,0.49664658 +0.0,0.0,0.031869058 +0.0,0.0,0.024091002 +0.0,0.0,0.020656664 +1.0,1.0,0.9159356 +0.0,0.0,0.0134573 +0.0,0.0,0.020627106 +0.0,0.0,0.10522647 +1.0,1.0,0.835829 +0.0,0.0,0.022070644 +0.0,0.0,0.009880783 +0.0,0.0,0.0412266 +1.0,1.0,0.91017264 +0.0,0.0,0.012822385 +0.0,0.0,0.046382874 +0.0,0.0,0.032601878 +1.0,0.0,0.42652354 +0.0,0.0,0.007461837 +0.0,0.0,0.08941099 +0.0,0.0,0.21315542 +0.0,0.0,0.020801188 +0.0,0.0,0.024815768 +0.0,0.0,0.09204218 +0.0,0.0,0.021699255 +0.0,1.0,0.5039368 +0.0,0.0,0.036089092 +1.0,1.0,0.76726365 +0.0,0.0,0.03136705 +0.0,0.0,0.13033876 +0.0,0.0,0.01768047 +0.0,0.0,0.0068580466 +0.0,0.0,0.032936346 +0.0,0.0,0.06304159 +0.0,0.0,0.051538505 +0.0,0.0,0.10420474 +0.0,0.0,0.05530045 +0.0,0.0,0.035495847 +0.0,0.0,0.019285405 +1.0,0.0,0.36098665 +0.0,0.0,0.14847918 +0.0,0.0,0.016211083 +0.0,0.0,0.02001916 +0.0,0.0,0.0327662 +0.0,0.0,0.080685005 +0.0,0.0,0.013776006 +0.0,0.0,0.017059088 +0.0,0.0,0.029861597 +0.0,0.0,0.013569915 +0.0,0.0,0.015421402 +1.0,1.0,0.9849101 +0.0,0.0,0.01721707 +0.0,0.0,0.015758313 +0.0,0.0,0.094681524 +1.0,1.0,0.7146273 +0.0,0.0,0.019063534 +0.0,0.0,0.07871692 +0.0,0.0,0.022670135 +0.0,0.0,0.023215018 +0.0,0.0,0.015814323 +0.0,0.0,0.011213764 +0.0,0.0,0.02682828 +0.0,0.0,0.039248817 +0.0,0.0,0.023318788 +0.0,0.0,0.08689131 +0.0,0.0,0.02394383 +0.0,0.0,0.1417114 +1.0,0.0,0.3655204 +0.0,0.0,0.016882189 +0.0,0.0,0.12757418 +0.0,0.0,0.09735448 +0.0,0.0,0.039898682 +0.0,0.0,0.024790712 +0.0,0.0,0.05158313 +0.0,0.0,0.08949877 +1.0,0.0,0.2946677 +0.0,0.0,0.22390305 +0.0,0.0,0.10983529 +0.0,0.0,0.0298921 +1.0,1.0,0.8409112 +0.0,0.0,0.008502664 +0.0,0.0,0.016327746 +0.0,0.0,0.20625106 +1.0,1.0,0.69732803 +0.0,0.0,0.033872455 +0.0,0.0,0.022794355 +0.0,0.0,0.028985936 +0.0,0.0,0.027382387 +0.0,0.0,0.043628752 +0.0,0.0,0.015554479 +0.0,0.0,0.013054642 +0.0,0.0,0.23310666 +0.0,0.0,0.024988102 +0.0,0.0,0.06414964 +0.0,1.0,0.627508 +0.0,0.0,0.09095822 +0.0,0.0,0.060473096 +0.0,0.0,0.058011953 +0.0,0.0,0.017602434 +0.0,0.0,0.0059110634 +1.0,1.0,0.97713643 +0.0,0.0,0.019131364 +0.0,0.0,0.012912868 +0.0,0.0,0.015934788 +0.0,0.0,0.025426121 +0.0,0.0,0.08126755 +0.0,0.0,0.020767905 +0.0,0.0,0.022268554 +0.0,0.0,0.028021693 +0.0,0.0,0.017429642 +0.0,0.0,0.045935042 +0.0,0.0,0.022060623 +0.0,0.0,0.36069238 +0.0,0.0,0.013809552 +0.0,0.0,0.013349087 +0.0,0.0,0.023651056 +1.0,1.0,0.6689158 +0.0,0.0,0.01440971 +0.0,0.0,0.026358137 +0.0,0.0,0.023680445 +0.0,0.0,0.012883514 +0.0,0.0,0.031862024 +0.0,0.0,0.02682828 +0.0,0.0,0.02211895 +0.0,0.0,0.124873765 +0.0,0.0,0.05245097 +0.0,0.0,0.026065296 +0.0,0.0,0.03397392 +0.0,0.0,0.016883662 +0.0,0.0,0.028474316 +0.0,0.0,0.026179526 +0.0,0.0,0.03414546 +0.0,0.0,0.013000334 +1.0,1.0,0.8543916 +0.0,0.0,0.28964633 +0.0,0.0,0.030704917 +1.0,1.0,0.89143825 +0.0,0.0,0.021223314 +0.0,0.0,0.006802536 +0.0,0.0,0.010068035 +0.0,0.0,0.025010284 +0.0,0.0,0.08572221 +0.0,0.0,0.015041922 +0.0,0.0,0.031388856 +0.0,0.0,0.020235855 +0.0,0.0,0.0188417 +1.0,1.0,0.5622133 +0.0,0.0,0.01862435 +0.0,0.0,0.04274654 +1.0,0.0,0.2786265 +0.0,0.0,0.033051893 +0.0,0.0,0.1388313 +0.0,0.0,0.01991194 +0.0,0.0,0.035002988 +0.0,0.0,0.024099238 +0.0,0.0,0.031893253 +0.0,0.0,0.029713834 +0.0,0.0,0.011207617 +0.0,0.0,0.021326892 +0.0,0.0,0.010064922 +0.0,0.0,0.038536757 +0.0,0.0,0.01610524 +0.0,0.0,0.10139225 +0.0,0.0,0.016005406 +0.0,0.0,0.041946895 +0.0,0.0,0.014306806 +1.0,0.0,0.48534355 +0.0,1.0,0.71669805 +0.0,0.0,0.022886438 +0.0,0.0,0.014513322 +0.0,0.0,0.00847365 +0.0,0.0,0.022115842 +0.0,0.0,0.03585471 +0.0,0.0,0.035504103 +0.0,0.0,0.014573106 +0.0,0.0,0.3840528 +0.0,0.0,0.052925732 +0.0,0.0,0.25701788 +0.0,0.0,0.033572845 +0.0,0.0,0.022245513 +0.0,0.0,0.16940027 +0.0,0.0,0.030894678 +0.0,0.0,0.028329697 +1.0,1.0,0.7963597 +1.0,1.0,0.8897292 +0.0,0.0,0.014168469 +0.0,0.0,0.015296813 +0.0,0.0,0.053900342 +0.0,0.0,0.014562318 +0.0,0.0,0.023878109 +0.0,0.0,0.0297737 +1.0,1.0,0.97480834 +0.0,0.0,0.3689644 +0.0,0.0,0.019453123 +1.0,0.0,0.0155636165 +0.0,0.0,0.023797419 +0.0,0.0,0.022656208 +0.0,0.0,0.02436377 +0.0,0.0,0.013362658 +1.0,1.0,0.97987556 +0.0,0.0,0.045004636 +0.0,0.0,0.04059522 +0.0,0.0,0.04992357 +0.0,0.0,0.031245664 +0.0,0.0,0.014497004 +0.0,0.0,0.024051309 +1.0,0.0,0.043591462 +1.0,1.0,0.8479833 +0.0,0.0,0.026139116 +0.0,0.0,0.03754142 +1.0,1.0,0.9218152 +1.0,1.0,0.7288675 +0.0,0.0,0.040859774 +0.0,0.0,0.024099238 +0.0,0.0,0.08280194 +0.0,0.0,0.02254141 +0.0,0.0,0.13463269 +0.0,0.0,0.3091668 +0.0,0.0,0.017919434 +0.0,0.0,0.049233116 +1.0,0.0,0.031084422 +0.0,0.0,0.025410214 +0.0,0.0,0.13687661 +0.0,0.0,0.02058936 +0.0,0.0,0.0087377615 +0.0,0.0,0.35790935 +0.0,0.0,0.030013204 +0.0,0.0,0.018484483 +0.0,0.0,0.050014533 +0.0,0.0,0.009174008 +0.0,0.0,0.018677933 +0.0,0.0,0.012680605 +0.0,0.0,0.04309127 +0.0,0.0,0.039415475 +0.0,0.0,0.007307972 +0.0,0.0,0.07352397 +0.0,0.0,0.039167784 +0.0,0.0,0.025054011 +0.0,0.0,0.01915992 +0.0,0.0,0.08753373 +1.0,1.0,0.88251895 +0.0,0.0,0.008947116 +0.0,0.0,0.031096844 +0.0,0.0,0.106618695 +0.0,0.0,0.018450875 +1.0,1.0,0.897825 +0.0,0.0,0.0110613415 +0.0,0.0,0.11229268 +0.0,0.0,0.06484234 +0.0,0.0,0.07166784 +0.0,0.0,0.011921131 +0.0,0.0,0.015487252 +1.0,1.0,0.7759815 +0.0,0.0,0.02089098 +0.0,0.0,0.107781455 +0.0,0.0,0.03098069 +1.0,1.0,0.93588555 +1.0,0.0,0.023984628 +0.0,0.0,0.107384376 +0.0,0.0,0.015612165 +0.0,0.0,0.037506167 +0.0,0.0,0.021634132 +0.0,0.0,0.012867987 +0.0,0.0,0.03386176 +0.0,0.0,0.0107813785 +1.0,0.0,0.027003849 +0.0,0.0,0.20361619 +0.0,0.0,0.026086682 +0.0,0.0,0.02984161 +1.0,1.0,0.90834796 +0.0,0.0,0.020744272 +0.0,0.0,0.025134306 +0.0,0.0,0.094687656 +1.0,0.0,0.26926038 +0.0,0.0,0.004182979 +0.0,0.0,0.0044440883 +0.0,0.0,0.07906054 +1.0,1.0,0.7595175 +0.0,0.0,0.013641885 +0.0,0.0,0.033008702 +0.0,0.0,0.023637043 +0.0,0.0,0.019150343 +0.0,0.0,0.08958558 +0.0,0.0,0.12357589 +1.0,1.0,0.72710454 +0.0,0.0,0.018480476 +0.0,0.0,0.029763853 +0.0,0.0,0.10524865 +0.0,0.0,0.027969833 +0.0,0.0,0.048580058 +0.0,0.0,0.0733491 +0.0,0.0,0.04214562 +1.0,1.0,0.90707827 +1.0,1.0,0.8739633 +0.0,0.0,0.024744647 +0.0,0.0,0.018606383 +0.0,0.0,0.025761282 +1.0,1.0,0.64605516 +0.0,0.0,0.033759333 +0.0,0.0,0.020404264 +0.0,0.0,0.01760861 +0.0,0.0,0.082240626 +0.0,0.0,0.026151562 +0.0,0.0,0.00615993 +0.0,0.0,0.013253667 +1.0,1.0,0.9066515 +0.0,0.0,0.03739956 +1.0,0.0,0.014360547 +1.0,1.0,0.68811333 +0.0,0.0,0.014226404 +0.0,0.0,0.0183312 +0.0,0.0,0.08315329 +0.0,0.0,0.019407425 +0.0,0.0,0.018607106 +1.0,1.0,0.8212401 +0.0,0.0,0.03146361 +0.0,0.0,0.023085875 +0.0,0.0,0.016335767 +0.0,0.0,0.011943067 +0.0,0.0,0.01610681 +0.0,0.0,0.01265462 +0.0,0.0,0.04414716 +0.0,0.0,0.09566299 +0.0,0.0,0.036406286 +0.0,0.0,0.12588736 +0.0,0.0,0.021881934 +0.0,0.0,0.10047321 +0.0,0.0,0.017413082 +0.0,0.0,0.19718808 +1.0,1.0,0.6953794 +0.0,0.0,0.035375014 +0.0,0.0,0.014896963 +0.0,0.0,0.020481853 +0.0,0.0,0.010884838 +0.0,0.0,0.08431545 +0.0,0.0,0.034281418 +0.0,0.0,0.20226595 +0.0,0.0,0.23540777 +0.0,0.0,0.08743949 +0.0,0.0,0.03365243 +0.0,0.0,0.03262613 +0.0,0.0,0.06363723 +0.0,0.0,0.30602923 +0.0,0.0,0.018525349 +0.0,0.0,0.027365882 +0.0,0.0,0.10018726 +0.0,0.0,0.027703991 +0.0,0.0,0.03613045 +0.0,0.0,0.17424361 +0.0,0.0,0.019970793 +0.0,0.0,0.01962698 +0.0,0.0,0.018525349 +0.0,0.0,0.043628752 +0.0,0.0,0.023462586 +0.0,0.0,0.02423371 +0.0,0.0,0.0316508 +0.0,0.0,0.023141513 +0.0,0.0,0.012546031 +0.0,0.0,0.043943524 +0.0,0.0,0.075097755 +1.0,1.0,0.627106 +0.0,0.0,0.022442335 +0.0,0.0,0.020008579 +0.0,0.0,0.025412105 +0.0,0.0,0.047683857 +0.0,0.0,0.016036376 +0.0,0.0,0.017802548 +0.0,0.0,0.01799943 +0.0,0.0,0.04452656 +0.0,0.0,0.020715948 +1.0,1.0,0.7807008 +0.0,0.0,0.12821561 +1.0,0.0,0.23798166 +0.0,0.0,0.10893401 +0.0,0.0,0.32860994 +0.0,0.0,0.010201131 +0.0,0.0,0.01207871 +1.0,1.0,0.93307966 +0.0,0.0,0.046453703 +0.0,0.0,0.04445788 +0.0,0.0,0.029022755 +1.0,0.0,0.42759386 +0.0,0.0,0.012611226 +0.0,0.0,0.024304226 +1.0,0.0,0.029770093 diff --git a/Topic09/Topic9-part6.ipynb b/Topic09/Topic9-part6.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..bab35d4c706e6401b3be3168093df7c8cd68c59a --- /dev/null +++ b/Topic09/Topic9-part6.ipynb @@ -0,0 +1,173 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## KMeans Clustering\n", + "https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "from sklearn.cluster import KMeans\n", + "\n", + "X = np.random.rand(10,4)\n", + "\n", + "kmeans = KMeans(n_clusters=2, random_state=0).fit(X)\n", + "kmeans.labels_" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans.predict(np.random.rand(3,4))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans.cluster_centers_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Hierarchical Clustering\n", + "https://scikit-learn.org/stable/modules/clustering.html#hierarchical-clustering" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "from matplotlib import pyplot as plt\n", + "from scipy.cluster.hierarchy import dendrogram\n", + "from sklearn.datasets import load_iris\n", + "from sklearn.cluster import AgglomerativeClustering\n", + "\n", + "\n", + "def plot_dendrogram(model, **kwargs):\n", + " # Create linkage matrix and then plot the dendrogram\n", + "\n", + " # create the counts of samples under each node\n", + " counts = np.zeros(model.children_.shape[0])\n", + " n_samples = len(model.labels_)\n", + " for i, merge in enumerate(model.children_):\n", + " current_count = 0\n", + " for child_idx in merge:\n", + " if child_idx < n_samples:\n", + " current_count += 1 # leaf node\n", + " else:\n", + " current_count += counts[child_idx - n_samples]\n", + " counts[i] = current_count\n", + "\n", + " linkage_matrix = np.column_stack([model.children_, model.distances_,\n", + " counts]).astype(float)\n", + "\n", + " # Plot the corresponding dendrogram\n", + " dendrogram(linkage_matrix, **kwargs)\n", + "\n", + "\n", + "iris = load_iris()\n", + "X = iris.data\n", + "\n", + "# setting distance_threshold=0 ensures we compute the full tree.\n", + "model = AgglomerativeClustering(distance_threshold=0, n_clusters=None)\n", + "\n", + "model = model.fit(X)\n", + "plt.title('Hierarchical Clustering Dendrogram')\n", + "# plot the top three levels of the dendrogram\n", + "plot_dendrogram(model, truncate_mode='level', p=3)\n", + "plt.xlabel(\"Number of points in node (or index of point if no parenthesis).\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Feature Selection\n", + "https://scikit-learn.org/stable/modules/feature_selection.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.svm import LinearSVC\n", + "from sklearn.datasets import load_iris\n", + "from sklearn.feature_selection import SelectFromModel\n", + "X, y = load_iris(return_X_y=True)\n", + "X" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "y" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "lsvc = LinearSVC(C=0.01, penalty=\"l1\", dual=False).fit(X, y)\n", + "model = SelectFromModel(lsvc, prefit=True)\n", + "X_new = model.transform(X)\n", + "X_new.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Topic10/Comprehend.ipynb b/Topic10/Comprehend.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..b94af9a791ee1ebbda4ec1ab4fd24ff19f3827c8 --- /dev/null +++ b/Topic10/Comprehend.ipynb @@ -0,0 +1,108 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## More Comprehend Python samples can be found here:\n", + "https://docs.aws.amazon.com/code-samples/latest/catalog/code-catalog-python-example_code-comprehend.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## Demonstrate how to determine the named entities in a document\n", + "\n", + "import boto3\n", + "import json\n", + "\n", + "comprehend = boto3.client(service_name='comprehend', region_name='eu-west-2')\n", + "text = 'The England captain hit a brilliant 128 not out in Chennai and led his side to 263-3 at the close.!'\n", + "\n", + "print('Calling DetectEntities')\n", + "print(json.dumps(comprehend.detect_entities(Text=text, LanguageCode='en'),\n", + " sort_keys=True, indent=4))\n", + "print('End of DetectEntities\\n')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## Demonstrate how to determine the key noun phrases used in text\n", + "import boto3\n", + "import json\n", + "\n", + "comprehend = boto3.client(service_name='comprehend', region_name='eu-west-2')\n", + "text = 'Python is a great programming and scripting language. Greetings from London!'\n", + "\n", + "\n", + "print('Calling DetectKeyPhrases')\n", + "print(json.dumps(comprehend.detect_key_phrases(Text=text, LanguageCode='en'),\n", + " sort_keys=True, indent=4))\n", + "print('End of DetectKeyPhrases\\n')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dir(comprehend)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## Demonstrates how to determine the overall emotional tone of text.\n", + "\n", + "import boto3\n", + "import json\n", + "\n", + "comprehend = boto3.client(service_name='comprehend', region_name='eu-west-2')\n", + "text = 'Python is a great programming and scripting language!'\n", + "\n", + "print('Calling DetectSentiment')\n", + "print(json.dumps(comprehend.detect_sentiment(Text=text, LanguageCode='en'), sort_keys=True, indent=4))\n", + "print('End of DetectSentiment\\n')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Topic10/Rekognition.ipynb b/Topic10/Rekognition.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..957ec614c06b718436db33cf6f0b9327f34f77e6 --- /dev/null +++ b/Topic10/Rekognition.ipynb @@ -0,0 +1,183 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## More Rekognition Python samples can be found here:\n", + "https://docs.aws.amazon.com/code-samples/latest/catalog/code-catalog-python-example_code-rekognition.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import boto3\n", + "\n", + "# Create a Rekognition client\n", + "client=boto3.client('rekognition','us-east-1')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dir(client)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# remember to use your own bucket\n", + "response = client.detect_faces(\n", + " Image={\n", + " 'S3Object':{\n", + " 'Bucket':'noureddin-test-bucket',\n", + " 'Name':'realmadrid.png'\n", + " }\n", + " },\n", + " Attributes=['ALL']\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "response" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## local data\n", + "with open(\"/Users/csstnns/Documents/nba.jpg\", 'rb') as image:\n", + " response = client.detect_faces(Image={\n", + " 'Bytes': image.read()\n", + " },\n", + " Attributes=['ALL'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## Emotions\n", + "for faceDetail in response['FaceDetails']:\n", + " print('Emotions: \\t Confidence\\n')\n", + " for emotion in faceDetail['Emotions']:\n", + " print(str(emotion['Type']) + '\\t\\t' + str(emotion['Confidence']))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Face Details\n", + "for faceDetail in response['FaceDetails']:\n", + " print(faceDetail['Eyeglasses'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## Celebrity Detection\n", + "with open(\"/Users/csstnns/Documents/nba.jpg\", 'rb') as image:\n", + " response = client.recognize_celebrities(Image={\n", + " 'Bytes': image.read()\n", + " })\n", + " print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Face comparison\n", + "import boto3\n", + "\n", + "def compare_faces(sourceFile, targetFile):\n", + "\n", + " client=boto3.client('rekognition', region_name='us-east-1')\n", + " \n", + " imageSource=open(sourceFile,'rb')\n", + " imageTarget=open(targetFile,'rb')\n", + "\n", + " response=client.compare_faces(SimilarityThreshold=80,\n", + " SourceImage={'Bytes': imageSource.read()},\n", + " TargetImage={'Bytes': imageTarget.read()})\n", + " \n", + " for faceMatch in response['FaceMatches']:\n", + " position = faceMatch['Face']['BoundingBox']\n", + " similarity = str(faceMatch['Similarity'])\n", + " print('The face at ' +\n", + " str(position['Left']) + ' ' +\n", + " str(position['Top']) +\n", + " ' matches with ' + similarity + '% confidence')\n", + "\n", + " imageSource.close()\n", + " imageTarget.close() \n", + " return len(response['FaceMatches']) \n", + "\n", + "def main():\n", + " source_file='/Users/csstnns/Downloads/noureddin1.jpg'\n", + " target_file='/Users/csstnns/Downloads/noureddin123.jpg'\n", + " face_matches=compare_faces(source_file, target_file)\n", + " print(\"Face matches: \" + str(face_matches))\n", + "\n", + "\n", + "if __name__ == \"__main__\":\n", + " main()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Topic10/Transcribe.ipynb b/Topic10/Transcribe.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..4857cff49e67c660a8bfde48e3608ccc3c0125e7 --- /dev/null +++ b/Topic10/Transcribe.ipynb @@ -0,0 +1,119 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## More Transcribe Python samples can be found here:\n", + "https://docs.aws.amazon.com/code-samples/latest/catalog/code-catalog-python-example_code-transcribe.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "Purpose\n", + "\n", + "Shows how to use AWS SDK for Python (Boto3) to call Amazon Transcribe to make a\n", + "transcription of an audio file.\n", + "\n", + "This script is intended to be used with the instructions for getting started in the\n", + "Amazon Transcribe Developer Guide here:\n", + " https://docs.aws.amazon.com/transcribe/latest/dg/getting-started-python.html.\n", + "\"\"\"\n", + "\n", + "import time\n", + "import boto3\n", + "\n", + "from urllib.request import urlopen\n", + "import json" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def transcribe_file(job_name, file_uri, transcribe_client):\n", + " transcribe_client.start_transcription_job(\n", + " TranscriptionJobName=job_name,\n", + " Media={'MediaFileUri': file_uri},\n", + " MediaFormat='mp3',\n", + " LanguageCode='en-US'\n", + " )\n", + " transcript = ''\n", + " data = ''\n", + " max_tries = 60\n", + " while max_tries > 0:\n", + " max_tries -= 1\n", + " job = transcribe_client.get_transcription_job(TranscriptionJobName=job_name)\n", + " job_status = job['TranscriptionJob']['TranscriptionJobStatus']\n", + " if job_status in ['COMPLETED', 'FAILED']:\n", + " print(f\"Job {job_name} is {job_status}.\")\n", + " if job_status == 'COMPLETED': \n", + " response = urlopen(job['TranscriptionJob']['Transcript']['TranscriptFileUri'])\n", + " data = json.loads(response.read())\n", + " transcript = data['results']['transcripts'][0]['transcript'] \n", + " break\n", + " else:\n", + " print(f\"Waiting for {job_name}. Current status is {job_status}.\")\n", + " time.sleep(10)\n", + " return (transcript, data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## remember to use your own bucket and mp3 file\n", + "transcribe_client = boto3.client('transcribe', 'us-east-1')\n", + "file_uri = 's3://noureddin-test-bucket/welcome.mp3'\n", + "(transcript,data) = transcribe_file('Transcribe-job-123', file_uri, transcribe_client)\n", + "print(transcript)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Topic10/Translate-and-Polly.ipynb b/Topic10/Translate-and-Polly.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..ea5bfc6c3fb8af72a145cdfc95b3e692f6c4c558 --- /dev/null +++ b/Topic10/Translate-and-Polly.ipynb @@ -0,0 +1,96 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## More Translate Python samples can be found here:\n", + "https://docs.aws.amazon.com/code-samples/latest/catalog/code-catalog-python-example_code-translate.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import boto3\n", + "\n", + "translate = boto3.client('translate')\n", + "result = translate.translate_text(Text=\"Good morning\",\n", + " SourceLanguageCode=\"en\",\n", + " TargetLanguageCode=\"ar\")\n", + "print(f'TranslatedText: {result[\"TranslatedText\"]}')\n", + "print(f'SourceLanguageCode: {result[\"SourceLanguageCode\"]}')\n", + "print(f'TargetLanguageCode: {result[\"TargetLanguageCode\"]}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## More Polly Python samples can be found here:\n", + "https://docs.aws.amazon.com/code-samples/latest/catalog/code-catalog-python-example_code-polly.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import boto3\n", + "\n", + "#polly_client = boto3.Session(\n", + "# aws_access_key_id=, \n", + "# aws_secret_access_key=,\n", + "# region_name='eu-west-2').client('polly')\n", + "\n", + "text = \"But it needs to be more nerves of excitement and expectation rather than nerves of not knowing what's going to happen. I was generally quite happy. I didn't miss anything easy. Matt played fantastic.\"\n", + "polly_client = boto3.client(service_name='polly', region_name='eu-west-2')\n", + "response = polly_client.synthesize_speech(VoiceId='Joanna',\n", + " OutputFormat='mp3', \n", + " Text = text)\n", + "\n", + "file = open('/Users/csstnns/Music/To MP3 Converter Free/speech.mp3', 'wb')\n", + "file.write(response['AudioStream'].read())\n", + "file.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}