Анализ международных футбольных матчей

Автор

Фролов Александр и Денисова Ульяна

Введение

Футбол как вид спорта претерпел значительные изменения с момента проведения первого официального международного матча в 1872 году между Шотландией и Англией. Этот анализ охватывает более чем 150-летнюю историю международных футбольных соревнований, позволяя проследить эволюцию игры, выявить доминирующие команды и обнаружить интересные статистические закономерности.

Цель проекта:

Провести комплексный анализ эволюции международного футбола за 70 лет, выявив ключевые тенденции в результативности, тактических подходах и региональных особенностях, чтобы понять динамику развития этого вида спорта.

Задачи проекта:

  1. Загрузить и предобработать данные: привести данные к удобному формату для анализа.

  2. Провести анализ данных: рассчитать базовые статистики и выполнить агрегацию по ключевым показателям.

  3. Визуализировать данные: построить графики, помогающие выявить тенденции и особенности в данных.

  4. Оформить результаты: представить анализ в виде веб-страницы.

Методы исследования:

Описательная статистика, тренд-анализ, сравнительный анализ по группам, визуальная аналитика (ggplot2, plotly).Создание интерактивных отчетов (Quarto, R Markdown)

Практическая значимость:

Результаты исследования могут быть использованы тренерами и аналитиками для понимания исторических тенденций. Организаторами турниров при планировании соревнований, а также историками для их будущих исследований.

Загрузка и предобработка данных

Для анализа использовался набор данных с Kaggle, содержащий информацию о 44,000+ международных матчей. Данные были очищены и дополнены новыми переменными:

  • decade - Показывает какое десятилетие

  • home_win - Выиграла команда, которая играет дома (log)

  • away_win - Выиграла команда, которая играет в гостях (log)

  • draw - Ничья(log)

  • total_goals - Общее количество голов за матч

  • goal_diff - Разница мячей в матче

  • result - Результат матча

  • home_continent - Континент команды, играющей дома

  • away_continent - Континент команды, играющей в гостях

  • same_continent - Сравнивает континенты (log)

  • tournament_type - Тип турнира

library(tidyverse)  
library(lubridate)    
library(countrycode)  
library(ggthemes)     
library(scales)       
library(patchwork)    
library(gt)           

matches <- read_csv("results.csv", na = c("", "NA")) |> 
  mutate(
    date = as.Date(date),
    year = year(date),
    decade = floor(year/10) * 10,
    home_win = home_score > away_score,
    away_win = home_score < away_score,
    draw = home_score == away_score,
    total_goals = home_score + away_score,
    goal_diff = home_score - away_score,
    result = case_when(
      home_win ~ "Победа дома",
      away_win ~ "Победа в гостях",
      TRUE ~ "Ничья"
    ),
    home_continent = countrycode(home_team, "country.name", "continent"),
    away_continent = countrycode(away_team, "country.name", "continent"),
    same_continent = home_continent == away_continent,
    tournament_type = case_when(
      str_detect(tournament, "Friendly") ~ "Товарищеские",
      str_detect(tournament, "World Cup") ~ "Чемпионат мира",
      str_detect(tournament, "Euro|Copa America|Gold Cup|AFC|CAF") ~ "Континентальные",
      TRUE ~ "Другие"
    )
  ) |>
  filter(!is.na(home_continent), !is.na(away_continent), year >= 1950)

Глава 1. Общая статистика

1.1 Результаты всех прошедших матчей

График распределения результатов матчей.

p1 <- matches |>
  count(result) |>
  mutate(percent = n/sum(n)*100) |> 
  
  ggplot(aes(x = fct_reorder(result, n),
           y = n, 
           fill = result)) +
  geom_col() +
  geom_text(aes(label = paste0(round(percent,1), "%")), 
            hjust = -0.1, 
            size = 3.5) +
  coord_flip() +
  scale_fill_manual(values = c("Победа дома" = "#2c7bb6", 
                              "Победа в гостях" = "red", 
                              "Ничья" = "orange")) +
  labs(x = "", y = "Количество матчей", 
       title = "Распределение результатов матчей") +
  theme_minimal() +
  theme(legend.position = "none")
p1

На основании анализа всех международных матчей с 1950 по 2023 годы:

  • Победы хозяев составляют 48.9% — практически половина всех матчей завершалась в пользу домашней команды.

  • Победы гостей — 27.7%, что значительно ниже, подтверждая сложность игры вне домашнего стадиона.

  • Ничейные исходы встречаются в 23.3% случаев.

    Вывод:

    Домашнее поле даёт существенное преимущество, почти в два раза увеличивая шансы на победу по сравнению с выездными матчами. Это может быть связано с поддержкой болельщиков, привычной обстановкой и отсутствием переездов.

