4.4 Seaborn
Seaborn 是一个基于 matplotlib 并与 Pandas 数据结构紧密结合的 Python 数据可视化库。它提供了一个高级应用编程接口,让使用者专注于绘图的不同元素的含义,而不是如何绘制它们的细节。而 Seaborn 是开放源码,若想查看代码或报告错误,可以访问 GitHub 存储库 (https://github.com/mwaskom/seaborn)。一般的支持问题大多可以在国外的 stackoverflow 或 国内的 CSDN 找到解答。
Seaborn 中有幾種背景樣式可供選擇,使用 sns.set_style 函數控制,後續圖形會自動套用該格式,分別如下:
- white :白色背景(默認)
- whitegrid :白色網格背景
- dark :黑色背景
- darkgrid :黑色網格背景
- ticks :四周帶有刻度的白色背景
可以使用以下语法设定
import seaborn as sns
sns.set_style("whitegrid")
以下介绍数个常见的 Seaborn 绘制的数据图来观察数据的相互关系与分布。
相互关系-相关图 (Correlogram)
相关图用于可视化地查看给定数据模型中所有可能的数值变量对之间的关联度量,在 4-2 与 4-3 都有透过散点图来表示两个变量之间的关系,本节透过相关热图的方式来看出各个变量之间的关系,以下使用美国中西部各州 (midwest.csv) 的人口分布案例来观察,我们只针对栏位 11 到栏位 24 进行相关性检定,有人种比例(黑人、白仁、亚州人)、学历比例(高中、大专)、还有贫穷比例(小孩贫穷、成年贫穷等)等,因为有量化数据,很明显可以看出高中学历跟贫穷线下的相关性比大专学历跟贫穷线下的负相关性更高 (-0.59, -0.28),另外也观察出,亚洲人相较于其他人种对于教育更加关心,因为亚洲人多的地方,拥有高中与大学学历的比例也是呈现正相关 (0.47, 0.75)。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# dfAll = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/midwest.csv")
dfAll = sns.load_dataset('midwest',data_home=".")
# 针对栏位 11 到栏位 24 进行相关性检定
df = dfAll.iloc[:,11:25]
# 利用热图画出栏位相关性
plt.figure(figsize=(12,10), dpi= 80)
sns.heatmap(df.corr(), xticklabels=df.corr().columns, yticklabels=df.corr().columns, cmap='RdYlGn', center=0, annot=True)
# 标明标签
plt.title('Correlogram of midwest', fontsize=22)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.show()
图 4-4-1 midwest 相关图
分布-箱线图 (Box Plot)
箱形图是一种很好的可视化分布的方法,它可以将中位数、第25、75个四分位数和异常值牢记于心。但是,在解释方框的大小时需要谨慎,因为方框的大小可能会使该组中包含的点的数量失真。因此,在每个框中手动提供观察的数量可以帮助克服这一缺点。
以 tips 这个内建的资料来作例子说明,tips为一个侍者数月来所收到的小费的纪录,各项说明如下:
栏位 | 说明 |
---|---|
tip | 小费金额(美元) |
sex | 付账单的人的性别 |
smoker | 此笔消费的团体是否有人抽烟 |
day | 交易的时间(星期几) |
time | 用餐的时间(午/晚) |
size | 用餐人数,通常跟账单金额有直接关系 |
以下实例是观察周四到周日的男女给小费金额的箱线图,可以发现小费金额女性最高值普遍小于男性,但最低小费金额在周日的时后却是男性高于女性。不过从四份位数的判读,却无法看出男性或女性给小费人数的差异,换句话说,对服务生而言,给小费金额的多寡固然是重要的,但给小费人数的多寡也同样很重要,但很明显的,箱线图并没办法提供这样的信息。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = sns.load_dataset('tips')
plt.title("小费箱型图")
sns.boxplot(x="day",y="total_bill",hue="sex",data=df)
plt.show()
图 4-4-2 小费数据集的箱线图
分布-小提琴图 (Violin Plot)
小提琴图是在视觉上提供多个维度的信息,小提琴的形状或面积取决于横轴的数量。底下以 Seaborn 所内建的 tips 数据表为例,透过小提琴图,可以观察到男生给小费的人数比较多,因为小提琴的面积比较大,而且差异性也比较大,给最多小费跟最少小费的都是男人,小提琴的长度比较长。因此,透过小提琴图可以观察出给小费的分布情形。
# 取得数据
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = sns.load_dataset('tips')
# 画小提琴图
plt.figure(figsize=(13,10), dpi= 80)
sns.violinplot(x='day', y='total_bill',hue="sex", data=df, scale='width', inner='quartile')
# 加说明
plt.title('用餐小费小提琴图', fontsize=22)
plt.show()
图 4-4-3 小费数据集的小提琴图