Python数据分析之单变量分析

0 引言

在数据分析或者机器学习过程中,我们需要对变量或者特征进行分析,在分析过程中,一般都会分为两种:单变量分析、双变量分析。今天,小编简单介绍一下单变量分析,单变量分析主要对单个变量或者特征进行分析,而变量可分为连续型变量、类别型变量,两种类型不同的变量的分析方法也是不同的。

1 连续型变量

(1) 数据概览

对于连续型变量,可以计算变量的统计值,来简单描述数据。一般在实践过程中,会使用​​pandas​​​包中的​​describe​​​方法来观察数据(当然使用前需要转换为​​Series​​​或者​​DataFrame​​​类型,​​DataFrame​​​其实就是大表格,表格每一列的类型都是​​Series​​):

import numpy as np
x = np.random.randint(1,100,100) # 随机生成100个0-100之间的数字
x = pd.Series(x)
x.describe()

结果为:

count    100.000000
mean 44.350000
std 29.432812
min 1.000000
25% 16.000000
50% 44.500000
75% 71.250000
max 98.000000
dtype: float64

可以看到,​​describe​​​方法会计算出特征的​​count(个数)​​​、​​mean(平均值)​​​、​​std(标准差)​​​、​​min(最小值)​​​、​​max(最大值)​​​、​​25% 50% 75%(分位数)​​​ ,由此可以简单观察数据的情况。除此之外,还可以用​​mode()、median()​​​方法查看众数以及中位数。之后,可以用​​info()​​​方法,来查看每个变量或特征的​​type​​​,有助于了解是否存在除了​​nan​​​以外的特殊符号异常,但是​​info​​​只能用于​​DataFrame​​​类型,不可用于​​Series​​​类型。这里我们把数据类型变为​​DataFrame​​类型,再查看info信息:

x = pd.DataFrame(x, columns=['v1']) # 把个特征命名为v1
x.info()

