iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0
自我挑戰組

數據新手村:統計系畢業生 30 天打怪升級之旅系列 第 25

Day 25 - Matplotlib 視覺化初登場

  • 分享至 

  • xImage
  •  

大家好,歡迎來到數據新手村的第二十五天!在過去的一週裡,我們深入 Pandas 的世界,學會了載入、清理、篩選、合併,甚至進行了時間序列的分析。我們已經能透過 groupby 計算出諸如「各月份總銷售額」這類高價值的統計數字。

但一張純數字的表格,雖然準確,卻往往難以快速傳達背後的「故事」與「趨勢」。要如何讓我們的分析結果一目了然、更具說服力呢?

答案就是數據可視化 (Data Visualization)。今天,我們將認識 Python 世界中最基礎、也最重要的視覺化函式庫——Matplotlib,並學習如何將它變成我們數據的「專屬翻譯官」。


1. 準備工作:引入 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)

2. 折線圖 (Line Plot) - 觀察時間趨勢

折線圖最適合用來展示數據在一個連續區間(尤其是時間)上的變化趨勢。

商業問題: 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()

輸出結果:
https://ithelp.ithome.com.tw/upload/images/20251008/20178546lP2xZs2uZb.png

3. 長條圖 (Bar Plot) - 比較類別數據

長條圖則是比較不同類別之間數量差異的最佳選擇。

商業問題: 星期幾是我們的下單熱點?


# 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()

輸出結果:
https://ithelp.ithome.com.tw/upload/images/20251008/20178546xUhfzeygDg.png

透過長條圖,我們可以非常直觀地看出,週一的訂單量明顯高於其他日子!


結語

今天,我們正式踏入了數據可視化的世界!我們學會了如何使用 Matplotlib 將 Pandas 的分析結果,轉換為直觀的折線圖與長條圖,並學習了如何美化我們的圖表,甚至解決了最惱人的中文顯示問題。

折線圖和長條圖是視覺化的基礎,但要探索數據的分佈與關聯,我們還需要更多樣化的武器。明天,Day 26,我們將學習如何繪製「直方圖 (Histogram)」與「箱線圖 (Box Plot)」,來窺探數據內部的秘密!


上一篇
Day 24 - Pandas 的時間序列資料處理
下一篇
Day 26 - 探索數據分佈:Matplotlib 的直方圖與箱線圖
系列文
數據新手村:統計系畢業生 30 天打怪升級之旅27
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言