前幾天我分別學習了 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"])
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 整合起來,從資料清理開始,一直到統計分析和圖表輸出。以前練習時,大多是在學習單一功能,例如如何讀取資料、計算平均值或畫出長條圖,而今天則是把這些功能連接起來。
我也發現,分析結果會受到原始資料品質影響,所以在製作圖表之前,資料清理是很重要的一步。接下來就要開始準備最後的整合專題,把之前學過的爬蟲、資料庫和視覺化技術應用在同一個作品中。