结果为:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100 entries, 0 to 99
Data columns (total 1 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 v1 100 non-null int32
dtypes: int32(1)
memory usage: 528.0 bytes

结果显示有100条样本,​​100 non-null​​​表示​​v1​​​列没有缺失值,​​Dtype​​​表示该列的数据类型是​​int32​​。

(2) 数据离散以及分布情况

数据离散情况的观察可以查看范围、分位数、分位差、方差、标准差、偏度(​​skewness​​​)、峰度(​​kurtosis​​​)等等。其中,范围可由最大最小值确定,分位数分位差、标准差可由​​describe()​​​方法确定,其中,四分位差​​IOR=Q3(​​​第3四分位数)​​-Q1​​​(第1四分位数 )确定。方差可由​​var()​​​方法计算得到,偏度、峰度可由​​skew()​​​、​​kurt()​​方法获得。关于峰度和偏度,本文就不详细介绍了,只需要简单知道偏度是描述数据分布形态的统计量,其描述的是某总体取值分布的对称性;峰度是描述某变量所有取值分布形态陡缓程度的统计量。下面代码展示了方差、偏度、峰度的计算:

print(x.var())
print(x.skew())
print(x.kurt())

结果为

789.2940404040404
-0.1727686492729214
-1.171386373921091

除此之外,还可以通过可视化的方法去观察变量的分布情况,比较常用的方法是直方图、QQ图、核密度估计图。

  • 直方图用于展示变量的分布情况,核密度估计图的功能与直方图相似,不过可以理解为是直方图的加窗平滑。直方图调用方法为​​sns.distplot()​​,核密度估计图的调用方法为​​sns.kdeplot()​
import seaborn as sns 
sns.set() # 切换到sns的默认运行配置
y = np.random.randn(100) # 生成具有标准正态分布的数据样本
sns.distplot(y) # 可以看到数据大致呈正态分布,kde曲线也是呈现正态

Python数据分析之单变量分析

再来看看核密度估计图,其实上图中的那条曲线就是该数据的核密度估计,不过既然有这个方法,那就调用一下:

plt.figure(1);sns.kdeplot(y)
plt.figure(2);sns.kdeplot(y, shade=True)

得到以下两图:

Python数据分析之单变量分析

左图其实就是直方图中的曲线,右图则是展示了曲线下的阴影部分,更美观更好判断罢了。

  • QQ图是变量的分位数和正态分布的分位数对比参照图,如果数据符合正态分布,则所有的点都会落在直线上。
from scipy import stats
plt.figure()
stats.probplot(y, plot=plt)
plt.show()

Python数据分析之单变量分析

因为小编是用​​randn​​方法生成的正态分布的数据,因此从QQ图中可以发现,绘图数据基本与直线重合。

(3) 缺失值判断

缺失值可以用​​isnull()​​​或者​​isna()​​​方法判断,这两个方法的返回值都是布尔值,即:缺失值为​​True​​​,反之为​​False​​​。如果你不需要知道具体是哪个样本有缺失值的话,一般都会使用​​isnull().sum()​​直接统计缺失值数量

y.isnull().sum()

该结果结果为​​0​​​,因为我们生成的数据不存在缺失值,所以缺失值为​​0​​​。因为我们这里采用了一维​​Serise​​​数据进行实验,但实际中的数据一般都是具有多个特征,读取后为​​DataFrame​​​格式,所以一般会用​​df.isnull.sum(axis=0)​​​的方式去按列(每列为一个特征或变量)统计缺失值。对于缺失值的可视化,一般会使用​​msno.matrix()​​​方法以及​​msno.bar()​​方法。具体代码演示小编会在后面的实战文章中具体演示。

(4) 异常值判断

异常值是指远远偏离总体样本的观测值。异常值的存在会降低数据的正态性以及模型的拟合能力等等。异常值的检测主要用箱型图、直方图、散点图等等,最常用的应该是箱型图:

plt.figure()
sns.boxplot(y=y)

Python数据分析之单变量分析

因为数据是按照正态分布的规则生成的,因此不存在异常值,这里只是进行代码的演示。后文的实践中,会进一步展示箱型图在实际数据中的应用。数据缺失值、异常值的可视化以及处理方法的内容比较多,在这篇文章中便不过多解释。

2 类别型变量

类别型变量或特征的分析方法没有连续型特征那么丰富,比较单一,一般使用频率(占比)或频次(次数)来表示变量的分布情况,并使用柱形图进行可视化。

(1) 数据统计

这里同样进行人工生成数据,用于方法的讲解。比如,现在一个学校将学生的成绩划分为三档:不及格、良好、优秀,将学生的成绩表示为计算机能看懂的数据,将不及格赋予状态值​​1​​​,良好赋予状态值​​2​​​,优秀赋予状态值​​3​​。一个班级中,各同学的成绩如下:

grades = [1, 1, 2, 2, 2, 2, 3, 1, 2, 3, 1, 2, 2, 3, 3, 2, 1, 2, 2, 2, 2, 3, 3, 2]
grades = pd.Series(grades)

​unique()​​​方法会返回序列去重之后的不同值,​​nunique()​​​方法则直接返回不同值的个数,以例子进行解释:​​unique()​​​方法会统计​​grades​​​中有哪几种成绩表示,​​nunique()​​​方法会统计​​grades​​中有几种成绩表示:

print('grades中不同值的个数是:', grades.nunique())
print('grades中不同值分别是:', grades.unique())

结果为:

grades中不同值的个数是: 3
grades中不同值分别是: [1 2 3]

并且使用​​value_counts()​​方法进一步查看每种数值的个数:

grades.value_counts()

结果为:

2    13
3 6
1 5
dtype: int64

可以看得到状态值2的个数为13个,即成绩良好的同学有13个;状态值3的个数为6个,即成绩优秀的同学有6个;状态值1的个数为5个,即成绩不及格的同学有5个。

(2) 数据分布可视化

再利用​​countplot()​​​函数对类别及其频次进行可视化,​​countplot()​​​会将数据的各个类别进行计数​​count​​​,再进行作图​​plot​​:

plt.figure()
sns.countplot(grades)
plt.show()

Python数据分析之单变量分析

这个方法其实也可以应用于查看变量分布和异常值检测,比如一个班级里20个同学,我们统计出来有19个良好,1个优秀,那其实该变量是不能很好地描述和区分样本的,所以在EDA的时候就可以把该特征进行删除。

发表评论

相关文章