當前位置:
首頁 > 最新 > 教你實現數據集多維可視化

教你實現數據集多維可視化

翻譯:張媛

校對:盧苗苗

本文共8269字,建議閱讀10分鐘。

用代碼將你的數據集進行多維可視化!

介紹

描述性分析是與數據科學或特定研究相關的任何分析生命周期中的核心組成部分之一。數據聚合,匯總與可視化是支撐數據分析這一領域的主要支柱。從傳統商業智能時代開始,即使在如今的人工智慧時代,數據可視化一直是一種強大的工具,由於其能夠有效地抽象出正確的信息,清晰直觀地理解和解釋數據結果而被很多組織廣泛地採用。然而處理通常具有兩個以上屬性的數據集時開始出現問題,因為數據分析和通信的媒介一般局限於兩個維度。在本文中,我們將探討多維數據可視化過程中的一些有效策略。

動機

「一圖勝千言。」

這是我們很熟悉的非常流行的一句話,也是我們將理解和利用數據可視化作為數據分析的有效工具的巨大靈感和動力。永遠記住「有效的數據可視化是一門藝術,也是一門科學」。在開始之前,我還想引用一句話,這句話不僅與本文相關,還強調了數據化的必要性。

「一張圖最大的價值在於它使我們注意到我們沒有預料到的東西。」

— John Tukey

數據可視化快速回顧

本文假設一般讀者都知道用於繪圖和數據可視化的基本圖表知識,因此這裡不會對此進行詳細解釋,但是我們將在接下來的操作實驗中覆蓋其大部分內容。就像著名的可視化先驅和統計學家Edward Tufte提到的那樣,數據可視化應該以數據為基礎進行「清晰,精確,高效」的模式和見解交流。

結構化數據通常包括由行表示的數據觀察值和由列表示的數據屬性或特徵。每一列也可以稱為數據集的特定維度。最常見的數據類型包括連續的數值數據和離散的分類數據,因此任何數據可視化基本上以直方圖,散點圖,箱型圖等簡單易懂的方式來描述一個或多個數據屬性。接下來的介紹將涵蓋單變數(一維)和多變數(多維)的數據可視化策略,我們將在這裡使用Python機器學習生態系統,並建議您檢查進行數據分析和可視化的應用框架,包括pandas, matplotlib, seaborn, plotly 和 bokeh等工具。另外,如果您對使用數據製作出精美而有意義的可視化結果感興趣,那麼了解D3.js也是必須的。有興趣的讀者建議您可以閱讀EdwardTufte的『 The Visual Display ofQuantitative Information』一書。

空談無益,請看可視化的代碼實現!

讓我們開始吧,停止喋喋不休地談論理論和概念。我們將使用UCI機器學習庫提供的葡萄酒質量數據集。這些數據實際上包含兩個數據集,分別描述了葡萄牙「Vinho Verde」葡萄酒中紅色和白色變種的多種屬性。本文中的所有分析都可以在我的GitHub庫Jupyter Notebook文檔中找到,您可以盡情嘗試!

首先我們將載入以下依賴項,以便進行後續的數據分析。

import pandas as pd

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

import matplotlib as mpl

import numpy as np

import seaborn as sns

%matplotlib inline

我們將主要使用matplotlib和 seaborn作為可視化框架,您也可以自由選擇任何其他的框架進行同樣的嘗試。經過一些基本的數據預處理步驟後,我們來看看數據。

white_wine = pd.read_csv("winequality-white.csv", sep=";")

red_wine = pd.read_csv("winequality-red.csv", sep=";")

# store wine type as an attribute

red_wine["wine_type"] = "red"

white_wine["wine_type"] = "white"

# bucket wine quality scores into qualitative quality labels

