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)Анализ международных футбольных матчей
Введение
Футбол как вид спорта претерпел значительные изменения с момента проведения первого официального международного матча в 1872 году между Шотландией и Англией. Этот анализ охватывает более чем 150-летнюю историю международных футбольных соревнований, позволяя проследить эволюцию игры, выявить доминирующие команды и обнаружить интересные статистические закономерности.
Цель проекта:
Провести комплексный анализ эволюции международного футбола за 70 лет, выявив ключевые тенденции в результативности, тактических подходах и региональных особенностях, чтобы понять динамику развития этого вида спорта.
Задачи проекта:
Загрузить и предобработать данные: привести данные к удобному формату для анализа.
Провести анализ данных: рассчитать базовые статистики и выполнить агрегацию по ключевым показателям.
Визуализировать данные: построить графики, помогающие выявить тенденции и особенности в данных.
Оформить результаты: представить анализ в виде веб-страницы.
Методы исследования:
Описательная статистика, тренд-анализ, сравнительный анализ по группам, визуальная аналитика (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 - Тип турнира
Глава 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-х годов, что связано с возросшим уровнем тактической подготовки и акцентом на оборонительную игру.
Структура турниров изменилась: доля товарищеских игр упала, а число официальных матчей — особенно чемпионатов мира и континентальных турниров — заметно увеличилось.
Независимо от континента, наблюдается общая тенденция к снижению среднего количества голов, особенно ярко выраженная в Африке и Азии.
Среди сборных Бразилия доминирует и по числу голов, и по числу побед, но высокая результативность не всегда означает высокую эффективность — команды, как Германия, демонстрируют отличное соотношение голов за матч.
Таким образом, международный футбол стал более структурированным, тактически насыщенным и соревновательным, а успех команд всё чаще определяется не только атакующим потенциалом, но и способностью адаптироваться к меняющимся форматам и стилям игры.