OBJECTIVE

Gather data for football analysis regarding Manchester United. The time scope included is starting since the season after SAF retired up until most recent (When this code is written == 2022/2023).

Preparation

library(worldfootballR) # fetch data
library(tidyverse) # processing data
library(DBI) # connecting to database driver
library(RPostgres) # driver to connect to postgre
library(jsonlite) # organize json file

Identify Necessary data

Sir Alex Ferguson retired in 2012/2013 season, so let’s collect 2013/2014 until most recently completed season. I will compare the aggregate data of how Man Utd perform vs the aggregate data of how the rest of big 5 leagues team perform. The data necessary will be: - Big 5 leagues team standard stats (2013/2014 - 2022/2023) - Big 5 leagues player standard stats (2013/2014 - 2022/2023) - Man Utd premier league team standard stats (2013/2014 - 2022/2023) - Man Utd premier league player standard stats (2013/2014 - 2022/2023) I will try to profile the pros and cons of each Man Utd managers after SAF. The data necessary will be: - Man Utd managers data history. - Premier League Regular Season stats.

Load data

Team Data

big5_team_2014_2023 <- 
  
  fb_big5_advanced_season_stats(
    season_end_year = c(2014:2023),
    stat_type = "standard",
    team_or_player = "team"
  )
manu_2014_2023 <-
  big5_team_2014_2023 %>% 
  filter(Squad == "Manchester Utd", Team_or_Opponent == "team")

Player Data

big5_player_2014_2023 <-
  
  fb_big5_advanced_season_stats(
    season_end_year = c(2014:2023),
    stat_type = "standard",
    team_or_player = "player"
  )
manu_players_2014_2023 <-
  big5_player_2014_2023 %>% 
  filter(Squad == "Manchester Utd")

Manager Data

team_urls <- tm_league_team_urls(country_name = "England",start_year = 2023)
manu_url <- team_urls[5]
manu_url
## [1] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2023"
manu_managers <- tm_team_staff_history(team_urls = manu_url,staff_role = "Manager")

Even though the team url is for 2023 only, the staff history includes previous seasons as well.

Transfer Data

Prepare a premier league team url for the seasons we need.

start_years <- 2014:2022
country <- "England"

prem_team_since_2014 <- 
  map(
    start_years, 
    ~ 
    tm_league_team_urls(
      start_year = .x,
      country_name = country)
  )

Check the resulting list.

