Predicting the Behavior of the Supreme Court of the United States: A General Approach

Paper Abstract

Building upon developments in theoretical and applied machine learning, as well as the efforts of various scholars including Guimera and Sales-Pardo (2011), Ruger et al. (2004), and Martin et al. (2004), we construct a model designed to predict the voting behavior of the Supreme Court of the United States. Using the extremely randomized tree method first proposed in Geurts, et al. (2006), a method similar to the random forest approach developed in Breiman (2001), as well as novel feature engineering, we predict more than sixty years of decisions by the Supreme Court of the United States (1953-2013). Using only data available prior to the date of decision, our model correctly identifies 69.7% of the Court’s overall affirm/reverse decisions and correctly forecasts 70.9% of the votes of individual justices across 7,700 cases and more than 68,000 justice votes. Our performance is consistent with the general level of prediction offered by prior scholars. However, our model is distinctive as it is the first robust, generalized,and fully predictive model of Supreme Court voting behavior offered to date. Our model predicts six decades of behavior of thirty Justices appointed by thirteen Presidents. With a more sound methodological foundation, our results represent a major advance for the science of quantitative legal prediction and portend a range of other potential applications, such as those described in Katz (2013).

Source Description

The source and data in this repository allow for the reproduction of the results in this paper.

Data Description

The data used in this paper is available from the Supreme Court Database (SCDB).

Version

The latest version of this model was relesed in October 2015.


In [2]:
%matplotlib inline

# Imports
import matplotlib.pyplot as plt
import statsmodels.stats.proportion

# seaborn
import seaborn
seaborn.set()
seaborn.set_style("darkgrid")

# Project imports
from model import *


/home/ubuntu/ve/local/lib/python2.7/site-packages/matplotlib/__init__.py:872: UserWarning: axes.color_cycle is deprecated and replaced with axes.prop_cycle; please use the latter.
  warnings.warn(self.msg_depr % (key, alt_key))

In [42]:
# Load data
data = pandas.read_csv("data/output/model_output_100_20151205221226.csv")

# Merge the vote summary data
vote_data = data.groupby("docketId")["justice_outcome_disposition"].value_counts().unstack().fillna(0).astype(int)
vote_data.columns = ["vote_other", "vote_affirm", "vote_reverse"]
predicted_vote_data = data.groupby("docketId")["rf_predicted"].value_counts().unstack().fillna(0).astype(int)
predicted_vote_data.columns = ["predicted_vote_other", "predicted_vote_affirm", "predicted_vote_reverse"]
data = data.join(vote_data, on="docketId")
data = data.join(predicted_vote_data, on="docketId")

data.head()


Out[42]:
caseId docketId caseIssuesId voteId dateDecision decisionType usCite sctCite ledCite lexisCite ... rf_predicted_case dummy_predicted_case rf_correct_case dummy_correct_case vote_other vote_affirm vote_reverse predicted_vote_other predicted_vote_affirm predicted_vote_reverse
0 1946-001 1946-001-01 1946-001-01-01 1946-001-01-01-01-01 11/18/1946 1 329 U.S. 1 67 S. Ct. 6 91 L. Ed. 3 1946 U.S. LEXIS 1724 ... NaN NaN NaN NaN 0 1 8 NaN NaN NaN
1 1946-001 1946-001-01 1946-001-01-01 1946-001-01-01-01-02 11/18/1946 1 329 U.S. 1 67 S. Ct. 6 91 L. Ed. 3 1946 U.S. LEXIS 1724 ... NaN NaN NaN NaN 0 1 8 NaN NaN NaN
2 1946-001 1946-001-01 1946-001-01-01 1946-001-01-01-01-03 11/18/1946 1 329 U.S. 1 67 S. Ct. 6 91 L. Ed. 3 1946 U.S. LEXIS 1724 ... NaN NaN NaN NaN 0 1 8 NaN NaN NaN
3 1946-001 1946-001-01 1946-001-01-01 1946-001-01-01-01-04 11/18/1946 1 329 U.S. 1 67 S. Ct. 6 91 L. Ed. 3 1946 U.S. LEXIS 1724 ... NaN NaN NaN NaN 0 1 8 NaN NaN NaN
4 1946-001 1946-001-01 1946-001-01-01 1946-001-01-01-01-05 11/18/1946 1 329 U.S. 1 67 S. Ct. 6 91 L. Ed. 3 1946 U.S. LEXIS 1724 ... NaN NaN NaN NaN 0 1 8 NaN NaN NaN

