返回目錄
A
數據科學全能指南:從數據到洞察 - 第 3 章
第三章:資料清洗與前處理
發布於 2026-02-22 22:42
# 第三章:資料清洗與前處理
資料科學的核心並非僅僅是模型,而是「乾淨」與「可操作」的資料。這一章將帶你從原始資料走進模型訓練前的「資料清洗」與「前處理」環節,並透過實際範例說明每一步驟的實作細節。
## 1️⃣ 為何資料清洗如此重要
- **品質決定預測準確度**:噪音、缺失值或離群點會直接降低模型表現。
- **減少資料偏差**:不恰當的資料處理會產生不公平或誤導性的結果。
- **提升效率**:乾淨的資料能減少計算成本,縮短訓練時間。
## 2️⃣ 步驟一:初始品質檢測
python
import pandas as pd
import missingno as msno
df = pd.read_csv('data/raw/titanic.csv')
# 基本資訊
print(df.info())
print(df.describe(include='all'))
# 缺失值可視化
msno.matrix(df)
- `df.info()` 讓你快速了解欄位類型、非空值數量。
- `df.describe()` 可以觀察數值型與類別型欄位的分布。
- `missingno` 以圖形方式顯示缺失模式,便於快速定位問題區域。
## 3️⃣ 步驟二:處理缺失值
| 方法 | 適用場景 | 代碼範例 |
|---|---|---|
| 刪除 | 缺失比例低且不影響樣本量 | `df.dropna(subset=['Age'])` |
| 平均/中位數填補 | 數值型欄位 | `df['Age'].fillna(df['Age'].median(), inplace=True)` |
| 眾數填補 | 類別欄位 | `df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)` |
| 預測填補 | 高缺失比例 | `from sklearn.ensemble import RandomForestRegressor` |
> **Tip**:對於關鍵特徵,若缺失比例過高,建議先評估其重要性,必要時可考慮刪除該欄位。
## 4️⃣ 步驟三:處理離群值
### 4.1 IQR 方法
python
Q1 = df['Fare'].quantile(0.25)
Q3 = df['Fare'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
df = df[(df['Fare'] >= lower) & (df['Fare'] <= upper)]
### 4.2 標準差方法
python
from scipy import stats
df = df[(np.abs(stats.zscore(df['Age'])) < 3)]
> **注意**:離群值處理需依據業務背景決定,單純去除可能丟失重要訊息。
## 5️⃣ 步驟四:資料轉換
| 轉換 | 目的 | 代碼 |
|---|---|---|
| 正規化 | 將資料壓縮到 [0,1] | `MinMaxScaler()` |
| 標準化 | 平均值 0、標準差 1 | `StandardScaler()` |
| Log 轉換 | 針對右偏分布 | `np.log1p(df['Fare'])` |
| Box-Cox | 使分布更接近正態 | `scipy.stats.boxcox(df['Fare'])` |
python
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df[['Age', 'Fare']] = scaler.fit_transform(df[['Age', 'Fare']])
## 6️⃣ 步驟五:編碼類別特徵
- **One-Hot**:適用於非序數類別,避免引入排序誤差。
- **Label**:適用於序數類別,如評分等。
- **Target Encoding**:將類別映射為目標變數的平均值,適用於高基數特徵。
python
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(sparse=False)
encoded = pd.DataFrame(enc.fit_transform(df[['Sex', 'Embarked']]), columns=enc.get_feature_names(['Sex', 'Embarked']))
# 合併回原始資料
X = pd.concat([df.drop(['Sex', 'Embarked'], axis=1), encoded], axis=1)
## 7️⃣ 步驟六:資料縮減
- **PCA**:減少維度,保持變異性。
- **t-SNE / UMAP**:視覺化高維資料。
python
from sklearn.decomposition import PCA
pca = PCA(n_components=0.95) # 保留 95% 變異性
X_reduced = pca.fit_transform(X)
print(f'降維後尺寸:{X_reduced.shape}')
## 8️⃣ 步驟七:儲存乾淨資料
| 格式 | 優點 |
|---|---|
| Parquet | 高效列式存儲,支持壓縮,讀寫速度快 |
| Feather | 兼容 Python 與 R,極快讀寫 |
| CSV | 最廣泛的兼容性,但缺乏壓縮 |
python
X.to_parquet('data/cleaned/titanic_clean.parquet', compression='snappy')
## 9️⃣ 步驟八:追蹤與重現
- **DVC**:管理資料版本,將資料與程式碼共同版本控制。
- **MLflow**:追蹤實驗、參數、模型。
bash
# 安裝
pip install dvc mlflow
# 初始化 DVC
dvc init
# 將資料加入 DVC
dvc add data/raw/titanic.csv
git add .dvc .gitignore
git commit -m "Add raw Titanic dataset"
## 🎯 實戰範例:Titanic 資料清洗完整流程
1. 讀取原始資料
2. 初步檢查缺失值與統計
3. 填補缺失、刪除離群
4. 轉換與編碼
5. 儲存乾淨資料
6. 版本控制與追蹤
> 這一流程可直接套用於任何結構化資料集,透過模組化設計,將重複性工作自動化,確保資料清洗的可重現性與一致性。
## 小結
資料清洗不是「裝飾」,而是每一步模型成功的基礎。透過嚴謹的流程、合適的工具與清晰的紀錄,你將能把原始資料轉化為高品質特徵,為接下來的探索分析與機器學習奠定堅實基礎。