prem_team_since_2014 %>% head(n = 3)
## [[1]]
##  [1] "https://www.transfermarkt.com/fc-chelsea/startseite/verein/631/saison_id/2014"          
##  [2] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2014"   
##  [3] "https://www.transfermarkt.com/manchester-city/startseite/verein/281/saison_id/2014"     
##  [4] "https://www.transfermarkt.com/fc-arsenal/startseite/verein/11/saison_id/2014"           
##  [5] "https://www.transfermarkt.com/fc-liverpool/startseite/verein/31/saison_id/2014"         
##  [6] "https://www.transfermarkt.com/tottenham-hotspur/startseite/verein/148/saison_id/2014"   
##  [7] "https://www.transfermarkt.com/fc-southampton/startseite/verein/180/saison_id/2014"      
##  [8] "https://www.transfermarkt.com/fc-everton/startseite/verein/29/saison_id/2014"           
##  [9] "https://www.transfermarkt.com/newcastle-united/startseite/verein/762/saison_id/2014"    
## [10] "https://www.transfermarkt.com/west-ham-united/startseite/verein/379/saison_id/2014"     
## [11] "https://www.transfermarkt.com/swansea-city/startseite/verein/2288/saison_id/2014"       
## [12] "https://www.transfermarkt.com/hull-city/startseite/verein/3008/saison_id/2014"          
## [13] "https://www.transfermarkt.com/aston-villa/startseite/verein/405/saison_id/2014"         
## [14] "https://www.transfermarkt.com/queens-park-rangers/startseite/verein/1039/saison_id/2014"
## [15] "https://www.transfermarkt.com/stoke-city/startseite/verein/512/saison_id/2014"          
## [16] "https://www.transfermarkt.com/crystal-palace/startseite/verein/873/saison_id/2014"      
## [17] "https://www.transfermarkt.com/west-bromwich-albion/startseite/verein/984/saison_id/2014"
## [18] "https://www.transfermarkt.com/afc-sunderland/startseite/verein/289/saison_id/2014"      
## [19] "https://www.transfermarkt.com/leicester-city/startseite/verein/1003/saison_id/2014"     
## [20] "https://www.transfermarkt.com/fc-burnley/startseite/verein/1132/saison_id/2014"         
## 
## [[2]]
##  [1] "https://www.transfermarkt.com/fc-chelsea/startseite/verein/631/saison_id/2015"          
##  [2] "https://www.transfermarkt.com/manchester-city/startseite/verein/281/saison_id/2015"     
##  [3] "https://www.transfermarkt.com/fc-arsenal/startseite/verein/11/saison_id/2015"           
##  [4] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2015"   
##  [5] "https://www.transfermarkt.com/fc-liverpool/startseite/verein/31/saison_id/2015"         
##  [6] "https://www.transfermarkt.com/tottenham-hotspur/startseite/verein/148/saison_id/2015"   
##  [7] "https://www.transfermarkt.com/fc-everton/startseite/verein/29/saison_id/2015"           
##  [8] "https://www.transfermarkt.com/fc-southampton/startseite/verein/180/saison_id/2015"      
##  [9] "https://www.transfermarkt.com/west-ham-united/startseite/verein/379/saison_id/2015"     
## [10] "https://www.transfermarkt.com/newcastle-united/startseite/verein/762/saison_id/2015"    
## [11] "https://www.transfermarkt.com/leicester-city/startseite/verein/1003/saison_id/2015"     
## [12] "https://www.transfermarkt.com/stoke-city/startseite/verein/512/saison_id/2015"          
## [13] "https://www.transfermarkt.com/swansea-city/startseite/verein/2288/saison_id/2015"       
## [14] "https://www.transfermarkt.com/fc-watford/startseite/verein/1010/saison_id/2015"         
## [15] "https://www.transfermarkt.com/crystal-palace/startseite/verein/873/saison_id/2015"      
## [16] "https://www.transfermarkt.com/aston-villa/startseite/verein/405/saison_id/2015"         
## [17] "https://www.transfermarkt.com/norwich-city/startseite/verein/1123/saison_id/2015"       
## [18] "https://www.transfermarkt.com/west-bromwich-albion/startseite/verein/984/saison_id/2015"
## [19] "https://www.transfermarkt.com/afc-sunderland/startseite/verein/289/saison_id/2015"      
## [20] "https://www.transfermarkt.com/afc-bournemouth/startseite/verein/989/saison_id/2015"     
## 
## [[3]]
##  [1] "https://www.transfermarkt.com/fc-chelsea/startseite/verein/631/saison_id/2016"          
##  [2] "https://www.transfermarkt.com/manchester-city/startseite/verein/281/saison_id/2016"     
##  [3] "https://www.transfermarkt.com/tottenham-hotspur/startseite/verein/148/saison_id/2016"   
##  [4] "https://www.transfermarkt.com/fc-arsenal/startseite/verein/11/saison_id/2016"           
##  [5] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2016"   
##  [6] "https://www.transfermarkt.com/fc-liverpool/startseite/verein/31/saison_id/2016"         
##  [7] "https://www.transfermarkt.com/fc-everton/startseite/verein/29/saison_id/2016"           
##  [8] "https://www.transfermarkt.com/west-ham-united/startseite/verein/379/saison_id/2016"     
##  [9] "https://www.transfermarkt.com/fc-southampton/startseite/verein/180/saison_id/2016"      
## [10] "https://www.transfermarkt.com/crystal-palace/startseite/verein/873/saison_id/2016"      
## [11] "https://www.transfermarkt.com/leicester-city/startseite/verein/1003/saison_id/2016"     
## [12] "https://www.transfermarkt.com/stoke-city/startseite/verein/512/saison_id/2016"          
## [13] "https://www.transfermarkt.com/fc-watford/startseite/verein/1010/saison_id/2016"         
## [14] "https://www.transfermarkt.com/swansea-city/startseite/verein/2288/saison_id/2016"       
## [15] "https://www.transfermarkt.com/hull-city/startseite/verein/3008/saison_id/2016"          
## [16] "https://www.transfermarkt.com/afc-sunderland/startseite/verein/289/saison_id/2016"      
## [17] "https://www.transfermarkt.com/afc-bournemouth/startseite/verein/989/saison_id/2016"     
## [18] "https://www.transfermarkt.com/fc-middlesbrough/startseite/verein/641/saison_id/2016"    
## [19] "https://www.transfermarkt.com/west-bromwich-albion/startseite/verein/984/saison_id/2016"
## [20] "https://www.transfermarkt.com/fc-burnley/startseite/verein/1132/saison_id/2016"

