Introdução Link para o cabeçalho

Meu intuito nesta análise é verificar qual a idade em que jogadores de futebol atingem seu maior preço. Com isso, pretendo analisar qual seria a melhor idade para vender um jogador

Uma limitação do meu método é não conseguir avaliar se um jogador no seu auge deveria ser vendido. Como não possuo informações a respeito do seu desempenho em campo, este tipo de análise não pode ser feito com os dados que possuo.

Aliás, os dados foram obtidos a partir do Kaggle: Football Data from Transfermarkt.

Preparação dos Dados Link para o cabeçalho

O conjunto de dados original possui 10 arquivos. Nesta análise usarei apenas dois, chamados players.csv e player_valuations.csv.

players <- 
  read_csv("dados/players.csv") |> 
  clean_names()
## Rows: 31573 Columns: 23
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (15): first_name, last_name, name, player_code, country_of_birth, city_...
## dbl   (6): player_id, last_season, current_club_id, height_in_cm, market_val...
## dttm  (1): contract_expiration_date
## date  (1): date_of_birth
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
player_valuations <- 
  read_csv("dados/player_valuations.csv") |> 
  clean_names()
## Rows: 478189 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (1): player_club_domestic_competition_id
## dbl  (3): player_id, market_value_in_eur, current_club_id
## date (1): date
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Como ambos possuem a coluna player_id, com um número único para cada jogador, é possível juntá-los:

dados <- 
  players |> 
  left_join(player_valuations, by = "player_id")

dim(dados)
## [1] 479699     27

São dim(dados)[1] jogadores diferentes presentes no conjunto de dados. Não sei afirmar se todos os jogadores profissionais do mundo estão lá, mas ao menos os principais estão diponíveis. Por exemplo, esta é a evolução do valor de mercado do Neymar:

dados |> 
  filter(grepl("Neymar", name)) |> 
  ggplot(aes(x = date, y = market_value_in_eur.y)) + 
  geom_line() + 
  scale_y_continuous(labels = comma) + 
  labs(x = "Data", y = "Valor de Mercado (Euros)")

Abaixo a comparação entre Neymar, Messi e Mbappé:

dados |> 
  filter(grepl("Neymar|Messi$|Mbappé", name)) |> 
  filter(!grepl("Ethan", name)) |> 
  ggplot(aes(x = date, y = market_value_in_eur.y, group = name, colour = name)) + 
  geom_line() + 
  scale_y_continuous(labels = comma) + 
  labs(x = "Data", y = "Valor de Mercado (Euros)") + 
  scale_colour_viridis_d()

Note como é possível perceber a ascenção e queda dos valores de mercado de Messi e Meymar, enquanto o valor de mercado de Mbappé permanece bastante próximo ao máximo atingido.

Com isso feito, agora vem as perguntas:

  1. Como encontrar a idade em que os jogadores atingem o seu valor de mercado máximo?
  2. Existem diferenças entre países, isto é, jogadores de países europeus tendem a atingir o seu pico de valor de mercado em uma idade diferente dos sulamericanos?

É o que iremos responder a seguir.

Idade de maior valor de mercado Link para o cabeçalho

Para encontrar a idade na qual cada jogador atingiu seu maior valor de mercado, eu encontrei a primeira e última datas em que cada jogador atingiu este valor. Com esta informação, eu descobri as idades que cada jogador tinha nestas duas datas e fiz a média aritmética entre elas.

dados_idade <-
  dados |> 
  select(player_id, name, country_of_birth, date_of_birth, date, market_value_in_eur = market_value_in_eur.y, highest_market_value_in_eur) |> 
  filter(market_value_in_eur == highest_market_value_in_eur) |> 
  group_by(player_id) |> 
  filter((date == max(date, na.rm = TRUE))|date == min(date, na.rm = TRUE)) |> 
  mutate(idade = date-date_of_birth) |> 
  mutate(idade_media = as.numeric(mean(idade, na.rm = TRUE))/365) |> 
  drop_na(idade_media) |> 
  drop_na(country_of_birth) |> 
  filter((date == max(date))) |> 
  ungroup()

