Skip to main content

Sham Sui Po, Hong Kong

Whose ratings should you trust?

Github Repository

Dataset

!wget https://raw.githubusercontent.com/fivethirtyeight/data/master/fandango/fandango_score_comparison.csv -P dataset
!wget https://raw.githubusercontent.com/fivethirtyeight/data/master/fandango/fandango_scrape.csv -P dataset

fandango_score_comparison.csv contains every film that has a Rotten Tomatoes rating, a RT User rating, a Metacritic score, a Metacritic User score, and IMDb score, and at least 30 fan reviews on Fandango. The data from Fandango was pulled on Aug. 24, 2015:

ColumnDefinition
FILMThe film in question
RottenTomatoesThe Rotten Tomatoes Tomatometer score for the film
RottenTomatoes_UserThe Rotten Tomatoes user score for the film
MetacriticThe Metacritic critic score for the film
Metacritic_UserThe Metacritic user score for the film
IMDBThe IMDb user score for the film
Fandango_StarsThe number of stars the film had on its Fandango movie page
Fandango_RatingvalueThe Fandango ratingValue for the film, as pulled from the HTML of each page. This is the actual average score the movie obtained.
RT_normThe Rotten Tomatoes Tomatometer score for the film , normalized to a 0 to 5 point system
RT_user_normThe Rotten Tomatoes user score for the film , normalized to a 0 to 5 point system
Metacritic_normThe Metacritic critic score for the film, normalized to a 0 to 5 point system
Metacritic_user_nomThe Metacritic user score for the film, normalized to a 0 to 5 point system
IMDB_normThe IMDb user score for the film, normalized to a 0 to 5 point system
RT_norm_roundThe Rotten Tomatoes Tomatometer score for the film , normalized to a 0 to 5 point system and rounded to the nearest half-star
RT_user_norm_roundThe Rotten Tomatoes user score for the film , normalized to a 0 to 5 point system and rounded to the nearest half-star
Metacritic_norm_roundThe Metacritic critic score for the film, normalized to a 0 to 5 point system and rounded to the nearest half-star
Metacritic_user_norm_roundThe Metacritic user score for the film, normalized to a 0 to 5 point system and rounded to the nearest half-star
IMDB_norm_roundThe IMDb user score for the film, normalized to a 0 to 5 point system and rounded to the nearest half-star
Metacritic_user_vote_countThe number of user votes the film had on Metacritic
IMDB_user_vote_countThe number of user votes the film had on IMDb
Fandango_votesThe number of user votes the film had on Fandango
Fandango_DifferenceThe difference between the presented Fandango_Stars and the actual Fandango_Ratingvalue

fandango_scrape.csv contains every film we pulled from Fandango:

ColumnDefiniton
FILMThe movie
STARSNumber of stars presented on Fandango.com
RATINGThe Fandango ratingValue for the film, as pulled from the HTML of each page. This is the actual average score the movie obtained.
VOTESnumber of people who had reviewed the film at the time we pulled it.
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

Exploration

Fandango Displayed Star Scores vs User Ratings

fandango_df = pd.read_csv('dataset/fandango_scrape.csv')
fandango_df.head(5)
FILMSTARSRATINGVOTES
0Fifty Shades of Grey (2015)4.03.934846
1Jurassic World (2015)4.54.534390
2American Sniper (2015)5.04.834085
3Furious 7 (2015)5.04.833538
4Inside Out (2015)4.54.515749
fandango_df.info()

<class 'pandas.core.frame.DataFrame'>

  • RangeIndex: 510 entries, 0 to 509
  • Data columns (total 4 columns):
#ColumnNon-Null CountDtype
0FILM510 non-nullobject
1STARS510 non-nullfloat64
2RATING510 non-nullfloat64
3VOTES510 non-nullint64
dtypes: float64(2), int64(1), object(1)
memory usage: 16.1+ KB
fandango_df.describe()
STARSRATINGVOTES
count510.000000510.000000510.000000
mean3.5323533.3517651134.364706
std1.5856161.5126283809.952176
min0.0000000.0000000.000000
25%3.5000003.0250002.000000
50%4.0000003.80000017.500000
75%4.5000004.300000183.500000
max5.0000005.00000034846.000000
sns.set(
style='darkgrid',
palette='winter'
)
# Find Correlations between Stars, Ratings and Number of Votes
sns.pairplot(
data=fandango_df
)

plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_01.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

# how do the columns correlate
fandango_df.corr(numeric_only=True)
# there is a small difference between stars and user ratings
STARSRATINGVOTES
STARS1.0000000.9948700.165774
RATING0.9948701.0000000.165147
VOTES0.1657740.1651471.000000
plt.figure(figsize=(10, 4))

sns.scatterplot(
data=fandango_df,
x='RATING',
y='VOTES',
hue='STARS',
palette='winter',
# size='training level'
).set_title('Average Rating vs Number of Votes')

plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_02.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

plt.figure(figsize=(12, 6))
plt.title('Correlation between Ratings and Stars')

sns.histplot(
data=fandango_df,
x='RATING',
bins=65,
hue='STARS',
palette='tab20',
kde=False
)

plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_03.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

# add YEAR column
fandango_df['YEAR'] = fandango_df['FILM'].apply(
lambda x: x.replace('"','')
).apply(
lambda x: x.replace('(1)', '(0000)')
).apply(
lambda x: x[-5:-1]
)

fandango_df['YEAR'].tail(5)
5052015
5062015
5072015
5081964
5090000
Name: YEAR, dtype: object
fandango_df['YEAR'].value_counts()
2015478
201423
00007
20161
19641
Name: YEAR, dtype: int64
plt.figure(figsize=(10, 5))
plt.title('Number of Movies by Year')

sns.countplot(
data=fandango_df,
x='YEAR',
hue='STARS',
palette='winter'
)

plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_04.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

fandango_years_df = fandango_df.groupby(['YEAR'])
temp_df = fandango_years_df.mean(numeric_only=True).round(1).reset_index()
temp_df.head(5)
YEARSTARSRATINGVOTES
000001.11.10.4
119640.00.00.0
220144.13.83341.4
320153.53.41049.5
420165.04.711.0
plt.figure(figsize=(10, 4))
plt.title('Average Rating by Year')

plot = sns.barplot(x='RATING', y='STARS' , data=temp_df, palette='winter', hue='YEAR' )

plt.legend(bbox_to_anchor=(1.01,1.01))
plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_05.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

# movies with highest voter count
plt.figure(figsize=(8, 5))
plt.title('Top10 Voted-for Movies Rating')

plot = sns.barplot(
x='RATING',
y='STARS',
data=fandango_df.sort_values(by='VOTES', ascending=False).head(10),
palette='tab20', hue='FILM' )

plt.legend(bbox_to_anchor=(1.01,1.01))

plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_06.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

# how many movies have zero votes
fandango_df[fandango_df['VOTES'] == 0]['FILM'].count()
# 73
# remove all 73 movies nobody voted for
fandango_df_non_zero_votes = fandango_df[fandango_df['VOTES'] != 0]
fandango_df_non_zero_votes.sort_values(by='VOTES', ascending=True).head(5)
FILMSTARSRATINGVOTESYEAR
436Z For Zachariah (2015)5.05.012015
415Buggs Bunny (2015)4.04.012015
414Wild Canaries (2015)3.03.012015
413The Living (2015)3.03.012015
412The Face of an Angel (2015)3.03.012015
# do ratings and star follow the same distribution?
plt.figure(figsize=(10, 5))
plt.title('Distribution between Stars and Rating')

fandango_df_no_votes = fandango_df_non_zero_votes[['STARS','RATING']]