Now filter the list for “manchester-united” strings.

manu_url_sy14_sy22 <- 
  prem_team_since_2014 %>% 
  map(
    ~ .x[grepl("manchester-united", .x)]
  )
manu_url_sy14_sy22
## [[1]]
## [1] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2014"
## 
## [[2]]
## [1] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2015"
## 
## [[3]]
## [1] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2016"
## 
## [[4]]
## [1] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2017"
## 
## [[5]]
## [1] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2018"
## 
## [[6]]
## [1] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2019"
## 
## [[7]]
## [1] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2020"
## 
## [[8]]
## [1] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2021"
## 
## [[9]]
## [1] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2022"

Flatten from list to vector.

manu_url_sy14_sy22 <- manu_url_sy14_sy22 %>% unlist()
manu_url_sy14_sy22
## [1] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2014"
## [2] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2015"
## [3] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2016"
## [4] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2017"
## [5] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2018"
## [6] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2019"
## [7] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2020"
## [8] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2021"
## [9] "https://www.transfermarkt.com/manchester-united/startseite/verein/985/saison_id/2022"

Now extract transfer data from each Man Utd URL.

manu_transfers <- 
  map(
    manu_url_sy14_sy22,
    ~
      tm_team_transfers(team_url = .x)
  )

Regular Season Stats

prem_stat_1423 <- 
  fb_season_team_stats(
  country = "ENG",
  gender = "M",
  season_end_year = c(2014:2023),
  tier = "1st",
  stat_type = "league_table",
  time_pause = 4
)

Store Data in SQL

PostgreSQL

Prepare Postgre driver with DBI and Rpostgres libraries. Use Jsonlite to organize json file. Load json file filled with my credentials to access the database.

mycred <- fromJSON(txt = "concred.json")

Create connection object.

con <- 
dbConnect(
  drv = RPostgres::Postgres(),
  user = mycred$user,
  password = mycred$password,
  host = "localhost",
  port = 5432,
  dbname = "football",
  options = "-c client_encoding=UTF8"
  )
con
## <PqConnection> football@localhost:5432

Cek isi database.

dbListTables(con)
## [1] "big5_p_1423"        "big5_t_1423"        "manu_p_1423"       
## [4] "manu_t_1423"        "manu_mngr_1423"     "manu_transfer_1423"
## [7] "premstat_1423"

Simpan tabel-tabel yang diperlukan ke dalam database football.

Big 5 Leagues

dbWriteTable(
  conn = con, 
  name = "big5_p_1423", 
  value = big5_player_2014_2023,
  overwrite = T
  )
dbWriteTable(
  conn = con,
  name = "big5_t_1423",
  value = big5_team_2014_2023,
  overwrite = T)

Man Utd

dbWriteTable(
  conn = con,
  name = "manu_p_1423",
  value = manu_players_2014_2023,
  overwrite = T)
dbWriteTable(
  conn = con,
  name = "manu_t_1423",
  value = manu_2014_2023,
  overwrite = T)

MU Managers

dbWriteTable(
  conn = con,
  name = "manu_mngr_1423",
  value = manu_managers,
  overwrite = T
)

MU Transfers

Because manu_transfers is a list, I need to prepare the table beforehand in postgreSQL.

Preview the structure of dataframes in the said list.

