0 引言
在数据分析或者机器学习过程中,我们需要对变量或者特征进行分析,在分析过程中,一般都会分为两种:单变量分析、双变量分析。今天,小编简单介绍一下单变量分析,单变量分析主要对单个变量或者特征进行分析,而变量可分为连续型变量、类别型变量,两种类型不同的变量的分析方法也是不同的。
1 连续型变量
(1) 数据概览
对于连续型变量,可以计算变量的统计值,来简单描述数据。一般在实践过程中,会使用pandas
包中的describe
方法来观察数据(当然使用前需要转换为Series
或者DataFrame
类型,DataFrame
其实就是大表格,表格每一列的类型都是Series
):
结果为:
可以看到,describe
方法会计算出特征的count(个数)
、mean(平均值)
、std(标准差)
、min(最小值)
、max(最大值)
、25% 50% 75%(分位数)
,由此可以简单观察数据的情况。除此之外,还可以用mode()、median()
方法查看众数以及中位数。之后,可以用info()
方法,来查看每个变量或特征的type
,有助于了解是否存在除了nan
以外的特殊符号异常,但是info
只能用于DataFrame
类型,不可用于Series
类型。这里我们把数据类型变为DataFrame
类型,再查看info信息:
结果为:
结果显示有100条样本,100 non-null
表示v1
列没有缺失值,Dtype
表示该列的数据类型是int32
。
(2) 数据离散以及分布情况
数据离散情况的观察可以查看范围、分位数、分位差、方差、标准差、偏度(skewness
)、峰度(kurtosis
)等等。其中,范围可由最大最小值确定,分位数分位差、标准差可由describe()
方法确定,其中,四分位差IOR=Q3(
第3四分位数)-Q1
(第1四分位数 )确定。方差可由var()
方法计算得到,偏度、峰度可由skew()
、kurt()
方法获得。关于峰度和偏度,本文就不详细介绍了,只需要简单知道偏度是描述数据分布形态的统计量,其描述的是某总体取值分布的对称性;峰度是描述某变量所有取值分布形态陡缓程度的统计量。下面代码展示了方差、偏度、峰度的计算:
结果为
除此之外,还可以通过可视化的方法去观察变量的分布情况,比较常用的方法是直方图、QQ图、核密度估计图。
- 直方图用于展示变量的分布情况,核密度估计图的功能与直方图相似,不过可以理解为是直方图的加窗平滑。直方图调用方法为
sns.distplot()
,核密度估计图的调用方法为sns.kdeplot()
再来看看核密度估计图,其实上图中的那条曲线就是该数据的核密度估计,不过既然有这个方法,那就调用一下:
得到以下两图:
左图其实就是直方图中的曲线,右图则是展示了曲线下的阴影部分,更美观更好判断罢了。
- QQ图是变量的分位数和正态分布的分位数对比参照图,如果数据符合正态分布,则所有的点都会落在直线上。
因为小编是用randn
方法生成的正态分布的数据,因此从QQ图中可以发现,绘图数据基本与直线重合。
(3) 缺失值判断
缺失值可以用isnull()
或者isna()
方法判断,这两个方法的返回值都是布尔值,即:缺失值为True
,反之为False
。如果你不需要知道具体是哪个样本有缺失值的话,一般都会使用isnull().sum()
直接统计缺失值数量
该结果结果为0
,因为我们生成的数据不存在缺失值,所以缺失值为0
。因为我们这里采用了一维Serise
数据进行实验,但实际中的数据一般都是具有多个特征,读取后为DataFrame
格式,所以一般会用df.isnull.sum(axis=0)
的方式去按列(每列为一个特征或变量)统计缺失值。对于缺失值的可视化,一般会使用msno.matrix()
方法以及msno.bar()
方法。具体代码演示小编会在后面的实战文章中具体演示。
(4) 异常值判断
异常值是指远远偏离总体样本的观测值。异常值的存在会降低数据的正态性以及模型的拟合能力等等。异常值的检测主要用箱型图、直方图、散点图等等,最常用的应该是箱型图:
因为数据是按照正态分布的规则生成的,因此不存在异常值,这里只是进行代码的演示。后文的实践中,会进一步展示箱型图在实际数据中的应用。数据缺失值、异常值的可视化以及处理方法的内容比较多,在这篇文章中便不过多解释。
2 类别型变量
类别型变量或特征的分析方法没有连续型特征那么丰富,比较单一,一般使用频率(占比)或频次(次数)来表示变量的分布情况,并使用柱形图进行可视化。
(1) 数据统计
这里同样进行人工生成数据,用于方法的讲解。比如,现在一个学校将学生的成绩划分为三档:不及格、良好、优秀,将学生的成绩表示为计算机能看懂的数据,将不及格赋予状态值1
,良好赋予状态值2
,优秀赋予状态值3
。一个班级中,各同学的成绩如下:
unique()
方法会返回序列去重之后的不同值,nunique()
方法则直接返回不同值的个数,以例子进行解释:unique()
方法会统计grades
中有哪几种成绩表示,nunique()
方法会统计grades
中有几种成绩表示:
结果为:
并且使用value_counts()
方法进一步查看每种数值的个数:
结果为:
可以看得到状态值2的个数为13个,即成绩良好的同学有13个;状态值3的个数为6个,即成绩优秀的同学有6个;状态值1的个数为5个,即成绩不及格的同学有5个。
(2) 数据分布可视化
再利用countplot()
函数对类别及其频次进行可视化,countplot()
会将数据的各个类别进行计数count
,再进行作图plot
:
这个方法其实也可以应用于查看变量分布和异常值检测,比如一个班级里20个同学,我们统计出来有19个良好,1个优秀,那其实该变量是不能很好地描述和区分样本的,所以在EDA的时候就可以把该特征进行删除。
这就是单变量分析,但是真实场景中,我们往往会有很多特征,那此时便需要进行多变量分析了。关于多变量分析,小编会在后面再进行介绍。