返回目錄
A
洞察數據:從原始資料到商業決策的全流程 - 第 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 工具整合,以及如何在決策者層面實現資料洞察。