1.2 Распределение голов в матчах

matches |>
  ggplot(aes(x = total_goals)) +
  geom_histogram(
    binwidth = 1,
    fill = "#3182bd",
    alpha = 0.8,
    color = "white"
  ) +
  scale_x_continuous(breaks = seq(0, 20, by = 2)) +
  labs(
    x = "Голы за матч", 
    y = "Количество матчей",
    title = "Распределение голов в международных матчах",
    subtitle = "1950-2023 годы"
  ) +
  theme_minimal(base_size = 14) +
  theme(plot.title = element_text(face = "bold"))

По графику видно, что наиболее часто в международных матчах забивается 2 или 3 гола — пик распределения. Более 80% матчей укладываются в диапазон от 1 до 5 голов. Матчи с 6 и более голами — редкость, но такие случаи существуют (вплоть до 12–14 голов).Распределение асимметрично вправо, что говорит о наличии небольшого числа матчей с необычно высокой результативностью.

Вывод:

Большинство международных матчей имеют умеренную результативность. Среднее число голов за матч можно оценить примерно в 2.5–3, что согласуется с футбольной практикой. Редкие “перестрелки” с 6+ голами представляют интерес, но являются исключением.

Глава 2. Эволюция футбола по десятилетиям

Современные футбольные матчи стали более конкурентными и менее зрелищными. Давайте проверим эту гипотезу опираясь на количество забитых мячей в матчах по десятилетиям.

2.1 Изменение средней результативности

decade_stats <- matches |>
  group_by(decade) |>
  summarise(
    avg_goals = mean(total_goals),
    home_win_pct = mean(home_win) * 100,
    away_win_pct = mean(away_win) * 100,
    draw_pct = mean(draw) * 100,
    n_matches = n()
  )
p3 <- decade_stats |>
  ggplot(aes(x = decade, y = avg_goals)) +
  geom_line(color = "#2c7", size = 1.2) +
  geom_point(color = "#2c7", size = 3) +
  labs(x = "Десятилетие", y = "Среднее количество голов",
       title = "Изменение средней результативности") +
  theme_minimal()
p3

Вывод:

Исходя из графика можно сделать вывод о том, что наша гипотеза подтвердилась. В настоящее время футбол стал более конкуретноспособным и количество забиваемых мячей уменьшилось. Можно сказать о том, что в футболе с 1980 года появился акцент на игре в обороне.

2.2 Распределение типов турниров по десятилетиям

Далее рассмотрим какие матчи команды чаще играют между собой.

matches |> 
  group_by(decade, tournament_type) |> 
  summarise(n = n(), .groups = "drop_last") |> 
  mutate(pct = n / sum(n) * 100) |> 
  ggplot(aes(x = decade, y = pct, fill = fct_rev(tournament_type))) +
  geom_area(alpha = 0.8) +
  scale_fill_brewer(
    palette = "Set2",
    name = "Тип турнира",
    direction = -1
  ) +
  scale_x_continuous(breaks = seq(1950, 2020, by = 10)) +
  labs(
    title = "Эволюция структуры международных матчей",
    subtitle = "Доля различных типов турниров по десятилетиям",
    x = "Десятилетие", 
    y = "Доля матчей (%)"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold"),
    legend.position = "bottom"
  )

Вывод:

По данному графику видно, что количество товарищеских матчей сократилось, стало больше официальных турниров, особенно чемпионатов мира. Это связано с реформами в области формата проведения чемпионата мира, стало участвовать больше команд, а значит и больше матчей начало заигрываться. Также увеличилось число континентальных матчей, другие матчи остались примерно на том же уровне.

2.3 Агрегация: средние голы и количество матчей по континентам и десятилетиям

Наша гипотеза: cреднее количество забиваемых голов сократилось независимо от континета

continent_decade_stats <- matches |> 
  pivot_longer(
    c(home_continent, away_continent), 
    names_to = "location", 
    values_to = "continent"
  ) |>
  group_by(decade, continent) |> 
  summarise(
    avg_goals = mean(total_goals),
    n_matches = n(),
    .groups = "drop"
  )
continent_decade_stats |> 
  ggplot(aes(x = decade, y = avg_goals, color = continent)) +
  geom_line(size = 1.2) +
  geom_point(size = 3) +
  labs(
    title = "Средняя результативность по континентам",
    subtitle = "1950–2023 годы",
    x = "Десятилетие",
    y = "Среднее количество голов"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold"),
    legend.position = "bottom"
  )

Вывод:

