1. Introducción

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")
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

2. Análisis de variables cualitativas

2.1 Variable: TORNEO (cualitativa nominal)

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")
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.

2.2 Variable: RESULTADO (cualitativa ordinal)

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")
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.


3. Análisis de variables cuantitativas

moda <- function(x) {
  x <- x[!is.na(x)]
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

3.1 Variable: GOLES POR PARTIDO (cuantitativa de razón)

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")
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)")
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.

3.2 Variable: DIFERENCIA DE GOLES (cuantitativa de razón)

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")
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.


4. Conclusiones

  • Las variables cualitativas analizadas (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.
  • Las variables cuantitativas (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).
  • En conjunto, el análisis de frecuencias e indicadores estadísticos permite caracterizar de forma integral el comportamiento histórico del fútbol internacional entre selecciones masculinas.