聊天視窗

數據決策:從洞察到策略的全程分析 - 第 3 章

第 3 章 探索性資料分析 (EDA)

發布於 2026-03-05 01:40

# 第 3 章 探索性資料分析 (EDA) ## 3.1 EDA 的定義與目的 探索性資料分析(Exploratory Data Analysis, EDA)是資料科學流程中**第一個實際操作的步驟**。它的核心目標是: - **快速了解資料結構**:資料類型、缺失值、資料量等。 - **揭示潛在模式**:趨勢、季節性、群聚或離群點。 - **驗證假設**:檢驗先驗假設、生成新的研究問題。 - **為後續建模做準備**:確定特徵工程、選擇合適的統計/機器學習模型。 > **核心思維**:「先看、再說、再做」——先用視覺化和描述性統計探索資料,再對發現的模式進行更深入的統計檢定或模型化。 ## 3.2 EDA 的典型流程 1. **資料載入**:從 CSV、資料庫、API 等載入資料。 2. **資料概覽**:查看資料維度、欄位類型、前幾筆資料。 3. **缺失值與重複值**:量化、可視化。 4. **描述性統計**:均值、標準差、分位數、頻率分佈。 5. **分布與離群檢測**:直方圖、箱型圖、QQ 圖。 6. **相關性探索**:相關矩陣、熱力圖、散點圖矩陣。 7. **分組比較**:箱型圖、分組柱狀圖、t 檢驗、ANOVA。 8. **非線性關係**:LOESS、Spline、偏相關圖。 9. **特徵工程啟發**:派生新變數、轉換(對數、標準化、類別編碼)。 10. **資料品質報告**:統計表格、缺失度圖、離群率。 > **小技巧**:在 Jupyter Notebook 或 RStudio 中使用 `display()` 以視覺化呈現表格;利用 `ipywidgets` 動態交互式可視化可提升分析效率。 ## 3.3 重要工具與技術 | 程式語言 / 框架 | 主要函式庫 | 典型功能 | |----------------|------------|----------| | Python | pandas, seaborn, matplotlib, plotly, missingno | 資料清理、可視化、缺失值可視化 | | R | dplyr, ggplot2, plotly, naniar, missMDA | 資料操作、圖形、缺失值處理 | | Spark / PySpark | DataFrame API, MLlib | 大規模資料 EDA、分布式統計 | | Dask | Dask DataFrame | 與 pandas 相容的大規模 EDA | | Tableau / Power BI | 內建可視化 | 交互式儀表板 | ### 示例:使用 pandas 與 seaborn 生成基礎圖表 python import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 讀取資料 df = pd.read_csv('sales_data.csv') # 基本資訊 print(df.info()) print(df.describe()) # 缺失值可視化 sns.heatmap(df.isnull(), cbar=False, yticklabels=False) plt.title('Missing Values Heatmap') plt.show() # 直方圖 sns.histplot(df['sales_amount'], bins=30, kde=True) plt.title('Sales Amount Distribution') plt.show() # 盒鬚圖 sns.boxplot(x='region', y='sales_amount', data=df) plt.title('Sales by Region') plt.show() ### 示例:使用 missingno 直觀呈現缺失模式 python import missingno as msno # 缺失值結構圖 msno.matrix(df) plt.title('Missing Matrix') plt.show() ## 3.4 典型分析方法 | 方法 | 用途 | 重要參數 | |------|------|-----------| | 直方圖 | 分布檢查 | bins、density、kde | | 箱型圖 | 離群值檢測 | notch、whisker、fliers | | 散點圖 | 兩變數關係 | hue、size、alpha | | 熱力圖 | 相關矩陣 | cmap、annot、fmt | | 盒鬚-散點(Violin + Scatter) | 分布與關係 | split, inner | | LOESS / LOWESS | 非線性趨勢 | frac | | 主成份分析 (PCA) | 低維可視化 | n_components | | 分組 t 檢驗 / ANOVA | 分組差異 | alpha | ### 相關矩陣示例 python corr = df.corr(method='pearson') plt.figure(figsize=(10, 8)) sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm', vmin=-1, vmax=1) plt.title('Correlation Heatmap') plt.show() ### 重要提示 - **資料型別先轉換**:將數值型別轉為 `float`,類別型別轉為 `category`,避免類型錯誤。 - **離群值**:先判斷離群值是否為真實異常還是資料輸入錯誤,決定是否剔除。 - **多變量視覺化**:使用 `pairplot` 或 `jointplot` 探索多變量關係。 ## 3.5 案例實作:零售業銷售資料 EDA 假設我們擁有 2023 年第一季的線上零售銷售資料,欄位包括 `order_id, product_id, quantity, unit_price, order_date, region, customer_segment`。 ### 1. 資料載入與初步檢查 python df = pd.read_csv('retail_sales_q1_2023.csv', parse_dates=['order_date']) print(df.head()) print(df.info()) ### 2. 缺失值與重複值 python # 缺失率 missing_rate = df.isnull().mean() * 100 print(missing_rate) # 重複檢查 duplicate_rows = df.duplicated().sum() print(f"重複行數: {duplicate_rows}") ### 3. 描述性統計與分布 python # 總銷售金額 df['sales_amount'] = df['quantity'] * df['unit_price'] print(df['sales_amount'].describe()) # 銷售金額直方圖 sns.histplot(df['sales_amount'], bins=50, kde=True) plt.title('Sales Amount Distribution') plt.show() ### 4. 時間序列探索 python # 按日總銷售 daily_sales = df.groupby(df['order_date'].dt.date)['sales_amount'].sum() plt.figure(figsize=(12,4)) plt.plot(daily_sales.index, daily_sales.values) plt.title('Daily Sales Trend Q1 2023') plt.xlabel('Date') plt.ylabel('Sales Amount') plt.show() ### 5. 地區與客群比較 python # 地區箱型圖 sns.boxplot(x='region', y='sales_amount', data=df) plt.title('Sales by Region') plt.show() # 客群柱狀圖 region_segment = df.groupby(['region', 'customer_segment'])['sales_amount'].sum().unstack() region_segment.plot(kind='bar', stacked=True, figsize=(10,6)) plt.title('Sales by Region and Customer Segment') plt.ylabel('Sales Amount') plt.show() ### 6. 相關性分析 python # 數值特徵相關矩陣 numeric_cols = ['quantity', 'unit_price', 'sales_amount'] corr_matrix = df[numeric_cols].corr() plt.figure(figsize=(6,5)) sns.heatmap(corr_matrix, annot=True, cmap='viridis') plt.title('Numeric Feature Correlation') plt.show() ### 7. 結論與後續步驟 - **季節性波動**:每週四、五銷售高峰,可能為促銷日。 - **高價商品**:`unit_price` 與 `sales_amount` 相關性 0.92,表明高價商品貢獻大。 - **客群差異**:企業客戶在北區的銷售額占比最高。 - **離群值**:日銷售額超過 3 SD 的點多為大型訂單,未剔除。 > **後續**:進行時間序列分解、季節性調整;對高價商品進行聚類;建立回歸模型預測銷售額。 ## 3.6 大數據環境下的 EDA 當資料量達到數百萬乃至十億筆時,傳統 pandas 可能無法承載。此時可選擇以下策略: 1. **分布式框架**:PySpark DataFrame、Dask DataFrame。功能與 pandas 相容,支持分佈式統計。 2. **列式存儲**:Parquet、ORC,可快速讀取感興趣的欄位。 3. **樣本抽樣**:使用 `df.sample(frac=0.01)` 抽取 1% 樣本進行初步 EDA。 4. **交互式儀表板**:Plotly Dash、Streamlit 或 Tableau,能在瀏覽器中快速可視化大資料。 python # PySpark 示例:計算每日銷售總額 from pyspark.sql import SparkSession spark = SparkSession.builder.appName('RetailEDA').getOrCreate() sales_df = spark.read.parquet('s3://bucket/retail_sales/') daily_sales = sales_df.groupBy(sales_df.order_date.cast('date').alias('date')). agg({'sales_amount': 'sum'}).orderBy('date') daily_sales.show(10) ## 3.7 小結 - **EDA 是資料探索的門面**:通過統計圖表、描述性統計、相關性分析,快速理解資料特性。 - **工具多元化**:Python + pandas + seaborn,R + ggplot2,Spark + MLlib,視覺化平台皆可使用。 - **可視化是關鍵**:圖形能將複雜數值轉化為直觀資訊,對商業決策者尤為重要。 - **大數據時的策略**:採用分布式框架、樣本抽樣、列式存儲,保持分析效率。 - **持續迭代**:EDA 不僅是一次性工作,隨著資料更新需要不斷重新探索,確保洞察永遠貼近實務。 > **下一章**:統計建模與假設檢定,將利用 EDA 產生的假設進行數學驗證與模型建立。