Neste desafio, pede-se a utilizão de dados da La Liga 2024/2025 para criar visualizações valiosas e analisar os resultados. Os dados serão recolhidos através do pacote ‘worldfootballR’, fazendo scraping dos dados públicos do FBref
# Instalamos os packages do worldfootballR e o tidyverse e carregar as respectivas libraries
tidyverse_packages <- c("worldfootballR", "tidyverse", "ggplot2", "ggrepel")
install.packages(setdiff(tidyverse_packages, rownames(installed.packages())))
library(worldfootballR)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(ggrepel)
# Importamos os dados das equipas da La Liga 2024/2025
la_liga_2425 <- fb_season_team_stats(
country = "ESP",
gender = "M",
season_end_year = "2025",
tier = "1st",
stat_type = "standard"
)
# Criamos um backup, para o caso de querermos reverter transformações feitas
la_liga_2425_backup <- la_liga_2425
# Algumas análises exploratórias para confirmar o scraping correto do dataset
# e para familiarizar com os headers das colunas
head(la_liga_2425)
## Competition_Name Gender Country Season_End_Year Squad
## 1 La Liga M ESP 2025 Alavés
## 2 La Liga M ESP 2025 Athletic Club
## 3 La Liga M ESP 2025 Atlético Madrid
## 4 La Liga M ESP 2025 Barcelona
## 5 La Liga M ESP 2025 Betis
## 6 La Liga M ESP 2025 Celta Vigo
## Team_or_Opponent Num_Players Age Poss MP_Playing_Time Starts_Playing_Time
## 1 team 25 27.1 43.8 20 220
## 2 team 28 27.4 47.4 20 220
## 3 team 24 29.1 52.7 20 220
## 4 team 26 25.0 66.8 20 220
## 5 team 30 27.8 51.1 20 220
## 6 team 29 27.6 53.4 20 220
## Min_Playing_Time Mins_Per_90_Playing_Time Gls Ast G_plus_A G_minus_PK PK
## 1 1800 20 24 12 36 20 4
## 2 1800 20 31 25 56 30 1
## 3 1800 20 34 28 62 33 1
## 4 1800 20 52 37 89 49 3
## 5 1800 20 20 13 33 17 3
## 6 1800 20 28 19 47 26 2
## PKatt CrdY CrdR xG_Expected npxG_Expected xAG_Expected npxG_plus_xAG_Expected
## 1 5 54 2 22.2 18.2 12.6 30.8
## 2 3 39 3 27.5 25.1 20.0 45.1
## 3 2 44 1 34.5 33.0 27.0 59.9
## 4 4 35 2 49.8 46.7 39.0 85.7
## 5 4 44 3 29.2 26.2 20.7 46.9
## 6 3 47 5 28.4 26.0 21.4 47.4
## PrgC_Progression PrgP_Progression Gls_Per_Minutes Ast_Per_Minutes
## 1 250 607 1.20 0.60
## 2 359 829 1.55 1.25
## 3 389 840 1.70 1.40
## 4 447 1147 2.60 1.85
## 5 315 764 1.00 0.65
## 6 375 817 1.40 0.95
## G_plus_A_Per_Minutes G_minus_PK_Per_Minutes G_plus_A_minus_PK_Per_Minutes
## 1 1.80 1.00 1.60
## 2 2.80 1.50 2.75
## 3 3.10 1.65 3.05
## 4 4.45 2.45 4.30
## 5 1.65 0.85 1.50
## 6 2.35 1.30 2.25
## xG_Per_Minutes xAG_Per_Minutes xG_plus_xAG_Per_Minutes npxG_Per_Minutes
## 1 1.11 0.63 1.74 0.91
## 2 1.38 1.00 2.38 1.26
## 3 1.72 1.35 3.07 1.65
## 4 2.49 1.95 4.44 2.33
## 5 1.46 1.03 2.49 1.31
## 6 1.42 1.07 2.49 1.30
## npxG_plus_xAG_Per_Minutes
## 1 1.54
## 2 2.26
## 3 3.00
## 4 4.28
## 5 2.34
## 6 2.37
summary(la_liga_2425)
## Competition_Name Gender Country Season_End_Year
## Length:40 Length:40 Length:40 Min. :2025
## Class :character Class :character Class :character 1st Qu.:2025
## Mode :character Mode :character Mode :character Median :2025
## Mean :2025
## 3rd Qu.:2025
## Max. :2025
## Squad Team_or_Opponent Num_Players Age
## Length:40 Length:40 Min. :23.00 Min. :25.00
## Class :character Class :character 1st Qu.:25.00 1st Qu.:27.27
## Mode :character Mode :character Median :26.00 Median :27.40
## Mean :26.40 Mean :27.38
## 3rd Qu.:27.25 3rd Qu.:27.65
## Max. :31.00 Max. :29.60
## Poss MP_Playing_Time Starts_Playing_Time Min_Playing_Time
## Min. :33.30 Min. :20 Min. :220 Min. :1800
## 1st Qu.:45.98 1st Qu.:20 1st Qu.:220 1st Qu.:1800
## Median :50.05 Median :20 Median :220 Median :1800
## Mean :50.02 Mean :20 Mean :220 Mean :1800
## 3rd Qu.:54.10 3rd Qu.:20 3rd Qu.:220 3rd Qu.:1800
## Max. :66.80 Max. :20 Max. :220 Max. :1800
## Mins_Per_90_Playing_Time Gls Ast G_plus_A
## Min. :20 Min. :11.00 Min. : 6.00 Min. :21.00
## 1st Qu.:20 1st Qu.:19.00 1st Qu.:12.75 1st Qu.:33.00
## Median :20 Median :24.50 Median :17.00 Median :40.50
## Mean :20 Mean :25.15 Mean :17.85 Mean :43.00
## 3rd Qu.:20 3rd Qu.:30.00 3rd Qu.:21.75 3rd Qu.:51.25
## Max. :20 Max. :52.00 Max. :37.00 Max. :89.00
## G_minus_PK PK PKatt CrdY CrdR
## Min. :10.0 Min. :0.00 Min. :0.00 Min. :29.00 Min. :0.0
## 1st Qu.:17.0 1st Qu.:1.00 1st Qu.:2.00 1st Qu.:43.00 1st Qu.:1.0
## Median :21.5 Median :3.00 Median :3.00 Median :47.00 Median :2.0
## Mean :22.6 Mean :2.55 Mean :3.25 Mean :47.85 Mean :2.1
## 3rd Qu.:27.0 3rd Qu.:4.00 3rd Qu.:4.00 3rd Qu.:55.00 3rd Qu.:3.0
## Max. :49.0 Max. :7.00 Max. :9.00 Max. :64.00 Max. :6.0
## xG_Expected npxG_Expected xAG_Expected npxG_plus_xAG_Expected
## Min. :15.40 Min. :13.00 Min. :10.00 Min. :23.00
## 1st Qu.:20.73 1st Qu.:18.15 1st Qu.:14.28 1st Qu.:32.10
## Median :23.70 Median :21.40 Median :17.70 Median :38.90
## Mean :25.51 Mean :23.00 Mean :18.40 Mean :41.38
## 3rd Qu.:28.57 3rd Qu.:26.05 3rd Qu.:20.88 3rd Qu.:47.02
## Max. :49.80 Max. :46.70 Max. :39.00 Max. :85.70
## PrgC_Progression PrgP_Progression Gls_Per_Minutes Ast_Per_Minutes
## Min. :213.0 Min. : 427.0 Min. :0.550 Min. :0.3000
## 1st Qu.:270.8 1st Qu.: 620.8 1st Qu.:0.950 1st Qu.:0.6375
## Median :317.0 Median : 710.5 Median :1.225 Median :0.8500
## Mean :321.8 Mean : 727.8 Mean :1.258 Mean :0.8925
## 3rd Qu.:365.2 3rd Qu.: 819.0 3rd Qu.:1.500 3rd Qu.:1.0875
## Max. :486.0 Max. :1147.0 Max. :2.600 Max. :1.8500
## G_plus_A_Per_Minutes G_minus_PK_Per_Minutes G_plus_A_minus_PK_Per_Minutes
## Min. :1.050 Min. :0.500 Min. :0.850
## 1st Qu.:1.650 1st Qu.:0.850 1st Qu.:1.500
## Median :2.025 Median :1.075 Median :1.900
## Mean :2.150 Mean :1.130 Mean :2.022
## 3rd Qu.:2.562 3rd Qu.:1.350 3rd Qu.:2.438
## Max. :4.450 Max. :2.450 Max. :4.300
## xG_Per_Minutes xAG_Per_Minutes xG_plus_xAG_Per_Minutes npxG_Per_Minutes
## Min. :0.770 Min. :0.500 Min. :1.270 Min. :0.6500
## 1st Qu.:1.038 1st Qu.:0.710 1st Qu.:1.730 1st Qu.:0.9075
## Median :1.185 Median :0.885 Median :2.045 Median :1.0650
## Mean :1.275 Mean :0.920 Mean :2.195 Mean :1.1493
## 3rd Qu.:1.427 3rd Qu.:1.040 3rd Qu.:2.490 3rd Qu.:1.3025
## Max. :2.490 Max. :1.950 Max. :4.440 Max. :2.3300
## npxG_plus_xAG_Per_Minutes
## Min. :1.150
## 1st Qu.:1.603
## Median :1.945
## Mean :2.070
## 3rd Qu.:2.348
## Max. :4.280
str(la_liga_2425)
## 'data.frame': 40 obs. of 37 variables:
## $ Competition_Name : chr "La Liga" "La Liga" "La Liga" "La Liga" ...
## $ Gender : chr "M" "M" "M" "M" ...
## $ Country : chr "ESP" "ESP" "ESP" "ESP" ...
## $ Season_End_Year : int 2025 2025 2025 2025 2025 2025 2025 2025 2025 2025 ...
## $ Squad : chr "Alavés" "Athletic Club" "Atlético Madrid" "Barcelona" ...
## $ Team_or_Opponent : chr "team" "team" "team" "team" ...
## $ Num_Players : num 25 28 24 26 30 29 25 27 27 27 ...
## $ Age : num 27.1 27.4 29.1 25 27.8 27.6 26 27.8 27.8 27.8 ...
## $ Poss : num 43.8 47.4 52.7 66.8 51.1 53.4 40.8 43.2 58.8 52 ...
## $ MP_Playing_Time : num 20 20 20 20 20 20 20 20 20 20 ...
## $ Starts_Playing_Time : num 220 220 220 220 220 220 220 220 220 220 ...
## $ Min_Playing_Time : num 1800 1800 1800 1800 1800 1800 1800 1800 1800 1800 ...
## $ Mins_Per_90_Playing_Time : num 20 20 20 20 20 20 20 20 20 20 ...
## $ Gls : num 24 31 34 52 20 28 18 14 27 23 ...
## $ Ast : num 12 25 28 37 13 19 15 7 19 17 ...
## $ G_plus_A : num 36 56 62 89 33 47 33 21 46 40 ...
## $ G_minus_PK : num 20 30 33 49 17 26 17 10 24 22 ...
## $ PK : num 4 1 1 3 3 2 1 4 3 1 ...
## $ PKatt : num 5 3 2 4 4 3 1 4 3 2 ...
## $ CrdY : num 54 39 44 35 44 47 53 57 47 55 ...
## $ CrdR : num 2 3 1 2 3 5 0 1 1 1 ...
## $ xG_Expected : num 22.2 27.5 34.5 49.8 29.2 28.4 17.3 18.8 25.2 19.6 ...
## $ npxG_Expected : num 18.2 25.1 33 46.7 26.2 26 16.5 15.7 23 18 ...
## $ xAG_Expected : num 12.6 20 27 39 20.7 21.4 13.2 11.5 18.8 14.5 ...
## $ npxG_plus_xAG_Expected : num 30.8 45.1 59.9 85.7 46.9 47.4 29.7 27.2 41.7 32.5 ...
## $ PrgC_Progression : num 250 359 389 447 315 375 265 225 407 267 ...
## $ PrgP_Progression : num 607 829 840 1147 764 ...
## $ Gls_Per_Minutes : num 1.2 1.55 1.7 2.6 1 1.4 0.9 0.7 1.35 1.15 ...
## $ Ast_Per_Minutes : num 0.6 1.25 1.4 1.85 0.65 0.95 0.75 0.35 0.95 0.85 ...
## $ G_plus_A_Per_Minutes : num 1.8 2.8 3.1 4.45 1.65 2.35 1.65 1.05 2.3 2 ...
## $ G_minus_PK_Per_Minutes : num 1 1.5 1.65 2.45 0.85 1.3 0.85 0.5 1.2 1.1 ...
## $ G_plus_A_minus_PK_Per_Minutes: num 1.6 2.75 3.05 4.3 1.5 2.25 1.6 0.85 2.15 1.95 ...
## $ xG_Per_Minutes : num 1.11 1.38 1.72 2.49 1.46 1.42 0.86 0.94 1.26 0.98 ...
## $ xAG_Per_Minutes : num 0.63 1 1.35 1.95 1.03 1.07 0.66 0.57 0.94 0.72 ...
## $ xG_plus_xAG_Per_Minutes : num 1.74 2.38 3.07 4.44 2.49 2.49 1.52 1.51 2.2 1.7 ...
## $ npxG_Per_Minutes : num 0.91 1.26 1.65 2.33 1.31 1.3 0.82 0.78 1.15 0.9 ...
## $ npxG_plus_xAG_Per_Minutes : num 1.54 2.26 3 4.28 2.34 2.37 1.49 1.36 2.09 1.62 ...
colnames(la_liga_2425)
## [1] "Competition_Name" "Gender"
## [3] "Country" "Season_End_Year"
## [5] "Squad" "Team_or_Opponent"
## [7] "Num_Players" "Age"
## [9] "Poss" "MP_Playing_Time"
## [11] "Starts_Playing_Time" "Min_Playing_Time"
## [13] "Mins_Per_90_Playing_Time" "Gls"
## [15] "Ast" "G_plus_A"
## [17] "G_minus_PK" "PK"
## [19] "PKatt" "CrdY"
## [21] "CrdR" "xG_Expected"
## [23] "npxG_Expected" "xAG_Expected"
## [25] "npxG_plus_xAG_Expected" "PrgC_Progression"
## [27] "PrgP_Progression" "Gls_Per_Minutes"
## [29] "Ast_Per_Minutes" "G_plus_A_Per_Minutes"
## [31] "G_minus_PK_Per_Minutes" "G_plus_A_minus_PK_Per_Minutes"
## [33] "xG_Per_Minutes" "xAG_Per_Minutes"
## [35] "xG_plus_xAG_Per_Minutes" "npxG_Per_Minutes"
## [37] "npxG_plus_xAG_Per_Minutes"
# O dataset contém linhas com golos marcados "vs..." outra equipa. Excluímos esses resultados.
la_liga_2425 <- la_liga_2425 %>%
filter(Team_or_Opponent == "team")
# Garantimos que as colunas que queremos trabalhar estão com os datatypes correctos
la_liga_2425$Gls <- as.numeric(la_liga_2425$Gls)
la_liga_2425$Squad <- as.factor(la_liga_2425$Squad)
la_liga_2425$xG_Expected <- as.numeric(la_liga_2425$xG_Expected)
la_liga_2425$CrdY <- as.numeric(la_liga_2425$CrdY)
la_liga_2425$CrdR <- as.numeric(la_liga_2425$CrdR)
la_liga_2425$Gls_Per_Minutes <- as.numeric(la_liga_2425$Gls_Per_Minutes)
# o argumento "fig.align='center'" irá centrar o gráfico na folha
# Gráfico de Barras: Número de Golos por Clube (ordem decrescente)
golos_por_clube <- la_liga_2425 %>%
group_by(Squad) %>%
summarise(Total_Golos = sum(Gls, na.rm = TRUE)) %>%
arrange(desc(Total_Golos))
golos_por_clube
## # A tibble: 20 × 2
## Squad Total_Golos
## <fct> <dbl>
## 1 Barcelona 52
## 2 Real Madrid 47
## 3 Villarreal 36
## 4 Atlético Madrid 34
## 5 Athletic Club 31
## 6 Celta Vigo 28
## 7 Girona 27
## 8 Alavés 24
## 9 Las Palmas 23
## 10 Osasuna 22
## 11 Rayo Vallecano 21
## 12 Betis 20
## 13 Sevilla 20
## 14 Leganés 19
## 15 Valencia 19
## 16 Espanyol 18
## 17 Mallorca 18
## 18 Real Sociedad 16
## 19 Getafe 14
## 20 Valladolid 14
#Tendo em conta que os valores na tabela original já são os somatórios, podemos não executar este passo nos próximos processos.
# Criamos o gráfico de barras - buscar os dados e ordenar por ordem decrescente
total_golos_barras <- ggplot(data = golos_por_clube, aes(x = reorder(Squad, Total_Golos, decreasing = TRUE), y = Total_Golos, fill = Squad)) +
geom_bar(stat = "identity", width = 0.7, colour = "black") +
geom_text(aes(label = Total_Golos), size = 4, vjust = -0.5, colour = "black") +
labs(
title = "Total de Golos Marcados por Equipa",
subtitle = "La Liga 2024/2025",
x = "Equipas",
y = "Golos"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
plot.subtitle = element_text(hjust = 0.5, size = 12, face = "italic", colour = "gray"),
axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1.2),
legend.position = "none"
)
total_golos_barras
ggsave(filename = "goals_by_team.png", plot = total_golos_barras)
## Saving 7 x 5 in image
Sem muitas surpresas, o Barcelona e o Real Madrid estão no topo da lista com 52 e 47 golos marcados, respectivamente. Nenhum outro clube ultrapassou até agora a barreira dos 35 golos marcados, mostrando também a alta capacidade ofensiva do Barcelona e Real Madrid. No outro lado da tabela, temos o Getafe e o Valladolid com apenas 14 golos marcados até ao momento.
# Gráfico de Dispersão: Golos Reais vs Golos Esperados
golos_vs_xg <- la_liga_2425 %>%
group_by(Squad) %>%
summarise(
Total_Golos = sum(Gls, na.rm = TRUE),
Total_xG = sum(xG_Expected, na.rm = TRUE)
) %>%
arrange(desc(Total_Golos))
media_golos_la_liga <- mean(la_liga_2425$Gls)
media_xG_la_liga <- mean(la_liga_2425$xG_Expected)
golos_vs_xg_scatter <- ggplot(data = golos_vs_xg, aes(x = Total_Golos, y = Total_xG, label = Squad)) +
geom_point(aes(colour = ifelse(Total_Golos > media_golos_la_liga & Total_xG > media_xG_la_liga, "Alto Aproveitamento",
ifelse(Total_Golos < media_golos_la_liga & Total_xG < media_xG_la_liga, "Baixo Aproveitamento",
ifelse(Total_Golos > media_golos_la_liga, "Alta Finalização", "Alta Criação")))),
size = 4) +
geom_label_repel(box.padding = 1, label.padding = 0.1, max.overlaps = 20, size = 3) +
geom_hline(yintercept = media_xG_la_liga, colour = "red", linetype = "dashed", linewidth = 1) +
geom_vline(xintercept = media_golos_la_liga, colour = "red", linetype = "dashed", linewidth = 1) +
labs(
title = "Golos vs Golos Esperados (xG)",
subtitle = "La Liga 2024/2025",
x = "Total de Golos",
y = "Total xG",
colour = "Classificação"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
plot.subtitle = element_text(hjust = 0.5, size = 12, face = "italic", colour = "gray"),
axis.title = element_text(size = 12),
axis.text = element_text(size = 10),
legend.position = "bottom"
)
golos_vs_xg_scatter
ggsave(filename = "xg_vs_goals.png", plot = golos_vs_xg_scatter)
## Saving 7 x 5 in image
Aqui conseguimos ver como se distribuem as equipas no que toca ao seu aproveitamento. Separadas por 4 quadrantes, conseguimos perceber quais as que têm maior ou menor aproveitamento, face ao xG, bem como as que criam muitas oportunidades mas marcam pouco e as equipas que marcam muitos golos apesar do baixo xG. Temos então o Barcelona como uma equipa que se enquadra no quadrante de Alto Aproveitamento - o total de golos e xG são superiores à média da liga. Novamente, Getafe e Valladolid aparecem no grupo do baixo aproveitamento - tanto o total de golos como o total de xG são inferiores à média da liga. Destaca-se ainda o Betis como uma equipa que cria muitas oportunidades mas concretiza poucas - o total de xG é superior à média, mas o seu total de golos é inferior. Por outro lado, o Girona é uma equipa muito finalizadora. Apesar de ter um xG abaixo da média, o seu total de golos é superior à média da liga.
# Gráfico de Média de Golos por Jogo
data_golos <- la_liga_2425
media_golos_por_jogo <- round(mean(data_golos$Gls_Per_Minutes), 2)
golos_por_jogo_barras <- ggplot(data = data_golos, aes(x = reorder(Squad, Gls_Per_Minutes, increasing = TRUE), y = Gls_Per_Minutes, fill = Squad)) +
geom_bar(stat = "identity", width = 0.7, colour = "black") +
geom_text(aes(label = Gls_Per_Minutes), size = 4, hjust = -0.2, colour = "black") +
coord_flip() +
geom_hline(yintercept = media_golos_por_jogo, colour = "red", linetype = "dashed", linewidth = 1) +
annotate("text", x = 2, y = 1.8, label = "Média da La Liga: 1.25 Golos por Jogo", colour = "red", size = 4) +
labs(
title = "Média de Golos por Jogo, por Equipa",
subtitle = "La Liga 2024/2025",
x = "Equipa",
y = "Média de Golos"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
plot.subtitle = element_text(hjust = 0.5, size = 12, face = "italic", colour = "gray"),
axis.title = element_text(size = 12),
axis.text = element_text(size = 10),
legend.position = "none"
)
golos_por_jogo_barras
ggsave(filename = "average_goals_per_game.png", plot = golos_por_jogo_barras)
## Saving 7 x 5 in image
Com este gráfico conseguimos perceber que há 7 equipas acima da média da liga (1.25) no que toca a golos marcados - as restantes 13 ficam abaixo, apesar do Girona estar bem perto da média com (1.2). O Barcelona e o Real Madrid são as únicas equipas que apresentam uma média superior a 2 golos marcados por jogo (2.6 e 2.35, respectivamente). 7 equipas, no entanto, têm média inferior a 1 golo por jogo - destacando-se o Valladolid e o Getafe que têm a pior média de todas as equipas (0.7)
# Gráfico de Relação entre Cartões Amarelos e Vermelhos
cartoes_relacao <- ggplot(data = la_liga_2425, aes(x = CrdY, y = CrdR)) +
# Adicionamos os pontos de dados ao gráfico
geom_point(color = "salmon", size = 4) +
# Transformamos num gráfico de relação
geom_smooth(method = "lm", color = "skyblue", se = FALSE) +
# Adicionamos as labels para facilmente percerbermos as equipas representadas
geom_label_repel(aes(label = Squad),box.padding = 1, label.padding = 0.1, max.overlaps = 20, size = 3) +
# Adicionamos títulos
labs(
title = "Relação entre Cartões Amarelos e Cartões Vermelhos",
subtitle = "La Liga 2024/2025",
x = "Cartões Amarelos",
y = "Cartões Vermelhos"
) +
# Finalizamos com o tema
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 16, face ="bold"),
plot.subtitle = element_text(hjust = 0.5, size = 12, face = "italic", colour = "gray"),
axis.title = element_text(size = 12)
)
cartoes_relacao
## `geom_smooth()` using formula = 'y ~ x'
ggsave(filename = "yellow_vs_red_cards.png", plot = cartoes_relacao)
## Saving 7 x 5 in image
## `geom_smooth()` using formula = 'y ~ x'
Analisando este último gráfico, a linha de tendencia da regressão linear apresenta uma leve correlação negativa, ou seja,à medida que o eixo do x aumenta, o eixo do y tende a diminuir ligeiramente. Ainda assim, vendo que os pontos estão bastante dispersos desta linha de regressão linear, isto indica-nos que a correlação é praticamente inexistente, logo, uma equipa que tenha mais cartões amarelos, não significa necessáriamente que tenha mais cartões vermelhos - o que até pode ser contra-intuitivo face ao instinto natural de assumir que mais cartões amarelos levam a mais cartões vermelhos! Ainda assim, podemos observar que o Real Madrid recebeu o mesmo número de cartões vermelhos (2) que o Valladolid apesar de ter acumulado muitos menos cartões amarelos - podemos considerar, portanto, que é uma equipa mais agressiva. Por outro lado, vemos o Espanyol que acumulou mais de 50 cartões amarelos sem no entanto lhe ser exibido qualquer cartão vermelho.