5 rows × 99 columns


In [43]:
# Get case data
case_data = data.loc[:, ["docketId", "caseName", "term", 
                         u'rf_predicted_case', u'dummy_predicted_case', u'rf_correct_case', u'dummy_correct_case',
                        "vote_other", "vote_affirm", "vote_reverse",
                         "predicted_vote_other", "predicted_vote_affirm", "predicted_vote_reverse"
                        ]]\
    .copy().drop_duplicates()
case_data.tail()


Out[43]:
docketId caseName term rf_predicted_case dummy_predicted_case rf_correct_case dummy_correct_case vote_other vote_affirm vote_reverse predicted_vote_other predicted_vote_affirm predicted_vote_reverse
77297 2014-071-01 GLOSSIP v. GROSS 2014 1 1 0 0 0 5 4 0 0 9
77306 2014-072-01 MATA v. LYNCH 2014 1 1 1 1 0 1 8 0 1 8
77315 2014-073-01 WOODS v. DONALD 2014 1 1 1 1 0 0 9 0 0 9
77324 2014-074-01 GRADY v. NORTH CAROLINA 2014 1 1 1 1 0 0 9 0 0 9
77333 2014-075-01 TAYLOR v. BARKES 2014 1 1 1 1 0 0 9 0 0 9

In [44]:
# Get accuracy by actual outcomes
case_data.groupby(["vote_affirm", "vote_reverse"])["rf_correct_case"].mean().unstack()


Out[44]:
vote_reverse 0 1 2 3 4 5 6 7 8 9
vote_affirm
0 0.504854 NaN NaN NaN NaN 1.000000 1.000000 0.952381 0.953317 0.932784
1 NaN NaN NaN NaN 1.000000 1.000000 0.916667 0.906475 0.922197 NaN
2 NaN NaN NaN NaN 1.000000 0.928571 0.934343 0.905380 NaN NaN
3 NaN NaN NaN NaN 0.851852 0.916667 0.898256 NaN NaN NaN
4 NaN 0.000000 0.500000 0.055556 NaN 0.897059 NaN NaN NaN NaN
5 0.000000 NaN 0.222222 0.204819 0.172917 NaN NaN NaN NaN NaN
6 0.125000 0.083333 0.277778 0.192837 NaN NaN NaN NaN NaN NaN
7 0.097561 0.245283 0.194444 NaN NaN NaN NaN NaN NaN NaN
8 0.198276 0.236686 NaN NaN NaN NaN NaN NaN NaN NaN
9 0.200000 NaN NaN NaN NaN NaN NaN NaN NaN NaN

In [45]:
# Get accuracy by predicted outcomes
case_data.groupby(["predicted_vote_affirm", "predicted_vote_reverse"])["rf_correct_case"].mean().unstack()


Out[45]:
predicted_vote_reverse 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0
predicted_vote_affirm
0 0.921182 0.800000 1.000000 0.833333 0.750000 0.166667 0.333333 0.642857 0.746914 0.732963
1 NaN NaN NaN 1.000000 NaN NaN 0.428571 0.618182 0.687573 NaN
2 0.000000 NaN NaN NaN NaN 0.500000 0.684211 0.665837 NaN NaN
3 NaN NaN NaN NaN 0.666667 0.555556 0.602528 NaN NaN NaN
4 NaN NaN NaN NaN 0.578947 0.589633 NaN NaN NaN NaN
5 NaN NaN 0.000000 0.666667 0.467836 NaN NaN NaN NaN NaN
6 NaN NaN 0.583333 0.588608 NaN NaN NaN NaN NaN NaN
7 NaN 0.500000 0.539568 NaN NaN NaN NaN NaN NaN NaN
8 0.666667 0.520548 NaN NaN NaN NaN NaN NaN NaN NaN
9 0.671642 NaN NaN NaN NaN NaN NaN NaN NaN NaN

In [57]:
# Get justice name map
justice_names = data.loc[:, ["justice", "justiceName"]].drop_duplicates()
justice_names.index = justice_names["justice"]
del justice_names["justice"]
justice_map = justice_names["justiceName"].T.to_dict()

In [131]:
justice_accuracy_by_termjustice_dummy_by_term


