{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "5886e925",
   "metadata": {
    "id": "5886e925"
   },
   "source": [
    "# Lecture 8 - Preprocessing and Cleaning: Missing Data; Outliers; Numerical Normalization"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6ad0a05a",
   "metadata": {
    "id": "6ad0a05a"
   },
   "source": [
    "![https://imgs.xkcd.com/comics/every_data_table.png](https://imgs.xkcd.com/comics/every_data_table.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "b788b5bb",
   "metadata": {
    "executionInfo": {
     "elapsed": 165,
     "status": "ok",
     "timestamp": 1675101882279,
     "user": {
      "displayName": "Scott Wehrwein",
      "userId": "11327482518794216604"
     },
     "user_tz": 480
    },
    "id": "b788b5bb"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import seaborn as sns\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "f95f47be",
   "metadata": {
    "id": "f95f47be"
   },
   "source": [
    "# Announcements:\n",
    "\n",
    "Let's shuffle the tables because I'm the worst and I want you to make more friends.\n",
    "\n",
    "* Keira Allison Marcus Malik\n",
    "\n",
    "* Dylan Josh Sebastian Zachary Haden\n",
    "\n",
    "* Erika Maven Finnley Narina\n",
    "\n",
    "# Goals:\n",
    "* Be aware of, and get practice deciding how to handle common issues that arise before analysis:\n",
    "   * Data types and units\n",
    "   * Missing Data\n",
    "   * Outliers\n",
    "* Know how and why to compute a few different numerical normalizations:\n",
    "  * $z$-scores\n",
    "  * 0-1 normalization\n",
    "  * Exponential normalization\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fdeeeec5",
   "metadata": {
    "id": "fdeeeec5"
   },
   "source": [
    "# Rule #1 of Data Science: GIGO"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1ae4c260",
   "metadata": {
    "id": "1ae4c260"
   },
   "outputs": [],
   "source": [
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "65c9bf6d",
   "metadata": {
    "id": "65c9bf6d"
   },
   "source": [
    "> *On two occasions I have been asked, \"Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?\" ... I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question.*\n",
    ">\n",
    "> — Charles Babbage, Passages from the Life of a Philosopher"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "MTOvNEPmsbz4",
   "metadata": {
    "id": "MTOvNEPmsbz4"
   },
   "source": [
    "# Data Pitfalls"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5ceebe4d-c62b-4ede-9476-c88882042ea0",
   "metadata": {},
   "source": [
    "Here's a \"real\" dataset that might help us think about issues we may encounter when analyzing data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "4bdc4bda-fa4e-4f8f-9360-526824f903f2",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv(\"/cluster/academic/DATA311/202620/WA_Bellingham.csv\", low_memory=False)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "119b95f1-9b7a-40a8-ad7a-460bb5ec6ea6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>STATION</th>\n",
       "      <th>DATE</th>\n",
       "      <th>REPORT_TYPE</th>\n",
       "      <th>SOURCE</th>\n",
       "      <th>AWND</th>\n",
       "      <th>BackupDirection</th>\n",
       "      <th>BackupDistance</th>\n",
       "      <th>BackupDistanceUnit</th>\n",
       "      <th>BackupElements</th>\n",
       "      <th>BackupElevation</th>\n",
       "      <th>...</th>\n",
       "      <th>ShortDurationPrecipitationValue060</th>\n",
       "      <th>ShortDurationPrecipitationValue080</th>\n",
       "      <th>ShortDurationPrecipitationValue100</th>\n",
       "      <th>ShortDurationPrecipitationValue120</th>\n",
       "      <th>ShortDurationPrecipitationValue150</th>\n",
       "      <th>ShortDurationPrecipitationValue180</th>\n",
       "      <th>Sunrise</th>\n",
       "      <th>Sunset</th>\n",
       "      <th>TStorms</th>\n",
       "      <th>WindEquipmentChangeDate</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>72797624217</td>\n",
       "      <td>2020-01-01T00:14:00</td>\n",
       "      <td>FM-16</td>\n",
       "      <td>7</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>72797624217</td>\n",
       "      <td>2020-01-01T00:24:00</td>\n",
       "      <td>FM-16</td>\n",
       "      <td>7</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>72797624217</td>\n",
       "      <td>2020-01-01T00:53:00</td>\n",
       "      <td>FM-15</td>\n",
       "      <td>7</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>72797624217</td>\n",
       "      <td>2020-01-01T01:53:00</td>\n",
       "      <td>FM-15</td>\n",
       "      <td>7</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>72797624217</td>\n",
       "      <td>2020-01-01T02:53:00</td>\n",
       "      <td>FM-15</td>\n",
       "      <td>7</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11343</th>\n",
       "      <td>72797624217</td>\n",
       "      <td>2020-12-31T20:53:00</td>\n",
       "      <td>FM-15</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11344</th>\n",
       "      <td>72797624217</td>\n",
       "      <td>2020-12-31T21:53:00</td>\n",
       "      <td>FM-15</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11345</th>\n",
       "      <td>72797624217</td>\n",
       "      <td>2020-12-31T22:53:00</td>\n",
       "      <td>FM-15</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11346</th>\n",
       "      <td>72797624217</td>\n",
       "      <td>2020-12-31T23:53:00</td>\n",
       "      <td>FM-15</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11347</th>\n",
       "      <td>72797624217</td>\n",
       "      <td>2020-12-31T23:59:00</td>\n",
       "      <td>SOD</td>\n",
       "      <td>6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>803.0</td>\n",
       "      <td>1624.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>11348 rows × 124 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "           STATION                 DATE REPORT_TYPE  SOURCE  AWND  \\\n",
       "0      72797624217  2020-01-01T00:14:00       FM-16       7   NaN   \n",
       "1      72797624217  2020-01-01T00:24:00       FM-16       7   NaN   \n",
       "2      72797624217  2020-01-01T00:53:00       FM-15       7   NaN   \n",
       "3      72797624217  2020-01-01T01:53:00       FM-15       7   NaN   \n",
       "4      72797624217  2020-01-01T02:53:00       FM-15       7   NaN   \n",
       "...            ...                  ...         ...     ...   ...   \n",
       "11343  72797624217  2020-12-31T20:53:00       FM-15       4   NaN   \n",
       "11344  72797624217  2020-12-31T21:53:00       FM-15       4   NaN   \n",
       "11345  72797624217  2020-12-31T22:53:00       FM-15       4   NaN   \n",
       "11346  72797624217  2020-12-31T23:53:00       FM-15       4   NaN   \n",
       "11347  72797624217  2020-12-31T23:59:00       SOD         6   NaN   \n",
       "\n",
       "       BackupDirection  BackupDistance  BackupDistanceUnit  BackupElements  \\\n",
       "0                  NaN             NaN                 NaN             NaN   \n",
       "1                  NaN             NaN                 NaN             NaN   \n",
       "2                  NaN             NaN                 NaN             NaN   \n",
       "3                  NaN             NaN                 NaN             NaN   \n",
       "4                  NaN             NaN                 NaN             NaN   \n",
       "...                ...             ...                 ...             ...   \n",
       "11343              NaN             NaN                 NaN             NaN   \n",
       "11344              NaN             NaN                 NaN             NaN   \n",
       "11345              NaN             NaN                 NaN             NaN   \n",
       "11346              NaN             NaN                 NaN             NaN   \n",
       "11347              NaN             NaN                 NaN             NaN   \n",
       "\n",
       "       BackupElevation  ...  ShortDurationPrecipitationValue060  \\\n",
       "0                  NaN  ...                                 NaN   \n",
       "1                  NaN  ...                                 NaN   \n",
       "2                  NaN  ...                                 NaN   \n",
       "3                  NaN  ...                                 NaN   \n",
       "4                  NaN  ...                                 NaN   \n",
       "...                ...  ...                                 ...   \n",
       "11343              NaN  ...                                 NaN   \n",
       "11344              NaN  ...                                 NaN   \n",
       "11345              NaN  ...                                 NaN   \n",
       "11346              NaN  ...                                 NaN   \n",
       "11347              NaN  ...                                 NaN   \n",
       "\n",
       "       ShortDurationPrecipitationValue080  ShortDurationPrecipitationValue100  \\\n",
       "0                                     NaN                                 NaN   \n",
       "1                                     NaN                                 NaN   \n",
       "2                                     NaN                                 NaN   \n",
       "3                                     NaN                                 NaN   \n",
       "4                                     NaN                                 NaN   \n",
       "...                                   ...                                 ...   \n",
       "11343                                 NaN                                 NaN   \n",
       "11344                                 NaN                                 NaN   \n",
       "11345                                 NaN                                 NaN   \n",
       "11346                                 NaN                                 NaN   \n",
       "11347                                 NaN                                 NaN   \n",
       "\n",
       "       ShortDurationPrecipitationValue120  ShortDurationPrecipitationValue150  \\\n",
       "0                                     NaN                                 NaN   \n",
       "1                                     NaN                                 NaN   \n",
       "2                                     NaN                                 NaN   \n",
       "3                                     NaN                                 NaN   \n",
       "4                                     NaN                                 NaN   \n",
       "...                                   ...                                 ...   \n",
       "11343                                 NaN                                 NaN   \n",
       "11344                                 NaN                                 NaN   \n",
       "11345                                 NaN                                 NaN   \n",
       "11346                                 NaN                                 NaN   \n",
       "11347                                 NaN                                 NaN   \n",
       "\n",
       "       ShortDurationPrecipitationValue180  Sunrise  Sunset  TStorms  \\\n",
       "0                                     NaN      NaN     NaN      NaN   \n",
       "1                                     NaN      NaN     NaN      NaN   \n",
       "2                                     NaN      NaN     NaN      NaN   \n",
       "3                                     NaN      NaN     NaN      NaN   \n",
       "4                                     NaN      NaN     NaN      NaN   \n",
       "...                                   ...      ...     ...      ...   \n",
       "11343                                 NaN      NaN     NaN      NaN   \n",
       "11344                                 NaN      NaN     NaN      NaN   \n",
       "11345                                 NaN      NaN     NaN      NaN   \n",
       "11346                                 NaN      NaN     NaN      NaN   \n",
       "11347                                 NaN    803.0  1624.0      NaN   \n",
       "\n",
       "      WindEquipmentChangeDate  \n",
       "0                         NaN  \n",
       "1                         NaN  \n",
       "2                         NaN  \n",
       "3                         NaN  \n",
       "4                         NaN  \n",
       "...                       ...  \n",
       "11343                     NaN  \n",
       "11344                     NaN  \n",
       "11345                     NaN  \n",
       "11346                     NaN  \n",
       "11347                     NaN  \n",
       "\n",
       "[11348 rows x 124 columns]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "869f978f-2886-40cd-8cb3-715ca51b965b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['STATION',\n",
       " 'DATE',\n",
       " 'REPORT_TYPE',\n",
       " 'SOURCE',\n",
       " 'AWND',\n",
       " 'BackupDirection',\n",
       " 'BackupDistance',\n",
       " 'BackupDistanceUnit',\n",
       " 'BackupElements',\n",
       " 'BackupElevation',\n",
       " 'BackupElevationUnit',\n",
       " 'BackupEquipment',\n",
       " 'BackupLatitude',\n",
       " 'BackupLongitude',\n",
       " 'BackupName',\n",
       " 'CDSD',\n",
       " 'CLDD',\n",
       " 'DSNW',\n",
       " 'DailyAverageDewPointTemperature',\n",
       " 'DailyAverageDryBulbTemperature',\n",
       " 'DailyAverageRelativeHumidity',\n",
       " 'DailyAverageSeaLevelPressure',\n",
       " 'DailyAverageStationPressure',\n",
       " 'DailyAverageWetBulbTemperature',\n",
       " 'DailyAverageWindSpeed',\n",
       " 'DailyCoolingDegreeDays',\n",
       " 'DailyDepartureFromNormalAverageTemperature',\n",
       " 'DailyHeatingDegreeDays',\n",
       " 'DailyMaximumDryBulbTemperature',\n",
       " 'DailyMinimumDryBulbTemperature',\n",
       " 'DailyPeakWindDirection',\n",
       " 'DailyPeakWindSpeed',\n",
       " 'DailyPrecipitation',\n",
       " 'DailySnowDepth',\n",
       " 'DailySnowfall',\n",
       " 'DailySustainedWindDirection',\n",
       " 'DailySustainedWindSpeed',\n",
       " 'DailyWeather',\n",
       " 'HDSD',\n",
       " 'HTDD',\n",
       " 'HeavyFog',\n",
       " 'HourlyAltimeterSetting',\n",
       " 'HourlyDewPointTemperature',\n",
       " 'HourlyDryBulbTemperature',\n",
       " 'HourlyPrecipitation',\n",
       " 'HourlyPresentWeatherType',\n",
       " 'HourlyPressureChange',\n",
       " 'HourlyPressureTendency',\n",
       " 'HourlyRelativeHumidity',\n",
       " 'HourlySeaLevelPressure',\n",
       " 'HourlySkyConditions',\n",
       " 'HourlyStationPressure',\n",
       " 'HourlyVisibility',\n",
       " 'HourlyWetBulbTemperature',\n",
       " 'HourlyWindDirection',\n",
       " 'HourlyWindGustSpeed',\n",
       " 'HourlyWindSpeed',\n",
       " 'MonthlyAverageRH',\n",
       " 'MonthlyDaysWithGT001Precip',\n",
       " 'MonthlyDaysWithGT010Precip',\n",
       " 'MonthlyDaysWithGT32Temp',\n",
       " 'MonthlyDaysWithGT90Temp',\n",
       " 'MonthlyDaysWithLT0Temp',\n",
       " 'MonthlyDaysWithLT32Temp',\n",
       " 'MonthlyDepartureFromNormalAverageTemperature',\n",
       " 'MonthlyDepartureFromNormalCoolingDegreeDays',\n",
       " 'MonthlyDepartureFromNormalHeatingDegreeDays',\n",
       " 'MonthlyDepartureFromNormalMaximumTemperature',\n",
       " 'MonthlyDepartureFromNormalMinimumTemperature',\n",
       " 'MonthlyDepartureFromNormalPrecipitation',\n",
       " 'MonthlyDewpointTemperature',\n",
       " 'MonthlyGreatestPrecip',\n",
       " 'MonthlyGreatestPrecipDate',\n",
       " 'MonthlyGreatestSnowDepth',\n",
       " 'MonthlyGreatestSnowDepthDate',\n",
       " 'MonthlyGreatestSnowfall',\n",
       " 'MonthlyGreatestSnowfallDate',\n",
       " 'MonthlyMaxSeaLevelPressureValue',\n",
       " 'MonthlyMaxSeaLevelPressureValueDate',\n",
       " 'MonthlyMaxSeaLevelPressureValueTime',\n",
       " 'MonthlyMaximumTemperature',\n",
       " 'MonthlyMeanTemperature',\n",
       " 'MonthlyMinSeaLevelPressureValue',\n",
       " 'MonthlyMinSeaLevelPressureValueDate',\n",
       " 'MonthlyMinSeaLevelPressureValueTime',\n",
       " 'MonthlyMinimumTemperature',\n",
       " 'MonthlySeaLevelPressure',\n",
       " 'MonthlyStationPressure',\n",
       " 'MonthlyTotalLiquidPrecipitation',\n",
       " 'MonthlyTotalSnowfall',\n",
       " 'MonthlyWetBulb',\n",
       " 'NormalsCoolingDegreeDay',\n",
       " 'NormalsHeatingDegreeDay',\n",
       " 'REM',\n",
       " 'REPORT_TYPE.1',\n",
       " 'SOURCE.1',\n",
       " 'ShortDurationEndDate005',\n",
       " 'ShortDurationEndDate010',\n",
       " 'ShortDurationEndDate015',\n",
       " 'ShortDurationEndDate020',\n",
       " 'ShortDurationEndDate030',\n",
       " 'ShortDurationEndDate045',\n",
       " 'ShortDurationEndDate060',\n",
       " 'ShortDurationEndDate080',\n",
       " 'ShortDurationEndDate100',\n",
       " 'ShortDurationEndDate120',\n",
       " 'ShortDurationEndDate150',\n",
       " 'ShortDurationEndDate180',\n",
       " 'ShortDurationPrecipitationValue005',\n",
       " 'ShortDurationPrecipitationValue010',\n",
       " 'ShortDurationPrecipitationValue015',\n",
       " 'ShortDurationPrecipitationValue020',\n",
       " 'ShortDurationPrecipitationValue030',\n",
       " 'ShortDurationPrecipitationValue045',\n",
       " 'ShortDurationPrecipitationValue060',\n",
       " 'ShortDurationPrecipitationValue080',\n",
       " 'ShortDurationPrecipitationValue100',\n",
       " 'ShortDurationPrecipitationValue120',\n",
       " 'ShortDurationPrecipitationValue150',\n",
       " 'ShortDurationPrecipitationValue180',\n",
       " 'Sunrise',\n",
       " 'Sunset',\n",
       " 'TStorms',\n",
       " 'WindEquipmentChangeDate']"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(df.columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "8d9b7186-c3e3-4c45-aa0c-e5c305c3ff31",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>DATE</th>\n",
       "      <th>HourlyDryBulbTemperature</th>\n",
       "      <th>HourlyPrecipitation</th>\n",
       "      <th>HourlySkyConditions</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2020-01-01T00:53:00</td>\n",
       "      <td>53</td>\n",
       "      <td>0.00</td>\n",
       "      <td>FEW:02 28 SCT:04 34 BKN:07 95</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2020-01-01T01:53:00</td>\n",
       "      <td>52</td>\n",
       "      <td>0.00</td>\n",
       "      <td>CLR:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2020-01-01T02:53:00</td>\n",
       "      <td>52</td>\n",
       "      <td>0.00</td>\n",
       "      <td>SCT:04 90 BKN:07 110</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>2020-01-01T03:53:00</td>\n",
       "      <td>52</td>\n",
       "      <td>0.00</td>\n",
       "      <td>SCT:04 95</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>2020-01-01T04:53:00</td>\n",
       "      <td>51</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11342</th>\n",
       "      <td>2020-12-31T19:53:00</td>\n",
       "      <td>46</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11343</th>\n",
       "      <td>2020-12-31T20:53:00</td>\n",
       "      <td>49</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11344</th>\n",
       "      <td>2020-12-31T21:53:00</td>\n",
       "      <td>50</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11345</th>\n",
       "      <td>2020-12-31T22:53:00</td>\n",
       "      <td>49</td>\n",
       "      <td>0.01</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11346</th>\n",
       "      <td>2020-12-31T23:53:00</td>\n",
       "      <td>49</td>\n",
       "      <td>0.03</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8768 rows × 4 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                      DATE HourlyDryBulbTemperature HourlyPrecipitation  \\\n",
       "2      2020-01-01T00:53:00                       53                0.00   \n",
       "3      2020-01-01T01:53:00                       52                0.00   \n",
       "4      2020-01-01T02:53:00                       52                0.00   \n",
       "5      2020-01-01T03:53:00                       52                0.00   \n",
       "6      2020-01-01T04:53:00                       51                 NaN   \n",
       "...                    ...                      ...                 ...   \n",
       "11342  2020-12-31T19:53:00                       46                 NaN   \n",
       "11343  2020-12-31T20:53:00                       49                 NaN   \n",
       "11344  2020-12-31T21:53:00                       50                 NaN   \n",
       "11345  2020-12-31T22:53:00                       49                0.01   \n",
       "11346  2020-12-31T23:53:00                       49                0.03   \n",
       "\n",
       "                 HourlySkyConditions  \n",
       "2      FEW:02 28 SCT:04 34 BKN:07 95  \n",
       "3                             CLR:00  \n",
       "4               SCT:04 90 BKN:07 110  \n",
       "5                          SCT:04 95  \n",
       "6                                NaN  \n",
       "...                              ...  \n",
       "11342                            NaN  \n",
       "11343                            NaN  \n",
       "11344                            NaN  \n",
       "11345                            NaN  \n",
       "11346                            NaN  \n",
       "\n",
       "[8768 rows x 4 columns]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby(\"REPORT_TYPE\").get_group(\"FM-15\")[[\"DATE\", \"HourlyDryBulbTemperature\", \"HourlyPrecipitation\", \"HourlySkyConditions\"]]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "44878180",
   "metadata": {
    "id": "44878180"
   },
   "source": [
    "A potentially insidious example: In the LCD data, there are two types of Hourly reports: FM-15 and FM-16. The latter appears to be taken more frequently than hourly, only when aviators need more frequent updates due to some interesting weather. What might this mean for if:\n",
    "* you investigate how often thunderstorms happen by counting hourly measurements with thunderstorms in the weather column?\n",
    "* you compare average wind speeds in two cities, one of which has very gusty (i.e., variable) winds often, while the other has high sustained winds more often?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4d7a5ef2",
   "metadata": {
    "id": "4d7a5ef2"
   },
   "source": [
    "# Data Cleaning Worksheet\n",
    "Sometimes data should be there but isn't. What would you do here?\n",
    "\n",
    "Complete the worksheet in groups of two.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ce9af722",
   "metadata": {
    "id": "ce9af722"
   },
   "source": [
    "What general strategies can we extract from these examples?\n",
    "\n",
    "* \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "77386f05",
   "metadata": {
    "id": "77386f05"
   },
   "outputs": [],
   "source": [
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6313d082",
   "metadata": {
    "id": "6313d082"
   },
   "source": [
    "What strategies for handling missing data can we extract from the above (and some others that may not have come up)?\n",
    "* Heuristics (birth + life expectancy for Year of Death)\n",
    "* Mean value (fill in the average)\n",
    "* Random value (fill in garbage)\n",
    "* Nearest Neighbor (in time, or most-similar datapoint)\n",
    "* Interpolation / imputation"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "463d8348",
   "metadata": {
    "id": "463d8348"
   },
   "source": [
    "### More things to watch out for when approaching a new dataset\n",
    "\n",
    "* Data types and units\n",
    "    * Kilograms vs pounds\n",
    "* Numerical representations\n",
    "  * 1.6e1 vs 16 vs 16.0 vs sixteen vs 32/2\n",
    "  * Generally, do processing on floats unless (and perhaps even when) the underlying data is integral\n",
    "\n",
    "* Unification and general apples-to-apples issues\n",
    "    * Money - inflation, economic context\n",
    "    * Time zones\n",
    "    * Multiple data sources - name differences (Wehrwein, S. vs Scott Wehrwein)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "zeCeXLBRsUJR",
   "metadata": {
    "id": "zeCeXLBRsUJR"
   },
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "HLf0zB5VIsEm",
   "metadata": {
    "id": "HLf0zB5VIsEm"
   },
   "source": [
    "# Outliers\n",
    "\n",
    "- An **outlier** is a datapoint that is significantly separated from the main body of observations/data\n",
    "- Several causes:\n",
    "  - They can actual, valid observations/measurement. \n",
    "    - The \"heavier tail\" the distribution that the data comes from is, the more likely these are to appear. \"Heavy tail\" has more likelihood of things far from the mean appearing.\n",
    "  - Data entry errors; e.g., punching in the wrong numbers\n",
    "  - Fraud; e.g., tampering with the data\n",
    "  - Instrument error; e.g., malfunctioning sensor\n",
    "  - Imputation gone awry\n",
    "  \n",
    "Strategies for dealing with outliers that you've decided are erroneous - treat as missing data.\n",
    "\n",
    "**Be careful - could you be wrong?** How would this affect the outcomes of your analysis?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "168ba014",
   "metadata": {
    "id": "168ba014"
   },
   "source": [
    "## Numerical Normalization"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9716cf6b",
   "metadata": {
    "id": "9716cf6b"
   },
   "source": [
    "Let's load up the NHANES body measurement dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "e06b9dbb",
   "metadata": {
    "id": "e06b9dbb"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Gender</th>\n",
       "      <th>Age</th>\n",
       "      <th>Weight</th>\n",
       "      <th>Height</th>\n",
       "      <th>Leg</th>\n",
       "      <th>Arm</th>\n",
       "      <th>Arm Cir</th>\n",
       "      <th>Waist Cir</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2.0</td>\n",
       "      <td>66.0</td>\n",
       "      <td>79.5</td>\n",
       "      <td>158.3</td>\n",
       "      <td>37.0</td>\n",
       "      <td>36.0</td>\n",
       "      <td>32.0</td>\n",
       "      <td>101.8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>2.0</td>\n",
       "      <td>66.0</td>\n",
       "      <td>53.5</td>\n",
       "      <td>150.2</td>\n",
       "      <td>31.8</td>\n",
       "      <td>30.6</td>\n",
       "      <td>27.4</td>\n",
       "      <td>88.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>2.0</td>\n",
       "      <td>75.0</td>\n",
       "      <td>88.8</td>\n",
       "      <td>151.1</td>\n",
       "      <td>31.9</td>\n",
       "      <td>36.0</td>\n",
       "      <td>38.1</td>\n",
       "      <td>113.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1.0</td>\n",
       "      <td>56.0</td>\n",
       "      <td>62.1</td>\n",
       "      <td>170.6</td>\n",
       "      <td>40.1</td>\n",
       "      <td>37.2</td>\n",
       "      <td>30.8</td>\n",
       "      <td>86.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>1.0</td>\n",
       "      <td>67.0</td>\n",
       "      <td>74.9</td>\n",
       "      <td>178.6</td>\n",
       "      <td>39.1</td>\n",
       "      <td>41.4</td>\n",
       "      <td>30.6</td>\n",
       "      <td>99.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8697</th>\n",
       "      <td>1.0</td>\n",
       "      <td>33.0</td>\n",
       "      <td>76.9</td>\n",
       "      <td>180.1</td>\n",
       "      <td>45.2</td>\n",
       "      <td>41.0</td>\n",
       "      <td>32.9</td>\n",
       "      <td>85.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8699</th>\n",
       "      <td>2.0</td>\n",
       "      <td>70.0</td>\n",
       "      <td>49.0</td>\n",
       "      <td>156.5</td>\n",
       "      <td>34.4</td>\n",
       "      <td>32.6</td>\n",
       "      <td>25.1</td>\n",
       "      <td>82.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8700</th>\n",
       "      <td>1.0</td>\n",
       "      <td>42.0</td>\n",
       "      <td>97.4</td>\n",
       "      <td>164.9</td>\n",
       "      <td>38.2</td>\n",
       "      <td>36.6</td>\n",
       "      <td>40.6</td>\n",
       "      <td>114.8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8701</th>\n",
       "      <td>2.0</td>\n",
       "      <td>41.0</td>\n",
       "      <td>69.1</td>\n",
       "      <td>162.6</td>\n",
       "      <td>39.2</td>\n",
       "      <td>35.2</td>\n",
       "      <td>26.8</td>\n",
       "      <td>86.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8703</th>\n",
       "      <td>1.0</td>\n",
       "      <td>38.0</td>\n",
       "      <td>111.5</td>\n",
       "      <td>175.8</td>\n",
       "      <td>42.5</td>\n",
       "      <td>38.0</td>\n",
       "      <td>40.0</td>\n",
       "      <td>122.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5193 rows × 8 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      Gender   Age  Weight  Height   Leg   Arm  Arm Cir  Waist Cir\n",
       "2        2.0  66.0    79.5   158.3  37.0  36.0     32.0      101.8\n",
       "5        2.0  66.0    53.5   150.2  31.8  30.6     27.4       88.2\n",
       "6        2.0  75.0    88.8   151.1  31.9  36.0     38.1      113.0\n",
       "8        1.0  56.0    62.1   170.6  40.1  37.2     30.8       86.6\n",
       "10       1.0  67.0    74.9   178.6  39.1  41.4     30.6       99.7\n",
       "...      ...   ...     ...     ...   ...   ...      ...        ...\n",
       "8697     1.0  33.0    76.9   180.1  45.2  41.0     32.9       85.5\n",
       "8699     2.0  70.0    49.0   156.5  34.4  32.6     25.1       82.2\n",
       "8700     1.0  42.0    97.4   164.9  38.2  36.6     40.6      114.8\n",
       "8701     2.0  41.0    69.1   162.6  39.2  35.2     26.8       86.4\n",
       "8703     1.0  38.0   111.5   175.8  42.5  38.0     40.0      122.0\n",
       "\n",
       "[5193 rows x 8 columns]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_url = \"https://fw.cs.wwu.edu/~wehrwes/courses/data311_21f/data/NHANES/NHANES.csv\"\n",
    "cols_renamed = {\"SEQN\": \"SEQN\",\n",
    "                \"RIAGENDR\": \"Gender\", # 1 = M, 2 = F\n",
    "                \"RIDAGEYR\": \"Age\", # years\n",
    "                \"BMXWT\": \"Weight\", # kg\n",
    "                \"BMXHT\": \"Height\", # cm\n",
    "                \"BMXLEG\": \"Leg\", # cm\n",
    "                \"BMXARML\": \"Arm\", # cm\n",
    "                \"BMXARMC\": \"Arm Cir\", # cm\n",
    "                \"BMXWAIST\": \"Waist Cir\"} # cm\n",
    "\n",
    "df = pd.read_csv(data_url)\n",
    "df = df.rename(cols_renamed, axis='columns')\n",
    "df = df.drop(\"SEQN\", axis='columns')\n",
    "df = df[df[\"Age\"] >= 21]\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3cWdTpTaw6XM",
   "metadata": {
    "id": "3cWdTpTaw6XM"
   },
   "source": [
    "In the NHANES dataset, heights and other length measurements are given in centimeters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "7c9f3aed",
   "metadata": {
    "id": "7c9f3aed"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2       158.3\n",
       "5       150.2\n",
       "6       151.1\n",
       "8       170.6\n",
       "10      178.6\n",
       "        ...  \n",
       "8697    180.1\n",
       "8699    156.5\n",
       "8700    164.9\n",
       "8701    162.6\n",
       "8703    175.8\n",
       "Name: Height, Length: 5193, dtype: float64"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ht_col = df[\"Height\"]\n",
    "ht_col"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "FJ4Oxg6CwM7m",
   "metadata": {
    "id": "FJ4Oxg6CwM7m"
   },
   "source": [
    "\n",
    "**Question**: If you're 160cm tall, are you short? tall? average?\n",
    "**Answer:** "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "160f685f",
   "metadata": {
    "id": "160f685f"
   },
   "source": [
    "## $z$-scores\n",
    "To compute a $z$-score:\n",
    "1. Subtract the mean\n",
    "2. Divide by the standard deviation.\n",
    "\n",
    "In math:\n",
    "$$ \\hat{x}_i = \\frac{x_i -\\mu}{\\sigma}$$\n",
    "\n",
    "In pandas:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "77c14b4d",
   "metadata": {
    "id": "77c14b4d"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2      -0.787712\n",
       "5      -1.589290\n",
       "6      -1.500226\n",
       "8       0.429499\n",
       "10      1.221180\n",
       "          ...   \n",
       "8697    1.369621\n",
       "8699   -0.965840\n",
       "8700   -0.134575\n",
       "8701   -0.362183\n",
       "8703    0.944092\n",
       "Name: Height-z, Length: 5193, dtype: float64"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"Height-z\"] = (ht_col - ht_col.mean()) / ht_col.std()\n",
    "df[\"Height-z\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "91f89450-c94c-4a12-9377-eddfdec5c0f6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: xlabel='Height', ylabel='Count'>"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.histplot(x=\"Height\", data=df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "1f3a4e4c",
   "metadata": {
    "id": "1f3a4e4c"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: xlabel='Height-z', ylabel='Count'>"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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ISGhxXPCw8P1cb6ePXu2WFb94Ag73uN6+Y5rxjULNN5jXDOT32dqPNDFdJFOLiwsTIYMGSJ79uzxeFzdT0tLs6xeAADAHjp9y46iuqTuuusuGTp0qNx4443ywgsvyKeffir33Xef1VUDAAAWMyLs3HHHHXqbhccff1wvKjho0CB54403pG/fvu3+mqqb69FHH72guwtcL3/hPcY1CzTeY1yzjhDeCf6/DFGjlK2uBAAAQKB0+jE7AAAAbSHsAAAAoxF2AACA0Qg7AADAaIQdL0yePFnvnt69e3dJSkrS09w/++yzwP90OvEGcWpj1v79+0uPHj3kiiuu0CP11T5maNmyZcv0ulARERGtLnAZ7J577jn9nlK/h2ptrXfffdfqKtnaO++8I5MmTdIry6qV4V999VWrq2RratPoYcOGicPh0BtWTpkyRT766COrq2Vb69evl2uuuca9kKBa9uWvf/2r2BVhxwujRo2SP/zhD/qN/6c//Uk+/vhj+e53vxv4n04n9eGHH+otOH7961/LsWPHZPXq1fL888/Lww8/bHXVbEsFwe9973sye/Zsq6tiS9u3b5fMzExZunSp/Otf/5JbbrlFJkyYoNfTQsvq6urk2muvlXXr1nGJvJCTkyNz5syRAwcO6EVpGxsb9WaX6jriQn369JEnnnhCDh48qI/Ro0fLt7/9bf2Zb0dMPW+H119/Xad+tXN6t27d/P9TMdBTTz2l/xL45JNPrK6KrW3atEn/p37q1Cmrq2Irw4cPl+uvv16/h1y+/vWv699D9Rc52qZadnbs2KGvF7xz4sQJ3cKjQtCtt97KZfNCTEyM/qxXLft2Q8uOj9SGob///e91lwNBx3tVVVX6FwFoT6vXoUOH9F/Z51P3c3NzuaAI2GeWwufWxZ07d062bdumW8FUd5YdEXa89NBDD0lkZKTeGV01nb/22muB/ckYRHX7rV27lu070C5ffPGF/jBtvrGvut98A2DAH9Rau2oboptvvlmvyI+WHTlyRC677DK9crLankm1Hl511VViR0EbdrKysnTTbluH6od0+elPf6rHCuzevVvvsv7DH/5Q/0IEE1+vmaIGct922216PMo999wjwaQ91wutU9frfOr3r/ljgD/MnTtX8vPz5eWXX+aCtuHKK6+Uw4cP63FOarzhjBkz5P333xc7MmJvrPa+me+88842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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.histplot(x=\"Height-z\", data=df)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f879632a",
   "metadata": {
    "id": "f879632a"
   },
   "source": [
    "Nice properties of $z$-scores:\n",
    "  - $\\hat{x}_i < 0$, smaller than average\n",
    "  - $\\hat{x}_i > 0$, greater than average\n",
    "  - $\\hat{x}_i > 1$, more than one standard deviation above average\n",
    "  - etc.\n",
    "  - Can give context to how normal or anomalous a datapoint is"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "P53qWccSfg3T",
   "metadata": {
    "id": "P53qWccSfg3T"
   },
   "source": [
    "## 0-1 normalization\n",
    "$$ \\hat{x}_i = \\frac{x_i - x_{min}}{x_{max}-x_{min}}$$\n",
    "  - Here $x_{max}$ and $x_{min}$ are the max/min values observed in the dataset -- ***or*** a theoretical min or max.\n",
    "  - Warning: if a new datapoint comes along and you use the same mapping, can get values that are $<0$ or $>1$.\n",
    "  - We did this with images!\n",
    "\n",
    "## Exponentiation\n",
    "If we need to to make values non-negative, can exponentiate:\n",
    "$$ \\hat{x}_i = e^{x_i}$$\n",
    "  - $x_i \\to -\\infty$, normalized value approaches 0\n",
    "  - $x_i \\to \\infty$, normalized value gets large quickly!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "aq20pzLdxSZy",
   "metadata": {
    "id": "aq20pzLdxSZy"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(-5,5,num=10000)\n",
    "\n",
    "sns.lineplot(x=x, y = np.exp(x))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8fd1d104-51bf-41e4-bf11-dbbcd2425ab0",
   "metadata": {},
   "source": [
    "Common case: you have a collection of values that you want to turn into probabilities.\n",
    "\n",
    "Normalization scheme: **softmax**\n",
    "\n",
    "$$\n",
    "\\hat{x_i} = \\frac{e^{x_i}}{\\sum_{j=1}^{K} e^{x_j}}\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "c801480f-9d47-42e4-aef1-f4d2f518cd42",
   "metadata": {},
   "outputs": [],
   "source": [
    "def softmax(x):\n",
    "    ex = np.exp(x)\n",
    "    return ex / np.sum(ex)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "94d0f864-34f6-4984-81a6-dbe0db4953ab",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.33333333, 0.33333333, 0.33333333])"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "softmax(np.array([1, 1, 1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "ea1547d3-e56a-4752-8873-d5ee0fdcbce0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.01321289, 0.26538793, 0.72139918])"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "softmax(np.array([-1, 2, 3]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ddb064e2-e5ff-445d-b04a-264ffbd2e5ef",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "colab": {
   "provenance": []
  },
  "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.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
