一、什麼是資料視覺化?
資料視覺化就是將數據轉換成圖表,讓我們更容易理解資料中的特徵、差異和趨勢。
例如,在書籍資料分析中,可以使用不同的圖表回答不同問題:
圖表類型
適合分析的內容
長條圖(Bar Chart)
比較不同評分的書籍數量
折線圖(Line Chart)
觀察價格或數量隨時間的變化
圓餅圖(Pie Chart)
查看各類別占整體的比例
散佈圖(Scatter Plot)
觀察價格與評分之間的關係
直方圖(Histogram)
觀察價格的分布情況
今天先從最基本的長條圖開始,再練習圓餅圖和直方圖。
二、安裝與匯入 Matplotlib
Matplotlib 是 Python 常用的資料視覺化套件,可以用來製作長條圖、折線圖、圓餅圖等。
在 Google Colab 中通常已經可以直接使用,不需要額外安裝。
import pandas as pd
import matplotlib.pyplot as plt
print("套件匯入完成!")
其中,matplotlib.pyplot 通常會簡寫成 plt,之後就能使用 plt.bar()、plt.plot() 等函式建立圖表。
為了讓圖表可以顯示中文,可以先設定字型:
plt.rcParams["font.sans-serif"] = [
"Noto Sans CJK TC",
"DejaVu Sans"
]
plt.rcParams["axes.unicode_minus"] = False
如果在 Colab 中仍然無法正常顯示中文,可以先執行以下指令安裝中文字型,再重新設定:
!apt-get -qq update
!apt-get -qq install fonts-noto-cjk
完成後重新執行字型設定即可。
三、建立書籍資料
今天使用一組模擬書籍資料,讓每個人都能直接執行程式,不需要依賴前幾天的 Colab 執行紀錄。
data = {
"title": [
"Book A", "Book B", "Book C", "Book D",
"Book E", "Book F", "Book G", "Book H",
"Book I", "Book J"
],
"price": [
15.99, 25.50, 8.99, 45.00, 32.99,
12.50, 55.00, 19.99, 38.50, 28.00
],
"rating": [
5, 4, 3, 5, 2, 4, 5, 3, 4, 5
]
}
df = pd.DataFrame(data)
print(df)
這份資料包含書名、價格和評分三個欄位。
有了 DataFrame 之後,就可以先使用 Pandas 整理數據,再把整理好的結果交給 Matplotlib 製作圖表。
四、實作一:製作書籍評分長條圖
首先,我想知道每種評分各有幾本書。
可以使用 Pandas 的 value_counts() 統計各評分的數量,再使用 Matplotlib 畫出長條圖。
rating_counts = (
df["rating"]
.value_counts()
.sort_index()
)
plt.figure(figsize=(8, 5))
plt.bar(
rating_counts.index,
rating_counts.values
)
plt.title("Book Rating Distribution")
plt.xlabel("Rating")
plt.ylabel("Number of Books")
plt.xticks([1, 2, 3, 4, 5])
plt.tight_layout()
plt.show()
這段程式有幾個重要的地方:
value_counts():計算每個評分出現的次數。
sort_index():按照評分數值由小到大排列。
plt.figure(figsize=(8, 5)):設定圖表大小。
plt.bar():建立長條圖。
plt.title():設定圖表標題。
plt.xlabel() 和 plt.ylabel():設定 X 軸和 Y 軸的名稱。
plt.show():顯示圖表。
從圖表中,可以直接比較不同評分的書籍數量,而不必逐筆查看原始資料。
這種圖表很適合用來比較商品類別、問卷選項、不同部門的數量等資料。
五、實作二:製作書籍價格直方圖
長條圖通常用來比較不同類別,而直方圖則適合觀察數值的分布。
例如,我想知道書籍價格主要集中在哪些區間,可以使用 plt.hist()。
plt.figure(figsize=(8, 5))
plt.hist(
df["price"],
bins=5,
edgecolor="black"
)
plt.title("Book Price Distribution")
plt.xlabel("Price")
plt.ylabel("Frequency")
plt.tight_layout()
plt.show()
這裡的 bins=5 表示將價格範圍切分成五個區間。
直方圖會統計每個區間包含多少筆價格資料,因此可以用來觀察價格是否集中在某個範圍,或是否存在少數特別高價的資料。
需要注意的是,區間切分方式會影響圖表的外觀。bins 設定得太少,可能看不出細節;設定得太多,則可能讓圖表變得零碎。
六、實作三:製作書籍價格圓餅圖
接下來,將書籍依照評分分類,觀察不同評分在全部書籍中所占的比例。
rating_counts = df["rating"].value_counts().sort_index()
plt.figure(figsize=(7, 7))
plt.pie(
rating_counts.values,
labels=rating_counts.index,
autopct="%1.1f%%",
startangle=90
)
plt.title("Percentage of Books by Rating")
plt.tight_layout()
plt.show()
這裡使用了幾個新的參數:
labels:設定每個區塊的標籤。
autopct="%1.1f%%":在圖表上顯示百分比,並保留一位小數。
startangle=90:設定圓餅圖的起始角度。
圓餅圖可以快速呈現各評分所占的比例,但如果類別太多,或不同類別的比例非常接近,就不一定容易比較。因此,實際分析時仍然要依照資料特性選擇圖表。
七、實作四:分析價格與評分的關係
除了比較數量,我也想觀察書籍價格與評分之間是否有某種關係。
這時可以使用散佈圖。
plt.figure(figsize=(8, 5))
plt.scatter(
df["price"],
df["rating"]
)
plt.title("Book Price vs Rating")
plt.xlabel("Price")
plt.ylabel("Rating")
plt.yticks([1, 2, 3, 4, 5])
plt.tight_layout()
plt.show()
在散佈圖中,每個點代表一本書:
X 軸代表價格。
Y 軸代表評分。
如果點大致呈現由左下往右上的分布,可能表示價格和評分存在正向關聯;如果點分布得很分散,就可能沒有明顯的線性關係。
但不能只看圖表就斷定兩者具有因果關係。若要進一步分析,還需要更多資料與適當的統計方法。
八、將之前爬取的資料轉換成圖表
前面的例子使用模擬資料。如果之前已經完成 Day 25 的爬蟲與 SQLite 專案,也可以直接讀取資料庫中的書籍資料。
import sqlite3
import pandas as pd
conn = sqlite3.connect("books_crawler.db")
df = pd.read_sql_query("""
SELECT title, price, rating
FROM books
""", conn)
print(df.head())
print(df.shape)
conn.close()
這裡使用 pd.read_sql_query(),直接從 SQLite 讀取資料並轉換成 DataFrame。
接著就可以沿用前面學過的長條圖程式:
rating_counts = (
df["rating"]
.value_counts()
.sort_index()
)
plt.figure(figsize=(8, 5))
plt.bar(rating_counts.index, rating_counts.values)
plt.title("Books by Rating")
plt.xlabel("Rating")
plt.ylabel("Number of Books")
plt.xticks([1, 2, 3, 4, 5])
plt.tight_layout()
plt.show()
這樣就能把之前爬取並儲存在資料庫的實際資料轉換成圖表。
要注意,Google Colab 必須已經有 books_crawler.db 這個檔案。如果之前的執行環境已重設,可以先重新上傳保存好的資料庫檔案,或重新執行 Day 25 的程式。
九、今天的學習心得
今天開始學習 Matplotlib,練習將書籍資料轉換成長條圖、直方圖、圓餅圖和散佈圖。
我發現不同的圖表適合回答不同的問題。想比較各評分的書籍數量,可以使用長條圖;想觀察價格的分布,可以使用直方圖;如果想了解價格和評分之間的關係,則可以使用散佈圖。
透過圖表,我能更快看出資料的分布和差異,而不只是閱讀表格中的數字。這也讓之前學過的爬蟲、Pandas 和 SQLite 有了新的用途,因為整理好的資料不只能儲存與查詢,還可以轉換成更容易理解的分析結果。
接下來,我會繼續學習圖表的格式調整與多組資料比較,讓視覺化結果更加完整,也為最後的資料分析專案做準備。