red_wine["quality_label"] = red_wine["quality"].apply(lambda value: "low"

if value

if value

red_wine["quality_label"] = pd.Categorical(red_wine["quality_label"],

categories=["low", "medium", "high"])

white_wine["quality_label"] = white_wine["quality"].apply(lambda value: "low"

if value

if value

white_wine["quality_label"] = pd.Categorical(white_wine["quality_label"],

categories=["low", "medium", "high"])

# merge red and white wine datasets

wines = pd.concat([red_wine, white_wine])

# re-shuffle records just to randomize data points

wines = wines.sample(frac=1, random_state=42).reset_index(drop=True)

我們通過合併與紅白葡萄酒相關的數據集來創建一個單一的葡萄酒數據框架。我們還根據葡萄酒的樣品質量屬性創建了一個類別變數quality_label,接下來我們看一下數據。

wines.head()

The wine quality dataset

很顯然,我們有幾個葡萄酒樣本的數字和分類屬性,每個觀察值都屬於一個紅白葡萄酒樣本,其屬性是從物理和化學試驗中測量和獲得的特定數值。如果您想了解每個屬性的詳細解釋,可以查看我的Jupyter筆記,但這些名稱的意思是不言而喻的。接下來讓我們對這些感興趣的屬性做一個快速的基本描述性統計。

subset_attributes = ["residual sugar", "total sulfur dioxide", "sulphates",

"alcohol", "volatile acidity", "quality"]

rs = round(red_wine[subset_attributes].describe(),2)

ws = round(white_wine[subset_attributes].describe(),2)

pd.concat([rs, ws], axis=1, keys=["Red Wine Statistics", "White Wine Statistics"])

葡萄酒類型的基本描述性統計

比較這些不同類型的葡萄酒樣本的統計方法是非常容易的,要注意一些屬性的明顯差異,稍後我們將在具體的可視化過程中體現這些內容。

單變數分析

單變數分析基本上是數據分析或可視化的最簡單的形式,我們只需要關心和分析一個數據屬性或者變數,對一維數據進行可視化。

一維數據可視化

對所有數字數據及其分布進行可視化的最快速最有效的方法之一是利用工具pandas中的直方圖。

wines.hist(bins=15,color="steelblue", edgecolor="black", linewidth=1.0,

xlabelsize=8, ylabelsize=8,grid=False)

plt.tight_layout(rect=(0,0, 1.2, 1.2))

將屬性值作為一維數據進行可視化處理

上面的圖給出了一個將任何屬性的基本數據分布進行可視化的好想法。

接下來讓我們深入了解一個連續型數值屬性。本質上來講,直方圖或者密度圖就可以很好地理解該屬性的數據分布。

# Histogram

fig = plt.figure(figsize = (6,4))

title = fig.suptitle("Sulphates Content in Wine", fontsize=14)

fig.subplots_adjust(top=0.85, wspace=0.3)

ax = fig.add_subplot(1,1, 1)

ax.set_xlabel("Sulphates")

ax.set_ylabel("Frequency")

ax.text(1.2, 800, r"$mu$="+str(round(wines["sulphates"].mean(),2)),

fontsize=12)

freq, bins, patches = ax.hist(wines["sulphates"], color="steelblue", bins=15,

edgecolor="black", linewidth=1)

# Density Plot

fig = plt.figure(figsize = (6, 4))

title = fig.suptitle("Sulphates Content in Wine", fontsize=14)

fig.subplots_adjust(top=0.85, wspace=0.3)

ax1 = fig.add_subplot(1,1, 1)

ax1.set_xlabel("Sulphates")

ax1.set_ylabel("Frequency")

sns.kdeplot(wines["sulphates"], ax=ax1, shade=True, color="steelblue")

對一維連續數字類型的數據進行可視化

從上面的圖表可以很明顯地看出,葡萄酒硫酸鹽的分布存在明確的右偏。

可視化一個離散分類型數據屬性稍有不同,條形圖是最有效的方法之一。你也可以使用餅圖,但通常盡量避免使用這種形式,尤其是不同類別的數量超過3個時。

# Histogram

fig = plt.figure(figsize = (6,4))

title = fig.suptitle("Sulphates Content in Wine", fontsize=14)

fig.subplots_adjust(top=0.85, wspace=0.3)

ax = fig.add_subplot(1,1, 1)

ax.set_xlabel("Sulphates")

ax.set_ylabel("Frequency")

ax.text(1.2, 800, r"$mu$="+str(round(wines["sulphates"].mean(),2)),

fontsize=12)

freq, bins, patches = ax.hist(wines["sulphates"], color="steelblue", bins=15,

edgecolor="black", linewidth=1)

# Density Plot

fig = plt.figure(figsize = (6, 4))

title = fig.suptitle("Sulphates Content in Wine", fontsize=14)

fig.subplots_adjust(top=0.85, wspace=0.3)

ax1 = fig.add_subplot(1,1, 1)

ax1.set_xlabel("Sulphates")

ax1.set_ylabel("Frequency")

sns.kdeplot(wines["sulphates"], ax=ax1, shade=True, color="steelblue")

對一維離散分類的數據進行可視化

接下來我們來看高維數據的可視化。

多變數分析

多變數分析是一種趣味和複雜性並存的分析方法,接下來我們將分析多個數據維度或者屬性(2個或以上),不僅包括檢查數據分布,還包括這些屬性之間的潛在關係、模式和相關性。如果有必要的話,您也可以根據需要解決的問題,利用推理統計和假設檢驗,檢查不同屬性、群體等的統計意義。

二維數據可視化

研究不同數據屬性之間的潛在關係或相關性的最佳方法之一是利用成對相關矩陣並將其描述為一個熱圖。

# Correlation Matrix Heatmap

f, ax = plt.subplots(figsize=(10, 6))

corr = wines.corr()

hm = sns.heatmap(round(corr,2), annot=True, ax=ax, cmap="coolwarm",fmt=".2f",

linewidths=.05)

f.subplots_adjust(top=0.93)

t= f.suptitle("Wine Attributes Correlation Heatmap", fontsize=14)

用相關熱圖對二維數據可視化

您可以清楚地看到,熱圖中的梯度根據相關性的強弱而變化,很容易發現那些彼此之間具有強相關性的潛在屬性。另一種可視化的方法是對您感興趣的屬性使用成對散點圖。

# Correlation Matrix Heatmap

f, ax = plt.subplots(figsize=(10, 6))

corr = wines.corr()

hm = sns.heatmap(round(corr,2), annot=True, ax=ax, cmap="coolwarm",fmt=".2f",

linewidths=.05)

f.subplots_adjust(top=0.93)

t= f.suptitle("Wine Attributes Correlation Heatmap", fontsize=14)

用成對散點圖對二維數據進行可視化

根據上圖,您可以看到散點圖也是一種觀察二維數據屬性之間潛在關係的好方法。另一種將多個屬性的多變數數據可視化的方法是使用平行坐標。

# Correlation Matrix Heatmap

f, ax = plt.subplots(figsize=(10, 6))

corr = wines.corr()

hm = sns.heatmap(round(corr,2), annot=True, ax=ax, cmap="coolwarm",fmt=".2f",

linewidths=.05)

f.subplots_adjust(top=0.93)

t= f.suptitle("Wine Attributes Correlation Heatmap", fontsize=14)

使用平行坐標對多維數據進行可視化

基本上來講,在上圖所示的可視化中,點被表示為連接的線段,每條垂直線代表一個數據屬性,所有屬性中的一組完整連接的線段表示一個數據點。因此趨於同一類的點將會更加接近。僅僅通過觀察就可以很清楚地看到,與白葡萄酒相比,紅葡萄酒的密度稍微高一點。此外,與紅葡萄酒相比,白葡萄酒的殘餘糖分和二氧化硫總量較高,但同時紅葡萄酒的固定酸度高於白葡萄酒。您也可以從之前的統計表中查看數據來驗證這個結論。

讓我們來看看一些可以對兩個連續的數字屬性進行可視化的方法。特別是散點圖和聯合圖,他們不僅是檢查數據模式和相關性的好方法,而且還可以查看各個屬性的分布。

# Scatter Plot

plt.scatter(wines["sulphates"], wines["alcohol"],

alpha=0.4, edgecolors="w")

plt.xlabel("Sulphates")

plt.ylabel("Alcohol")

plt.title("Wine Sulphates - Alcohol Content",y=1.05)

# Joint Plot

jp = sns.jointplot(x="sulphates", y="alcohol", data=wines,

kind="reg", space=0, size=5, ratio=4)

使用散點圖和聯合圖可視化二維連續數字數據

如上圖所示,左邊是散點圖,右邊是聯合圖,就像我們提到的那樣,你可以在聯合圖中查看數據的相關性,關係以及個體分布。

那麼如何對兩個離散的分類屬性進行可視化呢?一種方法是利用單獨的塊(子圖)或切面作為分類維度之一。

# Using subplots or facets along with Bar Plots

fig = plt.figure(figsize = (10, 4))

title = fig.suptitle("Wine Type - Quality", fontsize=14)

fig.subplots_adjust(top=0.85, wspace=0.3)

# red wine - wine quality

ax1 = fig.add_subplot(1,2, 1)

ax1.set_title("Red Wine")

ax1.set_xlabel("Quality")

ax1.set_ylabel("Frequency")

rw_q = red_wine["quality"].value_counts()

rw_q = (list(rw_q.index), list(rw_q.values))

ax1.set_ylim([0, 2500])

ax1.tick_params(axis="both", which="major", labelsize=8.5)

bar1 = ax1.bar(rw_q[0], rw_q[1], color="red",

edgecolor="black", linewidth=1)

# white wine - wine quality

ax2 = fig.add_subplot(1,2, 2)

ax2.set_title("White Wine")

ax2.set_xlabel("Quality")

ax2.set_ylabel("Frequency")

ww_q = white_wine["quality"].value_counts()

ww_q = (list(ww_q.index), list(ww_q.values))

ax2.set_ylim([0, 2500])

ax2.tick_params(axis="both", which="major", labelsize=8.5)

bar2 = ax2.bar(ww_q[0], ww_q[1], color="white",

edgecolor="black", linewidth=1)

使用條形圖和子圖(切面)可視化二維離散分類數據,

雖然這是一種很好的對分類數據進行可視化的方法,但正如您所看到的,使用matplotlib編程導致代碼量很大。 另一個好方法是在單個圖中使用堆疊條或多個條來表示不同的屬性,通過seaborn我們可以很容易地實現這個目標。

# Multi-bar Plot

cp = sns.countplot(x="quality", hue="wine_type", data=wines,

palette={"red": "#FF9999", "white": "#FFE888"})

在一個條形圖中可視化二維離散的分類數據

這個方法看起來更簡潔一些,你也可以很容易地從單一的圖中比較不同的類別。

讓我們看看在二維(基本上是數字和分類在一起)混合屬性的可視化。 一種方法是將子圖或切面與一般的直方圖或密度圖一起使用。

# facets with histograms

fig = plt.figure(figsize = (10,4))

title = fig.suptitle("Sulphates Content in Wine", fontsize=14)

fig.subplots_adjust(top=0.85, wspace=0.3)

ax1 = fig.add_subplot(1,2, 1)

ax1.set_title("Red Wine")

ax1.set_xlabel("Sulphates")

ax1.set_ylabel("Frequency")

ax1.set_ylim([0, 1200])

ax1.text(1.2, 800, r"$mu$="+str(round(red_wine["sulphates"].mean(),2)),

fontsize=12)

r_freq, r_bins, r_patches = ax1.hist(red_wine["sulphates"], color="red", bins=15,

edgecolor="black", linewidth=1)

ax2 = fig.add_subplot(1,2, 2)

ax2.set_title("White Wine")

ax2.set_xlabel("Sulphates")

ax2.set_ylabel("Frequency")

ax2.set_ylim([0, 1200])

ax2.text(0.8, 800, r"$mu$="+str(round(white_wine["sulphates"].mean(),2)),

fontsize=12)

w_freq, w_bins, w_patches = ax2.hist(white_wine["sulphates"], color="white", bins=15,

edgecolor="black", linewidth=1)

# facets with density plots

fig = plt.figure(figsize = (10, 4))

title = fig.suptitle("Sulphates Content in Wine", fontsize=14)

fig.subplots_adjust(top=0.85, wspace=0.3)

ax1 = fig.add_subplot(1,2, 1)

ax1.set_title("Red Wine")

ax1.set_xlabel("Sulphates")

ax1.set_ylabel("Density")

sns.kdeplot(red_wine["sulphates"], ax=ax1, shade=True, color="r")

ax2 = fig.add_subplot(1,2, 2)

ax2.set_title("White Wine")

ax2.set_xlabel("Sulphates")

ax2.set_ylabel("Density")

sns.kdeplot(white_wine["sulphates"], ax=ax2, shade=True, color="y")

在二維切面和直方圖或密度圖中對混合屬性進行可視化

雖然這很好,但是再一次產生了大量的樣板代碼,而這原本可以通過使用seaborn來避免,甚至可以通過一張圖表描述所有的圖。

# Using multiple Histograms

fig = plt.figure(figsize = (6, 4))

title = fig.suptitle("Sulphates Content in Wine", fontsize=14)

fig.subplots_adjust(top=0.85, wspace=0.3)

ax = fig.add_subplot(1,1, 1)

ax.set_xlabel("Sulphates")

ax.set_ylabel("Frequency")

g = sns.FacetGrid(wines, hue="wine_type", palette={"red": "r", "white": "y"})

g.map(sns.distplot, "sulphates", kde=False, bins=15, ax=ax)

ax.legend(title="Wine Type")

plt.close(2)

在二維混合屬性中使用多維直方圖

您可以看到上面生成的圖表清晰簡潔,我們可以輕鬆地在各種分布之間進行比較。除此之外,箱型圖是另一種根據分類屬性中的不同值對數據組進行描繪的有效方式。 方塊圖是了解數據中四分位數值以及潛在異常值的好方法。

# Box Plots

f, (ax) = plt.subplots(1, 1, figsize=(12, 4))

f.suptitle("Wine Quality - Alcohol Content", fontsize=14)

sns.boxplot(x="quality", y="alcohol", data=wines, ax=ax)

ax.set_xlabel("Wine Quality",size = 12,alpha=0.8)

ax.set_ylabel("Wine Alcohol %",size = 12,alpha=0.8)

二維混合屬性的有效可視化方法——箱型圖

另一個類似的可視化方法是小提琴圖,這是使用核密度圖對分組數值數據可視化的另一種有效方法(描繪了不同值的數據的概率密度)。

# Violin Plots

f, (ax) = plt.subplots(1, 1, figsize=(12, 4))

f.suptitle("Wine Quality - Sulphates Content", fontsize=14)

sns.violinplot(x="quality", y="sulphates", data=wines, ax=ax)

ax.set_xlabel("Wine Quality",size = 12,alpha=0.8)

ax.set_ylabel("Wine Sulphates",size = 12,alpha=0.8)

小提琴圖是二維混合屬性的有效表示方法

您可以清楚地觀察到不同的葡萄酒硫酸鹽對應的葡萄酒質量類別的密度圖。

對二維數據可視化非常簡單,但隨著維度(屬性)增加,複雜度也在上升,原因是我們被現有顯示媒介所在的二維空間所束縛。

對於三維數據,我們可以通過在圖表中採用z軸或利用子圖和切面來引入一個深度的概念。

然而,對於三維以上的數據,對其進行類似的可視化就變得更加困難,最好的方法是使用圖形的切面,顏色,形狀,大小,深度等特性,您還可以將時間作為一個維度,為其他屬性繪製一個動圖(考慮時間是數據中的維度)。看看Hans Roslin 的優秀演講,就可以得到同樣的想法!

三維數據可視化

考慮到數據中有三個屬性或維度,我們可以考慮成對散點圖並引入顏色或色調的概念來對它們進行可視化,以便在分類維度中分離出數值。

# Scatter Plot with Hue for visualizing data in 3-D

cols = ["density", "residual sugar", "total sulfur dioxide", "fixed acidity", "wine_type"]

pp = sns.pairplot(wines[cols], hue="wine_type", size=1.8, aspect=1.8,

palette={"red": "#FF9999", "white": "#FFE888"},

plot_kws=dict(edgecolor="black", linewidth=0.5))

fig = pp.fig

fig.subplots_adjust(top=0.93, wspace=0.3)

t = fig.suptitle("Wine Attributes Pairwise Plots", fontsize=14)

用散點圖和色調(顏色)對三維數據可視化

根據上圖,您可以對各個參數的相關性和模式進行分析,並在不同的葡萄酒中進行比較,例如,我們可以清楚地看到,與紅葡萄酒相比,白葡萄酒的總二氧化硫和殘留糖含量更高。

讓我們來看看對三個連續的數字屬性進行可視化的策略。 一種方法是用常規的長度(x軸)和寬度(y軸)表示其中的二維,將第三維表示為深度(z軸)。

# Visualizing 3-D numeric data with Scatter Plots

# length, breadth and depth

fig = plt.figure(figsize=(8, 6))

ax = fig.add_subplot(111, projection="3d")

xs = wines["residual sugar"]

ys = wines["fixed acidity"]

zs = wines["alcohol"]

ax.scatter(xs, ys, zs, s=50, alpha=0.6, edgecolors="w")

ax.set_xlabel("Residual Sugar")

ax.set_ylabel("Fixed Acidity")

ax.set_zlabel("Alcohol")

通過引入深度的概念對三維數字類型的數據進行可視化

我們還可以利用常規的二維坐標軸,並將尺寸的概念作為第三維(本質上是氣泡圖),其中點的大小表示第三維數據的數量。

# Visualizing 3-D numeric data with a bubble chart

# length, breadth and size

plt.scatter(wines["fixed acidity"], wines["alcohol"], s=wines["residual sugar"]*25,

alpha=0.4, edgecolors="w")

plt.xlabel("Fixed Acidity")

plt.ylabel("Alcohol")

plt.title("Wine Alcohol Content - Fixed Acidity - Residual Sugar",y=1.05)

通過引入尺寸的概念對三維數字類型的數據進行可視化

因此,您可以看到上圖不是一個傳統的散點圖,而更接近於一個用不同氣泡的大小表示殘糖量的氣泡圖。 當然,我們所看到的這些數據呈現出來的模式並不是絕對的,通過其他兩個維度上看到的是不同的樣子。

為了對三個離散的分類屬性進行可視化,我們可以使用傳統的柱狀圖,利用色調的概念以及切面或子圖來表示第三維。Seaborn框架幫助我們在最少代碼量的情況下進行有效地繪圖。

# Visualizing 3-D categorical data using bar plots

# leveraging the concepts of hue and facets

fc = sns.factorplot(x="quality", hue="wine_type", col="quality_label",

data=wines, kind="count",

palette={"red": "#FF9999", "white": "#FFE888"}

通過引入色調和切面的概念對三維數字類型的數據進行可視化

上圖清楚地顯示了與每個維度相關的頻率,可以看到在理解相關洞察力方面是多麼容易和有效。

考慮到三個混合屬性的可視化,我們可以利用色調的概念將分組數據中的某個分類屬性分開,同時使用傳統的方式比如散點圖來對數字屬性的兩個維度進行可視化。

# Visualizing 3-D mix data using scatter plots

# leveraging the concepts of hue for categorical dimension

jp = sns.pairplot(wines, x_vars=["sulphates"], y_vars=["alcohol"], size=4.5,

hue="wine_type", palette={"red": "#FF9999", "white": "#FFE888"},

plot_kws=dict(edgecolor="k", linewidth=0.5))

# we can also view relationshipscorrelations as needed

lp = sns.lmplot(x="sulphates", y="alcohol", hue="wine_type",

palette={"red": "#FF9999", "white": "#FFE888"},

data=wines, fit_reg=True, legend=True,

scatter_kws=dict(edgecolor="k", linewidth=0.5))

利用散點圖和色調概念在三維空間中對混合屬性進行可視化

因此,色調作為類別或組的一個很好的分隔符,儘管上面所觀察到的相關性不強或非常弱,但我們仍然可以從這些圖中了解到,與白葡萄酒相比,紅葡萄酒中所含的硫酸鹽略高一些。您還可以使用核密度圖而不是散點圖來理解三維數據。

# Visualizing 3-D mix data using kernel density plots

# leveraging the concepts of hue for categorical dimension

ax = sns.kdeplot(white_wine["sulphates"], white_wine["alcohol"],

cmap="YlOrBr", shade=True, shade_lowest=False)

ax = sns.kdeplot(red_wine["sulphates"], red_wine["alcohol"],

cmap="Reds", shade=True, shade_lowest=False)

利用核密度圖和色調概念,在三維空間中對混合屬性進行可視化。

很明顯,與白葡萄酒相比,紅葡萄酒樣品的硫酸鹽含量更高。你也可以根據色調的強度查看密度的大小。

如果我們要分析三個維度中的多個分類屬性,可以利用色調和一個常規坐標軸來處理數據,並使用如箱形圖或小提琴圖來對不同的數據組進行可視化。

# Visualizing 3-D mix data using violin plots

# leveraging the concepts of hue and axes for > 1 categorical dimensions

f, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 4))

f.suptitle("Wine Type - Quality - Acidity", fontsize=14)

sns.violinplot(x="quality", y="volatile acidity",

data=wines, inner="quart", linewidth=1.3,ax=ax1)

ax1.set_xlabel("Wine Quality",size = 12,alpha=0.8)

ax1.set_ylabel("Wine Volatile Acidity",size = 12,alpha=0.8)

sns.violinplot(x="quality", y="volatile acidity", hue="wine_type",

data=wines, split=True, inner="quart", linewidth=1.3,

palette={"red": "#FF9999", "white": "white"}, ax=ax2)

ax2.set_xlabel("Wine Quality",size = 12,alpha=0.8)

ax2.set_ylabel("Wine Volatile Acidity",size = 12,alpha=0.8)

l = plt.legend(loc="upper right", title="Wine Type")

利用拆分的小提琴圖和色調的概念,在三維空間中對混合屬性進行可視化。

根據上圖,在右邊的三維可視化圖中,x軸表示葡萄酒質量,wine_type表示色調, 我們可以清楚地得到一些有趣的發現,如紅葡萄酒與白葡萄酒相比,揮發性酸度更高。

您也可以考慮使用箱形圖通過類似的方式表示具有多個分類變數的混合屬性。

# Visualizing 3-D mix data using box plots

# leveraging the concepts of hue and axes for > 1 categorical dimensions

f, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 4))

