從零開始學習分析棒球之路 (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"]
留言
張貼留言