Out[131]:
78 79 80 81 82 84 85 86 87 88 ... SGBreyer SMinton SSotomayor TCClark TMarshall WBRutledge WEBurger WHRehnquist WJBrennan WODouglas
term
1946 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1947 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1948 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1949 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1950 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1951 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1952 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1953 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1954 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1955 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1956 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1957 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1958 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1959 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1960 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1961 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1962 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1963 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1964 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1965 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1966 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1967 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1968 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1969 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1970 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1971 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1972 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1973 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1974 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1975 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1985 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1986 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1987 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1988 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1989 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1990 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1991 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1992 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1993 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1994 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1995 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1996 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1997 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1998 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1999 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2000 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2001 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2002 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2003 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2004 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2005 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2006 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2007 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2008 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2009 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2010 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2011 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2012 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2013 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2014 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

69 rows × 72 columns


In [137]:
# Get accuracy by justice-term
justice_accuracy_by_term = data.groupby(["term", "justice"])["rf_correct"].mean().unstack()
justice_dummy_by_term = data.groupby(["term", "justice"])["dummy_correct"].mean().unstack()
justice_count_by_term = data.groupby(["term", "justice"])["rf_correct"].count().unstack()
justice_accuracy_by_term.columns = justice_map.values()
justice_count_by_term.columns = justice_map.values()
justice_dummy_by_term.columns = justice_map.values()

# Reset very small sample sizes
justice_accuracy_by_term[(justice_count_by_term > 0) & (justice_count_by_term < 10)] = numpy.nan
justice_dummy_by_term[(justice_count_by_term > 0) & (justice_count_by_term < 10)] = numpy.nan
justice_accuracy_by_term.head(10).append(justice_accuracy_by_term.tail(10))


Out[137]:
HLBlack SFReed FFrankfurter WODouglas FMurphy RHJackson WBRutledge HHBurton FMVinson TCClark ... AScalia AMKennedy DHSouter CThomas RBGinsburg SGBreyer JGRoberts SAAlito SSotomayor EKagan
term
1946 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1947 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1948 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1949 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1950 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1951 0.600000 0.484211 0.421053 0.526316 NaN 0.400000 NaN 0.421053 0.547368 0.326316 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1952 0.612069 0.568966 0.465517 0.568966 NaN 0.405172 NaN 0.568966 0.586207 0.508621 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1953 0.625000 0.477273 0.397727 0.454545 NaN 0.465909 NaN 0.556818 NaN 0.488636 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1954 0.721649 0.628866 0.577320 0.670103 NaN NaN NaN 0.608247 NaN 0.577320 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1955 0.721154 0.548077 0.461538 0.730769 NaN NaN NaN 0.528846 NaN 0.557692 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2005 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.758621 0.701149 0.724138 0.747126 0.735632 0.770115 0.758621 0.508197 NaN NaN
2006 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.756757 0.746667 0.675676 0.706667 0.640000 0.653333 0.706667 0.706667 NaN NaN
2007 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.602740 0.561644 0.671233 0.630137 0.712329 0.602740 0.616438 0.589041 NaN NaN
2008 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.722892 0.710843 0.614458 0.746988 0.614458 0.638554 0.686747 0.759036 NaN NaN
2009 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.695652 0.706522 NaN 0.684783 0.586957 0.543478 0.673913 0.695652 0.521739 NaN
2010 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.694118 0.682353 NaN 0.682353 0.670588 0.670588 0.647059 0.705882 0.623529 0.376471
2011 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.545455 0.623377 NaN 0.571429 0.597403 0.597403 0.545455 0.558442 0.584416 0.597403
2012 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.582278 0.708861 NaN 0.670886 0.670886 0.645570 0.670886 0.658228 0.683544 0.620253
2013 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.693333 0.680000 NaN 0.720000 0.666667 0.640000 0.653333 0.733333 0.720000 0.666667
2014 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.647887 0.647887 NaN 0.563380 0.704225 0.704225 0.690141 0.633803 0.760563 0.676056

20 rows × 36 columns


In [138]:
# Generate a custom diverging colormap
cmap = seaborn.diverging_palette(20, 255-20, s=90, sep=20, n=10, as_cmap=True)

# Draw the heatmap with the mask and correct aspect ratio
f = plt.figure(figsize=(32, 16))
seaborn.heatmap(justice_accuracy_by_term.T, cmap=cmap,
                vmin=0.0, vmax=1.0,
                linewidths=.25,
                cbar_kws={"shrink": 0.75})
_ = plt.xticks(rotation=90, fontsize=16)
_ = plt.yticks(fontsize=16)



In [142]:
# Generate a custom diverging colormap
cmap = seaborn.diverging_palette(20, 255-20, s=75, sep=20, n=10, as_cmap=True)
#cmap = seaborn.cubehelix_palette(8, as_cmap=True)

