{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## NBA Home Court Advantage\n", "\n", "### Part 4: Which Box Score Statistics Contribute to Home Court Advantage?\n", "\n", "If the home team has a higher win probability, that advantage should be evident in at least some of the box score statistics. Home court advantage could result from better offense, better defense, or a mix of the two.\n", "\n", "In this notebook, we'll examine how basic box score statistics vary between home and away games.\n", "\n", "We'll continue to use the games from the 1996-97 through 2016-17 NBA regular seasons as our data set." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "pd.options.display.max_rows = 999\n", "pd.options.display.max_columns = 999\n", "pd.options.display.float_format = '{:.3f}'.format" ] }, { "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 scipy import stats" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from pathlib import Path" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "PROJECT_DIR = Path.cwd().parent / 'basketball' / 'nba'\n", "DATA_DIR = PROJECT_DIR / 'data' / 'prepared'\n", "DATA_DIR.mkdir(exist_ok=True, parents=True)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "def load_nba_historical_matchups(input_dir):\n", " \"\"\"Load pickle file of NBA matchups prepared for analytics.\"\"\"\n", " PKLFILENAME = 'stats_nba_com-matchups-1996_97-2016_17.pkl'\n", " pklfile = input_dir.joinpath(PKLFILENAME)\n", " return pd.read_pickle(pklfile)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(26787, 41)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "matchups = load_nba_historical_matchups(DATA_DIR)\n", "matchups.shape" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "21" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "seasons = sorted(list(matchups['season'].unique()))\n", "len(seasons)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def prepare_regular_season(matchups):\n", " df = matchups.copy()\n", " df = df[df['season_type'] == 'regular']\n", " return df" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(24797, 41)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "reg = prepare_regular_season(matchups)\n", "reg.shape" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "30" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "teams = sorted(list(reg['team_curr_h'].unique()))\n", "len(teams)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aggregating the Data\n", "\n", "We are going to try to identify which team box score statistics improve at home compared to on the road. In order to do this properly, we need to isolate the impact of location (home versus away) from the match up itself. Otherwise, the variation created by differences in opponent quality will swamp the impact of home court.\n", "\n", "To do this, we are going to group box score statistics by season, team, and opponent. Grouping in this way will allow us to control for the variation in team quality in different seasons. It will also allow us to control for the different quanlity of various opponents.\n", "\n", "Within this grouping, we will separate the home games from the away games, and get the average box score statistics for each. Then, we can subtract the average away game statistics from the average home game statistics. The difference between the grouped home and away statistics will be our measure of how team performance improves just by virtue of playing at home.\n", "\n", "The below Python code uses `pandas` to implement this idea. Also, note that we are going to scale the statistics for a standard 48-minute game. We will also compute shooting percentages for field goals, three-pointers, and free throws." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "HOME = 'H'\n", "AWAY = 'A'" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def aggregation(group, home_away):\n", " suffix = '_h' if home_away == HOME else '_a'\n", " # Get the home or away columns and strip off the suffix\n", " stat_cols = [col[:-2] for col in group.columns if suffix in col and 'team' not in col]\n", " # Scale the stats for a 48-minute game and get the group average\n", " result = {}\n", " for col in stat_cols:\n", " result[col] = (group[col+suffix] / group['min'] * 48.0).mean()\n", " # Compute shooting percentages for the group\n", " pct_cols = ['fg', 'fg3', 'ft']\n", " for col in pct_cols:\n", " result[col+'_pct'] = (100.0 * group[col+'m'+suffix] / group[col+'a'+suffix]).mean()\n", " return pd.Series(result, index=list(result.keys()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above function computes the average statistics for each season, team and opponent grouping, scaled to a standard 48-minute game. It will also compute the shooting percentages. Notice that this function doesn't do the home versus away subtraction. That will come later.\n", "\n", "The function below does the actual grouping, and calls the above function for each group. It also keeps track of how many games are in each group." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def aggregate_stats(data, home_away):\n", " suffix = '_h' if home_away == HOME else '_a'\n", " other_suffix = '_a' if home_away == HOME else '_h'\n", " team = 'team_curr' + suffix\n", " opponent = 'team_curr' + other_suffix\n", " # Apply the aggregation by season, team and opponent\n", " df = data.groupby(['season', team, opponent]).apply(aggregation, home_away)\n", " # Add a count of the number of games in this group\n", " df['games'] = data.groupby(['season', team, opponent]).size()\n", " df = df.reset_index().rename(columns={team: 'team', opponent: 'opponent'})\n", " df = df.set_index(['season', 'team', 'opponent'])\n", " # Drop NA rows (i.e., team vs itself, team vs CHA prior to expansion)\n", " cols = [col for col in df.columns if col != 'games']\n", " return df.dropna()[['games']+cols]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's do the grouping and aggregation for the home games first." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(17290, 18)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "home_df = aggregate_stats(reg, HOME)\n", "home_df.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are 17,290 distinct groups of home games by season, team and opponent." ] }, { "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></th>\n", " <th></th>\n", " <th>games</th>\n", " <th>pts</th>\n", " <th>fgm</th>\n", " <th>fga</th>\n", " <th>fg3m</th>\n", " <th>fg3a</th>\n", " <th>ftm</th>\n", " <th>fta</th>\n", " <th>oreb</th>\n", " <th>dreb</th>\n", " <th>ast</th>\n", " <th>tov</th>\n", " <th>stl</th>\n", " <th>blk</th>\n", " <th>pf</th>\n", " <th>fg_pct</th>\n", " <th>fg3_pct</th>\n", " <th>ft_pct</th>\n", " </tr>\n", " <tr>\n", " <th>season</th>\n", " <th>team</th>\n", " <th>opponent</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></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 rowspan=\"5\" valign=\"top\">1996-97</th>\n", " <th rowspan=\"5\" valign=\"top\">ATL</th>\n", " <th>BKN</th>\n", " <td>2.000</td>\n", " <td>109.000</td>\n", " <td>37.000</td>\n", " <td>76.000</td>\n", " <td>12.000</td>\n", " <td>26.500</td>\n", " <td>23.000</td>\n", " <td>28.000</td>\n", " <td>10.500</td>\n", " <td>30.500</td>\n", " <td>22.000</td>\n", " <td>16.000</td>\n", " <td>9.000</td>\n", " <td>5.000</td>\n", " <td>19.000</td>\n", " <td>48.710</td>\n", " <td>45.214</td>\n", " <td>82.143</td>\n", " </tr>\n", " <tr>\n", " <th>BOS</th>\n", " <td>2.000</td>\n", " <td>100.000</td>\n", " <td>38.500</td>\n", " <td>84.000</td>\n", " <td>8.000</td>\n", " <td>25.000</td>\n", " <td>15.000</td>\n", " <td>19.000</td>\n", " <td>17.500</td>\n", " <td>30.000</td>\n", " <td>22.500</td>\n", " <td>17.000</td>\n", " <td>10.000</td>\n", " <td>7.500</td>\n", " <td>19.000</td>\n", " <td>45.828</td>\n", " <td>34.225</td>\n", " <td>78.333</td>\n", " </tr>\n", " <tr>\n", " <th>CHI</th>\n", " <td>2.000</td>\n", " <td>98.000</td>\n", " <td>34.500</td>\n", " <td>81.000</td>\n", " <td>7.500</td>\n", " <td>24.500</td>\n", " <td>21.500</td>\n", " <td>24.500</td>\n", " <td>15.500</td>\n", " <td>28.500</td>\n", " <td>13.500</td>\n", " <td>13.000</td>\n", " <td>7.500</td>\n", " <td>4.500</td>\n", " <td>19.500</td>\n", " <td>42.593</td>\n", " <td>30.303</td>\n", " <td>85.646</td>\n", " </tr>\n", " <tr>\n", " <th>CLE</th>\n", " <td>2.000</td>\n", " <td>90.000</td>\n", " <td>31.000</td>\n", " <td>66.500</td>\n", " <td>7.000</td>\n", " <td>21.000</td>\n", " <td>21.000</td>\n", " <td>24.000</td>\n", " <td>8.000</td>\n", " <td>25.000</td>\n", " <td>19.500</td>\n", " <td>15.000</td>\n", " <td>6.500</td>\n", " <td>5.000</td>\n", " <td>19.000</td>\n", " <td>47.368</td>\n", " <td>33.409</td>\n", " <td>86.933</td>\n", " </tr>\n", " <tr>\n", " <th>DAL</th>\n", " <td>1.000</td>\n", " <td>93.000</td>\n", " <td>37.000</td>\n", " <td>72.000</td>\n", " <td>11.000</td>\n", " <td>24.000</td>\n", " <td>8.000</td>\n", " <td>15.000</td>\n", " <td>9.000</td>\n", " <td>29.000</td>\n", " <td>22.000</td>\n", " <td>13.000</td>\n", " <td>9.000</td>\n", " <td>3.000</td>\n", " <td>13.000</td>\n", " <td>51.389</td>\n", " <td>45.833</td>\n", " <td>53.333</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " games pts fgm fga fg3m fg3a ftm \\\n", "season team opponent \n", "1996-97 ATL BKN 2.000 109.000 37.000 76.000 12.000 26.500 23.000 \n", " BOS 2.000 100.000 38.500 84.000 8.000 25.000 15.000 \n", " CHI 2.000 98.000 34.500 81.000 7.500 24.500 21.500 \n", " CLE 2.000 90.000 31.000 66.500 7.000 21.000 21.000 \n", " DAL 1.000 93.000 37.000 72.000 11.000 24.000 8.000 \n", "\n", " fta oreb dreb ast tov stl blk pf \\\n", "season team opponent \n", "1996-97 ATL BKN 28.000 10.500 30.500 22.000 16.000 9.000 5.000 19.000 \n", " BOS 19.000 17.500 30.000 22.500 17.000 10.000 7.500 19.000 \n", " CHI 24.500 15.500 28.500 13.500 13.000 7.500 4.500 19.500 \n", " CLE 24.000 8.000 25.000 19.500 15.000 6.500 5.000 19.000 \n", " DAL 15.000 9.000 29.000 22.000 13.000 9.000 3.000 13.000 \n", "\n", " fg_pct fg3_pct ft_pct \n", "season team opponent \n", "1996-97 ATL BKN 48.710 45.214 82.143 \n", " BOS 45.828 34.225 78.333 \n", " CHI 42.593 30.303 85.646 \n", " CLE 47.368 33.409 86.933 \n", " DAL 51.389 45.833 53.333 " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "home_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check to make sure didn't drop any games from our data set during the aggregation." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "24797.0" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "home_df['games'].sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The correct number of games got picked up in the aggregation. Since the aggregation takes a while, let's save the results in a CSV file in case we want to pick up this analysis on a different occasion." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "csvfile = DATA_DIR.joinpath('stats_nba_com-agg_matchup_box_scores-home-1996_97-2016_17.csv')\n", "home_df.to_csv(csvfile, index=True, float_format='%g')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can perform the same steps for the away games." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(17290, 18)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "away_df = aggregate_stats(reg, AWAY)\n", "away_df.shape" ] }, { "cell_type": "code", "execution_count": 20, "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></th>\n", " <th></th>\n", " <th>games</th>\n", " <th>pts</th>\n", " <th>fgm</th>\n", " <th>fga</th>\n", " <th>fg3m</th>\n", " <th>fg3a</th>\n", " <th>ftm</th>\n", " <th>fta</th>\n", " <th>oreb</th>\n", " <th>dreb</th>\n", " <th>ast</th>\n", " <th>tov</th>\n", " <th>stl</th>\n", " <th>blk</th>\n", " <th>pf</th>\n", " <th>fg_pct</th>\n", " <th>fg3_pct</th>\n", " <th>ft_pct</th>\n", " </tr>\n", " <tr>\n", " <th>season</th>\n", " <th>team</th>\n", " <th>opponent</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></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 rowspan=\"5\" valign=\"top\">1996-97</th>\n", " <th rowspan=\"5\" valign=\"top\">ATL</th>\n", " <th>BKN</th>\n", " <td>2.000</td>\n", " <td>93.500</td>\n", " <td>35.500</td>\n", " <td>88.000</td>\n", " <td>8.000</td>\n", " <td>30.500</td>\n", " <td>14.500</td>\n", " <td>17.500</td>\n", " <td>17.000</td>\n", " <td>28.000</td>\n", " <td>18.000</td>\n", " <td>12.500</td>\n", " <td>8.500</td>\n", " <td>5.000</td>\n", " <td>15.000</td>\n", " <td>40.413</td>\n", " <td>26.407</td>\n", " <td>81.250</td>\n", " </tr>\n", " <tr>\n", " <th>BOS</th>\n", " <td>2.000</td>\n", " <td>99.500</td>\n", " <td>38.000</td>\n", " <td>81.000</td>\n", " <td>10.000</td>\n", " <td>26.000</td>\n", " <td>13.500</td>\n", " <td>24.500</td>\n", " <td>12.500</td>\n", " <td>33.000</td>\n", " <td>28.000</td>\n", " <td>24.000</td>\n", " <td>11.500</td>\n", " <td>6.500</td>\n", " <td>19.500</td>\n", " <td>46.558</td>\n", " <td>38.370</td>\n", " <td>55.051</td>\n", " </tr>\n", " <tr>\n", " <th>CHI</th>\n", " <td>2.000</td>\n", " <td>74.000</td>\n", " <td>27.000</td>\n", " <td>79.500</td>\n", " <td>5.500</td>\n", " <td>18.500</td>\n", " <td>14.500</td>\n", " <td>19.000</td>\n", " <td>14.500</td>\n", " <td>25.500</td>\n", " <td>12.000</td>\n", " <td>16.000</td>\n", " <td>9.000</td>\n", " <td>4.000</td>\n", " <td>16.000</td>\n", " <td>33.972</td>\n", " <td>28.205</td>\n", " <td>77.451</td>\n", " </tr>\n", " <tr>\n", " <th>CLE</th>\n", " <td>2.000</td>\n", " <td>78.000</td>\n", " <td>28.500</td>\n", " <td>66.500</td>\n", " <td>7.000</td>\n", " <td>21.500</td>\n", " <td>14.000</td>\n", " <td>18.000</td>\n", " <td>9.000</td>\n", " <td>28.500</td>\n", " <td>18.500</td>\n", " <td>13.500</td>\n", " <td>7.000</td>\n", " <td>5.000</td>\n", " <td>17.500</td>\n", " <td>43.617</td>\n", " <td>32.717</td>\n", " <td>76.190</td>\n", " </tr>\n", " <tr>\n", " <th>DAL</th>\n", " <td>1.000</td>\n", " <td>109.000</td>\n", " <td>40.000</td>\n", " <td>74.000</td>\n", " <td>19.000</td>\n", " <td>27.000</td>\n", " <td>10.000</td>\n", " <td>22.000</td>\n", " <td>12.000</td>\n", " <td>37.000</td>\n", " <td>26.000</td>\n", " <td>15.000</td>\n", " <td>6.000</td>\n", " <td>9.000</td>\n", " <td>14.000</td>\n", " <td>54.054</td>\n", " <td>70.370</td>\n", " <td>45.455</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " games pts fgm fga fg3m fg3a ftm \\\n", "season team opponent \n", "1996-97 ATL BKN 2.000 93.500 35.500 88.000 8.000 30.500 14.500 \n", " BOS 2.000 99.500 38.000 81.000 10.000 26.000 13.500 \n", " CHI 2.000 74.000 27.000 79.500 5.500 18.500 14.500 \n", " CLE 2.000 78.000 28.500 66.500 7.000 21.500 14.000 \n", " DAL 1.000 109.000 40.000 74.000 19.000 27.000 10.000 \n", "\n", " fta oreb dreb ast tov stl blk pf \\\n", "season team opponent \n", "1996-97 ATL BKN 17.500 17.000 28.000 18.000 12.500 8.500 5.000 15.000 \n", " BOS 24.500 12.500 33.000 28.000 24.000 11.500 6.500 19.500 \n", " CHI 19.000 14.500 25.500 12.000 16.000 9.000 4.000 16.000 \n", " CLE 18.000 9.000 28.500 18.500 13.500 7.000 5.000 17.500 \n", " DAL 22.000 12.000 37.000 26.000 15.000 6.000 9.000 14.000 \n", "\n", " fg_pct fg3_pct ft_pct \n", "season team opponent \n", "1996-97 ATL BKN 40.413 26.407 81.250 \n", " BOS 46.558 38.370 55.051 \n", " CHI 33.972 28.205 77.451 \n", " CLE 43.617 32.717 76.190 \n", " DAL 54.054 70.370 45.455 " ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "away_df.head()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "24797.0" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "away_df['games'].sum()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "csvfile = DATA_DIR.joinpath('stats_nba_com-agg_matchup_box_scores-away-1996_97-2016_17.csv')\n", "away_df.to_csv(csvfile, index=True, float_format='%g')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Combining the Home and Away Data\n", "\n", "Now that we have aggregated the home games and the away games, we need to combine the information. Remember, our goal is to subtract each team's home game performance from the same team's away game performance, grouped by season and opposing team.\n", "\n", "We can use the `pandas` [`join()`](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.join.html) method to accomplish this. We will add a suffix to each of the data columns to keep trach of which statistics came from the home games, and which came from the away games." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(17554, 36)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = home_df.join(away_df, how='outer', lsuffix='_h', rsuffix='_a')\n", "df.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Checking the Number of Rows\n", "\n", "Notice that the number of rows in the combined `DataFrame` is larger than the number of rows in each of the home and away `DataFrame` objects. That means we need to look more closely at whether the `join()` method created any rows with missing or null data. We will do that shortly. First, let's take a look at the combined data." ] }, { "cell_type": "code", "execution_count": 24, "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></th>\n", " <th></th>\n", " <th>games_h</th>\n", " <th>pts_h</th>\n", " <th>fgm_h</th>\n", " <th>fga_h</th>\n", " <th>fg3m_h</th>\n", " <th>fg3a_h</th>\n", " <th>ftm_h</th>\n", " <th>fta_h</th>\n", " <th>oreb_h</th>\n", " <th>dreb_h</th>\n", " <th>ast_h</th>\n", " <th>tov_h</th>\n", " <th>stl_h</th>\n", " <th>blk_h</th>\n", " <th>pf_h</th>\n", " <th>fg_pct_h</th>\n", " <th>fg3_pct_h</th>\n", " <th>ft_pct_h</th>\n", " <th>games_a</th>\n", " <th>pts_a</th>\n", " <th>fgm_a</th>\n", " <th>fga_a</th>\n", " <th>fg3m_a</th>\n", " <th>fg3a_a</th>\n", " <th>ftm_a</th>\n", " <th>fta_a</th>\n", " <th>oreb_a</th>\n", " <th>dreb_a</th>\n", " <th>ast_a</th>\n", " <th>tov_a</th>\n", " <th>stl_a</th>\n", " <th>blk_a</th>\n", " <th>pf_a</th>\n", " <th>fg_pct_a</th>\n", " <th>fg3_pct_a</th>\n", " <th>ft_pct_a</th>\n", " </tr>\n", " <tr>\n", " <th>season</th>\n", " <th>team</th>\n", " <th>opponent</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></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 rowspan=\"5\" valign=\"top\">1996-97</th>\n", " <th rowspan=\"5\" valign=\"top\">ATL</th>\n", " <th>BKN</th>\n", " <td>2.000</td>\n", " <td>109.000</td>\n", " <td>37.000</td>\n", " <td>76.000</td>\n", " <td>12.000</td>\n", " <td>26.500</td>\n", " <td>23.000</td>\n", " <td>28.000</td>\n", " <td>10.500</td>\n", " <td>30.500</td>\n", " <td>22.000</td>\n", " <td>16.000</td>\n", " <td>9.000</td>\n", " <td>5.000</td>\n", " <td>19.000</td>\n", " <td>48.710</td>\n", " <td>45.214</td>\n", " <td>82.143</td>\n", " <td>2.000</td>\n", " <td>93.500</td>\n", " <td>35.500</td>\n", " <td>88.000</td>\n", " <td>8.000</td>\n", " <td>30.500</td>\n", " <td>14.500</td>\n", " <td>17.500</td>\n", " <td>17.000</td>\n", " <td>28.000</td>\n", " <td>18.000</td>\n", " <td>12.500</td>\n", " <td>8.500</td>\n", " <td>5.000</td>\n", " <td>15.000</td>\n", " <td>40.413</td>\n", " <td>26.407</td>\n", " <td>81.250</td>\n", " </tr>\n", " <tr>\n", " <th>BOS</th>\n", " <td>2.000</td>\n", " <td>100.000</td>\n", " <td>38.500</td>\n", " <td>84.000</td>\n", " <td>8.000</td>\n", " <td>25.000</td>\n", " <td>15.000</td>\n", " <td>19.000</td>\n", " <td>17.500</td>\n", " <td>30.000</td>\n", " <td>22.500</td>\n", " <td>17.000</td>\n", " <td>10.000</td>\n", " <td>7.500</td>\n", " <td>19.000</td>\n", " <td>45.828</td>\n", " <td>34.225</td>\n", " <td>78.333</td>\n", " <td>2.000</td>\n", " <td>99.500</td>\n", " <td>38.000</td>\n", " <td>81.000</td>\n", " <td>10.000</td>\n", " <td>26.000</td>\n", " <td>13.500</td>\n", " <td>24.500</td>\n", " <td>12.500</td>\n", " <td>33.000</td>\n", " <td>28.000</td>\n", " <td>24.000</td>\n", " <td>11.500</td>\n", " <td>6.500</td>\n", " <td>19.500</td>\n", " <td>46.558</td>\n", " <td>38.370</td>\n", " <td>55.051</td>\n", " </tr>\n", " <tr>\n", " <th>CHI</th>\n", " <td>2.000</td>\n", " <td>98.000</td>\n", " <td>34.500</td>\n", " <td>81.000</td>\n", " <td>7.500</td>\n", " <td>24.500</td>\n", " <td>21.500</td>\n", " <td>24.500</td>\n", " <td>15.500</td>\n", " <td>28.500</td>\n", " <td>13.500</td>\n", " <td>13.000</td>\n", " <td>7.500</td>\n", " <td>4.500</td>\n", " <td>19.500</td>\n", " <td>42.593</td>\n", " <td>30.303</td>\n", " <td>85.646</td>\n", " <td>2.000</td>\n", " <td>74.000</td>\n", " <td>27.000</td>\n", " <td>79.500</td>\n", " <td>5.500</td>\n", " <td>18.500</td>\n", " <td>14.500</td>\n", " <td>19.000</td>\n", " <td>14.500</td>\n", " <td>25.500</td>\n", " <td>12.000</td>\n", " <td>16.000</td>\n", " <td>9.000</td>\n", " <td>4.000</td>\n", " <td>16.000</td>\n", " <td>33.972</td>\n", " <td>28.205</td>\n", " <td>77.451</td>\n", " </tr>\n", " <tr>\n", " <th>CLE</th>\n", " <td>2.000</td>\n", " <td>90.000</td>\n", " <td>31.000</td>\n", " <td>66.500</td>\n", " <td>7.000</td>\n", " <td>21.000</td>\n", " <td>21.000</td>\n", " <td>24.000</td>\n", " <td>8.000</td>\n", " <td>25.000</td>\n", " <td>19.500</td>\n", " <td>15.000</td>\n", " <td>6.500</td>\n", " <td>5.000</td>\n", " <td>19.000</td>\n", " <td>47.368</td>\n", " <td>33.409</td>\n", " <td>86.933</td>\n", " <td>2.000</td>\n", " <td>78.000</td>\n", " <td>28.500</td>\n", " <td>66.500</td>\n", " <td>7.000</td>\n", " <td>21.500</td>\n", " <td>14.000</td>\n", " <td>18.000</td>\n", " <td>9.000</td>\n", " <td>28.500</td>\n", " <td>18.500</td>\n", " <td>13.500</td>\n", " <td>7.000</td>\n", " <td>5.000</td>\n", " <td>17.500</td>\n", " <td>43.617</td>\n", " <td>32.717</td>\n", " <td>76.190</td>\n", " </tr>\n", " <tr>\n", " <th>DAL</th>\n", " <td>1.000</td>\n", " <td>93.000</td>\n", " <td>37.000</td>\n", " <td>72.000</td>\n", " <td>11.000</td>\n", " <td>24.000</td>\n", " <td>8.000</td>\n", " <td>15.000</td>\n", " <td>9.000</td>\n", " <td>29.000</td>\n", " <td>22.000</td>\n", " <td>13.000</td>\n", " <td>9.000</td>\n", " <td>3.000</td>\n", " <td>13.000</td>\n", " <td>51.389</td>\n", " <td>45.833</td>\n", " <td>53.333</td>\n", " <td>1.000</td>\n", " <td>109.000</td>\n", " <td>40.000</td>\n", " <td>74.000</td>\n", " <td>19.000</td>\n", " <td>27.000</td>\n", " <td>10.000</td>\n", " <td>22.000</td>\n", " <td>12.000</td>\n", " <td>37.000</td>\n", " <td>26.000</td>\n", " <td>15.000</td>\n", " <td>6.000</td>\n", " <td>9.000</td>\n", " <td>14.000</td>\n", " <td>54.054</td>\n", " <td>70.370</td>\n", " <td>45.455</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " games_h pts_h fgm_h fga_h fg3m_h fg3a_h ftm_h \\\n", "season team opponent \n", "1996-97 ATL BKN 2.000 109.000 37.000 76.000 12.000 26.500 23.000 \n", " BOS 2.000 100.000 38.500 84.000 8.000 25.000 15.000 \n", " CHI 2.000 98.000 34.500 81.000 7.500 24.500 21.500 \n", " CLE 2.000 90.000 31.000 66.500 7.000 21.000 21.000 \n", " DAL 1.000 93.000 37.000 72.000 11.000 24.000 8.000 \n", "\n", " fta_h oreb_h dreb_h ast_h tov_h stl_h blk_h \\\n", "season team opponent \n", "1996-97 ATL BKN 28.000 10.500 30.500 22.000 16.000 9.000 5.000 \n", " BOS 19.000 17.500 30.000 22.500 17.000 10.000 7.500 \n", " CHI 24.500 15.500 28.500 13.500 13.000 7.500 4.500 \n", " CLE 24.000 8.000 25.000 19.500 15.000 6.500 5.000 \n", " DAL 15.000 9.000 29.000 22.000 13.000 9.000 3.000 \n", "\n", " pf_h fg_pct_h fg3_pct_h ft_pct_h games_a pts_a \\\n", "season team opponent \n", "1996-97 ATL BKN 19.000 48.710 45.214 82.143 2.000 93.500 \n", " BOS 19.000 45.828 34.225 78.333 2.000 99.500 \n", " CHI 19.500 42.593 30.303 85.646 2.000 74.000 \n", " CLE 19.000 47.368 33.409 86.933 2.000 78.000 \n", " DAL 13.000 51.389 45.833 53.333 1.000 109.000 \n", "\n", " fgm_a fga_a fg3m_a fg3a_a ftm_a fta_a oreb_a \\\n", "season team opponent \n", "1996-97 ATL BKN 35.500 88.000 8.000 30.500 14.500 17.500 17.000 \n", " BOS 38.000 81.000 10.000 26.000 13.500 24.500 12.500 \n", " CHI 27.000 79.500 5.500 18.500 14.500 19.000 14.500 \n", " CLE 28.500 66.500 7.000 21.500 14.000 18.000 9.000 \n", " DAL 40.000 74.000 19.000 27.000 10.000 22.000 12.000 \n", "\n", " dreb_a ast_a tov_a stl_a blk_a pf_a fg_pct_a \\\n", "season team opponent \n", "1996-97 ATL BKN 28.000 18.000 12.500 8.500 5.000 15.000 40.413 \n", " BOS 33.000 28.000 24.000 11.500 6.500 19.500 46.558 \n", " CHI 25.500 12.000 16.000 9.000 4.000 16.000 33.972 \n", " CLE 28.500 18.500 13.500 7.000 5.000 17.500 43.617 \n", " DAL 37.000 26.000 15.000 6.000 9.000 14.000 54.054 \n", "\n", " fg3_pct_a ft_pct_a \n", "season team opponent \n", "1996-97 ATL BKN 26.407 81.250 \n", " BOS 38.370 55.051 \n", " CHI 28.205 77.451 \n", " CLE 32.717 76.190 \n", " DAL 70.370 45.455 " ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that this `DataFrame` uses a `pandas` [`MultiIndex`](https://pandas.pydata.org/pandas-docs/stable/advanced.html) structure for the 3 index columns. Here is an example of how to access a particular match up for a particular season." ] }, { "cell_type": "code", "execution_count": 25, "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></th>\n", " <th></th>\n", " <th>games_h</th>\n", " <th>pts_h</th>\n", " <th>fgm_h</th>\n", " <th>fga_h</th>\n", " <th>fg3m_h</th>\n", " <th>fg3a_h</th>\n", " <th>ftm_h</th>\n", " <th>fta_h</th>\n", " <th>oreb_h</th>\n", " <th>dreb_h</th>\n", " <th>ast_h</th>\n", " <th>tov_h</th>\n", " <th>stl_h</th>\n", " <th>blk_h</th>\n", " <th>pf_h</th>\n", " <th>fg_pct_h</th>\n", " <th>fg3_pct_h</th>\n", " <th>ft_pct_h</th>\n", " <th>games_a</th>\n", " <th>pts_a</th>\n", " <th>fgm_a</th>\n", " <th>fga_a</th>\n", " <th>fg3m_a</th>\n", " <th>fg3a_a</th>\n", " <th>ftm_a</th>\n", " <th>fta_a</th>\n", " <th>oreb_a</th>\n", " <th>dreb_a</th>\n", " <th>ast_a</th>\n", " <th>tov_a</th>\n", " <th>stl_a</th>\n", " <th>blk_a</th>\n", " <th>pf_a</th>\n", " <th>fg_pct_a</th>\n", " <th>fg3_pct_a</th>\n", " <th>ft_pct_a</th>\n", " </tr>\n", " <tr>\n", " <th>season</th>\n", " <th>team</th>\n", " <th>opponent</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></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 rowspan=\"2\" valign=\"top\">2016-17</th>\n", " <th>UTA</th>\n", " <th>WAS</th>\n", " <td>1.000</td>\n", " <td>95.000</td>\n", " <td>33.000</td>\n", " <td>72.000</td>\n", " <td>10.000</td>\n", " <td>25.000</td>\n", " <td>19.000</td>\n", " <td>31.000</td>\n", " <td>7.000</td>\n", " <td>35.000</td>\n", " <td>20.000</td>\n", " <td>12.000</td>\n", " <td>9.000</td>\n", " <td>7.000</td>\n", " <td>18.000</td>\n", " <td>45.833</td>\n", " <td>40.000</td>\n", " <td>61.290</td>\n", " <td>1.000</td>\n", " <td>102.000</td>\n", " <td>34.000</td>\n", " <td>72.000</td>\n", " <td>11.000</td>\n", " <td>24.000</td>\n", " <td>23.000</td>\n", " <td>32.000</td>\n", " <td>9.000</td>\n", " <td>41.000</td>\n", " <td>18.000</td>\n", " <td>25.000</td>\n", " <td>10.000</td>\n", " <td>11.000</td>\n", " <td>19.000</td>\n", " <td>47.222</td>\n", " <td>45.833</td>\n", " <td>71.875</td>\n", " </tr>\n", " <tr>\n", " <th>WAS</th>\n", " <th>UTA</th>\n", " <td>1.000</td>\n", " <td>92.000</td>\n", " <td>37.000</td>\n", " <td>87.000</td>\n", " <td>8.000</td>\n", " <td>22.000</td>\n", " <td>10.000</td>\n", " <td>13.000</td>\n", " <td>6.000</td>\n", " <td>22.000</td>\n", " <td>21.000</td>\n", " <td>16.000</td>\n", " <td>16.000</td>\n", " <td>1.000</td>\n", " <td>27.000</td>\n", " <td>42.529</td>\n", " <td>36.364</td>\n", " <td>76.923</td>\n", " <td>1.000</td>\n", " <td>88.000</td>\n", " <td>35.000</td>\n", " <td>87.000</td>\n", " <td>5.000</td>\n", " <td>17.000</td>\n", " <td>13.000</td>\n", " <td>16.000</td>\n", " <td>14.000</td>\n", " <td>31.000</td>\n", " <td>12.000</td>\n", " <td>15.000</td>\n", " <td>8.000</td>\n", " <td>1.000</td>\n", " <td>23.000</td>\n", " <td>40.230</td>\n", " <td>29.412</td>\n", " <td>81.250</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " games_h pts_h fgm_h fga_h fg3m_h fg3a_h ftm_h \\\n", "season team opponent \n", "2016-17 UTA WAS 1.000 95.000 33.000 72.000 10.000 25.000 19.000 \n", " WAS UTA 1.000 92.000 37.000 87.000 8.000 22.000 10.000 \n", "\n", " fta_h oreb_h dreb_h ast_h tov_h stl_h blk_h \\\n", "season team opponent \n", "2016-17 UTA WAS 31.000 7.000 35.000 20.000 12.000 9.000 7.000 \n", " WAS UTA 13.000 6.000 22.000 21.000 16.000 16.000 1.000 \n", "\n", " pf_h fg_pct_h fg3_pct_h ft_pct_h games_a pts_a \\\n", "season team opponent \n", "2016-17 UTA WAS 18.000 45.833 40.000 61.290 1.000 102.000 \n", " WAS UTA 27.000 42.529 36.364 76.923 1.000 88.000 \n", "\n", " fgm_a fga_a fg3m_a fg3a_a ftm_a fta_a oreb_a \\\n", "season team opponent \n", "2016-17 UTA WAS 34.000 72.000 11.000 24.000 23.000 32.000 9.000 \n", " WAS UTA 35.000 87.000 5.000 17.000 13.000 16.000 14.000 \n", "\n", " dreb_a ast_a tov_a stl_a blk_a pf_a fg_pct_a \\\n", "season team opponent \n", "2016-17 UTA WAS 41.000 18.000 25.000 10.000 11.000 19.000 47.222 \n", " WAS UTA 31.000 12.000 15.000 8.000 1.000 23.000 40.230 \n", "\n", " fg3_pct_a ft_pct_a \n", "season team opponent \n", "2016-17 UTA WAS 45.833 71.875 \n", " WAS UTA 29.412 81.250 " ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc['2016-17', ['WAS', 'UTA'], ['WAS', 'UTA']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first row in the above example are Utah's statistics, when they played Washington during the 2016-17 regular season. The columns ending in `_h` are Utah's home statistics, and the columns ending in `_a` are their away statistics. We can see from the games columns that the Jazz and the Wizards played 1 game in Salt Lake City and 1 game in Washington, D.C. during that season.\n", "\n", "The second row is the same match up, but with Washington's statistics.\n", "\n", "Let's just double-check that we still have all the relevant regular season games captured in this `DataFrame`." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "24797.0" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['games_h'].sum()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "24797.0" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['games_a'].sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Understanding the Number of Rows\n", "\n", "All the games are there. But, as we noticed above, extra rows were created in this `DataFrame` when we merged the home and away game data. Let's check to see how many rows have at least one null or missing value." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "528" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(df[df.isnull().any(axis=1)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bingo. The joined `DataFrame` had 264 extra rows compared to the original home and away `DataFrame` objects (264 = 17,554 - 17,290).\n", "\n", "And, 528 is double 264. This means that there are some match ups in particular seasons that didn't have both home and away games. The reason the 264 is doubled is that for one match up row in the table, the home game columns are null, and in the other row, the away game columsn are null.\n", "\n", "Let's take a look at the rows that have missing values." ] }, { "cell_type": "code", "execution_count": 29, "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></th>\n", " <th></th>\n", " <th>games_h</th>\n", " <th>pts_h</th>\n", " <th>fgm_h</th>\n", " <th>fga_h</th>\n", " <th>fg3m_h</th>\n", " <th>fg3a_h</th>\n", " <th>ftm_h</th>\n", " <th>fta_h</th>\n", " <th>oreb_h</th>\n", " <th>dreb_h</th>\n", " <th>ast_h</th>\n", " <th>tov_h</th>\n", " <th>stl_h</th>\n", " <th>blk_h</th>\n", " <th>pf_h</th>\n", " <th>fg_pct_h</th>\n", " <th>fg3_pct_h</th>\n", " <th>ft_pct_h</th>\n", " <th>games_a</th>\n", " <th>pts_a</th>\n", " <th>fgm_a</th>\n", " <th>fga_a</th>\n", " <th>fg3m_a</th>\n", " <th>fg3a_a</th>\n", " <th>ftm_a</th>\n", " <th>fta_a</th>\n", " <th>oreb_a</th>\n", " <th>dreb_a</th>\n", " <th>ast_a</th>\n", " <th>tov_a</th>\n", " <th>stl_a</th>\n", " <th>blk_a</th>\n", " <th>pf_a</th>\n", " <th>fg_pct_a</th>\n", " <th>fg3_pct_a</th>\n", " <th>ft_pct_a</th>\n", " </tr>\n", " <tr>\n", " <th>season</th>\n", " <th>team</th>\n", " <th>opponent</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></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 rowspan=\"5\" valign=\"top\">1998-99</th>\n", " <th rowspan=\"5\" valign=\"top\">ATL</th>\n", " <th>DAL</th>\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", " <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>1.000</td>\n", " <td>85.000</td>\n", " <td>32.000</td>\n", " <td>86.000</td>\n", " <td>4.000</td>\n", " <td>16.000</td>\n", " <td>17.000</td>\n", " <td>26.000</td>\n", " <td>18.000</td>\n", " <td>31.000</td>\n", " <td>18.000</td>\n", " <td>12.000</td>\n", " <td>5.000</td>\n", " <td>9.000</td>\n", " <td>17.000</td>\n", " <td>37.209</td>\n", " <td>25.000</td>\n", " <td>65.385</td>\n", " </tr>\n", " <tr>\n", " <th>HOU</th>\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", " <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>1.000</td>\n", " <td>93.000</td>\n", " <td>38.000</td>\n", " <td>92.000</td>\n", " <td>4.000</td>\n", " <td>10.000</td>\n", " <td>13.000</td>\n", " <td>17.000</td>\n", " <td>15.000</td>\n", " <td>26.000</td>\n", " <td>18.000</td>\n", " <td>4.000</td>\n", " <td>10.000</td>\n", " <td>8.000</td>\n", " <td>18.000</td>\n", " <td>41.304</td>\n", " <td>40.000</td>\n", " <td>76.471</td>\n", " </tr>\n", " <tr>\n", " <th>LAC</th>\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", " <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>1.000</td>\n", " <td>103.000</td>\n", " <td>40.000</td>\n", " <td>74.000</td>\n", " <td>2.000</td>\n", " <td>7.000</td>\n", " <td>21.000</td>\n", " <td>24.000</td>\n", " <td>9.000</td>\n", " <td>32.000</td>\n", " <td>23.000</td>\n", " <td>8.000</td>\n", " <td>7.000</td>\n", " <td>5.000</td>\n", " <td>19.000</td>\n", " <td>54.054</td>\n", " <td>28.571</td>\n", " <td>87.500</td>\n", " </tr>\n", " <tr>\n", " <th>MEM</th>\n", " <td>1.000</td>\n", " <td>84.000</td>\n", " <td>30.000</td>\n", " <td>78.000</td>\n", " <td>2.000</td>\n", " <td>9.000</td>\n", " <td>22.000</td>\n", " <td>26.000</td>\n", " <td>18.000</td>\n", " <td>27.000</td>\n", " <td>11.000</td>\n", " <td>15.000</td>\n", " <td>10.000</td>\n", " <td>6.000</td>\n", " <td>26.000</td>\n", " <td>38.462</td>\n", " <td>22.222</td>\n", " <td>84.615</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", " <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>PHX</th>\n", " <td>1.000</td>\n", " <td>93.000</td>\n", " <td>31.000</td>\n", " <td>74.000</td>\n", " <td>9.000</td>\n", " <td>24.000</td>\n", " <td>22.000</td>\n", " <td>24.000</td>\n", " <td>15.000</td>\n", " <td>37.000</td>\n", " <td>18.000</td>\n", " <td>19.000</td>\n", " <td>7.000</td>\n", " <td>6.000</td>\n", " <td>21.000</td>\n", " <td>41.892</td>\n", " <td>37.500</td>\n", " <td>91.667</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", " <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", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " games_h pts_h fgm_h fga_h fg3m_h fg3a_h ftm_h \\\n", "season team opponent \n", "1998-99 ATL DAL nan nan nan nan nan nan nan \n", " HOU nan nan nan nan nan nan nan \n", " LAC nan nan nan nan nan nan nan \n", " MEM 1.000 84.000 30.000 78.000 2.000 9.000 22.000 \n", " PHX 1.000 93.000 31.000 74.000 9.000 24.000 22.000 \n", "\n", " fta_h oreb_h dreb_h ast_h tov_h stl_h blk_h \\\n", "season team opponent \n", "1998-99 ATL DAL nan nan nan nan nan nan nan \n", " HOU nan nan nan nan nan nan nan \n", " LAC nan nan nan nan nan nan nan \n", " MEM 26.000 18.000 27.000 11.000 15.000 10.000 6.000 \n", " PHX 24.000 15.000 37.000 18.000 19.000 7.000 6.000 \n", "\n", " pf_h fg_pct_h fg3_pct_h ft_pct_h games_a pts_a \\\n", "season team opponent \n", "1998-99 ATL DAL nan nan nan nan 1.000 85.000 \n", " HOU nan nan nan nan 1.000 93.000 \n", " LAC nan nan nan nan 1.000 103.000 \n", " MEM 26.000 38.462 22.222 84.615 nan nan \n", " PHX 21.000 41.892 37.500 91.667 nan nan \n", "\n", " fgm_a fga_a fg3m_a fg3a_a ftm_a fta_a oreb_a \\\n", "season team opponent \n", "1998-99 ATL DAL 32.000 86.000 4.000 16.000 17.000 26.000 18.000 \n", " HOU 38.000 92.000 4.000 10.000 13.000 17.000 15.000 \n", " LAC 40.000 74.000 2.000 7.000 21.000 24.000 9.000 \n", " MEM nan nan nan nan nan nan nan \n", " PHX nan nan nan nan nan nan nan \n", "\n", " dreb_a ast_a tov_a stl_a blk_a pf_a fg_pct_a \\\n", "season team opponent \n", "1998-99 ATL DAL 31.000 18.000 12.000 5.000 9.000 17.000 37.209 \n", " HOU 26.000 18.000 4.000 10.000 8.000 18.000 41.304 \n", " LAC 32.000 23.000 8.000 7.000 5.000 19.000 54.054 \n", " MEM nan nan nan nan nan nan nan \n", " PHX nan nan nan nan nan nan nan \n", "\n", " fg3_pct_a ft_pct_a \n", "season team opponent \n", "1998-99 ATL DAL 25.000 65.385 \n", " HOU 40.000 76.471 \n", " LAC 28.571 87.500 \n", " MEM nan nan \n", " PHX nan nan " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df.isnull().any(axis=1)].head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see which seasons don't have balanced match ups between home and away games." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "season\n", "1998-99 168\n", "2011-12 360\n", "dtype: int64" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df.isnull().any(axis=1)].groupby(['season']).size()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This makes sense. These are the seasons that experienced [lockouts](https://en.wikipedia.org/wiki/NBA_lockout) and therefore didn't have a normal schedule.\n", "\n", "In our analysis, we need to subtract the away game aggregate statistics from the home game aggregate statistics. So, we'll have to drop these rows that have null values.\n", "\n", "### Home versus Away Difference\n", "\n", "Now we are ready to do the subtract to create the home court advantage analysis." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "def matchup_home_edge(df):\n", " stat_cols = [col[:-2] for col in df.columns if '_h' in col and 'games' not in col]\n", " df = df.copy().dropna()\n", " for col in stat_cols:\n", " df[col] = df[col+'_h'] - df[col+'_a']\n", " df['games'] = df['games_h'] + df['games_a']\n", " df['games'] = df['games'].astype(int)\n", " return df[['games']+stat_cols]" ] }, { "cell_type": "code", "execution_count": 32, "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></th>\n", " <th></th>\n", " <th>games</th>\n", " <th>pts</th>\n", " <th>fgm</th>\n", " <th>fga</th>\n", " <th>fg3m</th>\n", " <th>fg3a</th>\n", " <th>ftm</th>\n", " <th>fta</th>\n", " <th>oreb</th>\n", " <th>dreb</th>\n", " <th>ast</th>\n", " <th>tov</th>\n", " <th>stl</th>\n", " <th>blk</th>\n", " <th>pf</th>\n", " <th>fg_pct</th>\n", " <th>fg3_pct</th>\n", " <th>ft_pct</th>\n", " </tr>\n", " <tr>\n", " <th>season</th>\n", " <th>team</th>\n", " <th>opponent</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></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 rowspan=\"5\" valign=\"top\">1996-97</th>\n", " <th rowspan=\"5\" valign=\"top\">ATL</th>\n", " <th>BKN</th>\n", " <td>4</td>\n", " <td>15.500</td>\n", " <td>1.500</td>\n", " <td>-12.000</td>\n", " <td>4.000</td>\n", " <td>-4.000</td>\n", " <td>8.500</td>\n", " <td>10.500</td>\n", " <td>-6.500</td>\n", " <td>2.500</td>\n", " <td>4.000</td>\n", " <td>3.500</td>\n", " <td>0.500</td>\n", " <td>0.000</td>\n", " <td>4.000</td>\n", " <td>8.297</td>\n", " <td>18.807</td>\n", " <td>0.893</td>\n", " </tr>\n", " <tr>\n", " <th>BOS</th>\n", " <td>4</td>\n", " <td>0.500</td>\n", " <td>0.500</td>\n", " <td>3.000</td>\n", " <td>-2.000</td>\n", " <td>-1.000</td>\n", " <td>1.500</td>\n", " <td>-5.500</td>\n", " <td>5.000</td>\n", " <td>-3.000</td>\n", " <td>-5.500</td>\n", " <td>-7.000</td>\n", " <td>-1.500</td>\n", " <td>1.000</td>\n", " <td>-0.500</td>\n", " <td>-0.730</td>\n", " <td>-4.146</td>\n", " <td>23.283</td>\n", " </tr>\n", " <tr>\n", " <th>CHI</th>\n", " <td>4</td>\n", " <td>24.000</td>\n", " <td>7.500</td>\n", " <td>1.500</td>\n", " <td>2.000</td>\n", " <td>6.000</td>\n", " <td>7.000</td>\n", " <td>5.500</td>\n", " <td>1.000</td>\n", " <td>3.000</td>\n", " <td>1.500</td>\n", " <td>-3.000</td>\n", " <td>-1.500</td>\n", " <td>0.500</td>\n", " <td>3.500</td>\n", " <td>8.621</td>\n", " <td>2.098</td>\n", " <td>8.195</td>\n", " </tr>\n", " <tr>\n", " <th>CLE</th>\n", " <td>4</td>\n", " <td>12.000</td>\n", " <td>2.500</td>\n", " <td>0.000</td>\n", " <td>0.000</td>\n", " <td>-0.500</td>\n", " <td>7.000</td>\n", " <td>6.000</td>\n", " <td>-1.000</td>\n", " <td>-3.500</td>\n", " <td>1.000</td>\n", " <td>1.500</td>\n", " <td>-0.500</td>\n", " <td>0.000</td>\n", " <td>1.500</td>\n", " <td>3.752</td>\n", " <td>0.692</td>\n", " <td>10.742</td>\n", " </tr>\n", " <tr>\n", " <th>DAL</th>\n", " <td>2</td>\n", " <td>-16.000</td>\n", " <td>-3.000</td>\n", " <td>-2.000</td>\n", " <td>-8.000</td>\n", " <td>-3.000</td>\n", " <td>-2.000</td>\n", " <td>-7.000</td>\n", " <td>-3.000</td>\n", " <td>-8.000</td>\n", " <td>-4.000</td>\n", " <td>-2.000</td>\n", " <td>3.000</td>\n", " <td>-6.000</td>\n", " <td>-1.000</td>\n", " <td>-2.665</td>\n", " <td>-24.537</td>\n", " <td>7.879</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " games pts fgm fga fg3m fg3a ftm \\\n", "season team opponent \n", "1996-97 ATL BKN 4 15.500 1.500 -12.000 4.000 -4.000 8.500 \n", " BOS 4 0.500 0.500 3.000 -2.000 -1.000 1.500 \n", " CHI 4 24.000 7.500 1.500 2.000 6.000 7.000 \n", " CLE 4 12.000 2.500 0.000 0.000 -0.500 7.000 \n", " DAL 2 -16.000 -3.000 -2.000 -8.000 -3.000 -2.000 \n", "\n", " fta oreb dreb ast tov stl blk pf \\\n", "season team opponent \n", "1996-97 ATL BKN 10.500 -6.500 2.500 4.000 3.500 0.500 0.000 4.000 \n", " BOS -5.500 5.000 -3.000 -5.500 -7.000 -1.500 1.000 -0.500 \n", " CHI 5.500 1.000 3.000 1.500 -3.000 -1.500 0.500 3.500 \n", " CLE 6.000 -1.000 -3.500 1.000 1.500 -0.500 0.000 1.500 \n", " DAL -7.000 -3.000 -8.000 -4.000 -2.000 3.000 -6.000 -1.000 \n", "\n", " fg_pct fg3_pct ft_pct \n", "season team opponent \n", "1996-97 ATL BKN 8.297 18.807 0.893 \n", " BOS -0.730 -4.146 23.283 \n", " CHI 8.621 2.098 8.195 \n", " CLE 3.752 0.692 10.742 \n", " DAL -2.665 -24.537 7.879 " ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hca = matchup_home_edge(df)\n", "hca.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice how we differenced the home and away statistics and returned a simpler `DataFrame`. The original home and away `DataFrame` objects are unchanged, of course.\n", "\n", "#### Home Court Impact on Box Score Statistics\n", "\n", "Now let's take a look at the impact of home court on box score statistics.\n", "\n", "We'll separate out the statistics by type, either scoring or other." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "stats_cols = [col for col in hca.columns if col not in ['games']]\n", "scoring_cols = [col for col in stats_cols if any(s in col for s in ['pts', 'fg', 'ft'])]\n", "other_cols = [col for col in stats_cols if col not in scoring_cols]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, let's see how many games typically occurred between a particular pair of teams in each season." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 17026.000\n", "mean 2.882\n", "std 0.927\n", "min 2.000\n", "25% 2.000\n", "50% 3.000\n", "75% 4.000\n", "max 5.000\n", "Name: games, dtype: float64" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hca['games'].describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that each match up in our data set occurred between 2 and 5 times per season, with a typical value of 3 games. We know from the [rules of the NBA season](https://www.nbastuffer.com/analytics101/how-the-nba-schedule-is-made/) that teams in the same Division play more games, so this distribution makes sense.\n", "\n", "Now, let's look at the scoring and other statistics." ] }, { "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>pts</th>\n", " <th>fgm</th>\n", " <th>fga</th>\n", " <th>fg3m</th>\n", " <th>fg3a</th>\n", " <th>ftm</th>\n", " <th>fta</th>\n", " <th>fg_pct</th>\n", " <th>fg3_pct</th>\n", " <th>ft_pct</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>count</th>\n", " <td>17026.000</td>\n", " <td>17026.000</td>\n", " <td>17026.000</td>\n", " <td>17026.000</td>\n", " <td>17026.000</td>\n", " <td>17026.000</td>\n", " <td>17026.000</td>\n", " <td>17026.000</td>\n", " <td>17026.000</td>\n", " <td>17026.000</td>\n", " </tr>\n", " <tr>\n", " <th>mean</th>\n", " <td>3.099</td>\n", " <td>1.071</td>\n", " <td>0.166</td>\n", " <td>0.154</td>\n", " <td>0.001</td>\n", " <td>0.803</td>\n", " <td>0.985</td>\n", " <td>1.225</td>\n", " <td>0.883</td>\n", " <td>0.279</td>\n", " </tr>\n", " <tr>\n", " <th>std</th>\n", " <td>12.508</td>\n", " <td>5.483</td>\n", " <td>7.373</td>\n", " <td>3.235</td>\n", " <td>5.374</td>\n", " <td>7.151</td>\n", " <td>8.752</td>\n", " <td>6.618</td>\n", " <td>15.459</td>\n", " <td>12.067</td>\n", " </tr>\n", " <tr>\n", " <th>min</th>\n", " <td>-50.000</td>\n", " <td>-21.000</td>\n", " <td>-33.000</td>\n", " <td>-18.000</td>\n", " <td>-26.000</td>\n", " <td>-33.000</td>\n", " <td>-41.000</td>\n", " <td>-28.482</td>\n", " <td>-80.000</td>\n", " <td>-56.618</td>\n", " </tr>\n", " <tr>\n", " <th>25%</th>\n", " <td>-5.000</td>\n", " <td>-2.500</td>\n", " <td>-4.696</td>\n", " <td>-2.000</td>\n", " <td>-3.500</td>\n", " <td>-4.000</td>\n", " <td>-4.788</td>\n", " <td>-3.092</td>\n", " <td>-8.772</td>\n", " <td>-7.585</td>\n", " </tr>\n", " <tr>\n", " <th>50%</th>\n", " <td>3.000</td>\n", " <td>1.000</td>\n", " <td>0.000</td>\n", " <td>0.000</td>\n", " <td>0.000</td>\n", " <td>1.000</td>\n", " <td>1.000</td>\n", " <td>1.189</td>\n", " <td>0.739</td>\n", " <td>0.274</td>\n", " </tr>\n", " <tr>\n", " <th>75%</th>\n", " <td>11.000</td>\n", " <td>4.500</td>\n", " <td>5.000</td>\n", " <td>2.000</td>\n", " <td>3.500</td>\n", " <td>5.500</td>\n", " <td>6.500</td>\n", " <td>5.467</td>\n", " <td>10.464</td>\n", " <td>8.036</td>\n", " </tr>\n", " <tr>\n", " <th>max</th>\n", " <td>55.000</td>\n", " <td>23.000</td>\n", " <td>32.000</td>\n", " <td>16.000</td>\n", " <td>24.000</td>\n", " <td>29.000</td>\n", " <td>44.000</td>\n", " <td>29.252</td>\n", " <td>72.143</td>\n", " <td>52.941</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " pts fgm fga fg3m fg3a ftm fta \\\n", "count 17026.000 17026.000 17026.000 17026.000 17026.000 17026.000 17026.000 \n", "mean 3.099 1.071 0.166 0.154 0.001 0.803 0.985 \n", "std 12.508 5.483 7.373 3.235 5.374 7.151 8.752 \n", "min -50.000 -21.000 -33.000 -18.000 -26.000 -33.000 -41.000 \n", "25% -5.000 -2.500 -4.696 -2.000 -3.500 -4.000 -4.788 \n", "50% 3.000 1.000 0.000 0.000 0.000 1.000 1.000 \n", "75% 11.000 4.500 5.000 2.000 3.500 5.500 6.500 \n", "max 55.000 23.000 32.000 16.000 24.000 29.000 44.000 \n", "\n", " fg_pct fg3_pct ft_pct \n", "count 17026.000 17026.000 17026.000 \n", "mean 1.225 0.883 0.279 \n", "std 6.618 15.459 12.067 \n", "min -28.482 -80.000 -56.618 \n", "25% -3.092 -8.772 -7.585 \n", "50% 1.189 0.739 0.274 \n", "75% 5.467 10.464 8.036 \n", "max 29.252 72.143 52.941 " ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hca[scoring_cols].describe()" ] }, { "cell_type": "code", "execution_count": 36, "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>oreb</th>\n", " <th>dreb</th>\n", " <th>ast</th>\n", " <th>tov</th>\n", " <th>stl</th>\n", " <th>blk</th>\n", " <th>pf</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>count</th>\n", " <td>17026.000</td>\n", " <td>17026.000</td>\n", " <td>17026.000</td>\n", " <td>17026.000</td>\n", " <td>17026.000</td>\n", " <td>17026.000</td>\n", " <td>17026.000</td>\n", " </tr>\n", " <tr>\n", " <th>mean</th>\n", " <td>0.374</td>\n", " <td>1.057</td>\n", " <td>1.666</td>\n", " <td>-0.373</td>\n", " <td>0.119</td>\n", " <td>0.639</td>\n", " <td>-0.532</td>\n", " </tr>\n", " <tr>\n", " <th>std</th>\n", " <td>4.653</td>\n", " <td>5.825</td>\n", " <td>5.680</td>\n", " <td>4.501</td>\n", " <td>3.418</td>\n", " <td>3.025</td>\n", " <td>4.920</td>\n", " </tr>\n", " <tr>\n", " <th>min</th>\n", " <td>-23.000</td>\n", " <td>-26.000</td>\n", " <td>-20.000</td>\n", " <td>-22.000</td>\n", " <td>-14.500</td>\n", " <td>-12.085</td>\n", " <td>-20.500</td>\n", " </tr>\n", " <tr>\n", " <th>25%</th>\n", " <td>-2.613</td>\n", " <td>-2.802</td>\n", " <td>-2.000</td>\n", " <td>-3.083</td>\n", " <td>-2.000</td>\n", " <td>-1.000</td>\n", " <td>-4.000</td>\n", " </tr>\n", " <tr>\n", " <th>50%</th>\n", " <td>0.500</td>\n", " <td>1.000</td>\n", " <td>1.513</td>\n", " <td>-0.415</td>\n", " <td>0.000</td>\n", " <td>0.500</td>\n", " <td>-0.500</td>\n", " </tr>\n", " <tr>\n", " <th>75%</th>\n", " <td>3.293</td>\n", " <td>5.000</td>\n", " <td>5.308</td>\n", " <td>2.500</td>\n", " <td>2.130</td>\n", " <td>2.500</td>\n", " <td>2.826</td>\n", " </tr>\n", " <tr>\n", " <th>max</th>\n", " <td>29.000</td>\n", " <td>26.000</td>\n", " <td>31.000</td>\n", " <td>18.000</td>\n", " <td>16.000</td>\n", " <td>16.000</td>\n", " <td>20.943</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " oreb dreb ast tov stl blk pf\n", "count 17026.000 17026.000 17026.000 17026.000 17026.000 17026.000 17026.000\n", "mean 0.374 1.057 1.666 -0.373 0.119 0.639 -0.532\n", "std 4.653 5.825 5.680 4.501 3.418 3.025 4.920\n", "min -23.000 -26.000 -20.000 -22.000 -14.500 -12.085 -20.500\n", "25% -2.613 -2.802 -2.000 -3.083 -2.000 -1.000 -4.000\n", "50% 0.500 1.000 1.513 -0.415 0.000 0.500 -0.500\n", "75% 3.293 5.000 5.308 2.500 2.130 2.500 2.826\n", "max 29.000 26.000 31.000 18.000 16.000 16.000 20.943" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hca[other_cols].describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Scoring\n", "\n", "If you look at the `pts` column, you will see that the same 3.1 point home court advantage emerges from our aggregated data.\n", "\n", "Looking at that same column, you will also see that there is a lot of variation around that average. Remember, the data we're looking at are match ups within a particular season. The point differentials between the same two teams is not very consistent, even within the same season.\n", "\n", "Let's plot the point differential." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "def get_bins(s):\n", " mins = s.min()\n", " maxs = s.max()\n", " return np.arange(2*(round(mins/2)-1), 2*(round(maxs/2)+2), 2)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "image/png": "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5ptvePvtt+natSt/+9vfiI+PJykpiV//+tfUrl0bgJycHB599FHGjRvHxo0b+eUvf8mkSZPIysriT3/6E4MGDeLbb7/lvvvuY9y4caxYsYImTZqQk+PddfLgwYM899xz7N+/H4Cf/OQntGzZsvJ/mCGmQk0kSuTn5/Puu++SkJDALbfc4necqHbr4H5+R4hqbdq04fLLL2fJkiWsXLmSHj16+B2pUqxZs4axY8eSn5/PV199xbPPPnvSOgkJCfzxj39k1apVWGvp0aMHs2bN4uWXX6Zhw4akp6cft35RURH79+/n+eefJzY2lp///Ods2uRNWVq3bl2eeeYZ9u/fz5gxY3j99ddJTEzk97//PatWraJbt27H9lNSpG3YsIGPPvqIl19++aRsubm5PP/882RnZ/Pggw9y+eWX88ILL/DKK6/QuHFjPvjgA8aPH0/v3r2PbbNz507+/Oc/06RJEx566CFc1+W2227jq6++4s477+T111+nb9++3HjjjSxdupQDBw4cK9SSk5OpV68e33//PStWrKBx48Z8+eWXuK5L3759jx1j69atfPbZZ7z++uvk5uYeu9L9vffeo2vXrlxzzTVs376dP/7xj7z66qtn+uPzjQo1kSiRnp7Orl27GDVqFI0bN/Y7TlSrdUJrg5ydooXpJz13e8fWLFmyhLdefZnu77wbFa1qXbp04YknngDg22+/5aGHHmLChAnHrdOmTRsAmjRpQl5eHgCPP/44b7zxBllZWfTs2fO49WNjY4mPj+epp56iVq1a/PDDDxQWFgJw3nnnAfDdd9+RnZ3NY489BsDhw4dLvYdlRkYG7733Hs8++ywpKSknLe/cuTOxsbE0aNCAunXrkpWVRe3atY/9vuncuTPjxo07rlBLTk6mSZMmJ72mErfeeivvvvsujz76KI0aNaJdu3bHLe/bty/Lly9n48aN3HzzzXz66ads2LCBX/ziF6xYsQLwCjXHcYiNjaVOnTq0aNHi2PNr1qxh3rx5gNeKGYk0Rk0kChw5coTx48dTo0YNbr75Zr/jRL0Dh3M5cDjX7xhRrVXTJlzR3sHdsYtFixb5HafSNWjQoNTnTyxI8/LyWLBgAY8//jh//vOfj/1BVmLLli0sXryYJ598kjFjxlBcXHzsIozYWO8jvlmzZjRp0oTnn3+el156idGjR9O+ffvjjjN79mw++ugjXnzxxTJvEP7ll18C3hizw4cP07BhQw4fPszevXsBWLduHeeee+5pX3tMTMyxjHPmzGHYsGG8+OKLXHjhhUydOvW4dfv06cPcuXOpXbs2PXv2ZPHixeTn5x93/s4//3y++OILioqKyM3N5ZtvvgG8QvX666/npZde4sknn2Tw4MGnzRaO1KImEgU+fOEP7N27l5v69KT+xpUU+R0oyv17/mIA7hkxxOck0e3ugX1Ysmkz48aN47LLLiM+PrI/skq6PmNjY8nNzeXBBx+kZs2ap9ymRo0aJCUlcc8995CUlES3bt2OG3/avHlzatWqxf33309CQgINGzZkz549x+0jJSWFG264gbFjx1JYWEjTpk3p37//seWFhYW8+uqrNGnS5FiLX+fOnbn77ruP209WVhaPPPIIhw4dYuzYscTFxfGzn/2MJ554gpiYGJKSknjsscfYuhlNZGYAACAASURBVHXrKV9T/fr1yc/P5+9//zt9+/bl2WefpVatWiQkJPDoo48et27jxo3Jy8uja9euJCUlERcXR69ex99nt3Xr1vTv358HHniARo0aHWsNvO2223juueeYOnUqhw8fPuUFDuEsJpoufw5SfGKzbmpqaqlNvVI5dH5D53TnNjs7m9tvvpn4uDjeGXMvdRJP/YtfjpeSnEJ2TnaFthk3fTagQq08zuT8Bntl2mymrFrLmDFjuOaaayoxWeSryt+76enpxwbuVxdVeX4DrZil9u+r61Mkwr377rsczsvjtn69VaRJ1Lm932XUqlWLd955h8OHD/sdR6TKqVATiWA7duxgypQpNKufzFXdLvE7jsj/b+/Ow6OqzgeOfycBkhBCEkEgILJviiCCArKrKCpFCvLqz4qi4NqC1WqLC1atihuoiFarIFah+lZFKyCKgMheVHYQCgKyL0KCIQvZfn+cGxwgC4QkdxLez/PMk8zd5r1n7sx955xz7yl28VWiERESExP54IMP/A7ntNWrV6/TqjYtlFiiZkwZ9vrrr5OZmcngS7tSMTzc73CMKREDBgygWrVqqKrvd/A3prRZomZMGbV06VLmz59Py5Yt6XpOM7/DMabEREVFMWTIEA4fPsxbb73ldzjGlCpL1Iwpg7Kysnj11VcJBAL8/ve/Lxf3mCpLurduSffWLf0O47Ry2WWX0axZM2bNmsXq1av9DseYUlO2r3U2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\n", "text/plain": [ "<matplotlib.figure.Figure at 0x10caf60b8>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(10, 5))\n", "# Plot points distribution\n", "data = hca['pts']\n", "ax = sns.distplot(data, bins=get_bins(data), kde=False, fit=stats.norm, ax=ax)\n", "ax.set_xlabel('Avg. Home Points - Avg. Away Points, by Matchup and Season')\n", "ax.set_ylabel('Frequency')\n", "ax.set_title('Home Court Impact on Points Scored')\n", "ax.text(x=35, y=0.008, s='Bins are 2 points wide')\n", "ax.axvline(x=data.mean(), linestyle='--', alpha=0.5, color='black')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The plot shows that a normal distribution fits the aggregated data relatively well. Nothing really stands out from the plot. Even so, the average impact of 3.1 points looks relatively small compared to the noisiness of the data.\n", "\n", "#### Better Shooting Isn't the Whole Story\n", "\n", "It's hard to pinpoint exactly how home court advantage translates into superior scoring. Field goal percentage goes up by about 1.2% on average, and three-point shooting percentage goes up by about 0.9% on average.\n", "\n", "These modest improvements in scoring percentage are pointing in the right direction, but aren't sufficient to clearly explain the magnitude of NBA home court advantage.\n", "\n", "#### Other Statistics\n", "\n", "If you look at the other statistics, you will see that rebounding improves, _and_ assists improve, _and_ turnovers improve, _and_ steals improve, _and_ blocks improve, _and_ personal fouls called against the team improve. Of course, you wouldn't expect statistics like blocks and personal fouls to directly benefit scoring.\n", "\n", "The overall message is: teams really do play better at home, and the benefit shows up in a lot of statistics. We will have to dig deeper in future analysis to try to understand better what is going on.\n", "\n", "#### Box Score Variation by Team\n", "\n", "To conclude, let's look at how these same statistics vary by team, aggregated over the course of the 21 complete regular seasons." ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "cols = ['pts', 'fg_pct', 'fg3_pct', 'ft_pct',] + other_cols" ] }, { "cell_type": "code", "execution_count": 40, "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>pts</th>\n", " <th>fg_pct</th>\n", " <th>fg3_pct</th>\n", " <th>ft_pct</th>\n", " <th>oreb</th>\n", " <th>dreb</th>\n", " <th>ast</th>\n", " <th>tov</th>\n", " <th>stl</th>\n", " <th>blk</th>\n", " <th>pf</th>\n", " </tr>\n", " <tr>\n", " <th>team</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></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>DEN</th>\n", " <td>4.579</td>\n", " <td>0.992</td>\n", " <td>1.410</td>\n", " <td>-0.086</td>\n", " <td>0.199</td>\n", " <td>1.757</td>\n", " <td>3.591</td>\n", " <td>-0.775</td>\n", " <td>-0.114</td>\n", " <td>1.839</td>\n", " <td>0.169</td>\n", " </tr>\n", " <tr>\n", " <th>ATL</th>\n", " <td>4.186</td>\n", " <td>1.738</td>\n", " <td>0.709</td>\n", " <td>-0.024</td>\n", " <td>0.502</td>\n", " <td>0.786</td>\n", " <td>1.946</td>\n", " <td>-0.573</td>\n", " <td>-0.066</td>\n", " <td>-0.248</td>\n", " <td>-0.134</td>\n", " </tr>\n", " <tr>\n", " <th>WAS</th>\n", " <td>4.140</td>\n", " <td>1.681</td>\n", " <td>1.037</td>\n", " <td>1.774</td>\n", " <td>0.296</td>\n", " <td>0.498</td>\n", " <td>1.411</td>\n", " <td>-0.436</td>\n", " <td>0.376</td>\n", " <td>0.363</td>\n", " <td>-0.669</td>\n", " </tr>\n", " <tr>\n", " <th>SAC</th>\n", " <td>4.138</td>\n", " <td>1.372</td>\n", " <td>1.734</td>\n", " <td>-0.042</td>\n", " <td>0.532</td>\n", " <td>1.070</td>\n", " <td>0.226</td>\n", " <td>-0.245</td>\n", " <td>-0.182</td>\n", " <td>0.312</td>\n", " <td>-0.269</td>\n", " </tr>\n", " <tr>\n", " <th>GSW</th>\n", " <td>4.066</td>\n", " <td>1.959</td>\n", " <td>0.966</td>\n", " <td>-0.138</td>\n", " <td>0.787</td>\n", " <td>1.279</td>\n", " <td>3.084</td>\n", " <td>-0.202</td>\n", " <td>0.143</td>\n", " <td>0.441</td>\n", " <td>-0.482</td>\n", " </tr>\n", " <tr>\n", " <th>POR</th>\n", " <td>4.039</td>\n", " <td>1.505</td>\n", " <td>0.987</td>\n", " <td>0.097</td>\n", " <td>0.590</td>\n", " <td>0.708</td>\n", " <td>2.206</td>\n", " <td>-0.418</td>\n", " <td>0.218</td>\n", " <td>-0.290</td>\n", " <td>-0.770</td>\n", " </tr>\n", " <tr>\n", " <th>DAL</th>\n", " <td>3.724</td>\n", " <td>1.120</td>\n", " <td>1.302</td>\n", " <td>0.179</td>\n", " <td>0.986</td>\n", " <td>1.367</td>\n", " <td>0.669</td>\n", " <td>-0.125</td>\n", " <td>0.341</td>\n", " <td>0.641</td>\n", " <td>-0.291</td>\n", " </tr>\n", " <tr>\n", " <th>MIA</th>\n", " <td>3.723</td>\n", " <td>1.732</td>\n", " <td>0.311</td>\n", " <td>0.657</td>\n", " <td>-0.218</td>\n", " <td>0.195</td>\n", " <td>-0.720</td>\n", " <td>-0.673</td>\n", " <td>0.439</td>\n", " <td>0.285</td>\n", " <td>-0.801</td>\n", " </tr>\n", " <tr>\n", " <th>UTA</th>\n", " <td>3.516</td>\n", " <td>1.658</td>\n", " <td>2.340</td>\n", " <td>0.138</td>\n", " <td>-0.404</td>\n", " <td>1.859</td>\n", " <td>0.364</td>\n", " <td>-0.846</td>\n", " <td>0.101</td>\n", " <td>1.130</td>\n", " <td>-0.605</td>\n", " </tr>\n", " <tr>\n", " <th>CLE</th>\n", " <td>3.513</td>\n", " <td>1.337</td>\n", " <td>2.518</td>\n", " <td>1.683</td>\n", " <td>0.396</td>\n", " <td>1.378</td>\n", " <td>3.727</td>\n", " <td>-0.307</td>\n", " <td>-0.149</td>\n", " <td>1.323</td>\n", " <td>-1.041</td>\n", " </tr>\n", " <tr>\n", " <th>ORL</th>\n", " <td>3.487</td>\n", " <td>1.425</td>\n", " <td>-0.033</td>\n", " <td>0.107</td>\n", " <td>0.679</td>\n", " <td>0.842</td>\n", " <td>0.436</td>\n", " <td>0.113</td>\n", " <td>0.208</td>\n", " <td>0.323</td>\n", " <td>-0.610</td>\n", " </tr>\n", " <tr>\n", " <th>LAL</th>\n", " <td>3.430</td>\n", " <td>1.059</td>\n", " <td>-0.213</td>\n", " <td>-0.470</td>\n", " <td>0.713</td>\n", " <td>1.477</td>\n", " <td>2.883</td>\n", " <td>0.190</td>\n", " <td>0.109</td>\n", " <td>0.846</td>\n", " <td>0.002</td>\n", " </tr>\n", " <tr>\n", " <th>SAS</th>\n", " <td>3.416</td>\n", " <td>1.814</td>\n", " <td>1.427</td>\n", " <td>-0.810</td>\n", " <td>0.016</td>\n", " <td>1.271</td>\n", " <td>1.815</td>\n", " <td>0.093</td>\n", " <td>0.374</td>\n", " <td>1.114</td>\n", " <td>-0.613</td>\n", " </tr>\n", " <tr>\n", " <th>IND</th>\n", " <td>3.357</td>\n", " <td>1.083</td>\n", " <td>1.584</td>\n", " <td>0.687</td>\n", " <td>0.839</td>\n", " <td>1.648</td>\n", " <td>1.062</td>\n", " <td>-1.061</td>\n", " <td>0.049</td>\n", " <td>1.018</td>\n", " <td>-1.107</td>\n", " </tr>\n", " <tr>\n", " <th>CHA</th>\n", " <td>3.268</td>\n", " <td>0.681</td>\n", " <td>1.074</td>\n", " <td>0.196</td>\n", " <td>0.436</td>\n", " <td>1.000</td>\n", " <td>1.697</td>\n", " <td>-0.850</td>\n", " <td>-0.130</td>\n", " <td>1.604</td>\n", " <td>-0.014</td>\n", " </tr>\n", " <tr>\n", " <th>PHX</th>\n", " <td>3.255</td>\n", " <td>1.215</td>\n", " <td>1.239</td>\n", " <td>0.999</td>\n", " <td>0.231</td>\n", " <td>1.074</td>\n", " <td>0.345</td>\n", " <td>-0.475</td>\n", " <td>-0.072</td>\n", " <td>0.701</td>\n", " <td>-0.614</td>\n", " </tr>\n", " <tr>\n", " <th>MIL</th>\n", " <td>3.194</td>\n", " <td>1.451</td>\n", " <td>1.261</td>\n", " <td>0.547</td>\n", " <td>0.465</td>\n", " <td>0.350</td>\n", " <td>2.293</td>\n", " <td>-0.406</td>\n", " <td>0.140</td>\n", " <td>0.078</td>\n", " <td>-0.826</td>\n", " </tr>\n", " <tr>\n", " <th>NOP</th>\n", " <td>3.111</td>\n", " <td>1.630</td>\n", " <td>0.815</td>\n", " <td>-0.402</td>\n", " <td>0.348</td>\n", " <td>0.650</td>\n", " <td>3.207</td>\n", " <td>-0.436</td>\n", " <td>0.501</td>\n", " <td>0.856</td>\n", " <td>-0.669</td>\n", " </tr>\n", " <tr>\n", " <th>DET</th>\n", " <td>3.065</td>\n", " <td>1.138</td>\n", " <td>0.561</td>\n", " <td>0.814</td>\n", " <td>0.211</td>\n", " <td>1.131</td>\n", " <td>1.867</td>\n", " <td>0.076</td>\n", " <td>0.011</td>\n", " <td>0.766</td>\n", " <td>-0.262</td>\n", " </tr>\n", " <tr>\n", " <th>NYK</th>\n", " <td>2.928</td>\n", " <td>1.218</td>\n", " <td>-0.045</td>\n", " <td>0.583</td>\n", " <td>0.467</td>\n", " <td>0.426</td>\n", " <td>-0.047</td>\n", " <td>-0.329</td>\n", " <td>0.153</td>\n", " <td>-0.324</td>\n", " <td>-0.606</td>\n", " </tr>\n", " <tr>\n", " <th>MEM</th>\n", " <td>2.863</td>\n", " <td>1.240</td>\n", " <td>1.068</td>\n", " <td>0.470</td>\n", " <td>0.367</td>\n", " <td>1.322</td>\n", " <td>0.604</td>\n", " <td>-0.261</td>\n", " <td>-0.051</td>\n", " <td>1.133</td>\n", " <td>-0.514</td>\n", " </tr>\n", " <tr>\n", " <th>BKN</th>\n", " <td>2.755</td>\n", " <td>0.861</td>\n", " <td>1.134</td>\n", " <td>0.969</td>\n", " <td>0.977</td>\n", " <td>1.077</td>\n", " <td>1.522</td>\n", " <td>0.247</td>\n", " <td>0.005</td>\n", " <td>0.469</td>\n", " <td>-0.163</td>\n", " </tr>\n", " <tr>\n", " <th>OKC</th>\n", " <td>2.625</td>\n", " <td>1.389</td>\n", " <td>1.332</td>\n", " <td>0.717</td>\n", " <td>-0.230</td>\n", " <td>0.571</td>\n", " <td>1.424</td>\n", " <td>-0.221</td>\n", " <td>0.666</td>\n", " <td>0.620</td>\n", " <td>-0.363</td>\n", " </tr>\n", " <tr>\n", " <th>TOR</th>\n", " <td>2.367</td>\n", " <td>0.999</td>\n", " <td>1.353</td>\n", " <td>1.009</td>\n", " <td>0.388</td>\n", " <td>0.781</td>\n", " <td>1.962</td>\n", " <td>-0.496</td>\n", " <td>-0.030</td>\n", " <td>1.062</td>\n", " <td>-0.826</td>\n", " </tr>\n", " <tr>\n", " <th>LAC</th>\n", " <td>2.071</td>\n", " <td>1.307</td>\n", " <td>-0.532</td>\n", " <td>0.261</td>\n", " <td>-0.235</td>\n", " <td>0.840</td>\n", " <td>1.886</td>\n", " <td>-0.010</td>\n", " <td>0.171</td>\n", " <td>1.016</td>\n", " <td>-0.265</td>\n", " </tr>\n", " <tr>\n", " <th>PHI</th>\n", " <td>1.938</td>\n", " <td>0.956</td>\n", " <td>0.707</td>\n", " <td>0.630</td>\n", " <td>0.088</td>\n", " <td>0.995</td>\n", " <td>2.240</td>\n", " <td>-0.226</td>\n", " <td>0.156</td>\n", " <td>-0.069</td>\n", " <td>-0.241</td>\n", " </tr>\n", " <tr>\n", " <th>HOU</th>\n", " <td>1.853</td>\n", " <td>0.607</td>\n", " <td>-0.689</td>\n", " <td>-1.130</td>\n", " <td>0.615</td>\n", " <td>1.486</td>\n", " <td>1.536</td>\n", " <td>-0.660</td>\n", " <td>-0.017</td>\n", " <td>0.628</td>\n", " <td>-1.100</td>\n", " </tr>\n", " <tr>\n", " <th>MIN</th>\n", " <td>1.556</td>\n", " <td>0.700</td>\n", " <td>-0.289</td>\n", " <td>-1.344</td>\n", " <td>-0.257</td>\n", " <td>1.430</td>\n", " <td>2.112</td>\n", " <td>-0.997</td>\n", " <td>-0.173</td>\n", " <td>0.525</td>\n", " <td>-0.498</td>\n", " </tr>\n", " <tr>\n", " <th>CHI</th>\n", " <td>1.545</td>\n", " <td>-0.094</td>\n", " <td>0.647</td>\n", " <td>0.194</td>\n", " <td>0.983</td>\n", " <td>1.456</td>\n", " <td>2.462</td>\n", " <td>-0.909</td>\n", " <td>0.227</td>\n", " <td>0.991</td>\n", " <td>-0.392</td>\n", " </tr>\n", " <tr>\n", " <th>BOS</th>\n", " <td>1.314</td>\n", " <td>0.789</td>\n", " <td>0.855</td>\n", " <td>0.059</td>\n", " <td>0.463</td>\n", " <td>0.964</td>\n", " <td>2.168</td>\n", " <td>-0.157</td>\n", " <td>0.084</td>\n", " <td>0.367</td>\n", " <td>-1.194</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " pts fg_pct fg3_pct ft_pct oreb dreb ast tov stl blk \\\n", "team \n", "DEN 4.579 0.992 1.410 -0.086 0.199 1.757 3.591 -0.775 -0.114 1.839 \n", "ATL 4.186 1.738 0.709 -0.024 0.502 0.786 1.946 -0.573 -0.066 -0.248 \n", "WAS 4.140 1.681 1.037 1.774 0.296 0.498 1.411 -0.436 0.376 0.363 \n", "SAC 4.138 1.372 1.734 -0.042 0.532 1.070 0.226 -0.245 -0.182 0.312 \n", "GSW 4.066 1.959 0.966 -0.138 0.787 1.279 3.084 -0.202 0.143 0.441 \n", "POR 4.039 1.505 0.987 0.097 0.590 0.708 2.206 -0.418 0.218 -0.290 \n", "DAL 3.724 1.120 1.302 0.179 0.986 1.367 0.669 -0.125 0.341 0.641 \n", "MIA 3.723 1.732 0.311 0.657 -0.218 0.195 -0.720 -0.673 0.439 0.285 \n", "UTA 3.516 1.658 2.340 0.138 -0.404 1.859 0.364 -0.846 0.101 1.130 \n", "CLE 3.513 1.337 2.518 1.683 0.396 1.378 3.727 -0.307 -0.149 1.323 \n", "ORL 3.487 1.425 -0.033 0.107 0.679 0.842 0.436 0.113 0.208 0.323 \n", "LAL 3.430 1.059 -0.213 -0.470 0.713 1.477 2.883 0.190 0.109 0.846 \n", "SAS 3.416 1.814 1.427 -0.810 0.016 1.271 1.815 0.093 0.374 1.114 \n", "IND 3.357 1.083 1.584 0.687 0.839 1.648 1.062 -1.061 0.049 1.018 \n", "CHA 3.268 0.681 1.074 0.196 0.436 1.000 1.697 -0.850 -0.130 1.604 \n", "PHX 3.255 1.215 1.239 0.999 0.231 1.074 0.345 -0.475 -0.072 0.701 \n", "MIL 3.194 1.451 1.261 0.547 0.465 0.350 2.293 -0.406 0.140 0.078 \n", "NOP 3.111 1.630 0.815 -0.402 0.348 0.650 3.207 -0.436 0.501 0.856 \n", "DET 3.065 1.138 0.561 0.814 0.211 1.131 1.867 0.076 0.011 0.766 \n", "NYK 2.928 1.218 -0.045 0.583 0.467 0.426 -0.047 -0.329 0.153 -0.324 \n", "MEM 2.863 1.240 1.068 0.470 0.367 1.322 0.604 -0.261 -0.051 1.133 \n", "BKN 2.755 0.861 1.134 0.969 0.977 1.077 1.522 0.247 0.005 0.469 \n", "OKC 2.625 1.389 1.332 0.717 -0.230 0.571 1.424 -0.221 0.666 0.620 \n", "TOR 2.367 0.999 1.353 1.009 0.388 0.781 1.962 -0.496 -0.030 1.062 \n", "LAC 2.071 1.307 -0.532 0.261 -0.235 0.840 1.886 -0.010 0.171 1.016 \n", "PHI 1.938 0.956 0.707 0.630 0.088 0.995 2.240 -0.226 0.156 -0.069 \n", "HOU 1.853 0.607 -0.689 -1.130 0.615 1.486 1.536 -0.660 -0.017 0.628 \n", "MIN 1.556 0.700 -0.289 -1.344 -0.257 1.430 2.112 -0.997 -0.173 0.525 \n", "CHI 1.545 -0.094 0.647 0.194 0.983 1.456 2.462 -0.909 0.227 0.991 \n", "BOS 1.314 0.789 0.855 0.059 0.463 0.964 2.168 -0.157 0.084 0.367 \n", "\n", " pf \n", "team \n", "DEN 0.169 \n", "ATL -0.134 \n", "WAS -0.669 \n", "SAC -0.269 \n", "GSW -0.482 \n", "POR -0.770 \n", "DAL -0.291 \n", "MIA -0.801 \n", "UTA -0.605 \n", "CLE -1.041 \n", "ORL -0.610 \n", "LAL 0.002 \n", "SAS -0.613 \n", "IND -1.107 \n", "CHA -0.014 \n", "PHX -0.614 \n", "MIL -0.826 \n", "NOP -0.669 \n", "DET -0.262 \n", "NYK -0.606 \n", "MEM -0.514 \n", "BKN -0.163 \n", "OKC -0.363 \n", "TOR -0.826 \n", "LAC -0.265 \n", "PHI -0.241 \n", "HOU -1.100 \n", "MIN -0.498 \n", "CHI -0.392 \n", "BOS -1.194 " ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hca.groupby('team')[cols].mean().sort_values(by='pts', ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this table, we are sorting by average point differential (home versus away), grouped by season and matchup. In this ordering, Denver is still on top, but teams such as Utah and Cleveland are further down the list than in our [prior analysis](https://nbviewer.jupyter.org/github/practicallypredictable/posts/blob/master/notebooks/nba_home_court-part3.ipynb).\n", "\n", "This table also makes clear that the impact of home court on particular statistics appears to vary significantly by team. For example, the Nuggets, the Jazz and the Pacers show a relatively large drop in turnovers, while the Warriors and the Spurs show a relatively large increase in shooting efficiency." ] }, { "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 }