從零開始學習分析棒球之路 (0): Pandas 讀取 CSV

棒球與資料分析:

最近又重新複習了一次韓劇金牌救援 (Stove League),主要講述由帥哥南宮珉飾演的白承洙,到了常年排名倒數第一的職業棒球隊使球隊浴火重生的故事。

個人覺得因為是虛構的故事,整體看起來的感受比魔球 (Money Ball) 有過之而無不及。

因為 Stove League 與 Money Ball 中都有包含一些資料可視化與分析的過程,就想說試著找些棒球的資料來從頭開始用程式來實作看看XD


Python 及相關套件:

Python 中資料相關的套件相當豐富,主要可分為資料前處理, 資料可視化, 機械學習等相關套件。

若目標是資料清理與可視化,通常會使用 Jupyter Notebook, Pandas, Seaborn。

  • Jupyter Notebook: 開源的互動式編輯頁面,可以執行程式碼分段運行、數據可視化、編寫說明文件以及數據分析等任務。
  • Pandas: 可以讀取 CSV (Comma-Separated Values,逗號分隔檔) 及 Excel 檔,將其轉換成 DataFrame 進行數據清洗和轉換。
  • Seaborn: 是一個 Python 數據可視化庫,它提供了各種 API,可以讓使用者輕鬆地創建各種各樣的統計圖表(如: 散點圖 (Scatter Plot)、折線圖 (Line Plot)、直方圖 (Histogram)、箱盒圖 (Box Plot)、熱力圖 (Heatmap)等)。

設定 VSCode:

安裝一些 Jupyter Notebook 的相關套件,基本上微軟本家的套件都很推。

建立一個專案資料夾,本篇中會包含下列檔案:

  • 01_ReadCSV: 資料夾,用於管理資料與程式碼。
  • Player.csv: 資料源 (data source),紀錄球員的數據。
  • read_csv.ipynb: ipynb 是 Jupyter Notebook 檔,用於執行程式, 繪圖, 紀錄分析結果。

將以下資料複製貼上至 Player.csv:

Name,Team,Games Played,At Bats,Hits,Home Runs,RBI,Batting Average
John Smith,Lions,120,400,120,25,85,0.300
Mike Johnson,Bears,110,380,110,20,75,0.289
David Williams,Wolves,115,390,105,22,80,0.269
Chris Brown,Tigers,105,350,95,18,70,
Alex Taylor,Panthers,100,320,80,15,60,0.250
Sam Clark,Leopards,95,300,70,12,50,0.233
Matt Anderson,Falcons,90,280,60,10,40,0.214

開啟 ipynb 並新增 Markdown 註解:

開啟 read_csv.ipynb 主要功能如紅框所示:

  • Code: 產生 Code 區塊,可在區塊中編寫 Python 程式。
  • Markdown: 產生 Markdown 區塊,可在區塊中用 Markdown 語法 (link) 編寫說明。
  • Run All: 執行所有區塊。

點擊 +Markdown 來新增 Markdown 說明區塊,用 # 開頭代表標題:

# Read CSV with Pandas
Reading a CSV file with Pandas is a common operation in data analysis

點擊勾勾後結果如下:

讀取 CSV 並查看資料:

使用 Pandas 讀取 CSV 檔,讀取完存在變數 df (Data Frame) 中:

import pandas as pd

# Read the CSV file into a pandas DataFrame
df = pd.read_csv('Player.csv')

因為 CSV 檔通常很大,我們通常使用 head() 查看資料的結構:

df.head()

資料中直的部分稱為欄 (column),橫的部分稱為列 (row):

顯示 DataFrame 的行列數,共 7 rows, 8 columns:

df.shape

暴力顯示所有資料:

df

注意原始資料中的 Batting Average 因為資料缺失,所以它顯示的數值為 NaN (not a number):


新增欄位:

前面我們發現我們資料中有 NaN 項目,通常我們會用以下方式對 NaN 進行處理。

  • 刪除 NaN 值: 如果資料量很大,可以刪除包含 NaN 值的行。如果某欄缺失數量過多不具參考價值時,我們也會刪除該欄。
  • 填充 NaN 值: 如果可以從統計的角度去估算該值出現的機率,可以用平均值、中位數或其他合適的值填充 NaN 值。

因為打擊率 (Batting Average) 定義為安打數(Hits)/打擊次數(At Bats)所以我們可以重新計算打擊率:

df["Batting Average New"] = df["Hits"]/ df["At Bats"]

留言

熱門文章