Pandas 提供了便捷的資料視覺化功能,讓資料分析師能快速地將資料轉化為圖表,以便理解資料特性、識別異常值和進行探索性分析。利用 pd.Series.plotpd.DataFrame.plot,可以輕鬆建立各種圖表,例如線圖、長條圖、區域圖和圓餅圖等,並透過引數調整顏色、標題、軸標籤等細節。此外,Pandas 也支援更進階的資料分佈視覺化,例如直方圖和核密度估計圖,幫助分析師深入理解資料的分佈特性。除了 Pandas 之外,文章也介紹瞭如何結合 Seaborn 和 Matplotlib 進行更進階的視覺化操作,例如自訂圖表佈局、控制圖表元素,以及建立更具互動性和資訊量的散佈圖等。

資料視覺化:探索性資料分析與呈現的關鍵

資料視覺化是資料分析過程中不可或缺的一環,無論是在探索性資料分析、報告呈現還是應用程式開發中都扮演著至關重要的角色。在探索性資料分析階段,視覺化幫助分析師快速理解資料特性、識別異常值和缺失資料,同時引發進一步的分析需求。與此同時,在正式的報告或應用程式中,視覺化則需要更為精緻的呈現,以有效傳達資料內涵給閱聽者。

從聚合資料建立圖表

Pandas 函式庫提供了便捷的資料視覺化功能,透過 pd.Series.plotpd.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 的繪圖範例中,我們展示瞭如何同時繪製多個欄位的資料。預設的線圖可以清晰地展示不同欄位之間的趨勢變化。長條圖則可以用於比較每天的銷售量和退貨量,而堆積疊長條圖可以進一步展示每天的總量。

資料視覺化的最佳實踐

有效的資料視覺化不僅僅是繪製圖表,更需要考慮如何清晰、準確地傳達資訊。以下是一些最佳實踐:

  1. 選擇適當的圖表型別:根據資料的特性和分析目標選擇合適的圖表型別。
  2. 保持簡潔清晰:避免過度裝飾,確保圖表清晰易懂。
  3. 適當使用顏色:利用顏色區分不同類別或資料系列,但避免濫用。
  4. 提供清晰的標籤和標題:確保圖表具有清晰的標題、軸標籤和圖例。
  5. 互動性:在適當的情況下,考慮使用互動式視覺化工具,以便使用者進一步探索資料。

使用 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="銷售額",
)

透過xlabelylabel引數,我們可以自定義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圖特別適合用於比較不同資料集之間的分佈差異。

視覺化最佳實踐

  1. 選擇適當的視覺化型別:根據資料特性和分析目標選擇合適的圖表型別。
  2. 合理設定引數:調整顏色、標籤、網格等視覺元素,以增強圖表的可讀性。
  3. 避免誤導性視覺化:注意避免因引數選擇不當而導致的誤導性視覺效果。
  4. 結合多種視覺化方法:綜合使用直方圖、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 物件的二元組,我們可以將其解封裝為 figaxes 兩個變數。

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[分析資料]

圖表翻譯:

此圖示展示了使用真實資料集建立散佈圖的流程。透過選擇感興趣的欄位並建立散佈圖,我們可以更深入地瞭解資料之間的關係。