Гипотеза подтвердилась, сравнивая 1950 с 2020 годом видно, что количетсво забиваемых мячей сократилось практически вдвое. Самое большое количество голов в Океании, наименьшее в Африке. Также в 1980 была просадка забиваемых мячей, это связано с новым трендом на хорошую оборону, лучшие команды в мире начали играть от защиты. Потребовалось небольшое количество времени,чтобы научиться играть против хорошей обороны, после чего показатель средних забитых голов за матч снова увеличилось.

Глава 3. Лучшие команды мира

В этой главе мы проанализируем какие сборные команды остаются лучшими на протяжении 75 лет. Проверим гипотезу - команда, которая забивает больше всех голов, больше всего и выигрывает.

3.1 Топ-20 команд по количеству побед

team_stats <- matches |> 
  pivot_longer(
    c(home_team, away_team), 
    names_to = "location", 
    values_to = "team"
  ) |> 
  mutate(
    win = case_when(
      location == "home_team" & goal_diff > 0 ~ TRUE,
      location == "away_team" & goal_diff < 0 ~ TRUE,
      TRUE ~ FALSE
    )
  ) |> 
  group_by(team) |> 
  summarise(
    matches = n(),
    wins = sum(win),
    win_rate = wins / matches,
    .groups = "drop"
  ) |> 
  arrange(desc(wins)) |> 
  head(20)

team_stats |> 
  mutate(team = fct_reorder(team, wins)) |> 
  ggplot(aes(x = team, y = wins, fill = win_rate)) +
  geom_col(width = 0.8) +
  geom_text(
    aes(label = wins),
    hjust = -0.2,
    size = 4
  ) +
  coord_flip() +
  scale_fill_gradient(
    low = "#e0f3db",
    high = "#43a2ca",
    name = "Процент побед"
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
  labs(
    x = NULL,
    y = "Количество побед",
    title = "Топ-20 национальных сборных по количеству побед",
    subtitle = "1950-2023 годы"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold"),
    panel.grid.major.y = element_blank(),
    legend.position = c(0.85, 0.2)
  )

3.2 Топ-20 команд по количеству голов

goal_stats <- matches |> 
  pivot_longer(
    c(home_team, away_team), 
    names_to = "location", 
    values_to = "team"
  ) |> 
  mutate(
    goals = ifelse(location == "home_team", home_score, away_score)
  ) |> 
  group_by(team) |> 
  summarise(
    matches = n(),
    goals = sum(goals),
    goals_per_match = goals / matches,
    .groups = "drop"
  ) |> 
  arrange(desc(goals)) |> 
  head(20)

goal_stats |> 
  mutate(team = fct_reorder(team, goals)) |> 
  ggplot(aes(x = team, y = goals, fill = goals_per_match)) +
  geom_col(width = 0.8) +
  geom_text(
    aes(label = goals),
    hjust = -0.2,
    size = 4
  ) +
  coord_flip() +
  scale_fill_gradient(
    low = "#fee8c8",
    high = "#e34a33",
    name = "Голов за матч"
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
  labs(
    x = NULL,
    y = "Количество голов",
    title = "Топ-20 национальных сборных по количеству голов",
    subtitle = "1950-2023 годы"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold"),
    panel.grid.major.y = element_blank(),
    legend.position = c(0.85, 0.2)
  )

Выводы:

Больше всего побед у самой забивающей команды - Бразилии. Вроде гипотеза должна подтвердиться, но цветовая шкала показывает, что не все команды с большим числом голов имеют высокий средний показатель за матч. Например, Мексика забила много, но с меньшей результативностью, чем Германия.

Подведём итоги:

Анализ международных футбольных матчей за период с 1950 по 2020 год позволяет проследить как количественные, так и качественные изменения в мировом футболе:

  • Домашнее преимущество остаётся устойчивым фактором — почти половина матчей завершается победой хозяев.

  • Средняя результативность снижается, особенно после 1980-х годов, что связано с возросшим уровнем тактической подготовки и акцентом на оборонительную игру.

  • Структура турниров изменилась: доля товарищеских игр упала, а число официальных матчей — особенно чемпионатов мира и континентальных турниров — заметно увеличилось.

  • Независимо от континента, наблюдается общая тенденция к снижению среднего количества голов, особенно ярко выраженная в Африке и Азии.

  • Среди сборных Бразилия доминирует и по числу голов, и по числу побед, но высокая результативность не всегда означает высокую эффективность — команды, как Германия, демонстрируют отличное соотношение голов за матч.

Таким образом, международный футбол стал более структурированным, тактически насыщенным и соревновательным, а успех команд всё чаще определяется не только атакующим потенциалом, но и способностью адаптироваться к меняющимся форматам и стилям игры.