{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## NCAA March Madness\n", "\n", "### Preliminary Analysis of First Round Upsets\n", "\n", "The objective of the [Skatsbetball Tournament 2018](http://thisisstatistics.org/home-2/statsketball/) [Upset Challenge](http://thisisstatistics.org/home-2/statsketball/statsketball-guidelines/) is to predict the 32 winners of the First Round in the [2018 NCAA Men's Division I Basketball Tournament](https://www.ncaa.com/march-madness).\n", "\n", "In order to do well in this contest, you need to decide how many upsets to pick in the first round. After all, the purpose of the seeding is to make it more likely that the higher-seeded teams make it to the later rounds. If the tournament committee does it's job well, the higher-seeded teams should be measurably better than their first round opponents.\n", "\n", "Picking upsets is also important for filling out a regular March Madness bracket. To avoid having upsets bust your bracket, it can help to have a sense of the reasonable number of upsets to pick, and which seeds are more likely to fall early in the tournament.\n", "\n", "One reasonable way to assess the likelihood of first round upsets is to see how many have occurred historically. This notebook examines all first round NCAA tournament results from 1985 through 2017 to see how the higher seeds have fared." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "from matplotlib.colors import rgb2hex\n", "import seaborn as sns\n", "sns.set()\n", "sns.set_context('notebook')\n", "plt.style.use('ggplot')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from pathlib import Path" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "PROJECT_DIR = Path.cwd().parent\n", "DATA_DIR = PROJECT_DIR / 'data' / 'scraped'\n", "DATA_DIR.mkdir(exist_ok=True, parents=True)\n", "OUTPUT_DIR = PROJECT_DIR / 'data' / 'prepared'\n", "OUTPUT_DIR.mkdir(exist_ok=True, parents=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Loading the Data\n", "\n", "We previously obtained historical NCAA tournament data from the [Washington Post's NCAA Tournament site](https://apps.washingtonpost.com/sports/apps/live-updating-mens-ncaa-basketball-bracket/search/) and saved it as a CSV file.\n", "\n", "Let's load in the data and prepare it for analysis." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def load_tournament_games():\n", " filename = 'games-washpost.csv'\n", " csvfile = DATA_DIR.joinpath(filename)\n", " df = pd.read_csv(csvfile)\n", " df.columns = df.columns.str.rstrip()\n", " return df.rename(columns={'year': 'Year', 'round': 'Round',})" ] }, { "cell_type": "code", "execution_count": 6, "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>Year</th>\n", " <th>Round</th>\n", " <th>seed1</th>\n", " <th>team1</th>\n", " <th>score1</th>\n", " <th>seed2</th>\n", " <th>team2</th>\n", " <th>score2</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>2017</td>\n", " <td>1</td>\n", " <td>5</td>\n", " <td>Notre Dame</td>\n", " <td>60</td>\n", " <td>12</td>\n", " <td>Princeton</td>\n", " <td>58</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>2017</td>\n", " <td>1</td>\n", " <td>4</td>\n", " <td>West Virginia</td>\n", " <td>86</td>\n", " <td>13</td>\n", " <td>Bucknell</td>\n", " <td>80</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>2017</td>\n", " <td>1</td>\n", " <td>5</td>\n", " <td>Virginia</td>\n", " <td>76</td>\n", " <td>12</td>\n", " <td>UNC Wilmington</td>\n", " <td>71</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>2017</td>\n", " <td>1</td>\n", " <td>4</td>\n", " <td>Florida</td>\n", " <td>80</td>\n", " <td>13</td>\n", " <td>East Tennessee State</td>\n", " <td>65</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>2017</td>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>Gonzaga</td>\n", " <td>66</td>\n", " <td>16</td>\n", " <td>South Dakota State</td>\n", " <td>46</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " Year Round seed1 team1 score1 seed2 team2 \\\n", "0 2017 1 5 Notre Dame 60 12 Princeton \n", "1 2017 1 4 West Virginia 86 13 Bucknell \n", "2 2017 1 5 Virginia 76 12 UNC Wilmington \n", "3 2017 1 4 Florida 80 13 East Tennessee State \n", "4 2017 1 1 Gonzaga 66 16 South Dakota State \n", "\n", " score2 \n", "0 58 \n", "1 80 \n", "2 71 \n", "3 65 \n", "4 46 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "load_tournament_games().head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Determining Winners, Losers and Upsets\n", "\n", "We are going to create various new columns in our `DataFrame` to allow us to analyze the upsets in various ways.\n", "\n", "We will use the `pandas` `apply()` method to add columns with the correct information for each row of data." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def winner(row):\n", " if row['score1'] > row['score2']:\n", " return row['team1']\n", " else:\n", " return row['team2']" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def loser(row):\n", " if row['score1'] > row['score2']:\n", " return row['team2']\n", " else:\n", " return row['team1']" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def winner_seed(row):\n", " if row['score1'] > row['score2']:\n", " return row['seed1']\n", " else:\n", " return row['seed2'] " ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def loser_seed(row):\n", " if row['score1'] > row['score2']:\n", " return row['seed2']\n", " else:\n", " return row['seed1']" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def higher_seed(row):\n", " return min(row['seed1'], row['seed2'])" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def winner_score(row):\n", " return max(row['score1'], row['score2']) " ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def loser_score(row):\n", " return min(row['score1'], row['score2']) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can put everything together in one function to load and format the data." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def tournament_games():\n", " df = load_tournament_games()\n", " df['HigherSeed'] = df.apply(higher_seed, axis=1)\n", " df['Winner'] = df.apply(winner, axis=1)\n", " df['Loser'] = df.apply(loser, axis=1)\n", " df['WinnerSeed'] = df.apply(winner_seed, axis=1)\n", " df['LoserSeed'] = df.apply(loser_seed, axis=1)\n", " df['WinnerScore'] = df.apply(winner_score, axis=1)\n", " df['LoserScore'] = df.apply(loser_score, axis=1)\n", " df = df.drop(columns=[\n", " 'seed1',\n", " 'team1',\n", " 'score1',\n", " 'seed2',\n", " 'team2',\n", " 'score2',\n", " ])\n", " winner_cols = [col for col in df.columns if 'Winner' in col]\n", " loser_cols = [col for col in df.columns if 'Loser' in col]\n", " cols = ['Year', 'Round', 'HigherSeed'] + winner_cols + loser_cols\n", " return df[cols].sort_values(['Year', 'Round']).reset_index(drop=True)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2079, 9)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "games = tournament_games()\n", "games.shape" ] }, { "cell_type": "code", "execution_count": 16, "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>Year</th>\n", " <th>Round</th>\n", " <th>HigherSeed</th>\n", " <th>Winner</th>\n", " <th>WinnerSeed</th>\n", " <th>WinnerScore</th>\n", " <th>Loser</th>\n", " <th>LoserSeed</th>\n", " <th>LoserScore</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>1985</td>\n", " <td>1</td>\n", " <td>6</td>\n", " <td>Boston College</td>\n", " <td>11</td>\n", " <td>55</td>\n", " <td>Texas Tech</td>\n", " <td>6</td>\n", " <td>53</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>1985</td>\n", " <td>1</td>\n", " <td>7</td>\n", " <td>Alabama</td>\n", " <td>7</td>\n", " <td>50</td>\n", " <td>Arizona</td>\n", " <td>10</td>\n", " <td>41</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>1985</td>\n", " <td>1</td>\n", " <td>2</td>\n", " <td>Virginia Commonwealth</td>\n", " <td>2</td>\n", " <td>81</td>\n", " <td>Marshall</td>\n", " <td>15</td>\n", " <td>65</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>1985</td>\n", " <td>1</td>\n", " <td>3</td>\n", " <td>Illinois</td>\n", " <td>3</td>\n", " <td>76</td>\n", " <td>Northeastern</td>\n", " <td>14</td>\n", " <td>57</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>1985</td>\n", " <td>1</td>\n", " <td>6</td>\n", " <td>Georgia</td>\n", " <td>6</td>\n", " <td>67</td>\n", " <td>Wichita State</td>\n", " <td>11</td>\n", " <td>59</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " Year Round HigherSeed Winner WinnerSeed WinnerScore \\\n", "0 1985 1 6 Boston College 11 55 \n", "1 1985 1 7 Alabama 7 50 \n", "2 1985 1 2 Virginia Commonwealth 2 81 \n", "3 1985 1 3 Illinois 3 76 \n", "4 1985 1 6 Georgia 6 67 \n", "\n", " Loser LoserSeed LoserScore \n", "0 Texas Tech 6 53 \n", "1 Arizona 10 41 \n", "2 Marshall 15 65 \n", "3 Northeastern 14 57 \n", "4 Wichita State 11 59 " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "games.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This `DataFrame` is useful for analyzing later-round games as well, so let's save it for future analysis." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "filename = 'game_history-washpost-1985_2017.csv'\n", "csvfile = OUTPUT_DIR.joinpath(filename)\n", "games.to_csv(csvfile, index=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### First Round Results\n", "\n", "We will focus only on the first round in this notebook." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1056" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "round1 = games[games['Round'] == 1].copy()\n", "len(round1)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "33" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(round1['Year'].unique())" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "32.0" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1056/33" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have 33 years of NCAA Tournament data, with 32 games played in the first round each year.\n", "\n", "Now let's see what proportion of first round games each seed has won in the first round. Remember, there are 4 regions, with 16 seeds in each region." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1 1.000000\n", "2 0.939394\n", "3 0.840909\n", "4 0.803030\n", "5 0.643939\n", "6 0.628788\n", "7 0.613636\n", "8 0.507576\n", "9 0.492424\n", "10 0.386364\n", "11 0.371212\n", "12 0.356061\n", "13 0.196970\n", "14 0.159091\n", "15 0.060606\n", "Name: WinnerSeed, dtype: float64" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "round1['WinnerSeed'].value_counts() / (4*33)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you [look at Wikipedia](https://en.wikipedia.org/wiki/NCAA_Division_I_Men%27s_Basketball_Tournament#First_and_Second_Rounds), you'll see identical frequency data for first round victories as of the time I wrote this.\n", "\n", "We can turn these in \"upset\" frequencies by subtracting them from 1." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1 0.000000\n", "2 0.060606\n", "3 0.159091\n", "4 0.196970\n", "5 0.356061\n", "6 0.371212\n", "7 0.386364\n", "8 0.492424\n", "9 0.507576\n", "10 0.613636\n", "11 0.628788\n", "12 0.643939\n", "13 0.803030\n", "14 0.840909\n", "15 0.939394\n", "Name: WinnerSeed, dtype: float64" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 - round1['WinnerSeed'].value_counts() / (4*33)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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GrKhm2vJC80m7n+EbNLqVvnzcDQNh0CnaXoOWeFxClkxeCLZRM+1Db0dTPadsISs+G/899Jm8x70HNxP1q3bhKyYiWRHsRwx3O+pu03o7y/qXDCSVI4kO9fH8ya85keSfCZN0+9UFpgkh0IkdaU3Avvk82xWkR2tsDnZ3rCkCllYSOpGx5MND/yEbJjp18B++QRDSRVyKESSJBXGyZuSJKkwFhaSJKkwZc2xcLxFkqTe84Kz55Y2eXPlyt44F0q9XjeXDmQuneeOO+5gww03ZNasWSM/uAv0yusC5tKpui2Xer2+1uUOhUhqi2222Ybtttuu6jAklczCQpIkFcbzWEhqi5/85CdMnTqV1772tVWHIqlEpRUWfYsXlbWp56l99YJKtiuNd4888giPP/541WFIKplDIZIkqTAWFpIkqTBNDYWEEHYHPhNjXBhC2Jns0r235Xd/OcZ4drsClCRJ3WPEwiKEsAR4B/BEvmhn4LQY46ntDEySpG5RxDzCFQ0/Nzs/8Pvf/z7XX38966yTDUAcfvjhJEnS0vYvuOACHnzwQQ477LCWfn9AMx2LZcBBwBn57V2AJITw12Rdi6NijI+NKQpJPWerrbZi+vTpVYch9azly5dz1VVX8YUvfIEJEyZw++23c/LJJ/P1r3+90rhGLCxijOeGEOY2LLoG+FqM8foQwsfILl98dJviG7OhzgzWaeusirl0pl7I5ZBDDqk6hML1wusywFyKtWLkh4xKMzlNnTqVVatWcdVVV7FgwQIWLFjA/PnzufPOOznxxBMBmDVrFieddBLrrbcep556Ktdeey39/f0cdthhHHDAAVx33XWcdNJJzJw5k3XWWYd58+aN+fls5XDT82OMDw/8DHxhTBG0WdGnR+22U64Ox1w6k7l0JnPpTL2US6NmczrhhBM4//zz+fznP8+UKVN417vexdlnn82SJUuYO3cuS5cu5fTTT2fHHXfktttu47TTTmP16tUcccQRvOhFL+KEE07gYx/7GFtuuSWnn346jz32WNPbHqoAaaWw+J8QwvtjjNcA+wDXt7AOST3u17/+NbfffjsvfvGLqw5F6kl3330306dP55hjjgEgTVM++tGP8vTTT/O5z30OgGeffZYtt9ySO+64g1tvvZWjjjrqueX33nsvq1atYssttwRghx124O677x5zXK0UFu8FvhhCWA3c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\n", "text/plain": [ "<matplotlib.figure.Figure at 0x10d56b518>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fix, ax = plt.subplots(figsize=(9, 6))\n", "ax = (\n", " pd.DataFrame(round1['WinnerSeed'].value_counts() / (4*33))[1:15]\n", " .rename(columns={'WinnerSeed': 'Seed'})\n", " .plot(kind='barh', ax=ax)\n", ")\n", "ax.set_title('First Round Win Percentage for Seeds 2-15')\n", "ax.set_xticks(np.arange(0, 1, 0.1))\n", "ax.axvline(0.5, linestyle='--', color='grey')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Don't Pick Sixteenth Seeds\n", "\n", "Notice that a first seed has never lost in the first round, which is why the sixteenth seed doesn't appear in the above results.\n", "\n", "\n", "Since a first seed has never lost in the first round, we are going to exclude it from further analysis.\n", "\n", "Of course, if the NCAA Tournament continues with the same format for another 30, 50 or 100 years, eventually a sixteenth seed will advance. But unless you think the tournament committee has made a huge mistake in the seeding, don't pick the sixteenth seed to advance.\n", "\n", "#### Eight and Ninth Seeds\n", "\n", "At the other end of the spectrum, notice that the eight and ninth seed first round win frequencies are both roughly 50%.\n", "\n", "This means that the 8-9 matchups look like coin tosses in the historical data, with only a slight bias in favor of the eighth seed.\n", "\n", "#### Upsets by Seed\n", "\n", "Let's filter out the 1-16 matchups and define an upset as anytime the higher seed loses. Of course, it's not really correct to view a ninth seed victory as an upset, since those games historically look like toss-ups." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "def filter_upsets(row):\n", " return (\n", " (row['HigherSeed'] == row['LoserSeed']) &\n", " (row['HigherSeed'] in range(2, 9))\n", " )" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "round1['Upset'] = round1.apply(lambda row: filter_upsets(row), axis=1)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "upsets = round1[round1['Upset'] == True]" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "HigherSeed\n", "2 8\n", "3 21\n", "4 26\n", "5 47\n", "6 49\n", "7 51\n", "8 65\n", "Name: Year, dtype: int64" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "upsets.groupby(['HigherSeed'])['Year'].count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Upsets per Year\n", "\n", "The above counts give the total number of upsets over the 33-year historical period, grouped by seed. Let's look at the historical data grouped by year instead." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 33.000000\n", "mean 8.090909\n", "std 2.454125\n", "min 3.000000\n", "25% 7.000000\n", "50% 8.000000\n", "75% 10.000000\n", "max 13.000000\n", "dtype: float64" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "upsets.groupby(['Year']).size().describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So, on average there are 8 upsets per year. However, what we really want is the distribution of upsets by seed within a given year." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "upsets_by_year = upsets.pivot_table(\n", " index='Year',\n", " columns='HigherSeed',\n", " values='WinnerSeed', aggfunc='count'\n", ").fillna(0)" ] }, { "cell_type": "code", "execution_count": 30, "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>HigherSeed</th>\n", " <th>2</th>\n", " <th>3</th>\n", " <th>4</th>\n", " <th>5</th>\n", " <th>6</th>\n", " <th>7</th>\n", " <th>8</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>count</th>\n", " <td>33.000000</td>\n", " <td>33.000000</td>\n", " <td>33.000000</td>\n", " <td>33.000000</td>\n", " <td>33.000000</td>\n", " <td>33.000000</td>\n", " <td>33.000000</td>\n", " </tr>\n", " <tr>\n", " <th>mean</th>\n", " <td>0.242424</td>\n", " <td>0.636364</td>\n", " <td>0.787879</td>\n", " <td>1.424242</td>\n", " <td>1.484848</td>\n", " <td>1.545455</td>\n", " <td>1.969697</td>\n", " </tr>\n", " <tr>\n", " <th>std</th>\n", " <td>0.501890</td>\n", " <td>0.652791</td>\n", " <td>0.599874</td>\n", " <td>0.867118</td>\n", " <td>1.003781</td>\n", " <td>0.904534</td>\n", " <td>1.185455</td>\n", " </tr>\n", " <tr>\n", " <th>min</th>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " </tr>\n", " <tr>\n", " <th>25%</th>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " <td>1.000000</td>\n", " <td>1.000000</td>\n", " <td>1.000000</td>\n", " <td>1.000000</td>\n", " </tr>\n", " <tr>\n", " <th>50%</th>\n", " <td>0.000000</td>\n", " <td>1.000000</td>\n", " <td>1.000000</td>\n", " <td>1.000000</td>\n", " <td>1.000000</td>\n", " <td>1.000000</td>\n", " <td>2.000000</td>\n", " </tr>\n", " <tr>\n", " <th>75%</th>\n", " <td>0.000000</td>\n", " <td>1.000000</td>\n", " <td>1.000000</td>\n", " <td>2.000000</td>\n", " <td>2.000000</td>\n", " <td>2.000000</td>\n", " <td>3.000000</td>\n", " </tr>\n", " <tr>\n", " <th>max</th>\n", " <td>2.000000</td>\n", " <td>2.000000</td>\n", " <td>2.000000</td>\n", " <td>3.000000</td>\n", " <td>4.000000</td>\n", " <td>4.000000</td>\n", " <td>4.000000</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ "HigherSeed 2 3 4 5 6 7 \\\n", "count 33.000000 33.000000 33.000000 33.000000 33.000000 33.000000 \n", "mean 0.242424 0.636364 0.787879 1.424242 1.484848 1.545455 \n", "std 0.501890 0.652791 0.599874 0.867118 1.003781 0.904534 \n", "min 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "25% 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 \n", "50% 0.000000 1.000000 1.000000 1.000000 1.000000 1.000000 \n", "75% 0.000000 1.000000 1.000000 2.000000 2.000000 2.000000 \n", "max 2.000000 2.000000 2.000000 3.000000 4.000000 4.000000 \n", "\n", "HigherSeed 8 \n", "count 33.000000 \n", "mean 1.969697 \n", "std 1.185455 \n", "min 0.000000 \n", "25% 1.000000 \n", "50% 2.000000 \n", "75% 3.000000 \n", "max 4.000000 " ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "upsets_by_year.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check that the above pivot table ties back to the original win frequency data. If we sum up the number of upsets by higher seed and divide by the total number of historical games, we should get back the upset frequencies we computed above." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "HigherSeed\n", "2 0.060606\n", "3 0.159091\n", "4 0.196970\n", "5 0.356061\n", "6 0.371212\n", "7 0.386364\n", "8 0.492424\n", "dtype: float64" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "upsets_by_year.sum() / (4*33)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since a picture is worth a thousand words, let's visualize the number of first round upsets by seed, by year." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "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332MHz++33FJkqTBYdA/+LQ/1lhjDdZYY41Kt/HKK68wceJEbrvtNp599lmeffZZDj74YK655hqGDRvy+awkSWqAlk64pkyZwo033sjJJ5/Mz372M2644QaWWGIJRo4cycc+9jEA/vrXv/LlL3+ZGTNmsNNOO7HjjjsyZcoULrvsMoYNG0Z7eztHHXUUd9xxB7feeitz587lS1/6EptuuikAiy66KHPmzOGqq65inXXWYaWVVmLSpEkMGzaMZ555hnPOOYc333yThRZaiKOOOorll1+e66+/njvvvJO2tjY+9rGP8bnPfY7HH3+cI444gmHDhrHIIouwxBJLDOShkyRJDdQSCdeDDz7I4Ycf/vbrp556in333fft1y+++CJXX3013//+9xk5ciRHHnnk2/NGjBjBZZddxoMPPshxxx3HZz7zGc455xwmTJjA0ksvzeWXX87kyZMZMWIEiy++OKeffvp82x4+fDjnnHMOt956K1dccQWzZ89mjz32YOedd+aiiy5il112YYsttuAPf/gDl1xyCXvuuSd33XUXEyZMoK2tjaOPPprNN9+cyy+/nHHjxrH66qtz1VVX8fjjj1d/4CRJUlO0RMK18cYbc/LJJ7/9uuu4rH//+9+suuqqLLLIIgCsu+66b897//vfT1tbG8ssswxvvPEGL7zwAjNnzuTUU08FYNasWWy++ea0t7ezyiqrvGvbzz77LLNmzeLkk09mv/3248knn+TYY49l/fXX59FHH2XSpElcddVVzJs3j5EjR/Loo48yY8YMjjrqKABefvll/v3vf/PYY4+xwQYb8PLLL7PeeuuZcEmS1EJaIuGqZ6WVVuKJJ55g1qxZjBw5kkceeYTRo0cD0NY2/496L7nkkrz3ve/ltNNOY/HFF+eee+5h0UUX5Zlnnul2TNZzzz3HWWedxdVXXw3ACiuswJJLLsmIESMYPXo0IQTWW289nnjiCaZMmcIqq6zCaqutxllnnUVbWxvXXnst73vf+xg9ejQPPvgga6yxBo888kj1B0WSJDXNApFwLbnkkuyxxx6MGzeOUaNGMWvWLIYPH86cOXPeteywYcM49NBDOf7445k3bx7vec97OP7443nmmWe6LXvNNddkl112YZ999mHYsGHMmTOHMWPGMHr0aA466CDOO+883nzzTd58800OPfRQ1lhjDTbZZBPGjh3LW2+9xVprrcVyyy3H4Ycfzvjx45kzZw5LLbUUCy20UNWHRZIkNcmQT7i22GKLd3X1HXDAAW//vdFGGzFnzhxmzpzJxRdfDMBhhx3G8ssvz4Ybbvj2cgsttNDbrVSbb745m2+++Xxlbr/99j3GsMMOO7D//vszffr0+aa3t7fzne98513L77777uy+++7zTVt22WWZNGnSu8qQJElD35BPuMoYPnw4r7/+OgcccAAjRoxg7bXXZoMNNhjosCRJ0gJigUi4APbff3/233//gQ5DkiQtgHwypyRJUsVMuCRJkipmwiVJklSxShOuEMIWIYRfdpn2hRDCb6vcriRJ0mBS2aD5EMIxwF7Aq52mbQR8BWjrab0qzdl/p26nP9nH8oZ//8a6y8yePZtvf/vbPP3007z11lvsueeefOhDH+rjFiVJ0lBUZQvXP4BdOl6EEJYFxgOH97hGC/r5z3/OqFGjmDBhAuPHj2fChAkDHZIkSWqytnnz5lVWeAhhNeBq4EPAdcDxwOvA1THGLUsU0dDgntxhs0YWxyo/e6DuMq+++irz5s1j8cUX5/nnn+fzn/88d955Z0PjkCRJg0a3vXjNeg7XpsD7gYuARYB1QgjfjTHWbe2q9+T19vb2AXs6e+ft1ovj6aef5oQTTmCfffbpcblG7Et/yxgMMViGZVRdxmCIwTIso+oyBkMMC1oZ7e3tPc5rSsIVY7wPWBfeafUqk2y1imeeeYaTTjqJnXfemW233Xagw5EkSU22wDxpfqA899xzfO1rX2PcuHFsuummAx2OJEkaAJUmXDHGx4At601rZZMmTeLll19m4sSJTJw4EYCzzjqLhRdeeIAjkyRJzbJAtXD19BiHKseBjR07lrFjx1ZStiRJGhp80rwkSVLFTLgkSZIqZsIlSZJUMRMuSZKkiplwSZIkVcyES5IkqWIL1GMhdp70SA9zeppe20+/uFbdZebMmcPZZ5/Nk08+yfDhwznmmGNYaaWV+rQ9SZI0NNnCVbHf/va3AFxwwQXsu+++XHjhhQMckSRJarYFqoVrIHz4wx9mq622AtIPWC+99NIDHJEkSWo2W7iaYPjw4Zx55pmcf/75fPSjHx3ocCRJUpOZcDXJ8ccfz8SJEznnnHN4/fXXBzocSZLURCZcFbv99tuZNGkSAAsvvDBtbW0MHz58gKOSJEnN5Biuim299dacddZZHHbYYcyePZtDDjmEhRZaaKDDkiRJTbRAJVw9Pcahvb2d6dOnV7LNRRddlFNOOaWSsiVJ0tBgl6IkSVLFTLgkSZIqZsIlSZJUMRMuSZKkiplwSZIkVcyES5IkqWIL1GMhbrrmhR7m9DS9th13W6rUcs8//zwHHnggZ599NqNHj+7TtiT1XfuUh+afMOUh2rssM32j9ZsWj6Tq1Tvvm33O28JVsdmzZ3Puueey8MILD3QokiRpgJhwVeyiiy5ixx13ZNlllx3oUCRJ0gAx4arQ5MmTWWqppfjABz4w0KFIkqQBZMJVoVtvvZUHHniAww8/nGnTpnHmmWfy3HPPDXRYkiSpyRaoQfPN9r3vfe/tvw8//HCOPPJIlllmmQGMSJIkDQRbuCRJkiq2QLVw9fQYh/b2dqZPn17ptr/73e9WWr4kSRq8bOGSJEmqmAmXJElSxUy4JEmSKmbCJUmSVDETLkmSpIqZcEmSJFVsgXosxIQJExpa3rhx40ott//++7PYYosBsOKKK3Lsscc2NA5JkjS4LVAJ10B48803AZ/DJUnSgsyEq2LTpk1j1qxZfO1rX2POnDnst99+rLPOOgMdliRJaiITrootssgihBDYYYcd+Ne//sVxxx3Hj370I4YPHz7QoUmSpCYx4arYyiuvzEorrURbWxurrLIKo0aNYubMmSy//PIDHZokSWoS71Ks2K233sqFF14IwLPPPsurr77KsssuO8BRSZKkZrKFq2Jjxoxh/PjxjB07lra2No455hi7EyVJWsAsUAlXT49xaG9vZ/r06ZVsc+TIkZx00kmVlC1JkoaGShOuEMIWwFkxxm1CCBsB5wNzgFnA3jHGGVVuX5IkaTCobAxXCOEY4FJgkWLS94CxMcZtgOsBn/4pSZIWCFUOmv8HsEun17vHGKcUf48A3qhw25IkSYNG27x58yorPISwGnB1jHHLTtM+CFwGfCTG+J86RVQXXCu45bb6y4zZrvo4pJ4Mljo6WOKQ1Dz1zvvqzvm27iY2ddB8CGE34ARghxLJFkDdweyNGPA+VMtoL7FMb2MaqsfCMgZnGVXU0cESx1B9TyxjwSljMMQwkGXUO++r+Oxpb+95q01LuEIIewIHAtvEGJ9r1nYlSZIGWlMSrhDCcGAC8ARwfQgB4O4Y4zeasf0Oy087vtvps6dBX577/swaZ5ZabtKkSdx777289dZb7Lzzzuywww592JokSRqqKk24YoyPAR3jt5apcluD1ZQpU5g6dSrnn38+s2bN4pprrhnokCRJUpMtUA8+HQj3338/q6++OieddBKvvfYaBx100ECHJEmSmsyEq2IvvvgiM2bM4IwzzuCpp57ixBNP5IorrqCtrdubGCRJUgsy4arYqFGjGD16NCNHjnz7/xdeeIGll156oEOTJElNUuWDTwWsv/763HfffcybN49nn32WN954g1GjRg10WJIkqYls4arYVlttxZ/+9CcOPvhg5s6dy2GHHcbw4cMHOixJktREC1TC1dNjHBrxULZaHCgvSdKCzS5FSZKkiplwSZIkVcyES5IkqWImXJIkSRUz4ZIkSaqYCZckSVLFFqjHQlwzda/uZ0ztW3m7rTux7jKTJ09m8uTJALz55ptMmzaN66+/nsUXX7xvG5UkSUPOApVwDYTtt9+e7bffHoDvfve7fPrTnzbZkiRpAWOXYpPkec5jjz3GjjvuONChSJKkJjPhapJJkyaxzz77DHQYkiRpAJhwNcErr7zCE088wcYbbzzQoUiSpAFQcwxXCGFh4ABgFyAD5gCPANcCP4wxvll5hC3gT3/6E5tssslAhyFJkgZIjy1cIYSPAvcDawMTgDHA9sD3gA2AB0IIH29GkEPdk08+SXt7+0CHIUmSBkitFq4dgQ/HGF/qMn0qcHMIYRTwDeAXVQXXaD09xqG9vZ3p06dXtt3dd9+9srIlSdLg12PCFWM8utaKRSJ2VMMjkiRJajF1n8MVQlgL+DBwGXA1sBmwX4zxropjkyRJagll7lK8GHgd2AFYCfgKcEaVQUmSJLWSMgnXIjHGScB2QIwx/hIYWWlUkiRJLaRMwrVwCGEFUgvXHcXfi1YbliRJUuso26X4OPCbGONfSY+K+G6lUUmSJLWQuoPmY4wXhRAujjHOLSZtHGOcWXFclWif8lD3M6Y8RF+ekjV9o/XrLjN79mzOPPNMZsyYwbBhwzj66KMZPXp0H7YmSZKGqrotXCGExYEJIYQ7QwjLAGcU01TC7373O+bMmcMFF1zA3nvvzaWXXjrQIUmSpCYr06U4AXgRWAF4AxgFXFJlUK1klVVWYe7cucydO5dXX32VESPqNipKkqQWUybh2jjGeALwVozxNeCLwEbVhtU6Fl10UZ5++mn22WcfzjnnHHbZZZeBDkmSJDVZmYRrTpfXw4G53S2od7v22mvZfPPNmThxIpdeeinjx4/nzTf9zW9JkhYkZRKuX4UQzgIWDSFsB1wP+JT5kpZYYgkWW2yxt/+ePXs2c+Z0zWElSVIrK5NwHQu8QhrHdTrwZ+BrVQbVSnbddVf+9re/MW7cOI488kj2228/Fl3Ux5hJkrQgKfNYiLeAbxX/hrSeHuPQ3t7O9OnTK9nmoosuyimnnFJJ2ZIkaWgo8+PV2wDHAct0nh5j/EBFMUmSJLWUMs8ouJT0aIh/VByLJElSSyqTcM2IMU6oPBJJkqQWVSbhuimE8FWsfIIPAAAgAElEQVTgNuCtjokxxicqi0qSJKmFlEm4lgXOAF7tNG0e6YnzkiRJqqNMwrUjsGKMcUbVwUiSJLWiMs/hegb4T9WBSJIktaoyLVwPAb8JIdwEzOqYGGM8t7KoJEmSWkiZhOs9QA6sWXEskiRJLanMk+b37WvhIYQtgLNijNuEENYAfkgacP8X4JAYoz+CLUmSWl6ZJ81vRXrS/OJAGzAcWD3GOLrOescAe/HO3Y3nAifGGH8ZQvh/wM7AT/oRuyRJ0pBQZtD8pcC9pMdATAJeAq4rsd4/gF06vd4UuLv4+1Zg2/JhSpIkDV1t8+bNq7lACOEvMcb1QgjfAW4A/gg8EGNct17hIYTVgKtjjFuGEKbHGNuL6R8Hvhxj3LNOEbWDW9Ddclv9ZcZsV30craTeMfV49s5gqaODJQ4NTv097wdL/WpEHINlXxrgvJ9/oub8Iz55Z1WbbutuYplB8y8X//8DWC/GeE8IYU4fAug8XmsJ4IUyK02fPr3m/Pb29rrL1DNUy2gvsUxvYxqqx6JRZdQ7pn2JaSgfj/6WUUUdHSxxDNX3xDK6WafO/LrXoRLbGCr1vJXPla6qeE/a23s+gmW6FH8fQrgG+AVwdAjhHGB2b4MEHgwhbFP8/Wng130oQ5Ikacgpk3AdAZwXY/wbcHixzh592NZRwKkhhN8CCwE/7kMZkiRJQ06Zx0LMA34XQlgfeAr4YYwxL1N4jPExYMvi778BH+17qJIkSUNTjy1cIYTFQwg3hBC+Xky6lXR34t0hBO8wlCRJKqlWl+KZwBPA2cXr/8QYVwcCcEjVgUmSJLWKWl2K2wNrxxi7DpD/OXBJdSFJkiS1llotXK93Sba+A2+P6Sr1SAdJkiTVTrgWCiEM73gRY7wSIISwUOVRSZIktZBaCdftpN9Q7GosqVtRkiRJJdQaw3UKcG8IYQvgNtLP7HwMWBv4YPWhSZIktYYeW7hijM8BmwG/JP3Q9KeA+4GtYowvNSU6SZKkFlDzwacxxleAc4t/kiRJ6oMyP+0jSZKkfjDhkiRJqlitn/b5avH/6s0LR5IkqfXUauEaF0JoI/1+oiRJkvqo1qD5HHgVGBlC6HxXYhswL8Y4qtLIJEmSWkSthOuzwMrArcCY5oQjSZLUemo9h2tujPEJYIti0jbAJ4ERMcbHmxCbJElSSyhzl+KHgAdILV47AQ+EEHauNCpJkqQWUvPBp4VvAR+NMf4VIISwLvB/wE+rDEySJKlVlGnhWqgj2QKIMU4FhlcXkiRJUmspk3C9HkLYrONF8fdr1YUkSZLUWsp0KR4D3BxC+DswD1gL2LXSqIaA9ikPzT9hykO0d3o5faP1mxrPQKp3LGDBOh6NMFjq12CJo7/OG/ntusvsxsQmRNI6WqVutBLr+eBWt4UrxvhrYB3gDODbwNoxxrurDkySJKlVlGnhIsb4HOl5XJIkSeolf7xakiSpYiZckiRJFTPhkiRJqlifEq4Qws2NDkSSJKlV9bWF6+KGRiFJktTCSidcIYQRIYSRADHGm6oLSZIkqbXUfSxECGEF4IfAJ4DhIYRfAV+MMU6vODZJkqSWUKaF63zgd8Dyxb9fARdVGZQkSVIrKfPg0zVjjKHT62+EEKZWFZAkSVKrKdPCNTKEsEjHixDCe0i/qShJkqQSyrRwXQ3cEUL4ASnR+jLw40qjkiRJaiFlfrz6W8BlwKeAMaQB9KdWG5YkSVLrKPvj1T8AflBxLJIkSS2px4QrhPAoPY/Vmhdj/O9qQpIkSWottVq4Pt/NtI8AZ+AYLkmSpNJ6TLhijH/o+DuEMIw0buurwH4xxklNiE2SJKkllHnS/KrAVcXLzWKMj1YbkiRJUmupeZdiCOGLwB+BO4GtTbYkSZJ6r9ag+R+RxnGdANwNbBjCOw+cjzH+sfLoJEmSWkCtLsWPADOAccW/zuYB7+vtxkIII4ErgNWAOcD+McZHeluOJEnSUFJr0PxqFWxvDDAixvjBEMIngdOBz1WwHUmSpEGjxzFcIYRvhRAWrjF/kRDCab3c3t+AEcVdj6OAt3q5viRJ0pBTq0vxHuD+EMJk4GZgGilB+2/g08BngON7ub1XSN2JjwDLFWXU1N7eXrfQMss0vIwpDzW2vD6sd97Uveouc0T7nZXGMJjiaEgZjXhfb7ntXWXOt9aY7ZoTRwPWq/fe1ntfq6ob0Mt9mdrg8vq6Tr26AeXqR9VxlIihv3WjJ0NxX1qpnjdkXwZJPR87beWa80c06XP07e31NCPGODmE8BvgEOAcYC3SuKu/kR58ulWM8eVebu8I4LYY4/EhhFWAX4QQ1o8xvtHTCtOnT69ZYHt7e91l6ulLGfUOd19iasS+9DeOKmIYqDgG6n0dLGW8q8xBUL8aVcZg2Jcq6tdgiWMova+DdV8aUcZgqOd9KWOw1PPlGxxDmThqJWM1n8MVY3wFOKv41wjP80434nPASGB4g8qWJEkalEr9eHUDnQdcHkL4NbAQ8PUY46tNjkGSJKmpmppwFS1moe6CkiRJLaTmk+YlSZLUf6USrhDCEsX/G4cQ9ioeYCpJkqQS6iZcIYRvAheHEEYDk4F9gYuqDkySJKlVlGnhGgPsR3oi/FUxxo8DG1YalSRJUgsp1aUYY3wN2Bb4RTGpxyfQS5IkaX5lEq6ZIYQLgc2AO0II44HGPxlTkiSpRZVJuPYmJVg7FC1d84ppkiRJKqFMwnVojPG0GOMDADHG44ETqg1LkiSpdfT44NMQwqnA0sBuIYQlO80aCWwHHFZxbJIkSS2h1pPmfw9sDswFZnaaPhv4YpVBSZIktZIeE64Y4y3ALSGEW2OM9zUxJkmSpJZS5rcUnwwh/Ax4P/BhYCLwpRjjU5VGJkmS1CLKDJr/X+AG4HXgeWAKcGmVQUmSJLWSMgnXajHG7wNzY4xvxRiPBUZXHJckSVLLKJNwzQ0hvL1c8UPWpZ5QL0mSpHKJ0/XAJGDJEMKBpJ/3iZVGJUmS1ELqJlwxxjOAW4D7gU8ClwDfrDguSZKkllHmLkVijBOBiSGElYD3xRjnVRuWJElS66ibcIUQDga2BsYBfwBeDCFcX/zEjyRJkuooM4brK8ARwK7AjcC6pK5FSZIklVAm4ZoXY5wBbAvcEWOcDQyvNixJkqTWUWYM16wQwjHAR4H9ii7GV6sNq2ftUx6af8KUh2jv9HL6Rus3NZ6BNHbhlesu80yd+fWOJzTnmA6WOFqJ58o7GnGuXDN1r/knTH33MrutO7F8UFIn7zpfodfnbCPqeSPKOG/kt+uWsRsL3rlStktxTWCfGOPzpJ/32a/SqCRJklpImcdC5MCBwPQQwgbAnjHGRyqPTJIkqUXUTbhCCB8GngB+Snoe1z9CCAtOX4QkSVI/lelSPB/4SoxxdIxxZeAw4OJqw5IkSWodpX4TMcY4udPfNwHvqSwiSZKkFlMm4fp9CGG3jhchhE8B3dxOIUmSpO6UeSzE9sABIYT/BWYDywNvhBD+h/SMrlFVBihJkjTUlUm4Plp5FJIkSS2sx4QrhDC6+LPjh6rnAM/HGF+rPCpJkqQWUquFayop2WorXg8DFg4h/ArYo/i5H0mSJNXRY8IVY1yi67QQwhLA4cB5wBcqjEuSJKlllBnD9bYY48vAt0IID1cUjyRJUssp9Ryubrze0CgkSZJaWK8TrhDCirwzrkuSJEl11LpL8chuJi8LBOCsyiKSJElqMbXGcHX9geq5wLPA/jHGX1YWkSRJUoupdZfivs0MRJIkqVX1ddC8JEmSSjLhkiRJqpgJlyRJUsXK/JZit2KMTzQ+HEmSpNZT5rcUhwGLAq8As4GlgGeAFfuywRDC8cBOwELAhTHGy/pSjiRJ0lDRY5dijHGJGOMoYBLwxRjjkjHGZYHPArf2ZWMhhG2ADwIfAj4KrNKXciRJkoaSMmO4NosxXt3xIsZ4I7BRH7e3HfAQ8BPgJuDmPpYjSZI0ZJT58ephIYRtOh52GkLYnvQQ1L5YDlgV+AywOnBjCGGtGOO8nlZob2+ff8KUh2pu4F3Ld+eW295V5nxrjdmubhHnTd2r5vwj2u+sH0c3SsVfmD2tAeXVOZ5lyhg7beW6ZYxoQhyD5X0dLGU05FyZWnt23TLqrF86jn6u14hzZdDU80as04C6Ue941D0W/dh2Zw05VwZBPa+3H1B/XxpRz4+bUH+00PjxTThXutHbulHveDQrX+hQJuEaB8QQwpu80yL22dJbmN9M4JEY45tAHkJ4A3gvaUxYt6ZPnz7f63qHp+vy3WlEGfX0pYz29vZerbd8A+IoU33rlTFY4his7+tAldHKx2MgzpXBUs/fVWYvj0WZOMqUV+94NON9LWMo1/PeltGIOjpY4+hL3WhEHe3tuVIriavbpRhj/DUwmpRk7QysHmN8oG6U3fsNsH0IoS2E0A4sRkrCJEmSWlbdhCuEsALwdWAf4EvAuSGECX3ZWIzxZuBB4D7SGK5DYoxz+lKWJEnSUFGmS/H/gNdIiVKPY63KijEe098yJEmShpIyCdfKMca1K49EkiSpRZV5LMTjIYTFKo9EkiSpRZVp4XoKmBJC+CXwesfEGOO4qoKSJElqJWUSrseKf5IkSeqDuglXjPHUZgQiSZLUquomXCGEh+jm7sQY4waVRCRJktRiynQpHtrp74WA3YF/VhOOJElS6ynTpXh359chhDuAe4HTqwpKkiSplZR5LERXy1LuJ8EkSZJE78dwtZF+V/HiKoOSJElqJb0dwzUP+E+M8eGK4pEkSWo5dbsUizFcbwDbAJ8C3ltxTJIkSS2lbsIVQtgL+DGwNDAKuCqEsH/VgUmSJLWKMl2KRwIfiDE+BRBCGA/cDny/ysAkSZJaRZm7FId1JFsAMcbpwJzqQpIkSWotZRKumSGEnTtehBD+B3i+upAkSZJaS5kuxbHAT0MIF5DuUnwL+GylUUmSJLWQMncpTgUy0h2KY4q/H6k4LkmSpJbRYwtXCGEhYB/guRjjdcDDxfQdgfOANZoSoSRJ0hBXq0vxEmBdYFQIYWnSoyGuILV0ndWE2CRJklpCrYRra2Bt0oNOryE9HuJxYN0Y4z+bEJskSVJLqJVwvRxjfBP4dwhhTWBCjPG0JsXVo9mLX1lniTPrlnHeyG/XnL8bE3sRUd+0T3no3ROnPDTfr4JP32j9yuOodyygOcejlYxdeOWa859pUhyNqOeDZV/668RbVqy7zLhx1ccxWM63wfAZCN18DvbhM7ARdbS/ZdRbv1llDJZ63gjXTN1r/glT53+527r162i941HmWDTyXKk1aH5ep79nDoZkS5IkaSgqm3C9XnUgkiRJrapWl+L7Qgg3dvM3ADHGnaoLS5IkqXXUSrgO6/T3dVUHIkmS1Kp6TLhijFc0MxBJkqRWVea3FCVJktQPJlySJEkVq5twhRDaupm2dDXhSJIktZ4yLVx/6GbarxsdiCRJUquq9ePVdwKbA+8JIbzUadZw4P6qA5MkSWoVtR4L8VlgGeByYN9O02cDT1UZlCRJUivpsUsxxvhSjPGxGOPHgedijI+TErCPk1q5JEmSVEKZQfOnAheHEEYDk0mtXRdVHZgkSVKrKDNofgdgP+BzwFVFi9eGlUYlSZLUQko9hyvG+BqwLfCLYtLClUUkSZLUYsokXDNDCBcCmwF3hBDGA9OrDUuSJKl1lEm49iYlWDsULV3zgH0qjUqSJKmF1HosRIcrY4yf6HgRYzy+wngkSZJaTpkWrqVCCItVHokkSVKLKtPC9SrweAjhz8ArHRNjjDtVFpUkSVILKZNwXVZ5FJIkSS2s1m8pjooxvgTc1OiNhhCWJ/0o9idjjI80unxJkqTBpFYL1y+BTYBnSXcmdmgrXvfp531CCCOBi4HX+7K+JEnSUNNjwhVj3KT4v9TDUXvhbOD/Ad7tKEmSFgi1uhQviTEeUPy9XIzx2f5uLITwJeA/McbbQgilEq729vb5Xs+e1rvluzN22so1548oUcaMCZvXjuOTtcs4b+pedbdxRPudNefXOxZQ/3jUOxZQ/3gcN2HFumWMH9+M41G7SrW3X1F3G42oG/WOR71j0ag4mFp7dplzpb/nW73zBOqfK33ddqPLa0Q9r/eelImDW26b//WUh5hvjTHb1d3GYKnnTHmo5uwy73Ej4uhvGY34LG5EGWU0o4xGnCsN+Qyso1n5wtvL1pjX+ZPydlL3Yn99GZgXQtgW2Aj4UQhhpxjj0z2tMH36/A+1X77OBrou351GlFFPM8qotx/NKqOMwXA8hlLdMI7a2tvbG7Lt/sYxEGXU+3gfSu9rI/alEXH0tww/ixtfxmCpo72No1YSV+YuRUjjtvotxviRjr9DCL8EDqqVbEmSJLWCsuOz5tVfRJIkSd2p1cI1LISwNKl1a3invwGIMT7Xnw3HGLfpz/qSJElDRa2Ea33SIyE6kqyZneb1+bEQkiRJC5paj4Vo9OMgJEmSFkgmVZIkSRUz4ZIkSaqYCZckSVLFTLgkSZIqZsIlSZJUMRMuSZKkiplwSZIkVcyES5IkqWImXJIkSRUz4ZIkSaqYCZckSVLFTLgkSZIqZsIlSZJUMRMuSZKkiplwSZIkVcyES5IkqWImXJIkSRUz4ZIkSarYiIEOYCCceMuKNeePG1e/jNVX2LtfMYxdeOW6yzxTZ369/YD6+9KIMvp7LBqlEe/rYKgbjYpjxp2b115g3ebE0V/XTN3r3ROnzv9yt3Un1ixjsNTRRpz35438ds35u1H7WMDgeF9bSSM+RxuhEfV8sJwrjTDY9sUWLkmSpIqZcEmSJFXMhEuSJKliJlySJEkVM+GSJEmqmAmXJElSxUy4JEmSKmbCJUmSVDETLkmSpIqZcEmSJFXMhEuSJKliJlySJEkVM+GSJEmqmAmXJElSxUy4JEmSKmbCJUmSVDETLkmSpIqZcEmSJFXMhEuSJKliJlySJEkVM+GSJEmq2IhmbiyEMBK4HFgNWBg4LcZ4YzNjkCRJarZmt3DtCcyMMW4NfBq4oMnblyRJarqmtnAB1wI/7vR6dpO3L0mS1HRNTbhijK8AhBCWICVeJzZz+5IkSQOh2S1chBBWAX4CXBhjvLLe8u3t7fO9Pm7CijWXHz++veZ8gDuX/VTtMtrrlwEv1JzbNe6uLr7m2LpbOPAjtctYfYW965ZRL44y6pVx6exH6pZxYPs6NefPmLB5/Tg+2b/j0YxjAfWPR71j0ag4GlHP+3tMG1JHp9YtosTxqH2+liuj/3HU+/yC+p9h9c6VeucJNOZcaUQZs6cdX6eMK5oSRz3NqOeNqBtj7tipfhxHPFBzfiM+z8uodzw2n7RPzfn317k+QmM+i2dPqz2/N/Wr2YPmVwBuBw6NMd5ZZp3p06f3ahu9Xd4yFpwyBkMMlmEZVZcxGGIoW8bygyQOyxh6ZQzWOlorAWt2C9fXgaWBk0IIJxXTPh1jfL3JcUiSJDVNs8dwHQYc1sxtSpIkDTQffCpJklQxEy5JkqSKmXBJkiRVzIRLkiSpYiZckiRJFTPhkiRJqpgJlyRJUsVMuCRJkipmwiVJklQxEy5JkqSKmXBJkiRVzIRLkiSpYiZckiRJFTPhkiRJqpgJlyRJUsVMuCRJkipmwiVJklQxEy5JkqSKmXBJkiRVzIRLkiSpYiZckiRJFRsx0AH01uor7D3QIQBw6eyna87fkaX6tX6zyrhz2U/VLWNcnfnX//KYumXwxRsrj2PMHXXqxm61Y4DBU78aEUfd96XOewKDo56PXXjlumU8U2d+3boBdetHI96TwVK/+vu+NqqMwaK/70sj6vlgqRuD5fO8ERrxGXjiLSvWnD+uFztiC5ckSVLFTLgkSZIqZsIlSZJUMRMuSZKkiplwSZIkVcyES5IkqWImXJIkSRUz4ZIkSaqYCZckSVLFTLgkSZIqZsIlSZJUMRMuSZKkiplwSZIkVcyES5IkqWImXJIkSRUz4ZIkSaqYCZckSVLFTLgkSZIqZsIlSZJUMRMuSZKkiplwSZIkVWxEMzcWQhgGXAhsCMwC9osxTmtmDJIkSc3W7Bau/wEWiTFuBRwHnNPk7UuSJDVdsxOuDwOTAWKMvwM2a/L2JUmSmq5t3rx5TdtYCOFS4LoY463F6yeA98UYZ/ewSvOCkyRJ6r+27iY2dQwX8BKwRKfXw2okW9BD0JIkSUNJs7sU7wHGAIQQtgQeavL2JUmSmq7ZLVw/AT4ZQriX1Hq1b5O3L0mS1HRNHcMlSZK0IPLBp5IkSRUz4ZIkSaqYCZckSVLFTLgkSZIqZsIlSZJUsWY/FkKSeiWEsDOwLbAk8ALwa+DHMcam3WIdQngv6fdfXwfOizHOLKZ/I8Z4asky2oCdgBlADpwHzAG+HmOc0ce4zo0xHtnLdXaNMV4bQlgMOAXYCPgDcFqM8ZWSZawOrAX8knRcNgWmAmfEGF8sWcaVwOExxmd6E3835ewAvFXEci6wFOmYPtGLMr5A+um5xYBngZ/HGCeXXHcR4CDgE8xfRy+IMb5efk/6J4TwfmA8qY6eGmP8ezH9ohjjwSXLWAQ4kFRH7wEmkuroV2OMeR/jujLG+IVerjM2xnh+COG/gPN5p44eVvZcCSFsBmTAbaTfbe6oo18rWzeKR1jtF2P8a2/i78mQS7j6+0YMljehqNhfIX1QXEuq2EsBh8QY/9SLMo4CPkSnDwrg+zHGOb2IxQtaz2UOyQtaC13M/pfUEn8r8DLplyo+DWwH7FeyjAN6mhdjvKRMGcCPSM8RHAH8KoQwJsb4OPDRkutD+rxaDPgvYFngYtI+XQrsWKaA4rOnQxuwdvEQaWKMHywZx8Gkz5zvAf8ExpGShUuAshfGHwEnFWU8CZwIfAS4EtihZBlbAZNDCOcDP+zL503xc3GLkOrFqaTP0enA90l1pEwZ3wNeBG4kvQ8vAmNCCB+KMZ5UoogfAFOAE5i/jl4JfLZkDGf0NC/G+PUyZZDevzOBkcANIYQ9Y4wPkj5Hyvoh8DCwPnAaKfl6BbgA+GSZAoqf7OvILdqAZUIITwHzYoztJeP4LOl8+R7pvNubdI0qfa4U6x8A/C9wM3AY6Xz9EbBNyTKWBi4LIdwOnB1jfLnket0acgkX/X8jBsubcCXwV2AUcDRwOPAUab/KxnEJ6UJ4JCnRmAu8h7RvB5UpwAva/FrogtYqF7P1Yoxd68CNIYR7yu0FkC44O5Li7/xzYb05Jgt31OUQwhTgpyGEbejdz49tGGPcOoSwEPCXGONlRXkH9qKMC4Avkz63XgWuAvboxfqdvT/G2HGOPxxC2KUX686JMf4yhHBCjLHj/J8SQgi9KOMx0uf5qcCfiy8JtwL/jDG+VLKMNWOMHym+bE2NMV4IEEI4rBdxbNSpjk0OIdwUY9wxhPCbkuu3xxi7vgd/DiH8uhcxPEP63DidfvykXYzxdoAQwjTg+hDC9vSunq8YY9w9hDAMeCjGeGdRXm+GH+1JuiYdHGN8KoRwV4zxY71Yv7MVYoxXFn/fFEI4ohfrvhljfCiEsGSMcWIx7achhGN7UcZTwKdIn+H3hxDu5p06+udelAMMzYSrQ1/fiMHyJiwTYzwRIITwlxjjLcXfvQiDVWOMlxd/PxJCuCXGOKaXJ7oXtPm1ygXtMVrjYjYshLB1jPHtOh1C+Aip1a2UGOORIYS1gFtjjPeXD30+I0II68cYH4ox3htCOJOURC7em0KKRPOeEMK2xes1gIXLrh9jvDKE8FfgO8ARwOvFF5PeWLP4vHwrhLBxjPHBouW/dBzACyGEzwM/CyHsDdxE+tm213pRxrwY4wvAYUUL9+dJXzLWJLWwlDEyhLAdsBywQvE+v0xq5SlrkRDCFjHG34cQtia91/9F+vJWxhvFMZhM+kKxBOlYlGrNBogxfjeEsCkwPcZ4Ry9i72x2CGFH4JYYYx5COJTUqNCbY/FWCOGLMcZJIYQNAYrP4dIJV4zxVyGEfwKXhBDOpnfXgQ7rF1/WRoQQPk5qWPhcL8t4LIRwNHBLCOEbpPN1DOn6XVZb8XvP5xZfXrct/n2F8i1tbxuKCVd/34ju3oQdGIA3IYRwELAMqcl1W9KPe5fuCizK2I10ou8EvBZCWI/UKlGWF7ROWuiC1ioXsy+RzrOritdzgQeB/XsRA6SW8F7VpS7GAeeHEHaLMc6IMV4TQhhJaoEs60Dg9BDCvZ26ZM8BvtabQGKMU0IIewKXAe/tzbqFHYFNgL8BGxQXxwso2Spe2B/4Nmk4w2qkruLfULJVvPB2N3+M8T/ARcW/3jgI+AbwR+AQ4G5gJr2rHwcDF4cQVgb+QfrCtQfpfCnjC8DJpC9pS5A+x+8B9ulFDJBi7s1nd1dfBr5VbPu5GONdIYTDSUMryvoiaQjDpOIaB7ArvasbxBj/VXx+XQCs2Jt1C2uS6ui/SZ8V7yFd53vzc4AHk86tXUifYduThsv0po5O6fgjxvgW6Uvrrb1Yfz5D7qd9QghLk96ITUl9zXeRuoyOizE+VmL995DehI4LyUzSm3BmjPH5kjGcF2PsTdNmd2WsQrqgTwH+RbrAPweMizE+XLKM1Yr11iFdhI4m9bPnMcb7Spbx36SxOZsWkzouaEd3DLosWc5ywOJl3oMe1t8I+C6wW8d4q+Ki8r0Y47Ily1iH1CS/S0cXWgjhp6T39ne9jGcZ0gVtjRhj2QSlY92NeaeO/h64gTRm8KAY45Ra63Yq4710f0E7usz4qRDCVd10c/RK8Q2342I2jZRczCSNX7y31rqdytiE1LXb+WK2A/D3GOPNvYhlOYoxhh3j+3orhLBspzKea0QZIYRhMca5AxTHssCoGOMD/Sijv3EMtvflxX7E0bEvz/c1Dr1bCGHFGGNvGjRa1pBLuLoKIaxIutCXTg66rN8OLNbX9RsRw2CII4SwAumbxMxY8i6jbspYvlMZZbutapbRxwtaI+NYth8XtEbE0a/3pae2qEwAAAXoSURBVMHH4rl+1I0VSN9SexVHCGFz0pjE4bwzxnAY6a6p3/ahjFeKMtpIN6iUTRx7KqMRcfS1jJdJY0D7sy+dy+hPHB3vS2/i2Ay4kMa+L4vTv/rRp+MhlTHkuhRDCB8EJgBvAmeTxqi8EUKY9P/bu7uQP8c4gONflkYRJ4pEMcm8jCU0SqGGlHe/hANx5PXASpiXnKHGliiRvLX0c7AkL9NsNSMp2uZEKNpLSpO8rWiTg+v//P0tL89///t+nuu+fT+Hz7q/u562Pbv+931f15WZy9u+ftBYRHlBe5LGP43j5cyc1mOKhhpnUH7Y7AJOBD6OiN+B28a40zbV2E2529Zk41bgswrGMVuNvfpzGfwn8lTXvw/K45ArM3PrSPMoyqKEM6czBhvVNpZXMo6JGhHxKeVu46h9GGNVno3+NkZ1bsJFmVhcQ7n1+w5wNOXl5g2Uf8BtXw/lvYtJG/82jum+F9JE42Hgwsz8LiKOoayWfJSySu48G51tPFLBGJpo7Df6H+HAVsZ7EdeGjTYbl1MW15yTe7/vlo3+Noa6OOGak5lfRsRc4MepxxODT80zcX3fGgeNvPOwhbLSb1tEHGCj040axtBE442IWEP5QPED5XHPYuDNMcZgw0ZrjcHP4BXAuWP+vjb+B41RnXuHKyKWUfYY2kn5BPIN5dn9PjmN3XQnvb6HjeWUFSGr+XMVx7eUuxJX2ehmo4YxNNhYSNk4dWoF2AeZ+cl0rrVhY6Ya0n/p3IQLICIWUJaL7qIs9/4eWJnTfLl60ut72LgYmA9szMw1UY6I2JKZv9robqOGMTT0fVxKWX17MOXv99gnIdiw0WYjGjitw0Z/G1O6+EgR4CTKviBTR4V8Mc4Eo4Hr+9Y4BJhH2ePsIsrRK+OudLRRX6OGMUzUiGZOQrBho7VGDWOwUW9jVOcmXDHhUSGTXt/jxms2+tOoYQwNNZo4CcGGjTYbNYzBRr2NoXHOR6rFqZn5QGa+nZm3Aqdn5h2Ul9pm4nobNrrQqGEMTTT2jbJD/VCMeRKCDRstN2oYg416G0Odu8PF5EeFTHq9DRtdaNQwhiYaN1CO9llJ2f9m6iSE28cYgw0bbTZqGIONehtDXZxwTXru1aTX27DRhUYNY2iicQJwKmVz36WZ+QpARKxl+nuB2bDRZqOGMdiotzHUuQlXlqW6p+/x5c9n6nobNrrQqGEMDTWWUn7g7Qu8GhFzM/MFyqdNGzZqaNQwBhv1NoY6N+GKiHXA3L/7tcw8q+3rbdjoQqOGMTTU+C0Hh8pHWZ69NiK2MN5O4jZstNmoYQw26m0MdW7CBdwNPEPZcn/XLFxvw0YXGjWMoYnG1xHxGHB/Zv4UEVdQNlE9xIaNSho1jMFGvY2hzk24Bi/fvgQsyMxVM329DRtdaNQwhoYaNwLXM/hEmZlbI+Jc4B4bNipp1DAGG/U2hjq507wkSVKXdHEfLkmSpE5xwiVJktSyzr3DJUl7inLm2WnA2Zm5e/C1OcB6YF1m3jeb45Mk73BJ6oMllN3rR19mvQfYDTw4KyOSpBG+NC+pFyLiZOB94BzKxoRvUM5u3B4RlwH3AvsBvwBLBisoDweeBg4FDgO+Bq7OzB0RsQ3YAJwC3JWZr8/09ySpP7zDJakXMvNTys7QzwLPATcNJlvHAw8BF2TmQuAWYFVE7A9cC6zPzEXAPMqhtNeNZDdl5nwnW5Im5YRLUm9k5hOUO1gfZuZbgy8vBo4A1kXERuBFyr468zJzGfBRRNwJPAnMBw4cSb43Y4OX1Gu+NC+pb76iHJQ9ZQ6wOjOHd64i4khge0QsozwyfB5YBxzAX89J+7n10Ur6X/AOl6S+exe4KCKOA4iIS4CNwP7ABcDjmfkysAM4nzJBk6RGOeGS1GuZuRm4GciI2AQ8AFySmTsp73atiIjNwCrKI8RjZ22wknrLVYqSJEkt8w6XJElSy5xwSZIktcwJlyRJUsuccEmSJLXMCZckSVLLnHBJkiS1zAmXJElSy5xwSZIktewPSOIInpRh2KUAAAAASUVORK5CYII=\n", "text/plain": [ "<matplotlib.figure.Figure at 0x1128ab4e0>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fix, ax = plt.subplots(figsize=(10, 7))\n", "upsets_by_year.plot(ax=ax, kind='bar', stacked=True)\n", "ax.set_ylim(0, 15)\n", "ax.set_xlabel('Year')\n", "ax.set_ylabel('First Round Upsets (No. of Games)')\n", "ax.set_title('First Round NCAA Tournament Losses by Seeds 2-8')\n", "ax.legend(title='Higher Seed')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The chart makes it easy to understand the overall variability of upsets from year to year, both in terms of the overall number and by seed.\n", "\n", "We can also summarize the above data in a small table." ] }, { "cell_type": "code", "execution_count": 33, "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>0</th>\n", " <th>1</th>\n", " <th>2</th>\n", " <th>3</th>\n", " <th>4</th>\n", " </tr>\n", " <tr>\n", " <th>HigherSeed</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2</th>\n", " <td>26</td>\n", " <td>6</td>\n", " <td>1</td>\n", " <td>0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>15</td>\n", " <td>15</td>\n", " <td>3</td>\n", " <td>0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>10</td>\n", " <td>20</td>\n", " <td>3</td>\n", " <td>0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>5</th>\n", " <td>4</td>\n", " <td>15</td>\n", " <td>10</td>\n", " <td>4</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>6</th>\n", " <td>5</td>\n", " <td>13</td>\n", " <td>10</td>\n", " <td>4</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>7</th>\n", " <td>3</td>\n", " <td>14</td>\n", " <td>12</td>\n", " <td>3</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>8</th>\n", " <td>3</td>\n", " <td>10</td>\n", " <td>9</td>\n", " <td>7</td>\n", " <td>4</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " 0 1 2 3 4\n", "HigherSeed \n", "2 26 6 1 0 0\n", "3 15 15 3 0 0\n", "4 10 20 3 0 0\n", "5 4 15 10 4 0\n", "6 5 13 10 4 1\n", "7 3 14 12 3 1\n", "8 3 10 9 7 4" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "upset_freq = upsets_by_year.apply(pd.value_counts).fillna(0).astype(int).reset_index(drop=True).transpose()\n", "upset_freq" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This frequency table will be useful for making specific decisions about how many first round upsets to pick.\n", "\n", "Since each row sums to 33, we can divide each value by 33 to estimate a probability distribution for the number of upsets by seed per year." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "HigherSeed\n", "2 33\n", "3 33\n", "4 33\n", "5 33\n", "6 33\n", "7 33\n", "8 33\n", "dtype: int64" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "upset_freq.sum(axis=1)" ] }, { "cell_type": "code", "execution_count": 35, "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>0</th>\n", " <th>1</th>\n", " <th>2</th>\n", " <th>3</th>\n", " <th>4</th>\n", " </tr>\n", " <tr>\n", " <th>HigherSeed</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2</th>\n", " <td>0.787879</td>\n", " <td>0.181818</td>\n", " <td>0.030303</td>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>0.454545</td>\n", " <td>0.454545</td>\n", " <td>0.090909</td>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>0.303030</td>\n", " <td>0.606061</td>\n", " <td>0.090909</td>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " </tr>\n", " <tr>\n", " <th>5</th>\n", " <td>0.121212</td>\n", " <td>0.454545</td>\n", " <td>0.303030</td>\n", " <td>0.121212</td>\n", " <td>0.000000</td>\n", " </tr>\n", " <tr>\n", " <th>6</th>\n", " <td>0.151515</td>\n", " <td>0.393939</td>\n", " <td>0.303030</td>\n", " <td>0.121212</td>\n", " <td>0.030303</td>\n", " </tr>\n", " <tr>\n", " <th>7</th>\n", " <td>0.090909</td>\n", " <td>0.424242</td>\n", " <td>0.363636</td>\n", " <td>0.090909</td>\n", " <td>0.030303</td>\n", " </tr>\n", " <tr>\n", " <th>8</th>\n", " <td>0.090909</td>\n", " <td>0.303030</td>\n", " <td>0.272727</td>\n", " <td>0.212121</td>\n", " <td>0.121212</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " 0 1 2 3 4\n", "HigherSeed \n", "2 0.787879 0.181818 0.030303 0.000000 0.000000\n", "3 0.454545 0.454545 0.090909 0.000000 0.000000\n", "4 0.303030 0.606061 0.090909 0.000000 0.000000\n", "5 0.121212 0.454545 0.303030 0.121212 0.000000\n", "6 0.151515 0.393939 0.303030 0.121212 0.030303\n", "7 0.090909 0.424242 0.363636 0.090909 0.030303\n", "8 0.090909 0.303030 0.272727 0.212121 0.121212" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "upset_freq / 33" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### How Many Upsets to Pick?\n", "\n", "In summary, here are some preliminary conclusions based upon the above data and analysis. We'll try to develop a more precise framework in a later post.\n", "\n", "#### Second Seed Upsets\n", "\n", "Although a second seed does occasionally lose in the first round (and in 2012, two second seeds lost), it's rare. Don't pick the fifteenth seed to advance, unless you have a very strong view that the tournament committee has made a mistake in either the second or the fifteenth seeds. If you do, however, the historical data say you're unlikely to be correct.\n", "\n", "#### Third and Fourth Seed Upsets\n", "\n", "Things are more promising for calling upsets in the third and fourth seed games. On average, there is at least one upset among these 8 first round games in a given year. There is often one upset in each of the third and fourth seed games, but there are rarely more than 2 upsets overall in these 8 games.\n", "\n", "The data suggest that you should pick an upset among the third and fourth seeds as a group. You should also try hard to identify another upset, for the seed which you didn't pick in the first upset. In other words, if you already picked a third seed upset, try to pick a fourth seed upset, and vice versa.\n", "\n", "#### Fifth Seed Upsets\n", "\n", "Most tournaments have featured at least 1 fifth seed upset in the first round, and many years have two. You should definitely look to pick one upset. It's probably reasonable to pick a second upset in this category if you have strong views about the matchup.\n", "\n", "#### Sixth and Seventh Seed Upsets\n", "\n", "The data tell a similar story for the sixth and seventh seed games. You should try to pick one sixth seed and one seventh seed upset in the first round. If you have strong views about particular matchups, it's reasonable to look for additional potential upsets. However, you should keep in mind that the overall number of upsets (excluding the 8-9 games) rarely exceeds 8 in a given year.\n", "\n", "In summary, among the second through seventh seeds, the historical data suggest you should aim to pick 5 or 6 upsets, and venture beyond that only if you have high conviction about a few additional games.\n", "\n", "#### The 8-9 Matchups\n", "\n", "As mentioned above, a ninth seed victory isn't really an upset. There are years where all the eighth seeds advance, and years where all the ninth seeds advance.\n", "\n", "For regular bracket selection, your goal is just to get as many teams as possible from your bracket into the second round. For that purpose, you should analyze the 8-9 games strictly on the merits of the matchups. In contrast, the Statsketball Upset Challenge awards bonus points for correctly picking an upset, defined as the lower seed beating the higher seed. With the possibility of bonus points, you have somewhat greater incentive to pick the ninth seed, even if the game is a true toss-up. We'll study the impact of Upset Challenge bonus points in a future post." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:sports_py36]", "language": "python", "name": "conda-env-sports_py36-py" }, "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.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }