The Olympics are a celebration of human physical achievement. But I simply don’t believe some of the sports should be in it^{1}. In this post, I will present a set of criteria that I believe defines what an Olympic sport should be. I will then use this model to rank the sports in the 2024 Olympics, and see if they pass muster^{2}.

^{1} Said with absolutely zero authority

^{2} The conclusions presented should be taken with more than a pinch of salt. I am in no way qualified to make these judgements, and I wouldn’t even say these represent my actual opinions. In effect this post is completely useless, a waste of time, and I’m sorry for making it.

### Executive Summary

**Triathlon**and**Weightlifting**are the pinnacle of Olympic sports.**Football**and**Breakdancing**should be removed from the Olympics with immediate effect.- If
**Trampolining**was judged completely objectively, it would be comparatively one of the greatest Olympic sports of all time.

After intense internal discussion with close friends and family^{3}, I have settled on the following three criteria that define a real Olympic sport:

^{3} largely at the Imperial students union

- Is winning the Olympics the pinnacle of the sport?
- Is the sport hard?
- Does it look physically difficult, could anyone compete (at any level)?

- Are there judges?
- Is the sport subjective?

To generate these rankings, I unashamedly used a large-language model to give me a CSV based on these criteria^{4}.

^{4} Making the rest of the analysis in this post, in effect, invalid.

The bottom five sports are:

- Golf
- Equestrian
- Skateboarding
- Football
- Breaking(/Dance)

As a quick validation, let’s try to justify the bottom five sports based on the criteria:

- Golf: Not the pinnacle of the sport (Masters, US Open, etc.), not hard (large amount of people play).
- Equestrian: Not hard (requires sitting on a horse), relatively subjective (judged on form).
- Skateboarding: Not the pinnacle of the sport (X-Games, generally judged on whether you make a cool video), not hard (anyone can skateboard in a few weeks).
- Football: Not the pinnacle of the sport (World Cup), not hard (anyone can play football).
- Breaking: Not sure this is even a sport, it’s a dance.

Interestingly, there are a solid 25ish sports that are solidly ‘Olympic’, with a plateau of sports that are all very close in score. Following this things get a bit more volatile^{5}.

^{5} These remaining sports would probably be on the Red Button, or BBC Three or something.

The guiding assumption in my model here is that my criteria are equally weighted. To investigate the robustness of this assumption, I will use Monte Carlo sampling to investigate different criteria ratios, and evaluate the resulting rankings of Olympic-ness.

## Monte Carlo Simulation

```
import numpy as np
import joypy
import pandas as pd
import seaborn as sns
import matplotlib.cm as cm
import matplotlib.pyplot as plt
# matrix of scores
= np.array([df['Difficulty'],df['Judging Requirement'],df['Olympic Pinnacle']]).T
scores
# save ranks for each weighting
= []
sampled_ranks for i in range(1000):
= np.random.uniform(1,3,3)
weights = np.dot(scores,weights)
all_scores = np.argsort(-all_scores)
ranks
sampled_ranks.append(ranks)
# Create a DataFrame for joypy
= np.array(sampled_ranks)
sampled_ranks
= pd.DataFrame(sampled_ranks, columns=df['Sport'])
joy_data # column name = Rank
= joy_data.rename(columns={'index':'Rank'})
joy_data
# Create the ridgeline plot
joypy.joyplot(=joy_data,
data=3,
overlap=cm.Blues_r,
colormap=df['Sport'],
labels=(7, 9),
figsize=True,
xlabels='Rank'
title; )
```

We see a few interesting clusters of sports. I won’t discuss them here, but there is an interesting gap between Athletics and Beach Volleyball, and later between Table Tennis and Archery, but these sports are still all comfortably in the top half of the rankings.

Breakdancing is squarely at the bottom. I think this is unfair because it simply hasn’t had enough time to develop as a sport. Therefore the criteria ‘is it the pinnacle of the sport’ is biased aganist it.

To try and explain some of these distributions, I’ll look into how different specific differences in the criteria weights affect the rankings in a leave-one-out manner.