plot = sns.kdeplot(data=fandango_df_no_votes, multiple="stack", palette='winter')

plot.set_xlim(0,5)

plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_07.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

# quantify discrepancy between rating and star rating
fandango_df_no_votes['RATE_STAR_DIFF'] = (
fandango_df_no_votes['STARS'] - fandango_df_no_votes['RATING']
).round(1)

fandango_df_no_votes[['RATING', 'STARS', 'RATE_STAR_DIFF']].head(10)
RATINGSTARSRATE_STAR_DIFF
03.94.00.1
14.54.50.0
24.85.00.2
34.85.00.2
44.54.50.0
54.34.50.2
64.24.50.3
74.04.00.0
84.55.00.5
93.43.50.1
# what movie has the greatest deviation
fandango_df_no_votes.sort_values(by='RATE_STAR_DIFF', ascending=False).head(10)
STARSRATINGRATE_STAR_DIFF
3815.04.01.0
1905.04.50.5
1614.03.50.5
2104.54.00.5
2094.03.50.5
2005.04.50.5
1894.54.00.5
1695.04.50.5
1224.03.50.5
504.03.50.5
# what is the title of movie `381`
fandango_df.iloc[381]
FILMTurbo Kid (2015)
STARS5.0
RATING4.0
VOTES2
YEAR2015
Name: 381, dtype: object
plt.figure(figsize=(14, 5))
plt.title('How often do Deviation of a certain value occur?')

plot = sns.countplot(
data=fandango_df_no_votes,
x='RATE_STAR_DIFF',
hue='STARS',
palette='winter'
)

plot.set_xticks(np.arange(8))

plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_08.webp', bbox_inches='tight')
# there are only positive deviations
# and the sum of movies with positive
# deviations is greater than the number
# of movies with a deviation of zero

FiveThirtyEight Fandango Dataset

Comparing Fandango Star Ratings to other Sites

all_sites_df = pd.read_csv('dataset/fandango_score_comparison.csv')
all_sites_df.head(2).transpose()
01
FILMAvengers: Age of Ultron (2015)Cinderella (2015)
RottenTomatoes7485
RottenTomatoes_User8680
Metacritic6667
Metacritic_User7.17.5
IMDB7.87.1
Fandango_Stars5.05.0
Fandango_Ratingvalue4.54.5
RT_norm3.74.25
RT_user_norm4.34.0
Metacritic_norm3.33.35
Metacritic_user_nom3.553.75
IMDB_norm3.93.55
RT_norm_round3.54.5
RT_user_norm_round4.54.0
Metacritic_norm_round3.53.5
Metacritic_user_norm_round3.54.0
IMDB_norm_round4.03.5
Metacritic_user_vote_count1330249
IMDB_user_vote_count27110765709
Fandango_votes1484612640
Fandango_Difference0.50.5

Rotten Tomatoes

plt.figure(figsize=(14, 6))

sns.regplot(
x='RottenTomatoes_User',
y='RottenTomatoes',
data=all_sites_df,
ci=95,
n_boot=1000,
color='fuchsia'
)

plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_09a.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

plt.figure(figsize=(14, 6))

sns.scatterplot(
x='RottenTomatoes_User',
y='RottenTomatoes',
data=all_sites_df,
hue='Fandango_Stars',
palette='winter',
size='Fandango_Ratingvalue'
).set_title('Rotten Tomatoes User and Critics Ratings')

plt.legend(bbox_to_anchor=(1.01,1.01))
plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_09b.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

# quantify discrepancy between critics and user rating
all_sites_df['RottenTomatoes_Critic_User_Diff'] = (
all_sites_df['RottenTomatoes'] - all_sites_df['RottenTomatoes_User']
).round(1)

