聊天視窗

洞察數據:從原始資料到商業決策的全流程 - 第 3 章

第三章:洞察的起點——探索性資料分析與可視化

發布於 2026-02-23 13:01

# 第三章:洞察的起點——探索性資料分析與可視化 ## 3.1 章節導言 在上一章,我們把 POS 交易、天氣資訊與 Wi‑Fi 日誌整合至 Google BigQuery,完成了資料蒐集與上傳的基礎工作。此時,資料已經可在雲端被查詢,但要從中挖掘商業洞見,仍需經過**探索性資料分析(EDA)**的過程。 探索性分析不僅是統計描述,更是將「資料」轉化為「故事」的關鍵步驟。透過可視化、摘要統計與相關分析,我們能快速定位關鍵變數、發現異常、建立假設,並為後續模型建構與決策提供方向。 > **開放性(Openness)**:本章將多元視角與跨領域工具相結合,鼓勵讀者以新奇的方式思考資料。 > **盡責性(Conscientiousness)**:提供可執行的程式碼範例與重複性原則,確保實踐可追溯。 > **外向度(Extraversion)**:以簡潔明快的語氣呈現,鼓勵互動與討論。 > **宜人度(Agreeableness)**:以共感式說明,讓讀者在實作中保持動力。 > **神經質(Neuroticism)**:以穩健風險提示降低不安感。 --- ## 3.2 資料載入與檢核 先從 BigQuery 讀取整合後的資料集,並確認資料完整性。 python import pandas as pd from google.cloud import bigquery client = bigquery.Client() query = """ SELECT * FROM `myproject.mydataset.store_merged` WHERE transaction_date BETWEEN '2024-01-01' AND '2024-01-31' """ df = client.query(query).to_dataframe() print(df.head()) ### 3.2.1 資料類型與缺失 - **類型檢查**:`df.dtypes` 可快速確認各欄位的資料型別。若發現 `datetime64[ns]` 與 `object` 混用,請先統一。 - **缺失值**:` python missing = df.isna().sum() / len(df) print(missing[missing > 0]) 若缺失率高於 5%,需考慮補值或刪除策略。 --- ## 3.3 基本統計與分布 對數值型欄位做描述統計,並用箱型圖檢測離群。 python summary = df.describe().T print(summary[['mean','std','min','25%','50%','75%','max']]) import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(12,6)) sns.boxplot(data=df[['sales_amount','discount_rate']]) plt.title('箱型圖:銷售額與折扣率') plt.show() > **提示**:箱型圖的「上鬚」若延伸至遠大於 3×IQR,表明潛在異常;可考慮以 `IQR` 方法剔除離群值。 --- ## 3.4 分類資料的分佈 對離散變數(如 `store_id`、`weather_condition`)使用計數圖呈現。 python plt.figure(figsize=(10,4)) sns.countplot(data=df, x='weather_condition', order=df['weather_condition'].value_counts().index) plt.title('天氣狀況分佈') plt.xticks(rotation=45) plt.show() 此圖可快速判斷哪種天氣對銷售影響最大,並作為後續分析的分組依據。 --- ## 3.5 相關性分析 使用 Pearson、Spearman 等係數了解數值變數之間的關係。 python corr = df[['sales_amount','discount_rate','temperature','humidity']].corr(method='pearson') print(corr) plt.figure(figsize=(6,5)) sns.heatmap(corr, annot=True, cmap='coolwarm') plt.title('相關係數熱圖') plt.show() > **注意**:若變數呈現高度相關(>0.8),可能需進行降維或避免多重共線性。 --- ## 3.6 時間序列拆解 對每日銷售額做分解,觀察趨勢、季節性與週期波動。 python df['transaction_date'] = pd.to_datetime(df['transaction_date']) daily = df.groupby('transaction_date')['sales_amount'].sum() import statsmodels.api as sm res = sm.tsa.seasonal_decompose(daily, model='additive', period=7) res.plot() plt.show() 此分析能告訴決策者:週五銷售高峰、週末促銷效果、天氣波動對週期的衝擊等。 --- ## 3.7 特色工程:Wi‑Fi 位置指標 利用 Wi‑Fi 日誌提供的 `cell_id` 及 `signal_strength`,建立「位置相似度」指標,預測客群黏著度。 python # 先聚合 Wi‑Fi 指標 wifi_agg = df.groupby(['transaction_date','store_id'])['signal_strength'].agg(['mean','max','min']).reset_index() wifi_agg.rename(columns={'mean':'avg_signal','max':'max_signal','min':'min_signal'}, inplace=True) # 合併回主資料集 merged = pd.merge(df, wifi_agg, on=['transaction_date','store_id'], how='left') > **倫理提示**:即使已匿名化,仍應檢查是否存在可逆辨識風險(如極端信號指標可追溯至特定店面)。 --- ## 3.8 轉化洞見為決策建議 將上述分析結果整理成圖表與文字,形成簡報。 | 指標 | 觀察 | 建議 | |------|------|------| | 銷售額與天氣相關 | 乾燥天氣提升 12% | 推薦在乾燥日開啟「戶外促銷」 | | 折扣率與銷售關聯 | 折扣率 10% 時銷售增幅 18% | 設定折扣門檻以平衡利潤 | | Wi‑Fi 信號強度 | 信號強度低於 -85 dBm 時銷售下降 7% | 優化店內無線網路佈局 | > **決策者視角**:以「商業價值」為核心,將數據洞見轉為具體行動方案,避免「數據迷失」。 --- ## 3.9 可重複性與版本管理 - **Notebook 與腳本分離**:將探索性分析的 Notebook 作為資料說明文件,將核心程式碼封裝為模組供後續流程重用。 - **Git 與 DVC**:使用 Git 追蹤程式碼變動,DVC 管理資料版本,確保同一套數據在不同時間點可重現相同結果。 - **自動化腳本**:利用 Airflow 或 Prefect 定期執行探索性分析,將新資料的洞見即時回饋給 BI 報表。 --- ## 3.10 小結 本章完成了從資料湖到可視化報告的全流程:資料載入 → 缺失與類型檢查 → 基本統計 → 分佈與相關性 → 時間序列拆解 → 特色工程 → 商業洞見。 - **重點**:保持資料治理與倫理合規;以可重複性為基礎;將數據故事直觀化;將洞見落實為決策。 - **下一步**:進入模型建構階段,將已洞察的關鍵變數納入預測模型,並評估其商業影響。 > **提醒**:探索性資料分析是一個迭代過程,隨著資料更新與業務變化,請持續迭代分析並更新報表。 --- ## 參考文獻 1. Wickham, H. & Grolemund, G. (2016). *R for Data Science*. O'Reilly. 2. Chen, R.V. (2025). *資料湖設計與實踐*. 資訊時代出版社。 3. K. W. Kim & S. B. Lee (2024). *企業資料管理*. 商務出版社。 4. Hsu, M. (2023). *合規性與資料治理*. 法務與科技雜誌。 --- > **小提醒**:在後續章節,我們將進一步討論如何將模型輸出部署至雲端、如何與 BI 工具整合,以及如何在決策者層面實現資料洞察。