大家好,歡迎來到數據新手村的第二十五天!在過去的一週裡,我們深入 Pandas 的世界,學會了載入、清理、篩選、合併,甚至進行了時間序列的分析。我們已經能透過 groupby
計算出諸如「各月份總銷售額」這類高價值的統計數字。
但一張純數字的表格,雖然準確,卻往往難以快速傳達背後的「故事」與「趨勢」。要如何讓我們的分析結果一目了然、更具說服力呢?
答案就是數據可視化 (Data Visualization)。今天,我們將認識 Python 世界中最基礎、也最重要的視覺化函式庫——Matplotlib,並學習如何將它變成我們數據的「專屬翻譯官」。
Matplotlib 是一個極其龐大和靈活的繪圖庫。在 Jupyter Notebook 環境中,我們通常會引入其 pyplot
模組,並使用 plt
作為通用簡稱。
同時,為了讓圖表能直接顯示在 Notebook 中,我們會加上 %matplotlib inline
這個「魔法指令」。
我們將沿用 Day 24 分析出的「月銷售額」與「星期訂單數」這兩組數據來進行今天的繪製。
import pandas as pd
import matplotlib.pyplot as plt
# --- 準備數據 ---
# 為了讓本篇筆記可以獨立執行,我們重新準備一次 Day 24 的數據
# 讀取與合併
orders_df = pd.read_csv('../../data/olist_datasets/olist_orders_dataset.csv')
payments_df = pd.read_csv('../../data/olist_datasets/olist_order_payments_dataset.csv')
df = pd.merge(orders_df, payments_df, on='order_id', how='left')
# 轉換時間欄位
df['order_purchase_timestamp'] = pd.to_datetime(df['order_purchase_timestamp'])
# 提取時間特徵
df['purchase_month'] = df['order_purchase_timestamp'].dt.month
df['purchase_dayofweek'] = df['order_purchase_timestamp'].dt.dayofweek
# 數據一:各月份總銷售額
monthly_sales = df.groupby('purchase_month')['payment_value'].sum()
# 數據二:各星期訂單總數
weekday_orders = df.groupby('purchase_dayofweek')['order_id'].nunique()
weekday_map = {0: '週一', 1: '週二', 2: '週三', 3: '週四', 4: '週五', 5: '週六', 6: '週日'}
weekday_orders.index = weekday_orders.index.map(weekday_map)
折線圖最適合用來展示數據在一個連續區間(尤其是時間)上的變化趨勢。
商業問題: Olist 平台的月銷售額趨勢是如何變化的?
繪製一張基本折線圖
繪製一張圖表,通常包含以下幾個核心步驟:
建立畫布 (plt.figure)
繪製圖表 (plt.plot)
添加標題與標籤 (plt.title, plt.xlabel, plt.ylabel)
顯示圖表 (plt.show)
# 魔法指令,讓圖表顯示在 Notebook 中
%matplotlib inline
# 1. 建立畫布,並設定圖表大小
plt.figure(figsize=(10, 6))
# 2. 繪製折線圖
# x 軸是索引 (月份 1-12), y 軸是值 (銷售額)
# marker='o' 會在每個數據點上加上一個圓點標記
plt.plot(monthly_sales.index, monthly_sales.values, marker='o')
# 3. 加上標題與標籤
plt.title('Olist 平台月銷售額趨勢')
plt.xlabel('月份')
plt.ylabel('總銷售額 (百萬)')
plt.xticks(range(1, 13)) # 確保 X 軸能完整顯示 1 到 12 月
plt.grid(True) # 加上格線,方便閱讀
# 4. 加上這兩行,解決中文顯示問題
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei']
plt.rcParams['axes.unicode_minus'] = False
# 5. 顯示圖表
plt.show()
輸出結果:
長條圖則是比較不同類別之間數量差異的最佳選擇。
商業問題: 星期幾是我們的下單熱點?
# Pro Tip: 解決 Matplotlib 中文顯示問題
# 加上這兩行,就能讓圖表中的中文正常顯示為「微軟正黑體」
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei']
plt.rcParams['axes.unicode_minus'] = False # 解決負號顯示問題
# 1. 建立畫布
plt.figure(figsize=(10, 6))
# 2. 繪製長條圖
# x 軸是索引 (星期名稱), y 軸是值 (訂單數)
plt.bar(weekday_orders.index, weekday_orders.values, color='skyblue')
# 3. 加上標題與標籤
plt.title('Olist 平台各星期訂單總數')
plt.xlabel('星期')
plt.ylabel('訂單總數')
# 4. 顯示圖表
plt.show()
輸出結果:
透過長條圖,我們可以非常直觀地看出,週一的訂單量明顯高於其他日子!
今天,我們正式踏入了數據可視化的世界!我們學會了如何使用 Matplotlib 將 Pandas 的分析結果,轉換為直觀的折線圖與長條圖,並學習了如何美化我們的圖表,甚至解決了最惱人的中文顯示問題。
折線圖和長條圖是視覺化的基礎,但要探索數據的分佈與關聯,我們還需要更多樣化的武器。明天,Day 26,我們將學習如何繪製「直方圖 (Histogram)」與「箱線圖 (Box Plot)」,來窺探數據內部的秘密!