all_sites_df[
['RottenTomatoes_Critic_User_Diff', 'RottenTomatoes', 'RottenTomatoes_User']
].head(10)
RottenTomatoes_Critic_User_DiffRottenTomatoesRottenTomatoes_User
0-127486
158580
2-108090
3-661884
4-141428
516362
6-114253
7228664
8179982
928987
# what is the average absolute deviation between user and critic scores?
all_sites_df['RottenTomatoes_Critic_User_Diff'].apply(abs).mean()
# 15.095890410958905
plt.figure(figsize=(10, 5))
plt.title('Distribution of Deviation in User and Critic Ratings')

sns.histplot(
data=all_sites_df,
x='RottenTomatoes_Critic_User_Diff',
bins=20,
kde=True
)

plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_09c.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

plt.figure(figsize=(10, 5))
plt.title('Distribution of Deviation in absolute User and Critic Ratings')

sns.histplot(
x=all_sites_df['RottenTomatoes_Critic_User_Diff'].apply(abs),
bins=25,
kde=True
)

plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_09d.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

# what movies have the largest neg difference in critics - user?
all_sites_df.sort_values(
by='RottenTomatoes_Critic_User_Diff',
ascending=True)[
['FILM','RottenTomatoes_Critic_User_Diff']
].head(10)
  • Movies loved by RT Users but disliked by Critics: | | FILM | RottenTomatoes_Critic_User_Diff | | -- | -- | -- | | 3 | Do You Believe? (2015) | -66 | | 85 | Little Boy (2015) | -61 | | 134 | The Longest Ride (2015) | -42 | | 105 | Hitman: Agent 47 (2015) | -42 | | 125 | The Wedding Ringer (2015) | -39 | | 132 | Max (2015) | -38 | | 19 | Pixels (2015) | -37 | | 15 | Taken 3 (2015) | -37 | | 51 | Entourage (2015) | -36 | | 49 | Terminator Genisys (2015) | -34 |
# what movies have the largest pos difference in critics - user?
all_sites_df.sort_values(by='RottenTomatoes_Critic_User_Diff', ascending=False)[['FILM','RottenTomatoes_Critic_User_Diff']].head(10)
  • Movies loved by Critics but disliked by RT Users:
FILMRottenTomatoes_Critic_User_Diff
69Mr. Turner (2014)42
112It Follows (2015)31
115While We're Young (2015)31
145Kumiko, The Treasure Hunter (2015)24
37Welcome to Me (2015)24
40I'll See You In My Dreams (2015)24
90The SpongeBob Movie: Sponge Out of Water (2015)23
7Top Five (2014)22
11Black Sea (2015)22
116Clouds of Sils Maria (2015)22
plt.figure(figsize=(24, 5))
plt.title('Deviation between User and Critic Ratings')

plot = sns.countplot(
data=all_sites_df,
x='RottenTomatoes_Critic_User_Diff'
)

plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_10.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

plt.figure(figsize=(12, 6))
plt.title('Deviation between User and Critic Ratings')

plot = sns.histplot(
data=all_sites_df,
bins=50,
x='RottenTomatoes_Critic_User_Diff',
kde=True
)

plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_11.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

MetaCritic

plt.figure(figsize=(14, 6))

sns.regplot(
x='Metacritic_User',
y='Metacritic',
data=all_sites_df,
ci=95,
n_boot=1000,
color='fuchsia'
)

plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_12a.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

plt.figure(figsize=(14, 6))

sns.scatterplot(
x='Metacritic_User',
y='Metacritic',
data=all_sites_df,
hue='Fandango_Stars',
palette='winter',
size='Fandango_Ratingvalue'
).set_title('Metacritic User and Displayed Ratings')

plt.legend(bbox_to_anchor=(1.01,1.01))
plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_12b.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

IMDB

plt.figure(figsize=(14, 6))

sns.regplot(
x='Metacritic_User',
y='Metacritic',
data=all_sites_df,
ci=95,
n_boot=1000,
color='fuchsia'
)

plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_13a.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

plt.figure(figsize=(14, 6))

