[HEAD]: initial commit

This commit is contained in:
John Gatward
2026-08-04 19:19:24 +01:00
commit 2d9bfafbe6
39 changed files with 8905 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
source("renv/activate.R")
+9
View File
@@ -0,0 +1,9 @@
{
"path": "~/football_competitiveness",
"sortOrder": [
{
"columnIndex": 2,
"ascending": true
}
]
}
@@ -0,0 +1,3 @@
{
"activeTab": 0
}
@@ -0,0 +1,14 @@
{
"left": {
"splitterpos": 312,
"topwindowstate": "NORMAL",
"panelheight": 744,
"windowheight": 782
},
"right": {
"splitterpos": 469,
"topwindowstate": "NORMAL",
"panelheight": 744,
"windowheight": 782
}
}
@@ -0,0 +1,5 @@
{
"TabSet1": 0,
"TabSet2": 0,
"TabZoom": {}
}
@@ -0,0 +1,4 @@
{
"source_window_id": "",
"Source": "Source"
}
+1
View File
@@ -0,0 +1 @@
~%2Ffootball_competitiveness%2Fdata_manipulation.R="9DEA2FB2"
@@ -0,0 +1,24 @@
{
"id": "2E827BA4",
"path": "~/football_competitiveness/data_manipulation.R",
"project_path": "data_manipulation.R",
"type": "r_source",
"hash": "0",
"contents": "",
"dirty": false,
"created": 1785865647905.0,
"source_on_save": false,
"relative_order": 1,
"properties": {
"source_window_id": "",
"Source": "Source"
},
"folds": "",
"lastKnownWriteTime": 1785865410,
"encoding": "UTF-8",
"collab_server": "",
"source_window": "",
"last_content_update": 1785865410,
"read_only": false,
"read_only_alternatives": []
}
@@ -0,0 +1,126 @@
European_performance_data = read_csv('Data/European performance historical data.csv')
Points_difference_data <- read_csv("Data/Points difference.csv")
Players_used_data <- read_csv("Data/European clubs number of players used.csv")
Top_goalscorers_data <- read_csv("Data/Average top scorers.csv")
Market_value_data <- read_csv("Data/Market values.csv")
gini_coeffecient_data <- Market_value_data %>%
select(-`Average market value of clubs`)
all_seasons <- unique(European_performance_data$Season)
overall_country_performance <- European_performance_data %>%
group_by(Country) %>%
summarise(total_performance = sum(European_performance, na.rm = TRUE)) %>%
arrange(desc(total_performance))
#season by season performance
country_performance_by_season <- European_performance_data %>%
filter(Country %in% c("Germany", "Spain", "England", "Portugal", "Italy", "France")) %>%
group_by(Country, Season) %>%
summarise(
European_performance = sum(European_performance, na.rm = TRUE),
.groups = "drop"
) %>%
complete(Country, Season = all_seasons, fill = list(European_performance = 0))
#season by season performance by competition
country_performance_by_season_comp_breakdown <- European_performance_data %>%
filter(Country %in% c("Germany", "Spain", "England", "Portugal", "Italy", "France")) %>%
group_by(Country, Season) %>%
summarise(
CL = sum(European_performance[Competition == "CL"], na.rm = TRUE),
EL = sum(European_performance[Competition == "EL"], na.rm = TRUE),
.groups = "drop"
) %>%
complete(Country, Season = all_seasons, fill = list(CL = 0, EL = 0)) %>%
pivot_longer(cols = c("CL", "EL"), names_to = "competition", values_to = "European_performance") %>%
mutate(European_performance = ifelse(competition == "CL", European_performance/2, European_performance)) #halving score for CL as had double weighting
#join all metrics data together
#impute missing Gini coefficient with average for league - assumed the same over time
season_league_metrics_dataset <- Points_difference_data %>%
left_join(Players_used_data, by = c("Country", "Season")) %>%
left_join(Top_goalscorers_data, by = c("Country", "Season")) %>%
left_join(gini_coeffecient_data, by = c("Country", "Season")) %>%
mutate(season_start = as.integer(str_extract(Season, "^\\d{4}"))) %>%
group_by(Country) %>%
mutate(Gini_coefficient = coalesce(Gini_coefficient, mean(Gini_coefficient, na.rm = TRUE))) %>%
ungroup()
#average country performance
average_country_metrics <- season_league_metrics_dataset %>%
group_by(Country) %>%
summarise(across(!contains("eason"), mean, na.rm = TRUE))
#scaling to min-max of variables
average_country_metrics_scaled <- average_country_metrics
average_country_metrics_scaled[,-1] <- lapply(average_country_metrics[,-1], function(x) {
(x - min(x)) / (max(x) - min(x))
})
#scaling metrics normally
scaled_metrics_data <- season_league_metrics_dataset %>%
mutate(across(
c(First_and_second, First_and_CL, First_and_relegated, CL_and_relegated,
Winners_GD, Top_4_total_GD, Average_number_of_players,
Average_goals_by_top_3_players, Gini_coefficient),
~ as.numeric(scale(.))
))
#join metrics data to European performance data
#calculate European performance in next season as lead
season_league_full_dataset <- season_league_metrics_dataset %>%
left_join(country_performance_by_season, by = c("Country", "Season")) %>%
arrange(Season, Country) %>%
group_by(Country) %>%
mutate(lead_european_performance = dplyr::lead(European_performance)) %>%
ungroup()
#join metrics data to European performance data by competition
#calculate European performance in next season as lead
season_league_full_dataset_comp_breakdown <- season_league_metrics_dataset %>%
left_join(country_performance_by_season_comp_breakdown, by = c("Country", "Season")) %>%
arrange(Season, Country) %>%
group_by(Country, competition) %>%
mutate(lead_european_performance = dplyr::lead(European_performance)) %>%
ungroup()
#full data scaled
scaled_full_data <- scaled_metrics_data %>%
left_join(country_performance_by_season, by = c("Country", "Season")) %>%
arrange(Season, Country) %>%
group_by(Country) %>%
mutate(lead_european_performance = dplyr::lead(European_performance)) %>%
ungroup()
#data by competition scaled
scaled_full_data_comp_breakdown <- scaled_metrics_data %>%
left_join(country_performance_by_season_comp_breakdown, by = c("Country", "Season")) %>%
arrange(Season, Country) %>%
group_by(Country, competition) %>%
mutate(lead_european_performance = dplyr::lead(European_performance)) %>%
ungroup()
#full dataset with competition breakdown and full
pivoted_scaled_full_data_comp_breakdown <- scaled_full_data_comp_breakdown %>%
pivot_wider(names_from = competition, values_from = c(European_performance, lead_european_performance)) %>%
mutate(European_performance = 2*European_performance_CL + European_performance_EL,
lead_european_performance = 2*lead_european_performance_CL + lead_european_performance_EL)
#basic profiling based on European performance
quantile_splits <- scaled_full_data %>%
mutate(
performance_group = ntile(European_performance, 3)
)
european_performance_groups_characteristics <- quantile_splits %>%
group_by(performance_group) %>%
summarise(across(where(is.numeric), mean, na.rm = TRUE)) %>%
select(-season_start) %>%
mutate(label = case_when(
performance_group == 1 ~ "Worst performing",
performance_group == 2 ~ "Middle performing",
performance_group == 3 ~ "Best performing"
)) %>%
mutate(performance_group = case_when(
label == "Worst performing" ~ 1,
label == "Middle performing" ~ 3,
label == "Best performing" ~ 2
))
+10
View File
@@ -0,0 +1,10 @@
.Rproj.user
.Rhistory
.RData
.git
.gitignore
renv/library
renv/staging
*.Rproj
+163
View File
@@ -0,0 +1,163 @@
Season,Average goals by top 3 players,Country
199920,24.333333333333332,England
200001,19.666666666666668,England
200102,23.333333333333332,England
200203,24.0,England
200304,24.0,England
200405,20.0,England
200506,22.0,England
200607,18.333333333333332,England
200708,26.333333333333332,England
200809,17.666666666666668,England
200910,26.333333333333332,England
201011,19.333333333333332,England
201112,26.666666666666668,England
201213,23.333333333333332,England
201314,24.333333333333332,England
201415,22.333333333333332,England
201516,24.333333333333332,England
201617,26.0,England
201718,27.666666666666668,England
201819,22.0,England
201920,22.333333333333332,England
202021,21.0,England
202122,21.333333333333332,England
202223,28.666666666666668,England
202324,23.333333333333332,England
202425,24.666666666666668,England
202526,22.0,England
199920,25.0,Spain
200001,23.0,Spain
200102,19.0,Spain
200203,25.0,Spain
200304,21.0,Spain
200405,24.0,Spain
200506,22.666666666666668,Spain
200607,22.666666666666668,Spain
200708,23.333333333333332,Spain
200809,30.0,Spain
200910,29.0,Spain
201011,30.333333333333332,Spain
201112,40.0,Spain
201213,36.0,Spain
201314,28.666666666666668,Spain
201415,37.666666666666664,Spain
201516,33.666666666666664,Spain
201617,30.0,Spain
201718,28.333333333333332,Spain
201819,25.666666666666668,Spain
201920,21.333333333333332,Spain
202021,25.333333333333332,Spain
202122,20.333333333333332,Spain
202223,19.333333333333332,Spain
202324,22.0,Spain
202425,26.333333333333332,Spain
202526,21.666666666666668,Spain
199920,16.666666666666668,Germany
200001,21.0,Germany
200102,17.666666666666668,Germany
200203,19.333333333333332,Germany
200304,23.666666666666668,Germany
200405,22.0,Germany
200506,22.0,Germany
200607,17.333333333333332,Germany
200708,19.333333333333332,Germany
200809,26.0,Germany
200910,20.666666666666668,Germany
201011,22.333333333333332,Germany
201112,25.666666666666668,Germany
201213,21.666666666666668,Germany
201314,18.333333333333332,Germany
201415,17.666666666666668,Germany
201516,25.0,Germany
201617,28.666666666666668,Germany
201718,19.333333333333332,Germany
201819,19.0,Germany
201920,26.333333333333332,Germany
202021,32.0,Germany
202122,27.0,Germany
202223,15.666666666666666,Germany
202324,29.333333333333332,Germany
202425,22.666666666666668,Germany
202526,24.0,Germany
199920,23.0,Italy
200001,24.0,Italy
200102,23.333333333333332,Italy
200203,19.666666666666668,Italy
200304,22.333333333333332,Italy
200405,22.666666666666668,Italy
200506,25.333333333333332,Italy
200607,21.666666666666668,Italy
200708,20.0,Italy
200809,24.333333333333332,Italy
200910,23.333333333333332,Italy
201011,25.0,Italy
201112,25.0,Italy
201213,22.666666666666668,Italy
201314,20.333333333333332,Italy
201415,21.333333333333332,Italy
201516,24.333333333333332,Italy
201617,27.666666666666668,Italy
201718,26.666666666666668,Italy
201819,23.666666666666668,Italy
201920,30.0,Italy
202021,25.0,Italy
202122,24.0,Italy
202223,21.0,Italy
202324,18.333333333333332,Italy
202425,19.666666666666668,Italy
202526,15.0,Italy
199920,22.0,France
200001,19.333333333333332,France
200102,21.0,France
200203,22.0,France
200304,21.666666666666668,France
200405,16.333333333333332,France
200506,16.333333333333332,France
200607,13.333333333333334,France
200708,18.0,France
200809,19.333333333333332,France
200910,16.666666666666668,France
201011,21.333333333333332,France
201112,20.666666666666668,France
201213,22.666666666666668,France
201314,19.333333333333332,France
201415,22.333333333333332,France
201516,26.0,France
201617,28.0,France
201718,23.0,France
201819,24.333333333333332,France
201920,17.333333333333332,France
202021,22.333333333333332,France
202122,24.666666666666668,France
202223,26.666666666666668,France
202324,21.666666666666668,France
202425,19.666666666666668,France
202526,17.666666666666668,France
199920,27.0,Portugal
200001,19.666666666666668,Portugal
200102,27.333333333333332,Portugal
200203,17.333333333333332,Portugal
200304,17.666666666666668,Portugal
200405,18.0,Portugal
200506,15.666666666666666,Portugal
200607,12.666666666666666,Portugal
200708,16.333333333333332,Portugal
200809,18.0,Portugal
200910,21.333333333333332,Portugal
201011,18.333333333333332,Portugal
201112,18.666666666666668,Portugal
201213,21.0,Portugal
201314,17.0,Portugal
201415,20.0,Portugal
201516,26.333333333333332,Portugal
201617,23.0,Portugal
201718,27.666666666666668,Portugal
201819,20.0,Portugal
201920,18.0,Portugal
202021,20.333333333333332,Portugal
202122,21.666666666666668,Portugal
202223,19.333333333333332,Portugal
202324,23.333333333333332,Portugal
202425,25.666666666666668,Portugal
202526,23.333333333333332,Portugal
1 Season Average goals by top 3 players Country
2 1999–20 24.333333333333332 England
3 2000–01 19.666666666666668 England
4 2001–02 23.333333333333332 England
5 2002–03 24.0 England
6 2003–04 24.0 England
7 2004–05 20.0 England
8 2005–06 22.0 England
9 2006–07 18.333333333333332 England
10 2007–08 26.333333333333332 England
11 2008–09 17.666666666666668 England
12 2009–10 26.333333333333332 England
13 2010–11 19.333333333333332 England
14 2011–12 26.666666666666668 England
15 2012–13 23.333333333333332 England
16 2013–14 24.333333333333332 England
17 2014–15 22.333333333333332 England
18 2015–16 24.333333333333332 England
19 2016–17 26.0 England
20 2017–18 27.666666666666668 England
21 2018–19 22.0 England
22 2019–20 22.333333333333332 England
23 2020–21 21.0 England
24 2021–22 21.333333333333332 England
25 2022–23 28.666666666666668 England
26 2023–24 23.333333333333332 England
27 2024–25 24.666666666666668 England
28 2025–26 22.0 England
29 1999–20 25.0 Spain
30 2000–01 23.0 Spain
31 2001–02 19.0 Spain
32 2002–03 25.0 Spain
33 2003–04 21.0 Spain
34 2004–05 24.0 Spain
35 2005–06 22.666666666666668 Spain
36 2006–07 22.666666666666668 Spain
37 2007–08 23.333333333333332 Spain
38 2008–09 30.0 Spain
39 2009–10 29.0 Spain
40 2010–11 30.333333333333332 Spain
41 2011–12 40.0 Spain
42 2012–13 36.0 Spain
43 2013–14 28.666666666666668 Spain
44 2014–15 37.666666666666664 Spain
45 2015–16 33.666666666666664 Spain
46 2016–17 30.0 Spain
47 2017–18 28.333333333333332 Spain
48 2018–19 25.666666666666668 Spain
49 2019–20 21.333333333333332 Spain
50 2020–21 25.333333333333332 Spain
51 2021–22 20.333333333333332 Spain
52 2022–23 19.333333333333332 Spain
53 2023–24 22.0 Spain
54 2024–25 26.333333333333332 Spain
55 2025–26 21.666666666666668 Spain
56 1999–20 16.666666666666668 Germany
57 2000–01 21.0 Germany
58 2001–02 17.666666666666668 Germany
59 2002–03 19.333333333333332 Germany
60 2003–04 23.666666666666668 Germany
61 2004–05 22.0 Germany
62 2005–06 22.0 Germany
63 2006–07 17.333333333333332 Germany
64 2007–08 19.333333333333332 Germany
65 2008–09 26.0 Germany
66 2009–10 20.666666666666668 Germany
67 2010–11 22.333333333333332 Germany
68 2011–12 25.666666666666668 Germany
69 2012–13 21.666666666666668 Germany
70 2013–14 18.333333333333332 Germany
71 2014–15 17.666666666666668 Germany
72 2015–16 25.0 Germany
73 2016–17 28.666666666666668 Germany
74 2017–18 19.333333333333332 Germany
75 2018–19 19.0 Germany
76 2019–20 26.333333333333332 Germany
77 2020–21 32.0 Germany
78 2021–22 27.0 Germany
79 2022–23 15.666666666666666 Germany
80 2023–24 29.333333333333332 Germany
81 2024–25 22.666666666666668 Germany
82 2025–26 24.0 Germany
83 1999–20 23.0 Italy
84 2000–01 24.0 Italy
85 2001–02 23.333333333333332 Italy
86 2002–03 19.666666666666668 Italy
87 2003–04 22.333333333333332 Italy
88 2004–05 22.666666666666668 Italy
89 2005–06 25.333333333333332 Italy
90 2006–07 21.666666666666668 Italy
91 2007–08 20.0 Italy
92 2008–09 24.333333333333332 Italy
93 2009–10 23.333333333333332 Italy
94 2010–11 25.0 Italy
95 2011–12 25.0 Italy
96 2012–13 22.666666666666668 Italy
97 2013–14 20.333333333333332 Italy
98 2014–15 21.333333333333332 Italy
99 2015–16 24.333333333333332 Italy
100 2016–17 27.666666666666668 Italy
101 2017–18 26.666666666666668 Italy
102 2018–19 23.666666666666668 Italy
103 2019–20 30.0 Italy
104 2020–21 25.0 Italy
105 2021–22 24.0 Italy
106 2022–23 21.0 Italy
107 2023–24 18.333333333333332 Italy
108 2024–25 19.666666666666668 Italy
109 2025–26 15.0 Italy
110 1999–20 22.0 France
111 2000–01 19.333333333333332 France
112 2001–02 21.0 France
113 2002–03 22.0 France
114 2003–04 21.666666666666668 France
115 2004–05 16.333333333333332 France
116 2005–06 16.333333333333332 France
117 2006–07 13.333333333333334 France
118 2007–08 18.0 France
119 2008–09 19.333333333333332 France
120 2009–10 16.666666666666668 France
121 2010–11 21.333333333333332 France
122 2011–12 20.666666666666668 France
123 2012–13 22.666666666666668 France
124 2013–14 19.333333333333332 France
125 2014–15 22.333333333333332 France
126 2015–16 26.0 France
127 2016–17 28.0 France
128 2017–18 23.0 France
129 2018–19 24.333333333333332 France
130 2019–20 17.333333333333332 France
131 2020–21 22.333333333333332 France
132 2021–22 24.666666666666668 France
133 2022–23 26.666666666666668 France
134 2023–24 21.666666666666668 France
135 2024–25 19.666666666666668 France
136 2025–26 17.666666666666668 France
137 1999–20 27.0 Portugal
138 2000–01 19.666666666666668 Portugal
139 2001–02 27.333333333333332 Portugal
140 2002–03 17.333333333333332 Portugal
141 2003–04 17.666666666666668 Portugal
142 2004–05 18.0 Portugal
143 2005–06 15.666666666666666 Portugal
144 2006–07 12.666666666666666 Portugal
145 2007–08 16.333333333333332 Portugal
146 2008–09 18.0 Portugal
147 2009–10 21.333333333333332 Portugal
148 2010–11 18.333333333333332 Portugal
149 2011–12 18.666666666666668 Portugal
150 2012–13 21.0 Portugal
151 2013–14 17.0 Portugal
152 2014–15 20.0 Portugal
153 2015–16 26.333333333333332 Portugal
154 2016–17 23.0 Portugal
155 2017–18 27.666666666666668 Portugal
156 2018–19 20.0 Portugal
157 2019–20 18.0 Portugal
158 2020–21 20.333333333333332 Portugal
159 2021–22 21.666666666666668 Portugal
160 2022–23 19.333333333333332 Portugal
161 2023–24 23.333333333333332 Portugal
162 2024–25 25.666666666666668 Portugal
163 2025–26 23.333333333333332 Portugal
@@ -0,0 +1,163 @@
Season,Average_number_of_players,Country
199920,27.71428571,England
200001,27.16666667,England
200102,24.85714286,England
200203,26.25,England
200304,25.25,England
200405,27.33333333,England
200506,27.28571429,England
200607,27.375,England
200708,26.25,England
200809,27.88888889,England
200910,28.57142857,England
201011,28.14285714,England
201112,28,England
201213,27.14285714,England
201314,27.33333333,England
201415,26.71428571,England
201516,27.875,England
201617,27,England
201718,27.14285714,England
201819,25,England
201920,26.14285714,England
202021,26.85714286,England
202122,26.57142857,England
202223,27.14285714,England
202324,28.75,England
202425,28.28571429,England
202526,28.22222222,England
199920,26,Spain
200001,24,Spain
200102,26.8,Spain
200203,28.2,Spain
200304,25.5,Spain
200405,26.85714286,Spain
200506,28.75,Spain
200607,25.4,Spain
200708,27.28571429,Spain
200809,28.5,Spain
200910,26.83333333,Spain
201011,28.33333333,Spain
201112,26.33333333,Spain
201213,26.5,Spain
201314,27.8,Spain
201415,25.66666667,Spain
201516,27.16666667,Spain
201617,26,Spain
201718,27.5,Spain
201819,27,Spain
201920,27.6,Spain
202021,29,Spain
202122,32.6,Spain
202223,30.4,Spain
202324,30.8,Spain
202425,30,Spain
202526,30.83333333,Spain
199920,26,Germany
200001,28,Germany
200102,24.5,Germany
200203,25.5,Germany
200304,24.33333333,Germany
200405,24.66666667,Germany
200506,24.5,Germany
200607,28,Germany
200708,26.33333333,Germany
200809,26.16666667,Germany
200910,27,Germany
201011,27,Germany
201112,24.66666667,Germany
201213,24.6,Germany
201314,28,Germany
201415,24.5,Germany
201516,27.2,Germany
201617,26.5,Germany
201718,27.6,Germany
201819,27,Germany
201920,26.8,Germany
202021,25,Germany
202122,29.75,Germany
202223,27.4,Germany
202324,29.25,Germany
202425,28,Germany
202526,27,Germany
199920,24.33333333,Italy
200001,25,Italy
200102,24,Italy
200203,29.75,Italy
200304,24.33333333,Italy
200405,27.66666667,Italy
200506,25,Italy
200607,28,Italy
200708,24.75,Italy
200809,29,Italy
200910,29,Italy
201011,30.5,Italy
201112,30.66666667,Italy
201213,28.5,Italy
201314,29,Italy
201415,30.33333333,Italy
201516,30,Italy
201617,24.5,Italy
201718,24.66666667,Italy
201819,26.66666667,Italy
201920,29.33333333,Italy
202021,30,Italy
202122,29.66666667,Italy
202223,29.66666667,Italy
202324,32.5,Italy
202425,30.66666667,Italy
202526,28,Italy
199920,26.33333333,France
200001,26.8,France
200102,27.5,France
200203,25.8,France
200304,27.57142857,France
200405,25.2,France
200506,27.33333333,France
200607,25.14285714,France
200708,27.28571429,France
200809,25.71428571,France
200910,26.25,France
201011,25,France
201112,26.8,France
201213,28.25,France
201314,27,France
201415,25,France
201516,30.5,France
201617,29,France
201718,29,France
201819,30.33333333,France
201920,28.75,France
202021,31.2,France
202122,29.6,France
202223,29.66666667,France
202324,28.8,France
202425,30.2,France
202526,33.2,France
199920,29,Portugal
200001,26,Portugal
200102,29,Portugal
200203,29.5,Portugal
200304,32,Portugal
200405,32,Portugal
200506,29,Portugal
200607,31,Portugal
200708,28,Portugal
200809,27,Portugal
200910,28,Portugal
201011,26,Portugal
201112,30,Portugal
201213,26.5,Portugal
201314,31,Portugal
201415,26.5,Portugal
201516,29.5,Portugal
201617,28.33333333,Portugal
201718,30,Portugal
201819,30,Portugal
201920,28,Portugal
202021,30.5,Portugal
202122,31.66666667,Portugal
202223,30,Portugal
202324,31.5,Portugal
202425,32,Portugal
202526,33.5,Portugal
1 Season Average_number_of_players Country
2 1999–20 27.71428571 England
3 2000–01 27.16666667 England
4 2001–02 24.85714286 England
5 2002–03 26.25 England
6 2003–04 25.25 England
7 2004–05 27.33333333 England
8 2005–06 27.28571429 England
9 2006–07 27.375 England
10 2007–08 26.25 England
11 2008–09 27.88888889 England
12 2009–10 28.57142857 England
13 2010–11 28.14285714 England
14 2011–12 28 England
15 2012–13 27.14285714 England
16 2013–14 27.33333333 England
17 2014–15 26.71428571 England
18 2015–16 27.875 England
19 2016–17 27 England
20 2017–18 27.14285714 England
21 2018–19 25 England
22 2019–20 26.14285714 England
23 2020–21 26.85714286 England
24 2021–22 26.57142857 England
25 2022–23 27.14285714 England
26 2023–24 28.75 England
27 2024–25 28.28571429 England
28 2025–26 28.22222222 England
29 1999–20 26 Spain
30 2000–01 24 Spain
31 2001–02 26.8 Spain
32 2002–03 28.2 Spain
33 2003–04 25.5 Spain
34 2004–05 26.85714286 Spain
35 2005–06 28.75 Spain
36 2006–07 25.4 Spain
37 2007–08 27.28571429 Spain
38 2008–09 28.5 Spain
39 2009–10 26.83333333 Spain
40 2010–11 28.33333333 Spain
41 2011–12 26.33333333 Spain
42 2012–13 26.5 Spain
43 2013–14 27.8 Spain
44 2014–15 25.66666667 Spain
45 2015–16 27.16666667 Spain
46 2016–17 26 Spain
47 2017–18 27.5 Spain
48 2018–19 27 Spain
49 2019–20 27.6 Spain
50 2020–21 29 Spain
51 2021–22 32.6 Spain
52 2022–23 30.4 Spain
53 2023–24 30.8 Spain
54 2024–25 30 Spain
55 2025–26 30.83333333 Spain
56 1999–20 26 Germany
57 2000–01 28 Germany
58 2001–02 24.5 Germany
59 2002–03 25.5 Germany
60 2003–04 24.33333333 Germany
61 2004–05 24.66666667 Germany
62 2005–06 24.5 Germany
63 2006–07 28 Germany
64 2007–08 26.33333333 Germany
65 2008–09 26.16666667 Germany
66 2009–10 27 Germany
67 2010–11 27 Germany
68 2011–12 24.66666667 Germany
69 2012–13 24.6 Germany
70 2013–14 28 Germany
71 2014–15 24.5 Germany
72 2015–16 27.2 Germany
73 2016–17 26.5 Germany
74 2017–18 27.6 Germany
75 2018–19 27 Germany
76 2019–20 26.8 Germany
77 2020–21 25 Germany
78 2021–22 29.75 Germany
79 2022–23 27.4 Germany
80 2023–24 29.25 Germany
81 2024–25 28 Germany
82 2025–26 27 Germany
83 1999–20 24.33333333 Italy
84 2000–01 25 Italy
85 2001–02 24 Italy
86 2002–03 29.75 Italy
87 2003–04 24.33333333 Italy
88 2004–05 27.66666667 Italy
89 2005–06 25 Italy
90 2006–07 28 Italy
91 2007–08 24.75 Italy
92 2008–09 29 Italy
93 2009–10 29 Italy
94 2010–11 30.5 Italy
95 2011–12 30.66666667 Italy
96 2012–13 28.5 Italy
97 2013–14 29 Italy
98 2014–15 30.33333333 Italy
99 2015–16 30 Italy
100 2016–17 24.5 Italy
101 2017–18 24.66666667 Italy
102 2018–19 26.66666667 Italy
103 2019–20 29.33333333 Italy
104 2020–21 30 Italy
105 2021–22 29.66666667 Italy
106 2022–23 29.66666667 Italy
107 2023–24 32.5 Italy
108 2024–25 30.66666667 Italy
109 2025–26 28 Italy
110 1999–20 26.33333333 France
111 2000–01 26.8 France
112 2001–02 27.5 France
113 2002–03 25.8 France
114 2003–04 27.57142857 France
115 2004–05 25.2 France
116 2005–06 27.33333333 France
117 2006–07 25.14285714 France
118 2007–08 27.28571429 France
119 2008–09 25.71428571 France
120 2009–10 26.25 France
121 2010–11 25 France
122 2011–12 26.8 France
123 2012–13 28.25 France
124 2013–14 27 France
125 2014–15 25 France
126 2015–16 30.5 France
127 2016–17 29 France
128 2017–18 29 France
129 2018–19 30.33333333 France
130 2019–20 28.75 France
131 2020–21 31.2 France
132 2021–22 29.6 France
133 2022–23 29.66666667 France
134 2023–24 28.8 France
135 2024–25 30.2 France
136 2025–26 33.2 France
137 1999–20 29 Portugal
138 2000–01 26 Portugal
139 2001–02 29 Portugal
140 2002–03 29.5 Portugal
141 2003–04 32 Portugal
142 2004–05 32 Portugal
143 2005–06 29 Portugal
144 2006–07 31 Portugal
145 2007–08 28 Portugal
146 2008–09 27 Portugal
147 2009–10 28 Portugal
148 2010–11 26 Portugal
149 2011–12 30 Portugal
150 2012–13 26.5 Portugal
151 2013–14 31 Portugal
152 2014–15 26.5 Portugal
153 2015–16 29.5 Portugal
154 2016–17 28.33333333 Portugal
155 2017–18 30 Portugal
156 2018–19 30 Portugal
157 2019–20 28 Portugal
158 2020–21 30.5 Portugal
159 2021–22 31.66666667 Portugal
160 2022–23 30 Portugal
161 2023–24 31.5 Portugal
162 2024–25 32 Portugal
163 2025–26 33.5 Portugal
@@ -0,0 +1,433 @@
Season,Team,European_performance,Country,Competition
202526,Paris Saint-Germain,20,France,CL
202526,Arsenal,16,England,CL
202526,Atlético Madrid,12,Spain,CL
202526,Bayern Munich,12,Germany,CL
202526,Aston Villa,10,England,EL
202526,Freiburg,8,Germany,EL
202526,Barcelona,8,Spain,CL
202526,Liverpool,8,England,CL
202526,Real Madrid,8,Spain,CL
202526,Sporting CP,8,Portugal,CL
202526,Nottingham Forest,6,England,EL
202526,Braga,6,Portugal,EL
202526,Celta Vigo,4,Spain,EL
202526,Real Betis,4,Spain,EL
202526,Bologna,4,Italy,EL
202526,Porto,4,Portugal,EL
202425,Paris Saint-Germain,20,France,CL
202425,Internazionale,16,Italy,CL
202425,Arsenal,12,England,CL
202425,Barcelona,12,Spain,CL
202425,Tottenham Hotspur,10,England,EL
202425,Manchester United,8,England,EL
202425,Aston Villa,8,England,CL
202425,Real Madrid,8,Spain,CL
202425,Borussia Dortmund,8,Germany,CL
202425,Bayern Munich,8,Germany,CL
202425,Bodo/Glimt,6,Norway,EL
202425,Athletic Bilbao,6,Spain,EL
202425,Lazio,4,Italy,EL
202425,Lyon,4,France,EL
202425,Rangers,4,Scotland,EL
202425,Eintracht Frankfurt,4,Germany,EL
202324,Real Madrid,20,Spain,CL
202324,Borussia Dortmund,16,Germany,CL
202324,Paris Saint-Germain,12,France,CL
202324,Bayern Munich,12,Germany,CL
202324,Atalanta,10,Italy,EL
202324,Arsenal,8,England,CL
202324,Atlético Madrid,8,Spain,CL
202324,Manchester City,8,England,CL
202324,Barcelona,8,Spain,CL
202324,Bayer Leverkusen,8,Germany,EL
202324,Marseille,6,France,EL
202324,Roma,6,Italy,EL
202324,Milan,4,Italy,EL
202324,Liverpool,4,England,EL
202324,West Ham United,4,England,EL
202324,Benfica,4,Portugal,EL
202223,Manchester City,20,England,CL
202223,Internazionale,16,Italy,CL
202223,Milan,12,Italy,CL
202223,Real Madrid,12,Spain,CL
202223,Sevilla,10,Spain,EL
202223,Chelsea,8,England,CL
202223,Benfica,8,Portugal,CL
202223,Bayern Munich,8,Germany,CL
202223,Napoli,8,Italy,CL
202223,Roma,8,Italy,EL
202223,Juventus,6,Italy,EL
202223,Bayer Leverkusen,6,Germany,EL
202223,Manchester United,4,England,EL
202223,Sporting CP,4,Portugal,EL
202223,Union Saint-Gilloise,4,Belgium,EL
202223,Feyenoord,4,Netherlands,EL
202122,Real Madrid,20,Spain,CL
202122,Liverpool,16,England,CL
202122,Manchester City,12,England,CL
202122,Villarreal,12,Spain,CL
202122,Eintracht Frankfurt,10,Germany,EL
202122,Chelsea,8,England,CL
202122,Atlético Madrid,8,Spain,CL
202122,Bayern Munich,8,Germany,CL
202122,Benfica,8,Portugal,CL
202122,Rangers,8,Scotland,EL
202122,RB Leipzig,6,Germany,EL
202122,West Ham United,6,England,EL
202122,Atalanta,4,Italy,EL
202122,Barcelona,4,Spain,EL
202122,Lyon,4,France,EL
202122,Braga,4,Portugal,EL
202021,Chelsea,20,England,CL
202021,Manchester City,16,England,CL
202021,Paris Saint-Germain,12,France,CL
202021,Real Madrid,12,Spain,CL
202021,Villarreal,10,Spain,EL
202021,Borussia Dortmund,8,Germany,CL
202021,Porto,8,Portugal,CL
202021,Bayern Munich,8,Germany,CL
202021,Liverpool,8,England,CL
202021,Manchester United,8,England,EL
202021,Roma,6,Italy,EL
202021,Arsenal,6,England,EL
202021,Granada,4,Spain,EL
202021,Slavia Prague,4,Czech Republic,EL
202021,Ajax,4,Netherlands,EL
202021,Dinamo Zagreb,4,Croatia,EL
201920,Bayern Munich,20,Germany,CL
201920,Paris Saint-Germain,16,France,CL
201920,Lyon,12,France,CL
201920,RB Leipzig,12,Germany,CL
201920,Sevilla,10,Spain,EL
201920,Manchester City,8,England,CL
201920,Atlético Madrid,8,Spain,CL
201920,Barcelona,8,Spain,CL
201920,Atalanta,8,Italy,CL
201920,Internazionale,8,Italy,EL
201920,Manchester United,6,England,EL
201920,Shakhtar Donetsk,6,Ukraine,EL
201920,Basel,4,Switzerland,EL
201920,Copenhagen,4,Denmark,EL
201920,Bayer Leverkusen,4,Germany,EL
201920,Wolverhampton Wanderers,4,England,EL
201819,Liverpool,20,England,CL
201819,Tottenham Hotspur,16,England,CL
201819,Ajax,12,Netherlands,CL
201819,Barcelona,12,Spain,CL
201819,Chelsea,10,England,EL
201819,Juventus,8,Italy,CL
201819,Porto,8,Portugal,CL
201819,Manchester City,8,England,CL
201819,Manchester United,8,England,CL
201819,Arsenal,8,England,EL
201819,Valencia,6,Spain,EL
201819,Eintracht Frankfurt,6,Germany,EL
201819,Napoli,4,Italy,EL
201819,Villarreal,4,Spain,EL
201819,Benfica,4,Portugal,EL
201819,Slavia Prague,4,Czech Republic,EL
201718,Real Madrid,20,Spain,CL
201718,Liverpool,16,England,CL
201718,Bayern Munich,12,Germany,CL
201718,Roma,12,Italy,CL
201718,Atlético Madrid,10,Spain,EL
201718,Barcelona,8,Spain,CL
201718,Sevilla,8,Spain,CL
201718,Juventus,8,Italy,CL
201718,Manchester City,8,England,CL
201718,Marseille,8,France,EL
201718,Red Bull Salzburg,6,Austria,EL
201718,Arsenal,6,England,EL
201718,RB Leipzig,4,Germany,EL
201718,CSKA Moscow,4,Russia,EL
201718,Sporting CP,4,Portugal,EL
201718,Lazio,4,Italy,EL
201617,Real Madrid,20,Spain,CL
201617,Juventus,16,Italy,CL
201617,Atlético Madrid,12,Spain,CL
201617,Monaco,12,France,CL
201617,Manchester United,10,England,EL
201617,Leicester City,8,England,CL
201617,Borussia Dortmund,8,Germany,CL
201617,Bayern Munich,8,Germany,CL
201617,Barcelona,8,Spain,CL
201617,Ajax,8,Netherlands,EL
201617,Lyon,6,France,EL
201617,Celta Vigo,6,Spain,EL
201617,Anderlecht,4,Belgium,EL
201617,Genk,4,Belgium,EL
201617,Schalke 04,4,Germany,EL
201617,Beşiktaş,4,Turkey,EL
201516,Real Madrid,20,Spain,CL
201516,Atlético Madrid,16,Spain,CL
201516,Manchester City,12,England,CL
201516,Bayern Munich,12,Germany,CL
201516,Sevilla,10,Spain,EL
201516,VfL Wolfsburg,8,Germany,CL
201516,Benfica,8,Portugal,CL
201516,Barcelona,8,Spain,CL
201516,Paris Saint-Germain,8,France,CL
201516,Liverpool,8,England,EL
201516,Shakhtar Donetsk,6,Ukraine,EL
201516,Villarreal,6,Spain,EL
201516,Braga,4,Portugal,EL
201516,Sparta Prague,4,Czech Republic,EL
201516,Athletic Bilbao,4,Spain,EL
201516,Borussia Dortmund,4,Germany,EL
201415,Barcelona,20,Spain,CL
201415,Juventus,16,Italy,CL
201415,Bayern Munich,12,Germany,CL
201415,Real Madrid,12,Spain,CL
201415,Sevilla,10,Spain,EL
201415,Paris Saint-Germain,8,France,CL
201415,Atlético Madrid,8,Spain,CL
201415,Porto,8,Portugal,CL
201415,Monaco,8,France,CL
201415,Dnipro Dnipropetrovsk,8,Ukraine,EL
201415,Napoli,6,Italy,EL
201415,Fiorentina,6,Italy,EL
201415,Zenit Saint Petersburg,4,Russia,EL
201415,Club Brugge,4,Belgium,EL
201415,Dynamo Kyiv,4,Ukraine,EL
201415,VfL Wolfsburg,4,Germany,EL
201314,Real Madrid,20,Spain,CL
201314,Atlético Madrid,16,Spain,CL
201314,Bayern Munich,12,Germany,CL
201314,Chelsea,12,England,CL
201314,Sevilla,10,Spain,EL
201314,Barcelona,8,Spain,CL
201314,Borussia Dortmund,8,Germany,CL
201314,Paris Saint-Germain,8,France,CL
201314,Manchester United,8,England,CL
201314,Benfica,8,Portugal,EL
201314,Valencia,6,Spain,EL
201314,Juventus,6,Italy,EL
201314,AZ,4,Netherlands,EL
201314,Lyon,4,France,EL
201314,Basel,4,Switzerland,EL
201314,Porto,4,Portugal,EL
201213,Bayern Munich,20,Germany,CL
201213,Borussia Dortmund,16,Germany,CL
201213,Barcelona,12,Spain,CL
201213,Real Madrid,12,Spain,CL
201213,Chelsea,10,England,EL
201213,Málaga,8,Spain,CL
201213,Galatasaray,8,Turkey,CL
201213,Paris Saint-Germain,8,France,CL
201213,Juventus,8,Italy,CL
201213,Benfica,8,Portugal,EL
201213,Fenerbahçe,6,Turkey,EL
201213,Basel,6,Switzerland,EL
201213,Rubin Kazan,4,Russia,EL
201213,Tottenham Hotspur,4,England,EL
201213,Lazio,4,Italy,EL
201213,Newcastle United,4,England,EL
201112,Chelsea,20,England,CL
201112,Bayern Munich,16,Germany,CL
201112,Real Madrid,12,Spain,CL
201112,Barcelona,12,Spain,CL
201112,Atlético Madrid,10,Spain,EL
201112,APOEL,8,Cyprus,CL
201112,Marseille,8,France,CL
201112,Benfica,8,Portugal,CL
201112,Milan,8,Italy,CL
201112,Athletic Bilbao,8,Spain,EL
201112,Valencia,6,Spain,EL
201112,Sporting CP,6,Portugal,EL
201112,AZ,4,Netherlands,EL
201112,Schalke 04,4,Germany,EL
201112,Metalist Kharkiv,4,Ukraine,EL
201112,Hannover 96,4,Germany,EL
201011,Barcelona,20,Spain,CL
201011,Manchester United,16,England,CL
201011,Schalke 04,12,Germany,CL
201011,Real Madrid,12,Spain,CL
201011,Porto,10,Portugal,EL
201011,Tottenham Hotspur,8,England,CL
201011,Chelsea,8,England,CL
201011,Shakhtar Donetsk,8,Ukraine,CL
201011,Internazionale,8,Italy,CL
201011,Braga,8,Portugal,EL
201011,Benfica,6,Portugal,EL
201011,Villarreal,6,Spain,EL
201011,Spartak Moscow,4,Russia,EL
201011,PSV Eindhoven,4,Netherlands,EL
201011,Twente,4,Netherlands,EL
201011,Dynamo Kyiv,4,Ukraine,EL
200910,Internazionale,20,Italy,CL
200910,Bayern Munich,16,Germany,CL
200910,Lyon,12,France,CL
200910,Barcelona,12,Spain,CL
200910,Atlético Madrid,10,Spain,EL
200910,Bordeaux,8,France,CL
200910,Manchester United,8,England,CL
200910,Arsenal,8,England,CL
200910,CSKA Moscow,8,Russia,CL
200910,Fulham,8,England,EL
200910,Hamburg,6,Germany,EL
200910,Liverpool,6,England,EL
200910,VfL Wolfsburg,4,Germany,EL
200910,Standard Liège,4,Belgium,EL
200910,Valencia,4,Spain,EL
200910,Benfica,4,Portugal,EL
200809,Barcelona,20,Spain,CL
200809,Manchester United,16,England,CL
200809,Arsenal,12,England,CL
200809,Chelsea,12,England,CL
200809,Shakhtar Donetsk,10,Ukraine,EL
200809,Villarreal,8,Spain,CL
200809,Porto,8,Portugal,CL
200809,Liverpool,8,England,CL
200809,Bayern Munich,8,Germany,CL
200809,Werder Bremen,8,Germany,EL
200809,Hamburg,6,Germany,EL
200809,Dynamo Kyiv,6,Ukraine,EL
200809,Manchester City,4,England,EL
200809,Paris Saint-Germain,4,France,EL
200809,Marseille,4,France,EL
200809,Udinese,4,Italy,EL
200708,Manchester United,20,England,CL
200708,Chelsea,16,England,CL
200708,Liverpool,12,England,CL
200708,Barcelona,12,Spain,CL
200708,Zenit Saint Petersburg,10,Russia,EL
200708,Arsenal,8,England,CL
200708,Roma,8,Italy,CL
200708,Schalke 04,8,Germany,CL
200708,Fenerbahçe,8,Turkey,CL
200708,Rangers,8,Scotland,EL
200708,Bayern Munich,6,Germany,EL
200708,Fiorentina,6,Italy,EL
200708,Bayer Leverkusen,4,Germany,EL
200708,Sporting CP,4,Portugal,EL
200708,Getafe,4,Spain,EL
200708,PSV Eindhoven,4,Netherlands,EL
200607,Milan,20,Italy,CL
200607,Liverpool,16,England,CL
200607,Chelsea,12,England,CL
200607,Manchester United,12,England,CL
200607,Sevilla,10,Spain,EL
200607,Bayern Munich,8,Germany,CL
200607,PSV Eindhoven,8,Netherlands,CL
200607,Roma,8,Italy,CL
200607,Valencia,8,Spain,CL
200607,Espanyol,8,Spain,EL
200607,Werder Bremen,6,Germany,EL
200607,Osasuna,6,Spain,EL
200607,AZ,4,Netherlands,EL
200607,Bayer Leverkusen,4,Germany,EL
200607,Tottenham Hotspur,4,England,EL
200607,Benfica,4,Portugal,EL
200506,Barcelona,20,Spain,CL
200506,Arsenal,16,England,CL
200506,Villarreal,12,Spain,CL
200506,Milan,12,Italy,CL
200506,Sevilla,10,Spain,EL
200506,Juventus,8,Italy,CL
200506,Lyon,8,France,CL
200506,Internazionale,8,Italy,CL
200506,Benfica,8,Portugal,CL
200506,Middlesbrough,8,England,EL
200506,Schalke 04,6,Germany,EL
200506,Steaua București,6,Romania,EL
200506,Zenit Saint Petersburg,4,Russia,EL
200506,Basel,4,Switzerland,EL
200506,Rapid București,4,Romania,EL
200506,Levski Sofia,4,Bulgaria,EL
200405,Liverpool,20,England,CL
200405,Milan,16,Italy,CL
200405,Chelsea,12,England,CL
200405,PSV Eindhoven,12,Netherlands,CL
200405,CSKA Moscow,10,Russia,EL
200405,Juventus,8,Italy,CL
200405,Lyon,8,France,CL
200405,Bayern Munich,8,Germany,CL
200405,Internazionale,8,Italy,CL
200405,Sporting CP,8,Portugal,EL
200405,AZ,6,Netherlands,EL
200405,Parma,6,Italy,EL
200405,Newcastle United,4,England,EL
200405,Villarreal,4,Spain,EL
200405,Austria Wien,4,Austria,EL
200405,Auxerre,4,France,EL
200304,Porto,20,Portugal,CL
200304,Monaco,16,France,CL
200304,Chelsea,12,England,CL
200304,Deportivo La Coruña,12,Spain,CL
200304,Valencia,10,Spain,EL
200304,Arsenal,8,England,CL
200304,Milan,8,Italy,CL
200304,Lyon,8,France,CL
200304,Real Madrid,8,Spain,CL
200304,Marseille,8,France,EL
200304,Newcastle United,6,England,EL
200304,Villarreal,6,Spain,EL
200304,Bordeaux,4,France,EL
200304,Internazionale,4,Italy,EL
200304,Celtic,4,Scotland,EL
200304,PSV Eindhoven,4,Netherlands,EL
200203,Milan,20,Italy,CL
200203,Juventus,16,Italy,CL
200203,Real Madrid,12,Spain,CL
200203,Internazionale,12,Italy,CL
200203,Porto,10,Portugal,EL
200203,Manchester United,8,England,CL
200203,Ajax,8,Netherlands,CL
200203,Valencia,8,Spain,CL
200203,Barcelona,8,Spain,CL
200203,Celtic,8,Scotland,EL
200203,Lazio,6,Italy,EL
200203,Boavista,6,Portugal,EL
200203,Panathinaikos,4,Greece,EL
200203,Beşiktaş,4,Turkey,EL
200203,Liverpool,4,England,EL
200203,Málaga,4,Spain,EL
200102,Real Madrid,20,Spain,CL
200102,Bayer Leverkusen,16,Germany,CL
200102,Barcelona,12,Spain,CL
200102,Manchester United,12,England,CL
200102,Feyenoord,10,Netherlands,EL
200102,Panathinaikos,8,Greece,CL
200102,Bayern Munich,8,Germany,CL
200102,Deportivo La Coruña,8,Spain,CL
200102,Liverpool,8,England,CL
200102,Borussia Dortmund,8,Germany,EL
200102,Internazionale,6,Italy,EL
200102,Milan,6,Italy,EL
200102,Valencia,4,Spain,EL
200102,PSV Eindhoven,4,Netherlands,EL
200102,Slovan Liberec,4,Czech Republic,EL
200102,Hapoel Tel Aviv,4,Israel,EL
200001,Bayern Munich,20,Germany,CL
200001,Valencia,16,Spain,CL
200001,Leeds United,12,England,CL
200001,Real Madrid,12,Spain,CL
200001,Liverpool,10,England,EL
200001,Deportivo La Coruña,8,Spain,CL
200001,Arsenal,8,England,CL
200001,Galatasaray,8,Turkey,CL
200001,Manchester United,8,England,CL
200001,Deportivo Alavés,8,Spain,EL
200001,Kaiserslautern,6,Germany,EL
200001,Barcelona,6,Spain,EL
200001,Celta Vigo,4,Spain,EL
200001,Porto,4,Portugal,EL
200001,Rayo Vallecano,4,Spain,EL
200001,PSV Eindhoven,4,Netherlands,EL
199920,Real Madrid,20,Spain,CL
199920,Valencia,16,Spain,CL
199920,Barcelona,12,Spain,CL
199920,Bayern Munich,12,Germany,CL
199920,Galatasaray,10,Turkey,EL
199920,Manchester United,8,England,CL
199920,Porto,8,Portugal,CL
199920,Chelsea,8,England,CL
199920,Lazio,8,Italy,CL
199920,Arsenal,8,England,EL
199920,Leeds United,6,England,EL
199920,Lens,6,France,EL
199920,Slavia Prague,4,Czech Republic,EL
199920,Werder Bremen,4,Germany,EL
199920,Mallorca,4,Spain,EL
199920,Celta Vigo,4,Spain,EL
1 Season Team European_performance Country Competition
2 2025–26 Paris Saint-Germain 20 France CL
3 2025–26 Arsenal 16 England CL
4 2025–26 Atlético Madrid 12 Spain CL
5 2025–26 Bayern Munich 12 Germany CL
6 2025–26 Aston Villa 10 England EL
7 2025–26 Freiburg 8 Germany EL
8 2025–26 Barcelona 8 Spain CL
9 2025–26 Liverpool 8 England CL
10 2025–26 Real Madrid 8 Spain CL
11 2025–26 Sporting CP 8 Portugal CL
12 2025–26 Nottingham Forest 6 England EL
13 2025–26 Braga 6 Portugal EL
14 2025–26 Celta Vigo 4 Spain EL
15 2025–26 Real Betis 4 Spain EL
16 2025–26 Bologna 4 Italy EL
17 2025–26 Porto 4 Portugal EL
18 2024–25 Paris Saint-Germain 20 France CL
19 2024–25 Internazionale 16 Italy CL
20 2024–25 Arsenal 12 England CL
21 2024–25 Barcelona 12 Spain CL
22 2024–25 Tottenham Hotspur 10 England EL
23 2024–25 Manchester United 8 England EL
24 2024–25 Aston Villa 8 England CL
25 2024–25 Real Madrid 8 Spain CL
26 2024–25 Borussia Dortmund 8 Germany CL
27 2024–25 Bayern Munich 8 Germany CL
28 2024–25 Bodo/Glimt 6 Norway EL
29 2024–25 Athletic Bilbao 6 Spain EL
30 2024–25 Lazio 4 Italy EL
31 2024–25 Lyon 4 France EL
32 2024–25 Rangers 4 Scotland EL
33 2024–25 Eintracht Frankfurt 4 Germany EL
34 2023–24 Real Madrid 20 Spain CL
35 2023–24 Borussia Dortmund 16 Germany CL
36 2023–24 Paris Saint-Germain 12 France CL
37 2023–24 Bayern Munich 12 Germany CL
38 2023–24 Atalanta 10 Italy EL
39 2023–24 Arsenal 8 England CL
40 2023–24 Atlético Madrid 8 Spain CL
41 2023–24 Manchester City 8 England CL
42 2023–24 Barcelona 8 Spain CL
43 2023–24 Bayer Leverkusen 8 Germany EL
44 2023–24 Marseille 6 France EL
45 2023–24 Roma 6 Italy EL
46 2023–24 Milan 4 Italy EL
47 2023–24 Liverpool 4 England EL
48 2023–24 West Ham United 4 England EL
49 2023–24 Benfica 4 Portugal EL
50 2022–23 Manchester City 20 England CL
51 2022–23 Internazionale 16 Italy CL
52 2022–23 Milan 12 Italy CL
53 2022–23 Real Madrid 12 Spain CL
54 2022–23 Sevilla 10 Spain EL
55 2022–23 Chelsea 8 England CL
56 2022–23 Benfica 8 Portugal CL
57 2022–23 Bayern Munich 8 Germany CL
58 2022–23 Napoli 8 Italy CL
59 2022–23 Roma 8 Italy EL
60 2022–23 Juventus 6 Italy EL
61 2022–23 Bayer Leverkusen 6 Germany EL
62 2022–23 Manchester United 4 England EL
63 2022–23 Sporting CP 4 Portugal EL
64 2022–23 Union Saint-Gilloise 4 Belgium EL
65 2022–23 Feyenoord 4 Netherlands EL
66 2021–22 Real Madrid 20 Spain CL
67 2021–22 Liverpool 16 England CL
68 2021–22 Manchester City 12 England CL
69 2021–22 Villarreal 12 Spain CL
70 2021–22 Eintracht Frankfurt 10 Germany EL
71 2021–22 Chelsea 8 England CL
72 2021–22 Atlético Madrid 8 Spain CL
73 2021–22 Bayern Munich 8 Germany CL
74 2021–22 Benfica 8 Portugal CL
75 2021–22 Rangers 8 Scotland EL
76 2021–22 RB Leipzig 6 Germany EL
77 2021–22 West Ham United 6 England EL
78 2021–22 Atalanta 4 Italy EL
79 2021–22 Barcelona 4 Spain EL
80 2021–22 Lyon 4 France EL
81 2021–22 Braga 4 Portugal EL
82 2020–21 Chelsea 20 England CL
83 2020–21 Manchester City 16 England CL
84 2020–21 Paris Saint-Germain 12 France CL
85 2020–21 Real Madrid 12 Spain CL
86 2020–21 Villarreal 10 Spain EL
87 2020–21 Borussia Dortmund 8 Germany CL
88 2020–21 Porto 8 Portugal CL
89 2020–21 Bayern Munich 8 Germany CL
90 2020–21 Liverpool 8 England CL
91 2020–21 Manchester United 8 England EL
92 2020–21 Roma 6 Italy EL
93 2020–21 Arsenal 6 England EL
94 2020–21 Granada 4 Spain EL
95 2020–21 Slavia Prague 4 Czech Republic EL
96 2020–21 Ajax 4 Netherlands EL
97 2020–21 Dinamo Zagreb 4 Croatia EL
98 2019–20 Bayern Munich 20 Germany CL
99 2019–20 Paris Saint-Germain 16 France CL
100 2019–20 Lyon 12 France CL
101 2019–20 RB Leipzig 12 Germany CL
102 2019–20 Sevilla 10 Spain EL
103 2019–20 Manchester City 8 England CL
104 2019–20 Atlético Madrid 8 Spain CL
105 2019–20 Barcelona 8 Spain CL
106 2019–20 Atalanta 8 Italy CL
107 2019–20 Internazionale 8 Italy EL
108 2019–20 Manchester United 6 England EL
109 2019–20 Shakhtar Donetsk 6 Ukraine EL
110 2019–20 Basel 4 Switzerland EL
111 2019–20 Copenhagen 4 Denmark EL
112 2019–20 Bayer Leverkusen 4 Germany EL
113 2019–20 Wolverhampton Wanderers 4 England EL
114 2018–19 Liverpool 20 England CL
115 2018–19 Tottenham Hotspur 16 England CL
116 2018–19 Ajax 12 Netherlands CL
117 2018–19 Barcelona 12 Spain CL
118 2018–19 Chelsea 10 England EL
119 2018–19 Juventus 8 Italy CL
120 2018–19 Porto 8 Portugal CL
121 2018–19 Manchester City 8 England CL
122 2018–19 Manchester United 8 England CL
123 2018–19 Arsenal 8 England EL
124 2018–19 Valencia 6 Spain EL
125 2018–19 Eintracht Frankfurt 6 Germany EL
126 2018–19 Napoli 4 Italy EL
127 2018–19 Villarreal 4 Spain EL
128 2018–19 Benfica 4 Portugal EL
129 2018–19 Slavia Prague 4 Czech Republic EL
130 2017–18 Real Madrid 20 Spain CL
131 2017–18 Liverpool 16 England CL
132 2017–18 Bayern Munich 12 Germany CL
133 2017–18 Roma 12 Italy CL
134 2017–18 Atlético Madrid 10 Spain EL
135 2017–18 Barcelona 8 Spain CL
136 2017–18 Sevilla 8 Spain CL
137 2017–18 Juventus 8 Italy CL
138 2017–18 Manchester City 8 England CL
139 2017–18 Marseille 8 France EL
140 2017–18 Red Bull Salzburg 6 Austria EL
141 2017–18 Arsenal 6 England EL
142 2017–18 RB Leipzig 4 Germany EL
143 2017–18 CSKA Moscow 4 Russia EL
144 2017–18 Sporting CP 4 Portugal EL
145 2017–18 Lazio 4 Italy EL
146 2016–17 Real Madrid 20 Spain CL
147 2016–17 Juventus 16 Italy CL
148 2016–17 Atlético Madrid 12 Spain CL
149 2016–17 Monaco 12 France CL
150 2016–17 Manchester United 10 England EL
151 2016–17 Leicester City 8 England CL
152 2016–17 Borussia Dortmund 8 Germany CL
153 2016–17 Bayern Munich 8 Germany CL
154 2016–17 Barcelona 8 Spain CL
155 2016–17 Ajax 8 Netherlands EL
156 2016–17 Lyon 6 France EL
157 2016–17 Celta Vigo 6 Spain EL
158 2016–17 Anderlecht 4 Belgium EL
159 2016–17 Genk 4 Belgium EL
160 2016–17 Schalke 04 4 Germany EL
161 2016–17 Beşiktaş 4 Turkey EL
162 2015–16 Real Madrid 20 Spain CL
163 2015–16 Atlético Madrid 16 Spain CL
164 2015–16 Manchester City 12 England CL
165 2015–16 Bayern Munich 12 Germany CL
166 2015–16 Sevilla 10 Spain EL
167 2015–16 VfL Wolfsburg 8 Germany CL
168 2015–16 Benfica 8 Portugal CL
169 2015–16 Barcelona 8 Spain CL
170 2015–16 Paris Saint-Germain 8 France CL
171 2015–16 Liverpool 8 England EL
172 2015–16 Shakhtar Donetsk 6 Ukraine EL
173 2015–16 Villarreal 6 Spain EL
174 2015–16 Braga 4 Portugal EL
175 2015–16 Sparta Prague 4 Czech Republic EL
176 2015–16 Athletic Bilbao 4 Spain EL
177 2015–16 Borussia Dortmund 4 Germany EL
178 2014–15 Barcelona 20 Spain CL
179 2014–15 Juventus 16 Italy CL
180 2014–15 Bayern Munich 12 Germany CL
181 2014–15 Real Madrid 12 Spain CL
182 2014–15 Sevilla 10 Spain EL
183 2014–15 Paris Saint-Germain 8 France CL
184 2014–15 Atlético Madrid 8 Spain CL
185 2014–15 Porto 8 Portugal CL
186 2014–15 Monaco 8 France CL
187 2014–15 Dnipro Dnipropetrovsk 8 Ukraine EL
188 2014–15 Napoli 6 Italy EL
189 2014–15 Fiorentina 6 Italy EL
190 2014–15 Zenit Saint Petersburg 4 Russia EL
191 2014–15 Club Brugge 4 Belgium EL
192 2014–15 Dynamo Kyiv 4 Ukraine EL
193 2014–15 VfL Wolfsburg 4 Germany EL
194 2013–14 Real Madrid 20 Spain CL
195 2013–14 Atlético Madrid 16 Spain CL
196 2013–14 Bayern Munich 12 Germany CL
197 2013–14 Chelsea 12 England CL
198 2013–14 Sevilla 10 Spain EL
199 2013–14 Barcelona 8 Spain CL
200 2013–14 Borussia Dortmund 8 Germany CL
201 2013–14 Paris Saint-Germain 8 France CL
202 2013–14 Manchester United 8 England CL
203 2013–14 Benfica 8 Portugal EL
204 2013–14 Valencia 6 Spain EL
205 2013–14 Juventus 6 Italy EL
206 2013–14 AZ 4 Netherlands EL
207 2013–14 Lyon 4 France EL
208 2013–14 Basel 4 Switzerland EL
209 2013–14 Porto 4 Portugal EL
210 2012–13 Bayern Munich 20 Germany CL
211 2012–13 Borussia Dortmund 16 Germany CL
212 2012–13 Barcelona 12 Spain CL
213 2012–13 Real Madrid 12 Spain CL
214 2012–13 Chelsea 10 England EL
215 2012–13 Málaga 8 Spain CL
216 2012–13 Galatasaray 8 Turkey CL
217 2012–13 Paris Saint-Germain 8 France CL
218 2012–13 Juventus 8 Italy CL
219 2012–13 Benfica 8 Portugal EL
220 2012–13 Fenerbahçe 6 Turkey EL
221 2012–13 Basel 6 Switzerland EL
222 2012–13 Rubin Kazan 4 Russia EL
223 2012–13 Tottenham Hotspur 4 England EL
224 2012–13 Lazio 4 Italy EL
225 2012–13 Newcastle United 4 England EL
226 2011–12 Chelsea 20 England CL
227 2011–12 Bayern Munich 16 Germany CL
228 2011–12 Real Madrid 12 Spain CL
229 2011–12 Barcelona 12 Spain CL
230 2011–12 Atlético Madrid 10 Spain EL
231 2011–12 APOEL 8 Cyprus CL
232 2011–12 Marseille 8 France CL
233 2011–12 Benfica 8 Portugal CL
234 2011–12 Milan 8 Italy CL
235 2011–12 Athletic Bilbao 8 Spain EL
236 2011–12 Valencia 6 Spain EL
237 2011–12 Sporting CP 6 Portugal EL
238 2011–12 AZ 4 Netherlands EL
239 2011–12 Schalke 04 4 Germany EL
240 2011–12 Metalist Kharkiv 4 Ukraine EL
241 2011–12 Hannover 96 4 Germany EL
242 2010–11 Barcelona 20 Spain CL
243 2010–11 Manchester United 16 England CL
244 2010–11 Schalke 04 12 Germany CL
245 2010–11 Real Madrid 12 Spain CL
246 2010–11 Porto 10 Portugal EL
247 2010–11 Tottenham Hotspur 8 England CL
248 2010–11 Chelsea 8 England CL
249 2010–11 Shakhtar Donetsk 8 Ukraine CL
250 2010–11 Internazionale 8 Italy CL
251 2010–11 Braga 8 Portugal EL
252 2010–11 Benfica 6 Portugal EL
253 2010–11 Villarreal 6 Spain EL
254 2010–11 Spartak Moscow 4 Russia EL
255 2010–11 PSV Eindhoven 4 Netherlands EL
256 2010–11 Twente 4 Netherlands EL
257 2010–11 Dynamo Kyiv 4 Ukraine EL
258 2009–10 Internazionale 20 Italy CL
259 2009–10 Bayern Munich 16 Germany CL
260 2009–10 Lyon 12 France CL
261 2009–10 Barcelona 12 Spain CL
262 2009–10 Atlético Madrid 10 Spain EL
263 2009–10 Bordeaux 8 France CL
264 2009–10 Manchester United 8 England CL
265 2009–10 Arsenal 8 England CL
266 2009–10 CSKA Moscow 8 Russia CL
267 2009–10 Fulham 8 England EL
268 2009–10 Hamburg 6 Germany EL
269 2009–10 Liverpool 6 England EL
270 2009–10 VfL Wolfsburg 4 Germany EL
271 2009–10 Standard Liège 4 Belgium EL
272 2009–10 Valencia 4 Spain EL
273 2009–10 Benfica 4 Portugal EL
274 2008–09 Barcelona 20 Spain CL
275 2008–09 Manchester United 16 England CL
276 2008–09 Arsenal 12 England CL
277 2008–09 Chelsea 12 England CL
278 2008–09 Shakhtar Donetsk 10 Ukraine EL
279 2008–09 Villarreal 8 Spain CL
280 2008–09 Porto 8 Portugal CL
281 2008–09 Liverpool 8 England CL
282 2008–09 Bayern Munich 8 Germany CL
283 2008–09 Werder Bremen 8 Germany EL
284 2008–09 Hamburg 6 Germany EL
285 2008–09 Dynamo Kyiv 6 Ukraine EL
286 2008–09 Manchester City 4 England EL
287 2008–09 Paris Saint-Germain 4 France EL
288 2008–09 Marseille 4 France EL
289 2008–09 Udinese 4 Italy EL
290 2007–08 Manchester United 20 England CL
291 2007–08 Chelsea 16 England CL
292 2007–08 Liverpool 12 England CL
293 2007–08 Barcelona 12 Spain CL
294 2007–08 Zenit Saint Petersburg 10 Russia EL
295 2007–08 Arsenal 8 England CL
296 2007–08 Roma 8 Italy CL
297 2007–08 Schalke 04 8 Germany CL
298 2007–08 Fenerbahçe 8 Turkey CL
299 2007–08 Rangers 8 Scotland EL
300 2007–08 Bayern Munich 6 Germany EL
301 2007–08 Fiorentina 6 Italy EL
302 2007–08 Bayer Leverkusen 4 Germany EL
303 2007–08 Sporting CP 4 Portugal EL
304 2007–08 Getafe 4 Spain EL
305 2007–08 PSV Eindhoven 4 Netherlands EL
306 2006–07 Milan 20 Italy CL
307 2006–07 Liverpool 16 England CL
308 2006–07 Chelsea 12 England CL
309 2006–07 Manchester United 12 England CL
310 2006–07 Sevilla 10 Spain EL
311 2006–07 Bayern Munich 8 Germany CL
312 2006–07 PSV Eindhoven 8 Netherlands CL
313 2006–07 Roma 8 Italy CL
314 2006–07 Valencia 8 Spain CL
315 2006–07 Espanyol 8 Spain EL
316 2006–07 Werder Bremen 6 Germany EL
317 2006–07 Osasuna 6 Spain EL
318 2006–07 AZ 4 Netherlands EL
319 2006–07 Bayer Leverkusen 4 Germany EL
320 2006–07 Tottenham Hotspur 4 England EL
321 2006–07 Benfica 4 Portugal EL
322 2005–06 Barcelona 20 Spain CL
323 2005–06 Arsenal 16 England CL
324 2005–06 Villarreal 12 Spain CL
325 2005–06 Milan 12 Italy CL
326 2005–06 Sevilla 10 Spain EL
327 2005–06 Juventus 8 Italy CL
328 2005–06 Lyon 8 France CL
329 2005–06 Internazionale 8 Italy CL
330 2005–06 Benfica 8 Portugal CL
331 2005–06 Middlesbrough 8 England EL
332 2005–06 Schalke 04 6 Germany EL
333 2005–06 Steaua București 6 Romania EL
334 2005–06 Zenit Saint Petersburg 4 Russia EL
335 2005–06 Basel 4 Switzerland EL
336 2005–06 Rapid București 4 Romania EL
337 2005–06 Levski Sofia 4 Bulgaria EL
338 2004–05 Liverpool 20 England CL
339 2004–05 Milan 16 Italy CL
340 2004–05 Chelsea 12 England CL
341 2004–05 PSV Eindhoven 12 Netherlands CL
342 2004–05 CSKA Moscow 10 Russia EL
343 2004–05 Juventus 8 Italy CL
344 2004–05 Lyon 8 France CL
345 2004–05 Bayern Munich 8 Germany CL
346 2004–05 Internazionale 8 Italy CL
347 2004–05 Sporting CP 8 Portugal EL
348 2004–05 AZ 6 Netherlands EL
349 2004–05 Parma 6 Italy EL
350 2004–05 Newcastle United 4 England EL
351 2004–05 Villarreal 4 Spain EL
352 2004–05 Austria Wien 4 Austria EL
353 2004–05 Auxerre 4 France EL
354 2003–04 Porto 20 Portugal CL
355 2003–04 Monaco 16 France CL
356 2003–04 Chelsea 12 England CL
357 2003–04 Deportivo La Coruña 12 Spain CL
358 2003–04 Valencia 10 Spain EL
359 2003–04 Arsenal 8 England CL
360 2003–04 Milan 8 Italy CL
361 2003–04 Lyon 8 France CL
362 2003–04 Real Madrid 8 Spain CL
363 2003–04 Marseille 8 France EL
364 2003–04 Newcastle United 6 England EL
365 2003–04 Villarreal 6 Spain EL
366 2003–04 Bordeaux 4 France EL
367 2003–04 Internazionale 4 Italy EL
368 2003–04 Celtic 4 Scotland EL
369 2003–04 PSV Eindhoven 4 Netherlands EL
370 2002–03 Milan 20 Italy CL
371 2002–03 Juventus 16 Italy CL
372 2002–03 Real Madrid 12 Spain CL
373 2002–03 Internazionale 12 Italy CL
374 2002–03 Porto 10 Portugal EL
375 2002–03 Manchester United 8 England CL
376 2002–03 Ajax 8 Netherlands CL
377 2002–03 Valencia 8 Spain CL
378 2002–03 Barcelona 8 Spain CL
379 2002–03 Celtic 8 Scotland EL
380 2002–03 Lazio 6 Italy EL
381 2002–03 Boavista 6 Portugal EL
382 2002–03 Panathinaikos 4 Greece EL
383 2002–03 Beşiktaş 4 Turkey EL
384 2002–03 Liverpool 4 England EL
385 2002–03 Málaga 4 Spain EL
386 2001–02 Real Madrid 20 Spain CL
387 2001–02 Bayer Leverkusen 16 Germany CL
388 2001–02 Barcelona 12 Spain CL
389 2001–02 Manchester United 12 England CL
390 2001–02 Feyenoord 10 Netherlands EL
391 2001–02 Panathinaikos 8 Greece CL
392 2001–02 Bayern Munich 8 Germany CL
393 2001–02 Deportivo La Coruña 8 Spain CL
394 2001–02 Liverpool 8 England CL
395 2001–02 Borussia Dortmund 8 Germany EL
396 2001–02 Internazionale 6 Italy EL
397 2001–02 Milan 6 Italy EL
398 2001–02 Valencia 4 Spain EL
399 2001–02 PSV Eindhoven 4 Netherlands EL
400 2001–02 Slovan Liberec 4 Czech Republic EL
401 2001–02 Hapoel Tel Aviv 4 Israel EL
402 2000–01 Bayern Munich 20 Germany CL
403 2000–01 Valencia 16 Spain CL
404 2000–01 Leeds United 12 England CL
405 2000–01 Real Madrid 12 Spain CL
406 2000–01 Liverpool 10 England EL
407 2000–01 Deportivo La Coruña 8 Spain CL
408 2000–01 Arsenal 8 England CL
409 2000–01 Galatasaray 8 Turkey CL
410 2000–01 Manchester United 8 England CL
411 2000–01 Deportivo Alavés 8 Spain EL
412 2000–01 Kaiserslautern 6 Germany EL
413 2000–01 Barcelona 6 Spain EL
414 2000–01 Celta Vigo 4 Spain EL
415 2000–01 Porto 4 Portugal EL
416 2000–01 Rayo Vallecano 4 Spain EL
417 2000–01 PSV Eindhoven 4 Netherlands EL
418 1999–20 Real Madrid 20 Spain CL
419 1999–20 Valencia 16 Spain CL
420 1999–20 Barcelona 12 Spain CL
421 1999–20 Bayern Munich 12 Germany CL
422 1999–20 Galatasaray 10 Turkey EL
423 1999–20 Manchester United 8 England CL
424 1999–20 Porto 8 Portugal CL
425 1999–20 Chelsea 8 England CL
426 1999–20 Lazio 8 Italy CL
427 1999–20 Arsenal 8 England EL
428 1999–20 Leeds United 6 England EL
429 1999–20 Lens 6 France EL
430 1999–20 Slavia Prague 4 Czech Republic EL
431 1999–20 Werder Bremen 4 Germany EL
432 1999–20 Mallorca 4 Spain EL
433 1999–20 Celta Vigo 4 Spain EL
+132
View File
@@ -0,0 +1,132 @@
Season,Gini coefficient,Average market value of clubs,Country
200405,0.360018498852386,116763999.95,England
200506,0.3442440170940171,117000000.0,England
200607,0.37966666666666665,125249999.9,England
200708,0.3519417957722006,151071500.0,England
200809,0.37122676914762665,166535000.0,England
200910,0.36977061182601817,174420499.95,England
201011,0.3476851851851852,188676000.0,England
201112,0.385829420048362,178239000.0,England
201213,0.3682488958864264,187367500.0,England
201314,0.37329755805691633,200557499.95,England
201415,0.3786803024727264,210597500.0,England
201516,0.3183357245632489,242901500.0,England
201617,0.3324523769830874,293923000.0,England
201718,0.39222764569225443,404620000.0,England
201819,0.380701799118799,490240000.0,England
201920,0.35927350571500166,415048000.0,England
202021,0.3383646115529144,457720000.0,England
202122,0.3088707777325594,466869999.95,England
202223,0.2379889748754373,565979999.95,England
202324,0.2943039490285971,605516000.0,England
202425,0.28445084329176856,591165500.0,England
202526,0.24882569255851744,650468500.0,England
200405,0.48341967819470966,83000500.0,Spain
200506,0.4349132168859722,90512999.95,Spain
200607,0.41443248867167715,109570500.0,Spain
200708,0.3898532139052204,126715000.0,Spain
200809,0.40867937105438573,127515000.0,Spain
200910,0.4496773655226122,134827499.95,Spain
201011,0.45834173618113483,136362500.0,Spain
201112,0.4736133893325162,138692500.0,Spain
201213,0.49595993904566066,136167500.0,Spain
201314,0.5224207917235434,139189999.95,Spain
201415,0.5430249292418888,156342499.95,Spain
201516,0.5248095677765595,173290000.0,Spain
201617,0.499748389569604,202197499.95,Spain
201718,0.5347268401602979,256397499.95,Spain
201819,0.48223915117990523,309134999.95,Spain
201920,0.4799536796864471,270831500.0,Spain
202021,0.4776222471071295,261202499.95,Spain
202122,0.44673797312770364,261570499.95,Spain
202223,0.43895120412800465,263177999.9,Spain
202324,0.45606337058230506,281708000.0,Spain
202425,0.5408563121624481,271717499.9,Spain
202526,0.5066320158848527,278252500.0,Spain
200405,0.32341981351909727,60265000.0,Germany
200506,0.2789416254489784,67093333.333333336,Germany
200607,0.3090923172242875,71733333.33333333,Germany
200708,0.33890211084667193,79366666.66666667,Germany
200809,0.3118161071448985,88556666.66666667,Germany
200910,0.30818810283251885,98640555.55555555,Germany
201011,0.3106611606332398,107446666.6111111,Germany
201112,0.3382094918058693,106248888.8888889,Germany
201213,0.412129874895549,114723888.8888889,Germany
201314,0.40688376911217505,132167222.22222222,Germany
201415,0.4228109848839647,138394444.44444445,Germany
201516,0.44632989517068217,148783888.8888889,Germany
201617,0.40110039109009477,160251666.55555555,Germany
201718,0.4084188563742467,221476666.6111111,Germany
201819,0.37264934156985474,271240000.0,Germany
201920,0.42824720935129273,248310555.55555555,Germany
202021,0.3991102398876678,266405555.5,Germany
202122,0.4215972188716651,241806111.05555555,Germany
202223,0.41630635649677783,258607777.7222222,Germany
202324,0.4428287408678364,271983333.3333333,Germany
202425,0.4436581724640299,260410000.0,Germany
202526,0.3733180378765145,292510000.0,Germany
200405,0.44144154142093134,94614000.0,Italy
200506,0.43461945910016203,96284000.0,Italy
200607,0.38563841667056215,96265500.0,Italy
200708,0.3832586436229568,112019000.0,Italy
200809,0.40188776845700325,120340500.0,Italy
200910,0.36207897021072266,135367500.0,Italy
201011,0.351433925495717,130341500.0,Italy
201112,0.3761044534344282,117908999.95,Italy
201213,0.3293413780469743,128283000.0,Italy
201314,0.33876816377095625,147718500.0,Italy
201415,0.34808548211106644,139303999.95,Italy
201516,0.39253230390872257,148821000.0,Italy
201617,0.4088623997373235,170552000.0,Italy
201718,0.4264639426373497,229696500.0,Italy
201819,0.4014885661837348,296073500.0,Italy
201920,0.379941242052611,248902500.0,Italy
202021,0.3849354176959003,272249499.95,Italy
202122,0.3598889347810097,265114500.0,Italy
202223,0.35907910742611354,256897500.0,Italy
202324,0.35090251172285253,270412000.0,Italy
202425,0.3784043169013681,261715500.0,Italy
202526,0.33513392632615085,278362000.0,Italy
200405,0.2766737410765966,51830000.0,France
200506,0.2705703151825855,62614500.0,France
200607,0.32013975578609044,69693000.0,France
200708,0.24847617780143733,75140000.0,France
200809,0.2891482124764799,69090000.0,France
200910,0.27391808830908176,79720000.0,France
201011,0.2889899318977778,79806500.0,France
201112,0.3258695447261759,79567500.0,France
201213,0.3787823567890851,80257500.0,France
201314,0.4248340493127178,86245500.0,France
201415,0.4098437690711583,81930000.0,France
201516,0.46182494823437237,89345000.0,France
201617,0.45867096220732356,107243000.0,France
201718,0.4986615772275405,173823999.95,France
201819,0.44668007798124076,201074000.0,France
201920,0.46338912869048804,170743000.0,France
202021,0.40368277702674105,200833499.95,France
202122,0.40885929715133307,210344000.0,France
202223,0.4320352161412733,215299000.0,France
202324,0.3983899007790753,242761666.66666666,France
202425,0.4628263378361487,212350000.0,France
202526,0.44695848532221644,266527777.7777778,France
200405,0.5638919437159857,32836111.0,Portugal
200607,0.5314655998466845,32612500.0,Portugal
200708,0.44544708061078303,35773749.9375,Portugal
200809,0.4063953488372093,40312500.0,Portugal
200910,0.46722537891257687,47463125.0,Portugal
201011,0.5165052816901409,53249999.9375,Portugal
201112,0.5210959922099221,60975000.0,Portugal
201213,0.5345414159258595,66158125.0,Portugal
201314,0.4982536812529268,60059374.9375,Portugal
201415,0.4960187847296924,56810000.0,Portugal
201516,0.5264034577922594,58311666.666666664,Portugal
201617,0.5495889590377779,62653333.333333336,Portugal
201718,0.5739048970689851,66285555.5,Portugal
201819,0.6245746519586375,76535000.0,Portugal
201920,0.6045455184308435,61487777.777777776,Portugal
202021,0.5976790618273584,83166666.6111111,Portugal
202122,0.5904649510943162,92032777.77777778,Portugal
202223,0.6132456987830703,94880555.55555555,Portugal
202324,0.5920322374736268,101346666.66666667,Portugal
202425,0.6401313407032617,115400555.55555555,Portugal
202526,0.6073487609491816,124692222.22222222,Portugal
1 Season Gini coefficient Average market value of clubs Country
2 2004–05 0.360018498852386 116763999.95 England
3 2005–06 0.3442440170940171 117000000.0 England
4 2006–07 0.37966666666666665 125249999.9 England
5 2007–08 0.3519417957722006 151071500.0 England
6 2008–09 0.37122676914762665 166535000.0 England
7 2009–10 0.36977061182601817 174420499.95 England
8 2010–11 0.3476851851851852 188676000.0 England
9 2011–12 0.385829420048362 178239000.0 England
10 2012–13 0.3682488958864264 187367500.0 England
11 2013–14 0.37329755805691633 200557499.95 England
12 2014–15 0.3786803024727264 210597500.0 England
13 2015–16 0.3183357245632489 242901500.0 England
14 2016–17 0.3324523769830874 293923000.0 England
15 2017–18 0.39222764569225443 404620000.0 England
16 2018–19 0.380701799118799 490240000.0 England
17 2019–20 0.35927350571500166 415048000.0 England
18 2020–21 0.3383646115529144 457720000.0 England
19 2021–22 0.3088707777325594 466869999.95 England
20 2022–23 0.2379889748754373 565979999.95 England
21 2023–24 0.2943039490285971 605516000.0 England
22 2024–25 0.28445084329176856 591165500.0 England
23 2025–26 0.24882569255851744 650468500.0 England
24 2004–05 0.48341967819470966 83000500.0 Spain
25 2005–06 0.4349132168859722 90512999.95 Spain
26 2006–07 0.41443248867167715 109570500.0 Spain
27 2007–08 0.3898532139052204 126715000.0 Spain
28 2008–09 0.40867937105438573 127515000.0 Spain
29 2009–10 0.4496773655226122 134827499.95 Spain
30 2010–11 0.45834173618113483 136362500.0 Spain
31 2011–12 0.4736133893325162 138692500.0 Spain
32 2012–13 0.49595993904566066 136167500.0 Spain
33 2013–14 0.5224207917235434 139189999.95 Spain
34 2014–15 0.5430249292418888 156342499.95 Spain
35 2015–16 0.5248095677765595 173290000.0 Spain
36 2016–17 0.499748389569604 202197499.95 Spain
37 2017–18 0.5347268401602979 256397499.95 Spain
38 2018–19 0.48223915117990523 309134999.95 Spain
39 2019–20 0.4799536796864471 270831500.0 Spain
40 2020–21 0.4776222471071295 261202499.95 Spain
41 2021–22 0.44673797312770364 261570499.95 Spain
42 2022–23 0.43895120412800465 263177999.9 Spain
43 2023–24 0.45606337058230506 281708000.0 Spain
44 2024–25 0.5408563121624481 271717499.9 Spain
45 2025–26 0.5066320158848527 278252500.0 Spain
46 2004–05 0.32341981351909727 60265000.0 Germany
47 2005–06 0.2789416254489784 67093333.333333336 Germany
48 2006–07 0.3090923172242875 71733333.33333333 Germany
49 2007–08 0.33890211084667193 79366666.66666667 Germany
50 2008–09 0.3118161071448985 88556666.66666667 Germany
51 2009–10 0.30818810283251885 98640555.55555555 Germany
52 2010–11 0.3106611606332398 107446666.6111111 Germany
53 2011–12 0.3382094918058693 106248888.8888889 Germany
54 2012–13 0.412129874895549 114723888.8888889 Germany
55 2013–14 0.40688376911217505 132167222.22222222 Germany
56 2014–15 0.4228109848839647 138394444.44444445 Germany
57 2015–16 0.44632989517068217 148783888.8888889 Germany
58 2016–17 0.40110039109009477 160251666.55555555 Germany
59 2017–18 0.4084188563742467 221476666.6111111 Germany
60 2018–19 0.37264934156985474 271240000.0 Germany
61 2019–20 0.42824720935129273 248310555.55555555 Germany
62 2020–21 0.3991102398876678 266405555.5 Germany
63 2021–22 0.4215972188716651 241806111.05555555 Germany
64 2022–23 0.41630635649677783 258607777.7222222 Germany
65 2023–24 0.4428287408678364 271983333.3333333 Germany
66 2024–25 0.4436581724640299 260410000.0 Germany
67 2025–26 0.3733180378765145 292510000.0 Germany
68 2004–05 0.44144154142093134 94614000.0 Italy
69 2005–06 0.43461945910016203 96284000.0 Italy
70 2006–07 0.38563841667056215 96265500.0 Italy
71 2007–08 0.3832586436229568 112019000.0 Italy
72 2008–09 0.40188776845700325 120340500.0 Italy
73 2009–10 0.36207897021072266 135367500.0 Italy
74 2010–11 0.351433925495717 130341500.0 Italy
75 2011–12 0.3761044534344282 117908999.95 Italy
76 2012–13 0.3293413780469743 128283000.0 Italy
77 2013–14 0.33876816377095625 147718500.0 Italy
78 2014–15 0.34808548211106644 139303999.95 Italy
79 2015–16 0.39253230390872257 148821000.0 Italy
80 2016–17 0.4088623997373235 170552000.0 Italy
81 2017–18 0.4264639426373497 229696500.0 Italy
82 2018–19 0.4014885661837348 296073500.0 Italy
83 2019–20 0.379941242052611 248902500.0 Italy
84 2020–21 0.3849354176959003 272249499.95 Italy
85 2021–22 0.3598889347810097 265114500.0 Italy
86 2022–23 0.35907910742611354 256897500.0 Italy
87 2023–24 0.35090251172285253 270412000.0 Italy
88 2024–25 0.3784043169013681 261715500.0 Italy
89 2025–26 0.33513392632615085 278362000.0 Italy
90 2004–05 0.2766737410765966 51830000.0 France
91 2005–06 0.2705703151825855 62614500.0 France
92 2006–07 0.32013975578609044 69693000.0 France
93 2007–08 0.24847617780143733 75140000.0 France
94 2008–09 0.2891482124764799 69090000.0 France
95 2009–10 0.27391808830908176 79720000.0 France
96 2010–11 0.2889899318977778 79806500.0 France
97 2011–12 0.3258695447261759 79567500.0 France
98 2012–13 0.3787823567890851 80257500.0 France
99 2013–14 0.4248340493127178 86245500.0 France
100 2014–15 0.4098437690711583 81930000.0 France
101 2015–16 0.46182494823437237 89345000.0 France
102 2016–17 0.45867096220732356 107243000.0 France
103 2017–18 0.4986615772275405 173823999.95 France
104 2018–19 0.44668007798124076 201074000.0 France
105 2019–20 0.46338912869048804 170743000.0 France
106 2020–21 0.40368277702674105 200833499.95 France
107 2021–22 0.40885929715133307 210344000.0 France
108 2022–23 0.4320352161412733 215299000.0 France
109 2023–24 0.3983899007790753 242761666.66666666 France
110 2024–25 0.4628263378361487 212350000.0 France
111 2025–26 0.44695848532221644 266527777.7777778 France
112 2004–05 0.5638919437159857 32836111.0 Portugal
113 2006–07 0.5314655998466845 32612500.0 Portugal
114 2007–08 0.44544708061078303 35773749.9375 Portugal
115 2008–09 0.4063953488372093 40312500.0 Portugal
116 2009–10 0.46722537891257687 47463125.0 Portugal
117 2010–11 0.5165052816901409 53249999.9375 Portugal
118 2011–12 0.5210959922099221 60975000.0 Portugal
119 2012–13 0.5345414159258595 66158125.0 Portugal
120 2013–14 0.4982536812529268 60059374.9375 Portugal
121 2014–15 0.4960187847296924 56810000.0 Portugal
122 2015–16 0.5264034577922594 58311666.666666664 Portugal
123 2016–17 0.5495889590377779 62653333.333333336 Portugal
124 2017–18 0.5739048970689851 66285555.5 Portugal
125 2018–19 0.6245746519586375 76535000.0 Portugal
126 2019–20 0.6045455184308435 61487777.777777776 Portugal
127 2020–21 0.5976790618273584 83166666.6111111 Portugal
128 2021–22 0.5904649510943162 92032777.77777778 Portugal
129 2022–23 0.6132456987830703 94880555.55555555 Portugal
130 2023–24 0.5920322374736268 101346666.66666667 Portugal
131 2024–25 0.6401313407032617 115400555.55555555 Portugal
132 2025–26 0.6073487609491816 124692222.22222222 Portugal
+163
View File
@@ -0,0 +1,163 @@
Season,Average number of players,Country
199920,27.45,England
200001,28.05,England
200102,27.05,England
200203,26.9,England
200304,26.6,England
200405,26.65,England
200506,27.7,England
200607,27.55,England
200708,27.7,England
200809,28.15,England
200910,28.25,England
201011,28.15,England
201112,28.05,England
201213,26.85,England
201314,28.05,England
201415,27.45,England
201516,28.05,England
201617,27.15,England
201718,26.45,England
201819,25.4,England
201920,26.1,England
202021,26.6,England
202122,27.3,England
202223,28.45,England
202324,29.0,England
202425,28.7,England
202526,27.55,England
199920,25.85,Spain
200001,25.8,Spain
200102,26.2,Spain
200203,27.4,Spain
200304,26.95,Spain
200405,27.15,Spain
200506,27.45,Spain
200607,26.2,Spain
200708,27.25,Spain
200809,26.55,Spain
200910,27.25,Spain
201011,27.75,Spain
201112,27.6,Spain
201213,27.55,Spain
201314,27.2,Spain
201415,26.6,Spain
201516,27.3,Spain
201617,27.75,Spain
201718,28.65,Spain
201819,27.2,Spain
201920,28.5,Spain
202021,29.1,Spain
202122,30.85,Spain
202223,29.8,Spain
202324,30.45,Spain
202425,30.05,Spain
202526,30.55,Spain
199920,25.22222222222222,Germany
200001,26.666666666666668,Germany
200102,26.22222222222222,Germany
200203,26.22222222222222,Germany
200304,26.38888888888889,Germany
200405,25.77777777777778,Germany
200506,26.11111111111111,Germany
200607,26.22222222222222,Germany
200708,26.833333333333332,Germany
200809,26.61111111111111,Germany
200910,27.166666666666668,Germany
201011,26.5,Germany
201112,27.166666666666668,Germany
201213,26.61111111111111,Germany
201314,26.444444444444443,Germany
201415,25.666666666666668,Germany
201516,27.333333333333332,Germany
201617,26.444444444444443,Germany
201718,26.88888888888889,Germany
201819,26.333333333333332,Germany
201920,27.666666666666668,Germany
202021,28.055555555555557,Germany
202122,29.055555555555557,Germany
202223,28.61111111111111,Germany
202324,28.166666666666668,Germany
202425,27.333333333333332,Germany
202526,28.166666666666668,Germany
199920,26.5,Italy
200001,27.444444444444443,Italy
200102,27.72222222222222,Italy
200203,27.38888888888889,Italy
200304,27.5,Italy
200405,27.5,Italy
200506,27.9,Italy
200607,27.55,Italy
200708,27.15,Italy
200809,28.5,Italy
200910,28.8,Italy
201011,28.55,Italy
201112,29.3,Italy
201213,31.3,Italy
201314,30.5,Italy
201415,30.45,Italy
201516,29.2,Italy
201617,29.1,Italy
201718,27.6,Italy
201819,28.45,Italy
201920,30.0,Italy
202021,30.95,Italy
202122,31.6,Italy
202223,30.15,Italy
202324,30.8,Italy
202425,31.7,Italy
202526,30.45,Italy
199920,26.055555555555557,France
200001,26.833333333333332,France
200102,28.88888888888889,France
200203,27.7,France
200304,27.6,France
200405,26.05,France
200506,27.7,France
200607,26.15,France
200708,27.0,France
200809,27.3,France
200910,26.45,France
201011,27.15,France
201112,27.4,France
201213,28.1,France
201314,27.9,France
201415,27.4,France
201516,29.45,France
201617,28.75,France
201718,27.65,France
201819,28.0,France
201920,27.1,France
202021,29.25,France
202122,30.2,France
202223,30.3,France
202324,30.0,France
202425,30.72222222222222,France
202526,31.166666666666668,France
199920,27.166666666666668,Portugal
200001,26.944444444444443,Portugal
200102,27.833333333333332,Portugal
200203,27.61111111111111,Portugal
200304,28.055555555555557,Portugal
200405,27.27777777777778,Portugal
200506,27.77777777777778,Portugal
200607,28.6875,Portugal
200708,27.875,Portugal
200809,27.8125,Portugal
200910,28.8125,Portugal
201011,27.625,Portugal
201112,29.4375,Portugal
201213,28.25,Portugal
201314,29.4375,Portugal
201415,29.61111111111111,Portugal
201516,30.27777777777778,Portugal
201617,30.333333333333332,Portugal
201718,28.88888888888889,Portugal
201819,30.055555555555557,Portugal
201920,31.22222222222222,Portugal
202021,30.166666666666668,Portugal
202122,32.27777777777778,Portugal
202223,32.22222222222222,Portugal
202324,29.77777777777778,Portugal
202425,32.5,Portugal
202526,32.166666666666664,Portugal
1 Season Average number of players Country
2 1999–20 27.45 England
3 2000–01 28.05 England
4 2001–02 27.05 England
5 2002–03 26.9 England
6 2003–04 26.6 England
7 2004–05 26.65 England
8 2005–06 27.7 England
9 2006–07 27.55 England
10 2007–08 27.7 England
11 2008–09 28.15 England
12 2009–10 28.25 England
13 2010–11 28.15 England
14 2011–12 28.05 England
15 2012–13 26.85 England
16 2013–14 28.05 England
17 2014–15 27.45 England
18 2015–16 28.05 England
19 2016–17 27.15 England
20 2017–18 26.45 England
21 2018–19 25.4 England
22 2019–20 26.1 England
23 2020–21 26.6 England
24 2021–22 27.3 England
25 2022–23 28.45 England
26 2023–24 29.0 England
27 2024–25 28.7 England
28 2025–26 27.55 England
29 1999–20 25.85 Spain
30 2000–01 25.8 Spain
31 2001–02 26.2 Spain
32 2002–03 27.4 Spain
33 2003–04 26.95 Spain
34 2004–05 27.15 Spain
35 2005–06 27.45 Spain
36 2006–07 26.2 Spain
37 2007–08 27.25 Spain
38 2008–09 26.55 Spain
39 2009–10 27.25 Spain
40 2010–11 27.75 Spain
41 2011–12 27.6 Spain
42 2012–13 27.55 Spain
43 2013–14 27.2 Spain
44 2014–15 26.6 Spain
45 2015–16 27.3 Spain
46 2016–17 27.75 Spain
47 2017–18 28.65 Spain
48 2018–19 27.2 Spain
49 2019–20 28.5 Spain
50 2020–21 29.1 Spain
51 2021–22 30.85 Spain
52 2022–23 29.8 Spain
53 2023–24 30.45 Spain
54 2024–25 30.05 Spain
55 2025–26 30.55 Spain
56 1999–20 25.22222222222222 Germany
57 2000–01 26.666666666666668 Germany
58 2001–02 26.22222222222222 Germany
59 2002–03 26.22222222222222 Germany
60 2003–04 26.38888888888889 Germany
61 2004–05 25.77777777777778 Germany
62 2005–06 26.11111111111111 Germany
63 2006–07 26.22222222222222 Germany
64 2007–08 26.833333333333332 Germany
65 2008–09 26.61111111111111 Germany
66 2009–10 27.166666666666668 Germany
67 2010–11 26.5 Germany
68 2011–12 27.166666666666668 Germany
69 2012–13 26.61111111111111 Germany
70 2013–14 26.444444444444443 Germany
71 2014–15 25.666666666666668 Germany
72 2015–16 27.333333333333332 Germany
73 2016–17 26.444444444444443 Germany
74 2017–18 26.88888888888889 Germany
75 2018–19 26.333333333333332 Germany
76 2019–20 27.666666666666668 Germany
77 2020–21 28.055555555555557 Germany
78 2021–22 29.055555555555557 Germany
79 2022–23 28.61111111111111 Germany
80 2023–24 28.166666666666668 Germany
81 2024–25 27.333333333333332 Germany
82 2025–26 28.166666666666668 Germany
83 1999–20 26.5 Italy
84 2000–01 27.444444444444443 Italy
85 2001–02 27.72222222222222 Italy
86 2002–03 27.38888888888889 Italy
87 2003–04 27.5 Italy
88 2004–05 27.5 Italy
89 2005–06 27.9 Italy
90 2006–07 27.55 Italy
91 2007–08 27.15 Italy
92 2008–09 28.5 Italy
93 2009–10 28.8 Italy
94 2010–11 28.55 Italy
95 2011–12 29.3 Italy
96 2012–13 31.3 Italy
97 2013–14 30.5 Italy
98 2014–15 30.45 Italy
99 2015–16 29.2 Italy
100 2016–17 29.1 Italy
101 2017–18 27.6 Italy
102 2018–19 28.45 Italy
103 2019–20 30.0 Italy
104 2020–21 30.95 Italy
105 2021–22 31.6 Italy
106 2022–23 30.15 Italy
107 2023–24 30.8 Italy
108 2024–25 31.7 Italy
109 2025–26 30.45 Italy
110 1999–20 26.055555555555557 France
111 2000–01 26.833333333333332 France
112 2001–02 28.88888888888889 France
113 2002–03 27.7 France
114 2003–04 27.6 France
115 2004–05 26.05 France
116 2005–06 27.7 France
117 2006–07 26.15 France
118 2007–08 27.0 France
119 2008–09 27.3 France
120 2009–10 26.45 France
121 2010–11 27.15 France
122 2011–12 27.4 France
123 2012–13 28.1 France
124 2013–14 27.9 France
125 2014–15 27.4 France
126 2015–16 29.45 France
127 2016–17 28.75 France
128 2017–18 27.65 France
129 2018–19 28.0 France
130 2019–20 27.1 France
131 2020–21 29.25 France
132 2021–22 30.2 France
133 2022–23 30.3 France
134 2023–24 30.0 France
135 2024–25 30.72222222222222 France
136 2025–26 31.166666666666668 France
137 1999–20 27.166666666666668 Portugal
138 2000–01 26.944444444444443 Portugal
139 2001–02 27.833333333333332 Portugal
140 2002–03 27.61111111111111 Portugal
141 2003–04 28.055555555555557 Portugal
142 2004–05 27.27777777777778 Portugal
143 2005–06 27.77777777777778 Portugal
144 2006–07 28.6875 Portugal
145 2007–08 27.875 Portugal
146 2008–09 27.8125 Portugal
147 2009–10 28.8125 Portugal
148 2010–11 27.625 Portugal
149 2011–12 29.4375 Portugal
150 2012–13 28.25 Portugal
151 2013–14 29.4375 Portugal
152 2014–15 29.61111111111111 Portugal
153 2015–16 30.27777777777778 Portugal
154 2016–17 30.333333333333332 Portugal
155 2017–18 28.88888888888889 Portugal
156 2018–19 30.055555555555557 Portugal
157 2019–20 31.22222222222222 Portugal
158 2020–21 30.166666666666668 Portugal
159 2021–22 32.27777777777778 Portugal
160 2022–23 32.22222222222222 Portugal
161 2023–24 29.77777777777778 Portugal
162 2024–25 32.5 Portugal
163 2025–26 32.166666666666664 Portugal
+163
View File
@@ -0,0 +1,163 @@
Season,First_and_second,First_and_CL,First_and_relegated,CL_and_relegated,Winners_GD,Top_4_total_GD,Country
199920,0.9,1.2,2.9,1.7,2.6,5.9,England
200001,0.5,0.6,2.3,1.7,2.4,6.3,England
200102,0.35,0.8,2.55,1.75,2.15,7.2,England
200203,0.25,0.8,2.05,1.25,2,6.4,England
200304,0.55,1.5,2.85,1.35,2.35,6.55,England
200405,0.6,1.7,3.1,1.4,2.85,6.95,England
200506,0.4,1.2,2.85,1.65,2.5,7.85,England
200607,0.3,1.05,2.55,1.5,2.8,7.7,England
200708,0.1,0.55,2.55,2,2.9,8.95,England
200809,0.2,0.9,2.8,1.9,2.2,8.45,England
200910,0.05,0.8,2.8,2,3.55,9.85,England
201011,0.45,0.6,2.05,1.45,2.05,6.65,England
201112,0,1,2.65,1.65,3.2,8.5,England
201213,0.55,0.8,2.65,1.85,2.15,7.3,England
201314,0.1,0.35,2.65,2.3,3.25,9.35,England
201415,0.4,0.85,2.6,1.75,2.05,7.3,England
201516,0.5,0.75,2.2,1.45,1.6,6.25,England
201617,0.35,0.85,2.95,2.1,2.6,9.45,England
201718,0.95,1.25,3.35,2.1,3.95,10.15,England
201819,0.05,1.35,3.2,1.85,3.6,9.55,England
201920,0.9,1.65,3.25,1.6,2.6,8.2,England
202021,0.6,0.95,2.9,1.95,2.55,6.4,England
202122,0.05,1.1,2.9,1.8,3.65,10.65,England
202223,0.25,0.9,2.75,1.85,3.05,7.8,England
202324,0.1,1.15,3.25,2.1,3.1,9.2,England
202425,0.5,0.75,2.95,2.2,2.25,6.45,England
202526,0.35,1,2.3,1.3,2.2,5.6,England
199920,0.25,0.3,1.35,1.05,1.1,4.3,Spain
200001,0.35,0.85,1.95,1.1,2.05,5.55,Spain
200102,0.35,0.55,1.75,1.2,1.2,5.05,Spain
200203,0.1,0.85,2.1,1.25,2.2,4.95,Spain
200304,0.25,0.35,1.8,1.45,2.2,5.6,Spain
200405,0.2,1.1,2.35,1.25,2.2,6.35,Spain
200506,0.6,0.7,2.15,1.45,2.25,5.3,Spain
200607,0,0.5,1.85,1.35,1.3,5.75,Spain
200708,0.4,1.05,2.15,1.1,2.4,6.15,Spain
200809,0.45,1,2.25,1.25,3.5,6.95,Spain
200910,0.15,1.8,3.15,1.35,3.7,8.8,Spain
201011,0.2,1.7,2.65,0.95,3.7,8.65,Spain
201112,0.45,2.1,2.95,0.85,4.45,9.5,Spain
201213,0.75,1.7,3.2,1.5,3.75,9.55,Spain
201314,0.15,1,2.55,1.55,2.55,10.55,Spain
201415,0.1,0.85,2.95,2.1,4.45,12.25,Spain
201516,0.05,1.35,2.65,1.3,4.15,10.65,Spain
201617,0.15,1.05,3.1,2.05,3.25,10.35,Spain
201718,0.7,1,3.2,2.2,3.5,9.15,Spain
201819,0.55,1.3,2.5,1.2,2.7,5.65,Spain
201920,0.25,0.85,2.55,1.7,2.25,6.85,Spain
202021,0.1,0.45,2.6,2.15,2.1,7.4,Spain
202122,0.65,0.8,2.4,1.6,2.45,6.2,Spain
202223,0.5,0.85,2.4,1.55,2.5,7.1,Spain
202324,0.5,0.95,3.1,2.15,3.05,8.1,Spain
202425,0.2,0.9,2.4,1.5,3.15,8.3,Spain
202526,0.4,1.25,2.6,1.35,2.95,7.25,Spain
199920,0,1.111111111,2.111111111,1,2.5,6.333333333,Germany
200001,0.055555556,0.333333333,1.555555556,1.222222222,1.388888889,4.944444444,Germany
200102,0.055555556,0.5,2.222222222,1.722222222,1.611111111,7.277777778,Germany
200203,0.888888889,1.055555556,2.166666667,1.111111111,2.5,5.166666667,Germany
200304,0.333333333,0.555555556,2.333333333,1.777777778,2.277777778,7.444444444,Germany
200405,0.777777778,1.055555556,2.333333333,1.277777778,2.333333333,6.166666667,Germany
200506,0.277777778,0.777777778,2.333333333,1.555555556,1.944444444,6.444444444,Germany
200607,0.111111111,0.555555556,2,1.444444444,1.333333333,5.333333333,Germany
200708,0.555555556,1.222222222,2.5,1.277777778,2.611111111,6.722222222,Germany
200809,0.111111111,0.333333333,2.166666667,1.833333333,2.166666667,5.277777778,Germany
200910,0.277777778,0.611111111,2.166666667,1.555555556,2.277777778,6.722222222,Germany
201011,0.388888889,0.833333333,2.166666667,1.333333333,2.5,6.111111111,Germany
201112,0.444444444,1.166666667,2.777777778,1.611111111,3.055555556,9.166666667,Germany
201213,1.388888889,2,3.333333333,1.333333333,4.444444444,8.5,Germany
201314,1.055555556,1.611111111,3.5,1.888888889,3.944444444,8.444444444,Germany
201415,0.555555556,1,2.444444444,1.444444444,3.444444444,8.222222222,Germany
201516,0.555555556,1.833333333,2.888888889,1.055555556,3.5,8,Germany
201617,0.833333333,1.111111111,2.5,1.388888889,3.722222222,8.5,Germany
201718,1.166666667,1.611111111,2.833333333,1.222222222,3.555555556,6.388888889,Germany
201819,0.111111111,1.111111111,2.777777778,1.666666667,3.111111111,8,Germany
201920,0.722222222,0.944444444,2.833333333,1.888888889,3.777777778,10.05555556,Germany
202021,0.722222222,0.944444444,2.5,1.555555556,3.055555556,7.555555556,Germany
202122,0.444444444,1.055555556,2.444444444,1.388888889,3.333333333,8.944444444,Germany
202223,0,0.5,2.111111111,1.611111111,3,7.166666667,Germany
202324,0.944444444,1.388888889,3.166666667,1.777777778,3.611111111,10.61111111,Germany
202425,0.8125,1.5625,3.3125,1.75,4.1875,8.625,Germany
202526,1,1.6875,3.75,2.0625,5.375,10.1875,Germany
199920,0.055555556,0.777777778,2.555555556,1.777777778,1.722222222,5.777777778,Italy
200001,0.111111111,1.055555556,2.166666667,1.111111111,1.944444444,6.555555556,Italy
200102,0.055555556,0.888888889,2.388888889,1.5,2.277777778,6.444444444,Italy
200203,0.388888889,0.666666667,2.333333333,1.666666667,1.944444444,6.166666667,Italy
200304,0.611111111,1.277777778,2.888888889,1.611111111,2.277777778,7.611111111,Italy
200405,0.35,1.2,2.2,1,2,5.95,Italy
200506,0.35,1.1,2.35,1.25,1.9,6.25,Italy
200607,1.1,1.8,2.9,1.1,2.3,6.65,Italy
200708,0.15,0.95,2.45,1.5,2.15,6.45,Italy
200809,0.5,0.8,2.5,1.7,1.9,6,Italy
200910,0.1,0.75,2.35,1.6,2.05,4.85,Italy
201011,0.3,0.8,2.3,1.5,2.05,5.5,Italy
201112,0.2,1.1,2.4,1.3,2.4,5.75,Italy
201213,0.45,0.85,2.75,1.9,2.35,7,Italy
201314,0.85,1.85,3.5,1.65,2.85,8.15,Italy
201415,0.85,1.15,2.65,1.5,2.4,5.95,Italy
201516,0.45,1.2,2.65,1.45,2.75,7.85,Italy
201617,0.2,0.95,2.95,2,2.5,8.9,Italy
201718,0.2,1.15,3,1.85,3.1,8.95,Italy
201819,0.55,1.05,2.6,1.55,2,6.65,Italy
201920,0.05,0.25,2.4,2.15,1.65,8.25,Italy
202021,0.6,0.65,2.9,2.25,2.7,8.45,Italy
202122,0.1,0.8,2.8,2,1.9,7.65,Italy
202223,0.8,1,2.95,1.95,2.45,6.45,Italy
202324,0.95,1.25,2.95,1.7,3.35,7.35,Italy
202425,0.05,0.6,2.55,1.95,1.6,7,Italy
202526,0.55,0.8,2.65,1.85,2.7,7,Italy
199920,0.388888889,0.611111111,1.277777778,0.666666667,1.722222222,3.333333333,France
200001,0.222222222,0.611111111,1.722222222,1.111111111,1.222222222,4.444444444,France
200102,0.111111111,0.444444444,1.722222222,1.277777778,1.666666667,4.666666667,France
200203,0.05,0.2,1.5,1.3,1.1,4.05,France
200304,0.15,0.7,2.05,1.35,1.9,5.75,France
200405,0.6,1.2,1.85,0.65,1.7,4.05,France
200506,0.75,1.2,2.55,1.35,2.1,4.95,France
200607,0.85,1.2,2.1,0.9,1.85,3.05,France
200708,0.2,0.95,1.95,1,1.85,4.55,France
200809,0.15,0.8,2.15,1.35,1.5,5.15,France
200910,0.3,0.4,2.3,1.9,1.65,5.2,France
201011,0.4,0.8,1.6,0.8,1.6,4.55,France
201112,0.15,0.9,2.2,1.3,1.7,5.7,France
201213,0.6,0.95,2.25,1.3,2.3,4.3,France
201314,0.45,1,2.45,1.45,3.05,6.75,France
201415,0.4,0.7,2.3,1.6,2.35,7.25,France
201516,1.55,1.65,2.85,1.2,4.15,6.55,France
201617,0.4,1.4,2.95,1.55,3.8,9.4,France
201718,0.65,0.8,2.8,2,3.95,9.8,France
201819,0.8,1.25,2.85,1.6,3.5,7.3,France
201920,0.6,0.95,2.05,1.1,2.55,4.25,France
202021,0.05,0.35,2.15,1.8,2.05,8.55,France
202122,0.75,1,2.7,1.7,2.7,7.3,France
202223,0.05,0.85,2.95,2.1,2.45,7.25,France
202425,1.1875,1.5,3.1875,1.6875,3.5625,8.1875,France
202526,0.375,1,2.75,1.75,2.8125,6.5,France
202324,0.5,0.944444444,2.611111111,1.666666667,2.666666667,6.166666667,France
199920,0.222222222,1.222222222,2.444444444,1.222222222,1.944444444,6.055555556,Portugal
200001,0.055555556,1.111111111,2.5,1.388888889,2.277777778,6.444444444,Portugal
200102,0.277777778,0.666666667,2.5,1.833333333,2.722222222,7.944444444,Portugal
200203,0.611111111,2,2.777777778,0.777777778,2.611111111,6.055555556,Portugal
200304,0.444444444,1.444444444,2.611111111,1.166666667,2.444444444,7,Portugal
200405,0.166666667,0.388888889,1.722222222,1.333333333,1.111111111,4.444444444,Portugal
200506,0.388888889,1.166666667,2.5,1.333333333,2.111111111,5.666666667,Portugal
200607,0.0625,1.1875,2.9375,1.75,2.8125,7.75,Portugal
200708,1.25,1.4375,3.6875,2.25,2.9375,5.8125,Portugal
200809,0.25,1.125,2.9375,1.8125,2.6875,6.5625,Portugal
200910,0.3125,1.75,3.4375,1.6875,3.625,9.125,Portugal
201011,1.3125,2.375,3.8125,1.4375,3.5625,6.8125,Portugal
201112,0.375,1,3.5,2.5,3.125,8.75,Portugal
201213,0.0625,1.625,3.4375,1.8125,3.5,8.875,Portugal
201314,0.4375,1.25,3.125,1.875,2.5,7.625,Portugal
201415,0.166666667,1.5,3.166666667,1.666666667,3.888888889,10.88888889,Portugal
201516,0.111111111,1.666666667,3.222222222,1.555555556,3.666666667,10,Portugal
201617,0.333333333,1.111111111,2.777777778,1.666666667,3,8.277777778,Portugal
201718,0.388888889,0.722222222,3.166666667,2.444444444,3.555555556,11.44444444,Portugal
201819,0.111111111,1.111111111,3.055555556,1.944444444,4,10.22222222,Portugal
201920,0.277777778,1.222222222,2.666666667,1.444444444,2.888888889,7.388888889,Portugal
202021,0.277777778,1.166666667,2.833333333,1.666666667,2.5,8.444444444,Portugal
202122,0.333333333,1.444444444,3.444444444,2,3.555555556,10.16666667,Portugal
202223,0.111111111,0.722222222,3.388888889,2.666666667,3.444444444,10.94444444,Portugal
202324,0.555555556,1.222222222,3.222222222,2,3.722222222,9.611111111,Portugal
202425,0.125,1,3.4375,2.4375,3.8125,11.0625,Portugal
202526,0.375,1.8125,3.625,1.8125,3,11.875,Portugal
1 Season First_and_second First_and_CL First_and_relegated CL_and_relegated Winners_GD Top_4_total_GD Country
2 1999–20 0.9 1.2 2.9 1.7 2.6 5.9 England
3 2000–01 0.5 0.6 2.3 1.7 2.4 6.3 England
4 2001–02 0.35 0.8 2.55 1.75 2.15 7.2 England
5 2002–03 0.25 0.8 2.05 1.25 2 6.4 England
6 2003–04 0.55 1.5 2.85 1.35 2.35 6.55 England
7 2004–05 0.6 1.7 3.1 1.4 2.85 6.95 England
8 2005–06 0.4 1.2 2.85 1.65 2.5 7.85 England
9 2006–07 0.3 1.05 2.55 1.5 2.8 7.7 England
10 2007–08 0.1 0.55 2.55 2 2.9 8.95 England
11 2008–09 0.2 0.9 2.8 1.9 2.2 8.45 England
12 2009–10 0.05 0.8 2.8 2 3.55 9.85 England
13 2010–11 0.45 0.6 2.05 1.45 2.05 6.65 England
14 2011–12 0 1 2.65 1.65 3.2 8.5 England
15 2012–13 0.55 0.8 2.65 1.85 2.15 7.3 England
16 2013–14 0.1 0.35 2.65 2.3 3.25 9.35 England
17 2014–15 0.4 0.85 2.6 1.75 2.05 7.3 England
18 2015–16 0.5 0.75 2.2 1.45 1.6 6.25 England
19 2016–17 0.35 0.85 2.95 2.1 2.6 9.45 England
20 2017–18 0.95 1.25 3.35 2.1 3.95 10.15 England
21 2018–19 0.05 1.35 3.2 1.85 3.6 9.55 England
22 2019–20 0.9 1.65 3.25 1.6 2.6 8.2 England
23 2020–21 0.6 0.95 2.9 1.95 2.55 6.4 England
24 2021–22 0.05 1.1 2.9 1.8 3.65 10.65 England
25 2022–23 0.25 0.9 2.75 1.85 3.05 7.8 England
26 2023–24 0.1 1.15 3.25 2.1 3.1 9.2 England
27 2024–25 0.5 0.75 2.95 2.2 2.25 6.45 England
28 2025–26 0.35 1 2.3 1.3 2.2 5.6 England
29 1999–20 0.25 0.3 1.35 1.05 1.1 4.3 Spain
30 2000–01 0.35 0.85 1.95 1.1 2.05 5.55 Spain
31 2001–02 0.35 0.55 1.75 1.2 1.2 5.05 Spain
32 2002–03 0.1 0.85 2.1 1.25 2.2 4.95 Spain
33 2003–04 0.25 0.35 1.8 1.45 2.2 5.6 Spain
34 2004–05 0.2 1.1 2.35 1.25 2.2 6.35 Spain
35 2005–06 0.6 0.7 2.15 1.45 2.25 5.3 Spain
36 2006–07 0 0.5 1.85 1.35 1.3 5.75 Spain
37 2007–08 0.4 1.05 2.15 1.1 2.4 6.15 Spain
38 2008–09 0.45 1 2.25 1.25 3.5 6.95 Spain
39 2009–10 0.15 1.8 3.15 1.35 3.7 8.8 Spain
40 2010–11 0.2 1.7 2.65 0.95 3.7 8.65 Spain
41 2011–12 0.45 2.1 2.95 0.85 4.45 9.5 Spain
42 2012–13 0.75 1.7 3.2 1.5 3.75 9.55 Spain
43 2013–14 0.15 1 2.55 1.55 2.55 10.55 Spain
44 2014–15 0.1 0.85 2.95 2.1 4.45 12.25 Spain
45 2015–16 0.05 1.35 2.65 1.3 4.15 10.65 Spain
46 2016–17 0.15 1.05 3.1 2.05 3.25 10.35 Spain
47 2017–18 0.7 1 3.2 2.2 3.5 9.15 Spain
48 2018–19 0.55 1.3 2.5 1.2 2.7 5.65 Spain
49 2019–20 0.25 0.85 2.55 1.7 2.25 6.85 Spain
50 2020–21 0.1 0.45 2.6 2.15 2.1 7.4 Spain
51 2021–22 0.65 0.8 2.4 1.6 2.45 6.2 Spain
52 2022–23 0.5 0.85 2.4 1.55 2.5 7.1 Spain
53 2023–24 0.5 0.95 3.1 2.15 3.05 8.1 Spain
54 2024–25 0.2 0.9 2.4 1.5 3.15 8.3 Spain
55 2025–26 0.4 1.25 2.6 1.35 2.95 7.25 Spain
56 1999–20 0 1.111111111 2.111111111 1 2.5 6.333333333 Germany
57 2000–01 0.055555556 0.333333333 1.555555556 1.222222222 1.388888889 4.944444444 Germany
58 2001–02 0.055555556 0.5 2.222222222 1.722222222 1.611111111 7.277777778 Germany
59 2002–03 0.888888889 1.055555556 2.166666667 1.111111111 2.5 5.166666667 Germany
60 2003–04 0.333333333 0.555555556 2.333333333 1.777777778 2.277777778 7.444444444 Germany
61 2004–05 0.777777778 1.055555556 2.333333333 1.277777778 2.333333333 6.166666667 Germany
62 2005–06 0.277777778 0.777777778 2.333333333 1.555555556 1.944444444 6.444444444 Germany
63 2006–07 0.111111111 0.555555556 2 1.444444444 1.333333333 5.333333333 Germany
64 2007–08 0.555555556 1.222222222 2.5 1.277777778 2.611111111 6.722222222 Germany
65 2008–09 0.111111111 0.333333333 2.166666667 1.833333333 2.166666667 5.277777778 Germany
66 2009–10 0.277777778 0.611111111 2.166666667 1.555555556 2.277777778 6.722222222 Germany
67 2010–11 0.388888889 0.833333333 2.166666667 1.333333333 2.5 6.111111111 Germany
68 2011–12 0.444444444 1.166666667 2.777777778 1.611111111 3.055555556 9.166666667 Germany
69 2012–13 1.388888889 2 3.333333333 1.333333333 4.444444444 8.5 Germany
70 2013–14 1.055555556 1.611111111 3.5 1.888888889 3.944444444 8.444444444 Germany
71 2014–15 0.555555556 1 2.444444444 1.444444444 3.444444444 8.222222222 Germany
72 2015–16 0.555555556 1.833333333 2.888888889 1.055555556 3.5 8 Germany
73 2016–17 0.833333333 1.111111111 2.5 1.388888889 3.722222222 8.5 Germany
74 2017–18 1.166666667 1.611111111 2.833333333 1.222222222 3.555555556 6.388888889 Germany
75 2018–19 0.111111111 1.111111111 2.777777778 1.666666667 3.111111111 8 Germany
76 2019–20 0.722222222 0.944444444 2.833333333 1.888888889 3.777777778 10.05555556 Germany
77 2020–21 0.722222222 0.944444444 2.5 1.555555556 3.055555556 7.555555556 Germany
78 2021–22 0.444444444 1.055555556 2.444444444 1.388888889 3.333333333 8.944444444 Germany
79 2022–23 0 0.5 2.111111111 1.611111111 3 7.166666667 Germany
80 2023–24 0.944444444 1.388888889 3.166666667 1.777777778 3.611111111 10.61111111 Germany
81 2024–25 0.8125 1.5625 3.3125 1.75 4.1875 8.625 Germany
82 2025–26 1 1.6875 3.75 2.0625 5.375 10.1875 Germany
83 1999–20 0.055555556 0.777777778 2.555555556 1.777777778 1.722222222 5.777777778 Italy
84 2000–01 0.111111111 1.055555556 2.166666667 1.111111111 1.944444444 6.555555556 Italy
85 2001–02 0.055555556 0.888888889 2.388888889 1.5 2.277777778 6.444444444 Italy
86 2002–03 0.388888889 0.666666667 2.333333333 1.666666667 1.944444444 6.166666667 Italy
87 2003–04 0.611111111 1.277777778 2.888888889 1.611111111 2.277777778 7.611111111 Italy
88 2004–05 0.35 1.2 2.2 1 2 5.95 Italy
89 2005–06 0.35 1.1 2.35 1.25 1.9 6.25 Italy
90 2006–07 1.1 1.8 2.9 1.1 2.3 6.65 Italy
91 2007–08 0.15 0.95 2.45 1.5 2.15 6.45 Italy
92 2008–09 0.5 0.8 2.5 1.7 1.9 6 Italy
93 2009–10 0.1 0.75 2.35 1.6 2.05 4.85 Italy
94 2010–11 0.3 0.8 2.3 1.5 2.05 5.5 Italy
95 2011–12 0.2 1.1 2.4 1.3 2.4 5.75 Italy
96 2012–13 0.45 0.85 2.75 1.9 2.35 7 Italy
97 2013–14 0.85 1.85 3.5 1.65 2.85 8.15 Italy
98 2014–15 0.85 1.15 2.65 1.5 2.4 5.95 Italy
99 2015–16 0.45 1.2 2.65 1.45 2.75 7.85 Italy
100 2016–17 0.2 0.95 2.95 2 2.5 8.9 Italy
101 2017–18 0.2 1.15 3 1.85 3.1 8.95 Italy
102 2018–19 0.55 1.05 2.6 1.55 2 6.65 Italy
103 2019–20 0.05 0.25 2.4 2.15 1.65 8.25 Italy
104 2020–21 0.6 0.65 2.9 2.25 2.7 8.45 Italy
105 2021–22 0.1 0.8 2.8 2 1.9 7.65 Italy
106 2022–23 0.8 1 2.95 1.95 2.45 6.45 Italy
107 2023–24 0.95 1.25 2.95 1.7 3.35 7.35 Italy
108 2024–25 0.05 0.6 2.55 1.95 1.6 7 Italy
109 2025–26 0.55 0.8 2.65 1.85 2.7 7 Italy
110 1999–20 0.388888889 0.611111111 1.277777778 0.666666667 1.722222222 3.333333333 France
111 2000–01 0.222222222 0.611111111 1.722222222 1.111111111 1.222222222 4.444444444 France
112 2001–02 0.111111111 0.444444444 1.722222222 1.277777778 1.666666667 4.666666667 France
113 2002–03 0.05 0.2 1.5 1.3 1.1 4.05 France
114 2003–04 0.15 0.7 2.05 1.35 1.9 5.75 France
115 2004–05 0.6 1.2 1.85 0.65 1.7 4.05 France
116 2005–06 0.75 1.2 2.55 1.35 2.1 4.95 France
117 2006–07 0.85 1.2 2.1 0.9 1.85 3.05 France
118 2007–08 0.2 0.95 1.95 1 1.85 4.55 France
119 2008–09 0.15 0.8 2.15 1.35 1.5 5.15 France
120 2009–10 0.3 0.4 2.3 1.9 1.65 5.2 France
121 2010–11 0.4 0.8 1.6 0.8 1.6 4.55 France
122 2011–12 0.15 0.9 2.2 1.3 1.7 5.7 France
123 2012–13 0.6 0.95 2.25 1.3 2.3 4.3 France
124 2013–14 0.45 1 2.45 1.45 3.05 6.75 France
125 2014–15 0.4 0.7 2.3 1.6 2.35 7.25 France
126 2015–16 1.55 1.65 2.85 1.2 4.15 6.55 France
127 2016–17 0.4 1.4 2.95 1.55 3.8 9.4 France
128 2017–18 0.65 0.8 2.8 2 3.95 9.8 France
129 2018–19 0.8 1.25 2.85 1.6 3.5 7.3 France
130 2019–20 0.6 0.95 2.05 1.1 2.55 4.25 France
131 2020–21 0.05 0.35 2.15 1.8 2.05 8.55 France
132 2021–22 0.75 1 2.7 1.7 2.7 7.3 France
133 2022–23 0.05 0.85 2.95 2.1 2.45 7.25 France
134 2024–25 1.1875 1.5 3.1875 1.6875 3.5625 8.1875 France
135 2025–26 0.375 1 2.75 1.75 2.8125 6.5 France
136 2023–24 0.5 0.944444444 2.611111111 1.666666667 2.666666667 6.166666667 France
137 1999–20 0.222222222 1.222222222 2.444444444 1.222222222 1.944444444 6.055555556 Portugal
138 2000–01 0.055555556 1.111111111 2.5 1.388888889 2.277777778 6.444444444 Portugal
139 2001–02 0.277777778 0.666666667 2.5 1.833333333 2.722222222 7.944444444 Portugal
140 2002–03 0.611111111 2 2.777777778 0.777777778 2.611111111 6.055555556 Portugal
141 2003–04 0.444444444 1.444444444 2.611111111 1.166666667 2.444444444 7 Portugal
142 2004–05 0.166666667 0.388888889 1.722222222 1.333333333 1.111111111 4.444444444 Portugal
143 2005–06 0.388888889 1.166666667 2.5 1.333333333 2.111111111 5.666666667 Portugal
144 2006–07 0.0625 1.1875 2.9375 1.75 2.8125 7.75 Portugal
145 2007–08 1.25 1.4375 3.6875 2.25 2.9375 5.8125 Portugal
146 2008–09 0.25 1.125 2.9375 1.8125 2.6875 6.5625 Portugal
147 2009–10 0.3125 1.75 3.4375 1.6875 3.625 9.125 Portugal
148 2010–11 1.3125 2.375 3.8125 1.4375 3.5625 6.8125 Portugal
149 2011–12 0.375 1 3.5 2.5 3.125 8.75 Portugal
150 2012–13 0.0625 1.625 3.4375 1.8125 3.5 8.875 Portugal
151 2013–14 0.4375 1.25 3.125 1.875 2.5 7.625 Portugal
152 2014–15 0.166666667 1.5 3.166666667 1.666666667 3.888888889 10.88888889 Portugal
153 2015–16 0.111111111 1.666666667 3.222222222 1.555555556 3.666666667 10 Portugal
154 2016–17 0.333333333 1.111111111 2.777777778 1.666666667 3 8.277777778 Portugal
155 2017–18 0.388888889 0.722222222 3.166666667 2.444444444 3.555555556 11.44444444 Portugal
156 2018–19 0.111111111 1.111111111 3.055555556 1.944444444 4 10.22222222 Portugal
157 2019–20 0.277777778 1.222222222 2.666666667 1.444444444 2.888888889 7.388888889 Portugal
158 2020–21 0.277777778 1.166666667 2.833333333 1.666666667 2.5 8.444444444 Portugal
159 2021–22 0.333333333 1.444444444 3.444444444 2 3.555555556 10.16666667 Portugal
160 2022–23 0.111111111 0.722222222 3.388888889 2.666666667 3.444444444 10.94444444 Portugal
161 2023–24 0.555555556 1.222222222 3.222222222 2 3.722222222 9.611111111 Portugal
162 2024–25 0.125 1 3.4375 2.4375 3.8125 11.0625 Portugal
163 2025–26 0.375 1.8125 3.625 1.8125 3 11.875 Portugal
+25
View File
@@ -0,0 +1,25 @@
Stage,Unique teams,Country
Champions League,17,Spain
European,25,Spain
Relegated,42,Spain
Winners,5,Spain
Champions League,11,England
European,21,England
Relegated,39,England
Winners,6,England
Champions League,15,Germany
European,23,Germany
Relegated,32,Germany
Winners,6,Germany
Champions League,17,Italy
European,26,Italy
Relegated,40,Italy
Winners,6,Italy
Champions League,17,France
European,25,France
Relegated,35,France
Winners,8,France
Champions League,10,Portugal
European,23,Portugal
Relegated,36,Portugal
Winners,4,Portugal
1 Stage Unique teams Country
2 Champions League 17 Spain
3 European 25 Spain
4 Relegated 42 Spain
5 Winners 5 Spain
6 Champions League 11 England
7 European 21 England
8 Relegated 39 England
9 Winners 6 England
10 Champions League 15 Germany
11 European 23 Germany
12 Relegated 32 Germany
13 Winners 6 Germany
14 Champions League 17 Italy
15 European 26 Italy
16 Relegated 40 Italy
17 Winners 6 Italy
18 Champions League 17 France
19 European 25 France
20 Relegated 35 France
21 Winners 8 France
22 Champions League 10 Portugal
23 European 23 Portugal
24 Relegated 36 Portugal
25 Winners 4 Portugal
File diff suppressed because it is too large Load Diff
+36
View File
@@ -0,0 +1,36 @@
FROM rocker/shiny:4.4.0
# System dependencies commonly required by R packages
RUN apt-get update && apt-get install -y \
libcurl4-openssl-dev \
libssl-dev \
libxml2-dev \
libgit2-dev \
libfontconfig1-dev \
libharfbuzz-dev \
libfribidi-dev \
libfreetype6-dev \
libpng-dev \
libjpeg-dev \
libtiff5-dev \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /srv/shiny-server
# Copy the application
COPY . /srv/shiny-server/
# Prevent renv attempting to use pak
ENV RENV_CONFIG_PAK_ENABLED=FALSE
# Install renv and restore project packages
RUN R -e "install.packages('renv', repos='https://cran.rstudio.com'); \
renv::init(bare = TRUE); \
renv::restore(prompt = FALSE)"
# Permissions
RUN chown -R shiny:shiny /srv/shiny-server
EXPOSE 3838
CMD ["/usr/bin/shiny-server"]
+3
View File
@@ -0,0 +1,3 @@
# football_competitiveness
Exploration into the impact of competitiveness within a domestic football league on the teams performance in European competition
+200
View File
@@ -0,0 +1,200 @@
##k-means clustering----
#using all data
clustering_data_all <- scaled_full_data %>%
select(-c(Country, Season, season_start, European_performance, lead_european_performance))
#considering optimal clusters
n <- 10
wss <- numeric(n)
set.seed(123)
for (i in 1:n) {
km.out <- kmeans(clustering_data_all, centers = i, nstart = 20)
wss[i] <- km.out$tot.withinss
}
wss_df <- tibble(clusters = 1:n, wss = wss)
ggplot(wss_df, aes(x = clusters, y = wss, group = 1)) +
geom_point(size = 4)+
geom_line() +
scale_x_continuous(breaks = c(2, 4, 6, 8, 10)) +
xlab('Number of clusters')
#perform clustering
set.seed(123)
kmeans_model_all <- kmeans(clustering_data_all, centers = 3, nstart = 50)
#joining to data and considering characteristics of clusters
clustered_data_all <- pivoted_scaled_full_data_comp_breakdown %>%
mutate(cluster = as.factor(kmeans_model_all$cluster))
cluster_characteristics_all <- clustered_data_all %>%
group_by(cluster) %>%
summarise(across(where(is.numeric), mean, na.rm = TRUE)) %>%
select(-season_start)
#using principal components
clustering_data_pc <- pca_results %>%
select(contains("PC"))
#considering optimal clusters
n <- 10
wss <- numeric(n)
set.seed(123)
for (i in 1:n) {
km.out <- kmeans(clustering_data_pc, centers = i, nstart = 20)
wss[i] <- km.out$tot.withinss
}
wss_df <- tibble(clusters = 1:n, wss = wss)
ggplot(wss_df, aes(x = clusters, y = wss, group = 1)) +
geom_point(size = 4)+
geom_line() +
scale_x_continuous(breaks = c(2, 4, 6, 8, 10)) +
xlab('Number of clusters')
#perform clustering
set.seed(123)
kmeans_model_pc <- kmeans(clustering_data_pc, centers = 3, nstart = 50)
#joining to data and considering characteristics of clusters
clustered_data_pc <- pivoted_scaled_full_data_comp_breakdown %>%
mutate(cluster = as.factor(kmeans_model_pc$cluster))
cluster_characteristics_pc <- clustered_data_pc %>%
group_by(cluster) %>%
summarise(across(where(is.numeric), mean, na.rm = TRUE)) %>%
select(-season_start)
#using competitiveness indices
clustering_data_comp_index <- scaled_full_data_competitiveness_index %>%
select(contains("index")) %>%
select(1:3)
#considering optimal clusters
n <- 10
wss <- numeric(n)
set.seed(123)
for (i in 1:n) {
km.out <- kmeans(clustering_data_comp_index, centers = i, nstart = 20)
wss[i] <- km.out$tot.withinss
}
wss_df <- tibble(clusters = 1:n, wss = wss)
ggplot(wss_df, aes(x = clusters, y = wss, group = 1)) +
geom_point(size = 4)+
geom_line() +
scale_x_continuous(breaks = c(2, 4, 6, 8, 10)) +
xlab('Number of clusters')
#perform clustering
set.seed(123)
kmeans_model_comp_index <- kmeans(clustering_data_comp_index, centers = 3, nstart = 50)
#joining to data and considering characteristics of clusters
clustered_data_comp_index <- pivoted_scaled_full_data_comp_breakdown_competitiveness_index %>%
mutate(cluster = as.factor(kmeans_model_comp_index$cluster))
cluster_characteristics_comp_index <- clustered_data_comp_index %>%
group_by(cluster) %>%
summarise(across(where(is.numeric), mean, na.rm = TRUE)) %>%
select(-season_start)
plotting_cluster_data <- cluster_characteristics_comp_index %>% select(-11:-19)
##Evaluating clusters----
compare_clusters <- function(data, km_model, name) {
dist_matrix <- dist(data)
sil <- silhouette(km_model$cluster, dist_matrix)
stats <- cluster.stats(dist_matrix, km_model$cluster)
tibble(
model = name,
avg_silhouette = mean(sil[, 3]),
dunn_index = stats$dunn,
within_ss = km_model$tot.withinss,
between_ss = km_model$betweenss,
total_ss = km_model$totss,
variance_explained = km_model$betweenss / km_model$totss
)
}
comparison <- bind_rows(
compare_clusters(clustering_data_all, kmeans_model_all, "All variables"),
compare_clusters(clustering_data_pc, kmeans_model_pc, "Principal components"),
compare_clusters(clustering_data_comp_index, kmeans_model_comp_index, "Theory-based indices")
) %>%
arrange(desc(avg_silhouette), desc(dunn_index), desc(variance_explained))
##evaluating 'best' (indices) model
#full European performance
anova_model <- aov(European_performance ~ cluster, data = clustered_data_comp_index)
summary(anova_model)
kruskal.test(European_performance ~ cluster, data = clustered_data_comp_index)
panel_clusters <- plm(
European_performance ~ cluster,
data = clustered_data_comp_index,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_clusters)
coeftest(panel_clusters, vcov = vcovHC, type = "HC1")
#lead European performance
anova_model <- aov(lead_european_performance ~ cluster, data = clustered_data_comp_index)
summary(anova_model)
kruskal.test(lead_european_performance ~ cluster, data = clustered_data_comp_index)
panel_clusters_lead <- plm(
lead_european_performance ~ cluster,
data = clustered_data_comp_index,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_clusters_lead)
coeftest(panel_clusters_lead, vcov = vcovHC, type = "HC1")
#CL performance
anova_model <- aov(European_performance_CL ~ cluster, data = clustered_data_comp_index)
summary(anova_model)
kruskal.test(European_performance_CL ~ cluster, data = clustered_data_comp_index)
panel_clusters_CL <- plm(
European_performance_CL ~ cluster,
data = clustered_data_comp_index,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_clusters_CL)
coeftest(panel_clusters_CL, vcov = vcovHC, type = "HC1")
#EL performance
anova_model <- aov(European_performance_EL ~ cluster, data = clustered_data_comp_index)
summary(anova_model)
kruskal.test(European_performance_EL ~ cluster, data = clustered_data_comp_index)
panel_clusters_EL <- plm(
European_performance_EL ~ cluster,
data = clustered_data_comp_index,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_clusters_EL)
coeftest(panel_clusters_EL, vcov = vcovHC, type = "HC1")
##finding seasons closest to cluster centre
closest_n_per_cluster <- clustered_data_comp_index %>%
group_by(cluster) %>%
group_modify(~ {
cluster_id <- as.character(.y$cluster)
center_coords <- kmeans_model_comp_index$centers[cluster_id, , drop = FALSE]
matrix_data <- .x %>% select(contains("index")) %>% as.matrix()
center_matrix <- matrix(center_coords, nrow = nrow(matrix_data), ncol = ncol(matrix_data), byrow = TRUE)
.x %>% mutate(
Distance = sqrt(rowSums((matrix_data - center_matrix)^2))
)
}) %>%
ungroup() %>%
group_by(cluster) %>%
slice_min(order_by = Distance, n = 10, with_ties = FALSE) %>%
relocate(c(cluster, Season, Country, European_performance))
+126
View File
@@ -0,0 +1,126 @@
European_performance_data = read_csv('Data/European performance historical data.csv')
Points_difference_data <- read_csv("Data/Points difference.csv")
Players_used_data <- read_csv("Data/European clubs number of players used.csv")
Top_goalscorers_data <- read_csv("Data/Average top scorers.csv")
Market_value_data <- read_csv("Data/Market values.csv")
gini_coeffecient_data <- Market_value_data %>%
select(-`Average market value of clubs`)
all_seasons <- unique(European_performance_data$Season)
overall_country_performance <- European_performance_data %>%
group_by(Country) %>%
summarise(total_performance = sum(European_performance, na.rm = TRUE)) %>%
arrange(desc(total_performance))
#season by season performance
country_performance_by_season <- European_performance_data %>%
filter(Country %in% c("Germany", "Spain", "England", "Portugal", "Italy", "France")) %>%
group_by(Country, Season) %>%
summarise(
European_performance = sum(European_performance, na.rm = TRUE),
.groups = "drop"
) %>%
complete(Country, Season = all_seasons, fill = list(European_performance = 0))
#season by season performance by competition
country_performance_by_season_comp_breakdown <- European_performance_data %>%
filter(Country %in% c("Germany", "Spain", "England", "Portugal", "Italy", "France")) %>%
group_by(Country, Season) %>%
summarise(
CL = sum(European_performance[Competition == "CL"], na.rm = TRUE),
EL = sum(European_performance[Competition == "EL"], na.rm = TRUE),
.groups = "drop"
) %>%
complete(Country, Season = all_seasons, fill = list(CL = 0, EL = 0)) %>%
pivot_longer(cols = c("CL", "EL"), names_to = "competition", values_to = "European_performance") %>%
mutate(European_performance = ifelse(competition == "CL", European_performance/2, European_performance)) #halving score for CL as had double weighting
#join all metrics data together
#impute missing Gini coefficient with average for league - assumed the same over time
season_league_metrics_dataset <- Points_difference_data %>%
left_join(Players_used_data, by = c("Country", "Season")) %>%
left_join(Top_goalscorers_data, by = c("Country", "Season")) %>%
left_join(gini_coeffecient_data, by = c("Country", "Season")) %>%
mutate(season_start = as.integer(str_extract(Season, "^\\d{4}"))) %>%
group_by(Country) %>%
mutate(Gini_coefficient = coalesce(Gini_coefficient, mean(Gini_coefficient, na.rm = TRUE))) %>%
ungroup()
#average country performance
average_country_metrics <- season_league_metrics_dataset %>%
group_by(Country) %>%
summarise(across(!contains("eason"), mean, na.rm = TRUE))
#scaling to min-max of variables
average_country_metrics_scaled <- average_country_metrics
average_country_metrics_scaled[,-1] <- lapply(average_country_metrics[,-1], function(x) {
(x - min(x)) / (max(x) - min(x))
})
#scaling metrics normally
scaled_metrics_data <- season_league_metrics_dataset %>%
mutate(across(
c(First_and_second, First_and_CL, First_and_relegated, CL_and_relegated,
Winners_GD, Top_4_total_GD, Average_number_of_players,
Average_goals_by_top_3_players, Gini_coefficient),
~ as.numeric(scale(.))
))
#join metrics data to European performance data
#calculate European performance in next season as lead
season_league_full_dataset <- season_league_metrics_dataset %>%
left_join(country_performance_by_season, by = c("Country", "Season")) %>%
arrange(Season, Country) %>%
group_by(Country) %>%
mutate(lead_european_performance = dplyr::lead(European_performance)) %>%
ungroup()
#join metrics data to European performance data by competition
#calculate European performance in next season as lead
season_league_full_dataset_comp_breakdown <- season_league_metrics_dataset %>%
left_join(country_performance_by_season_comp_breakdown, by = c("Country", "Season")) %>%
arrange(Season, Country) %>%
group_by(Country, competition) %>%
mutate(lead_european_performance = dplyr::lead(European_performance)) %>%
ungroup()
#full data scaled
scaled_full_data <- scaled_metrics_data %>%
left_join(country_performance_by_season, by = c("Country", "Season")) %>%
arrange(Season, Country) %>%
group_by(Country) %>%
mutate(lead_european_performance = dplyr::lead(European_performance)) %>%
ungroup()
#data by competition scaled
scaled_full_data_comp_breakdown <- scaled_metrics_data %>%
left_join(country_performance_by_season_comp_breakdown, by = c("Country", "Season")) %>%
arrange(Season, Country) %>%
group_by(Country, competition) %>%
mutate(lead_european_performance = dplyr::lead(European_performance)) %>%
ungroup()
#full dataset with competition breakdown and full
pivoted_scaled_full_data_comp_breakdown <- scaled_full_data_comp_breakdown %>%
pivot_wider(names_from = competition, values_from = c(European_performance, lead_european_performance)) %>%
mutate(European_performance = 2*European_performance_CL + European_performance_EL,
lead_european_performance = 2*lead_european_performance_CL + lead_european_performance_EL)
#basic profiling based on European performance
quantile_splits <- scaled_full_data %>%
mutate(
performance_group = ntile(European_performance, 3)
)
european_performance_groups_characteristics <- quantile_splits %>%
group_by(performance_group) %>%
summarise(across(where(is.numeric), mean, na.rm = TRUE)) %>%
select(-season_start) %>%
mutate(label = case_when(
performance_group == 1 ~ "Worst performing",
performance_group == 2 ~ "Middle performing",
performance_group == 3 ~ "Best performing"
)) %>%
mutate(performance_group = case_when(
label == "Worst performing" ~ 1,
label == "Middle performing" ~ 3,
label == "Best performing" ~ 2
))
+126
View File
@@ -0,0 +1,126 @@
##correlation coefficient----
cor_matrix <- season_league_full_dataset %>%
select(-c(Country, Season, season_start)) %>%
cor(use = "pairwise.complete.obs")
plot_ly(
x = colnames(cor_matrix),
y = rownames(cor_matrix),
z = cor_matrix,
type = "heatmap",
colorscale = "RdBu",
zmin = -1,
zmax = 1,
showscale = TRUE
) %>%
add_trace(
x = rep(colnames(cor_matrix), each = nrow(cor_matrix)),
y = rep(rownames(cor_matrix), times = ncol(cor_matrix)),
text = sprintf("%.2f", as.vector(cor_matrix)),
type = "scatter",
mode = "text" ,
textfont = list(color = "black"),
hoverinfo = "none",
showlegend = FALSE
) %>%
layout(
xaxis = list(tickangle = 45),
yaxis = list(autorange = "reversed")
)
#drop multicollinearity variables
season_league_full_dataset_no_multicollinearity <- season_league_full_dataset %>%
select(-c(Winners_GD, First_and_relegated))
##competitiveness index----
scaled_full_data_competitiveness_index <- scaled_full_data %>%
mutate(competitive_title_index =
rowMeans(cbind(-First_and_second, -First_and_CL)),
elite_dominance_index =
rowMeans(cbind(CL_and_relegated, Top_4_total_GD, Gini_coefficient,
Average_goals_by_top_3_players)),
competitive_balance_index =
rowMeans(cbind(-First_and_second, -First_and_CL, -CL_and_relegated,
-Top_4_total_GD, -Gini_coefficient)),
player_rotation_index = Average_number_of_players,
multilevel_competitiveness_index =
rowMeans(cbind(-First_and_second, -First_and_CL, -CL_and_relegated))
)
#by competition breakdown
scaled_full_data_comp_breakdown_competitiveness_index <- scaled_full_data_comp_breakdown %>%
mutate(competitive_title_index =
rowMeans(cbind(-First_and_second, -First_and_CL)),
elite_dominance_index =
rowMeans(cbind(CL_and_relegated, Top_4_total_GD, Gini_coefficient,
Average_goals_by_top_3_players)),
competitive_balance_index =
rowMeans(cbind(-First_and_second, -First_and_CL, -CL_and_relegated,
-Top_4_total_GD, -Gini_coefficient)),
player_rotation_index = Average_number_of_players,
multilevel_competitiveness_index =
rowMeans(cbind(-First_and_second, -First_and_CL, -CL_and_relegated))
)
#for clustering
pivoted_scaled_full_data_comp_breakdown_competitiveness_index <- scaled_full_data_comp_breakdown_competitiveness_index %>%
pivot_wider(names_from = competition, values_from = c(European_performance, lead_european_performance)) %>%
mutate(European_performance = 2*European_performance_CL + European_performance_EL,
lead_european_performance = 2*lead_european_performance_CL + lead_european_performance_EL)
##principal component analysis----
pca_data <- season_league_full_dataset %>%
select(-c(Season, Country, season_start, European_performance, lead_european_performance))
pca <- prcomp(pca_data, center = TRUE, scale. = TRUE)
#weights of each variable in the principal components
loadings <- as.data.frame(pca$rotation) %>%
rownames_to_column("Variable")
#calculating proportion of variance explained by each component
pca.var <- pca$sdev^2
propve <- pca.var / sum(pca.var)
plot(cumsum(propve), xlab = "Principal Component",
ylab = "Cumulative Proportion of Variance Explained",
ylim = c(0, 1), type = "b")
abline(h=0.9, lty = "dashed")
which(cumsum(propve) >= 0.9)[1] #number of principal components that explain at least 90% of variance
#values of the observations on each principal component
pc_scores <- as.data.frame(pca$x[, 1:5])
pc_scores["PC1"] <- pc_scores["PC1"] * -1
pca_results <- bind_cols(
scaled_full_data,
pc_scores
)
#by competition breakdown
comp_breakdown_pc_scores <- pc_scores %>%
slice(rep(1:n(), each = 2))
pca_results_comp_breakdown <- bind_cols(
scaled_full_data_comp_breakdown,
comp_breakdown_pc_scores
)
#reformatting data for plotting composition of components
loadings_plotting <- loadings %>%
select(Variable, PC1:PC5) %>%
pivot_longer(
cols = starts_with("PC"),
names_to = "PC",
values_to = "Loading"
) %>%
mutate(Loading = ifelse(PC == "PC1", Loading*-1, Loading))
#plotting
ggplot(loadings_plotting %>% filter(PC == "PC4"),
aes(x = reorder(Variable, abs(Loading)),
y = Loading,
fill = Loading > 0)) +
geom_col() +
coord_flip() +
scale_fill_manual(values = c("TRUE" = "steelblue",
"FALSE" = "firebrick")) +
labs(
x = NULL,
y = "Loading",
title = "PCA Loadings for Principal Components explaining 90% of variance"
) +
theme_minimal() +
theme(
legend.position = "none",
strip.text = element_text(face = "bold")
)
+13
View File
@@ -0,0 +1,13 @@
Version: 1.0
RestoreWorkspace: Default
SaveWorkspace: Default
AlwaysSaveHistory: Default
EnableCodeIndexing: Yes
UseSpacesForTab: Yes
NumSpacesForTab: 2
Encoding: UTF-8
RnwWeave: Sweave
LaTeX: pdfLaTeX
+181
View File
@@ -0,0 +1,181 @@
wrap_plotly_title <- function(title, width, type = "normal") {
if(type == "yaxis"){
max_chars <- ifelse(width <= 767, 30, 50)
} else {
max_chars <- ifelse(width <= 767, 40, 100)
}
line_break <- "<br>"
words <- strsplit(title, " ")[[1]]
new_title <- ""
current_line <- ""
for (word in words) {
if (nchar(current_line) + nchar(word) + 1 > max_chars) {
new_title <- paste0(new_title, trimws(current_line), line_break)
current_line <- word
} else {
current_line <- paste(current_line, word)
}
}
new_title <- paste0(new_title, trimws(current_line))
return(new_title)
}
custom_plotly <- function(..., xaxis_title, yaxis_title, width, hover_info = TRUE) {
p <- plot_ly(...) %>%
layout(
xaxis = list(
title = list(text = wrap_plotly_title(xaxis_title, width), standoff = 10),
fixedrange = TRUE,
automargin = TRUE,
tickangle = ifelse(width <= 767, 90, "auto")
),
yaxis = list(
title = list(text = wrap_plotly_title(yaxis_title, width, "yaxis"), standoff = 10),
rangemode = "tozero",
tickformat = ",d",
fixedrange = TRUE
),
legend = list(
orientation = "h",
xanchor = "center",
x = 0.5,
y = ifelse(width <= 767, -0.4, -0.25)
),
autosize = TRUE,
dragmode = FALSE
) %>%
config(
displayModeBar = FALSE,
responsive = TRUE,
scrollZoom = FALSE,
doubleClick = FALSE
)
if (hover_info == TRUE){
p <- p %>%
style(hovertemplate = "%{x}<br>%{y}<extra></extra>", legendgroup = NULL)
}
return(p)
}
regression_coefficient_data <- function(regression_result){
coef_plot <- tidy(coeftest(regression_result, vcov = vcovHC, type = "HC1")) %>%
mutate(conf.low = estimate - 1.96 * std.error,
conf.high = estimate + 1.96 * std.error) %>%
filter(p.value < 0.1)
return(coef_plot)
}
coefficient_plot_function <- function(regression_result, coefficient_plotting_data = NULL, width, range_val = 10) {
if (!is.null(regression_result)) {
coefficient_plotting_data <- regression_coefficient_data(regression_result)
}
coefficient_plotting_data <- coefficient_plotting_data %>%
mutate(term = gsub("_", " ", term))
custom_plotly(
data = coefficient_plotting_data,
x = ~estimate,
y = ~reorder(term, estimate),
type = "scatter",
mode = "markers",
marker = list(size = 10),
error_x = list(
type = "data",
symmetric = FALSE,
array = ~conf.high - estimate,
arrayminus = ~estimate - conf.low
),
hovertemplate = paste(
"<b>%{y}</b><br>",
"Estimate: %{x:.3f}<br>",
"<extra></extra>"
),
xaxis_title = "Estimated coefficient",
yaxis_title = "",
width = width,
hover_info = FALSE
) %>%
layout(autosize = FALSE,
margin = list(
l = 225
),
xaxis = list(
range = c(-range_val, range_val),
zeroline = FALSE,
fixedrange = TRUE
),
yaxis = list(
title = ""
),
shapes = list(
list(
type = "line",
x0 = 0, x1 = 0,
y0 = 0, y1 = 1,
yref = "paper",
line = list(
color = "grey50",
dash = "dash"
)
)
),
showlegend = FALSE
)
}
# coefficient_plot_function <- function(regression_result, coefficient_plotting_data = NULL){
# if (!is.null(regression_result)){
# coefficient_plotting_data <- regression_coefficient_data(regression_result)
# }
#
# plot_ly(
# data = coefficient_plotting_data,
# x = ~estimate,
# y = ~reorder(term, estimate),
# type = "scatter",
# mode = "markers",
# marker = list(size = 10),
# error_x = list(
# type = "data",
# symmetric = FALSE,
# array = ~conf.high - estimate,
# arrayminus = ~estimate - conf.low
# ),
# hovertemplate = paste(
# "<b>%{y}</b><br>",
# "Estimate: %{x:.3f}<br>",
# "<extra></extra>"
# )
# ) %>%
# layout(
# xaxis = list(
# title = "Estimated coefficient",
# range = c(-10, 10),
# zeroline = FALSE
# ),
# yaxis = list(
# title = ""
# ),
# shapes = list(
# list(
# type = "line",
# x0 = 0, x1 = 0,
# y0 = 0, y1 = 1,
# yref = "paper",
# line = list(
# color = "grey50",
# dash = "dash"
# )
# )
# )
# )
# }
+19
View File
@@ -0,0 +1,19 @@
library(plotly)
library(shiny)
library(shinyjs)
library(htmlwidgets)
library(tidyverse)
library(DT)
library(plm)
library(lmtest)
library(cluster)
library(fpc)
library(broom)
source("scrolly_functions.R")
source("text.R")
source("functions.R")
source("data_manipulation.R")
source("feature_engineering.R")
source("regression.R")
source("clustering.R")
+570
View File
@@ -0,0 +1,570 @@
##panel regression----
##all data with multicollinearity accounted for
# panel_all <- plm(
# European_performance ~
# First_and_second +
# First_and_CL +
# CL_and_relegated +
# Top_4_total_GD +
# Average_number_of_players +
# Average_goals_by_top_3_players +
# Gini_coefficient,
# data = scaled_full_data,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_all)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_all, vcov = vcovHC, type = "HC1")
# #rerun with only significant vars
# panel_all_robust <- plm(
# European_performance ~
# Top_4_total_GD +
# Average_goals_by_top_3_players +
# Gini_coefficient,
# data = scaled_full_data,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_all_robust)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_all_robust, vcov = vcovHC, type = "HC1")
#rerun with only significant vars & theory included
panel_all_robust_theory <- plm(
European_performance ~
First_and_second +
CL_and_relegated +
Top_4_total_GD +
Average_goals_by_top_3_players +
Gini_coefficient,
data = scaled_full_data,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_all_robust_theory)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_all_robust_theory, vcov = vcovHC, type = "HC1")
##using principal components
panel_pc <- plm(
European_performance ~
PC1 +
PC2 +
PC3 +
PC4 +
PC5,
data = pca_results,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_pc)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_pc, vcov = vcovHC, type = "HC1")
# #rerun with only significant pcs
# panel_pc_robust <- plm(
# European_performance ~
# PC1 +
# PC4,
# data = pca_results,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_pc_robust)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_pc_robust, vcov = vcovHC, type = "HC1")
##using competitive indices
panel_indices_multi <- plm(
European_performance ~
competitive_title_index +
elite_dominance_index +
player_rotation_index,
data = scaled_full_data_competitiveness_index,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_indices_multi)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_indices_multi, vcov = vcovHC, type = "HC1")
panel_indices_title <- plm(
European_performance ~ competitive_title_index,
data = scaled_full_data_competitiveness_index,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_indices_title)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_indices_title, vcov = vcovHC, type = "HC1")
panel_indices_dominance <- plm(
European_performance ~ elite_dominance_index,
data = scaled_full_data_competitiveness_index,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_indices_dominance)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_indices_dominance, vcov = vcovHC, type = "HC1")
panel_indices_competitiveness <- plm(
European_performance ~ competitive_balance_index,
data = scaled_full_data_competitiveness_index,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_indices_competitiveness)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_indices_competitiveness, vcov = vcovHC, type = "HC1")
panel_indices_points <- plm(
European_performance ~ multilevel_competitiveness_index,
data = scaled_full_data_competitiveness_index,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_indices_points)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_indices_points, vcov = vcovHC, type = "HC1")
# panel_indices_players <- plm(
# European_performance ~ player_rotation_index,
# data = scaled_full_data_competitiveness_index,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_indices_players)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_indices_players, vcov = vcovHC, type = "HC1")
indices_all_plotting_data <- regression_coefficient_data(panel_indices_multi) %>%
mutate(term = paste0(term, " (multi)")) %>%
rbind(regression_coefficient_data(panel_indices_title)) %>%
rbind(regression_coefficient_data(panel_indices_dominance)) %>%
rbind(regression_coefficient_data(panel_indices_competitiveness)) %>%
rbind(regression_coefficient_data(panel_indices_points))
##panel regression using next years European performance value----
##all data with multicollinearity accounted for
panel_all_lead <- plm(
lead_european_performance ~
First_and_second +
First_and_CL +
CL_and_relegated +
Top_4_total_GD +
Average_number_of_players +
Average_goals_by_top_3_players +
Gini_coefficient,
data = scaled_full_data,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_all_lead)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_all_lead, vcov = vcovHC, type = "HC1")
# #rerun with only significant vars & theory included
# panel_all_lead_robust_theory <- plm(
# lead_european_performance ~
# First_and_CL +
# CL_and_relegated +
# Top_4_total_GD +
# Average_goals_by_top_3_players +
# Gini_coefficient,
# data = scaled_full_data,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_all_lead_robust_theory)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_all_lead_robust_theory, vcov = vcovHC, type = "HC1")
##using principal components
panel_lead_pc <- plm(
lead_european_performance ~
PC1 +
PC2 +
PC3 +
PC4 +
PC5,
data = pca_results,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_lead_pc)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_lead_pc, vcov = vcovHC, type = "HC1")
#rerun with only significant pcs
# panel_lead_pc_robust <- plm(
# lead_european_performance ~
# PC1 +
# PC3 +
# PC4,
# data = pca_results,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_lead_pc_robust)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_lead_pc_robust, vcov = vcovHC, type = "HC1")
##using competitive indices
panel_indices_multi_lead <- plm(
lead_european_performance ~
competitive_title_index +
elite_dominance_index +
player_rotation_index,
data = scaled_full_data_competitiveness_index,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_indices_multi_lead)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_indices_multi_lead, vcov = vcovHC, type = "HC1")
# panel_indices_title_lead <- plm(
# lead_european_performance ~ competitive_title_index,
# data = scaled_full_data_competitiveness_index,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_indices_title_lead)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_indices_title_lead, vcov = vcovHC, type = "HC1")
panel_indices_dominance_lead <- plm(
lead_european_performance ~ elite_dominance_index,
data = scaled_full_data_competitiveness_index,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_indices_dominance_lead)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_indices_dominance_lead, vcov = vcovHC, type = "HC1")
panel_indices_competitiveness_lead <- plm(
lead_european_performance ~ competitive_balance_index,
data = scaled_full_data_competitiveness_index,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_indices_competitiveness_lead)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_indices_competitiveness_lead, vcov = vcovHC, type = "HC1")
# panel_indices_points_lead <- plm(
# lead_european_performance ~ multilevel_competitiveness_index,
# data = scaled_full_data_competitiveness_index,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_indices_points_lead)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_indices_points_lead, vcov = vcovHC, type = "HC1")
# panel_indices_players_lead <- plm(
# lead_european_performance ~ player_rotation_index,
# data = scaled_full_data_competitiveness_index,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_indices_players_lead)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_indices_players_lead, vcov = vcovHC, type = "HC1")
indices_lead_plotting_data <- regression_coefficient_data(panel_indices_multi_lead) %>%
mutate(term = paste0(term, " (multi)")) %>%
rbind(regression_coefficient_data(panel_indices_dominance_lead)) %>%
rbind(regression_coefficient_data(panel_indices_competitiveness_lead))
##panel regression for CL----
##all data with multicollinearity accounted for
CL_scaled_data <- scaled_full_data_comp_breakdown %>% filter(competition == "CL")
panel_all_CL <- plm(
European_performance ~
First_and_second +
First_and_CL +
CL_and_relegated +
Top_4_total_GD +
Average_number_of_players +
Average_goals_by_top_3_players +
Gini_coefficient,
data = CL_scaled_data,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_all_CL)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_all_CL, vcov = vcovHC, type = "HC1")
#rerun with only significant vars
# panel_all_CL_robust <- plm(
# European_performance ~
# CL_and_relegated +
# Top_4_total_GD +
# Average_goals_by_top_3_players +
# Gini_coefficient,
# data = CL_scaled_data,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_all_CL_robust)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_all_CL_robust, vcov = vcovHC, type = "HC1")
##using principal components
CL_pca_results <- pca_results_comp_breakdown %>% filter(competition == "CL")
panel_pc_CL <- plm(
European_performance ~
PC1 +
PC2 +
PC3 +
PC4 +
PC5,
data = CL_pca_results,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_pc_CL)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_pc_CL, vcov = vcovHC, type = "HC1")
#rerun with only significant pcs
# panel_pc_CL_robust <- plm(
# European_performance ~
# PC1 +
# PC3 +
# PC4,
# data = CL_pca_results,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_pc_CL_robust)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_pc_CL_robust, vcov = vcovHC, type = "HC1")
##using competitive indices
CL_competitive_index <- scaled_full_data_comp_breakdown_competitiveness_index %>% filter(competition == "CL")
panel_indices_multi_CL <- plm(
European_performance ~
competitive_title_index +
elite_dominance_index +
player_rotation_index,
data = CL_competitive_index,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_indices_multi_CL)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_indices_multi_CL, vcov = vcovHC, type = "HC1")
# panel_indices_title_CL <- plm(
# European_performance ~ competitive_title_index,
# data = CL_competitive_index,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_indices_title_CL)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_indices_title_CL, vcov = vcovHC, type = "HC1")
panel_indices_dominance_CL <- plm(
European_performance ~ elite_dominance_index,
data = CL_competitive_index,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_indices_dominance_CL)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_indices_dominance_CL, vcov = vcovHC, type = "HC1")
panel_indices_competitiveness_CL <- plm(
European_performance ~ competitive_balance_index,
data = CL_competitive_index,
index = c("Country","season_start"),
effect = "twoways",
model = "within"
)
summary(panel_indices_competitiveness_CL)
#compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
coeftest(panel_indices_competitiveness_CL, vcov = vcovHC, type = "HC1")
# panel_indices_points_CL <- plm(
# European_performance ~ multilevel_competitiveness_index,
# data = CL_competitive_index,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_indices_points_CL)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_indices_points_CL, vcov = vcovHC, type = "HC1")
# panel_indices_players_CL <- plm(
# European_performance ~ player_rotation_index,
# data = CL_competitive_index,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_indices_players_CL)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_indices_players_CL, vcov = vcovHC, type = "HC1")
##panel regression for EL----
##all data with multicollinearity accounted for
# EL_scaled_data <- scaled_full_data_comp_breakdown %>% filter(competition == "EL")
# panel_all_EL <- plm(
# European_performance ~
# First_and_second +
# First_and_CL +
# CL_and_relegated +
# Top_4_total_GD +
# Average_number_of_players +
# Average_goals_by_top_3_players +
# Gini_coefficient,
# data = EL_scaled_data,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_all_EL)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_all_EL, vcov = vcovHC, type = "HC1")
##using principal components
# EL_pca_results <- pca_results_comp_breakdown %>% filter(competition == "EL")
# panel_pc_EL <- plm(
# European_performance ~
# PC1 +
# PC2 +
# PC3 +
# PC4 +
# PC5,
# data = EL_pca_results,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_pc_EL)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_pc_EL, vcov = vcovHC, type = "HC1")
##using competitive indices
# EL_competitive_index <- scaled_full_data_comp_breakdown_competitiveness_index %>% filter(competition == "EL")
# panel_indices_multi_EL <- plm(
# European_performance ~
# competitive_title_index +
# elite_dominance_index +
# player_rotation_index,
# data = EL_competitive_index,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_indices_multi_EL)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_indices_multi_EL, vcov = vcovHC, type = "HC1")
# panel_indices_title_EL <- plm(
# European_performance ~ competitive_title_index,
# data = EL_competitive_index,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_indices_title_EL)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_indices_title_EL, vcov = vcovHC, type = "HC1")
# panel_indices_dominance_EL <- plm(
# European_performance ~ elite_dominance_index,
# data = EL_competitive_index,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_indices_dominance_EL)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_indices_dominance_EL, vcov = vcovHC, type = "HC1")
# panel_indices_competitiveness_EL <- plm(
# European_performance ~ competitive_balance_index,
# data = EL_competitive_index,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_indices_competitiveness_EL)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_indices_competitiveness_EL, vcov = vcovHC, type = "HC1")
# panel_indices_points_EL <- plm(
# European_performance ~ multilevel_competitiveness_index,
# data = EL_competitive_index,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_indices_points_EL)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_indices_points_EL, vcov = vcovHC, type = "HC1")
# panel_indices_players_EL <- plm(
# European_performance ~ player_rotation_index,
# data = EL_competitive_index,
# index = c("Country","season_start"),
# effect = "twoways",
# model = "within"
# )
# summary(panel_indices_players_EL)
# #compute clustered standard errors (adjustment for autocorrelation + heteroskedasticity)
# coeftest(panel_indices_players_EL, vcov = vcovHC, type = "HC1")
indices_comp_breakdown_plotting_data <- regression_coefficient_data(panel_indices_multi_CL) %>%
mutate(term = paste0(term, " (CL multi)")) %>%
rbind(regression_coefficient_data(panel_indices_dominance_CL) %>% mutate(term = paste0(term, " (CL)"))) %>%
rbind(regression_coefficient_data(panel_indices_competitiveness_CL) %>% mutate(term = paste0(term, " (CL)")))
+1969
View File
File diff suppressed because it is too large Load Diff
+1220
View File
File diff suppressed because it is too large Load Diff
+322
View File
@@ -0,0 +1,322 @@
create_scrolly_side <- function(name,css
) {
name<-name
css<-paste0(
"
#scrolly-side .scrolly article .scrolly-side {
min-height: 105vh;
margin-bottom: 1rem;
}
#scrolly-side .scrolly article .scrolly-side.is-active p {
background-color: #f4f4f4;
opacity:1;
color:black;
border-radius: 25px;
}
#scrolly-side .scrolly article .scrolly-side p {
margin: 0;
padding: 1rem;
text-align: left;
font-weight: 400;
opacity:0.3;
transition: background-color 250ms ease-in-out;
color:black;
border-radius: 25px;
}
/* css when screen is larger than 768px */
@media screen and (min-width: 768px){
#scrolly-side .scrolly article {
padding: 0;
margin: 0 auto;
max-width:40%;
position: relative;
text-align: left;
font-size: 20px;
}
#scrolly-side .scrolly {
display: flex; /* this is what stops content overlapping */
max-width:100%;
margin: 3rem auto;
background-color:#ffffff;
padding: 1rem;
border-radius:0;
gap:10px;
}
#scrolly-side .scrolly figure.sticky {
position: sticky;
width: 100%;
height: 80vh;
background: #ffffff;
margin: 10;
top: 10vh;
left: 0;
border-radius: 25px;
order: 1;
}
}
@media screen and (max-width: 767px){
#scrolly-side .scrolly article {
padding: 0;
margin: 0 auto;
max-width:100%;
position: relative;
text-align: left;
font-size: 15px;
pointer-events: none !important;
}
#scrolly-side .scrolly {
max-width:90%;
margin: 3rem auto;
background-color: #ffffff;
opacity:1;
padding: 1rem;
border-radius: 25px;
}
#scrolly-side .scrolly article .scrolly-side p {
border-radius: 25px;
background-color: #F4F4F4;
opacity:1;
color:black;
max-width:100%;
}
#scrolly-side .scrolly figure.sticky {
position: sticky;
width: 100%;
height: 40vh;
background: #ffffff;
margin: 10;
top: 30vh;
left: 0;
border-radius: 25px;
order: 1;
}
#scrolly-side .sticky{
position: relative;
z-index: 0;
pointer-events: auto;
}
#scrolly-side .text-article{
pointer-events: none !important;
}
#scrolly-side .text-article .detail-toggle-btn {
pointer-events: auto !important;
}
}
")
#### script #####
js<-"<script>
const container = d3.select('#scrolly-side');
const stepSel = container.selectAll('.step');
function updateChart(index) {
const sel = container.select(`[data-index='${index}']`);
const width = sel.attr('data-width');
stepSel.classed('is-active', (d, i) => i === index);
container.select('.bar-inner').style('width', width);
Shiny.setInputValue(\"input1\", index)
}
function init() {
Stickyfill.add(d3.select('.sticky').node());
enterView({
selector: stepSel.nodes(),
offset: 0.5,
enter: el => {
const index = +d3.select(el).attr('data-index');
updateChart(index);
},
exit: el => {
let index = +d3.select(el).attr('data-index');
index = Math.max(0, index - 1);
updateChart(index);
} });
}
init();
</script>"
css<-gsub("scrolly-side",name,css)
css<-gsub("step",name,css)
js<-gsub("step",name,js)
js<-gsub("scrolly-side",name,js)
js<-gsub("container",paste0("container",name),js)
js<-gsub("updateChart",paste0("updateChart",name),js)
js<-gsub("init",paste0("init",name),js)
js<-gsub("input1",paste0(name),js)
list<-list(css,js)
return(list)
}
##### create_scrolly_overlay ####
create_scrolly_overlay <- function(name) {
name<-name
css<-
"
#scrolly-overlay .scrolly {
max-width: 100%;
margin: 3rem auto;
background: transparent;
padding: 0;
border-radius: 0;
}
#scrolly-overlay .scrolly article {
padding: 0;
max-width: 100rem;
margin: 0 auto;
color:black;
position: relative;
text-align: left;
font-size: 20px;
border-radius: 25px;
pointer-events: none !important;
}
#scrolly-overlay .scrolly article .scrolly-overlay {
min-height: 105vh;
margin-bottom: 1rem;
border-radius: 25px;
}
#scrolly-overlay .scrolly article .scrolly-overlay:last-of-type {
margin-bottom: 0;
border-radius: 25px;
}
#scrolly-overlay .scrolly article .scrolly-overlay.is-active p {
border-radius: 25px;
color:white;
background-color: #e7e7e7 ;
opacity:0.8;
color:black;
}
#scrolly-overlay .scrolly article .scrolly-overlay p {
margin: 0;
padding: 1rem;
text-align: center;
font-weight: 400;
background-color: #e7e7e7 ;
opacity:0.3;
transition: background-color 250ms ease-in-out;
border-radius: 25px;
}
#scrolly-overlay .scrolly figure.sticky {
position: sticky;
width: 100%;
height: 98vh;
background:white;
margin: 0;
top: 1vh;
left: 0;
border-radius: 25px;
}
#scrolly-overlay .sticky{
position: relative;
z-index: 0;
pointer-events: auto;
}
#scrolly-overlay .text-article{
pointer-events: none !important;
}
#scrolly-overlay .text-article .detail-toggle-btn {
pointer-events: auto !important;
}
"
#### script #####
js<-"<script>
const container = d3.select('#scrolly-overlay');
const stepSel = container.selectAll('.step');
function updateChart(index) {
const sel = container.select(`[data-index='${index}']`);
const width = sel.attr('data-width');
stepSel.classed('is-active', (d, i) => i === index);
container.select('.bar-inner').style('width', width);
Shiny.setInputValue(\"input1\", index)
}
function init() {
Stickyfill.add(d3.select('.sticky').node());
enterView({
selector: stepSel.nodes(),
offset: 0.5,
enter: el => {
const index = +d3.select(el).attr('data-index');
updateChart(index);
},
exit: el => {
let index = +d3.select(el).attr('data-index');
index = Math.max(0, index - 1);
updateChart(index);
} });
}
init();
</script>"
css<-gsub("scrolly-overlay",name,css)
css<-gsub("step",name,css)
js<-gsub("step",name,js)
js<-gsub("scrolly-overlay",name,js)
js<-gsub("container",paste0("container",name),js)
js<-gsub("updateChart",paste0("updateChart",name),js)
js<-gsub("init",paste0("init",name),js)
js<-gsub("input1",paste0(name),js)
list<-list(css,js)
return(list)
}
+189
View File
@@ -0,0 +1,189 @@
server <- function(input, output, session) {
countries <- c("Spain", "England", "Germany", "Italy", "France", "Portugal")
#### European performance over time ####
time_plot_debounced <- debounce(reactive(input$time_plot), millis = 200)
time_plot_level <- reactive({
val <- time_plot_debounced()
if (is.null(val)) 0 else val
})
time_plot_selected_data <- reactive({
season_league_full_dataset %>% filter(Country == countries[time_plot_level() + 1])
})
output$european_performance_over_time_plot <- renderPlotly({
width <- ifelse(is.null(input$screen_width), 760, input$screen_width)
custom_plotly(data = time_plot_selected_data(), x = ~Season, y = ~European_performance, type = "scatter", mode = "lines", hoverinfo = "none",
xaxis_title = "Season", yaxis_title = "European performance", width = width) %>%
layout(yaxis = list(range = c(0, 70)))
})
#### League characteristics ####
league_averages_plot_debounced <- debounce(reactive(input$league_averages_plot), millis = 200)
league_averages_plot_level <- reactive({
val <- league_averages_plot_debounced()
if (is.null(val)) 0 else val
})
league_averages_plot_selected_data <- reactive({
average_country_metrics_scaled %>% filter(Country == countries[league_averages_plot_level() + 1])
})
#plotting radar chart
output$league_characteristics_plot <- renderPlotly({
width <- ifelse(is.null(input$screen_width), 760, input$screen_width)
country_data <- league_averages_plot_selected_data()
values <- as.numeric(country_data[1, -1])
custom_plotly(type = 'scatterpolar', fill = 'toself', hoverinfo = "none", xaxis_title = "", yaxis_title = "", width = width) %>%
add_trace(
r = c(values, values[1]),
theta = c(gsub("_", " ", names(country_data)[-1]), gsub("_", " ", names(country_data)[-1][1]))
) %>%
layout(
polar = list(radialaxis = list(range = c(0,1))),
showlegend = FALSE
)
})
#### Basic group profiling ####
basic_profiless_plot_debounced <- debounce(reactive(input$basic_profiling_plot), millis = 200)
basic_profiless_plot_level <- reactive({
val <- basic_profiless_plot_debounced()
if (is.null(val)) 0 else val
})
basic_profiless_plot_selected_data <- reactive({
european_performance_groups_characteristics %>% filter(performance_group == basic_profiless_plot_level() + 1)
})
#plotting radar chart
output$basic_profiles_characteristic_plot <- renderPlotly({
width <- ifelse(is.null(input$screen_width), 760, input$screen_width)
group_data <- basic_profiless_plot_selected_data()
values <- as.numeric(group_data[1, 2:10])
custom_plotly(type = 'scatterpolar', fill = 'toself', hoverinfo = "none", xaxis_title = "", yaxis_title = "", width = width) %>%
add_trace(
r = c(values, values[1]),
theta = c(gsub("_", " ", names(group_data)[2:10]), gsub("_", " ", names(group_data)[2:10][1]))
) %>%
layout(
polar = list(radialaxis = list(range = c(-0.4,0.4))),
showlegend = FALSE
)
})
#### Regression coefficients one season ####
regression_current_year_plot_debounced <- debounce(reactive(input$regression_current_year_plot), millis = 200)
regression_current_year_plot_level <- reactive({
val <- regression_current_year_plot_debounced()
if (is.null(val)) 0 else val
})
one_season_full_coefficients <- list(panel_all_robust_theory, panel_pc, indices_all_plotting_data)
coefficient_one_year_data <- reactive({
one_season_full_coefficients[[regression_current_year_plot_level() + 1]]
})
#plotting coefficients
output$regression_coefficients_current_plot <- renderPlotly({
width <- ifelse(is.null(input$screen_width), 760, input$screen_width)
if (regression_current_year_plot_level() %in% c(0,1)){
#version with all in one
coefficient_plot_function(regression_result = coefficient_one_year_data(), width = width)
} else if (regression_current_year_plot_level() == 2){
#indices version (multiple regressions combined in one)
coefficient_plot_function(regression_result = NULL, coefficient_plotting_data = coefficient_one_year_data(), width = width)
}
})
#### Regression coefficients next season ####
regression_next_year_plot_debounced <- debounce(reactive(input$regression_next_year_plot), millis = 200)
regression_next_year_plot_level <- reactive({
val <- regression_next_year_plot_debounced()
if (is.null(val)) 0 else val
})
next_season_full_coefficients <- list(panel_all_lead, panel_lead_pc, indices_lead_plotting_data)
coefficient_next_year_data <- reactive({
next_season_full_coefficients[[regression_next_year_plot_level() + 1]]
})
#plotting coefficients
output$regression_coefficients_next_plot <- renderPlotly({
width <- ifelse(is.null(input$screen_width), 760, input$screen_width)
if (regression_next_year_plot_level() %in% c(0,1)){
#version with all in one
coefficient_plot_function(regression_result = coefficient_next_year_data(), width = width, range_val = 15)
} else if (regression_next_year_plot_level() == 2){
#indices version (multiple regressions combined in one)
coefficient_plot_function(regression_result = NULL, coefficient_plotting_data = coefficient_next_year_data(), width = width, range_val = 15)
}
})
#### Regression coefficients by competition ####
regression_competition_plot_debounced <- debounce(reactive(input$regression_competition_plot), millis = 200)
regression_competition_plot_level <- reactive({
val <- regression_competition_plot_debounced()
if (is.null(val)) 0 else val
})
comp_breakdown_season_full_coefficients <- list(panel_all_CL, panel_pc_CL, indices_comp_breakdown_plotting_data)
coefficient_comp_breakdown_data <- reactive({
comp_breakdown_season_full_coefficients[[regression_competition_plot_level() + 1]]
})
#plotting coefficients
output$regression_coefficients_competition_plot <- renderPlotly({
width <- ifelse(is.null(input$screen_width), 760, input$screen_width)
if (regression_competition_plot_level() %in% c(0,1)){
#version with all in one
coefficient_plot_function(regression_result = coefficient_comp_breakdown_data(), width = width, range_val = 5)
} else if (regression_competition_plot_level() == 2){
#indices version (multiple regressions combined in one)
coefficient_plot_function(regression_result = NULL, coefficient_plotting_data = coefficient_comp_breakdown_data(), width = width, range_val = 5)
}
})
#### Clustering ####
clustering_plot_debounced <- debounce(reactive(input$clustering_plot), millis = 200)
clustering_plot_level <- reactive({
val <- clustering_plot_debounced()
if (is.null(val)) 0 else val
})
clustering_plot_selected_data <- reactive({
plotting_cluster_data %>% filter(cluster == clustering_plot_level() + 1)
})
#plotting radar chart
output$clustering_characteristics_plot <- renderPlotly({
width <- ifelse(is.null(input$screen_width), 760, input$screen_width)
group_data <- clustering_plot_selected_data()
values <- as.numeric(group_data[1, 2:10])
custom_plotly(type = 'scatterpolar', fill = 'toself', hoverinfo = "none", xaxis_title = "", yaxis_title = "", width = width) %>%
add_trace(
r = c(values, values[1]),
theta = c(gsub("_", " ", names(group_data)[2:10]), gsub("_", " ", names(group_data)[2:10][1]))
) %>%
layout(
polar = list(radialaxis = list(range = c(-0.7,1.5))),
showlegend = FALSE
)
})
}
+141
View File
@@ -0,0 +1,141 @@
#Motivation
title <- ("Does a more competitive domestic football league improve a team's performance in European competition?")
motivation_one <- "Does competing in a more competitive domestic league provide an advantage or disadvantage in European competition? At a theoretical level, there are arguments supporting both perspectives. Teams from more competitive leagues are regularly exposed to high-quality opposition, which may better prepare players for the intensity and standard of European matches. Conversely, teams from less competitive leagues may be able to prioritise European competition by rotating players domestically, reducing fatigue and ensuring key players are available for important continental fixtures."
motivation_two <- "The 2024/25 UEFA Champions League provides a useful illustration of these contrasting domestic scenarios. Paris Saint-Germain (PSG), one of the finalists, secured the Ligue 1 title on 5 April 2025 with six league matches remaining. As a result, they were able to focus all of their attention on the Champions League from the quarter finals, as they had already reached the Coupe de France final (which would not be played until the week before the Champions League final). In contrast, Internazionale remained locked in a Serie A title race until the final day of the season, ultimately finishing one point behind Napoli. They had also only played the first leg of their Coppa Italia semi-final (which they lost 4-1 on aggregate to city rivals Milan) before the quarter finals begun. PSG therefore represent a club succeeding in Europe while operating in a relatively less competitive domestic environment, whereas Internazionale demonstrate that strong European performances can also be achieved while facing significant domestic competition."
motivation_three <- "This study investigates the factors that contribute to league competitiveness and examines how these characteristics relate to the performance of clubs from each country in European competitions. By analysing multiple dimensions of competitiveness rather than treating it as a single concept, the research seeks to identify whether particular competitive environments are associated with stronger or weaker European performance."
date <- ("August 2026")
name <- ("Ciarán Fitzsimons")
#Exploratory analysis
exploratory_analysis_one <- "Before exploring the relationship between league competitiveness and European performance, it is important to understand how the major European leagues differ from one another. This section examines the six most successful leagues from 1999/2000 onwards (Spain, England, Germany, Italy, France and Portugal), summarising their performance in European competitions and the characteristics of their domestic competitions. The selected variables are introduced and compared using league averages, providing a foundation for the subsequent analysis."
#European performance over time
europe_s_top_6_leagues_european_performance_since_1999_2000_one <- "Spanish teams have been the best performing in Europe across the period. The greatest era of dominance came between 2013 and 2018, where a Spanish side won the Champions league in all five seasons (Real Madrid (4) and Barcelona (1)) and four of the five Europa league titles (Sevilla (3) and Atletico Madrid (1))."
europe_s_top_6_leagues_european_performance_since_1999_2000_two <- "English teams have performed consistently well across Europe throughout the period, with a few dominant seasons between 2004 and 2009, where an English side reached the Champions league final in each of the seasons. 2018/19 marked the season of English dominance, where the Champions League final was contested by Liverpool and Tottenham, and the Europa League by Chelsea and Arsenal."
europe_s_top_6_leagues_european_performance_since_1999_2000_three <- "German teams have performed consistently across the period, without reaching the heights of the Spanish and English sides. This is largely down to fewer teams performing across the continent, with Bayern Munich and Borussia Dortmund largely carrying German performance, represented by a peak in 2012/13 where the two faced each other in the Champions league final."
europe_s_top_6_leagues_european_performance_since_1999_2000_four <- "Italian teams European performance shows greater volatility over the period, with a range of seasons eclipsing Germanys greatest seasons, however many seasons of low performance by the teams. 2002/03 represented Italian footballs best European performance season, with three of the four semi finalists being Italian and the final being contested by Juventus and AC Milan."
europe_s_top_6_leagues_european_performance_since_1999_2000_five <- "French European performance has been consistently fairly poor over the period, with a few peaks over the period. Even with PSGs rise in recent years and back-to-back Champions league titles, Frances overall performance has been poor due to the lack of other teams performing well."
europe_s_top_6_leagues_european_performance_since_1999_2000_six <- "Portuguese teams have performed the worst of the six leagues over the period, with a few successful seasons with Porto winning the Champions league once and Europa league twice. The teams performing averagely in Europe from Portugal have consistently been the same sides (Porto, Benfica, Sporting CP and Braga)."
#Variables used
variables_used_in_analysis_of_leagues_competitiveness_one <- "<b>Points difference</b>"
variables_used_in_analysis_of_leagues_competitiveness_two <- "- Between first and second place"
variables_used_in_analysis_of_leagues_competitiveness_three <- "- Between first place and Champions League qualification (fourth)"
variables_used_in_analysis_of_leagues_competitiveness_four <- "- Between first place and relegation (third bottom)"
variables_used_in_analysis_of_leagues_competitiveness_five <- "- Between Champions League qualification and relegation (third bottom)"
variables_used_in_analysis_of_leagues_competitiveness_six <- "These measures capture competitiveness at different levels of the league table. Smaller point gaps indicate a more closely contested league, while larger gaps suggest greater separation between clubs. To allow comparison across leagues of different sizes, all values are divided by the number of teams in the league."
variables_used_in_analysis_of_leagues_competitiveness_seven <- "<b>Goal difference</b>"
variables_used_in_analysis_of_leagues_competitiveness_eight <- "- League winner's goal difference"
variables_used_in_analysis_of_leagues_competitiveness_nine <- "- Combined goal difference of teams finishing in Champions League qualification places"
variables_used_in_analysis_of_leagues_competitiveness_ten <- "Goal difference provides an indication of how dominant the strongest teams are within a league. Larger goal differences suggest top clubs are outperforming their domestic opponents more consistently, which may indicate lower overall competitiveness. Values are divided by the number of teams in the league to provide relative measures across countries."
variables_used_in_analysis_of_leagues_competitiveness_eleven <- "<b>Average number of players used</b>"
variables_used_in_analysis_of_leagues_competitiveness_twelve <- "This measures the average number of players used in league matches by clubs competing in European competitions. A higher value may indicate greater squad rotation, potentially reflecting an ability to rest players domestically while maintaining performance levels."
variables_used_in_analysis_of_leagues_competitiveness_thirteen <- "<b>Average goals scored by the top three scorers</b>"
variables_used_in_analysis_of_leagues_competitiveness_fourteen <- "This metric captures the extent to which the league's leading goalscorers dominate attacking output. Higher values may suggest that elite attacking players face less resistance and are therefore able to record larger goal totals."
variables_used_in_analysis_of_leagues_competitiveness_fifteen <- "<b>Gini coefficient</b>"
variables_used_in_analysis_of_leagues_competitiveness_sixteen <- "The Gini coefficient measures the distribution of wealth across clubs within a league, ranging from 0 (perfect equality) to 1 (complete inequality). It is calculated using squad market values for each season. Higher values indicate wealth is concentrated among a smaller number of clubs, which may provide those clubs with a competitive advantage and reduce overall league competitiveness."
#League characteristics
characteristics_of_leagues_since_1999_2000_one <- "Spain combines strong top-club performance with a heavy reliance on elite attacking players, as shown by the very high contribution from the top three scorers. Although competitive gaps across the league are relatively modest, financial inequality is among the highest of the six leagues, suggesting that a small number of wealthy clubs hold a significant economic advantage. As a result, Spanish football appears to be characterised by influential elite clubs operating within a league that remains reasonably competitive on the pitch. The characteristics mirror what we see in the real world, with financial and competitive dominance of Real Madrid and Barcelona (and to a lesser extent, Atletico Madrid), as well as superstar signings throughout the period."
characteristics_of_leagues_since_1999_2000_two <- "England combines relatively strong competitive balance at the top of the table with a substantial gap between the Champions League places and the relegation zone. The league's top clubs perform strongly, as shown by the high aggregate goal difference among the top four teams, but financial resources are distributed more evenly than in any of the other leagues, reflected by the lowest Gini coefficient. Overall, England appears to balance strong elite clubs with relatively broad financial strength across the league. This reflects the dominance being spread between the traditional big six clubs, with the smaller clubs having more financial resources than counterparts in other leagues due to extensive worldwide TV deals."
characteristics_of_leagues_since_1999_2000_three <- "Germany combines strong competitive balance near the top of the table with some of the highest-performing champions. Winners typically achieve large goal differences, and the league's strongest clubs remain highly effective despite using fewer players on average than other leagues. Financial inequality is relatively low, indicating that strong on-field performances are achieved within a comparatively balanced economic structure. This is reflective of the strong “50 + 1” rule around ownership, as well as the consistent dominance of Bayern Munich, with Borussia Dortmund running them close on occasion."
characteristics_of_leagues_since_1999_2000_four <- "Italy presents a relatively balanced profile across most indicators. There is a moderate separation between the leading clubs and the rest of the league, while squad usage is relatively high and a large share of goals comes from the top three scorers. Financial inequality is similar to that of Germany and France, suggesting that economic concentration is present but not to the extent seen in Spain or Portugal. This is reflective of the title winner changing regularly, but largely between the same four clubs, as well as weaker financial power than other countries."
characteristics_of_leagues_since_1999_2000_five <- "France stands out for having one of the closest title races, with a relatively small gap between first and second place. However, league-wide dominance is limited, as shown by the low goal differences recorded by its strongest clubs. French clubs tend to use relatively large squads, while financial inequality is moderate, suggesting a league that is neither highly concentrated nor heavily dominated by a small elite. This is reflective of a tight and not financially powerful league (particularly with the lack of TV deal), despite PSGs recent dominance, but usually with a close title rival."
characteristics_of_leagues_since_1999_2000_six <- "Portugal exhibits the clearest signs of competitive imbalance. The largest gaps between Champions League qualification and relegation, coupled with the strongest winners' and top-four goal differences, point to a league dominated by a small group of elite clubs. This is reinforced by the highest Gini coefficient, indicating that wealth is heavily concentrated among a few clubs. Portuguese clubs also use the largest squads on average, creating a picture of a league with a pronounced divide between the top teams and the rest. This is clearly seen by the dominance of the same four clubs consistently finishing in the top 4 positions (Porto, Benfica, Sporting CP and Braga)."
characteristics_of_leagues_extra_one <- "Overall, the pattern of European performance suggests that success is not associated with a single domestic league structure. Spain, the strongest-performing league over the period, combines strong elite clubs, high contributions from star players, and relatively high financial inequality, indicating that concentrated quality at the top can translate into European success. England and Germany also perform strongly, but do so with noticeably different characteristics. England combines strong top-club performance with the most even distribution of wealth, while Germany pairs powerful champions with relatively low financial inequality and consistent squad usage. This suggests there are multiple pathways to European success, ranging from concentrated excellence among elite clubs to broader league-wide strength."
characteristics_of_leagues_extra_two <- "In contrast, Italy sits in the middle of the European performance rankings and is characterised by moderate values across most measures, reflecting a league that is neither highly concentrated nor exceptionally competitive on any single dimension. France and Portugal, despite representing opposite ends of several domestic characteristics, have generally achieved weaker European outcomes. France combines close title races, lower goal differences and relatively balanced finances, while Portugal is characterised by extreme dominance from a small group of wealthy clubs. The fact that both leagues underperform relative to Spain, England and Germany suggests that neither competitive balance nor competitive imbalance alone guarantees European success. Instead, the strongest-performing leagues appear to be those that combine strong elite clubs with sufficient overall league quality to sustain high levels of competition and development over time."
#Performance characteristics
characteristics_of_leagues_grouped_by_performance <- "To explore whether domestic league characteristics differ according to European success, seasons were divided into three equally sized groups based on their level of European performance: low, medium and high performance. The average value of each competitiveness characteristic was then calculated within each group to identify any broad patterns."
characteristics_of_leagues_grouped_by_performance_one <- "The lowest-performing group is characterised by negative scores across most competitiveness measures, indicating smaller gaps between teams and a more competitively balanced domestic environment. The title race, qualification places, and overall league structure tend to be more closely contested, while top clubs record lower goal differences than the other groups. While this does not prove a causal relationship, it suggests that the most competitive leagues, at least on these measures, tend to be associated with weaker European performance."
characteristics_of_leagues_grouped_by_performance_two <- "The highest-performing group generally sits at the opposite end of the spectrum, with positive scores for most competitiveness variables. Larger gaps throughout the league and stronger goal differences for champions and top clubs indicate a greater degree of domestic dominance. This pattern is consistent with the idea that leagues containing more dominant elite clubs may be better positioned to compete in Europe, although several other characteristics vary across groups, making it difficult to isolate any single driver of success."
characteristics_of_leagues_grouped_by_performance_three <- "The middle-performing group presents a mixed picture. Some measures point towards greater competitive balance, while others suggest stronger elite clubs and higher levels of dominance. Compared with the highest-performing group, it tends to have smaller gaps and lower goal differences, but it is generally less competitive than the lowest-performing group. Overall, the progression from Group 1 to Group 2 hints at a relationship where less competitive domestic leagues achieve stronger European results, but the variation across individual characteristics suggests the relationship is neither straightforward nor uniform across all dimensions of competitiveness."
#Modelling
modelling_one <- "This section moves beyond the descriptive analysis to investigate the relationship between domestic league characteristics and European performance. While the exploratory analysis identified a number of potential patterns, modelling techniques are used to assess the strength and significance of these relationships more formally."
modelling_two <- "Both supervised and unsupervised machine learning approaches are applied. Panel regression is used as a supervised method to examine how changes in league characteristics are associated with European performance and to identify which factors have the strongest statistical relationship with success. Clustering is then used as an unsupervised method to group seasons with similar characteristics, providing an alternative perspective on how different league profiles relate to European performance. Together, these approaches help determine whether consistent patterns exist between domestic competitiveness and success in European competitions."
#Variable creation
competitiveness_indices <- "Competitiveness indices"
competitiveness_indices_one <- "The competitiveness indices were developed using football theory to capture different dimensions of domestic league competitiveness. Rather than being derived statistically, the indices combine related variables based on their expected influence on the competitive structure of a league."
competitiveness_indices_two <- "- <b>Competitive title race</b> combines the points differences between first and second place and between first and the Champions League qualification places. These measures represent how closely contested the race for the title and top positions is, with smaller gaps indicating a more competitive battle at the top of the league."
competitiveness_indices_three <- "- <b>Elite dominance</b> combines the points difference between Champions League qualification and relegation, the total goal difference of the top four clubs, the Gini coefficient, and the contribution of the top three goalscorers. This index captures the extent to which a small number of clubs dominate the league competitively, financially and offensively. Higher values indicate a greater concentration of success and resources among elite clubs."
competitiveness_indices_four <- "- <b>Competitive balance</b> combines all points-difference measures, top-four goal difference, and the Gini coefficient, with the signs reversed where appropriate so that smaller gaps and lower concentrations increase the index. It is intended to measure how evenly matched clubs are across the league as a whole, rather than focusing solely on competition at the top."
competitiveness_indices_five <- "- <b>Player rotation</b> is represented by the average number of players used by clubs during the season. This reflects squad utilisation and rotation practices, which may indicate differences in squad depth, fixture congestion, or approaches to balancing domestic and European commitments."
competitiveness_indices_six <- "- <b>Multi-level competitiveness</b> combines the three points-difference measures across the league table. Unlike the other indices, it focuses solely on competitive outcomes and league standings, providing a direct measure of how closely contested the league is at multiple levels, including the title race, qualification positions and relegation battle."
competitiveness_indices_seven <- "Together, these indices provide a range of theoretically motivated measures that capture different aspects of league competitiveness, allowing the analysis to distinguish between competition at the top of the table, overall competitive balance, elite club dominance and squad management strategies."
principal_component_analysis_pca <- "Principal Component Analysis (PCA)"
principal_component_analysis_pca_one <- "Many of the competitiveness variables are closely related and may capture similar underlying concepts. PCA was therefore used to reduce the number of variables by combining them into a smaller set of uncorrelated components that capture the main sources of variation in league competitiveness. This helps simplify the analysis and reduces potential multicollinearity issues when modelling European performance."
the_five_principal_components_can_be_broadly_interpreted_as <- "The five principal components can be broadly interpreted as:"
the_five_principal_components_can_be_broadly_interpreted_as_one <- "- <b>PC1: Overall dominance and inequality:</b> Primarily captures large gaps throughout the league and strong performances from top clubs. The relatively low loading for the gap between first and second place suggests that title-race competitiveness is less important than broader dominance throughout the league. Higher values indicate less competitive leagues with greater separation between elite clubs and the rest."
the_five_principal_components_can_be_broadly_interpreted_as_two <- "- <b>PC2: Dominant champion, competitive remainder:</b> Reflects leagues where the champion is clearly ahead of its rivals, but the teams below are more evenly matched. With positive loadings for gaps between first and other positions, whilst negative loadings on the points gap between champions league places and relegation and goal difference of the top 4 clubs."
the_five_principal_components_can_be_broadly_interpreted_as_three <- "- <b>PC3: Squad structure and player reliance:</b> Driven mainly by player usage, goalscoring concentration and wealth distribution. This component represents structural characteristics of leagues rather than competitive balance itself."
the_five_principal_components_can_be_broadly_interpreted_as_four <- "- <b>PC4: Financial balance with mixed competitiveness:</b> Relates strongly to wealth distribution and competitive separation across different parts of the league table. It suggests leagues with relatively balanced finances but varying levels of competition, which is relatively close among top teams despite larger gaps elsewhere."
the_five_principal_components_can_be_broadly_interpreted_as_five <- "- <b>PC5: Rotation and star-player influence:</b> Captures greater player rotation and reliance on key goalscorers, alongside a dominant league winner but relatively tighter competition across the remainder of the league. It may reflect leagues where top clubs possess sufficient depth to rotate players while still maintaining a competitive advantage."
the_five_principal_components_can_be_broadly_interpreted_as_six <- "Together, these components provide a condensed representation of the different dimensions of league competitiveness and are used alongside the theory-driven competitiveness indices to investigate their relationship with European performance."
#Regression
regression_analysis_one <- "To examine the relationship between domestic league characteristics and European performance, panel regression was used. Panel regression is particularly suited to this dataset as it combines observations across both countries and seasons, allowing variation over time and between leagues to be analysed simultaneously. Two-way fixed effects models were applied, incorporating both country fixed effects and season fixed effects. This approach controls for unobserved characteristics that are constant within each league (such as football culture or league structure) and factors that affect all leagues in a given season (such as changes to European competition formats through the introduction of the League phase and the removal of the Away goals rule). As a result, the analysis focuses on how changes within a particular league over time relate to changes in its European performance."
regression_analysis_two <- "Three regression specifications were estimated. The first used the original competitiveness variables, excluding variables with high multicollinearity where necessary to avoid distorted coefficient estimates. The second used the principal components generated through PCA, allowing the relationship between broader dimensions of competitiveness and European performance to be assessed. The third used the theory-driven competitiveness indices, examining whether the underlying concepts of competitiveness were more informative than the individual variables themselves."
hidden_click_to_view_more_detailed_description_of_methodology_one <- "To account for potential violations of standard regression assumptions, clustered standard errors were used. These adjust for both heteroskedasticity (non-constant variance of errors) and autocorrelation (correlation of errors across seasons within the same country), providing more reliable estimates of statistical significance. Variable significance was therefore assessed using these robust standard errors rather than conventional regression outputs."
hidden_click_to_view_more_detailed_description_of_methodology_two <- "Multiple regression models were estimated throughout the analysis in order to identify the independent relationship between each competitiveness measure and European performance while controlling for the effects of other variables. This provides greater confidence that observed relationships are not simply driven by omitted factors captured elsewhere in the model. For the competitiveness indices, single regressions were run as each represents a combination of variables so controls for other factors."
hidden_click_to_view_more_detailed_description_of_methodology_three <- "Initially, full models containing all selected variables, principal components, or competitiveness indices were estimated. As a robustness check, additional regressions were then run using only statistically significant variables and those considered theoretically important. Comparing these specifications allowed both model performance and coefficient stability to be assessed. Where appropriate, results presented in this report focus on the best-performing specification, while comparisons between models are used to evaluate the robustness of the findings."
#Regression on same
on_league_characteristics_and_same_season_s_european_performance_one <- "Across all three modelling approaches, a consistent theme emerges: domestic league competitiveness appears to be negatively associated with European performance. While the explanatory power of the models is relatively modest, the strongest and most consistent relationships suggest that leagues characterised by greater dominance from their leading clubs tend to perform better in European competitions. Larger performance gaps between top clubs and the rest of the league, higher goal differences among elite teams, and greater concentrations of financial resources are generally associated with stronger European outcomes. Conversely, leagues with tighter competition throughout the table, smaller points gaps, and more evenly distributed resources tend to achieve weaker European performance. Although individual variables and indices produce some mixed findings, the overall evidence points towards elite domestic dominance being more beneficial for European success than broad competitive balance."
on_league_characteristics_and_same_season_s_european_performance_two <- "The results suggest that European performance is strongest in leagues where the leading clubs are particularly dominant. Larger goal differences among the top four clubs and greater financial inequality are both positively associated with European success, indicating that strong elite clubs and concentrated resources may provide an advantage in continental competitions. Similarly, a larger gap between first and second place suggests that a less competitive title race is associated with improved European performance. However, the negative coefficient for the gap between Champions League qualification and relegation and the negative relationship with top-scorer goals indicate that some forms of competitiveness in the wider league may still be beneficial. Overall, the evidence points towards the strength and dominance of elite clubs being more important than maintaining competitive balance across the league as a whole."
on_league_characteristics_and_same_season_s_european_performance_three <- "PC1, the strongest predictor, primarily captures overall league dominance and inequality, particularly through large points gaps and strong performances from top clubs. Its positive relationship with European performance reinforces the conclusion that less competitive domestic leagues tend to produce better European results. PC4, however, introduces some nuance to this finding. This component reflects greater financial equality and lower concentration among goalscorers, while also containing mixed signals regarding competitiveness across different parts of the league table. The negative coefficient for PC4 suggests that some aspects of equality and tighter competition may be associated with reduced European performance, while some tighter points gaps throughout the league may improve performance. Taken together, the PCA results broadly support the findings from the individual-variable models, although the interpretation is less direct because each component combines multiple underlying characteristics."
on_league_characteristics_and_same_season_s_european_performance_four <- "The Competitive Balance Index is negatively related to European performance, suggesting that leagues with smaller points gaps, lower top-four goal differences and more evenly distributed wealth generally perform worse in European competition. This finding is supported by the Multi-Level Competitiveness Index, which focuses solely on points differences and also shows a significant negative relationship with performance. Similarly, a more competitive title race is associated with weaker European outcomes. In contrast, the Elite Dominance Index has a positive relationship with European performance, indicating that leagues characterised by dominant top clubs, greater financial concentration and stronger performances from elite teams tend to achieve greater success in Europe. Collectively, these results provide the strongest support for the idea that domestic dominance among elite clubs, rather than league-wide competitive balance, is associated with improved European performance."
#Regression on next
on_league_characteristics_and_next_season_s_european_performance_one <- "The lagged analysis examines whether domestic league characteristics in one season are associated with European performance in the following season. Compared with the contemporaneous models, the relationships are generally stronger, with higher R² values across all three modelling approaches. The results provide more consistent evidence that domestic dominance and competitive imbalance may create conditions that support future European success. Larger performance gaps between clubs, greater concentration of goals among leading players, and less equal distributions of wealth are repeatedly associated with stronger European outcomes in the following season. While some findings remain mixed, the lagged models provide stronger support for the argument that dominant domestic environments are linked to improved European performance than the models using European performance from the same season. An explanation for this would be that dominant sides have time to develop in lower pressured environments over multiple seasons, whilst also being able to hold onto their star players and sign others due to strong performance in their domestic leagues."
on_league_characteristics_and_next_season_s_european_performance_two <- "These results suggest that leagues characterised by larger performance gaps throughout the table tend to achieve stronger European outcomes in the following season. A less competitive title race, greater separation between clubs, larger contributions from elite goalscorers and greater wealth inequality are all associated with improved future European performance. Compared with the current-season model, the findings are more consistent, as all significant variables point towards stronger European performance being associated with greater levels of domestic dominance and concentration."
on_league_characteristics_and_next_season_s_european_performance_three <- "As with the contemporaneous analysis, PC1 remains the strongest predictor, reinforcing the importance of overall league dominance and separation between elite clubs and the rest of the league. PC3 suggests that greater reliance on leading goalscorers is associated with improved performance, although the component also contains mixed signals relating to player usage and wealth distribution. PC4 continues to display a negative relationship with European performance, indicating that characteristics associated with greater equality may reduce future success. Overall, the PCA results largely support the findings from the current-season analysis, but the relationships are stronger and more consistent when predicting European performance one season ahead."
on_league_characteristics_and_next_season_s_european_performance_four <- "The Elite Dominance Index emerges as the strongest predictor of future European performance, suggesting that leagues characterised by dominant top clubs, larger gaps between elite and weaker teams, higher top-club goal differences and concentrated financial resources tend to achieve greater European success in the following season. Conversely, the Competitive Balance Index remains negatively related to performance, indicating that more evenly matched leagues tend to perform less well. These findings closely mirror those obtained for current-season European performance, but the relationships are stronger in the lagged models, providing further evidence that domestic dominance may contribute to sustained European success over time."
#Regression by comp
on_league_characteristics_and_same_season_s_european_performance_by_co_one <- "When European performance is split by competition, the relationship between domestic league characteristics appears to be driven almost entirely by clubs performance in the Champions League. No statistically significant relationships were identified for Europa League performance, suggesting that domestic competitiveness has little measurable impact on success in that competition. In contrast, the Champions League results closely mirror the findings from the overall European performance models, with slightly stronger relationships found. Across all three modelling approaches, the strongest evidence points towards leagues with dominant elite clubs, greater financial inequality and stronger top-team performances achieving better Champions League results. This suggests that the characteristics associated with success in European competition overall are largely being driven by performance at the highest level of continental football."
on_league_characteristics_and_same_season_s_european_performance_by_co_two <- "The results reinforce several conclusions found in the main analysis. Greater financial inequality and stronger performances from the league's leading clubs, measured through top-four goal difference, are both associated with improved Champions League performance. As with the overall model, the negative relationship between the Champions League-to-relegation gap suggests that some forms of competitiveness below the elite clubs may coexist with European success. Compared with the overall European performance model, the Champions League results place even greater emphasis on the importance of strong elite clubs and concentrated resources, while the role of title-race competitiveness becomes less important."
on_league_characteristics_and_same_season_s_european_performance_by_co_three <- "The findings are highly consistent with those obtained using overall European performance. PC1 again emerges as the strongest predictor, highlighting the importance of dominance and separation between leading clubs and the rest of the league. PC4 remains negatively associated with performance, suggesting that characteristics linked to greater equality are generally associated with weaker Champions League outcomes. PC3 introduces some uncertainty as it contains a mixture of competitiveness and structural league characteristics, although the overall pattern continues to point towards less competitive domestic environments being linked to stronger Champions League performance."
on_league_characteristics_and_same_season_s_european_performance_by_co_four <- "These results suggest that leagues characterised by dominant top clubs, strong top-four performances and concentrated financial resources tend to achieve better Champions League outcomes. Conversely, leagues exhibiting greater competitive balance generally achieve weaker results. While the explanatory power of the models is relatively modest, the consistency of these findings with the main regression analysis suggests that the negative relationship between domestic competitiveness and European success is largely driven by performance in the Champions League rather than the Europa League."
#Clustering
clustering_to_group_similar_seasons_together_one <- "K-means clustering was used as an unsupervised machine learning technique to group together seasons with similar domestic competitiveness characteristics. Unlike panel regression, it does not test the statistical significance of individual variables. Instead, it identifies whether certain combinations of league characteristics naturally appear together across seasons."
clustering_to_group_similar_seasons_together_two <- "After the clusters were created, the average European performance and next-season European performance were calculated for each group. The average league characteristics within each cluster were then compared to assess whether certain competitiveness profiles were associated with stronger or weaker European outcomes. This was applied using three approaches: all individual variables, the principal components, and the theory-driven competitiveness indices. The competitiveness indices produced the clearest cluster separation, although all approaches showed broadly similar trends."
clustering_to_group_similar_seasons_together_three <- "Overall, the clustering results support the pattern found in the regression analysis. When the number of clusters was set to two, the distinction was mainly between competitive leagues, with smaller or negative values across most variables, and less competitive leagues, with larger positive values showing greater separation between clubs. The less competitive cluster consistently achieved higher European performance, both in the current season and the following season. However, the differences in average European performance between some clusters are not especially large, so these results should be interpreted as descriptive patterns rather than statistically significant evidence. The clearest exception is that the least competitive cluster is consistently associated with higher European performance, particularly in the following season."
radar_plots_for_clusters_one <- "This group performs best overall, particularly in the following European season. It is characterised by large gaps between first and second place and between first and the Champions League places, suggesting that the leading club is often clearly ahead domestically. However, the gap between Champions League qualification and relegation is relatively small, and the Gini coefficient is low. This suggests a league where the title race may be less competitive, but there is still some competitiveness across the rest of the league. This profile appears to be favourable for European performance, potentially because elite clubs are strong enough to compete in Europe while still operating in a reasonably competitive domestic environment. The clearest example is England in 2004/05, when Chelsea were runaway league winners and set a record for the fewest goals conceded in a Premier League season. Despite Chelsea's dominance, wealth distribution and the points gap between the top four and the rest of the league remained relatively balanced. English clubs also performed strongly in Europe, with Liverpool winning the Champions League and Arsenal reaching the final the following season."
radar_plots_for_clusters_two <- "This group also performs well in the current European season, although its next-season performance is weaker than Cluster 1. This group shows signs of stronger elite dominance, with high top-four goal difference, high goals from top scorers, a larger gap between Champions League qualification and relegation, and the highest Gini coefficient. However, the gap between the top two sides is relatively small, reflecting a tight title battle. This suggests a league where a small number of wealthy and high-performing clubs are clearly separated from the rest. The strong current European performance supports the idea that dominant elite clubs can drive continental success, although the weaker performance in the next season suggests this advantage may be less consistent over time. Spain in 2015/16 typifies this cluster. Despite a title race in which the top three teams finished within three points of one another, Barcelona and Real Madrid recorded exceptional goal differences (83 and 76 respectively), while Luis Suárez, Cristiano Ronaldo and Lionel Messi scored a combined 101 league goals. European performance was equally impressive, with Real Madrid and Atlético Madrid contesting the Champions League final, while Sevilla won the Europa League and Villarreal reached the semi-finals."
radar_plots_for_clusters_three <- "This group performs worst in both current and next-season European performance. It has negative values across most characteristics, including smaller points gaps, lower winners' and top-four goal differences, fewer players used, fewer goals from top scorers, and lower wealth inequality. This suggests the most competitively balanced league profile, where clubs are more evenly matched throughout the table. While this may indicate a healthier domestic competitive structure, it appears to be associated with weaker European performance, supporting the wider finding that highly competitive leagues may not necessarily produce the strongest European outcomes. A clear example is the Premier League in 2015/16, when Leicester City won the league for the first time despite beginning the season as outsiders, with the lowest points tally of a winner since 2010/11. The season was characterised by relatively small gaps between clubs and a lack of sustained dominance from the traditional elite teams. English clubs subsequently performed relatively poorly in European competitions both during that season and in the following campaign, making it a strong illustration of this cluster's characteristics."
radar_plots_for_clusters_overall <- "Taken together, the clustering suggests that the strongest European performance is generally found in leagues that are not fully competitive throughout, but also not necessarily dominated in every area. The best-performing profiles tend to combine some form of elite strength with either a closer gap between the Champions League places and the rest of the league, or a more competitive title race. In contrast, the most balanced leagues, where points gaps, goal differences and wealth inequality are all relatively low, tend to perform worst in Europe. This supports the broader conclusion that European success is more closely associated with the strength and dominance of leading clubs than with domestic competitive balance across the league as a whole."
#Conclusion
overall_conclusion_one <- "The results suggest that domestic competitiveness and European performance are related, although the relationship is neither simple nor driven by a single characteristic. Across the exploratory analysis, the strongest-performing leagues generally exhibited larger gaps between clubs, stronger performances among the top teams, or greater concentrations of financial resources than lower-performing leagues. At the same time, the leading European leagues displayed a variety of domestic structures, indicating that there is no single model for success."
overall_conclusion_two <- "The regression analysis found a broadly consistent relationship between European performance and measures associated with lower competitiveness, including larger points gaps, greater top-club goal differences and higher levels of wealth concentration. Conversely, variables and indices representing competitive balance, such as smaller gaps throughout the league table and more equal resource distribution, were often associated with lower European performance. These patterns were evident across the original variables, principal components and theory-driven competitiveness indices, with the latter providing the most consistent results."
overall_conclusion_three <- "An even stronger relationship was found when analysing the relationship between league characteristics and performance in the following European season. This suggests that domestic dominance may not only coincide with European success, but may also help create conditions for future performance. Leagues where top clubs are already dominant domestically may allow those clubs to build confidence, manage squads more effectively, attract and retain stronger players, and sustain performance across multiple competitions."
overall_conclusion_four <- "Analysis by competition further indicated that this relationship is primarily driven by the Champions League. While significant relationships were identified for Champions League performance, no significant relationships were found for Europa League performance. This suggests that domestic league structure has a stronger connection with performance at the highest level of European club football than in secondary competitions."
overall_conclusion_five <- "The clustering analysis reinforced these findings by grouping seasons with similar competitiveness characteristics. The most competitively balanced cluster consistently produced the weakest European performance in both the current and subsequent season. In contrast, clusters characterised by greater separation between clubs generally achieved stronger European outcomes. However, the best-performing clusters were not necessarily those displaying the greatest lack of competitiveness in every dimension. Rather, they tended to combine some degree of domestic dominance with competitiveness in specific areas of the league, such as tighter competition among elite clubs or a smaller gap between European qualification places and the rest of the table."
overall_conclusion_six <- "Taken together, the findings suggest that the domestic characteristics most closely associated with European success are generally those reflecting lower levels of competitiveness across the league as a whole. Leagues characterised by larger performance gaps, stronger top-club dominance and greater financial concentration tended to achieve higher levels of European performance than leagues where clubs were more evenly matched. However, the relatively modest explanatory power of the models indicates that competitiveness alone explains only part of European success, and that many other sporting, financial and organisational factors are also likely to play an important role."
overall_conclusion_seven <- "Overall, the analysis provides evidence of a consistent association between domestic league structure and European performance. Across multiple analytical approaches, the results suggest that seasons characterised by lower overall competitiveness tend to be associated with stronger European outcomes, particularly in the Champions League. While this relationship should not be interpreted as causal, it represents a recurring pattern throughout the period analysed and offers insight into how different competitive environments may relate to success in European football."
#Limitations
limitations_one <- "Some limitations should be considered when interpreting the findings of this analysis."
limitations_two <- "Firstly, the measure of European performance is based on a constructed scoring system and therefore reflects one possible interpretation of success in European competitions. While it aims to capture performance consistently across clubs, countries and seasons, different weighting schemes or performance metrics may produce slightly different results."
limitations_three <- "Similarly, league competitiveness is not directly observable and must be defined through measurable characteristics. The variables, indices and principal components used in this report represent theoretically informed proxies for competitiveness, but alternative definitions could place greater emphasis on different aspects of competition, such as attendance, uncertainty of outcomes, or competitive balance measured through other statistical methods."
limitations_four <- "The analysis is also constrained by a relatively small sample size, covering only six leagues and seasons from 1999/00 onwards. While this period captures the modern era of European football and countries with meaningful consistent European performance, it excludes earlier seasons and limits the number of observations available for statistical analysis."
limitations_five <- "Another limitation is that results may be influenced by exceptional teams or exceptional seasons. A single dominant club can substantially improve a country's European performance, potentially making a league appear more successful than its overall competitiveness would suggest. Similarly, a team that secures domestic success early may rotate players later in the season, reducing its final points total and making the league appear more competitive than it was in practice."
limitations_six <- "Finally, the analysis excludes the UEFA Europa Conference League. The competition was introduced part way through the study period, making consistent comparisons across all seasons difficult. In addition, the countries included in the dataset typically had only one representative in the competition each season, limiting its contribution to overall European performance and reducing the value of including it within the analysis."
limitations_seven <- "These limitations mean that the results should be interpreted as evidence of associations between domestic league characteristics and European performance rather than definitive causal relationships."
#Process
data_sources_and_how_data_was_collected_and_analysis_was_done_one <- "The majority of the data was collected from Transfermarkt, a football database containing information on players, clubs and competitions. Where data was unavailable on Transfermarkt, supplementary information was obtained from Wikipedia. Data was collected using Python web-scraping techniques and subsequently cleaned and transformed into datasets for each variable. Additional calculations were performed to derive the European Performance metric and the Gini Coefficient."
data_sources_and_how_data_was_collected_and_analysis_was_done_two <- "For each season between 1999/00 and 2025/26, each country was assigned a European Performance score. This measure is calculated by summing points awarded for the progress of clubs from that country in the UEFA Champions League and UEFA Europa League:"
data_sources_and_how_data_was_collected_and_analysis_was_done_three <- "- 20 points: Champions League winners"
data_sources_and_how_data_was_collected_and_analysis_was_done_four <- "- 16 points: Champions League runners-up"
data_sources_and_how_data_was_collected_and_analysis_was_done_five <- "- 12 points: Champions League semi-finalists"
data_sources_and_how_data_was_collected_and_analysis_was_done_six <- "- 10 points: Europa League winners"
data_sources_and_how_data_was_collected_and_analysis_was_done_seven <- "- 8 points: Champions League quarter-finalists"
data_sources_and_how_data_was_collected_and_analysis_was_done_eight <- "- 8 points: Europa League runners-up"
data_sources_and_how_data_was_collected_and_analysis_was_done_nine <- "- 6 points: Europa League semi-finalists"
data_sources_and_how_data_was_collected_and_analysis_was_done_ten <- "- 4 points: Europa League quarter-finalists"
data_sources_and_how_data_was_collected_and_analysis_was_done_eleven <- "Subsequent analysis was conducted in R, while the interactive visualisations were developed using R Shiny, CSS and JavaScript."
+693
View File
@@ -0,0 +1,693 @@
ui <- fluidPage(
title="Football league competitiveness and countries European performance",lang="en",
theme="css.css",
useShinyjs(),
tags$head(
tags$script(HTML("
Shiny.addCustomMessageHandler('bindModalHidden', function(message) {
$('#shiny-modal').off('hidden.bs.modal.modalListener');
$('#shiny-modal').on('hidden.bs.modal.modalListener', function () {
Shiny.setInputValue('modal_closed_nonce', Math.random(), {priority: 'event'});
});
});
"),
"function sendWidth() {
Shiny.setInputValue('screen_width', window.innerWidth);
}
$(document).on('shiny:connected', sendWidth);
$(window).on('resize', sendWidth);"),
tags$style(
# the create_scrolly_side will return a list, the first object is the CSS classes that create the stick position scrolling behaviour.
# the second object is the javascript that links the scrolling to change CSS classes and update shiny inputs (loaded at end of page)
HTML(as.character(create_scrolly_side("time_plot")[1])),
HTML(as.character(create_scrolly_side("league_averages_plot")[1])),
HTML(as.character(create_scrolly_side("basic_profiling_plot")[1])),
HTML(as.character(create_scrolly_side("regression_current_year_plot")[1])),
HTML(as.character(create_scrolly_side("regression_next_year_plot")[1])),
HTML(as.character(create_scrolly_side("regression_competition_plot")[1])),
HTML(as.character(create_scrolly_side("clustering_plot")[1]))
),
HTML(
"<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">
<meta property=\"og:title\" content=\"Football league competitiveness and countries European performance\">
<meta property=\"og:description\" content=\"Football league competitiveness and countries European performance\">"
)
),
#### header ####
div(class = "header",
tags$div(
style = "display: flex; flex-direction: column;",
tags$a(`aria-label` = "Jump back to contents", href = "#contents", class = "jump-link", "Jump back to contents")
)
),
#### title and contents ####
div(id = "contents", class = "toc",
tags$h1(title),
tags$a(href = "https://youtu.be/_mnsaDJzpso?si=3EnfpdRqXp4afBiI", tags$strong("Click here for a link to a static version of the report")),
p(style = 'font-weight: bold; text-align: right; font-size: 1.2em;', "Scroll to begin ▼"),
tags$h3("Table of Contents"),
tags$ul(
tags$li(tags$a(href = "#motivation", tags$strong("Motivation"))),
tags$li(tags$a(href = "#exploratory_analysis", tags$strong("Exploratory analysis"))),
tags$ul(
tags$li(tags$a(href = "#time_plot", "Europe's top 6 leagues European performance since 1999-2000")),
tags$li(tags$a(href = "#variable_selection", "Variables used in analysis of leagues competitiveness")),
tags$li(tags$a(href = "#league_averages_plot", "Characteristics of leagues since 1999-2000")),
tags$li(tags$a(href = "#basic_profiling", "Characteristics of leagues grouped by performance"))
),
tags$li(tags$a(href = "#modelling", tags$strong("Modelling"))),
tags$ul(
tags$li(tags$a(href = "#variable_creation", tags$strong("Variable creation"))),
tags$li(tags$a(href = "#regression", tags$strong("Regression analysis"))),
tags$ul(
tags$li(tags$a(href = "#regression_current_year", "On league characteristics and same season's European performance")),
tags$li(tags$a(href = "#regression_next_year", "On league characteristics and next season's European performance")),
tags$li(tags$a(href = "#regression_competition", "On league characteristics and same season's European performance by competition"))
),
tags$li(tags$a(href = "#clustering", tags$strong("Clustering to group similar seasons together")))
),
tags$li(tags$a(href = "#conclusion", tags$strong("Conclusion")))
)
),
br(),
br(),
#### motivation ####
tags$header(
id = "motivation",
class = "colourheader",
tags$div(
class = "paddeddiv",
style = "position: relative;",
tags$h2(paste0("Motivation"), style = "font-weight: bold; text-align: center;"),
p(style = "margin-top: 5px; white-space: normal;", HTML(motivation_one)),
p(style = "margin-top: 5px;", paste0(motivation_two)),
p(style = "margin-top: 5px;", paste0(motivation_three)),
p(style = "margin-top: 20px;", paste0(date))
)
),
br(),
br(),
div(
class = "bigfixedimage",
style = paste0("background-image: url('psg.jpg');min-height: 100vh;")
),
br(),
br(),
#### Exploratory analysis ####
tags$header(id = "exploratory_analysis", class="colourheader",
tags$div(class="paddeddiv",style="position: relative;",
tags$h2(paste0("Exploratory analysis"), style = "font-weight: bold; text-align: center;"),
p(style = "margin-top: 5px;", paste0(exploratory_analysis_one))
)
),
br(),
br(),
#### European performance over time ####
tags$div(ID = "time_plot",
div(class="scrolly",
tags$figure(class="sticky",style=("order: 0; display: flex; flex-direction: column;"),
tags$h4(style="text-align: center;", "European performance over time, from 1999-2000 to 2025-26"),
plotlyOutput("european_performance_over_time_plot", height = "100%")
),
tags$article(
div(class="time_plot text-article", `data-width`="1",`data-index`="0",
p(strong(" Spanish teams European performance "),
br(),
europe_s_top_6_leagues_european_performance_since_1999_2000_one)),
div(class="time_plot text-article", `data-width`="1",`data-index`="1",
p(strong(" English teams European performance "),
br(),
europe_s_top_6_leagues_european_performance_since_1999_2000_two)),
div(class="time_plot text-article", `data-width`="1",`data-index`="2",
p(strong(" German teams European performance "),
br(),
europe_s_top_6_leagues_european_performance_since_1999_2000_three)),
div(class="time_plot text-article", `data-width`="1",`data-index`="3",
p(strong(" Italian teams European performance "),
br(),
europe_s_top_6_leagues_european_performance_since_1999_2000_four)),
div(class="time_plot text-article", `data-width`="1",`data-index`="4",
p(strong(" French teams European performance "),
br(),
europe_s_top_6_leagues_european_performance_since_1999_2000_five)),
div(class="time_plot text-article", `data-width`="1",`data-index`="5",
p(strong(" Portuguese teams European performance "),
br(),
europe_s_top_6_leagues_european_performance_since_1999_2000_six))
))
),
br(),
br(),
#### Variable selection ####
tags$header(id = "variable_selection", class="colourheader3",
tags$div(
class = "paddeddiv",
style = "position: relative;",
tags$h3(
"Variables used in analysis of leagues competitiveness",
style = "font-weight: bold; text-align: center;"
),
lapply(
c(
variables_used_in_analysis_of_leagues_competitiveness_one,
variables_used_in_analysis_of_leagues_competitiveness_two,
variables_used_in_analysis_of_leagues_competitiveness_three,
variables_used_in_analysis_of_leagues_competitiveness_four,
variables_used_in_analysis_of_leagues_competitiveness_five,
variables_used_in_analysis_of_leagues_competitiveness_six,
variables_used_in_analysis_of_leagues_competitiveness_seven,
variables_used_in_analysis_of_leagues_competitiveness_eight,
variables_used_in_analysis_of_leagues_competitiveness_nine,
variables_used_in_analysis_of_leagues_competitiveness_ten,
variables_used_in_analysis_of_leagues_competitiveness_eleven,
variables_used_in_analysis_of_leagues_competitiveness_twelve,
variables_used_in_analysis_of_leagues_competitiveness_thirteen,
variables_used_in_analysis_of_leagues_competitiveness_fourteen,
variables_used_in_analysis_of_leagues_competitiveness_fifteen,
variables_used_in_analysis_of_leagues_competitiveness_sixteen
),
function(x) p(style = "margin-top: 5px;", HTML(x))
)
)
),
br(),
br(),
#### League average characteristics ####
tags$div(ID = "league_averages_plot",
div(class="scrolly",
tags$figure(class="sticky",style=("order: 0; display: flex; flex-direction: column;"),
tags$h4(style="text-align: center;", "Average characteristics of leagues, from 1999-2000 to 2025-26"),
plotlyOutput("league_characteristics_plot", height = "100%")
),
tags$article(
div(class="league_averages_plot text-article", `data-width`="1",`data-index`="0",
p(strong(" Spanish teams European performance "),
br(),
characteristics_of_leagues_since_1999_2000_one)),
div(class="league_averages_plot text-article", `data-width`="1",`data-index`="1",
p(strong(" English teams European performance "),
br(),
characteristics_of_leagues_since_1999_2000_two)),
div(class="league_averages_plot text-article", `data-width`="1",`data-index`="2",
p(strong(" German teams European performance "),
br(),
characteristics_of_leagues_since_1999_2000_three)),
div(class="league_averages_plot text-article", `data-width`="1",`data-index`="3",
p(strong(" Italian teams European performance "),
br(),
characteristics_of_leagues_since_1999_2000_four)),
div(class="league_averages_plot text-article", `data-width`="1",`data-index`="4",
p(strong(" French teams European performance "),
br(),
characteristics_of_leagues_since_1999_2000_five)),
div(class="league_averages_plot text-article", `data-width`="1",`data-index`="5",
p(strong(" Portuguese teams European performance "),
br(),
characteristics_of_leagues_since_1999_2000_six))
))
),
br(),
br(),
tags$header(class="colourheader3",
tags$div(class="paddeddiv",style="position: relative;",
p(style="margin-top: 5px;",paste0(characteristics_of_leagues_extra_one)),
p(style="margin-top: 5px;",paste0(characteristics_of_leagues_extra_two))
)
),
br(),
br(),
#### Basic profiles characteristics ####
tags$header(id = "basic_profiling", class="colourheader3",
tags$div(class="paddeddiv",style="position: relative;",
p(style="margin-top: 5px;",paste0(characteristics_of_leagues_grouped_by_performance))
)
),
br(),
br(),
tags$div(ID = "basic_profiling_plot",
div(class="scrolly",
tags$figure(class="sticky",style=("order: 0; display: flex; flex-direction: column;"),
tags$h4(style="text-align: center;", "Average characteristics of leagues, grouped by performance"),
plotlyOutput("basic_profiles_characteristic_plot", height = "100%")
),
tags$article(
div(class="basic_profiling_plot text-article", `data-width`="1",`data-index`="0",
p(strong(" Characteristics of worst performing European seasons "),
br(),
characteristics_of_leagues_grouped_by_performance_one)),
div(class="basic_profiling_plot text-article", `data-width`="1",`data-index`="1",
p(strong(" Characteristics of best performing European seasons "),
br(),
characteristics_of_leagues_grouped_by_performance_two)),
div(class="basic_profiling_plot text-article", `data-width`="1",`data-index`="2",
p(strong(" Characteristics of middle performing European seasons "),
br(),
characteristics_of_leagues_grouped_by_performance_three))
))
),
br(),
br(),
div(
class = "bigfixedimage",
style = paste0("background-image: url('aston-villa.jpg');min-height: 100vh;")
),
br(),
br(),
#### Modelling ####
tags$header(id = "modelling", class="colourheader",
tags$div(class="paddeddiv",style="position: relative;",
tags$h2(paste0("Modelling"), style = "font-weight: bold; text-align: center;"),
p(style="margin-top: 5px;",paste0(modelling_one)),
p(style="margin-top: 5px;",paste0(modelling_two))
)
),
br(),
br(),
#### Variable creation ####
tags$header(id = "variable_creation", class="colourheader3",
tags$div(class="paddeddiv",style="position: relative;",
tags$h2(paste0("Variable creation"), style = "font-weight: bold; text-align: center;"),
tags$h3(paste0(competitiveness_indices), style = "font-weight: bold;"),
lapply(
c(
competitiveness_indices_one,
competitiveness_indices_two,
competitiveness_indices_three,
competitiveness_indices_four,
competitiveness_indices_five,
competitiveness_indices_six,
competitiveness_indices_seven
),
function(x) p(style = "margin-top: 5px;", HTML(x))
),
br(),
tags$h3(paste0(principal_component_analysis_pca), style = "font-weight: bold;"),
lapply(
c(
principal_component_analysis_pca_one,
the_five_principal_components_can_be_broadly_interpreted_as,
the_five_principal_components_can_be_broadly_interpreted_as_one,
the_five_principal_components_can_be_broadly_interpreted_as_two,
the_five_principal_components_can_be_broadly_interpreted_as_three,
the_five_principal_components_can_be_broadly_interpreted_as_four,
the_five_principal_components_can_be_broadly_interpreted_as_five,
the_five_principal_components_can_be_broadly_interpreted_as_six
),
function(x) p(style = "margin-top: 5px;", HTML(x))
)
)
),
br(),
br(),
#### Regression ####
tags$header(id = "regression", class="colourheader2",
tags$div(class="paddeddiv",style="position: relative;",
tags$h2(paste0("Regression analysis"), style = "font-weight: bold; text-align: center;"),
p(style="margin-top: 5px;",paste0(regression_analysis_one)),
p(style="margin-top: 5px;",paste0(regression_analysis_two)),
tags$button(
class = "btn btn-light mt-3 detail-toggle-btn-black",
type = "button",
"data-toggle-target" = "#regression-moreContent",
"data-show-text" = "Click to view more detailed description of methodology ▼",
"data-hide-text" = "Show less ▲",
"Click to view more detailed description of methodology ▼"
),
tags$div(
id = "regression-moreContent",
class = "collapse mt-3",
p(style = "margin-top: 5px;", paste0(hidden_click_to_view_more_detailed_description_of_methodology_one)),
p(style = "margin-top: 5px;", paste0(hidden_click_to_view_more_detailed_description_of_methodology_two)),
p(style = "margin-top: 5px;", paste0(hidden_click_to_view_more_detailed_description_of_methodology_three))
),
)
),
br(),
br(),
#### Regression in one season ####
tags$header(id = "regression_current_year", class="colourheader3",
tags$div(class="paddeddiv",style="position: relative;",
tags$h2(paste0("Regression analysis on league characteristics and same season's European performance"), style = "font-weight: bold; text-align: center;"),
p(style = "margin-top: 5px;", paste0(on_league_characteristics_and_same_season_s_european_performance_one))
)
),
br(),
br(),
tags$div(ID = "regression_current_year_plot",
div(class="scrolly",
tags$figure(class="sticky",style=("order: 0; display: flex; flex-direction: column;"),
tags$h4(style="text-align: center;", "Coefficient estimates for regression"),
plotlyOutput("regression_coefficients_current_plot", height = "100%")
),
tags$article(
div(class="regression_current_year_plot text-article", `data-width`="1",`data-index`="0",
p(strong(" Using all variables (R2 = 0.069) "),
br(),
on_league_characteristics_and_same_season_s_european_performance_two)),
div(class="regression_current_year_plot text-article", `data-width`="1",`data-index`="1",
p(strong(" Using principle components (R2 = 0.049) "),
br(),
on_league_characteristics_and_same_season_s_european_performance_three)),
div(class="regression_current_year_plot text-article", `data-width`="1",`data-index`="2",
p(strong(" Using competitive indices (R2 = 0.040) "),
br(),
on_league_characteristics_and_same_season_s_european_performance_four))
))
),
br(),
br(),
#### Regression in next season ####
tags$header(id = "regression_next_year", class="colourheader3",
tags$div(class="paddeddiv",style="position: relative;",
tags$h2(paste0("Regression analysis on league characteristics and next season's European performance"), style = "font-weight: bold; text-align: center;"),
p(style = "margin-top: 5px;", paste0(on_league_characteristics_and_next_season_s_european_performance_one))
)
),
br(),
br(),
tags$div(ID = "regression_next_year_plot",
div(class="scrolly",
tags$figure(class="sticky",style=("order: 0; display: flex; flex-direction: column;"),
tags$h4(style="text-align: center;", "Coefficient estimates for regression"),
plotlyOutput("regression_coefficients_next_plot", height = "100%")
),
tags$article(
div(class="regression_next_year_plot text-article", `data-width`="1",`data-index`="0",
p(strong(" Using all variables (R2 = 0.128) "),
br(),
on_league_characteristics_and_next_season_s_european_performance_two)),
div(class="regression_next_year_plot text-article", `data-width`="1",`data-index`="1",
p(strong(" Using principle components (R2 = 0.112) "),
br(),
on_league_characteristics_and_next_season_s_european_performance_three)),
div(class="regression_next_year_plot text-article", `data-width`="1",`data-index`="2",
p(strong(" Using competitive indices (R2 = 0.090) "),
br(),
on_league_characteristics_and_next_season_s_european_performance_four))
))
),
br(),
br(),
#### Regression by competition ####
tags$header(id = "regression_competition", class="colourheader3",
tags$div(class="paddeddiv",style="position: relative;",
tags$h2(paste0("Regression analysis on league characteristics and same season's European performance by competition"), style = "font-weight: bold; text-align: center;"),
p(style = "margin-top: 5px;", paste0(on_league_characteristics_and_same_season_s_european_performance_by_co_one))
)
),
br(),
br(),
tags$div(ID = "regression_competition_plot",
div(class="scrolly",
tags$figure(class="sticky",style=("order: 0; display: flex; flex-direction: column;"),
tags$h4(style="text-align: center;", "Coefficient estimates for regression"),
plotlyOutput("regression_coefficients_competition_plot", height = "100%")
),
tags$article(
div(class="regression_competition_plot text-article", `data-width`="1",`data-index`="0",
p(strong(" Using all variables (R2 = 0.099) "),
br(),
on_league_characteristics_and_same_season_s_european_performance_by_co_two)),
div(class="regression_competition_plot text-article", `data-width`="1",`data-index`="1",
p(strong(" Using principle components (R2 = 0.049) "),
br(),
on_league_characteristics_and_same_season_s_european_performance_by_co_three)),
div(class="regression_competition_plot text-article", `data-width`="1",`data-index`="2",
p(strong(" Using competitive indices (R2 = 0.042) "),
br(),
on_league_characteristics_and_same_season_s_european_performance_by_co_four))
))
),
br(),
br(),
#### Clustering ####
tags$header(id = "clustering", class="colourheader2",
tags$div(class="paddeddiv",style="position: relative;",
tags$h2(paste0("Clustering to group similar seasons together"), style = "font-weight: bold; text-align: center;"),
p(style = "margin-top: 5px;", paste0(clustering_to_group_similar_seasons_together_one)),
p(style = "margin-top: 5px;", paste0(clustering_to_group_similar_seasons_together_two)),
p(style = "margin-top: 5px;", paste0(clustering_to_group_similar_seasons_together_three))
)
),
br(),
br(),
tags$div(ID = "clustering_plot",
div(class="scrolly",
tags$figure(class="sticky",style=("order: 0; display: flex; flex-direction: column;"),
tags$h4(style="text-align: center;", "Average characteristics of clusters"),
plotlyOutput("clustering_characteristics_plot", height = "100%")
),
tags$article(
div(class="clustering_plot text-article", `data-width`="1",`data-index`="0",
p(strong(" Elite competition with wider league separation "),
br(),
radar_plots_for_clusters_one)),
div(class="clustering_plot text-article", `data-width`="1",`data-index`="1",
p(strong(" Elite dominance across the league "),
br(),
radar_plots_for_clusters_two)),
div(class="clustering_plot text-article", `data-width`="1",`data-index`="2",
p(strong(" Most competitive league profile "),
br(),
radar_plots_for_clusters_three))
))
),
br(),
br(),
tags$header(class="colourheader3",
tags$div(class="paddeddiv",style="position: relative;",
p(style = "margin-top: 5px;", paste0(radar_plots_for_clusters_overall))
)
),
br(),
br(),
div(
class = "bigfixedimage",
style = paste0("background-image: url('cpfc.jpg');min-height: 100vh;")
),
#### Conclusion ####
tags$header(id = "conclusion", class="colourheader",
tags$div(class="paddeddiv",style="position: relative;",
tags$h2(paste0("Conclusion"), style = "font-weight: bold; text-align: center;"),
lapply(
c(
overall_conclusion_one,
overall_conclusion_two,
overall_conclusion_three,
overall_conclusion_four,
overall_conclusion_five,
overall_conclusion_six,
overall_conclusion_seven
),
function(x) {
p(
style = "margin-top: 5px;",
HTML(x)
)
}
)
)
),
br(),
br(),
#### Limitations ####
tags$header(class="colourheader3",
tags$div(class="paddeddiv",style="position: relative;",
tags$h2(paste0("Limitations"), style = "font-weight: bold; text-align: center;"),
lapply(
c(
limitations_one,
limitations_two,
limitations_three,
limitations_four,
limitations_five,
limitations_six,
limitations_seven
),
function(x) {
p(
style = "margin-top: 5px;",
HTML(x)
)
}
)
)
),
br(),
br(),
#### Footnote ####
tags$header(class="colourheader3",
tags$div(class="paddeddiv",style="position: relative;",
tags$h2(paste0("Data collection, sources and analysis process"), style = "font-weight: bold; text-align: center;"),
lapply(
c(
data_sources_and_how_data_was_collected_and_analysis_was_done_one,
data_sources_and_how_data_was_collected_and_analysis_was_done_eleven,
data_sources_and_how_data_was_collected_and_analysis_was_done_two,
data_sources_and_how_data_was_collected_and_analysis_was_done_three,
data_sources_and_how_data_was_collected_and_analysis_was_done_four,
data_sources_and_how_data_was_collected_and_analysis_was_done_five,
data_sources_and_how_data_was_collected_and_analysis_was_done_six,
data_sources_and_how_data_was_collected_and_analysis_was_done_seven,
data_sources_and_how_data_was_collected_and_analysis_was_done_eight,
data_sources_and_how_data_was_collected_and_analysis_was_done_nine,
data_sources_and_how_data_was_collected_and_analysis_was_done_ten
),
function(x) {
p(
style = "margin-top: 5px;",
HTML(x)
)
}
)
)
),
br(),
br(),
#### ending section ####
tags$header(class="colourheader",
style="background:#010056 ; color:white;",
tags$div(class="paddeddiv",style="position: relative;",
tags$h1(paste0(title)),
tags$h3(name),
tags$h3(date))
),
#### expandable/collapsable text function ####
tags$script(HTML("
document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('[data-toggle-target]').forEach(function(button) {
const targetSelector = button.getAttribute('data-toggle-target');
const target = document.querySelector(targetSelector);
if (!target) return;
const showText = (button.getAttribute('data-show-text') || button.textContent || '').trim();
const hideText = (button.getAttribute('data-hide-text') || 'Show less ▲').trim();
const isVisible = function(el) {
return window.getComputedStyle(el).display !== 'none' && !el.hidden;
};
button.textContent = isVisible(target) ? hideText : showText;
button.addEventListener('click', function() {
if (isVisible(target)) {
target.classList.remove('show');
target.style.display = 'none';
button.textContent = showText;
} else {
target.classList.add('show');
target.style.display = 'block';
button.textContent = hideText;
}
});
});
});
")),
#### scrolly javascript ####
HTML("<script src='https://unpkg.com/d3@5.4.0/dist/d3.min.js'></script>"),
HTML("<script src='https://unpkg.com/enter-view@1.0.0/enter-view.min.js'></script>"),
HTML("<script src='https://unpkg.com/stickyfilljs@2.0.5/dist/stickyfill.js'></script>"),
HTML(as.character(create_scrolly_side("time_plot")[2])),
HTML(as.character(create_scrolly_side("league_averages_plot")[2])),
HTML(as.character(create_scrolly_side("basic_profiling_plot")[2])),
HTML(as.character(create_scrolly_side("regression_current_year_plot")[2])),
HTML(as.character(create_scrolly_side("regression_next_year_plot")[2])),
HTML(as.character(create_scrolly_side("regression_competition_plot")[2])),
HTML(as.character(create_scrolly_side("clustering_plot")[2]))
)
Binary file not shown.

After

Width:  |  Height:  |  Size: 484 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 MiB

+553
View File
@@ -0,0 +1,553 @@
html {scroll-behavior: smooth;}
*:focus-visible{
outline: 2px solid crimson !important;
scroll-margin-top: 85vh !important;
}
.hidden {
visibility: hidden;
}
.hidden2 {
visibility: hidden;
}
.displayed{
width: 100%;
justify-content: center;
height:100vh;
}
.switch {
position: relative;
display: inline-block;
width: 60px;
height: 34px;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
-webkit-transition: .4s;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}
input:checked + .slider {
background-color: #010056;
}
input:focus + .slider {
box-shadow: 0 0 1px #010056;
}
input:checked + .slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(26px);
}
/* Rounded sliders */
.slider.round {
border-radius: 34px;
}
.slider.round:before {
border-radius: 50%;
}
/* Table of contents */
.colourheader, .toc {
background: #010056;
color: white;
padding: 6vh;
border-radius: 10px;
font-family: Arial, Helvetica, sans-serif;
}
.toc ul {
list-style-type: disc;
padding-left: 25px;
margin-top: 5px;
}
.toc li {
margin-bottom: 6px;
font-weight: normal;
}
.toc a {
color: white;
text-decoration: none;
font-weight: normal;
}
.toc a:hover {
text-decoration: underline;
}
.toc h1 {
margin-top: 25px;
margin-bottom: 25px;
font-size: 2.2em;
font-weight: bold;
text-align: center;
padding-bottom: 10px;
letter-spacing: 1px;
}
.toc h3 {
display: inline;
margin: 0;
font-size: 1.2em;
font-weight: bold;
color: white;
}
/* Expandable text button */
.detail-toggle-btn {
display: inline-block !important;
/* allow wrapping */
max-width: 100% !important;
white-space: normal !important;
overflow-wrap: break-word; /* ensures long text wraps */
/* reset sizing constraints that prevent wrapping */
width: auto;
flex: 0 1 auto !important;
box-sizing: border-box;
/* styling */
color: white;
border: 1px solid white;
background-color: transparent;
font-weight: 500;
font-family: Arial, Helvetica, sans-serif;
font-size: 1em;
text-align: left;
padding: 0.25rem 0.5rem;
cursor: pointer;
}
.detail-toggle-btn:hover,
.detail-toggle-btn:focus,
.detail-toggle-btn:active {
color: white !important;
border-color: white !important;
background-color: transparent !important;
outline: none;
box-shadow: none;
}
.detail-toggle-btn-black {
color: black !important;
border-color: black !important;
background-color: transparent !important;
}
.detail-toggle-btn-black:hover,
.detail-toggle-btn-black:focus,
.detail-toggle-btn-black:active {
color: black !important;
border-color: black !important;
background-color: transparent !important;
}
/* GLOBALS */
html, body {
position: relative;
width: 100%;
height: 100%;
}
@media screen and (min-width: 768px){
body {
color: #222;
background-color: #fff;
margin: 0;
padding: 0;
-webkit-box-sizing: border-box;
box-sizing: border-box;
font-family: Arial, Helvetica, sans-serif;
font-size: 18px;
line-height: 1.5;
word-wrap: break-word;
}
}
@media screen and (max-width: 767px){
body {
color: #222;
background-color: #fff;
margin: 0;
padding: 0;
-webkit-box-sizing: border-box;
box-sizing: border-box;
font-family: Arial, Helvetica, sans-serif;
font-size: 15px;
line-height: 1.5;
word-wrap: break-word;
}
}
header, section, nav, footer, figure, caption { /* This places text in center of various elements */
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
background-position: center;
background-repeat: no-repeat;
background-size: cover;
margin: 0;
padding: 0;
}
footer {
margin: 60px 0 0 0;
}
/* These are the default heading styles */
@media screen and (max-width: 767px){
.text-big {
font-size: 15px;
margin: 10px 0;
}
.text-article{
font-size: 15px;
margin: 10px 0;
}
}
@media screen and (min-width: 768px){
.text-big {
font-size: 15px;
margin: 20px 0;
}
.text-article{
font-size: 15px;
margin: 10px 0;
}
}
/* These are the default paragraph, image and blockquote styles */
p {
margin: 0 0 0 0;
}
img {
max-width: 100%;
height: auto;
vertical-align: middle;
}
blockquote {
margin: 30px 0 6px 0;
font-size: 30px;
color: #777;
}
small {
font-size: 14px;
}
/* CLASSES */
.header {
background-color: #f4f4f4;
position: fixed;
top: 0;
left: 0;
right: 0;
height: 2vh;
display: flex;
align-items: center;
justify-content: space-between; /* space between jump-link and logo */
z-index: 10;
padding: 0 15px;
}
/* Jump link on the left */
.jump-link {
font-size: 16px;
white-space: nowrap;
}
/* Responsive adjustments */
@media (max-width: 767px) {
.header {
padding: 0 10px;
}
.jump-link {
font-size: 10px;
margin-right: 10px;
}
.logo-img {
height: 5vh;
}
}
/* This is for fixed background images sometimes visible between content */
@media screen and (min-width: 768px){
.bigfixedimage{
height: 93vh;
width:100%;
background-attachment: fixed;
background-position: center;
background-repeat: no-repeat;
background-size:cover;cover;
border-radius: 25px;}
.bigfixedimage2{
height: 93vh;
width:100%;
background-attachment: relative;
background-position: center;
background-repeat: no-repeat;
background-size:cover;cover;
border-radius: 25px;}
}
@media screen and (max-width: 767px){
.bigfixedimage{
height: 30vh;
background-position: center;
background-repeat: no-repeat;
background-size:cover;auto;
border-radius: 25px;}
.bigfixedimage2{
height: 30vh;
width:100%;
background-position: center;
background-repeat: no-repeat;
background-size:cover;auto;
border-radius: 25px;}
}
@media screen and (min-width: 768px){
/* This is a colour panel */
.colourheader{
color: #fff;
background-color: #010056;
background-image: none;
background-attachment: fixed;
/*min-height: 93vh;*/
border-radius: 25px;
}
.colourheader2{
color: black !important;
background-color: #F36617 !important;
background-image: none;
background-attachment: fixed;
/*min-height: 93vh;*/
border-radius: 25px;
}
.colourheader3{
color: black;
background-color: #F4F4F4;
background-image: none;
background-attachment: fixed;
/*min-height: 93vh;*/
border-radius: 25px;
}
/* This pads element so it is a smaller block within contaiing element, eg to make text start closer to center */
.paddeddiv{
position: relative;
box-sizing: border-box;
padding: 40px 0;
/*min-height: 85vh;*/
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
width: 100%;
max-width: 980px;
margin: 0 24px;
}
}
@media screen and (max-width: 767px){
/* This is a colour panel */
.colourheader{
color: #fff;
background-color: #010056;
background-image: none;
background-attachment: fixed;
/*min-height: 30vh!important;*/
border-radius: 25px;
}
.colourheader2{
color: black !important;
background-color: #F36617 !important;
background-image: none;
background-attachment: fixed;
/*min-height: 30vh!important;*/
border-radius: 25px;
}
.colourheader3{
color: black;
background-color: #F4F4F4;
background-image: none;
background-attachment: fixed;
/*min-height: 93vh;*/
border-radius: 25px;
}
.paddeddiv{
position: relative;
box-sizing: border-box;
padding: 10px 0;
min-height: 25vh;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
width: 100%;
max-width: 980px;
margin: 0 24px;
}
}
.col-medium {
width: 100%;
max-width: 680px;
margin: 0 24px;
}
.text-indent {
margin-left: 30px;
}
.selectize-input { font-size: 16px; line-height: 16px;}
.selectize-dropdown { font-size: 16px; line-height: 16px; }
.sankey-link:hover { fill-opacity: 0.75 !important; }
.plotly .hoverlayer .hovertext { fill-opacity: 1 !important; stroke-opacity: 1 !important; }
/* Allow scrolling on mobile over graphs */
.scrolly {
touch-action: pan-y !important;
-ms-touch-action: pan-y !important;
}
.scrolly figure.sticky {
touch-action: pan-y !important;
pointer-events: auto !important;
}
.plotly-scrolling-over {
touch-action: pan-y !important;
overflow-y: auto;
}
.scrolly .maindrag,
.scrolly .angulardrag,
.scrolly .radialdrag,
.scrolly .radialdrag-inner {
pointer-events: none !important;
}
/* Make cut 1 over time larger on mobile screen*/
@media screen and (max-width: 767px){
.scrolly figure.sticky {
height: 60vh !important;
top: 10vh !important;
}
.scrolly figure.sticky .plotly {
height: 100% !important;
}
}
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB