Este informe presenta un análisis estadístico descriptivo de
dos variables cualitativas (TORNEO y
RESULTADO) y dos variables cuantitativas
(GOLES POR PARTIDO y DIFERENCIA DE GOLES),
tomadas de la base de datos de partidos de fútbol internacional
(results.csv), que registra 49.520
partidos disputados entre selecciones absolutas desde 1872
hasta 2026.
ruta_csv <- "results.csv"
if (!file.exists(ruta_csv)) {
stop(paste0(
"No se encontro 'results.csv' en la carpeta: ", getwd(), "\n",
"Coloca el archivo results.csv en la misma carpeta que este documento .Rmd."
))
}
datos <- read.csv(ruta_csv, stringsAsFactors = FALSE, encoding = "UTF-8")
filas_originales <- nrow(datos)
# Se descartan partidos con marcador faltante (NA) en home_score o away_score,
# ya que no aportan informacion valida para el analisis de goles.
datos <- datos %>%
filter(!is.na(home_score), !is.na(away_score)) %>%
mutate(
fecha = as.Date(date),
torneo = tournament,
goles_totales = home_score + away_score,
dif_goles_partido = home_score - away_score,
resultado = case_when(
home_score > away_score ~ "Victoria local",
home_score < away_score ~ "Victoria visitante",
TRUE ~ "Empate"
)
)
filas_descartadas <- filas_originales - nrow(datos)
if (filas_descartadas > 0) {
cat("Se descartaron", filas_descartadas, "partidos con marcador faltante (NA).\n")
}
## Se descartaron 2 partidos con marcador faltante (NA).
kable(head(datos %>% select(fecha, home_team, away_team, home_score, away_score,
torneo, resultado, dif_goles_partido), 5),
caption = "Vista previa de la base de datos")
| fecha | home_team | away_team | home_score | away_score | torneo | resultado | dif_goles_partido |
|---|---|---|---|---|---|---|---|
| 1872-11-30 | Scotland | England | 0 | 0 | Friendly | Empate | 0 |
| 1873-03-08 | England | Scotland | 4 | 2 | Friendly | Victoria local | 2 |
| 1874-03-07 | Scotland | England | 2 | 1 | Friendly | Victoria local | 1 |
| 1875-03-06 | England | Scotland | 2 | 2 | Friendly | Empate | 0 |
| 1876-03-04 | Scotland | England | 3 | 0 | Friendly | Victoria local | 3 |
Por la gran cantidad de categorías (más de 200 torneos distintos), se presenta la tabla de frecuencias de los 10 torneos con mayor número de partidos.
tabla_torneo <- datos %>%
count(torneo, name = "Frecuencia_Absoluta") %>%
arrange(desc(Frecuencia_Absoluta)) %>%
mutate(
Frecuencia_Relativa = round(Frecuencia_Absoluta / sum(Frecuencia_Absoluta), 4),
Porcentaje = percent(Frecuencia_Relativa, accuracy = 0.01)
) %>%
slice_head(n = 10)
kable(tabla_torneo, col.names = c("Torneo", "Frec. Absoluta", "Frec. Relativa", "Porcentaje"),
caption = "Tabla de frecuencias - Top 10 torneos")
| Torneo | Frec. Absoluta | Frec. Relativa | Porcentaje |
|---|---|---|---|
| Friendly | 18387 | 0.3713 | 37.13% |
| FIFA World Cup qualification | 8771 | 0.1771 | 17.71% |
| UEFA Euro qualification | 2824 | 0.0570 | 5.70% |
| African Cup of Nations qualification | 2327 | 0.0470 | 4.70% |
| FIFA World Cup | 1066 | 0.0215 | 2.15% |
| Copa América | 869 | 0.0175 | 1.75% |
| African Cup of Nations | 845 | 0.0171 | 1.71% |
| AFC Asian Cup qualification | 829 | 0.0167 | 1.67% |
| UEFA Nations League | 658 | 0.0133 | 1.33% |
| CECAFA Cup | 620 | 0.0125 | 1.25% |
ggplot(tabla_torneo, aes(x = reorder(torneo, Frecuencia_Absoluta), y = Frecuencia_Absoluta)) +
geom_col(fill = "darkorange") +
coord_flip() +
labs(title = "Top 10 torneos con más partidos disputados",
x = NULL, y = "Frecuencia absoluta") +
theme_minimal(base_size = 12)
La categoría (moda) con mayor frecuencia es Friendly, con 18387 partidos, equivalentes al 37.13% del total registrado.
tabla_resultado <- datos %>%
count(resultado, name = "Frecuencia_Absoluta") %>%
arrange(desc(Frecuencia_Absoluta)) %>%
mutate(
Frecuencia_Relativa = round(Frecuencia_Absoluta / sum(Frecuencia_Absoluta), 4),
Frecuencia_Acumulada = cumsum(Frecuencia_Absoluta),
Porcentaje = percent(Frecuencia_Relativa, accuracy = 0.01)
)
kable(tabla_resultado,
col.names = c("Resultado", "Frec. Absoluta", "Frec. Relativa", "Frec. Acumulada", "Porcentaje"),
caption = "Tabla de frecuencias - RESULTADO")
| Resultado | Frec. Absoluta | Frec. Relativa | Frec. Acumulada | Porcentaje |
|---|---|---|---|---|
| Victoria local | 24264 | 0.4900 | 24264 | 49.00% |
| Victoria visitante | 13996 | 0.2826 | 38260 | 28.26% |
| Empate | 11258 | 0.2274 | 49518 | 22.74% |
ggplot(tabla_resultado, aes(x = resultado, y = Frecuencia_Absoluta, fill = resultado)) +
geom_col(show.legend = FALSE) +
labs(title = "Distribución de la variable RESULTADO",
x = NULL, y = "Frecuencia absoluta") +
theme_minimal(base_size = 12)
La moda de la variable RESULTADO es Victoria
local, presente en el 49.00% de los partidos, lo que sugiere
una ligera ventaja para el equipo que juega de local.
moda <- function(x) {
x <- x[!is.na(x)]
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
Suma de goles anotados por ambos equipos en cada partido
(home_score + away_score).
ind_goles <- datos %>%
summarise(
Media = round(mean(goles_totales, na.rm = TRUE), 2),
Mediana = median(goles_totales, na.rm = TRUE),
Moda = moda(goles_totales),
Desv_Est = round(sd(goles_totales, na.rm = TRUE), 2),
Varianza = round(var(goles_totales, na.rm = TRUE), 2),
Minimo = min(goles_totales, na.rm = TRUE),
Maximo = max(goles_totales, na.rm = TRUE),
Q1 = quantile(goles_totales, 0.25, na.rm = TRUE),
Q3 = quantile(goles_totales, 0.75, na.rm = TRUE)
)
kable(t(ind_goles), col.names = "Valor", caption = "Indicadores estadísticos - Goles por partido")
| Valor | |
|---|---|
| Media | 2.94 |
| Mediana | 3.00 |
| Moda | 2.00 |
| Desv_Est | 2.09 |
| Varianza | 4.39 |
| Minimo | 0.00 |
| Maximo | 31.00 |
| Q1 | 1.00 |
| Q3 | 4.00 |
tabla_goles <- datos %>%
count(goles_totales, name = "Frecuencia_Absoluta") %>%
arrange(goles_totales) %>%
mutate(
Frecuencia_Relativa = round(Frecuencia_Absoluta / sum(Frecuencia_Absoluta), 4),
Frecuencia_Acumulada = cumsum(Frecuencia_Absoluta)
) %>%
slice_head(n = 12)
kable(tabla_goles, col.names = c("Goles por partido", "Frec. Absoluta", "Frec. Relativa", "Frec. Acumulada"),
caption = "Tabla de frecuencias - Goles por partido (primeros 12 valores)")
| Goles por partido | Frec. Absoluta | Frec. Relativa | Frec. Acumulada |
|---|---|---|---|
| 0 | 3973 | 0.0802 | 3973 |
| 1 | 8569 | 0.1730 | 12542 |
| 2 | 10992 | 0.2220 | 23534 |
| 3 | 9789 | 0.1977 | 33323 |
| 4 | 6872 | 0.1388 | 40195 |
| 5 | 4267 | 0.0862 | 44462 |
| 6 | 2319 | 0.0468 | 46781 |
| 7 | 1259 | 0.0254 | 48040 |
| 8 | 647 | 0.0131 | 48687 |
| 9 | 354 | 0.0071 | 49041 |
| 10 | 187 | 0.0038 | 49228 |
| 11 | 99 | 0.0020 | 49327 |
ggplot(datos, aes(x = goles_totales)) +
geom_histogram(binwidth = 1, fill = "steelblue", color = "white") +
xlim(-1, 15) +
labs(title = "Distribución de goles totales por partido",
x = "Goles totales", y = "Frecuencia") +
theme_minimal(base_size = 12)
En promedio se marcan 2.94 goles por partido (mediana de 3), con una desviación estándar de 2.09 goles, lo que indica una dispersión moderada alrededor de la media.
Diferencia entre los goles del equipo local y el visitante
(home_score - away_score).
ind_dif <- datos %>%
summarise(
Media = round(mean(dif_goles_partido, na.rm = TRUE), 2),
Mediana = median(dif_goles_partido, na.rm = TRUE),
Moda = moda(dif_goles_partido),
Desv_Est = round(sd(dif_goles_partido, na.rm = TRUE), 2),
Varianza = round(var(dif_goles_partido, na.rm = TRUE), 2),
Minimo = min(dif_goles_partido, na.rm = TRUE),
Maximo = max(dif_goles_partido, na.rm = TRUE),
Q1 = quantile(dif_goles_partido, 0.25, na.rm = TRUE),
Q3 = quantile(dif_goles_partido, 0.75, na.rm = TRUE)
)
kable(t(ind_dif), col.names = "Valor", caption = "Indicadores estadísticos - Diferencia de goles")
| Valor | |
|---|---|
| Media | 0.57 |
| Mediana | 0.00 |
| Moda | 0.00 |
| Desv_Est | 2.42 |
| Varianza | 5.83 |
| Minimo | -21.00 |
| Maximo | 31.00 |
| Q1 | -1.00 |
| Q3 | 2.00 |
ggplot(datos, aes(y = dif_goles_partido)) +
geom_boxplot(fill = "seagreen") +
ylim(-10, 10) +
labs(title = "Diagrama de caja - Diferencia de goles", y = "Diferencia de goles (local - visitante)") +
theme_minimal(base_size = 12)
La diferencia de goles promedio es de 0.57, con una
mediana de 0, lo que confirma la ligera ventaja de localía observada en
la variable RESULTADO. El 50% central de los partidos
(entre Q1 y Q3) tiene una diferencia de goles entre -1 y 2, evidenciando
que la mayoría de los encuentros son parejos.
TORNEO y
RESULTADO) muestran que los partidos
amistosos y de calificación a Copa del
Mundo concentran la mayor cantidad de encuentros, y que jugar
de local otorga una ventaja estadísticamente visible en el resultado
final.GOLES POR PARTIDO y
DIFERENCIA DE GOLES) confirman que el fútbol internacional
tiende a ser un deporte de marcadores moderados (promedio cercano a 2.94
goles por partido) y de resultados relativamente parejos (diferencia de
goles concentrada cerca de cero).