load("ConjuntEquipsFutbol.RData")
La nostra pregunta:
Creiem que el conjunt resumeix correctament els atributs més importants dels equips de les 5 grans lligues, i això ens serà essencial per respondre bé la pregunta. Les variables clau EntrenadorEstranger (booleana) i PercentatgeEstrangers (numèrica) estan disponibles i representen directament els factors que volem estudiar.
Font del conjunt: Creat per nosaltres a partir de pàgines web com TransferMarkt i OneFootball.
Nombre d’observacions: la mostra és de 96 equips i per cada equip hem observat principalment dues variables. El percentatge d’estrangers a la plantilla i si és o no estranger l’entrenador.
Característiques importants: l’estudi reflecteix informació sobre els 96 equips de les 5 grans lligues de futbol a la temporada 2024-25 (no l’any natural 2024).
Cal remarcar que hi ha dades que fluctuen durant el llarg de la temporada, com ara el valor de mercat dels jugadors, així que s’ha agafat el valor del final de la temporada.
tibble(
variable = names(ConjuntEquipsFutbol),
tipus_r = sapply(ConjuntEquipsFutbol, class)
)
## # A tibble: 18 × 2
## variable tipus_r
## <chr> <chr>
## 1 IdEquip integer
## 2 NomEquipCurt character
## 3 NomEquip character
## 4 Lliga character
## 5 Pais character
## 6 Ciutat character
## 7 NomEstadi character
## 8 CapacitatEstadi integer
## 9 NomEntrenador character
## 10 EntrenadorEstranger. character
## 11 MitjanaEdatJugadors numeric
## 12 NacionalitatPrincipalPlantilla character
## 13 ValorMercatPlantillaEnMilions integer
## 14 AnyFundacio integer
## 15 TrofeusNacionals integer
## 16 TrofeusInternacionals integer
## 17 PercentatgeExtranjers integer
## 18 JugadorMesValor character
Descripció de les variables:
IdEquip (integer): identificador únic de cada equip [0, 95]
NomEquipCurt (character): nom que apareix al marcador en els partits de l’equip.
NomEquip (character): nom complet de l’equip.
Lliga (character): nom de quina de les 5 grans lligues europees juga l’equip.
País (character): nom del país d’on és originari l’equip.
Ciutat (character): nom del poble/ciutat on es troba l’estadi de l’equip.
NomEstadi (character): nom de l’estadi on juga l’equip com a local.
CapacitatEstadi (integer): aforament màxim de l’estadi de l’equip.
NomEntrenador (character): nom i cognoms de l’entrenador principal de l’equip.
EntrenadorEstranger? (character - bool ): indica si l’entrenador és estranger o, si pel contrari, és originari del país de l’equip que dirigeix.
MitjanaEdatJugadors(numeric): mitjana d’edat dels jugadors de la plantilla del primer equip.
NacionalitatPrincipalPlantilla (character): quina és la nacionalitat que predomina en la plantilla.
ValorMercatPlantillaEnMillons (integer): quin és el valor de mercat de la plantilla del primer equip.
AnyFundació (integer): indica en quin any va ser fundat el club.
TrofeusNacionals (integer): quantitat de trofeus nacionals que ha obtingut el club des de la seva fundació.
TrofeusInternacionals (integer): quantitat de trofeus internacionals que ha obtingut el club des de la seva fundació
PercentatgeExtranjers (integer): quin és el percentatge de jugadors no originaris del país de l’equip.
JugadorMesValor (character): nom del jugador amb més valor de mercat a la plantilla corresponent.
# Nombre d'equips
nrow(ConjuntEquipsFutbol)
## [1] 96
# Nombre de variables per equip
ncol(ConjuntEquipsFutbol)
## [1] 18
Quina és la unitat d’anàlisi:
ggplot(ConjuntEquipsFutbol, aes(x = EntrenadorEstranger., fill = EntrenadorEstranger.)) +
geom_bar() +
labs(
title = "Freqüència d'Entrenador Estranger",
x = "Entrenador Estranger",
y = "Nombre d'Equips",
fill = "Estranger?"
) +
geom_text(aes(label = after_stat(count)), stat = "count", vjust = -0.5) +
theme_minimal() +
theme(legend.position = "none", plot.title = element_text(hjust = 0.5, face = "bold"))
ggplot(ConjuntEquipsFutbol, aes(x = PercentatgeExtranjers)) +
geom_histogram(binwidth = 5, fill = "skyblue", color = "white", alpha = 0.8) +
labs(
title = "Distribució del Percentatge de Jugadors Estrangers",
x = "Percentatge Estrangers",
y = "Freqüència"
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"))
# Dades de la variable entrenadorEstranger:
freq_entrenadors = ConjuntEquipsFutbol %>%
group_by(EntrenadorEstranger.) %>%
summarise(n = n()) %>%
mutate(Percentatge = n / sum(n) * 100)
# Dades de la variable PercentatgeExtranjers:
kable(freq_entrenadors,
col.names = c("Info Entrenador Estranger", "n", "%"),
digits = 2)
| Info Entrenador Estranger | n | % |
|---|---|---|
| No | 52 | 54.17 |
| Sí | 44 | 45.83 |
ConjuntEquipsFutbol %>%
summarise(
mitjana_perc = mean(PercentatgeExtranjers),
mediana_perc = median(PercentatgeExtranjers),
desviacio_est = sd(PercentatgeExtranjers),
Q1 = quantile(PercentatgeExtranjers, 0.25),
Q3 = quantile(PercentatgeExtranjers, 0.75),
min = min(PercentatgeExtranjers),
max = max(PercentatgeExtranjers)
) %>%
kable(caption = "Info Percentatge d'Estrangers", digits = 4)
| mitjana_perc | mediana_perc | desviacio_est | Q1 | Q3 | min | max |
|---|---|---|---|---|---|---|
| 48.9688 | 48 | 13.7431 | 39 | 60 | 5 | 80 |
Observant les anteriors taules i gràfiques podem observar:
La gran majoria d’equips té entre un 30% i un 70% de jugadors estrangers a la plantilla, per la qual cosa a ull, podem percebre una mitjana aproximada de 50% de jugadors estrangers per plantilla en el nostre conjunt. Sent més exactes, observem els càlculs fets amb RStudio i obtenim un valor de 48’97%.
Observant l’anterior gràfic taronja-i-blau, es pot veure com aproximadament la meitat d’equips del nostre conjunt té entrenador estranger, i per tant la resta el tenen local. Per ser exactes, dels 96 equips, un 54,17% dels entrenadors són locals, i un 45,83% són estrangers.
summary(ConjuntEquipsFutbol)
## IdEquip NomEquipCurt NomEquip Lliga
## Min. : 0.00 Length:96 Length:96 Length:96
## 1st Qu.:23.75 Class :character Class :character Class :character
## Median :47.50 Mode :character Mode :character Mode :character
## Mean :47.50
## 3rd Qu.:71.25
## Max. :95.00
## Pais Ciutat NomEstadi CapacitatEstadi
## Length:96 Length:96 Length:96 Min. :11150
## Class :character Class :character Class :character 1st Qu.:25170
## Mode :character Mode :character Mode :character Median :33590
## Mean :38979
## 3rd Qu.:51701
## Max. :99354
## NomEntrenador EntrenadorEstranger. MitjanaEdatJugadors
## Length:96 Length:96 Min. :24.10
## Class :character Class :character 1st Qu.:26.00
## Mode :character Mode :character Median :26.70
## Mean :26.66
## 3rd Qu.:27.30
## Max. :28.90
## NacionalitatPrincipalPlantilla ValorMercatPlantillaEnMilions AnyFundacio
## Length:96 Min. : 70.0 Min. :1848
## Class :character 1st Qu.: 140.0 1st Qu.:1899
## Mode :character Median : 250.0 Median :1905
## Mean : 343.2 Mean :1908
## 3rd Qu.: 430.0 3rd Qu.:1919
## Max. :1300.0 Max. :2009
## TrofeusNacionals TrofeusInternacionals PercentatgeExtranjers
## Min. : 0.00 Min. : 0.000 Min. : 5.00
## 1st Qu.: 0.00 1st Qu.: 0.000 1st Qu.:39.00
## Median : 6.00 Median : 0.000 Median :48.00
## Mean :11.35 Mean : 1.948 Mean :48.97
## 3rd Qu.:16.00 3rd Qu.: 1.000 3rd Qu.:60.00
## Max. :96.00 Max. :31.000 Max. :80.00
## JugadorMesValor
## Length:96
## Class :character
## Mode :character
##
##
##
ggplot(ConjuntEquipsFutbol, aes(x = EntrenadorEstranger., y = PercentatgeExtranjers, fill = EntrenadorEstranger.)) +
geom_boxplot(alpha = 0.6, width = 0.5) +
geom_jitter(width = 0.2, alpha = 0.8, color = "black", size = 2) +
labs(
title = "Relació entre l'Origen de l'Entrenador i el Percentatge Estrangers",
x = "Entrenador Estranger?",
y = "Percentatge de Jugadors Estrangers a la Plantilla (%)",
fill = "Entrenador Estranger?"
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"),
legend.position = "none")
# Funció per calcular la probabilitat condicional P(Entrenador=Sí | Percentatge > llindar)
calcular_probabilitat_condicional = function(llindar) {
subconjunt = ConjuntEquipsFutbol %>% filter(PercentatgeExtranjers > llindar)
n_total_subconjunt = nrow(subconjunt)
if (n_total_subconjunt == 0) {
return(NA) # Retorna NA si no hi ha equips per sobre del llindar
}
n_estrangers_subconjunt = subconjunt %>%
filter(EntrenadorEstranger. == "Sí") %>%
nrow()
probabilitat = n_estrangers_subconjunt / n_total_subconjunt
return(probabilitat)
}
# Càlculs per als llindars 40%, 50% i 60%
llindars = c(40, 50, 60)
resultats_prob = tibble(
Llindar = llindars,
Probabilitat = sapply(llindars, calcular_probabilitat_condicional)
) %>%
mutate(`P(Entr. Estranger | %Estrang. > Llindar)` = paste0(round(Probabilitat * 100, 2), "%")) %>%
select(-Probabilitat)
kable(resultats_prob,
caption = "Probabilitat Condicional: P(Entrenador Estranger = Sí | % Estrangers > Llindar)")
| Llindar | P(Entr. Estranger | %Estrang. > Llindar) |
|---|---|
| 40 | 60.32% |
| 50 | 69.23% |
| 60 | 84.21% |
mitjana_lliga = aggregate(
PercentatgeExtranjers ~ Lliga,
data = ConjuntEquipsFutbol,
FUN = mean
)
colnames(mitjana_lliga)[2] = "Mitjana % Estrangers"
print(mitjana_lliga)
## Lliga Mitjana % Estrangers
## 1 Bundesliga 50.00000
## 2 LaLiga 39.35000
## 3 Ligue 1 46.11111
## 4 Premier League 61.05000
## 5 Serie A 48.15000
ConjuntEquipsFutbol <- ConjuntEquipsFutbol %>%
mutate(
PercentatgeNumeric = as.numeric(gsub("%", "", PercentatgeExtranjers))
)
resultat_t_test_percentatge <- t.test(
PercentatgeNumeric ~ EntrenadorEstranger.,
data = ConjuntEquipsFutbol,
var.equal = FALSE
)
print(resultat_t_test_percentatge)
##
## Welch Two Sample t-test
##
## data: PercentatgeNumeric by EntrenadorEstranger.
## t = -5.4107, df = 91.818, p-value = 4.967e-07
## alternative hypothesis: true difference in means between group No and group Sí is not equal to 0
## 95 percent confidence interval:
## -18.261914 -8.454869
## sample estimates:
## mean in group No mean in group Sí
## 42.84615 56.20455
resultat_student <- t.test(
PercentatgeNumeric ~ EntrenadorEstranger.,
data = ConjuntEquipsFutbol,
var.equal = TRUE
)
print(resultat_student)
##
## Two Sample t-test
##
## data: PercentatgeNumeric by EntrenadorEstranger.
## t = -5.4039, df = 94, p-value = 4.911e-07
## alternative hypothesis: true difference in means between group No and group Sí is not equal to 0
## 95 percent confidence interval:
## -18.266558 -8.450225
## sample estimates:
## mean in group No mean in group Sí
## 42.84615 56.20455
ic_inferior <- resultat_t_test_percentatge$conf.int[1]
ic_superior <- resultat_t_test_percentatge$conf.int[2]
print(paste("L'interval de confiança al 95% va de", round(ic_inferior, 2), "a", round(ic_superior, 2)))
## [1] "L'interval de confiança al 95% va de -18.26 a -8.45"
library(ggplot2)
# Paràmetres
t_obs <- -5.4107
df_valor <- 91.818
alfa <- 0.05
# Crear el gràfic
ggplot(data.frame(x = c(-6, 6)), aes(x = x)) +
# Dibuixar la corba
stat_function(fun = dt, args = list(df = df_valor), color = "black", linewidth = 1) +
# Pintar les zones
stat_function(fun = dt, args = list(df = df_valor),
xlim = c(-6, qt(alfa/2, df_valor)), geom = "area", fill = "red", alpha = 0.3) +
stat_function(fun = dt, args = list(df = df_valor),
xlim = c(qt(1-alfa/2, df_valor), 6), geom = "area", fill = "red", alpha = 0.3) +
geom_vline(xintercept = t_obs, color = "blue", linetype = "dashed", linewidth = 1) +
annotate("text", x = t_obs, y = 0.2, label = paste("t obs =", t_obs),
color = "blue", angle = 90, vjust = -0.5, fontface = "bold") +
labs(title = "Distribució t de Student i Regió de Rebuig",
subtitle = "La línia blava mostra que les dades cauen totalment fora de la zona esperada (H0)",
x = "Valors de t", y = "Densitat") +
theme_minimal()
# Càlcul dels components per a cada grup
resum <- ConjuntEquipsFutbol %>%
group_by(EntrenadorEstranger.) %>%
summarise(
n = n(),
mitjana = mean(PercentatgeNumeric, na.rm = TRUE),
variancia = var(PercentatgeNumeric, na.rm = TRUE),
desviacio = sd(PercentatgeNumeric, na.rm = TRUE)
)
print(resum)
## # A tibble: 2 × 5
## EntrenadorEstranger. n mitjana variancia desviacio
## <chr> <int> <dbl> <dbl> <dbl>
## 1 No 52 42.8 148. 12.2
## 2 Sí 44 56.2 143. 12.0
# separem els grups
grup_no <- ConjuntEquipsFutbol$PercentatgeNumeric[ConjuntEquipsFutbol$EntrenadorEstranger. == "No"]
grup_si <- ConjuntEquipsFutbol$PercentatgeNumeric[ConjuntEquipsFutbol$EntrenadorEstranger. == "Sí"]
# Desviacions típiques
s1 <- sd(grup_no, na.rm = TRUE)
s2 <- sd(grup_si, na.rm = TRUE)
# Variàncies
var1 <- var(grup_no, na.rm = TRUE)
var2 <- var(grup_si, na.rm = TRUE)
cat("Grup No: s1 =", s1, " | s1^2 =", var1, "\n")
## Grup No: s1 = 12.15002 | s1^2 = 147.6229
cat("Grup Si: s2 =", s2, " | s2^2 =", var2, "\n")
## Grup Si: s2 = 11.97008 | s2^2 = 143.2828
entrenador = ConjuntEquipsFutbol$EntrenadorEstranger.;
entrenadorBool = as.numeric(factor(entrenador, levels = c("No", "Sí"))) -1;
entrenadorBool
## [1] 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 0 0 1
## [39] 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 0 0 1 1 0 0 1 1 1 1 0 1
## [77] 1 0 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0
percentatgePlantilla = ConjuntEquipsFutbol$PercentatgeExtranjers;
dades_model <- ConjuntEquipsFutbol %>%
mutate(entrenador_binari = ifelse(EntrenadorEstranger. == "Sí", 1, 0))
# Ajustem el model de regressió logística
model_logistic <- glm(entrenador_binari ~ PercentatgeExtranjers,
data = dades_model,
family = binomial)
# Resum del model
summary(model_logistic)
##
## Call:
## glm(formula = entrenador_binari ~ PercentatgeExtranjers, family = binomial,
## data = dades_model)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -4.63216 1.05980 -4.371 1.24e-05 ***
## PercentatgeExtranjers 0.09048 0.02093 4.323 1.54e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 132.42 on 95 degrees of freedom
## Residual deviance: 106.86 on 94 degrees of freedom
## AIC: 110.86
##
## Number of Fisher Scoring iterations: 4
exp(coef(model_logistic))
## (Intercept) PercentatgeExtranjers
## 0.009733667 1.094700604
Un cop hem fet una primera anàlisi del conjunt de dades hem arribat a les següents conclusions:
El fet que un entrenador sigui estranger està relacionat amb el percentatge d’estrangers de l’equip, ja que podem veure com el nombre de jugadors estrangers augmenta significativament.
Alguna de les limitacions que ens hem trobat és només tenir informació de 5 lligues, perquè si haguéssim fet la base de dades amb més mostres les observacions podrien ser més precises i extreure millors conclusions.
Tenint en compte aquesta limitació una de les possibles millores seria augmentar la quantitat de lligues les quals analitzem. Un atribut que podríem haver analitzat és la quantitat d’estrangers que ha tingut un club amb entrenadors anteriors per saber si el percentatge d’estrangers està més relacionat amb el club o amb l’entrenador en qüestió.
Tant pel p-valor obtingut com el t estadístic observat, veiem que ambdós mostren valors molt inferiors als llindars de significació (normalment a=0.05); llavors podem rebutjar la hipòtesis nul·la (Ho).
Els equips amb entrenador estranger tenen, de mitjana, un 13.35% més de jugadors estrangers (comparativa: 56.20% vs 42.85%). Els intervals de confiança d’aquesta diferència mostrats a la figura superior denoten una seguretat del 95% d’estar entre aquests valors (tenint en compte que hem agafat 96 equips de tot el món només).
Fent aquesta regressió podem saber que:
Mirant el p-valor afirmem que hi ha una relació significativa entre aquestes dues variables ja que el p-valor és més petit que 0.05. Per tant, una influeix l’altre.
El coeficient Estimate ens diu que a mesura que el percentatge d’estrangers aumenta, la probabilitat que l’entrenador sigui estranger puja ja que és positiu.
Trobant els Odds també podem dir que per cada 1% que augmenti el percentatge d’estrangers de la plantilla, la probabilitat de que l’entrenador sigui estranger augmenta casi un 10%.