# Draw the heatmap with the mask and correct aspect ratio
f = plt.figure(figsize=(32, 16))
seaborn.heatmap((justice_accuracy_by_term - justice_dummy_by_term).T, cmap=cmap,
                linewidths=.25, cbar_kws={"shrink": 0.75})
_ = plt.xticks(rotation=90, fontsize=16)
_ = plt.yticks(fontsize=16)



In [146]:
# Show averages by justice
accuracy_by_justice = pandas.DataFrame(data.groupby("justiceName")["rf_correct"].mean())
accuracy_by_justice.sort_values("rf_correct", ascending=False)


Out[146]:
rf_correct
justiceName
AJGoldberg 0.742616
EWarren 0.725455
WODouglas 0.718999
WJBrennan 0.714957
HLBlack 0.709941
AFortas 0.698276
WHRehnquist 0.691170
WEBurger 0.681867
TMarshall 0.679299
CThomas 0.673013
JGRoberts 0.666248
AScalia 0.665021
SGBreyer 0.663080
BRWhite 0.662417
DHSouter 0.660949
RBGinsburg 0.660944
SDOConnor 0.660254
SAAlito 0.660182
AMKennedy 0.648679
HABlackmun 0.643577
SSotomayor 0.643006
LFPowell 0.626038
PStewart 0.620017
JPStevens 0.613092
TCClark 0.610227
EKagan 0.581395
CEWhittaker 0.576812
FMVinson 0.568720
HHBurton 0.565605
JHarlan2 0.561620
SFReed 0.547445
SMinton 0.512974
FFrankfurter 0.507997
RHJackson 0.421405
FMurphy NaN
WBRutledge NaN

In [149]:
# Show averages by justice
accuracy_spread_by_justice = pandas.DataFrame(data.groupby("justiceName")["rf_correct"].mean() -\
                                      data.groupby("justiceName")["dummy_correct"].mean(),
                                              columns=["accuracy_spread"])
accuracy_spread_by_justice.sort_values("accuracy_spread", ascending=False)


Out[149]:
accuracy_spread
justiceName
TMarshall 0.192833
WJBrennan 0.147313
SFReed 0.114964
WHRehnquist 0.113466
WODouglas 0.103682
CEWhittaker 0.101449
HHBurton 0.098089
JPStevens 0.097607
CThomas 0.094241
TCClark 0.092137
HLBlack 0.089392
JHarlan2 0.089126
HABlackmun 0.080945
SMinton 0.077844
WEBurger 0.077307
AScalia 0.076516
FMVinson 0.075829
RBGinsburg 0.074034
DHSouter 0.070326
BRWhite 0.064359
EWarren 0.062273
SDOConnor 0.060804
LFPowell 0.051321
SGBreyer 0.048698
SSotomayor 0.045929
SAAlito 0.045396
FFrankfurter 0.044174
AMKennedy 0.044151
AFortas 0.043103
PStewart 0.042375
AJGoldberg 0.033755
RHJackson 0.026756
EKagan 0.007752
JGRoberts 0.005019
FMurphy NaN
WBRutledge NaN

In [154]:
data.groupby("vote_reverse")["rf_correct"].mean()


Out[154]:
vote_reverse
0    0.394094
1    0.345515
2    0.438407
3    0.510828
4    0.623351
5    0.647180
6    0.716535
7    0.753607
8    0.810732
9    0.876207
Name: rf_correct, dtype: float64

In [162]:
# Show averages by number of reverses
accuracy_by_reverse = pandas.DataFrame(data.groupby("vote_reverse")["rf_correct_case"].mean())
accuracy_by_reverse.sort_index()


Out[162]:
rf_correct_case
vote_reverse
0 0.293337
1 0.230185
2 0.218895
3 0.190327
4 0.219892
5 0.904306
6 0.909273
7 0.911298
8 0.937043
9 0.932784

In [163]:
# Show averages by number of reverses
accuracy_spread_by_reverse = pandas.DataFrame(data.groupby("vote_reverse")["rf_correct_case"].mean() -\
                                       data.groupby("vote_reverse")["dummy_correct_case"].mean(),
                                       columns=["accuracy_spread"])
accuracy_spread_by_reverse.sort_index()


Out[163]:
accuracy_spread
vote_reverse
0 0.293337
1 0.230185
2 0.218895
3 0.190327
4 0.153946
5 -0.095694
6 -0.090727
7 -0.088702
8 -0.062957
9 -0.067216