首先要说的是,单变量就是我们通常接触到的DataFrame类型数据中,某一列数据。单变量分析是数据分析中最简单的形式,其中被分析的数据只包含一个变量。但也正因它是单一变量,所以不处理原因或关系。
单变量分析的主要目的是描述数据并找出其中存在的模式,也就是用最简单的概括形式反映出大量数据资料所容纳的基本信息。
这次我们主要研究连续数值型数据的分布。连续性数据一般应用于计算机领域,在数据挖掘、数据分类时会遇到此类数据,因为数据不是单独的整十整百的数字,而是密集取值的有某种关联或可能有某种关联的数据,例如身高、体重、年龄等都是连续变量。离散型数据是指记录不同类别个体的数目所得到的数据,其数字特点为数据都是整数;在某种意义上不能再细分,也不能进一步提高他们的精确度。例如某一类别动物头数,具有某一特征的种子粒数,血液中不同的细胞数目等。
了解了这些概念之后,我们先看看seaborn绘制单变量分布。首先,我们使用numpy模块中的random.normal()方法随机生成1000个整体服从正态分布的数,作为连续数值型数据:
data = np.random.normal(size=1000)
在我们之前的讲述中,直方图可以大致描述出data中数据的分布,我们来试一下:
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
# 从标准正态分布中随机地抽取1000个数
data = np.random.normal(size=1000)
sns.set(style='darkgrid')
plt.hist(data,24)
plt.show()
在seaborn里最常用的观察单变量的分布函数是displot(),这个函数会默认地绘制一个直方图,并拟合一个核密度估计。sns.distplot()的使用方法如下:
sns.distplot(data, bins, hist = True, kde = True)
data参数用于记录绘图所用的数据,bins参数在绘制直方图时可以进行设置,用于设置分组的个数,默认值时,会根据数据的情况自动分组,若是想指定分组的个数,可以设置该参数,有时用过增加分组数量还可以看到更为详细的信息。hist和kde参数用于调节是否显示直方图及核密度估计图,默认hist、kde均为True,即两者都显示。
接下来,我们对比一下displot()方法和普通释放图的区别:
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
# 从标准正态分布中随机地抽取1000个数
data = np.random.normal(size=1000)
sns.set(style='darkgrid')
sns.displot(data,kde=True)
plt.show()
在这张图中,柱形部分表示的内容和普通直方图一样,可以描述data的数据分布情况,而曲线部分表示概率密度,即采用平滑的峰值函数来拟合观察到的数据点,从而对真实的概率分布进行模拟。从上图的概率密度曲线可以得出,这组数据确实服从正态分布。
如果我们想要显示概率密度曲线,不显示直方图,也可以使用kdeplot()函数绘制数据的概率密度曲线图。顺便说一句,对于未知分布的数据,核密度估计就是用来估计概率密度曲线的。kdeplot()函数使用方法如下:
sns.kdeplot(data1, data2, shade = False)
由于该函数可以应用在双变量分析中,所以也就可以接收两个列表如果只传入一个列表,那就是单变量分析。shade参数用于设置图像下方的部分是否设置阴影,默认值为False,表示不绘制阴影。我们看看效果:
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
data = np.random.normal(size=1000)
sns.set(style='darkgrid')
sns.kdeplot(data, shade = False)
plt.show()
以上就是连续数值型单变量数据常见的可视化方法,我们常会使用到直方图、核密度图都在Seaborn中有所集成。
有时候,单个变量的分布情况不足够分析数据特征,同时也需要查看变量之间的联系,往往还需要进行预测等。这时就需要用到双变量联合分布了。下面我们一起来看一下连续数值型数据双变量之间的可视化方法:
sns.jointplot(x, y, data=None, kind='scatter',x_jitter=1)
x、y分别记录x轴和y轴的数据名称,如果数据集有多列数据,x,y还可以起到选择需要分析的两列的功能;data代表数据集类型为DataFrame,kind是用于设置图像的类型,可选的类型有:‘scatter’, ‘reg’, ‘resid’, 'kde’和 ‘hex’,分别表示散点图、回归图、残差图、核密度图和蜂巢图;x_jitter=1可以设置x偏离范围,遇到数据集中在一条竖线的时候,可以适当减小该值,范围在0-1之间。更多的参数可以按住ctrl,鼠标点击joinplot进行查看。
如果我们希望看一看数据中两个变量在二维平面上之间的关系时,则可以使用散点图,因为散点图可以帮助我们很容易地发现一些数据的分布规律。现在我们同样使用np.random.normal()函数创建一个含有两列数据的DataFrame,然后根据该数据绘制双变量散点图:
import seaborn as sns
import numpy as np
import pandas as pd
# 创建dataframe: df
df = pd.DataFrame({'x': np.random.normal(size=500),
'y': np.random.normal(size=500)})
sns.jointplot(x='x',y='y',data=df, kind='reg')
plt.show()
根据结果我们发现,sns.jointplot()函数可以显示两个变量之间的联合关系以及每个单变量的分布。我们把函数中的kind参数设置为’reg’就可以做一些简单的线性模型拟合,并且在坐标系的上方和右侧分别绘制了两个变量的直方图和核密度图。从这幅图中可以看出,这组数据之间没有明确的线性关系。
散点图有一个问题,相同和相似的点会覆盖在一起会让我们看不清楚哪里的点比较浓密。想要解决这个问题,我们可以使用蜂巢图观测。只需要改变这句代码即可:
sns.jointplot(x='x',y='y',data=df, kind='hex')
蜂巢图中每个六边形表示一个范围,用颜色表示这个范围内的数据量,颜色越白的地方数据量越小,颜色越深的地方表示数据量越大。当数据比较大的时候该种方式,更容易找出数据的分布情况。
在单变量分析的时候,我们绘制了单变量的概率密度曲线,在双变量中我们也可以使用密度图来分析数据的分布情况。将kind设置成’kde’,就可以看到核密度图了:
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 创建dataframe: df
df = pd.DataFrame({'x': np.random.normal(size=500),
'y': np.random.normal(size=500)})
sns.jointplot(x='x',y='y',data=df, kind='kde',shade = True)
plt.show()
大家注意我们在使用jointplot()方法时,加入了shade参数,该参数可以表示是否绘制阴影,绘制了阴影的核密度图可以从颜色的深浅判断数据密度,密度越高颜色越深:
我们在做数据分析时面对的数据集中往往有很多列数据,在我们还没有确定针对哪两个变量进行挖掘的时候,比较稳妥的做法就是将数据中的每两列都考虑一次,做一个完整的变量关系可视化。以著名的iris数据集为例,iris数据集有4个特征,那么每两个特征都考虑一次,就有16种组合。该数据集测量了所有150个样本的4个特征,分别是:
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_csv('iris.csv')
print(data.head())
下面我们使用seaborn中的pairplot()方法,就可以绘制连续数值型多变量关系分布图:
sns.pairplot( data, hue, vars, kind, diag_kind)
其中,data表示绘图所用到的数据集;hue参数表示数据集中可以作为分类依据的列;vars参数可以用于筛选绘制图像的变量,用列表的形式传入列名称;kind参数用于设置变量间图像的类型,可以选择’scatter’散点图,或者 'reg’回归图;diag_kind用于设置对角线上的图像类型,可以选择’hist’直方图, 或者’kde’核密度图。
下面,我们使用刚才的data数据绘制连续数值型多变量关系分布图:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
data = pd.read_csv('iris.csv')
sns.pairplot(data)
plt.show()
注:关于主对角线对称的图片,实际上只是调换了横纵坐标,相当于关于对角线对称。
我们不难发现,petal_length和petal_width散点图呈现出比较明显的线性关系。
接下来,我们将分类变量species考虑在图中,看看不同类别的鸢尾花的数据有没有明显的差别:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
data = pd.read_csv('iris.csv')
sns.pairplot(data,hue='species')
plt.show()
从图中可以看出,不同的颜色代表着花的不同种类,同一种的数据大多聚集在一起,并且与其他类别的数据交集比较少,表示三种花有明显的差别。
当然,我们也可以对该数据集的列进行两两一组的分析:
sns.pairplot(data,hue='species',vars=['sepal_length', 'sepal_width'],
kind='reg', # 绘制回归图
diag_kind='kde' # 绘制核密度图
)
plt.show()
这张图就是对刚刚的图取前两行前两列,对散点图做一次回归。
本节我们主要介绍了如何绘制连续数值型变量分布图,分别针对单变量、双变量和多变量数据进行了研究。大家学习之后还要自己多练习~