sns.scatterplot(
x='IMDB',
y='Metacritic_User',
data=all_sites_df,
hue='Fandango_Stars',
palette='winter',
size='Fandango_Ratingvalue'
).set_title('IMDB vs Metacritic User Ratings')

plt.legend(bbox_to_anchor=(1.01,1.01))
plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_13b.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

Normalizing the Datasets

all_sites_df.describe()
# Rotten Tomatoes: 0-100
# Rotten Tomatoes Users: 0-100
# Metacritic: 0-100
# Metacritic User: 0-10
# IMDB: 0-10
# Fandango Stars: 0-5
# Fandango Rating: 0-5
RottenTomatoesRottenTomatoes_UserMetacriticMetacritic_UserIMDBFandango_StarsFandango_Ratingvalue
count146.000000146.000000146.000000146.000000146.000000146.000000146.000000
mean60.84931563.87671258.8082196.5191786.7369864.0890413.845205
std30.16879920.02443019.5173891.5107120.9587360.5403860.502831
min5.00000020.00000013.0000002.4000004.0000003.0000002.700000
25%31.25000050.00000043.5000005.7000006.3000003.5000003.500000
50%63.50000066.50000059.0000006.8500006.9000004.0000003.900000
75%89.00000081.00000075.0000007.5000007.4000004.5000004.200000
max100.00000094.00000094.0000009.6000008.6000005.0000004.800000
# Normalized to the Fandango 0-5 rating system
all_sites_df['RottenTomatoes_Normalized'] = (all_sites_df['RottenTomatoes'] / 20).round(2)
all_sites_df['RottenTomatoes_User_Normalized'] = (all_sites_df['RottenTomatoes_User'] / 20).round(2)
all_sites_df['Metacritic_Normalized'] = (all_sites_df['Metacritic'] / 20).round(2)
all_sites_df['Metacritic_User_Normalized'] = (all_sites_df['Metacritic_User'] / 2).round(2)
all_sites_df['IMDB_Normalized'] = (all_sites_df['IMDB'] / 2).round(2)
all_sites_normed_ratings_df = all_sites_df[[
'RottenTomatoes_Normalized',
'RottenTomatoes_User_Normalized',
'Metacritic_Normalized',
'Metacritic_User_Normalized',
'IMDB_Normalized',
'Fandango_Stars',
'Fandango_Ratingvalue'

]]

all_sites_normed_ratings_df.head(1).T
0
RottenTomatoes_Normalized3.70
RottenTomatoes_User_Normalized4.30
Metacritic_Normalized3.30
Metacritic_User_Normalized3.55
IMDB_Normalized3.90
Fandango_Stars5.00
Fandango_Ratingvalue4.50
# move legend in kdeplot
def move_legend(ax, new_loc, **kws):
old_legend = ax.legend_
handles = old_legend.legendHandles
labels = [t.get_text() for t in old_legend.get_texts()]
title = old_legend.get_title().get_text()
ax.legend(handles, labels, loc=new_loc, title=title, **kws)
# do all the ratings follow the same distribution?
fig, ax = plt.subplots(figsize=(12, 7))
fig.suptitle('Normalized Rating Distribution for different Platforms')

plot = sns.kdeplot(
data=all_sites_normed_ratings_df,
multiple='stack',
palette='winter',
clip=[0,5]
)

move_legend(ax, "upper left")
plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_14.webp', bbox_inches='tight')
# the fandango distribution leans towards higher ratings

FiveThirtyEight Fandango Dataset

fig, ax = plt.subplots(figsize=(12,6))
sns.kdeplot(
clip=[0,5],
fill=True,
data=all_sites_normed_ratings_df[
['RottenTomatoes_Normalized','Fandango_Stars']
]
)

fig.suptitle('Normalized Rating Distribution')

move_legend(ax, "upper left")
plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_15.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset

sns.clustermap(
all_sites_normed_ratings_df,
figsize=(10, 15),
cmap='winter',
annot=False,
col_cluster=False
)

plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_16.webp', bbox_inches='tight')
# the clustermap groups movies together by rating. the fandango ratings in the lower right are
# all higher (green instead of a blue hue) compared to the rest of the ratings from other platforms

FiveThirtyEight Fandango Dataset

# compare the top10 worst rated movies
worts_10_df = all_sites_normed_ratings_df.sort_values(
by='Fandango_Stars', ascending=False
).tail(10)

worts_10_df
RottenTomatoes_NormalizedRottenTomatoes_User_NormalizedMetacritic_NormalizedMetacritic_User_NormalizedIMDB_NormalizedFandango_StarsFandango_Ratingvalue
673.001.952.952.902.953.02.7
1010.801.351.503.502.203.02.9
1361.101.252.102.202.453.03.0
1350.701.151.552.452.603.03.0
1154.152.603.803.353.203.02.9
1070.651.051.852.702.303.02.9
1124.803.254.153.753.453.02.9
1133.652.604.053.703.353.02.9
480.451.001.351.252.003.02.7
821.701.252.552.702.703.02.8
# get movie names
all_sites_df[
['FILM','Fandango_Stars','RottenTomatoes_User']
].iloc[
[67, 101, 136, 135, 115, 107, 112, 113, 48, 82]
]
FILMFandango_StarsRottenTomatoes_User
67Unfriended (2015)3.039
101The Gallows (2015)3.027
136The Woman In Black 2 Angel of Death (2015)3.025
135The Lazarus Effect (2015)3.023
115While We're Young (2015)3.052
107The Vatican Tapes (2015)3.021
112It Follows (2015)3.065
113Inherent Vice (2014)3.052
48Fantastic Four (2015)3.020
82Blackhat (2015)3.025
# do ratings and star follow the same distribution?
plt.figure(figsize=(10, 5))
plt.title('Worst 10 Movies Rating Distribution')

sns.kdeplot(
data=worts_10_df,
x='RottenTomatoes_Normalized',
clip=[0,5],
fill=True,
label='RT Rating'
)
sns.kdeplot(
data=worts_10_df,
x='RottenTomatoes_User_Normalized',
clip=[0,5],
fill=True,
label='RT User Rating'
)
sns.kdeplot(
data=worts_10_df,
x='Metacritic_Normalized',
clip=[0,5],
fill=True,
label='MC Rating'
)
sns.kdeplot(
data=worts_10_df,
x='Metacritic_User_Normalized',
clip=[0,5],
fill=True,
label='MC User Rating'
)
sns.kdeplot(
data=worts_10_df,
x='IMDB_Normalized',
clip=[0,5],
fill=True,
label='IMDB User Rating'
)
sns.kdeplot(
data=worts_10_df,
x='Fandango_Stars',
clip=[0,5],
fill=True,
label='Fandango Stars'
)
sns.kdeplot(
data=worts_10_df,
x='Fandango_Ratingvalue',
clip=[0,5],
fill=True,
label='Fandango Rating'
)

plt.legend(loc=(1.01, 0.57))
plt.xlabel('Normalized Rating [0,5]')
plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_18.webp', bbox_inches='tight')

# fandango groups all movies with ratings below 3 in the 3-star category

FiveThirtyEight Fandango Dataset

grid = sns.PairGrid(
data=all_sites_normed_ratings_df,
height=3,
aspect=2,
despine=True
)

grid = grid.map_upper(
sns.regplot,
scatter_kws={'alpha':0.55},
line_kws={'color': 'fuchsia'}
)
grid = grid.map_lower(sns.scatterplot)
grid = grid.map_diag(sns.kdeplot, color='mediumspringgreen', fill=True)


plt.savefig('assets/FiveThirtyEight_Fandango_Dataset_17.webp', bbox_inches='tight')

FiveThirtyEight Fandango Dataset