密度图的密度估计_箱形图、小提琴图、直方图……统统可以卡通化!
對于數據科學家來說,可視化工具比比皆是,因此,退一步去鉆研每種可視化的類型及其適用的最佳案例就變得十分重要。為了發揮工具的最佳效用,有時可以考慮將其擬人化,甚至是將其變成卡通人物。
為了更好地理解圖表,本文將其設計成了一系列卡通人物。
背景——數據集
這份有關谷物的數據集(https://www.kaggle.com/crawford/80-cereals)來自Kaggle,可用以制作各類圖表。下載并保存該數據集,就可以運行以下繪圖代碼:
import pandas as pd import numpy as npimport matplotlib.pyplot as pltimport seaborn as sns df = pd.read_csv(‘./dataset/cereal.csv’)df[‘cal_per_cup’] = df.calories/df.cups # adding column to look at calorie content per cup rather than per serving具體而言,繪圖所需數據集中的每個樣本都必須具有定量值或連續值(例如熱量、纖維等非分類變量),制圖的重點在于如何展示這些定量值。但同時一些分類變量(例如谷物位于頂部、中部還是底部貨架)也必不可少,以便按照類別劃分樣本,并展示出每種樣本的定量值。這一谷物數據集較好地融合了兩者。
分布族
這是一個幸福的大家庭——箱形圖、直方圖、小提琴圖、箱形圖。雖然它們長相各異,但如果深入了解,你就會發現每種圖形都以相似的方式揭示數據集的構成。爸爸媽媽:箱形圖Borat和Wanda
這個圖表家庭會告訴你,用大量不同的數據樣本測量同一個值的意義何在。無論數據集是正常或是已被扭曲,這些圖表都能找出樣本的中位數(三個孩子甚至可以判斷樣本是否為多模態分布)。
來認識一下箱形圖Borat和Wanda(不過Wanda更喜歡別人叫她盒須圖)。他們在一次蹦床聚會上相遇,Wanda在蹦床上彈跳時,突然丟失了一個異常值,這個異常值砸到了Borat頭上。Borat把異常值還給了Wanda,然后他們就在一起了。
箱形圖喜歡蹦床,所以它們總是出現在x軸的高處和低處。Borat和Wanda志趣相投。Borat喜歡保持清爽的外表,表達總是簡潔凝練。而Wanda則更喜歡打扮一些,在解釋一件事時,她會多花點時間介紹細節,因為她希望別人充分理解她所發現的異常現象。
箱形圖的實際應用
“Borat”代表的是形式最簡單的箱形圖(或稱盒須圖),它能提供五條關于分布的信息:最大值、最小值、中位數、下四分位數及上四分位數。
注意,在下面的代碼中,圖表的默認參數并不會將上下邊緣線設置成最大值和最小值,所以必須在代碼里加上“whis='range'”這一條件。
plt.figure(figsize=(4, 8))sns.boxplot(df.cal_per_cup, whis=’range’, orient=’v’, color=’#BFD0FE’)plt.ylabel(‘Calories Per Cup’)plt.title(‘Distribution of Calories in Cereals’);“Wanda”代表的是一種更為常見的箱形圖(有時被稱為圖基箱形圖),能夠通過調整參數,選擇性地傳達信息。它默認將上邊緣設置在1.5四分位數范圍內(IQR)的最大點,IQR即下四分位數和上四分位數之間的差值。也就是說,上邊緣在上四位數1.5倍IQR處,下邊緣位于下四分位數1.5倍IQR處。上邊緣線以上、下邊緣線以下的值都被劃為異常值。
plt.figure(figsize=(4, 8))sns.boxplot(df.cal_per_cup, orient=’v’, color=’#F6A6A0')plt.ylabel(‘Calories Per Cup’)plt.title(‘Distribution of Calories in Cereals’);箱形圖可用于展示數據集的擴散和偏離程度。如果想要對多種分布情況進行比較,箱形圖也會派上用場。舉個例子,以下是根據貨架位置對谷物進行分類后,每杯谷物中熱量的分布情況。
plt.figure(figsize=(15, 8))sns.boxplot([‘Bottom Shelf’, ‘Middle Shelf’, ‘Top Shelf’], [df[df.shelf==1].cal_per_cup,df[df.shelf==2].cal_per_cup, df[df.shelf==3].cal_per_cup],orient=’v’, color=’#F6A6A0')plt.ylabel(‘Calories Per Cup’)plt.title(‘Distribution of Calories in Cereals by Shelf Placement’, fontsize=20);根據貨架位置對數據進行分類,很快可以發現原始箱形圖中所有的異常值都來自頂層貨架上的谷物。這表明頂層貨架上谷物的熱量中位數是最高的,而且其中不僅有熱量最高的谷物,也有熱量最低的谷物。兒子:直方圖Howard
Borat和Wanda在一起后生了三個孩子,一個男孩(直方圖Howard)和一對雙胞胎女兒(小提琴圖Viola和Violet)。
這是直方圖Howard。他總喜歡躺著,給你一個直觀的展示,讓你自己做結論。他一般不喜歡掩飾條柱之間形成的階梯,也不愿費力去展示處理數據的手段、數據的中位數或百分數。不過心情愉悅時,他也能好好打扮一番,清楚地展示出這些細節——甚至更多細節。Howard的邊緣參差不齊,這取決于他展示的內容以及圖中所用的條柱數量。他出了名的懶,一般只有他老是躺著。不過偶爾時間合適時,他也會站起來,比如為了拍家庭合照。
直方圖的實際應用
直方圖包含更多關于分布形狀的信息——是高斯分布、均勻分布還是多模態分布?通常來說,直方圖不會直觀地顯示中位數或四分位數的位置,但如果需要的話,可以人為設置添加。
在創建直方圖時,應該認真考慮所用條柱的數量,因為這會影響直方圖的清晰度,而且每一數據集所需要的條柱數量都不盡相同(為了更好地理解數據,我經常會同時在幾張圖表中設置不同數量的條柱)。在以下代碼中,將條柱數量分別設置為5、20、50,分別用于展示很少條柱,較多條柱和非常多條柱的情況。
plt.figure(figsize=(8, 4)) plt.hist(df.cal_per_cup, bins=20,color=’#BDFCC8', edgecolor=”#1F8F50")plt.ylabel(‘Calories Per Cup’)plt.title(‘Distribution of Calories in Cereals’);以上直方圖顯示了熱量分布。中間的圖表有20個條柱,可以清楚看到,其熱量分布接近于高斯分布,右側有一條比較長的尾巴,接近正偏態分布。左圖中由于條狀數量太少,無法判斷熱量為50-200的谷物的分布情況(可能是高斯分布,可能是均勻分布,也可能是其他)。右圖則條柱過多,包含的信息過多,以致難以描述。
直方圖也可以用于比較多個數據集,但這并不是我的最愛。可以將直方圖重疊(最多重疊三個數據集),也可以將幾個直方圖并列進行比較。
此外,還可以在散點圖周圍創建邊緣直方圖,以展示一對定量變量之間的關系。下圖是有關谷物數據集中纖維與熱量關系的直方圖:
sns.jointplot(x=df.cal_per_cup, y=df.fiber, kind=’scatter’, color=’#1F8F50');此圖用于比較谷物中熱量的分布情況與纖維的分布情況。中部是用于比較兩個變量的散點圖,頂部是熱量分布的直方圖,右側是纖維分布的直方圖。雙胞胎女兒:小提琴圖Violia和Violet
Viola和Violet總是背對背—而且經常(但并不總是!)互相對稱。在直方圖Howard里經常能看到坎坷的階梯,但Viola和Violet卻喜歡穿緊身褲,所以她們倆的表面總是那么光滑。
小提琴圖的實際應用
小提琴圖具備箱形圖的一些特征,但它們同時也是基于核密度估計(KDE)建構的——KDE能夠高效抹去你在直方圖中所能看見的階梯(所以我說Viola和Violet總是穿著緊身褲,表面光滑)。
plt.figure(figsize=(4, 8))sns.violinplot(df.cal_per_cup, color=’#F0BFFF’, orient=’v’)plt.ylabel(‘Calories Per Cup’)plt.title(‘Distribution of Calories in Cereals’);和箱形圖一樣,小提琴圖也適用于將兩個數據集并列進行比較。可參照以下根據貨架位置進行分類的數據:
plt.figure(figsize=(15, 8))sns.violinplot(x=df.shelf, y=df.cal_per_cup, color=’#F0BFFF’)plt.xticks([0,1,2], [‘Bottom Shelf’, ‘Middle Shelf’, ‘Top Shelf’])plt.ylabel(‘Calories Per Cup’, fontsize=16)plt.xlabel(‘Cereal Placement’, fontsize=16)plt.title(‘Distribution of Calories in Cereals by Shelf Placement’, fontsize=20)plt.tight_layout()小提琴圖的另一個重要特點就是,如果你希望用兩種分類標準來展示數據,可以對其進行拆分,在左邊放一組數據集的KDE(平滑后的直方圖),右邊放另一組數據集的KDE(這就是為什么Viola和Violet不是同卵雙胞胎——她們有時看起來截然不同),中間是合并數據集的中間值及其他值。
下圖將General Mills生產的谷物和Kelloggs生產的谷物(這是數據集中最大的兩家谷物生產商)進行了分類,并分別展示了每杯谷物中的熱量。
plt.figure(figsize=(15, 8)) plot = sns.violinplot(x=df[(df.mfr == ‘K’) |(df.mfr == ‘G’)].shelf, y=df[(df.mfr == ‘K’) |(df.mfr == ‘G’)].cal_per_cup, hue=df[(df.mfr == ‘K’) |(df.mfr == ‘G’)].mfr, split=True, color=’#F0BFFF’)handles, labels = plot.get_legend_handles_labels()plt.xticks([0,1,2], [‘Bottom Shelf’, ‘Middle Shelf’, ‘Top Shelf’])plt.ylabel(‘Calories Per Cup’, fontsize=16)plt.xlabel(‘Cereal Placement’, fontsize=16)plt.legend([handles[0], handles[1]], [‘Kelloggs’, ‘General Mills’], title=’Manufacturer’)plt.title(‘Distribution of Calories in Cereals nby Shelf Placement and Manufacturer’, fontsize=20)plt.tight_layout();傳送門:https://github.com/msiboni88/DisplayingDistributions/blob/master/Displaying Distributions.ipynb
留言 點贊 關注
我們一起分享AI學習與發展的干貨
編譯組:莫菲菲、殷睿宣
相關鏈接:
https://onezero.medium.com/a-proposed-trump-administration-rule-could-let-lenders-discriminate-through-a-i-2f9a729b0f3c
如需轉載,請后臺留言,遵守轉載規范
總結
以上是生活随笔為你收集整理的密度图的密度估计_箱形图、小提琴图、直方图……统统可以卡通化!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 净资产超过 1030 亿美元,比尔・盖茨
- 下一篇: 售价11500元碾压苹果!LV推出第三代