Introdução

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

Instalação e Carregamento de Pacotes

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

Importação dos Dados

# 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

Análise Exploratória Inicial

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


Tarefa 1: Gráfico de Barras - Número de Golos por Clube

# 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

Análise

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.


Tarefa 2: Gráfico de Dispersão - Golos Reais vs Golos Esperados

# 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

Análise

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.


Tarefa 3: Gráfico de Média de Golos por Jogo

# 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

Análise

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)


Tarefa 4: Relação entre Cartões Amarelos e Vermelhos

# 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'

Análise

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.