Python可视化:Seaborn(一)


进行数据分析&挖掘时,描述性统计必不可少。比如,我们需要看下各个quantitative变量的分布情况,良好的分布可视化效果能为之后进一步做数据建模打下基础。

其中,Seaborn便是个功能强大的库,可以用它做出很棒的数据可视化效果。我们此处结合科赛网上公开的链家二手房数据集,对如何使用Seaborn做Distribution Visualization进行说明。

说明: 文中所有代码部分均可通过K-Lab在线 数据分析协作工具 复现。可以登录科赛网,尝试用不同的数据集利用Seaborn进行可视化练习。


对于quantitative变量做分布可视化,主要有两点:

  • 探寻变量自身的分布规律,也就是univariate distributions可视化;

  • 探寻两个变量之间是否有分布关系,也就是bivariate distributions可视化。

Seaborn也是按这个workflow给出了plot function。

univariate distributions visualization:

  • distplot --- 绘制某单一变量的分布情况

  • kdeplot --- fit某变量(单一变量或两个变量之间)分布的核密度估计(kernel density estimate)

  • rugplot --- 在坐标轴上按戳的样式(sticks)依次绘制数据点序列

bivariate distributions visualization:

  • jointplot --- 绘制某两个变量之间的分布关系


读取数据

 import pandas as pd sh = pd.read_csv('sh.csv',encoding='gbk')


为了避免中文解码出现bug,将表头进行替换:


导入绘图的包

import warnings warnings.filterwarnings("ignore") import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline


单一变量可视化初探

在这个数据集中,quantitative的变量主要有房屋的面积Area,每平米单价Price,以及房屋总价Tprice。

先来看看上海每个行政区房屋总价Tprice的分布情况,我们用distplot绘制需要注意的是,在默认情况下,distplot会直接给出变量核密度估计的fit曲线。

dist = sh.Dist.unique() plt.figure(1,figsize=(16,30))with sns.axes_style("ticks"):

for i in range(17): temp = sh[sh.Dist == dist[i]] plt.subplot(6,3,i+1) plt.title(dist[i]) sns.distplot(temp.Tprice) plt.xlabel(' ') plt.show()


当然,我们也可以关闭核密度估计fit曲线,直接去看直方图分布(histograms)。Seaborn在distplot function的API中给出了kde和rug这两个参数,分别对应kernel density和rugplot(也就是在坐标轴上绘制出datapoint所在的位置)。


我们单独取出徐汇区(Xuhui)的数据,对kde和rug这两个参数进行设置,做出的直方图如下。

temp = sh[sh.Dist == 'Xuhui'] plt.figure(1,figsize=(6,6)) plt.title('Xuhui') sns.distplot(temp.Tprice,kde=False,bins=20,rug=True) plt.xlabel(' ') plt.show()


在Seaborn中,我们也可以直接调用kdeplot和rugplot做图


现在我们去研究一下徐汇区数据中,房屋面积变量Area的分布情况。

from scipy import stats, integrate plt.figure(1,figsize=(12,6))with sns.axes_style("ticks"): plt.subplot(1,2,1) sns.kdeplot(temp.Area,shade=True) sns.rugplot(temp.Area) plt.title('Xuhui --- Area Distribution') plt.subplot(1,2,2) plt.title('Xuhui - Area Distribution fits with gamma distribution') sns.distplot(temp.Area, kde=False, fit=stats.gamma) plt.show()


左:kdeplot function和rugplot function分别调用后的叠加,体现Seaborn做图灵活性
右:在distplot function设置了fit参数,让数据的分布与gamma分布进行拟合


两个变量(pairs)可视化

在做了单个quantitative变量分布的可视化研究后,我们来看看某两个变量组之间是否存在分布关系。

Seaborn在这里提供了jointplot function使用。 下面我们来对整个数据集的房屋面积(Area)和房价(Tprice)这两个变量进行可视化分析。


绘制散点图Scatterplot

sns.jointplot(x='Area',y='Tprice',data=sh) plt.show()


我们发现房价小于1000W并且面积小于200平方米的数据点很集中。设置一个filter,将这部分数据单独拿出来做研究,重新绘制散点图。

test = sh[(sh.Tprice<1000)&(sh.Area<200)]with sns.axes_style("white"): sns.jointplot(x='Area',y='Tprice',data=test) plt.show()


当数据量很大的时候,可以进一步利用hexbin plot去做可视化,显示数据集中分布的区域,如下图所示。

with sns.axes_style("white"): sns.jointplot(x='Tprice',y='Area',data=test,kind='hex') plt.show()


当然,我们也可以用kernel density estimation去做可视化,看分布情况。

with sns.axes_style("white"): sns.jointplot(x='Area',y='Tprice',data=test,kind='kde') plt.show()


小结

seaborn的巧妙之处就是利用最短的代码去可视化尽可能多的内容,而且API十分灵活,只有你想不到,没有你做不到。

另外,这篇小短文对数据集本身的探索与解释不是很多,若希望更深层次的探索数据集,可以直接登录科赛网,点击「数据集」查看。


本文由 保一雄@科赛网 数据分析师 原创。


你可能感兴趣的:(Python可视化:Seaborn(一))