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曲线也是呈现正态
    

在这里插入图片描述

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

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

得到以下两图:

在这里插入图片描述

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

  • QQ图是变量的分位数和正态分布的分位数对比参照图,如果数据符合正态分布,则所有的点都会落在直线上。

    from scipy import stats
    plt.figure()
    stats.probplot(y, plot=plt)
    plt.show()
    

在这里插入图片描述

因为小编是用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)

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

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()

在这里插入图片描述

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

这就是单变量分析,但是真实场景中,我们往往会有很多特征,那此时便需要进行多变量分析了。关于多变量分析,小编会在后面再进行介绍。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值