Data Cleaning of Spanish Football League: A Comprehensive Approach

Author

Takafumi KUBOTA

Published

June 21, 2024

Abstract

In this study, we present a detailed methodology for cleaning and organizing the data from the Spanish football league. The primary objective is to transform raw match data into a structured and analyzable format, ensuring consistency and accuracy. We employ several data processing techniques using R, including reading raw CSV files, converting team names to their abbreviations, and calculating match results. Our approach involves creating a new dataframe that includes both home and away team perspectives, with additional columns for results and win points. The processed data enables more straightforward analysis for various applications, such as performance analysis, trend identification, and predictive modeling. The effectiveness of our method is demonstrated through a step-by-step transformation of the dataset, ensuring that it is ready for advanced statistical analysis and machine learning applications. This paper contributes to the field by providing a reproducible and scalable data cleaning framework, essential for researchers and analysts working with sports data.

Keywords

Data Cleaning, Football League Analysis, Sports Data Processing

1 フルコード

Code
# 必要なライブラリをロード
library(dplyr)
library(readr)

# チーム名と省略形の対応表を読み込む
team_abbreviations <- read_csv("teamname2021.csv")
head(team_abbreviations)
# A tibble: 6 × 2
  team_name          abbreviation
  <chr>              <chr>       
1 Real Sociedad      RSO         
2 Real Valladolid CF VLL         
3 Valencia CF        VAL         
4 Sevilla FC         SEV         
5 CA Osasuna         OSA         
6 FC Barcelona       FCB         
Code
# データを読み込む
data1 <- read_csv("es_2021.1_new.csv")
head(data1)
# A tibble: 6 × 5
  Round Date            `Team 1`           FT    `Team 2`            
  <dbl> <chr>           <chr>              <chr> <chr>               
1     1 Sat Sep 12 2020 SD Eibar           0-0   RC Celta Vigo       
2     1 Sat Sep 12 2020 Granada CF         2-0   Athletic Club Bilbao
3     1 Sat Sep 12 2020 Cádiz CF           0-2   CA Osasuna          
4     1 Sun Sep 13 2020 Deportivo Alavés   0-1   Real Betis          
5     1 Sun Sep 13 2020 Real Valladolid CF 1-1   Real Sociedad       
6     1 Sun Sep 13 2020 Villarreal CF      1-1   SD Huesca           
Code
# チーム名を省略形に変換する関数を定義
get_abbreviation <- function(team_name) {
  abbreviation <- team_abbreviations %>% filter(team_name == !!team_name) %>% pull(abbreviation)
  if (length(abbreviation) == 0) {
    return(NA)
  } else {
    return(abbreviation)
  }
}

# 新しいデータフレームを作成
data2 <- data1 %>%
  # HOMEチームのデータ
  mutate(
    HOME.AWAY = "HOME",
    Result = case_when(
      sub("-.*", "", FT) == sub(".*-", "", FT) ~ "DRAW",
      sub("-.*", "", FT) > sub(".*-", "", FT) ~ "WIN",
      TRUE ~ "LOSE"
    ),
    Score1 = as.numeric(sub("-.*", "", FT)),
    Score2 = as.numeric(sub(".*-", "", FT)),
    WinPoint = case_when(
      Result == "WIN" ~ 3,
      Result == "DRAW" ~ 1,
      TRUE ~ 0
    ),
    Team1_Abbreviation = sapply(`Team 1`, get_abbreviation),
    Team2_Abbreviation = sapply(`Team 2`, get_abbreviation)
  ) %>%
  rename(Team1 = `Team 1`, Team2 = `Team 2`) %>%
  select(Round, Date, HOME.AWAY, Team1, Team1_Abbreviation, Result, Team2, Team2_Abbreviation, Score1, Score2, WinPoint) %>%
  # AWAYチームのデータを追加
  bind_rows(
    data1 %>%
      mutate(
        HOME.AWAY = "AWAY",
        Result = case_when(
          sub("-.*", "", FT) == sub(".*-", "", FT) ~ "DRAW",
          sub("-.*", "", FT) < sub(".*-", "", FT) ~ "WIN",
          TRUE ~ "LOSE"
        ),
        Score1 = as.numeric(sub(".*-", "", FT)),
        Score2 = as.numeric(sub("-.*-", "", FT)),
        WinPoint = case_when(
          Result == "WIN" ~ 3,
          Result == "DRAW" ~ 1,
          TRUE ~ 0
        ),
        Team1_Abbreviation = sapply(`Team 2`, get_abbreviation),
        Team2_Abbreviation = sapply(`Team 1`, get_abbreviation)
      ) %>%
      rename(Team1 = `Team 2`, Team2 = `Team 1`) %>%
      select(Round, Date, HOME.AWAY, Team1, Team1_Abbreviation, Result, Team2, Team2_Abbreviation, Score1, Score2, WinPoint)
  )

# 結果を確認
head(data2)
# A tibble: 6 × 11
  Round Date  HOME.AWAY Team1 Team1_Abbreviation Result Team2 Team2_Abbreviation
  <dbl> <chr> <chr>     <chr> <chr>              <chr>  <chr> <chr>             
1     1 Sat … HOME      SD E… EIB                DRAW   RC C… CEL               
2     1 Sat … HOME      Gran… GRA                WIN    Athl… ATH               
3     1 Sat … HOME      Cádi… CAD                LOSE   CA O… OSA               
4     1 Sun … HOME      Depo… <NA>               LOSE   Real… BET               
5     1 Sun … HOME      Real… VLL                DRAW   Real… RSO               
6     1 Sun … HOME      Vill… VIL                DRAW   SD H… HUE               
# ℹ 3 more variables: Score1 <dbl>, Score2 <dbl>, WinPoint <dbl>
Code
# データをcsvに保存
#write_csv(data2, "es2021new2.csv")

2 コードの説明

  1. 必要なライブラリのロード:

    • dplyrreadr のライブラリをロードします。これにより、データフレームの操作とCSVファイルの読み書きが可能になります。
  2. チーム名と省略形の対応表を読み込む:

    • teamname2021.csv というファイルからチーム名とその省略形の対応表を読み込みます。この対応表は後でチーム名を省略形に変換するために使用します。
  3. 試合結果データを読み込む:

    • es_2021.1_new.csv というファイルから試合結果データを読み込みます。このデータには各試合の詳細が含まれています。
  4. チーム名を省略形に変換する関数を定義:

    • get_abbreviation 関数は、チーム名を入力として受け取り、その省略形を返します。対応表に該当するチーム名がない場合は NA を返します。
  5. 新しいデータフレームを作成:

    • 元のデータを元にして、ホームチームとアウェイチームそれぞれのデータを作成します。

    • 各試合の結果を WIN, LOSE, DRAW に分類し、各チームの得点を計算します。

    • チーム名を省略形に変換し、新しいデータフレームに追加します。

  6. 結果の確認:

    • 新しく作成したデータフレームの最初の数行を表示して、処理が正しく行われたかを確認します。
  7. データをCSVファイルに保存:

    • 最終的なデータフレームを es2021new2.csv として保存します。このステップはコメントアウトされていますが、必要に応じてコメントを外して実行できます。