Pandas 提供了便捷的資料視覺化功能,讓資料分析師能快速地將資料轉化為圖表,以便理解資料特性、識別異常值和進行探索性分析。利用 pd.Series.plot
和 pd.DataFrame.plot
,可以輕鬆建立各種圖表,例如線圖、長條圖、區域圖和圓餅圖等,並透過引數調整顏色、標題、軸標籤等細節。此外,Pandas 也支援更進階的資料分佈視覺化,例如直方圖和核密度估計圖,幫助分析師深入理解資料的分佈特性。除了 Pandas 之外,文章也介紹瞭如何結合 Seaborn 和 Matplotlib 進行更進階的視覺化操作,例如自訂圖表佈局、控制圖表元素,以及建立更具互動性和資訊量的散佈圖等。
資料視覺化:探索性資料分析與呈現的關鍵
資料視覺化是資料分析過程中不可或缺的一環,無論是在探索性資料分析、報告呈現還是應用程式開發中都扮演著至關重要的角色。在探索性資料分析階段,視覺化幫助分析師快速理解資料特性、識別異常值和缺失資料,同時引發進一步的分析需求。與此同時,在正式的報告或應用程式中,視覺化則需要更為精緻的呈現,以有效傳達資料內涵給閱聽者。
從聚合資料建立圖表
Pandas 函式庫提供了便捷的資料視覺化功能,透過 pd.Series.plot
和 pd.DataFrame.plot
方法,可以快速生成多種圖表。以下將介紹如何利用這些方法建立基本的線圖、長條圖、區域圖和圓餅圖。
建立範例資料
首先,我們建立一個簡單的 pd.Series
物件來展示七天內的書籍銷售量:
import pandas as pd
import matplotlib.pyplot as plt
ser = pd.Series(
(x ** 2 for x in range(7)),
name="book_sales",
index=(f"Day {x + 1}" for x in range(7)),
dtype=pd.Int64Dtype(),
)
print(ser)
輸出結果:
Day 1 0
Day 2 1
Day 3 4
Day 4 9
Day 5 16
Day 6 25
Day 7 36
Name: book_sales, dtype: Int64
繪製不同型別的圖表
預設情況下,pd.Series.plot()
方法會繪製線圖:
ser.plot()
plt.show()
若要繪製長條圖,可以透過 kind="bar"
引數指定:
ser.plot(kind="bar")
plt.show()
同樣地,可以繪製水平長條圖:
ser.plot(kind="barh")
plt.show()
區域圖則是線圖的變體,會填滿線下的區域:
ser.plot(kind="area")
plt.show()
最後,圓餅圖可以用於展示各類別的比例:
ser.plot(kind="pie")
plt.show()
圖表翻譯:
上述程式碼範例展示瞭如何使用 Pandas 的 plot
方法繪製不同型別的圖表。每種圖表都有其特定的應用場景,例如線圖適合展示連續資料的趨勢,長條圖則適合比較不同類別之間的差異。區域圖可以視覺化累積總和,而圓餅圖則用於展示各部分佔整體的比例。
使用 DataFrame 繪製圖表
當資料儲存在 pd.DataFrame
中時,繪圖方法依然適用,但可能需要額外的引數來客製化圖表。以下範例展示瞭如何繪製包含書籍銷售量和退貨量的 DataFrame 圖表:
df = pd.DataFrame({
"book_sales": (x ** 2 for x in range(7)),
"book_returns": [3, 2, 1, 0, 1, 2, 3],
}, index=(f"Day {x + 1}" for x in range(7)))
print(df)
df.plot()
plt.show()
df.plot(kind="bar")
plt.show()
df.plot(kind="bar", stacked=True)
plt.show()
圖表翻譯:
在 DataFrame 的繪圖範例中,我們展示瞭如何同時繪製多個欄位的資料。預設的線圖可以清晰地展示不同欄位之間的趨勢變化。長條圖則可以用於比較每天的銷售量和退貨量,而堆積疊長條圖可以進一步展示每天的總量。
資料視覺化的最佳實踐
有效的資料視覺化不僅僅是繪製圖表,更需要考慮如何清晰、準確地傳達資訊。以下是一些最佳實踐:
- 選擇適當的圖表型別:根據資料的特性和分析目標選擇合適的圖表型別。
- 保持簡潔清晰:避免過度裝飾,確保圖表清晰易懂。
- 適當使用顏色:利用顏色區分不同類別或資料系列,但避免濫用。
- 提供清晰的標籤和標題:確保圖表具有清晰的標題、軸標籤和圖例。
- 互動性:在適當的情況下,考慮使用互動式視覺化工具,以便使用者進一步探索資料。
使用 Seaborn 進行進階視覺化
除了 Pandas 自帶的繪圖功能外,Seaborn 是一個根據 Matplotlib 的視覺化函式庫,提供了更高階的介面和更具吸引力的預設樣式。以下是一個簡單的範例:
import seaborn as sns
# 載入範例資料集
tips = sns.load_dataset("tips")
# 繪製散佈圖
sns.scatterplot(x="total_bill", y="tip", data=tips)
plt.show()
圖表翻譯:
此範例展示瞭如何使用 Seaborn 繪製散佈圖,展示了顧客總消費金額與小費之間的關係。Seaborn 提供了簡潔的 API 和美觀的預設樣式,使得視覺化結果更具吸引力。
圖表翻譯:
此圖展示了資料視覺化的基本流程,從資料準備到最終的圖表呈現。每一步驟都至關重要,需要根據具體需求和資料特性進行適當的調整和最佳化。
隨著資料科學和機器學習技術的進步,資料視覺化將朝著更互動、更智慧的方向發展。未來,我們可以期待更多自動化的視覺化工具和更豐富的視覺化型別,以滿足日益增長的資料分析需求。同時,如何在視覺化的過程中保持資料的準確性和可靠性,也將是未來研究的重要方向。
flowchart LR A[資料收集] --> B[資料清理] B --> C[資料分析] C --> D[視覺化呈現] D --> E[決策支援]
圖表翻譯:
此圖展示了資料分析的整體流程,從資料收集到最終的決策支援。視覺化呈現作為其中關鍵的一環,將資料轉化為可理解的資訊,為決策者提供有力的支援。
資料視覺化技術詳解
在資料分析領域中,視覺化技術扮演著至關重要的角色。適當的視覺化方法能夠有效地揭示資料中的模式、趨勢和異常值,從而幫助分析人員深入理解資料的內在特性。本文將深入探討使用pandas進行資料視覺化的各種技術,特別是在繪製資料分佈圖方面的方法。
自定義視覺化引數
pandas的繪圖功能提供了豐富的自定義選項,使得使用者能夠根據需求調整視覺化的呈現效果。以下是一些常用的自定義引數:
標題與顏色控制
ser.plot(
kind="bar",
title="銷售資料分析",
color="seagreen",
)
在上述範例中,我們為柱狀圖設定了標題並指定了顏色。顏色可以使用RGB色碼(如#00008B)或顏色名稱(如seagreen)來表示。
軸標籤與網格控制
ser.plot(
kind="bar",
title="銷售資料分析",
color="darkgoldenrod",
grid=False,
xlabel="日期",
ylabel="銷售額",
)
透過xlabel
和ylabel
引數,我們可以自定義x軸和y軸的標籤。同時,使用grid
引數可以控制是否顯示網格線。
子圖與圖例控制
df.plot(
kind="bar",
title="產品表現分析",
grid=False,
subplots=True,
legend=False,
sharey=True,
)
當處理DataFrame物件時,可以使用subplots=True
引數為每個欄位生成獨立的子圖。同時,可以透過legend=False
隱藏圖例,並使用sharey=True
使所有子圖分享y軸刻度。
資料分佈視覺化
視覺化是理解資料分佈特性的重要手段。透過視覺化,我們可以快速判斷資料是否呈現正態分佈、是否存在偏態分佈或多峰分佈等特性。
直方圖
直方圖是觀察資料分佈的常用方法。以下範例展示瞭如何使用pandas繪製直方圖:
np.random.seed(42)
ser = pd.Series(
np.random.default_rng().normal(size=10_000),
dtype=pd.Float64Dtype(),
)
ser.plot(kind="hist", bins=50)
在繪製直方圖時,bins
引數的選擇至關重要。不同的bins
值會對視覺化結果產生顯著影響:
flowchart TD A[資料準備] --> B{選擇bins值} B -->|bins過少| C[無法準確呈現分佈] B -->|bins適中| D[清晰呈現資料分佈] B -->|bins過多| E[可能引入噪聲幹擾]
圖表翻譯:
此圖示說明瞭在繪製直方圖時選擇不同bins值的影響。適當的bins值能夠清晰地呈現資料的真實分佈,而過多或過少的bins值都可能導致誤導性的視覺效果。
核密度估計圖
相較於直方圖,核密度估計(KDE)圖提供了一種更平滑的資料分佈視覺化方法。使用KDE圖可以避免因bins選擇不當而導致的誤判:
ser.plot(kind="kde")
對於包含多個欄位的DataFrame,KDE圖同樣能夠有效地展示不同欄位之間的分佈差異:
df = pd.DataFrame({
"normal": np.random.default_rng().normal(size=10_000),
"triangular": np.random.default_rng().triangular(-2, 0, 2, size=10_000),
})
df.plot(kind="kde")
內容解密:
KDE圖透過核函式對資料點進行平滑處理,從而估計資料的機率密度函式。相較於直方圖,KDE圖不受bins劃分影響,能夠更準確地反映資料的真實分佈特徵。在實際應用中,KDE圖特別適合用於比較不同資料集之間的分佈差異。
視覺化最佳實踐
- 選擇適當的視覺化型別:根據資料特性和分析目標選擇合適的圖表型別。
- 合理設定引數:調整顏色、標籤、網格等視覺元素,以增強圖表的可讀性。
- 避免誤導性視覺化:注意避免因引數選擇不當而導致的誤導性視覺效果。
- 結合多種視覺化方法:綜合使用直方圖、KDE圖等多種視覺化手段,以全面理解資料特性。
圖表範例:視覺化流程
flowchart TD A[資料準備] --> B[選擇視覺化型別] B --> C[直方圖] B --> D[KDE圖] C --> E[調整bins引數] D --> F[觀察分佈特徵] E --> G[確認分佈特性] F --> H[深入分析資料] G --> H
圖表翻譯:
此圖示展示了資料視覺化的一般流程。首先進行資料準備,然後根據分析需求選擇適當的視覺化型別。對於直方圖,需要調整bins引數以獲得最佳視覺效果;而KDE圖則直接用於觀察資料的分佈特徵。最終,透過視覺化結果進行深入的資料分析。
使用 Matplotlib 進行進階圖表自訂
在資料視覺化的過程中,預設的圖表組態往往無法滿足所有需求。為了建立更具吸引力和資訊量的視覺化效果,我們需要進一步瞭解 Matplotlib 的相關術語和功能。在 Matplotlib 中,「figure」指的是繪圖區域,而「axes」或「subplot」則是 figure 中的特定繪圖區域。需要注意的是,「axes」是一個繪圖區域,而「axis」則是指 X 軸或 Y 軸。
設定多圖表佈局
假設我們有一組書籍銷售資料的 pd.Series
,並希望在同一個 figure 中以三種不同的方式呈現:折線圖、長條圖和圓餅圖。首先,我們需要呼叫 plt.subplots(nrows=1, ncols=3)
來設定繪圖區域的佈局,指定所需的行數和列數。這個函式會回傳一個包含 figure 和各個 Axes 物件的二元組,我們可以將其解封裝為 fig
和 axes
兩個變數。
import matplotlib.pyplot as plt
import pandas as pd
# 建立範例資料
ser = pd.Series(
(x ** 2 for x in range(7)),
name="book_sales",
index=(f"Day {x + 1}" for x in range(7)),
dtype=pd.Int64Dtype(),
)
# 建立子圖表
fig, axes = plt.subplots(nrows=1, ncols=3)
# 在不同的子圖表中繪製不同型別的圖表
ser.plot(ax=axes[0])
ser.plot(kind="bar", ax=axes[1])
ser.plot(kind="pie", ax=axes[2])
圖表翻譯:
此圖示展示瞭如何在同一個 figure 中建立多個子圖表。預設情況下,Matplotlib 會為每個子圖表分配相同的大小,這可能導致某些圖表(如長條圖或折線圖)過於狹長,或在圓餅圖周圍產生過多的空白區域。
使用 GridSpec 自訂複雜佈局
為了更精細地控制圖表的佈局,我們可以使用 Matplotlib 的 GridSpec
來建立一個 2x2 的網格佈局。這樣,我們可以將長條圖和折線圖並排放置,而圓餅圖則佔據整個第二行。
from matplotlib.gridspec import GridSpec
# 建立 figure 和 GridSpec 物件
fig = plt.figure()
gs = GridSpec(2, 2, figure=fig)
# 在指定的網格位置建立子圖表
ax0 = fig.add_subplot(gs[0, 0])
ax1 = fig.add_subplot(gs[0, 1])
ax2 = fig.add_subplot(gs[1, :])
# 在子圖表中繪製不同型別的圖表
ser.plot(ax=ax0)
ser.plot(kind="bar", ax=ax1)
ser.plot(kind="pie", ax=ax2)
圖表翻譯:
此圖示展示瞭如何使用 GridSpec
來建立更複雜的佈局。透過將圖表放置在不同的網格區域,我們可以更有效地利用空間,並避免標籤重疊等問題。
進一步自訂圖表元素
除了控制圖表的佈局外,我們還可以進一步自訂各個圖表的元素,例如標題、標籤、圖例等。
# 設定 figure 的標題
fig.suptitle("Book Sales Visualized in Different Ways")
# 自訂各個子圖表的屬性
ax0 = ser.plot(ax=ax0)
ax0.set_title("Line chart")
ax1 = ser.plot(kind="bar", ax=ax1)
ax1.set_title("Bar chart")
ax1.set_xticklabels(ax1.get_xticklabels(), rotation=45)
ax2 = ser.plot(kind="pie", ax=ax2, labels=None)
ax2.legend(
ser.index,
bbox_to_anchor=(1, -0.2, 0.5, 1), # 將圖例放置在圖表右側
prop={"size": 6}, # 設定圖例字型大小
)
ax2.set_title("Pie Chart")
ax2.set_ylabel(None) # 移除 Y 軸標籤
圖表翻譯:
此圖示展示瞭如何自訂各個圖表的元素,包括標題、標籤和圖例。透過這些自訂,我們可以使圖表更具資訊量和視覺吸引力。
探索散佈圖
散佈圖是一種非常強大的視覺化工具,可以幫助我們瞭解兩個變數之間的關係、測量個別資料點的規模,甚至觀察這些關係和規模在不同類別中的變化。有效地使用散佈圖代表了一種重要的分析能力提升。
建立散佈圖
散佈圖需要至少兩個變數,因此只能使用 pd.DataFrame
建立,而不能使用 pd.Series
。假設我們有一個包含四個不同欄位的 pd.DataFrame
,其中三個是連續變數,第四個是用於分類別的顏色變數。
# 建立範例資料
df = pd.DataFrame({
"var_a": [1, 2, 3, 4, 5],
"var_b": [1, 2, 4, 8, 16],
"var_c": [500, 200, 600, 100, 400],
"var_d": ["blue", "orange", "gray", "blue", "gray"],
})
# 建立散佈圖
df.plot(
kind="scatter",
x="var_a",
y="var_b",
s="var_c", # 資料點大小
c="var_d", # 資料點顏色
)
圖表翻譯:
此圖示展示瞭如何建立一個簡單的散佈圖,並透過不同的變數控制資料點的位置、大小和顏色。透過這種方式,我們可以在一個圖表中呈現多個維度的資訊。
使用真實資料集
讓我們使用美國能源部發布的年度報告資料集,該資料集包含了在美國銷售的車輛的測試資料。我們可以讀取其中幾個感興趣的欄位,例如 city08
(城市裡程數)、highway08
(高速公路里程數)、VClass
(車輛類別)、fuelCost08
(年度燃料成本)和 modelYear
(車輛型號年份)。
flowchart TD A[讀取資料集] --> B[選擇感興趣的欄位] B --> C[建立散佈圖] C --> D[分析資料]
圖表翻譯:
此圖示展示了使用真實資料集建立散佈圖的流程。透過選擇感興趣的欄位並建立散佈圖,我們可以更深入地瞭解資料之間的關係。