{ "cells": [ { "cell_type": "markdown", "id": "59db57ac-d174-4c88-b395-2204273a30f1", "metadata": {}, "source": [ "# Using Python for learning statistics Part 1" ] }, { "cell_type": "markdown", "id": "9de29def-48a4-4804-a73a-6883df5a23f4", "metadata": {}, "source": [ "This Juppyter notebook contains the code examples form the blog post [Python coding skills for statistics Part 1](https://docs.google.com/document/d/16WJnYeezBevUBvsYpbklW04ukvrtG_8QVdfsbd15pqg/edit)." ] }, { "cell_type": "markdown", "id": "282bf6aa-0555-4852-9a6b-1b58eb935b1c", "metadata": {}, "source": [ "I've intentionally left empty code cells throughout the notebook,\n", "which you can use to try some Python commands on your own.\n", "For example,\n", "you can copy-paste some of the commands in previous cells,\n", "modify them and run to see what happens.\n", "Try to break things, that's the best way to learn!\n", "\n", "**To run a code cell, press** the play button in the menu bar, or use the keyboard shortcut **SHIFT+ENTER**." ] }, { "cell_type": "code", "execution_count": null, "id": "ed5832a3-6014-47df-96f9-f0d969c94077", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "3f689330-7def-4935-be79-520d1c0190b6", "metadata": {}, "source": [ "## What can python do for you?" ] }, { "cell_type": "markdown", "id": "7bf445c3-2d7c-48ac-90be-84417d51f685", "metadata": {}, "source": [ "### Using Python as a calculator" ] }, { "cell_type": "code", "execution_count": 1, "id": "6ff440f2-f2c4-4821-8af0-1bec72c2b608", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "5.5" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2.1 + 3.4" ] }, { "cell_type": "code", "execution_count": 2, "id": "a5d156a0-ac2f-4271-95e6-1f22f499b535", "metadata": {}, "outputs": [], "source": [ "num1 = 2.1" ] }, { "cell_type": "code", "execution_count": 3, "id": "1d87588a-e92e-4225-9ace-dbe533c4f4f6", "metadata": {}, "outputs": [], "source": [ "num2 = 3.4" ] }, { "cell_type": "code", "execution_count": 4, "id": "a7eaa89b-cf12-477c-94b6-30641373ea55", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5.5" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "num1 + num2" ] }, { "cell_type": "code", "execution_count": null, "id": "27790060-6a22-4f9f-93e4-b85ff7273287", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "678eddd7-8f7e-483b-ab28-eb28db48c6bd", "metadata": {}, "source": [ "Let's now compute the avarage of the numbers `num1` and `num2`." ] }, { "cell_type": "code", "execution_count": 5, "id": "305c829d-680e-4652-8399-2f55b40bee57", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "2.75" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(num1 + num2) / 2" ] }, { "cell_type": "code", "execution_count": null, "id": "08222c31-5369-4801-b65b-4733726f534b", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "d84a4c83-e628-4d28-a559-883c3af78a13", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "a63a1efe-8635-45a9-8beb-9c9d05fad193", "metadata": {}, "source": [ "### Powerful primitives and builtin functions" ] }, { "cell_type": "code", "execution_count": 6, "id": "57b9fab6-d2bd-4ebf-a191-eb83f81d6a0b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "75.0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades = [80, 90, 70, 60]\n", "avg = sum(grades) / len(grades)\n", "avg" ] }, { "cell_type": "code", "execution_count": null, "id": "1e3e7128-4902-4ee8-b83b-0e2bbfc31764", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "719d9567-6585-4794-89ba-e314cc8e148e", "metadata": {}, "source": [ "### For loops" ] }, { "cell_type": "code", "execution_count": 7, "id": "e097b267-e125-4f0f-bb06-5e6ef837fb48", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "75.0" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "total = 0\n", "for grade in grades:\n", " total = total + grade\n", "avg = total / len(grades)\n", "avg" ] }, { "cell_type": "code", "execution_count": null, "id": "31dca516-7c74-42a8-9b93-44098a0249df", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "960b0808-0fff-47eb-9d7e-9069d3074c14", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "### Functions" ] }, { "cell_type": "markdown", "id": "92fff3a7-8337-4f7a-945d-80b93292f18e", "metadata": {}, "source": [ "Python functions are ..." ] }, { "cell_type": "markdown", "id": "31e5063f-59da-423e-a7ba-60f9e1906af3", "metadata": {}, "source": [ "To **define** the Python function,\n", "we use the `def` keyword followed by the function name,\n", "then we then specify the function input in parentheses,\n", "and end with the symbol `:`,\n", "which tells us \"body\" of the function is about to start.\n", "The function body is a four-spaces-indented code block that specifies all the\n", "calculations the function performs,\n", "and ends with a `return` statement for the output of the function.\n", "\n", "```\n", "def ():\n", " \n", " \n", " \n", " return \n", "```" ] }, { "cell_type": "markdown", "id": "f5142273-ad49-459a-8b55-32ffccee1db1", "metadata": {}, "source": [ "#### Example 1: sample mean\n", "\n", "We want to define a Python function `mean` that computes the mean from a given sample (a list of values).\n", "\n", "The mathematical definition of the mean is $\\mathbf{Mean}(\\mathbf{x}) = \\frac{1}{n} \\sum_{i=1}^{i=n} x_i$,\n", "where $\\mathbf{x} = [x_1, x_2, x_3, \\ldots, x_n]$ is a sample of size $n$ (a list of values).\n", "\n", "The code for the function is as follows:" ] }, { "cell_type": "code", "execution_count": 8, "id": "ab6e7d58-79f9-4afd-9f85-b814b45eb1bb", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "def mean(values):\n", " total = 0\n", " for value in values:\n", " total = total + value\n", " avg = total / len(values)\n", " return avg" ] }, { "cell_type": "markdown", "id": "346a10de-ad20-425a-b65b-c471874a7d3e", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "To **call** the function `mean` with input `grades`, we use the Python code `mean(grades)`." ] }, { "cell_type": "code", "execution_count": 9, "id": "ab56d567-0758-4b70-9b97-fb2cd1283deb", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "75.0" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades = [80, 90, 70, 60]\n", "mean(grades)" ] }, { "cell_type": "code", "execution_count": null, "id": "bf781976-47b4-4a89-9f99-fdda0c48dd8a", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "795538a1-fa68-43c8-b8ce-461d67d57842", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "#### Exmample 2: math function (bonus topic)\n", "\n", "In math, \n", "a function is a mapping from input values (usually denoted x) to output values (usually denoted y).\n", "Consider the mapping that doubles the input and adds five to it,\n", "which we can express as the math function $f(x) = 2x+5$.\n", "For any input $x$,\n", "the output of the function $f$ is denoted $f(x)$ and is equal to $2x+5$.\n", "For example, $f(3)$ describes the output of the function when the input is $x=3$,\n", "and it is equal to $2(3)+5 = 6 + 5 = 11$.\n", "The Python equivalent of the math function $f(x) = 2x+5$ is shown below. " ] }, { "cell_type": "code", "execution_count": 10, "id": "00fd3024-4329-4899-af02-2023a5e722f1", "metadata": {}, "outputs": [], "source": [ "def f(x):\n", " y = 2*x + 5\n", " return y" ] }, { "cell_type": "markdown", "id": "87abe9ef-97b1-4744-816b-7619539eff4e", "metadata": {}, "source": [ "To **call** the function `f` with input `x`, we simply writhe `f(x)` in Python,\n", "which is the same as the math notation we use for \"evaluate the function at the value x.\"" ] }, { "cell_type": "code", "execution_count": 11, "id": "88d9656c-913f-4617-999b-d98460ec070d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "11" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f(3)" ] }, { "cell_type": "code", "execution_count": null, "id": "5c4a84ba-e05d-4714-a525-8a2640147321", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "2483aa87-3da4-4b21-9f1c-be9899ba851f", "metadata": {}, "source": [ "## Why do you need coding for statistics?" ] }, { "cell_type": "markdown", "id": "3fdcf50f-49c5-4368-a924-ce53289cf298", "metadata": {}, "source": [ "### Data visualization" ] }, { "cell_type": "code", "execution_count": 12, "id": "a70a4bc4-50a7-4b50-8706-b2295bf57eb4", "metadata": {}, "outputs": [], "source": [ "prices = [11.8, 10, 11, 8.6, 8.3, 9.4, 8, 6.8, 8.5]" ] }, { "cell_type": "code", "execution_count": 13, "id": "5891ee22-6a6c-416d-a1bb-b283bb6a6519", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAg0AAAGdCAYAAACRlkBKAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAADnxJREFUeJzt3VuolHWjx/H/UlGjrUZBmqmV1q6IKNoXUXSxN0UR0oHoiJssCTZsL+omKsK8qJAOdNHhrZuQ6CB1UV14I53eIoiKnUVswupFbJHlTemyJLPWbP4Pe4mG+P5cjvOs9fj5wLCYNa55/vOfceY7z2FmqNfr9QoAwD8x5Z/9AwCASjQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQmVbGaXR0tGzdurXMmjWrDA0NjfdqAIABqp/puHPnzjJ//vwyZcqUwURDDYaFCxeO988BgBYNDw+XBQsWDCYa6hqGsYXOnj17vFcDAAzQyMhI86Z/7HV8INEwtkmiBoNoAIDJZTy7FtgREgCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAyrUwgG/73x/K3974tX2/7pfzr3H8p//0fp5crzpnX9rCYIPdZv5aVXI/H4sF1dX66ersmGvM8eednqNfr9cbzhyMjI2XOnDllx44dZfbs2X2ZpP968X/2H9xQKc/9579NmMmivfusX8tKrsdj8eC6Oj9dvV0TjXluf34O5/U73jyxe/fuZkH7nvqpVtVf1Zz529//0dflMDnvs34tK7kej8WD6+r8dPV2TTTmeXLPTxwNa9asacpk7LRw4cK+DqSuhjmQb7bt7OtymJz3Wb+WlVyPx+LBdXV+unq7JhrzPLnnJ46G++67r1mVMXYaHh7u60DqdpsDOWPurL4uh8l5n/VrWcn1eCweXFfnp6u3a6Ixz5N7fuJomDFjRrPtY99TP9UdPep2m33V8yv/fUlfl8PkvM/6tazkejwWD66r89PV2zXRmOfJPT8TZkfIvXuM/v0fzWqYWlV1ki63Y8yENsj7rF/LSq7HY/Hgujo/Xb1dE415bnd+Duf1e0JFAwBwZA3k6AkA4OgmGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAi08o49Xq95ufIyMh4rwIAGLCx1+2x1/GBRMPOnTubnwsXLhzvVQAALamv43PmzDmkvxnqjSc1Simjo6Nl69atZdasWWVoaKhMxJKqQTM8PFxmz57d9nA6zVwPhnkeDPM8GOa5vXmuL/s1GObPn1+mTJkymDUNdUELFiwoE12dJA/IwTDXg2GeB8M8D4Z5bmeeD3UNwxg7QgIAEdEAABzd0TBjxoyyevXq5idHlrkeDPM8GOZ5MMzz5Jznce8ICQAcXTq7pgEA6C/RAABERAMAEBENAMDRGQ2nnnpq8wmVfz2tXLmy7aF1yp9//llWrVpVTjvttHLMMceUJUuWlAcffHBcn2XOwdVPbrvrrrvKKaec0sz1xRdfXD799NO2hzXpffDBB+Wqq65qPhWvPke8+eab+11eH8sPPPBAOemkk5p5v+yyy8o333zT2ni7Os+vv/56ufzyy8sJJ5zQXP7555+3NtauzvOePXvKPffcU84999xy7LHHNv/m1ltvbT7VuRzt0VCfTH/44Ye9p7feeqv5/Q033ND20DrlkUceKc8++2x5+umny1dffdWcf/TRR8tTTz3V9tA654477mgexy+++GL58ssvmyfY+gL2/ffftz20Se3XX38t5513XnnmmWcOeHl9PD/55JPlueeeKx9//HHzZHvFFVeU3377beBj7fI818svueSS5jmEIzPPu3btKp999lnzRq/+rKG2adOmcvXVVx/6gnodd+edd/aWLFnSGx0dbXsonbJ06dLeihUr9vvddddd11u2bFlrY+qiXbt29aZOndpbv379fr+/4IILevfff39r4+qa+lT4xhtv7D1fny/mzZvXe+yxx/b+bvv27b0ZM2b01q1b19IouzfP+9q8eXNz+caNGwc+rqNpnsd88sknzb/bsmVL71B0bk3Dvn7//ffy0ksvlRUrVkzIL9WazOoq8nfeead8/fXXzfkvvviifPjhh+XKK69se2id8scffzSbgmbOnLnf7+vq8jrfHBmbN28uP/74Y7NGZ9/P6r/wwgvLRx991OrYoB927NjRvC4ed9xxg/nCqsmgbtPZvn17ue2229oeSufce++9zbennXXWWWXq1KnNC9vDDz9cli1b1vbQOqV+i+xFF13U7C9y9tlnl7lz55Z169Y1L1ynn35628PrrBoMVZ3vfdXzY5fBZFU3sdV9HG655ZZD/rKwTq9peP7555t3vnWnD/rrtddeKy+//HJ55ZVXmm1kL7zwQnn88cebn/RX3ZehrnE8+eSTm4+CrdvZ63/2Q/1KW4A9e/aUG2+8sXlOqfulHarOrmnYsmVLefvtt5sdPui/u+++u1nbcPPNNzfn6165dc7XrFlTli9f3vbwOqUemfL+++83OzrVtTt1b/6bbrqpLF68uO2hdda8efOan9u2bWvme0w9f/7557c4Mjj8YKjP1e++++64vpK8s29V1q5dW0488cSydOnStofSSXVv3L++062bKUZHR1sbU9fVvffrC9jPP/9cNmzYUK655pq2h9RZ9VDiGg51v50xNdjqURR1cxFM1mCohw3XN9T1ENfx6OSahvrCVaOhvuOdNq2TN7F19Xjgug/DokWLyjnnnFM2btxYnnjiiWanU/qrBkJdlXjmmWeWb7/9tlnLU/cluf3229se2qT2yy+/NPO5786P9TMCjj/++OZxXT8b46GHHipnnHFGExH1cLW6qfPaa69tddxdm+effvqpfPfdd3s/M6AeCljVaBtb48PhzXN9s3H99dc3m5LXr1/f7IM2tm9OvXz69Okl1uugDRs2NIeSbNq0qe2hdNbIyEhzOOuiRYt6M2fO7C1evLg5BHD37t1tD61zXn311WZ+p0+f3hwGuHLlyubwPw7Pe++91zxP/PW0fPnyvYddrlq1qjd37tzmUMtLL73Uc8oRmOe1a9ce8PLVq1e3PfTOzPPm/z+c9UCn+neHwldjAwBH9z4NAEB/iQYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAAEri/wD8umaZZABwXQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import seaborn as sns\n", "sns.stripplot(x=prices, jitter=0)" ] }, { "cell_type": "code", "execution_count": 14, "id": "02caade4-678c-4681-893b-04e22a865903", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.histplot(x=prices);" ] }, { "cell_type": "code", "execution_count": 15, "id": "8455cb4d-6c7b-4341-80a2-bd67126f5383", "metadata": {}, "outputs": [ { "data": { "image/png": "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ABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEQmZ78G3WXivt1j/xi/7DrslmNDO7YtGK9EA+PKjBkzyt+m9JXyzw/a9phTt25s22PRHeo2Vrc14HCigXFlYGCgvLz2H2X3bs8GGTs1GOq2BhxONDDu1J25HTpA+1kICQBERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAARCaXUWq1Ws3t0NDQaP8EANBmI8ftkeN4W6Jhz549ze2cOXNG+ycAgA6px/EZM2Yc0b+Z0BpNapRShoeHy44dO8q0adPKhAkTSjeWVA2a7du3l+nTp3d6OD3NXLeHeW4P89we5rlz81wP+zUYZs2aVSZOnNieMw31gWbPnl26XZ0kG2R7mOv2MM/tYZ7bwzx3Zp6P9AzDCAshAYCIaAAAju1o6OvrKytXrmxuGVvmuj3Mc3uY5/Ywz+Nznke9EBIAOLb07JkGAODoEg0AQEQ0AAAR0QAAHJvRcOqppzbvUPnHr2XLlnV6aD3l999/LytWrCinnXZamTp1almwYEF5+OGHR/Ve5vz/6ju33X333WXevHnNXF988cXl008/7fSwxr2NGzeWq666qnlXvLqPeOuttw67v27LDz74YDn55JObeb/sssvK119/3bHx9uo8v/HGG+Xyyy8vJ554YnP/559/3rGx9uo8HzhwoNx3333l3HPPLccdd1zzO7feemvzrs7lWI+GujP97rvvDn69/fbbzc9vuOGGTg+tpzz66KPlueeeK88880z56quvmu8fe+yx8vTTT3d6aD3njjvuaLbjtWvXli+//LLZwdYD2LffftvpoY1rP//8cznvvPPKs88++6f31+35qaeeKs8//3z5+OOPm53tFVdcUfbt29f2sfbyPNf7L7nkkmYfwtjM8969e8tnn33WPNGrtzXUNm/eXK6++uojf6BWj7vrrrtaCxYsaA0PD3d6KD1l0aJFraVLlx72s+uuu661ePHijo2pF+3du7c1adKk1vr16w/7+QUXXNBavnx5x8bVa+qu8M033zz4fd1fzJw5s/X4448f/NmuXbtafX19rXXr1nVolL03z4faunVrc/+mTZvaPq5jaZ5HfPLJJ83vDQ4Oto5Ez51pONSvv/5aXn755bJ06dKu/FCt8ayeIn/33XfLli1bmu+/+OKL8uGHH5Yrr7yy00PrKb/99lvzUlB/f/9hP6+ny+t8Mza2bt1avv/+++aMzqHv1X/hhReWjz76qKNjg6Nh9+7dzXHx+OOPb88HVo0H9TWdXbt2ldtuu63TQ+k5999/f/PpaWeddVaZNGlSc2BbtWpVWbx4caeH1lPqp8hedNFFzXqRs88+uwwMDJR169Y1B67TTz+908PrWTUYqjrfh6rfj9wH41V9ia2ucbjllluO+MPCevpMw4svvtg8862LPji6Xn/99fLKK6+UV199tXmN7KWXXipPPPFEc8vRVdcy1DOOp5xySvNWsPV19vo/+5F+pC3AgQMHyo033tjsU+q6tCPVs2caBgcHyzvvvNMs+ODou/fee5uzDTfffHPzfV2VW+d89erVZcmSJZ0eXk+pV6Z88MEHzUKnenanrua/6aabyvz58zs9tJ41c+bM5nbnzp3NfI+o359//vkdHBn89WCo++r33ntvVB9J3rNPVdasWVNOOumksmjRok4PpSfV1bh/fKZbX6YYHh7u2Jh6XV29Xw9gP/74Y9mwYUO55pprOj2knlUvJa7hUNftjKjBVq+iqC8XwXgNhnrZcH1CXS9xHY2ePNNQD1w1Guoz3smTe/I/sePq9cB1DcPcuXPLOeecUzZt2lSefPLJZtEpR1cNhHoq8cwzzyzffPNNc5anriW5/fbbOz20ce2nn35q5vPQxY/1PQJOOOGEZruu743xyCOPlDPOOKOJiHq5Wn2p89prr+3ouHttnn/44Yeybdu2g+8ZUC8FrGq0jZzx4a/Nc32ycf311zcvJa9fv75ZgzayNqfeP2XKlBJr9aANGzY0l5Js3ry500PpWUNDQ83lrHPnzm319/e35s+f31wCuH///k4Pree89tprzfxOmTKluQxw2bJlzeV//DXvv/9+s5/449eSJUsOXna5YsWK1sDAQHOp5aWXXmqfMgbzvGbNmj+9f+XKlZ0ees/M89Z/X876Z1/13x0JH40NABzbaxoAgKNLNAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAUBL/AsNpTSyq6+yZAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.boxplot(x=prices);" ] }, { "cell_type": "code", "execution_count": null, "id": "821cd7f4-9a4a-4c0f-b541-26c5b24abc6f", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "8e2d5bc9-fb90-4076-af3a-5d1199767b42", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "d501518b-8e77-4f7d-9346-82f3c071c1e0", "metadata": {}, "source": [ "### Descriptive statistics" ] }, { "cell_type": "markdown", "id": "5727115b-f58d-44ca-bf14-98eca6ac0ea4", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "#### Data manipulations using Pandas" ] }, { "cell_type": "code", "execution_count": 16, "id": "e4b22ff8-db8a-413b-bc55-61f2b64a0de9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " East West\n", "0 7.7 11.8\n", "1 5.9 10.0\n", "2 7.0 11.0\n", "3 4.8 8.6\n", "4 6.3 8.3\n", "5 6.3 9.4\n", "6 5.5 8.0\n", "7 5.4 6.8\n", "8 6.5 8.5\n" ] } ], "source": [ "import pandas as pd\n", "epriceswide = pd.read_csv(\"https://nobsstats.com/datasets/epriceswide.csv\")\n", "print(epriceswide)" ] }, { "cell_type": "code", "execution_count": 17, "id": "386037ed-cadc-455c-81b7-7877bbbbd706", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.frame.DataFrame" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(epriceswide)" ] }, { "cell_type": "markdown", "id": "3b7b850f-2022-4a84-ab3b-bf7bf145cd7b", "metadata": {}, "source": [ "We want to extract only the second column which is called \"West\":" ] }, { "cell_type": "code", "execution_count": 18, "id": "38c52689-1b5a-4053-8f76-c10a7b76cd72", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "0 11.8\n", "1 10.0\n", "2 11.0\n", "3 8.6\n", "4 8.3\n", "5 9.4\n", "6 8.0\n", "7 6.8\n", "8 8.5\n", "Name: West, dtype: float64" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pricesW = epriceswide[\"West\"]\n", "pricesW" ] }, { "cell_type": "code", "execution_count": 19, "id": "927b21a6-7b75-4ac5-b93c-2b5632e0b608", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "pandas.core.series.Series" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(pricesW)" ] }, { "cell_type": "code", "execution_count": 20, "id": "cd3b487a-545b-4680-b315-2e7d0471d63d", "metadata": {}, "outputs": [], "source": [ "# # ALT. we can input data by specifying lists of values\n", "# pricesW = pd.Series([11.8,10,11,8.6,8.3,9.4,8,6.8,8.5])" ] }, { "cell_type": "code", "execution_count": null, "id": "5cba1717-1e3b-4f94-b908-9c15381ce079", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "a70b603e-1fcd-4271-8c56-ba75ba5b2b4e", "metadata": {}, "source": [ "#### Descriptive statistics using pandas" ] }, { "cell_type": "code", "execution_count": 21, "id": "70075246-d2b0-48f0-9c26-b00b20c05bc7", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "np.int64(9)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pricesW.count()" ] }, { "cell_type": "code", "execution_count": 22, "id": "4bf01229-90ea-4352-a26e-7d4fa6c766c2", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "np.float64(9.155555555555557)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pricesW.mean()" ] }, { "cell_type": "code", "execution_count": 23, "id": "083041a3-4007-4ccd-aec5-2dbaba3fd41b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(8.6)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pricesW.median()" ] }, { "cell_type": "code", "execution_count": 24, "id": "aaff543c-6428-48b7-922a-3b3273324402", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "np.float64(1.5621388471508475)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pricesW.std()" ] }, { "cell_type": "code", "execution_count": 25, "id": "81a08643-8207-4130-93f8-8e9227f54c2e", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "count 9.000000\n", "mean 9.155556\n", "std 1.562139\n", "min 6.800000\n", "25% 8.300000\n", "50% 8.600000\n", "75% 10.000000\n", "max 11.800000\n", "Name: West, dtype: float64" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pricesW.describe()" ] }, { "cell_type": "code", "execution_count": null, "id": "0060b041-0300-4c5d-b92b-49e0b7f26511", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "345999ef-eab8-4c4d-b590-38cffc41460f", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "### Data cleaning" ] }, { "cell_type": "code", "execution_count": null, "id": "c63e5acf-1ba4-4ee7-a392-cea2a5be8b13", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "d23d66f9-3842-41c4-b6d4-48e039a9c42b", "metadata": {}, "source": [ "## How much Python do you need to know?\n", "\n", "I remind you the key aspect is to learn how to use Python as a calculator.\n", "\n", "I talked about the `for`-loops and function definitions only to make sure you can **read Python code**,\n", "but you don't need to write any such code to learn statistics.\n", "As long as you know how to call functions and run code cells in a notebook,\n", "then you'll still benefit from all the educational power that Python has to offer.\n", "\n" ] }, { "cell_type": "markdown", "id": "28fae377-556f-4e40-b477-5add145298ea", "metadata": {}, "source": [ "## Conclusion\n", "\n", "Python = good for your life!" ] }, { "cell_type": "markdown", "id": "e959a84d-532e-4138-9652-239cf888d279", "metadata": {}, "source": [ "## Links\n", "\n", "- Book website [noBSstats.com](https://nobsstats.com/intro.html): contains all the notebooks, demos, and visualizations from the book.\n", "- [Detailed book outline](https://docs.google.com/document/d/1fwep23-95U-w1QMPU31nOvUnUXE2X3s_Dbk5JuLlKAY/edit): continuously updated list of the topics that are covered in each section\n", "- [Python tutorial](https://nobsstats.com/tutorials/python_tutorial.html): introduction to Python syntax, data types, functions and other constructs.\n", " See also the [Pandas tutorial](https://nobsstats.com/tutorials/pandas_tutorial.html) (WIP) and the [Seaborn tutorial](https://nobsstats.com/tutorials/seaborn_tutorial.html) (WIP).\n", "- Previous blog posts about statistics book:\n", " - [Outline of the stats curriculum research](https://minireference.com/blog/fixing-the-introductory-statistics-curriculum/)\n", " - [Book proposal](https://minireference.com/blog/no-bullshit-guide-to-statistics-progress-update/)\n", " - [Stats survey results](https://minireference.com/blog/what-stats-do-people-want-to-learn/)\n", " - [Python coding skills for statistics - PART 2](https://docs.google.com/document/d/1XusbfJoZ7CQxbeWPPXMM84BA-VeUn8lkPUuUy7RcW8M/edit): probability and statistics procedures\n", " - PART 3: coming soon" ] }, { "cell_type": "code", "execution_count": null, "id": "87d99089-d5ef-4202-81ab-0b6634e21ede", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "77d4957e-93ec-4dac-b79f-4ef446e01a44", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "### Python error messages" ] }, { "cell_type": "code", "execution_count": 26, "id": "9753d6e6-ed60-4991-b1ff-877bc0a3f8c7", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "ZeroDivisionError", "evalue": "division by zero", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mZeroDivisionError\u001b[39m Traceback (most recent call last)", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[26]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[32;43m3\u001b[39;49m\u001b[43m/\u001b[49m\u001b[32;43m0\u001b[39;49m\n", "\u001b[31mZeroDivisionError\u001b[39m: division by zero" ] } ], "source": [ "3/0" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.12.4" } }, "nbformat": 4, "nbformat_minor": 5 }