Seaborn 建立於 Matplotlib 之上,提供更簡潔易用的 API,尤其擅長處理 Pandas DataFrame,能快速繪製各種資訊豐富的統計圖表。相較於直接使用 Matplotlib,Seaborn 更貼近資料分析師的使用習慣,能大幅減少程式碼撰寫量。本文除了介紹 Seaborn 的基本用法外,也將涵蓋資料格式的比較、進階圖表繪製以及資料框架的串接與合併技術,最後提供效能最佳化建議,讓讀者能更有效率地運用 Seaborn 進行資料視覺化。
資料視覺化:使用Seaborn建立進階圖表
資料視覺化是資料分析中至關重要的步驟,而Seaborn作為Python中一個強大的視覺化函式庫,能夠幫助我們建立更具吸引力和資訊量的圖表。本篇文章將深入探討如何使用Seaborn進行資料視覺化,並介紹其與Pandas和Matplotlib的比較。
為什麼選擇Seaborn?
Seaborn建立在Matplotlib的基礎上,提供了更高層次的介面,使得建立複雜且美觀的圖表變得更加簡單。特別是在處理Pandas DataFrame時,Seaborn能夠提供開箱即用的視覺化效果,大大簡化了資料視覺化的過程。
基本使用方法
在使用Seaborn之前,需要先匯入函式庫並設定主題:
import seaborn as sns
sns.set_theme()
sns.set_style("white")
建立範例資料
首先,我們建立一個簡單的DataFrame,記錄兩個GitHub專案在不同季度獲得的星數:
df = pd.DataFrame([
["Q1-2024", "project_a", 1],
["Q1-2024", "project_b", 1],
["Q2-2024", "project_a", 2],
["Q2-2024", "project_b", 2],
["Q3-2024", "project_a", 4],
["Q3-2024", "project_b", 3],
["Q4-2024", "project_a", 8],
["Q4-2024", "project_b", 4],
["Q5-2025", "project_a", 16],
["Q5-2025", "project_b", 5],
], columns=["quarter", "project", "github_stars"])
圖表翻譯:
此表格展示了兩個GitHub專案在不同季度獲得的星數變化。
使用Seaborn繪製長條圖和折線圖
Seaborn提供了sns.barplot
和sns.lineplot
函式,可以輕鬆繪製長條圖和折線圖。與Pandas的.plot
方法不同,Seaborn需要明確指定x軸、y軸和顏色分類別(hue):
sns.barplot(df, x="quarter", y="github_stars", hue="project")
sns.lineplot(df, x="quarter", y="github_stars", hue="project")
內容解密:
這兩行程式碼分別用於繪製長條圖和折線圖。x
、y
和hue
引數定義了資料的視覺化方式。與Pandas的.plot
方法相比,Seaborn的API更具靈活性,能夠直接處理長格式的資料。
資料格式的比較:長格式與寬格式
Seaborn要求資料以長格式(long form)呈現,而Pandas的.plot
方法通常使用寬格式(wide form)。以下展示了兩種格式的差異:
# 長格式(Seaborn適用)
quarter project github_stars
0 Q1-2024 project_a 1
1 Q1-2024 project_b 1
2 Q2-2024 project_a 2
# 寬格式(Pandas適用)
project_a project_b
Q1-2024 1 1
Q2-2024 2 2
圖表翻譯:
此圖表展示了長格式和寬格式資料的結構差異。
進階視覺化:箱型圖與小提琴圖
Seaborn提供了多種進階視覺化工具,例如箱型圖(boxplot)和小提琴圖(violinplot)。這些圖表能夠幫助我們更深入地理解資料的分佈情況。
# 使用電影資料集
df = pd.read_csv("data/movie.csv", usecols=["movie_title", "title_year", "imdb_score", "content_rating"], dtype_backend="numpy_nullable")
df = df.assign(title_decade=pd.cut(df["title_year"], bins=range(1910, 2021, 10)))
# 繪製箱型圖
sns.boxplot(data=df, x="imdb_score", y="title_decade")
# 繪製小提琴圖
sns.violinplot(data=df, x="imdb_score", y="title_decade")
內容解密:
箱型圖用於展示不同年代電影評分的分佈情況,而小提琴圖則結合了箱型圖和KDE圖的特點,能夠更詳細地展示資料的分佈特徵。從這些圖表中,我們可以觀察到電影評分隨時間變化的趨勢。
Mermaid圖表展示視覺化流程
flowchart TD A[資料準備] --> B{資料清理} B -->|是| C[資料轉換] B -->|否| D[回報錯誤] C --> E[視覺化繪圖] E --> F[結果分析]
圖表翻譯:
此圖表展示了資料視覺化的流程。首先進行資料準備,接著進行資料清理。如果資料需要轉換,則進入資料轉換階段;如果資料有誤,則回報錯誤。完成資料處理後,進行視覺化繪圖,最後進行結果分析。
資料視覺化與深入分析
在前面的章節中,我們已經探討瞭如何使用不同的視覺化工具來呈現電影評分的分佈情況。現在,讓我們進一步深入分析這些資料,並嘗試回答一些更複雜的問題。
使用蜂群圖進行更深入的分析
雖然小提琴圖(violin plot)能夠呈現資料的分佈情況,但我們仍然難以分辨每個年代的評分數量。為瞭解決這個問題,我們可以使用蜂群圖(swarm plot),它能夠根據資料的密集程度來調整點的位置,從而更直觀地呈現資料的分佈。
sns.swarmplot(
data=df,
x="imdb_score",
y="title_decade",
size=.25,
)
圖表翻譯:
此圖示展示了電影評分在不同年代的分佈情況。從圖中可以看出,大部分的評分集中在1990年之後的電影,尤其是2000-2010年之間的電影。早於1990年的電影評分相對較少,在圖中幾乎難以辨識。
進一步分析不同型別的電影
現在,我們已經發現電影評分隨著時間的推移呈現下降趨勢。接下來,我們想要探討不同型別的電影是否具有不同的評分趨勢。例如,PG-13級別的電影是否比R級別的電影表現更好?
為了回答這個問題,我們需要對資料進行進一步的清理和篩選。首先,我們篩選出2013年至2015年之間的電影,並且只保留具有特定評級(G、PG、PG-13、R)的電影。然後,我們將title_year
欄位轉換為分類別資料型別,以便視覺化工具能夠正確地處理這些資料。
ratings_of_interest = {"G", "PG", "PG-13", "R"}
mask = (
(df["title_year"] >= 2013)
& (df["title_year"] <= 2015)
& (df["content_rating"].isin(ratings_of_interest))
)
data = df[mask].assign(
title_year=lambda x: x["title_year"].astype(pd.CategoricalDtype())
)
使用顏色區分不同評級的電影
現在,我們可以在蜂群圖中使用不同的顏色來代表不同評級的電影,從而進一步分析不同評級之間的差異。
sns.swarmplot(
data=data,
x="imdb_score",
y="title_year",
hue="content_rating",
)
圖表翻譯:
此圖示展示了2013年至2015年之間不同評級電影的評分分佈情況。從圖中可以看出,PG-13級別的電影在2013年時有較多的高評分電影,而R級別的電影則在2013年時有較多的高評分電影,但隨著時間的推移,評分逐漸下降。
使用多個子圖進行比較
為了進一步提高視覺化的清晰度,我們可以使用sns.catplot
函式來建立多個子圖,每個子圖代表一個特定的評級。
sns.catplot(
kind="swarm",
data=data,
x="imdb_score",
y="title_year",
col="content_rating",
col_wrap=2,
)
圖表翻譯:
此圖示展示了不同評級電影在2013年至2015年之間的評分分佈情況。從圖中可以看出,2013年似乎是電影的豐收年,尤其是PG-13級別的電影,在該年度有較多的高評分電影。
資料重塑與轉換
在實際的資料分析工作中,我們經常需要對資料進行重塑和轉換,以便更好地滿足分析需求。Pandas提供了豐富的功能來幫助我們完成這項任務。
常見的資料重塑方法
Pandas提供了多種方法來重塑和轉換資料,包括:
- 使用
pd.concat
進行資料拼接 - 使用
pd.merge
進行資料合併 - 使用
pd.DataFrame.join
進行資料連線 - 使用
pd.DataFrame.stack
和pd.DataFrame.unstack
進行資料重塑 - 使用
pd.DataFrame.melt
進行資料重塑 - 使用
pd.wide_to_long
進行資料重塑 - 使用
pd.DataFrame.pivot
和pd.pivot_table
進行資料透視 - 使用
pd.DataFrame.explode
進行資料展開 - 使用
pd.DataFrame.T
進行資料轉置
資料重塑的實際應用
在實際的資料分析工作中,資料重塑是一項非常重要的技能。透過使用Pandas提供的豐富功能,我們可以輕鬆地將資料轉換為適合分析的形式,從而更好地滿足業務需求。
flowchart TD A[資料清理] --> B[資料轉換] B --> C[資料重塑] C --> D[資料分析] D --> E[結果呈現]
圖表翻譯:
此圖示展示了資料分析的一般流程。從圖中可以看出,資料清理、轉換和重塑是資料分析的重要前置步驟,而資料分析的結果最終需要以清晰、直觀的方式呈現出來。
# 示範程式碼:使用pd.merge進行資料合併
import pandas as pd
# 建立兩個DataFrame
df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value1': [1, 2, 3]})
df2 = pd.DataFrame({'key': ['A', 'B', 'D'], 'value2': [4, 5, 6]})
# 使用pd.merge進行資料合併
merged_df = pd.merge(df1, df2, on='key', how='inner')
print(merged_df)
內容解密:
此程式碼示範瞭如何使用pd.merge
函式來合併兩個DataFrame。程式碼首先建立了兩個DataFrame,分別為df1
和df2
,然後使用pd.merge
函式根據共同的key
欄位進行內連線(inner join)。最終輸出的merged_df
包含了兩個DataFrame中共有的key
值對應的資料。
資料框架重塑:串接與合併技術深度解析
在資料分析與處理過程中,資料框架(DataFrame)的重塑是一項至關重要的技術操作。其中,串接(Concatenation)與合併(Merging)是兩種最常見的資料重塑方式。本文將深入探討這兩種技術的實務應用、實作方法及相關注意事項。
資料框架串接技術詳解
串接操作是指將多個資料框架物件沿著特定軸向進行堆積疊的過程。在 pandas 函式庫中,這種操作主要透過 pd.concat()
函式實作。串接操作可分為垂直串接和水平串接兩種模式:
- 垂直串接:將多個資料框架沿著縱軸(index軸)堆積疊起來,形成新的資料框架。
- 水平串接:將多個資料框架沿著橫軸(columns軸)並排組合,形成新的資料框架。
實作範例:不同季度股票資料串接
import pandas as pd
# 建立第一季度股票資料
df_q1 = pd.DataFrame([
["AAPL", 100., 50., 75.],
["MSFT", 80., 42., 62.],
["AMZN", 60., 100., 120.],
], columns=["股票程式碼", "持有股數", "最低價", "最高價"])
# 建立第二季度股票資料
df_q2 = pd.DataFrame([
["AAPL", 80., 70., 80., 77.],
["MSFT", 90., 50., 60., 55.],
["IBM", 100., 60., 70., 64.],
["GE", 42., 30., 50., 44.],
], columns=["股票程式碼", "持有股數", "最低價", "最高價", "收盤價"])
# 垂直串接兩個資料框架
result = pd.concat([df_q1, df_q2], keys=["Q1", "Q2"])
print(result)
內容解讀:
- 本範例展示瞭如何將兩個不同結構的股票資料框架進行垂直串接。
pd.concat()
函式自動處理欄位不完全匹配的情況,對缺失欄位填入 NaN 值。- 使用
keys
引數可為來源資料集新增標識,以便追蹤資料來源。
資料框架合併技術詳解
資料框架合併是另一種常見的資料重塑方式,主要用於根據特定鍵值將不同資料集中的相關資訊合併在一起。在 pandas 中,這種操作主要透過 pd.merge()
函式實作。
合併操作型別
- 內連線(Inner Join):只保留兩個資料集中鍵值匹配的記錄。
- 左連線(Left Join):保留左側資料集的所有記錄,並將右側資料集的匹配記錄合併進來。
- 右連線(Right Join):與左連線相反,保留右側資料集的所有記錄。
- 外連線(Outer Join):保留兩個資料集中的所有記錄。
實作範例:股票資料合併
# 建立持有股數資料
df_shares = pd.DataFrame([
["AAPL", 100],
["MSFT", 80],
["AMZN", 60],
], columns=["股票程式碼", "持有股數"])
# 建立股價資料
df_prices = pd.DataFrame([
["AAPL", 75., 80.],
["MSFT", 62., 55.],
["IBM", 120., 64.],
], columns=["股票程式碼", "最高價", "收盤價"])
# 根據股票程式碼進行內連接合併
result = pd.merge(df_shares, df_prices, on="股票程式碼")
print(result)
內容解讀:
- 本範例展示瞭如何根據股票程式碼將持有股數資料與股價資料進行合併。
pd.merge()
函式根據指定的on
引數(本例中為 “股票程式碼”)進行資料匹配。- 合併結果只包含兩個資料集中股票程式碼都存在的記錄。
效能最佳化建議
- 預先處理資料結構:在進行大規模資料串接或合併前,確保資料集已按鍵值排序,可顯著提升效能。
- 使用適當的資料結構:對於重複進行的串接操作,建議先將資料存入列表,最後再一次性進行串接,可避免多次記憶體重新分配的效能損耗。
- 選擇適當的合併策略:根據實際資料特性和業務需求,選擇最合適的合併方式。
Mermaid 圖表:資料框架操作流程
flowchart TD A[原始資料匯入] --> B{資料清理} B -->|成功| C[資料轉換] B -->|失敗| D[錯誤處理] C --> E[資料串接/合併] E --> F[結果輸出] D --> F
圖表解讀:
此圖展示了資料框架處理的一般流程:
- 從原始資料匯入開始
- 進行資料清理,若失敗則進入錯誤處理流程
- 資料清理成功後進行必要的資料轉換
- 將處理好的資料進行串接或合併操作
- 最終輸出處理結果