manu_transfers[1] %>% glimpse()
## List of 1
##  $ :'data.frame':    52 obs. of  21 variables:
##   ..$ team_name         : chr [1:52] "Manchester United" "Manchester United" "Manchester United" "Manchester United" ...
##   ..$ league            : chr [1:52] "Premier League" "Premier League" "Premier League" "Premier League" ...
##   ..$ country           : chr [1:52] "England" "England" "England" "England" ...
##   ..$ season            : chr [1:52] "2014" "2014" "2014" "2014" ...
##   ..$ transfer_type     : chr [1:52] "Arrivals" "Arrivals" "Arrivals" "Arrivals" ...
##   ..$ player_name       : chr [1:52] "Ángel Di María" "Luke Shaw" "Ander Herrera" "Marcos Rojo" ...
##   ..$ player_url        : chr [1:52] "https://www.transfermarkt.com/angel-di-maria/profil/spieler/45320" "https://www.transfermarkt.com/luke-shaw/profil/spieler/183288" "https://www.transfermarkt.com/ander-herrera/profil/spieler/99343" "https://www.transfermarkt.com/marcos-rojo/profil/spieler/93176" ...
##   ..$ player_position   : chr [1:52] "Right Winger" "Left-Back" "Central Midfield" "Centre-Back" ...
##   ..$ player_age        : chr [1:52] "26" "18" "24" "24" ...
##   ..$ player_nationality: chr [1:52] "Argentina" "England" "Spain" "Argentina" ...
##   ..$ club_2            : chr [1:52] "Real Madrid" "Southampton" "Athletic" "Sporting CP" ...
##   ..$ league_2          : chr [1:52] "LaLiga" "Premier League" "LaLiga" "Liga Portugal" ...
##   ..$ country_2         : chr [1:52] "Spain" "England" "Spain" "Portugal" ...
##   ..$ transfer_fee      : Named num [1:52] 75000000 37500000 36000000 20000000 17500000 7600000 1750000 NA NA NA ...
##   .. ..- attr(*, "names")= chr [1:52] "\20075.00m" "\20037.50m" "\20036.00m" "\20020.00m" ...
##   ..$ is_loan           : logi [1:52] FALSE FALSE FALSE FALSE FALSE TRUE ...
##   ..$ transfer_notes    : Named chr [1:52] NA NA NA NA ...
##   .. ..- attr(*, "names")= chr [1:52] "\20075.00m" "\20037.50m" "\20036.00m" "\20020.00m" ...
##   ..$ window            : chr [1:52] "Summer" "Summer" "Summer" "Summer" ...
##   ..$ in_squad          : num [1:52] 33 22 37 26 29 34 NA 2 23 33 ...
##   ..$ appearances       : num [1:52] 32 20 31 26 29 29 NA 1 12 18 ...
##   ..$ goals             : num [1:52] 4 0 8 1 2 4 NA 0 0 0 ...
##   ..$ minutes_played    : num [1:52] 1996 1310 2136 2097 2528 ...
manu_transfers[[1]] %>% names()
##  [1] "team_name"          "league"             "country"           
##  [4] "season"             "transfer_type"      "player_name"       
##  [7] "player_url"         "player_position"    "player_age"        
## [10] "player_nationality" "club_2"             "league_2"          
## [13] "country_2"          "transfer_fee"       "is_loan"           
## [16] "transfer_notes"     "window"             "in_squad"          
## [19] "appearances"        "goals"              "minutes_played"
manu_transfers[[1]] %>% class()
## [1] "data.frame"
# Replace with your table name and column definitions
table_name <- "manu_transfer_1423"
create_table_query <- "
  CREATE TABLE IF NOT EXISTS manu_transfer_1423 (
    id BIGSERIAL NOT NULL PRIMARY KEY,
    team_name VARCHAR(50),
    league VARCHAR(50),
    country VARCHAR(50),
    season INTEGER,
    transfer_type VARCHAR(50),
    player_name VARCHAR(50),
    player_url VARCHAR(300),
    player_position VARCHAR(50),
    player_age INTEGER,
    player_nationality VARCHAR(50),
    club_2 VARCHAR(50),
    league_2 VARCHAR(50),
    country_2 VARCHAR(50),
    transfer_fee REAL,
    is_loan VARCHAR(50),
    transfer_notes VARCHAR(100), 
    transfer_window VARCHAR(50),
    in_squad INTEGER,
    appearances INTEGER,
    goals INTEGER,
    minutes_played REAL
  );
"
 dbExecute(conn = con, statement = "DROP TABLE manu_transfer_1423"  )
## [1] 0
dbExecute(con, create_table_query)
## [1] 0

Check the table.

dbListTables(conn = con)
## [1] "premstat_1423"      "big5_p_1423"        "big5_t_1423"       
## [4] "manu_p_1423"        "manu_t_1423"        "manu_mngr_1423"    
## [7] "manu_transfer_1423"

Rename window into transfer_window

Previously, when executing the table creation, the window column caused an error. I had to rename it into transfer_window. Now I have to rename the column in the dataframe as well.

manu_transfers <- map(
  manu_transfers,
  ~ rename(.data = .x, transfer_window = window)
)

Write Table

Now that the table is ready, let’s insert the dataframes from our manu_transfers list into the manu_transfer_1423 table in postgreSQL.

Write the table into PostgreSQL with map function.

