Add files via upload
This commit is contained in:
1 parent
3fc0e1049c
commit
ee63dfde2f
1 file changed
+325
-257
+325
-257
@@ -4,32 +4,43 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div align=\"right\">Peter Norvig</div>\n",
|
||||
"\n",
|
||||
"# WWW: Who Will Win?\n",
|
||||
"\n",
|
||||
"This is a notebook for reasoning about who will win playoff series in basketball (and could be used for other sports). I cover the following seasons:\n",
|
||||
"\n",
|
||||
"* [2018](#2018-Playoffs) *The major discussion of the code is here.*\n",
|
||||
"* [2019](#2019-Playoffs) *Will be updated as the playoffs progress.*\n",
|
||||
"* [2016](#Historical-Relic:-2016-NBA-Playoffs) *Ancient history; sad saga.*\n",
|
||||
"\n",
|
||||
"---\n",
|
||||
"\n",
|
||||
"# 2018 Playoffs\n",
|
||||
"\n",
|
||||
"## 12 April, 2018\n",
|
||||
"\n",
|
||||
"\"It's tough to make predictions, especially [about](https://en.wikiquote.org/wiki/Yogi_Berra) [the](https://en.wikiquote.org/wiki/Niels_Bohr) future.\" That's true for the **NBA basketball playoffs**, where there is a wide range of opinion about the Warriors and Cavs, the teams that met in the finals each of the last three years. The Las Vegas oddsmakers have the Warriors as co-favorites at 35% chance to win the title, while [538](https://fivethirtyeight.com/features/the-nba-playoffs-sleepers-favorites-and-best-first-round-matchups/), using their ELO rating, give the Warriors only a 4% chance. That 9-fold difference underscores that rational people can use different models with different assumptions and come to different conclusions. One important way that models can vary is in their level of abstraction, or level of detail that they cover. Are we better using a general impression, or using specific low-lwvel statistics and aggregating them? Here are some models you might choose:\n",
|
||||
"\"It's tough to make predictions, especially [about](https://en.wikiquote.org/wiki/Yogi_Berra) [the](https://en.wikiquote.org/wiki/Niels_Bohr) future.\" That's true for the **NBA basketball playoffs**, where there is a wide range of opinion about the Warriors and Cavs, the teams that met in the finals each of the last three years. The Las Vegas oddsmakers have the Warriors as co-favorites at 35% chance to win the title, while [538](https://fivethirtyeight.com/features/the-nba-playoffs-sleepers-favorites-and-best-first-round-matchups/), using their ELO rating, give the Warriors only a 4% chance. That 9-fold difference underscores that rational people can use different models with different assumptions and come to different conclusions. Here are some models you might choose:\n",
|
||||
"\n",
|
||||
"1. **Holistic**: I just feel that the Warriors have about a 1 in 5 chance of winning it all.\n",
|
||||
"2. **Game by Game**: I think the Warriors have an 75% chance of winning each game in the first round, then 65% for each game in the second round, but only 45% against the Rockets, then 55% if they make it to the finals. From that I'll calculate their overall chance.\n",
|
||||
"3. **Point by Point**: The Warriors have a per-game average point differential of +5.8; I'll compare that to the other teams and caclulate their overall chance.\n",
|
||||
"3. **Point by Point**: The Warriors have a per-game average point differential of +5.79; I'll compare that to the other teams and caclulate their overall chance.\n",
|
||||
"4. **Play by Play**: Use [detailed statistics](https://www.basketball-reference.com/play-index/plus/shot_finder.cgi) to [model](https://danvatterott.com/blog/2016/06/16/creating-videos-of-nba-action-with-sportsvu-data/) the game shot-by-shot, or even pass-by-pass. That's too complex for me.\n",
|
||||
"\n",
|
||||
"# Point by Point Model\n",
|
||||
"\n",
|
||||
"The [Simple Rating System](https://www.sportingcharts.com/dictionary/nba/simple-rating-system-statistics.aspx) (SRS) records the average point differential of a team over the season, with a slight adjustment for strength of schedule. We can look up the winning percentage and SRS of the top contending teams [here](https://www.basketball-reference.com/leagues/NBA_2018.html) (and other sites have slightly different ways of making similar calculations): \n",
|
||||
"The [Simple Rating System](https://www.sportingcharts.com/dictionary/nba/simple-rating-system-statistics.aspx) (SRS) records the average point differential of a team over the season, with a slight adjustment for strength of schedule. We can look up all sorts of statistics, including SRS, of teams at [basketball-refernce.com](https://www.basketball-reference.com/leagues/NBA_2018.html) (and other sites have slightly different ways of making similar calculations); for example:\n",
|
||||
"\n",
|
||||
" TEAM PCT SRS\n",
|
||||
" Rockets .793 8.2\n",
|
||||
" Raptors .720 7.3\n",
|
||||
" Warriors .707 5.8\n",
|
||||
" Sixers .634 4.3\n",
|
||||
" \n",
|
||||
" Rockets .793 8.21\n",
|
||||
" Raptors .720 7.29\n",
|
||||
" Warriors .707 5.79\n",
|
||||
" Sixers .634 4.30\n",
|
||||
"\n",
|
||||
"The Point-by-Point model says: a game is decided by a random sample from the distribution of point differentials, which is a normal (Gaussian) distribution centered around the difference of SRS scores of the two teams. So, if the Raptors play the Sixers, then the\n",
|
||||
"mean of this distribution is 7.3 - 4.3 = 3.0. We also need to know the standard deviation of the distribution; [Betlabs](https://www.betlabssports.com/blog/a-look-at-nba-team-totals/) says it\n",
|
||||
"mean of this distribution is 7.29 - 4.30 = 2.99. We also need to know the standard deviation of the distribution; [Betlabs](https://www.betlabssports.com/blog/a-look-at-nba-team-totals/) says it\n",
|
||||
"is 10.5 points across the NBA (and they confirm that scores roughly follow a normal distribution). \n",
|
||||
"The function `simulate` does the calculation by Monte Carlo simulation:"
|
||||
"The function `simulate_srs` does the calculation by Monte Carlo simulation:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -42,30 +53,41 @@
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"from statistics import mean\n",
|
||||
"from random import gauss\n",
|
||||
"\n",
|
||||
"def simulate(diff, 𝝈=10.5, n=100000):\n",
|
||||
" \"Given SRS point differential of a team against another, return game win probability.\"\n",
|
||||
" return mean(gauss(diff, 𝝈) > 0 for game in range(n))"
|
||||
"from collections import Counter"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"SRS = dict(Raptors=7.29, Celtics=3.23, Sixers=4.30, Cavs=0.59, Rockets=8.21, Warriors=5.79, \n",
|
||||
" Blazers=2.60, Thunder=3.42, Jazz=4.47, Spurs=2.89, Wolves=2.35)\n",
|
||||
"\n",
|
||||
"def simulate_srs(diff, 𝝈=10.5, n=100000):\n",
|
||||
" \"Given SRS point differential of a team against another, return game win probability.\"\n",
|
||||
" return mean(gauss(diff, 𝝈) > 0 for game in range(n))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"0.61325"
|
||||
"0.61074"
|
||||
]
|
||||
},
|
||||
"execution_count": 2,
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"simulate(7.3 - 4.3) # Raptors game win probability vs Sixers"
|
||||
"simulate_srs(SRS['Raptors'] - SRS['Sixers'])"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -90,7 +112,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -112,7 +134,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -121,7 +143,7 @@
|
||||
"text": [
|
||||
"0 point differential = 50% win game = 50% win series\n",
|
||||
"1 point differential = 54% win game = 58% win series\n",
|
||||
"2 point differential = 58% win game = 67% win series\n",
|
||||
"2 point differential = 58% win game = 66% win series\n",
|
||||
"3 point differential = 61% win game = 73% win series\n",
|
||||
"4 point differential = 65% win game = 80% win series\n",
|
||||
"5 point differential = 68% win game = 85% win series\n",
|
||||
@@ -134,7 +156,7 @@
|
||||
],
|
||||
"source": [
|
||||
"for diff in range(10):\n",
|
||||
" g = simulate(diff)\n",
|
||||
" g = simulate_srs(diff)\n",
|
||||
" print('{} point differential = {:4.0%} win game = {:4.0%} win series'.format(\n",
|
||||
" diff, g, win_series(g)))"
|
||||
]
|
||||
@@ -150,7 +172,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -208,39 +230,15 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"diff = [d/10 for d in range(100)]\n",
|
||||
"game = [simulate(d) for d in diff]\n",
|
||||
"game = [simulate_srs(d) for d in diff]\n",
|
||||
"series = [win_series(p) for p in game]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x10c059ac8>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"plt.plot(diff, series, label='Series Win')\n",
|
||||
"plt.plot(diff, game, label='Game Win')\n",
|
||||
"plt.legend(loc='best');\n",
|
||||
"plt.grid()\n",
|
||||
"plt.title('Point Differential vs. Win Percentage');"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
@@ -248,20 +246,47 @@
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x10e433828>"
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"P = [p/100 for p in range(100)]\n",
|
||||
"plt.plot(P, [win_series(p) for p in P])\n",
|
||||
"plt.plot(diff, [100*s for s in series], label='Series Win')\n",
|
||||
"plt.plot(diff, [100*g for g in game], label='Game Win')\n",
|
||||
"plt.legend(loc='best'); plt.grid()\n",
|
||||
"plt.xlabel('Point Differential'); plt.ylabel('Win Percentage');"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"P = range(100)\n",
|
||||
"plt.plot(P, [100*win_series(p/100) for p in P])\n",
|
||||
"plt.grid()\n",
|
||||
"plt.title('Game Win Percentage vs. Series Win Percentage');"
|
||||
"plt.xlabel('Game Win Percentage'); plt.ylabel('Series Win Percentage');"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -270,45 +295,47 @@
|
||||
"source": [
|
||||
"# Series by Series Model\n",
|
||||
"\n",
|
||||
"Here's a function to tabulate a team's chance of winning each series on the way to a title. The first argument is the team's name, and each following argument is a playoff round entry, consisting of the opponent team name, the game win percentage against this opponent, and optionally the wins and losses in the series so far:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def playoffs(name, *rounds):\n",
|
||||
" \"Print probability for team winning each series.\"\n",
|
||||
" overall = 1.0 \n",
|
||||
" for (opponent, p, *WL) in rounds:\n",
|
||||
" this_round = win_series(p, *WL)\n",
|
||||
" overall *= this_round\n",
|
||||
" print('{} vs {:8} {}; through here: {}'\n",
|
||||
" .format(name, opponent, pct(this_round), pct(overall)))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Here my holistic game estimates are turned into overall predictions:"
|
||||
"Here's a function, `playoffs`, to tabulate a team's chance of winning each series on the way to a title. I do two calculations, one based on my subjective probability of the team winning a single game, and one based on the SRS differential. The first argument to `playoffs` is the team's name, and each following argument is a playoff round entry, consisting of the opponent team name, the game win percentage against this opponent, and optionally the wins and losses in the series so far."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def playoffs(team, *rounds):\n",
|
||||
" \"Print probability for team winning each series (subjective and SRS).\"\n",
|
||||
" all_p = all_srs = 1.0 # Probabilities of winning it all\n",
|
||||
" print('{} {:8} | Subjective Probabilities | SRS Differential'\n",
|
||||
" .format('Team'.ljust(len(team)), 'Opponent'))\n",
|
||||
" for (opponent, p, *WL) in rounds:\n",
|
||||
" p_srs = simulate_srs(SRS[team] - SRS[opponent])\n",
|
||||
" all_p, text_p = update(all_p, p, *WL)\n",
|
||||
" all_srs, text_srs = update(all_srs, p_srs, *WL)\n",
|
||||
" print('{} vs {:8} | {} |{}'.format(team, opponent, text_p, text_srs))\n",
|
||||
" \n",
|
||||
"def update(all_p, p, W=0, L=0):\n",
|
||||
" this_round = win_series(p, W, L)\n",
|
||||
" all_p *= this_round\n",
|
||||
" return all_p, '{} Game;{} Series;{} All'.format(\n",
|
||||
" pct(p), pct(this_round), pct(all_p))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Rockets vs Wolves 93%; through here: 93%\n",
|
||||
"Rockets vs Jazz 87%; through here: 81%\n",
|
||||
"Rockets vs Warriors 61%; through here: 49%\n",
|
||||
"Rockets vs Raptors 71%; through here: 35%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Rockets vs Wolves | 75% Game; 93% Series; 93% All | 71% Game; 89% Series; 89% All\n",
|
||||
"Rockets vs Jazz | 70% Game; 87% Series; 81% All | 64% Game; 78% Series; 70% All\n",
|
||||
"Rockets vs Warriors | 55% Game; 61% Series; 49% All | 59% Game; 69% Series; 48% All\n",
|
||||
"Rockets vs Raptors | 60% Game; 71% Series; 35% All | 54% Game; 58% Series; 28% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -320,19 +347,27 @@
|
||||
" ('Raptors', 0.60))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"So I'm in good agreement with the Vegas oddsmakers about the Rockets: my subjective probabilities have the Rockets at 49% winning the conference and 35% winning the title, while Vegas had them at 44% and 35%. The SRS differential has them at 48% and 27% (because the Raptors did well in that statistic)."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Warriors vs Spurs 93%; through here: 93%\n",
|
||||
"Warriors vs Blazers 80%; through here: 74%\n",
|
||||
"Warriors vs Rockets 39%; through here: 29%\n",
|
||||
"Warriors vs Raptors 61%; through here: 18%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Warriors vs Spurs | 75% Game; 93% Series; 93% All | 61% Game; 73% Series; 73% All\n",
|
||||
"Warriors vs Blazers | 65% Game; 80% Series; 74% All | 62% Game; 75% Series; 54% All\n",
|
||||
"Warriors vs Rockets | 45% Game; 39% Series; 29% All | 41% Game; 31% Series; 17% All\n",
|
||||
"Warriors vs Raptors | 55% Game; 61% Series; 18% All | 44% Game; 38% Series; 6% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -348,115 +383,48 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"So I'm in good agreement with the Vegas oddsmakers about the Rockets: I have the Rockets at 49% winning the conference and 35% winning the title, while Vegas had them at 44% and 35%. For the Warriors I'm splitting the difference between 538's low estimate (8% win conference, 4% win title) and Vegas's high estimate (44% and 35%, tied with the Rockets).\n",
|
||||
"For the Warriors my subjective probabilities are splitting the difference between 538's low estimate (8% win conference, 4% win title) and Vegas's high estimate (44% and 35%, tied with the Rockets); I have them at 29% and 18%. The SRS differntial at 17% and 6% is closer to 538.\n",
|
||||
"\n",
|
||||
"What if I went by point differential?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Rockets vs Wolves 88%; through here: 88%\n",
|
||||
"Rockets vs Jazz 78%; through here: 69%\n",
|
||||
"Rockets vs Warriors 69%; through here: 48%\n",
|
||||
"Rockets vs Raptors 57%; through here: 27%\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"playoffs('Rockets',\n",
|
||||
" ('Wolves', simulate(8.2 - 2.3)),\n",
|
||||
" ('Jazz', simulate(8.2 - 4.5)),\n",
|
||||
" ('Warriors', simulate(8.2 - 5.8)),\n",
|
||||
" ('Raptors', simulate(8.2 - 7.3)))"
|
||||
"How do I reconcile the discrepancy between my subjective probabilities and the SRS numbers? I guess I would say that I have less faith in the point differential model, for several reasons: it counts games from the distant past, when some teams had very different lineups than they have now (due to injuries and trades); different teams have different approaches to how they handle games whose outcome is already decided; the metric puts too much emphasis on blowouts, for example, in the Warriors' final game, it was to their strategic advantage to lose, and they did it very convincingly—by 40 points, which dropped their average point differential for the entire year by 0.5 points.\n",
|
||||
"\n",
|
||||
"# Series Length\n",
|
||||
"\n",
|
||||
"Given a team's game win percentage, how many games should we expect a series to run? For example, for a team with a game win percentage of 60%, how likely is it to sweep all 4 games? To go to 7 games? Here's a chart of the probability of each possible series outcome, based on the win percentage of the first team:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Warriors vs Spurs 73%; through here: 73%\n",
|
||||
"Warriors vs Blazers 75%; through here: 55%\n",
|
||||
"Warriors vs Rockets 31%; through here: 17%\n",
|
||||
"Warriors vs Raptors 37%; through here: 6%\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"playoffs('Warriors',\n",
|
||||
" ('Spurs', simulate(5.8 - 2.9)),\n",
|
||||
" ('Blazers', simulate(5.8 - 2.6)),\n",
|
||||
" ('Rockets', simulate(5.8 - 8.2)),\n",
|
||||
" ('Raptors', simulate(5.8 - 7.3)))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"This model cuts the Rockets' chances a bit (mainly because the Raptors have a strong 7.3 score), and cuts the Warriors' chances a lot, bringing them more in line with the 538 prediction. How do I reconcile the discrepancy between my subjective probabilities and these numbers? I guess I would say that I have less faith in the point differential model, for several reasons: it counts games from the distant past, when some teams had very different lineups than they have now (due to injuries and trades); different teams have different approaches to how they handle games whose outcome is already decided; the metric puts too much emphasis on blowouts, for example, in the Warriors' final game, it was to their strategic advantage to lose, and they did it very convincingly—by 40 points, which dropped their average point differential for the entire year by 0.5 points.\n",
|
||||
"\n",
|
||||
"# Series Length\n",
|
||||
"\n",
|
||||
"Given a team's game win percentage, how many games should we expect a series to run? That is, with a game win percentage of 60%, how likely is it to sweep all 4 games? To go to 7 games? Here's a chart of the probability of each possible series outcome, based on the win percentage of the first team:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import collections\n",
|
||||
"\n",
|
||||
"class MCounter(collections.Counter):\n",
|
||||
" \"A multipliable Counter: you can say `2 * MCounter(stuff)`.\"\n",
|
||||
" def __mul__(self, p): return MCounter({k: p * self[k] for k in self})\n",
|
||||
" __rmul__ = __mul__"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"W-L | Game Win Percentage\n",
|
||||
" | 10% 15% 20% 25% 30% 35% 40% 45% 50% 55% 60% 65% 70% 75% 80% 85% 90%\n",
|
||||
"----+-------------------------------------------------------------------------------------\n",
|
||||
"4-0 | 0% 0% 0% 0% 1% 2% 3% 4% 6% 9% 13% 18% 24% 32% 41% 52% 66%\n",
|
||||
"4-1 | 0% 0% 1% 1% 2% 4% 6% 9% 12% 16% 21% 25% 29% 32% 33% 31% 26%\n",
|
||||
"4-2 | 0% 0% 1% 2% 4% 6% 9% 12% 16% 19% 21% 22% 22% 20% 16% 12% 7%\n",
|
||||
"4-3 | 0% 1% 2% 3% 6% 8% 11% 14% 16% 17% 17% 15% 13% 10% 7% 4% 1%\n",
|
||||
"3-4 | 1% 4% 7% 10% 13% 15% 17% 17% 16% 14% 11% 8% 6% 3% 2% 1% 0%\n",
|
||||
"2-4 | 7% 12% 16% 20% 22% 22% 21% 19% 16% 12% 9% 6% 4% 2% 1% 0% 0%\n",
|
||||
"1-4 | 26% 31% 33% 32% 29% 25% 21% 16% 12% 9% 6% 4% 2% 1% 1% 0% 0%\n",
|
||||
"0-4 | 66% 52% 41% 32% 24% 18% 13% 9% 6% 4% 3% 2% 1% 0% 0% 0% 0%\n"
|
||||
" | 20% 25% 30% 35% 40% 45% 50% 55% 60% 65% 70% 75% 80%\n",
|
||||
"----+-----------------------------------------------------------------\n",
|
||||
"4-0 | 0% 0% 1% 2% 3% 4% 6% 9% 13% 18% 24% 32% 41%\n",
|
||||
"4-1 | 1% 1% 2% 4% 6% 9% 12% 16% 21% 25% 29% 32% 33%\n",
|
||||
"4-2 | 1% 2% 4% 6% 9% 12% 16% 19% 21% 22% 22% 20% 16%\n",
|
||||
"4-3 | 2% 3% 6% 8% 11% 14% 16% 17% 17% 15% 13% 10% 7%\n",
|
||||
"3-4 | 7% 10% 13% 15% 17% 17% 16% 14% 11% 8% 6% 3% 2%\n",
|
||||
"2-4 | 16% 20% 22% 22% 21% 19% 16% 12% 9% 6% 4% 2% 1%\n",
|
||||
"1-4 | 33% 32% 29% 25% 21% 16% 12% 9% 6% 4% 2% 1% 1%\n",
|
||||
"0-4 | 41% 32% 24% 18% 13% 9% 6% 4% 3% 2% 1% 0% 0%\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def series_results(p, W=0, L=0) -> MCounter:\n",
|
||||
"def series_results(p, weight=1, W=0, L=0) -> Counter:\n",
|
||||
" \"\"\"Return {(win, loss): probability} for all possible outcomes of the series.\"\"\"\n",
|
||||
" return MCounter([(W, L)] if W == 4 or L == 4 else\n",
|
||||
" (p * series_results(p, W + 1, L) + \n",
|
||||
" (1 - p) * series_results(p, W, L + 1)))\n",
|
||||
" if W == 4 or L == 4:\n",
|
||||
" return Counter({(W, L): weight})\n",
|
||||
" else:\n",
|
||||
" return (series_results(p, weight * p, W + 1, L) +\n",
|
||||
" series_results(p, weight * (1 - p), W, L+1))\n",
|
||||
" \n",
|
||||
"def series_results_table(pcts=[p/100 for p in range(10, 95, 5)]):\n",
|
||||
"def series_results_table(pcts=[p/100 for p in range(20, 81, 5)]):\n",
|
||||
" outcomes = [(4, 0), (4, 1), (4, 2), (4, 3), (3, 4), (2, 4), (1, 4), (0, 4)]\n",
|
||||
" print('W-L | Game Win Percentage')\n",
|
||||
" print(' | ' + ' '.join(map(pct, pcts)))\n",
|
||||
@@ -472,9 +440,81 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"So we see that our 60% team has a 13% chance of sweeping (4-0), and 13+21+21 = 55% chance of winning in 6 games or less.\n",
|
||||
"Our hypothetical 60% team has a 13% chance of sweeping, and a 13+21+21 = 55% chance of winning in 6 games or less."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"---\n",
|
||||
"# 2019 Playoffs\n",
|
||||
"\n",
|
||||
"**Note:** I had to define `MCounter` because `collections.Counter` does not support multiplication. I think it should: if `C` is a `Counter`, then shouldn't `C + C` be the same as `2 * C`?"
|
||||
"## 12 April, 2019\n",
|
||||
"\n",
|
||||
"Here are my subjective ratings for 2019, for what I consider the two top teams, the Warriors and Bucks:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Warriors vs Clippers | 80% Game; 97% Series; 97% All | 69% Game; 86% Series; 86% All\n",
|
||||
"Warriors vs Rockets | 65% Game; 80% Series; 77% All | 55% Game; 62% Series; 53% All\n",
|
||||
"Warriors vs Nuggets | 70% Game; 87% Series; 68% All | 58% Game; 68% Series; 36% All\n",
|
||||
"Warriors vs Bucks | 52% Game; 54% Series; 37% All | 44% Game; 37% Series; 13% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"SRS = dict(Warriors=6.42, Nuggets=4.19, Rockets=4.96, Clippers=1.09, \n",
|
||||
" Bucks=8.04, Raptors=5.49, Sixers=2.25, Celtics=3.90, Pistons=-0.56)\n",
|
||||
"\n",
|
||||
"playoffs('Warriors',\n",
|
||||
" ('Clippers', 0.80),\n",
|
||||
" ('Rockets', 0.65),\n",
|
||||
" ('Nuggets', 0.70),\n",
|
||||
" ('Bucks', 0.52))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Bucks vs Pistons | 80% Game; 97% Series; 97% All | 79% Game; 96% Series; 96% All\n",
|
||||
"Bucks vs Celtics | 67% Game; 83% Series; 80% All | 65% Game; 81% Series; 78% All\n",
|
||||
"Bucks vs Raptors | 60% Game; 71% Series; 57% All | 59% Game; 70% Series; 54% All\n",
|
||||
"Bucks vs Warriors | 48% Game; 46% Series; 26% All | 56% Game; 63% Series; 34% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"playoffs('Bucks',\n",
|
||||
" ('Pistons', 0.80),\n",
|
||||
" ('Celtics', 0.67),\n",
|
||||
" ('Raptors', 0.60),\n",
|
||||
" ('Warriors', 0.48))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"So, my subjective probabilities favor the Warriors over the bucks, 37% to 26% chances of winning it all. But the SRS scores disagree, favoring the Bucks 34% to 13%.\n",
|
||||
"\n",
|
||||
"I have low confidence in the [SRS ratings](https://www.basketball-reference.com/leagues/NBA_2019.html), because the Warriors seemed like they were coasting for parts of the regular season and are capable of \"flipping the switch\" in the playoffs, and because the Bucks have significant injuries to Brogdon, Mirotic and Gasol, all of whom contributed to the Bucks' great record in the season but will miss parts of the playoffs."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -488,18 +528,8 @@
|
||||
"\n",
|
||||
"## 18 April 2016\n",
|
||||
"\n",
|
||||
"The Golden State Warriors have had a historic basketball season, winning more games than any other team ever has. But will they top that off by winning the championship? There are 15 other teams in contention, including one, the Spurs, that has had a historic season as the best second-best team ever. The web site fivethirtyeight, using a complicated scoring system, [gives](http://projects.fivethirtyeight.com/2016-nba-picks/) the Warriors a 44% chance of winning, with the Spurs at 28%. Basketball-reference [has](http://www.basketball-reference.com/friv/playoff_prob.cgi) the Warriors at 41% and Spurs at 32.5%, while a [betting site](http://www.oddsshark.com/nba/nba-futures) had the Warriors at 54% and Spurs at 18%. \n",
|
||||
" \n",
|
||||
"Here are the top four teams with their stats:\n",
|
||||
"\n",
|
||||
" TEAM PCT SRS\n",
|
||||
" Warriors .890 10.38\n",
|
||||
" Spurs .817 10.28\n",
|
||||
" Thunder .671 7.09\n",
|
||||
" Cavaliers .695 5.45\n",
|
||||
"\n",
|
||||
"I came up with my own subjective game winning percentages, informed by SRS calculations, plus injury status, etc.\n",
|
||||
"# WWW: Will Warriors Win?\n"
|
||||
"The Golden State Warriors have had a historic basketball season, winning more games than any other team ever has. But will they top that off by winning the championship? There are 15 other teams in contention, including one, the Spurs, that has had a historic season as the best second-best team ever. The web site fivethirtyeight, using a complicated scoring system, [gives](http://projects.fivethirtyeight.com/2016-nba-picks/) the Warriors a 44% chance of winning, with the Spurs at 28%. Basketball-reference [has](http://www.basketball-reference.com/friv/playoff_prob.cgi) the Warriors at 41% and Spurs at 32.5%, while a [betting site](http://www.oddsshark.com/nba/nba-futures) had the Warriors at 54% and Spurs at 18%. Here is my analysis:\n",
|
||||
" "
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -513,14 +543,19 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Warriors vs Rockets 98%; through here: 98%\n",
|
||||
"Warriors vs Clippers 91%; through here: 89%\n",
|
||||
"Warriors vs Spurs 67%; through here: 60%\n",
|
||||
"Warriors vs Cavs 83%; through here: 50%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Warriors vs Rockets | 83% Game; 98% Series; 98% All | 83% Game; 98% Series; 98% All\n",
|
||||
"Warriors vs Clippers | 73% Game; 91% Series; 89% All | 72% Game; 90% Series; 88% All\n",
|
||||
"Warriors vs Spurs | 58% Game; 67% Series; 60% All | 50% Game; 50% Series; 45% All\n",
|
||||
"Warriors vs Cavs | 67% Game; 83% Series; 50% All | 68% Game; 85% Series; 38% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"SRS = dict(Warriors=10.38, Spurs=10.28, Thunder=7.09, Cavs=5.45, Raptors=4.08,\n",
|
||||
" Rockets=0.34, Clippers=4.13, Pistons=0.43, Hawks=3.49, Memphis=-2.14,\n",
|
||||
" Blazers=4.43, Dallas=-0.87)\n",
|
||||
"\n",
|
||||
"playoffs('Warriors',\n",
|
||||
" ('Rockets', 0.83),\n",
|
||||
" ('Clippers', 0.73),\n",
|
||||
@@ -537,10 +572,11 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Spurs vs Memphis 98%; through here: 98%\n",
|
||||
"Spurs vs Thunder 75%; through here: 73%\n",
|
||||
"Spurs vs Warriors 33%; through here: 24%\n",
|
||||
"Spurs vs Cavs 83%; through here: 20%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Spurs vs Memphis | 83% Game; 98% Series; 98% All | 88% Game; 99% Series; 99% All\n",
|
||||
"Spurs vs Thunder | 62% Game; 75% Series; 73% All | 62% Game; 75% Series; 74% All\n",
|
||||
"Spurs vs Warriors | 42% Game; 33% Series; 24% All | 50% Game; 50% Series; 37% All\n",
|
||||
"Spurs vs Cavs | 67% Game; 83% Series; 20% All | 68% Game; 85% Series; 31% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -561,10 +597,11 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Cavs vs Pistons 98%; through here: 98%\n",
|
||||
"Cavs vs Hawks 71%; through here: 70%\n",
|
||||
"Cavs vs Raptors 61%; through here: 42%\n",
|
||||
"Cavs vs GSW/SAS 17%; through here: 7%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Cavs vs Pistons | 83% Game; 98% Series; 98% All | 68% Game; 85% Series; 85% All\n",
|
||||
"Cavs vs Hawks | 60% Game; 71% Series; 70% All | 58% Game; 66% Series; 56% All\n",
|
||||
"Cavs vs Raptors | 55% Game; 61% Series; 42% All | 55% Game; 61% Series; 35% All\n",
|
||||
"Cavs vs Warriors | 33% Game; 17% Series; 7% All | 31% Game; 15% Series; 5% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -573,7 +610,7 @@
|
||||
" ('Pistons', 0.83),\n",
|
||||
" ('Hawks', 0.60),\n",
|
||||
" ('Raptors', 0.55),\n",
|
||||
" ('GSW/SAS', 0.33))"
|
||||
" ('Warriors', 0.33))"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -605,10 +642,11 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Warriors vs Rockets 97%; through here: 97%\n",
|
||||
"Warriors vs Blazers 61%; through here: 59%\n",
|
||||
"Warriors vs Spurs 61%; through here: 36%\n",
|
||||
"Warriors vs Cavs 71%; through here: 26%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Warriors vs Rockets | 70% Game; 97% Series; 97% All | 83% Game;100% Series;100% All\n",
|
||||
"Warriors vs Blazers | 55% Game; 61% Series; 59% All | 71% Game; 89% Series; 89% All\n",
|
||||
"Warriors vs Spurs | 55% Game; 61% Series; 36% All | 50% Game; 51% Series; 45% All\n",
|
||||
"Warriors vs Cavs | 60% Game; 71% Series; 26% All | 68% Game; 85% Series; 38% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -636,10 +674,11 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Spurs vs Memphis 100%; through here: 100%\n",
|
||||
"Spurs vs Thunder 75%; through here: 75%\n",
|
||||
"Spurs vs Warriors 39%; through here: 29%\n",
|
||||
"Spurs vs Cavs 83%; through here: 24%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Spurs vs Memphis | 83% Game;100% Series;100% All | 88% Game;100% Series;100% All\n",
|
||||
"Spurs vs Thunder | 62% Game; 75% Series; 75% All | 62% Game; 75% Series; 75% All\n",
|
||||
"Spurs vs Warriors | 45% Game; 39% Series; 29% All | 50% Game; 49% Series; 37% All\n",
|
||||
"Spurs vs Cavs | 67% Game; 83% Series; 24% All | 68% Game; 84% Series; 31% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -660,19 +699,20 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Cavs vs Pistons 100%; through here: 100%\n",
|
||||
"Cavs vs Hawks 71%; through here: 71%\n",
|
||||
"Cavs vs Raptors 61%; through here: 43%\n",
|
||||
"Cavs vs GSW/SAS 29%; through here: 13%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Cavs vs Pistons | 83% Game;100% Series;100% All | 68% Game;100% Series;100% All\n",
|
||||
"Cavs vs Hawks | 60% Game; 71% Series; 71% All | 57% Game; 66% Series; 66% All\n",
|
||||
"Cavs vs Raptors | 55% Game; 61% Series; 43% All | 55% Game; 61% Series; 40% All\n",
|
||||
"Cavs vs Warriors | 40% Game; 29% Series; 13% All | 32% Game; 15% Series; 6% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"playoffs('Cavs',\n",
|
||||
" ('Pistons', 0.83, 4, 0),\n",
|
||||
" ('Hawks', 0.60),\n",
|
||||
" ('Raptors', 0.55),\n",
|
||||
" ('GSW/SAS', 0.40))"
|
||||
" ('Pistons', 0.83, 4, 0),\n",
|
||||
" ('Hawks', 0.60),\n",
|
||||
" ('Raptors', 0.55),\n",
|
||||
" ('Warriors', 0.40))"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -703,10 +743,11 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Warriors vs Rockets 100%; through here: 100%\n",
|
||||
"Warriors vs Blazers 96%; through here: 96%\n",
|
||||
"Warriors vs Spurs 71%; through here: 68%\n",
|
||||
"Warriors vs Cavs 61%; through here: 42%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Warriors vs Rockets | 70% Game;100% Series;100% All | 83% Game;100% Series;100% All\n",
|
||||
"Warriors vs Blazers | 67% Game; 96% Series; 96% All | 71% Game; 98% Series; 98% All\n",
|
||||
"Warriors vs Spurs | 60% Game; 71% Series; 68% All | 50% Game; 51% Series; 50% All\n",
|
||||
"Warriors vs Cavs | 55% Game; 61% Series; 42% All | 68% Game; 85% Series; 42% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -727,10 +768,11 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Spurs vs Memphis 100%; through here: 100%\n",
|
||||
"Spurs vs Thunder 36%; through here: 36%\n",
|
||||
"Spurs vs Warriors 29%; through here: 10%\n",
|
||||
"Spurs vs Cavs 50%; through here: 5%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Spurs vs Memphis | 83% Game;100% Series;100% All | 88% Game;100% Series;100% All\n",
|
||||
"Spurs vs Thunder | 60% Game; 36% Series; 36% All | 62% Game; 39% Series; 39% All\n",
|
||||
"Spurs vs Warriors | 40% Game; 29% Series; 10% All | 50% Game; 50% Series; 19% All\n",
|
||||
"Spurs vs Cavs | 50% Game; 50% Series; 5% All | 68% Game; 84% Series; 16% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -751,10 +793,11 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Thunder vs Dallas 100%; through here: 100%\n",
|
||||
"Thunder vs Spurs 64%; through here: 64%\n",
|
||||
"Thunder vs Warriors 29%; through here: 19%\n",
|
||||
"Thunder vs Cavs 39%; through here: 7%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Thunder vs Dallas | 83% Game;100% Series;100% All | 78% Game;100% Series;100% All\n",
|
||||
"Thunder vs Spurs | 40% Game; 64% Series; 64% All | 38% Game; 62% Series; 62% All\n",
|
||||
"Thunder vs Warriors | 40% Game; 29% Series; 19% All | 38% Game; 25% Series; 15% All\n",
|
||||
"Thunder vs Cavs | 45% Game; 39% Series; 7% All | 56% Game; 64% Series; 10% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -775,10 +818,11 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Cavs vs Pistons 100%; through here: 100%\n",
|
||||
"Cavs vs Hawks 100%; through here: 100%\n",
|
||||
"Cavs vs Raptors 80%; through here: 80%\n",
|
||||
"Cavs vs GS/SA/OK 39%; through here: 31%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Cavs vs Pistons | 83% Game;100% Series;100% All | 68% Game;100% Series;100% All\n",
|
||||
"Cavs vs Hawks | 60% Game;100% Series;100% All | 57% Game;100% Series;100% All\n",
|
||||
"Cavs vs Raptors | 65% Game; 80% Series; 80% All | 55% Game; 61% Series; 61% All\n",
|
||||
"Cavs vs Warriors | 45% Game; 39% Series; 31% All | 32% Game; 15% Series; 9% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -787,7 +831,7 @@
|
||||
" ('Pistons', 0.83, 4, 0),\n",
|
||||
" ('Hawks', 0.60, 4, 0),\n",
|
||||
" ('Raptors', 0.65),\n",
|
||||
" ('GS/SA/OK', 0.45))"
|
||||
" ('Warriors', 0.45))"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -819,10 +863,11 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Warriors vs Rockets 100%; through here: 100%\n",
|
||||
"Warriors vs Blazers 100%; through here: 100%\n",
|
||||
"Warriors vs Thunder 61%; through here: 61%\n",
|
||||
"Warriors vs Cavs 61%; through here: 37%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Warriors vs Rockets | 70% Game;100% Series;100% All | 83% Game;100% Series;100% All\n",
|
||||
"Warriors vs Blazers | 67% Game;100% Series;100% All | 72% Game;100% Series;100% All\n",
|
||||
"Warriors vs Thunder | 63% Game; 61% Series; 61% All | 62% Game; 59% Series; 59% All\n",
|
||||
"Warriors vs Cavs | 55% Game; 61% Series; 37% All | 68% Game; 85% Series; 50% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -854,10 +899,11 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Warriors vs Rockets 100%; through here: 100%\n",
|
||||
"Warriors vs Blazers 100%; through here: 100%\n",
|
||||
"Warriors vs Thunder 17%; through here: 17%\n",
|
||||
"Warriors vs Cavs 61%; through here: 10%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Warriors vs Rockets | 70% Game;100% Series;100% All | 83% Game;100% Series;100% All\n",
|
||||
"Warriors vs Blazers | 67% Game;100% Series;100% All | 71% Game;100% Series;100% All\n",
|
||||
"Warriors vs Thunder | 55% Game; 17% Series; 17% All | 62% Game; 24% Series; 24% All\n",
|
||||
"Warriors vs Cavs | 55% Game; 61% Series; 10% All | 68% Game; 85% Series; 20% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -878,10 +924,11 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Cavs vs Pistons 100%; through here: 100%\n",
|
||||
"Cavs vs Hawks 100%; through here: 100%\n",
|
||||
"Cavs vs Raptors 57%; through here: 57%\n",
|
||||
"Cavs vs Thunder 39%; through here: 23%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Cavs vs Pistons | 83% Game;100% Series;100% All | 68% Game;100% Series;100% All\n",
|
||||
"Cavs vs Hawks | 60% Game;100% Series;100% All | 58% Game;100% Series;100% All\n",
|
||||
"Cavs vs Raptors | 55% Game; 57% Series; 57% All | 55% Game; 58% Series; 58% All\n",
|
||||
"Cavs vs Thunder | 45% Game; 39% Series; 23% All | 44% Game; 36% Series; 21% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -902,10 +949,11 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Thunder vs Dallas 100%; through here: 100%\n",
|
||||
"Thunder vs Spurs 100%; through here: 100%\n",
|
||||
"Thunder vs Warriors 83%; through here: 83%\n",
|
||||
"Thunder vs Cavs 61%; through here: 51%\n"
|
||||
"Team Opponent | Subjective Probabilities | SRS Differential\n",
|
||||
"Thunder vs Dallas | 83% Game;100% Series;100% All | 78% Game;100% Series;100% All\n",
|
||||
"Thunder vs Spurs | 40% Game;100% Series;100% All | 38% Game;100% Series;100% All\n",
|
||||
"Thunder vs Warriors | 45% Game; 83% Series; 83% All | 38% Game; 76% Series; 76% All\n",
|
||||
"Thunder vs Cavs | 55% Game; 61% Series; 51% All | 56% Game; 64% Series; 48% All\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -972,7 +1020,7 @@
|
||||
"source": [
|
||||
"# 20 June 2016 \n",
|
||||
"\n",
|
||||
"Congratulations to LeBron and the Cavs for overcoming long odds to win a championship for Cleveland. My model says the Warriors were at 94% when they were up 3-1, and if you go by point differential, almost 97%:"
|
||||
"Congratulations to LeBron and the Cavs for overcoming long odds to win a championship for Cleveland. My model says the Warriors were at 91% when they were up 3-1, and if you go by point differential, almost 97%:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -983,7 +1031,7 @@
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"0.968211263722248"
|
||||
"0.9088750000000001"
|
||||
]
|
||||
},
|
||||
"execution_count": 31,
|
||||
@@ -992,7 +1040,27 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"win_series(simulate(10.38 - 5.45), W=3, L=1)"
|
||||
"win_series(0.55, W=3, L=1)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 32,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"0.967769703755776"
|
||||
]
|
||||
},
|
||||
"execution_count": 32,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"win_series(simulate_srs(10.38 - 5.45), W=3, L=1)"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -1012,7 +1080,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.5.3"
|
||||
"version": "3.7.2"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
Reference in new issue
Block a user