Each plot will show the rankings of the sports with one of the criteria removed. The sports that change the most in rank will be highlighted.

## Leave-one-out Criteria Analysis

```
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Assuming df is already defined and contains the necessary data
= np.array([df['Difficulty'], df['Judging Requirement'], df['Olympic Pinnacle']]).T
scores = np.array([1, 1, 1])
weights = np.dot(scores, weights)
all_scores = np.argsort(all_scores)
ranks = df.iloc[ranks].reset_index(drop=True)
df = np.arange(1, len(ranks) + 1)
ranks
def calculate_ranks(weights):
return len(scores) - np.argsort(np.dot(scores, weights))
= calculate_ranks([0, 1, 1])
ranks_no_diff = calculate_ranks([1, 0, 1])
ranks_no_judges = calculate_ranks([1, 1, 0])
ranks_no_pinnacle
def find_extreme_differences(ranks1, ranks2):
= ranks1 - ranks2
diff return np.argmax(diff), np.argmin(diff)
= find_extreme_differences(ranks, ranks_no_diff)
p_no_diff, n_no_diff = find_extreme_differences(ranks, ranks_no_judges)
p_no_judges, n_no_judges = find_extreme_differences(ranks, ranks_no_pinnacle)
p_no_pinnacle, n_no_pinnacle
= plt.subplots(3, 1, figsize=(7,6))
fig, axs = np.arange(len(df))
x
for ax in axs:
='k', label='Equal Weight')
ax.plot(x, ranks, color
ax.set_xticks(x)if ax == axs[-1]:
'Sport'], rotation=90, ha='right')
ax.set_xticklabels(df[else:
ax.set_xticklabels([])
0].plot(x, ranks_no_diff, color='tab:red', label='No Difficulty Criteria')
axs[0].annotate(df['Sport'][p_no_diff], (x[p_no_diff], ranks_no_diff[p_no_diff]),
axs[=(0, -4), textcoords='offset points', ha='center', va='top', color='tab:red')
xytext0].annotate(df['Sport'][n_no_diff], (x[n_no_diff], ranks_no_diff[n_no_diff]),
axs[=(0, 4), textcoords='offset points', ha='center', va='bottom', color='tab:red')
xytext
1].plot(x, ranks_no_judges, color='tab:blue', label='No Judging Criteria')
axs[1].annotate(df['Sport'][p_no_judges], (x[p_no_judges], ranks_no_judges[p_no_judges]),
axs[=(0, -4), textcoords='offset points', ha='center', va='top', color='tab:blue')
xytext1].annotate(df['Sport'][n_no_judges], (x[n_no_judges], ranks_no_judges[n_no_judges]),
axs[=(0, 4), textcoords='offset points', ha='center', va='bottom', color='tab:blue')
xytext
2].plot(x, ranks_no_pinnacle, color='tab:green', label='No Pinnacle Criteria')
axs[2].annotate(df['Sport'][p_no_pinnacle], (x[p_no_pinnacle], ranks_no_pinnacle[p_no_pinnacle]),
axs[=(0, -4), textcoords='offset points', ha='center', va='top', color='tab:green')
xytext2].annotate(df['Sport'][n_no_pinnacle], (x[n_no_pinnacle], ranks_no_pinnacle[n_no_pinnacle]),
axs[=(0, 4), textcoords='offset points', ha='center', va='bottom', color='tab:green')
xytext
for ax in axs:
=0.3)
ax.grid(alpha=False)
ax.legend(frameon'Rank')
ax.set_ylabel(-0.5, len(df) - 0.5)
ax.set_xlim(
plt.tight_layout() plt.show()
```

Canoe sprint which my model considers squarely an Olympic sport plummets down to the bottom 10 when the ‘Subjective judging criteria’ is removed. Likewise, if trampolining was judged completely objectively^{6}, it would rocket to being one of the all time great Olympic sports.

^{6} My ignorance is showing here because I don’t know how trampolining is judged