iT邦幫忙

2026 iThome 鐵人賽

DAY 3
0
自我挑戰組

Python 爬蟲與資料分析實戰:從網路資料到資訊視覺化系列 第 28 篇

Day 28|整合 Pandas 與 Matplotlib:製作完整資料分析報表

  • 分享至 

  • xImage
  •  

前幾天我分別學習了 Python 爬蟲、資料清理、SQLite 資料庫,以及使用 Pandas 分析資料和 Matplotlib 製作圖表。今天想把這些內容串起來,嘗試製作一份比較完整的資料分析報表。

這次仍然以書籍資料作為練習主題,從建立資料、清理資料、統計分析到製作圖表,最後再把分析結果儲存成 CSV 和 PNG 檔案。

希望透過這次實作,練習的不只是單一的 Python 語法,而是完整的資料分析流程。

一、建立書籍資料

首先匯入 Pandas 和 Matplotlib,並建立一份書籍資料。為了讓程式可以直接執行,這次先使用範例資料。

import pandas as pd
import matplotlib.pyplot as plt

data = {
"title": [
"Book A", "Book B", "Book C", "Book D",
"Book E", "Book F", "Book G", "Book H",
"Book I", "Book J", "Book A"
],
"price": [
15.5, 22.0, 18.5, 35.0,
42.0, 28.5, 12.0, 31.0,
25.0, 38.0, 15.5
],
"rating": [
3, 4, 3, 5, 5, 4, 2, 4, 3, 5, 3
]
}

df = pd.DataFrame(data)

print(df)
print("資料筆數:", len(df))

這份資料包含書名、價格和評分,其中也故意放入重複的 Book A,方便後面練習資料清理。

在實際爬蟲專案中,可以把前幾天取得的書籍資料轉換成 DataFrame,再使用相同的流程進行分析。

二、清理資料

在分析之前,不能直接假設所有資料都是正確的。如果有重複紀錄、缺少價格,或價格不是數字,都可能影響最後的分析結果。

這次先檢查缺失值,再移除重複的書籍資料。

檢查缺失值

print("各欄位缺失值:")
print(df.isnull().sum())

移除重複書籍

df = df.drop_duplicates(subset=["title"], keep="first")

確保價格和評分是數字

df["price"] = pd.to_numeric(df["price"], errors="coerce")
df["rating"] = pd.to_numeric(df["rating"], errors="coerce")

移除缺少必要資料的紀錄

df = df.dropna(subset=["title", "price", "rating"])

只保留價格大於等於 0、評分介於 1 到 5 的資料

df = df[
(df["price"] >= 0) &
(df["rating"].between(1, 5))
]

df = df.reset_index(drop=True)

print("\n清理後的資料:")
print(df)

print("\n清理後的資料筆數:", len(df))

這裡使用了之前學過的幾個功能:

isnull().sum():計算各欄位缺少多少資料。

drop_duplicates():移除重複紀錄。

pd.to_numeric():將資料轉換成數字。

errors="coerce":無法轉換的內容會變成缺失值。

dropna():移除指定欄位有缺失值的紀錄。

between(1, 5):檢查評分是否介於 1 到 5 之間。

需要注意的是,這次以書名判斷重複資料只是練習。真實網站可能存在同名但不同版本的書籍,因此正式專案最好使用商品 ID 或網址等更可靠的識別方式。

三、進行基本統計分析

完成資料清理後,就可以開始分析書籍的價格和評分。

print("書籍總數:", len(df))
print("平均價格:", round(df["price"].mean(), 2))
print("最高價格:", df["price"].max())
print("最低價格:", df["price"].min())
print("平均評分:", round(df["rating"].mean(), 2))

print("\n價格統計摘要:")
print(df["price"].describe())

這裡使用 mean() 計算平均值、max() 找出最大值、min() 找出最小值,而 describe() 可以一次取得數量、平均值、標準差和四分位數等統計資訊。

除了查看整體資料,也可以依照評分分組,計算各評分的書籍數量和平均價格。

rating_summary = df.groupby("rating").agg(
book_count=("title", "count"),
average_price=("price", "mean")
).reset_index()

rating_summary["average_price"] = (
rating_summary["average_price"].round(2)
)

print(rating_summary)

這樣就可以比較不同評分的書籍數量,以及各組書籍的平均價格。

四、製作價格分析圖表

接著使用 Matplotlib 製作圖表,讓統計結果更容易理解。

