El presente informe desarrolla un análisis estadístico descriptivo sobre la base de datos de jugadores convocados a la Copa Mundial de la FIFA 2026, correspondiente a la Actividad 112 del curso. La base contiene información individual de 1.039 jugadores provenientes de distintas selecciones clasificadas.
El objetivo de este trabajo es aplicar los conceptos de estadística descriptiva vistos en el curso y hacer análisis sobre variables tanto cualitativas como cuantitativas, con el fin de caracterizar el perfil general de los convocados al torneo.
Objetivo general
Realizar un análisis estadístico descriptivo de al menos dos variables cualitativas y dos variables cuantitativas de la base de datos de jugadores de la Copa Mundial FIFA 2026, mediante tablas de frecuencia, indicadores estadísticos y gráficos, que permitan describir las características generales de los jugadores convocados.
| Tipo de variable | Variable | Descripción |
|---|---|---|
| Cualitativa | Posicion |
Posición de juego del jugador (Portero, Defensa, Mediocampista, Delantero) |
| Cualitativa | Country |
Selección nacional a la que representa el jugador |
| Cuantitativa | Age |
Edad del jugador (en años) |
| Cuantitativa | Goles |
Número de goles anotados por el jugador |
# Carga de la base de datos
datos <- read_csv("wc2026_depurado (1).csv", show_col_types = FALSE)
# Traducción de la posición al español para mejor lectura
datos <- datos %>%
mutate(Posicion_es = case_when(
Posicion == "GK" ~ "Portero",
Posicion == "DF" ~ "Defensa",
Posicion == "MF" ~ "Mediocampista",
Posicion == "FW" ~ "Delantero",
TRUE ~ Posicion
))| Jugador | Posición | Selección | Edad | Goles |
|---|---|---|---|---|
| Brenden Aaronson | Mediocampista | United States | 25 | 0 |
| Thelo Aasgaard | Mediocampista | Norway | 24 | 1 |
| Hamza Abdelkarim | Delantero | Egypt | 18 | 0 |
| Hossam Abdelmaguid | Defensa | Egypt | 25 | 0 |
| Mohamed Abdelmonem | Defensa | Egypt | 27 | 0 |
| Ali Abdi | Defensa | Tunisia | 32 | 0 |
Posicion)tabla_posicion <- datos %>%
count(Posicion_es, name = "Frecuencia") %>%
mutate(
`Frecuencia relativa` = round(Frecuencia / sum(Frecuencia), 3),
`Porcentaje (%)` = round(Frecuencia / sum(Frecuencia) * 100, 1)
) %>%
arrange(desc(Frecuencia))
kable(tabla_posicion, caption = "Tabla de frecuencias - Posición de juego") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE) %>%
row_spec(0, background = "#00573F", color = "white", bold = TRUE)| Posicion_es | Frecuencia | Frecuencia relativa | Porcentaje (%) |
|---|---|---|---|
| Mediocampista | 392 | 0.377 | 37.7 |
| Defensa | 349 | 0.336 | 33.6 |
| Delantero | 236 | 0.227 | 22.7 |
| Portero | 62 | 0.060 | 6.0 |
# Variables auxiliares para el texto (evitan nombres de columnas con espacios en línea)
top_posicion <- tabla_posicion$Posicion_es[1]
top_posicion_frec <- tabla_posicion$Frecuencia[1]
top_posicion_pct <- tabla_posicion$`Porcentaje (%)`[1]ggplot(tabla_posicion, aes(x = reorder(Posicion_es, -Frecuencia), y = Frecuencia, fill = Posicion_es)) +
geom_col(width = 0.65) +
geom_text(aes(label = Frecuencia), vjust = -0.4, fontface = "bold", color = "grey20") +
scale_fill_manual(values = paleta_fifa) +
labs(
title = "Distribución de jugadores por posición de juego",
subtitle = "Convocados a la Copa Mundial FIFA 2026",
x = "Posición", y = "Número de jugadores"
) +
tema_fifa +
theme(legend.position = "none")tabla_posicion <- tabla_posicion %>%
mutate(etiqueta = paste0(Posicion_es, "\n", `Porcentaje (%)`, "%"))
ggplot(tabla_posicion, aes(x = "", y = Frecuencia, fill = Posicion_es)) +
geom_col(width = 1, color = "white") +
coord_polar(theta = "y") +
geom_text(aes(label = etiqueta), position = position_stack(vjust = 0.5), color = "white", fontface = "bold", size = 3.5) +
scale_fill_manual(values = paleta_fifa) +
labs(title = "Participación porcentual por posición de juego", fill = "Posición") +
theme_void() +
theme(
plot.title = element_text(face = "bold", color = fifa_green, hjust = 0.5, size = 14),
legend.position = "bottom"
)La posición con mayor número de convocados es Mediocampista, con 392 jugadores (37.7%), seguida de las demás posiciones en el orden mostrado en la tabla. Esto es consistente con la lógica táctica del fútbol moderno, en la que los equipos suelen convocar un mayor número de mediocampistas y defensas que de porteros.
Country)Dado que existen numerosas selecciones participantes, se presenta la tabla de frecuencias para las 10 selecciones con mayor número de jugadores convocados en la base de datos.
tabla_pais <- datos %>%
count(Country, name = "Frecuencia") %>%
mutate(`Porcentaje (%)` = round(Frecuencia / sum(Frecuencia) * 100, 1)) %>%
arrange(desc(Frecuencia)) %>%
slice_head(n = 10)
kable(tabla_pais, caption = "Top 10 selecciones con mayor número de jugadores convocados") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE) %>%
row_spec(0, background = "#C8102E", color = "white", bold = TRUE)| Country | Frecuencia | Porcentaje (%) |
|---|---|---|
| Iraq | 25 | 2.4 |
| Mexico | 25 | 2.4 |
| Norway | 25 | 2.4 |
| Argentina | 24 | 2.3 |
| England | 24 | 2.3 |
| Japan | 24 | 2.3 |
| Paraguay | 24 | 2.3 |
| United States | 24 | 2.3 |
| Australia | 23 | 2.2 |
| Belgium | 23 | 2.2 |
ggplot(tabla_pais, aes(x = reorder(Country, Frecuencia), y = Frecuencia)) +
geom_col(fill = fifa_blue, width = 0.65) +
geom_text(aes(label = Frecuencia), hjust = -0.3, fontface = "bold", color = "grey20") +
coord_flip() +
labs(
title = "Top 10 selecciones con más jugadores convocados",
x = "Selección", y = "Número de jugadores"
) +
ylim(0, max(tabla_pais$Frecuencia) + 3) +
tema_fifaSe observa que la mayoría de las selecciones convocan entre 23 y 25 jugadores, una edad joven y comun dentro del torneo.
Age)moda <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
resumen_edad <- datos %>%
summarise(
n = n(),
Media = round(mean(Age), 2),
Mediana = median(Age),
Moda = moda(Age),
`Desv. estándar` = round(sd(Age), 2),
Varianza = round(var(Age), 2),
Mínimo = min(Age),
`Q1 (25%)` = quantile(Age, 0.25),
`Q3 (75%)` = quantile(Age, 0.75),
Máximo = max(Age),
Rango = max(Age) - min(Age)
)
kable(resumen_edad, caption = "Estadísticos descriptivos - Edad de los jugadores") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE) %>%
row_spec(0, background = "#00573F", color = "white", bold = TRUE)| n | Media | Mediana | Moda | Desv. estándar | Varianza | Mínimo | Q1 (25%) | Q3 (75%) | Máximo | Rango |
|---|---|---|---|---|---|---|---|---|---|---|
| 1039 | 27.46 | 27 | 27 | 4.2 | 17.62 | 17 | 24 | 30 | 41 | 24 |
ggplot(datos, aes(x = Age)) +
geom_histogram(binwidth = 2, fill = fifa_lime, color = "white", boundary = 0) +
geom_vline(xintercept = mean(datos$Age), color = fifa_red, linetype = "dashed", linewidth = 1) +
labs(
title = "Distribución de la edad de los jugadores convocados",
subtitle = paste0("Línea roja = edad promedio (", round(mean(datos$Age), 1), " años)"),
x = "Edad (años)", y = "Frecuencia"
) +
tema_fifaggplot(datos, aes(x = "", y = Age)) +
geom_boxplot(fill = fifa_purple, width = 0.35, alpha = 0.8, outlier.color = fifa_red) +
labs(title = "Diagrama de caja - Edad de los jugadores", x = "", y = "Edad (años)") +
tema_fifa +
coord_flip()Goles)resumen_goles <- datos %>%
summarise(
n = n(),
Media = round(mean(Goles), 2),
Mediana = median(Goles),
Moda = moda(Goles),
`Desv. estándar` = round(sd(Goles), 2),
Varianza = round(var(Goles), 2),
Mínimo = min(Goles),
`Q1 (25%)` = quantile(Goles, 0.25),
`Q3 (75%)` = quantile(Goles, 0.75),
Máximo = max(Goles),
Rango = max(Goles) - min(Goles)
)
kable(resumen_goles, caption = "Estadísticos descriptivos - Goles anotados") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE) %>%
row_spec(0, background = "#C8102E", color = "white", bold = TRUE)| n | Media | Mediana | Moda | Desv. estándar | Varianza | Mínimo | Q1 (25%) | Q3 (75%) | Máximo | Rango |
|---|---|---|---|---|---|---|---|---|---|---|
| 1039 | 0.28 | 0 | 0 | 0.83 | 0.7 | 0 | 0 | 0 | 10 | 10 |
ggplot(datos, aes(x = Goles)) +
geom_histogram(binwidth = 1, fill = fifa_orange, color = "white") +
labs(
title = "Distribución del número de goles anotados",
subtitle = "Fase de clasificación previa al Mundial 2026",
x = "Goles", y = "Número de jugadores"
) +
tema_fifaggplot(datos, aes(x = "", y = Goles)) +
geom_boxplot(fill = fifa_blue, width = 0.35, alpha = 0.8, outlier.color = fifa_red) +
labs(title = "Diagrama de caja - Goles anotados", x = "", y = "Goles") +
tema_fifa +
coord_flip()ggplot(datos, aes(x = Posicion_es, y = Age, fill = Posicion_es)) +
geom_boxplot(alpha = 0.85, outlier.color = fifa_red) +
scale_fill_manual(values = paleta_fifa) +
labs(
title = "Distribución de la edad según la posición de juego",
x = "Posición", y = "Edad (años)"
) +
tema_fifa +
theme(legend.position = "none")Se aprecia que los porteros tienden a presentar una edad mediana superior a la de las demás posicione.
Como cierre del análisis, se presentan los 5 jugadores con mayor número de goles anotados dentro de la base de datos.
top5 <- datos %>%
select(Player, Country, Posicion_es, Goles, Asistencias) %>%
arrange(desc(Goles)) %>%
slice_head(n = 5) %>%
mutate(Puesto = row_number()) %>%
select(Puesto, Player, Country, Posicion_es, Goles, Asistencias)
kable(top5, caption = "Top 5 jugadores con más goles", col.names = c("#", "Jugador", "Selección", "Posición", "Goles", "Asistencias")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE) %>%
row_spec(0, background = "#FF6B00", color = "white", bold = TRUE) %>%
row_spec(1, background = "#fdf2e9", bold = TRUE)| # | Jugador | Selección | Posición | Goles | Asistencias |
|---|---|---|---|---|---|
| 1 | Kylian Mbappé | France | Delantero | 10 | 4 |
| 2 | Lionel Messi | Argentina | Delantero | 8 | 4 |
| 3 | Jude Bellingham | England | Mediocampista | 7 | 1 |
| 4 | Erling Haaland | Norway | Delantero | 7 | 0 |
| 5 | Ousmane Dembélé | France | Mediocampista | 6 | 2 |
ggplot(top5, aes(x = reorder(Player, Goles), y = Goles)) +
geom_col(fill = fifa_red, width = 0.6) +
geom_text(aes(label = Goles), hjust = -0.4, fontface = "bold", color = "grey20") +
coord_flip() +
ylim(0, max(top5$Goles) + 2) +
labs(
title = "Top 5 goleadores de la base de datos",
x = "", y = "Goles"
) +
tema_fifawc2026_depurado.csv — Actividad 112,
jugadores convocados a la Copa Mundial FIFA 2026.