O resultado obtido é este:

dados_idade |> 
  summarise(media = mean(idade_media))
## # A tibble: 1 × 1
##   media
##   <dbl>
## 1  24.3

Ou seja, a idade média em que os jogadores atingiram seu valor máximo de mercado é 24.3 anos. Ou seja, isso ocorre com eles bem jovens. Abaixo vemos a distribuição destas idades:

ggplot(dados_idade, aes(x = idade_media)) + 
  geom_histogram(binwidth = 1, boundary = 0, closed = "left", colour = "white") + 
  labs(x = "Idade Média ao Atingor Valor Máximo de Mercado", y = "Frequência") + 
  scale_x_continuous(breaks = seq(0, 50, 5))

Diferenças entre países Link para o cabeçalho

Se realizarmos esta análise por país, os países com maiores e menores idades médias em que seus jogadores atingem a valorização máxima são, respectivamente,

dados_idade |> 
  group_by(country_of_birth) |> 
  summarise(media = mean(idade_media)) |> 
  arrange(desc(media))
## # A tibble: 184 × 2
##    country_of_birth   media
##    <chr>              <dbl>
##  1 India               32.6
##  2 Oman                30.6
##  3 Neukaledonien       30.4
##  4 Tahiti              29.7
##  5 Libya               28.7
##  6 Malta               28.4
##  7 Dominica            28.4
##  8 Guatemala           27.3
##  9 Jordan              27  
## 10 East Germany (GDR)  26.9
## # ℹ 174 more rows

e

dados_idade |> 
  group_by(country_of_birth) |> 
  summarise(media = mean(idade_media)) |> 
  arrange(media)
## # A tibble: 184 × 2
##    country_of_birth      media
##    <chr>                 <dbl>
##  1 Serbia and Montenegro  19.3
##  2 Korea, North           19.6
##  3 Guernsey               20.3
##  4 DR Congo               20.9
##  5 Sudan                  21.1
##  6 Sao Tome and Principe  21.2
##  7 Curacao                21.3
##  8 Liechtenstein          21.3
##  9 Somalia                21.6
## 10 Türkiye                22.0
## # ℹ 174 more rows

Como há muitos países com pouca tradição no futebol, vou manter na análise apenas aqueles que já disputaram alguma semi-final de Copa do Mundo:

dados_idade |> 
  filter(country_of_birth %in% c("Brazil", "Germany", "Italy", "Argentina", "France", "Uruguay", "England", "Spain", "Netherlands", "Hungary", "Czech Republic", "Sweden", "Croatia", "Poland", "Austria", "Portugal", "Belgium", "United States", "Chile", "Turkey", "Serbia", "Russia", "Bulgaria", "South Korea", "Morocco")) |> 
  group_by(country_of_birth) |> 
  summarise(media = mean(idade_media)) |> 
  arrange(media) |> 
  print(n = Inf)
## # A tibble: 23 × 2
##    country_of_birth media
##    <chr>            <dbl>
##  1 Turkey            22.8
##  2 Russia            22.9
##  3 Italy             23.3
##  4 Belgium           23.5
##  5 Netherlands       23.6
##  6 Croatia           23.9
##  7 Czech Republic    24.0
##  8 Germany           24.1
##  9 United States     24.2
## 10 France            24.4
## 11 England           24.4
## 12 Portugal          24.4
## 13 Sweden            24.6
## 14 Poland            24.7
## 15 Hungary           24.7
## 16 Spain             24.8
## 17 Morocco           24.8
## 18 Uruguay           24.9
## 19 Austria           25.0
## 20 Brazil            25.3
## 21 Argentina         25.5
## 22 Bulgaria          25.6
## 23 Chile             25.6

Aparentemente, os jogadores dos principais países sul-americanos atingem seus valores de mercado máximos depois dos europeus.