f.suptitle("Wine Type - Quality - Alcohol Content", fontsize=14)

sns.boxplot(x="quality", y="alcohol", hue="wine_type",

data=wines, palette={"red": "#FF9999", "white": "white"}, ax=ax1)

ax1.set_xlabel("Wine Quality",size = 12,alpha=0.8)

ax1.set_ylabel("Wine Alcohol %",size = 12,alpha=0.8)

sns.boxplot(x="quality_label", y="alcohol", hue="wine_type",

data=wines, palette={"red": "#FF9999", "white": "white"}, ax=ax2)

ax2.set_xlabel("Wine Quality Class",size = 12,alpha=0.8)

ax2.set_ylabel("Wine Alcohol %",size = 12,alpha=0.8)

l = plt.legend(loc="best", title="Wine Type")

利用箱形圖和色調的概念,在三維空間中對混合屬性進行可視化。

我們可以看到,對於quality和quality_label屬性,葡萄酒酒精含量會隨著質量的提高而增加;按照質量等級來分析,與白葡萄酒相比,紅葡萄酒的中值酒精含量稍微高一點。 然而,如果看具體的葡萄酒級別,在較低級別的葡萄酒(3&4)中,白葡萄酒的中值酒精含量大於紅葡萄酒;與白葡萄酒相比,紅葡萄酒的平均酒精含量通常略高一些。

