聊天視窗

數據科學全能指南:從數據到洞察 - 第 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. 版本控制與追蹤 > 這一流程可直接套用於任何結構化資料集,透過模組化設計,將重複性工作自動化,確保資料清洗的可重現性與一致性。 ## 小結 資料清洗不是「裝飾」,而是每一步模型成功的基礎。透過嚴謹的流程、合適的工具與清晰的紀錄,你將能把原始資料轉化為高品質特徵,為接下來的探索分析與機器學習奠定堅實基礎。