先觀察不同評分的書籍數量。

rating_counts = df["rating"].value_counts().sort_index()

plt.figure(figsize=(8, 5))

bars = plt.bar(
rating_counts.index,
rating_counts.values,
color="steelblue"
)

plt.bar_label(bars)

plt.title("Number of Books by Rating")
plt.xlabel("Rating")
plt.ylabel("Number of Books")
plt.xticks([1, 2, 3, 4, 5])

plt.tight_layout()
plt.savefig(
"rating_counts.png",
dpi=150,
bbox_inches="tight"
)
plt.show()

這張圖可以看出不同評分各有幾本書。加入數值標籤後,就不需要只靠長條高度估計數量。

接下來分析不同評分的平均價格。

avg_price = df.groupby("rating")["price"].mean()

plt.figure(figsize=(8, 5))

bars = plt.bar(
avg_price.index,
avg_price.values,
color="darkorange"
)

plt.bar_label(bars, fmt="%.2f")

plt.title("Average Book Price by Rating")
plt.xlabel("Rating")
plt.ylabel("Average Price")
plt.xticks([1, 2, 3, 4, 5])

plt.tight_layout()
plt.savefig(
"average_price.png",
dpi=150,
bbox_inches="tight"
)
plt.show()

透過這張圖,可以比較不同評分的書籍平均價格。這裡呈現的是目前樣本的統計結果,不代表價格和評分之間一定存在因果關係。

五、製作價格分布圖

除了比較評分,也可以觀察書籍價格主要分布在哪些範圍。

plt.figure(figsize=(8, 5))

plt.hist(
df["price"],
bins=5,
color="mediumseagreen",
edgecolor="black"
)

plt.title("Distribution of Book Prices")
plt.xlabel("Price")
plt.ylabel("Number of Books")

plt.tight_layout()
plt.savefig(
"price_distribution.png",
dpi=150,
bbox_inches="tight"
)
plt.show()

這裡使用 plt.hist() 製作直方圖,bins=5 代表將價格範圍分成五個區間。

直方圖和長條圖的用途不太一樣。長條圖通常用來比較不同類別,而直方圖主要用來觀察數值資料的分布情況。

透過價格分布圖,就能大致觀察書籍價格集中在哪些區間,以及高價書籍是否比較少。

六、儲存分析結果

完成分析後,可以將清理後的資料和統計結果儲存成 CSV,方便後續使用。

儲存清理後的書籍資料

df.to_csv(
"cleaned_books.csv",
index=False,
encoding="utf-8-sig"
)

儲存評分統計結果

rating_summary.to_csv(
"rating_summary.csv",
index=False,
encoding="utf-8-sig"
)

print("資料和統計結果已儲存。")

如果在 Google Colab 中想將檔案下載到自己的電腦,可以執行:

from google.colab import files

files.download("cleaned_books.csv")

其他檔案也可以使用相同的方式下載,只要將檔名換成 rating_summary.csv、rating_counts.png 或 average_price.png 即可。

七、今天的實作整理

今天把前面學過的資料分析技巧整合在一起,完成了以下流程:

建立書籍資料並轉換成 DataFrame。

檢查缺失值、移除重複資料。

將價格和評分轉換成正確的資料型態。

使用 Pandas 計算平均價格、最高價格和最低價格。

透過 groupby() 比較不同評分的書籍。

使用 Matplotlib 製作長條圖和直方圖。

將分析結果儲存成 CSV 和 PNG 檔案。

這次的重點是把資料清理、統計分析和圖表製作串成一個完整流程。實際進行資料分析時,不是只要畫出圖表就結束,還需要確認資料是否正確,並選擇合適的方式呈現結果。

今日心得

今天練習把 Pandas 和 Matplotlib 整合起來,從資料清理開始,一直到統計分析和圖表輸出。以前練習時,大多是在學習單一功能,例如如何讀取資料、計算平均值或畫出長條圖,而今天則是把這些功能連接起來。

我也發現,分析結果會受到原始資料品質影響,所以在製作圖表之前,資料清理是很重要的一步。接下來就要開始準備最後的整合專題,把之前學過的爬蟲、資料庫和視覺化技術應用在同一個作品中。


上一篇
Day 27|Matplotlib 圖表美化與多組資料比較
下一篇
Day 29|整合專題實作:使用 Python 爬蟲建立書籍價格分析系統
系列文
Python 爬蟲與資料分析實戰:從網路資料到資訊視覺化 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言