map(
  manu_transfers,
  ~ dbWriteTable(
    conn = con,
    name = table_name, 
    value = .x,
    append = TRUE, 
    row.names = FALSE
  )
)
## [[1]]
## [1] TRUE
## 
## [[2]]
## [1] TRUE
## 
## [[3]]
## [1] TRUE
## 
## [[4]]
## [1] TRUE
## 
## [[5]]
## [1] TRUE
## 
## [[6]]
## [1] TRUE
## 
## [[7]]
## [1] TRUE
## 
## [[8]]
## [1] TRUE
## 
## [[9]]
## [1] TRUE

Try fetching.

dbGetQuery(conn = con, statement = 
             "SELECT * FROM manu_transfer_1423 OFFSET 5 LIMIT 10"
             )
##    id         team_name         league country season transfer_type
## 1   6 Manchester United Premier League England   2014      Arrivals
## 2   7 Manchester United Premier League England   2014      Arrivals
## 3   8 Manchester United Premier League England   2014      Arrivals
## 4   9 Manchester United Premier League England   2014      Arrivals
## 5  10 Manchester United Premier League England   2014      Arrivals
## 6  11 Manchester United Premier League England   2014      Arrivals
## 7  12 Manchester United Premier League England   2014      Arrivals
## 8  13 Manchester United Premier League England   2014      Arrivals
## 9  14 Manchester United Premier League England   2014      Arrivals
## 10 15 Manchester United Premier League England   2014      Arrivals
##               player_name
## 1          Radamel Falcao
## 2  Vanja Milinkovic-Savic
## 3           Jesse Lingard
## 4          Tyler Blackett
## 5            Paddy McNair
## 6            James Wilson
## 7           Tom Cleverley
## 8                Anderson
## 9        Ángelo Henríquez
## 10       Federico Macheda
##                                                                    player_url
## 1           https://www.transfermarkt.com/radamel-falcao/profil/spieler/39152
## 2  https://www.transfermarkt.com/vanja-milinkovic-savic/profil/spieler/257474
## 3           https://www.transfermarkt.com/jesse-lingard/profil/spieler/141660
## 4          https://www.transfermarkt.com/tyler-blackett/profil/spieler/134414
## 5            https://www.transfermarkt.com/paddy-mcnair/profil/spieler/167268
## 6            https://www.transfermarkt.com/james-wilson/profil/spieler/214104
## 7            https://www.transfermarkt.com/tom-cleverley/profil/spieler/73484
## 8                 https://www.transfermarkt.com/anderson/profil/spieler/31645
## 9        https://www.transfermarkt.com/angelo-henriquez/profil/spieler/189740
## 10        https://www.transfermarkt.com/federico-macheda/profil/spieler/61887
##       player_position player_age player_nationality        club_2
## 1      Centre-Forward         28           Colombia        Monaco
## 2          Goalkeeper         17             Serbia     Vojvodina
## 3  Attacking Midfield         21            England   Man Utd U21
## 4           Left-Back         20            England   Man Utd U21
## 5         Centre-Back         19   Northern Ireland   Man Utd U21
## 6      Centre-Forward         18            England   Man Utd U18
## 7    Central Midfield         25            England   Aston Villa
## 8    Central Midfield         26             Brazil    Fiorentina
## 9      Centre-Forward         20              Chile Real Zaragoza
## 10     Centre-Forward         22              Italy    Birmingham
##             league_2 country_2 transfer_fee is_loan           transfer_notes
## 1            Ligue 1    Monaco      7600000    true                     <NA>
## 2  Super liga Srbije    Serbia      1750000   false                     <NA>
## 3   Premier League 2   England           NA   false                        -
## 4   Premier League 2   England           NA   false                        -
## 5   Premier League 2   England           NA   false                        -
## 6               <NA>   England           NA   false                        -
## 7     Premier League   England           NA    true End of loan May 31, 2015
## 8            Serie A     Italy           NA    true End of loan Jun 30, 2014
## 9            LaLiga2     Spain           NA    true End of loan Jun 30, 2014
## 10      Championship   England           NA    true End of loan Jun 30, 2014
##    transfer_window in_squad appearances goals minutes_played
## 1           Summer       34          29     4           1496
## 2           Summer       NA          NA    NA             NA
## 3           Summer        2           1     0             24
## 4           Summer       23          12     0            739
## 5           Summer       33          18     0           1206
## 6           Summer       27          17     2            562
## 7           Summer        1           1     0             90
## 8           Summer        3           2     0            110
## 9           Summer       NA          NA    NA             NA
## 10          Summer       NA          NA    NA             NA

Regular Season Stats

dbWriteTable(
  conn = con,
  name = "premstat_1423",
  value = prem_stat_1423, 
  overwrite = T,
)