四維數據可視化

基於之前的討論,我們可以利用圖表的各種組件進行多維可視化。 對四維數據可視化的一種方法是將深度和色調用作散點圖等常規圖形的特定數據維度。

# Visualizing 4-D mix data using scatter plots

# leveraging the concepts of hue and depth

fig = plt.figure(figsize=(8, 6))

t = fig.suptitle("Wine Residual Sugar - Alcohol Content - Acidity - Type", fontsize=14)

ax = fig.add_subplot(111, projection="3d")

xs = list(wines["residual sugar"])

ys = list(wines["alcohol"])

zs = list(wines["fixed acidity"])

data_points = [(x, y, z) for x, y, z in zip(xs, ys, zs)]

colors = ["red" if wt == "red" else "yellow" for wt in list(wines["wine_type"])]

for data, color in zip(data_points, colors):

x, y, z = data

ax.scatter(x, y, z, alpha=0.4, c=color, edgecolors="none", s=30)

ax.set_xlabel("Residual Sugar")

ax.set_ylabel("Alcohol")

ax.set_zlabel("Fixed Acidity")

利用散點圖和色調和深度的概念對四維數據進行可視化

從上圖可以明顯看出色調是表示wine_type屬性的,此外,由於圖表的天然複雜性,解讀這些可視化數據開始變得困難,但仍然可以得到一些信息,例如紅葡萄酒的固定酸度更高,白葡萄酒的殘糖量更高。當然,如果酒精和固定酸度之間有某種聯繫,我們可能會看到一個數據點逐漸增加或減少的趨勢。

另一種策略是保留二維圖,但使用色調和數據點大小作為數據維度。 通常情況下,這將是一個類似於我們之前進行可視化的氣泡圖。

# Visualizing 4-D mix data using bubble plots

# leveraging the concepts of hue and size

size = wines["residual sugar"]*25

fill_colors = ["#FF9999" if wt=="red" else "#FFE888" for wt in list(wines["wine_type"])]

edge_colors = ["red" if wt=="red" else "orange" for wt in list(wines["wine_type"])]

plt.scatter(wines["fixed acidity"], wines["alcohol"], s=size,

alpha=0.4, color=fill_colors, edgecolors=edge_colors)

plt.xlabel("Fixed Acidity")

plt.ylabel("Alcohol")

plt.title("Wine Alcohol Content - Fixed Acidity - Residual Sugar - Type",

利用氣泡圖與色調和尺寸的概念,對四維數據進行可視化

我們使用色調來表示wine_type,用數據點大小來表示殘糖量。我們確實看到了與前面的圖表相似的模式,而白葡萄酒的氣泡尺寸通常較大,表明白葡萄酒的殘糖比較高。

如果我們需要用兩個分類屬性表示更多的東西,可以重複利用色調和切面的概念來描述這些屬性,以及像散點圖這樣的常規圖來表示數字屬性。讓我們看幾個例子。

# Visualizing 4-D mix data using scatter plots

# leveraging the concepts of hue and facets for > 1 categorical attributes

g = sns.FacetGrid(wines, col="wine_type", hue="quality_label",

col_order=["red", "white"], hue_order=["low", "medium", "high"],

aspect=1.2, size=3.5, palette=sns.light_palette("navy", 4)[1:])

g.map(plt.scatter, "volatile acidity", "alcohol", alpha=0.9,

edgecolor="white", linewidth=0.5, s=100)

fig = g.fig

fig.subplots_adjust(top=0.8, wspace=0.3)

fig.suptitle("Wine Type - Alcohol - Quality - Acidity", fontsize=14)

l = g.add_legend(title="Wine Quality Class")

利用散點圖以及色調和切面的概念對四維數據進行可視化

這種可視化的有效性可以通過我們能夠很容易地發現多個模式的事實來驗證。白葡萄酒的揮發性酸度較低,高品質葡萄酒的酸度也較低。同樣基於白葡萄酒樣品,高品質的葡萄酒具有較高的酒精含量,而低品質的葡萄酒的酒精含量最低!

讓我們用其他一些屬性來創建一個類似的例子,並進行四維可視化。

# Visualizing 4-D mix data using scatter plots

# leveraging the concepts of hue and facets for > 1 categorical attributes

g = sns.FacetGrid(wines, col="wine_type", hue="quality_label",

col_order=["red", "white"], hue_order=["low", "medium", "high"],

aspect=1.2, size=3.5, palette=sns.light_palette("navy", 4)[1:])

g.map(plt.scatter, "volatile acidity", "alcohol", alpha=0.9,

edgecolor="white", linewidth=0.5, s=100)

fig = g.fig

fig.subplots_adjust(top=0.8, wspace=0.3)

fig.suptitle("Wine Type - Alcohol - Quality - Acidity", fontsize=14)

l = g.add_legend(title="Wine Quality Class")

利用散點圖以及色調和切面的概念對四維數據進行可視化

我們清楚地看到,高品質葡萄酒的總二氧化硫含量較低,如果您對葡萄酒的成分有必要的了解,就會知道這個結論非常重要。我們還發現,紅葡萄酒的總二氧化硫含量低於白葡萄酒,但是在其他幾個數據點上,紅葡萄酒的酸度卻更高。

五維數據可視化

讓我們再次遵循上一節所述的類似策略,利用各種繪圖組件,在五個維度中可視化數據。除了用常規軸代表其他兩個維度,我們使用深度,色調和尺寸來表示三個數據維度。 由於我們使用尺寸的概念,我們將會畫出一個三維氣泡圖。

# Visualizing 5-D mix data using bubble charts

# leveraging the concepts of hue, size and depth

fig = plt.figure(figsize=(8, 6))

ax = fig.add_subplot(111, projection="3d")

t = fig.suptitle("Wine Residual Sugar - Alcohol Content - Acidity - Total Sulfur Dioxide - Type", fontsize=14)

xs = list(wines["residual sugar"])

ys = list(wines["alcohol"])

zs = list(wines["fixed acidity"])

data_points = [(x, y, z) for x, y, z in zip(xs, ys, zs)]

ss = list(wines["total sulfur dioxide"])

colors = ["red" if wt == "red" else "yellow" for wt in list(wines["wine_type"])]

for data, color, size in zip(data_points, colors, ss):

x, y, z = data

ax.scatter(x, y, z, alpha=0.4, c=color, edgecolors="none", s=size)

ax.set_xlabel("Residual Sugar")

ax.set_ylabel("Alcohol")

ax.set_zlabel("Fixed Acidity")

利用氣泡圖和色調,深度和尺寸的概念,對五維數據進行可視化

這個圖表描述了我們在前一節中討論的相同模式和見解,同時也可以看到,根據表示二氧化硫總量的點的大小,與紅葡萄酒相比,白葡萄酒的二氧化硫總量更高。

# Visualizing 5-D mix data using bubble charts

# leveraging the concepts of hue, size and depth

fig = plt.figure(figsize=(8, 6))

ax = fig.add_subplot(111, projection="3d")

t = fig.suptitle("Wine Residual Sugar - Alcohol Content - Acidity - Total Sulfur Dioxide - Type", fontsize=14)

xs = list(wines["residual sugar"])

ys = list(wines["alcohol"])

zs = list(wines["fixed acidity"])

data_points = [(x, y, z) for x, y, z in zip(xs, ys, zs)]

ss = list(wines["total sulfur dioxide"])

colors = ["red" if wt == "red" else "yellow" for wt in list(wines["wine_type"])]

for data, color, size in zip(data_points, colors, ss):

x, y, z = data

ax.scatter(x, y, z, alpha=0.4, c=color, edgecolors="none", s=size)

ax.set_xlabel("Residual Sugar")

ax.set_ylabel("Alcohol")

ax.set_zlabel("Fixed Acidity")

利用氣泡圖和色調,切面和大小的概念,對五維數據進行可視化。

除了深度之外,我們還可以使用切面和色調來表示這五個數據維度中的多個分類屬性。表示大小的屬性之一可以是數字的(連續)或者甚至是分類的(但是我們可能需要用代表數據點大小的數字來表示它)。 雖然因為缺乏分類屬性,我們在這裡並沒有對此進行描述,但是您可以在自己的數據集上進行嘗試。

這基本上是另一種替代方法來對我們以前繪製的圖進行五維可視化。 雖然在觀察之前繪製的圖表時,表示深度的附加維度可能會讓很多人感到困惑,但由於切面的優勢,這個圖依然在二維平面上保持有效,因此通常更有效且易於解釋。

我們已經看到,處理如此多的數據維度變得越來越複雜! 會不會有人在想,為什麼不增加更多的維度呢?讓我們來試試看吧!

維數據可視化

希望接下來的嘗試更加有趣。讓我們在可視化中添加另一個數據維度,除了常規的兩個軸,我們將利用深度,色調,大小和形狀,來描述所有六個數據維度。

# Visualizing 6-D mix data using scatter charts

# leveraging the concepts of hue, size, depth and shape

fig = plt.figure(figsize=(8, 6))

t = fig.suptitle("Wine Residual Sugar - Alcohol Content - Acidity - Total Sulfur Dioxide - Type - Quality", fontsize=14)

ax = fig.add_subplot(111, projection="3d")

xs = list(wines["residual sugar"])

ys = list(wines["alcohol"])

zs = list(wines["fixed acidity"])

data_points = [(x, y, z) for x, y, z in zip(xs, ys, zs)]

ss = list(wines["total sulfur dioxide"])

colors = ["red" if wt == "red" else "yellow" for wt in list(wines["wine_type"])]

markers = ["," if q == "high" else "x" if q == "medium" else "o" for q in list(wines["quality_label"])]

for data, color, size, mark in zip(data_points, colors, ss, markers):

x, y, z = data

ax.scatter(x, y, z, alpha=0.4, c=color, edgecolors="none", s=size, marker=mark)

ax.set_xlabel("Residual Sugar")

ax.set_ylabel("Alcohol")

ax.set_zlabel("Fixed Acidity")

利用散點圖和色調,深度,形狀和大小的概念,對六維數據進行可視化

這是六個維度在一個圖中。我們用形狀表示葡萄酒的屬性quality_label ,用高(平方像素),中(X標記)和低(圓)表示葡萄酒的品質,葡萄酒類型以色調錶示,深度表示固定酸度,數據點大小表示總二氧化硫含量。

解釋這些似乎有點費力,但當您嘗試理解正在發生什麼的時候,請考慮以下幾部分。

1.考慮形狀和Y軸,與低品質的葡萄酒相比,中高品質的葡萄酒酒精含量更高;

2.考慮色調和大小,白葡萄酒的總二氧化硫含量比紅葡萄酒要高。

3.考慮深度和色調,與紅葡萄酒相比,白葡萄酒具有較低的固定酸度。

4.考慮色調和x軸,紅葡萄酒與白葡萄酒相比殘糖量較低。

5.考慮色調和形狀,白葡萄酒與紅葡萄酒相比似乎具有更高的品質(可能是由於白葡萄酒的樣本量較大)。

我們還可以去掉深度的概念並將切面用於分類屬性,來創建6維可視化,

# Visualizing 6-D mix data using scatter charts

# leveraging the concepts of hue, facets and size

g = sns.FacetGrid(wines, row="wine_type", col="quality", hue="quality_label", size=4)

g.map(plt.scatter, "residual sugar", "alcohol", alpha=0.5,

edgecolor="k", linewidth=0.5, s=wines["total sulfur dioxide"]*2)

fig = g.fig

fig.set_size_inches(18, 8)

fig.subplots_adjust(top=0.85, wspace=0.3)

fig.suptitle("Wine Type - Sulfur Dioxide - Residual Sugar - Alcohol - Quality Class - Quality Rating", fontsize=14)

l = g.add_legend(title="Wine Quality Class")

利用散點圖和色調,切面和大小的概念,以六維可視化數據

因此,在這種情況下,我們利用色調和切面來表示三個分類屬性,並使用兩個常規坐標軸和大小來表示六維數據可視化的三個數字屬性。

結論

數據可視化既是一門藝術,也是一門科學。 如果您正在閱讀本文,我真的很讚賞您在閱讀這篇文章時的做出的努力。本文的目的不是為了記憶任何事情,也不是要給出一套固定的數據可視化規則。 這裡的主要目標是了解和學習一些有效的數據可視化策略,特別是當維數開始增加時,希望您將這些代碼用於將來可視化自己的數據集。歡迎在評論中留下您的反饋意見,並分享您自己的數據可視化的有效策略,尤其是如果您可以做得更好。

本文中使用的所有代碼和數據集都可以從我的GitHub訪問得到。

您也可以通過Jupyter筆記訪問代碼。

譯者簡介

張媛,某雲計算公司不務正業服務工程師一枚。喜歡下雨天,讀閑書,缺乏技術細胞,欣賞並喜歡有態度有立場的人,愛浪漫,注重儀式感,喜歡記錄。最近的願望是擁有自己的小窩,給想念的人寫一封信。

轉載須知

如需轉載,請在開篇顯著位置註明作者和出處(轉自:數據派ID:datapi),並在文章結尾放置數據派醒目二維碼。有原創標識文章,請發送【文章名稱-待授權公眾號名稱及ID】至聯繫郵箱,申請白名單授權並按要求編輯。

發布後請將鏈接反饋至聯繫郵箱(見下方)。未經許可的轉載以及改編者,我們將依法追究其法律責任。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 數據派THU 的精彩文章:

數據院跨學科交叉人才培養走出國門——中德交換生項目首位社科學子赴德國哥廷根大學交流學習
清華大學公管學院、數據科學研究院共同助力國家數據治理,國家數據與治理聯盟在京成立

TAG:數據派THU |