Python学习笔记(9-2):数据分析——数据统计
文章导读
- 课程难度:★★★☆☆
- 重要度:★★★☆☆
- 预计学习时间:1.5小时
- 简介:本节主要讲解了python数据分析中数据的统计及检验方法,包括:(1)基于numpy和pandas方法对数据进行基本的统计;(2)多种分布检验、参数检验、非参数检验、协方差与相关性的计算方法;(3)基于random包、numpy.random包和scipy.stats包的随机采样;(4)基于numpy.polynomial和scipy.stats的分布与回归拟合。
- 重点涉及的函数和内容:mstats.normaltest()方法判断数据是否服从正态分布、mstats.chisquare()方法实现卡方检验、mstats.pearsonr()方法计算连续数据的pearson相关系数、mstats.spearmanr()方法计算离散数据的spearman相关系数、np.random.randint()、np.random.randn()。
一、基础统计
我们首先介绍numpy数组的统计方式,之后也对dataframe在统计方面的一些成员方法进行介绍。这里,由于numpy和pandas不直接支持众数的计算,我们会引入scipy下的stats包。
from scipy import stats
import pandas as pd
import numpy as np
需要准备的数据:
frame = pd.DataFrame({
"a": [1, 2, 3, 4],"b": [4, 5, 6, 7],"c": [1, 2, 3, 4]} )
array = np.array(frame)
frame_nan = frame.replace(1, float('nan'))
array_nan = np.array(frame_nan)
x = np.array([100.45, 100.02, 100.0, 99.97, 100.05])
y = np.array([1.639, 0.578, 1.031, 1.031, 0.59])
x_nan = np.array([100.45, 100.02, np.nan, 99.97, 100.05])
y_nan = np.array([1.639, np.nan, 1.031, np.nan, 0.59])
xy_ary = np.array([x, y])
xy_ary_nan = np.array([x_nan, y_nan])
通常地,在处理多维(这里以二维为例)数组的时候,我们需要传递计算的轴向。为了直观,这里在部分情况下指定axis = 0
(按列),在部分情况下指定axis = 1
(按行)。
1、平均数、中位数、众数
求平均数、中位数、众数的方法及示例如下:
np.mean(array, axis = 0) # 平均数
np.median(array, axis = 0) # 中位数
stats.mode(xy_ary, axis = 1) # 众数,按行统计,这里用xy_ary作为例子
输出结果如下:
array([2.5, 5.5, 2.5])
array([2.5, 5.5, 2.5])
ModeResult(mode=array([[99.97 ],
[ 1.031]]), count=array([[1],
[2]]))
对于众数的计算函数,其返回的结果包括两个部分,一是每组元素的值,二是各个元素的出现次数。因此,根据返回值继续访问所需的众数值,需要向下继续访问各种元素。因为两个部分是通过各自只包含一个元素的列表存储的,因此访问上述二维数组中,某一维度的众数需要按如下方式访问:(对于一个向量是2个0)
stats.mode(xy_ary, axis = 1)[0][0][0] # 另一个是stats.mode(xy_ary, axis = 1)[0][1][0]
运算结果如下:
99.97
对应于mean
、median
,我们都有对应的忽略缺失值的方法,即nanmean
和nanmedian
。对于众数已经是忽略了缺失值的了,方法如下:
np.nanmean(array_nan, axis = 0)
np.nanmedian(array_nan, axis = 0)
stats.mode(array_nan, axis = 0)
输出结果如下:
array([3. , 5.5, 3. ])
array([3. , 5.5, 3. ])
ModeResult(mode=array([[2., 4., 2.]]), count=array([[1, 1, 1]]))
2、最大值、最小值、极差、方差、标准差、分位数
(1)求最大值、最小值等各类有关数据分布的统计函数如下:
np.max(xy_ary_nan, axis = 0) # 最大值,等同于np.amax()
np.min(xy_ary_nan, axis = 0) # 最小值,等同于np.amin()
np.ptp(xy_ary_nan, axis = 0) # 极差,最大值减去最小值,名字特殊,
# 不写成range可能因为range用作序列函数
np.var(xy_ary_nan, axis = 0) # 方差
np.std(xy_ary_nan, axis = 0) # 标准差
np.percentile(array_nan, axis = 0, q = 90) # 分位数,在0-100中取,100为最大、0为最小
np.quantile(array_nan, axis = 0, q = 0.9) # 分位数,但是是在0-1中取,1为最大、0为最小
除了极差之外,上述函数同样有对应的忽略空值的方法:
np.nanmax(xy_ary_nan, axis = 0)
np.nanmin(xy_ary_nan, axis = 0)
np.nanstd(xy_ary_nan, axis = 0)
np.nanvar(xy_ary_nan, axis = 0)
np.nanpercentile(array_nan, axis = 0, q = 90)
np.nanquantile(array_nan, axis = 0, q = 0.9)
最后一部分是一些补充:
np.average(xy_ary, axis = 0, weights=[1, 3])
# 加权平均(平均是mean),要求轴的长度和权重向量长度等同。权重各项目的和不要求为1
np.sum(xy_ary, axis = 1) # 求和,按行统计
np.prod(xy_ary, axis = 1) # 求乘积,按行统计
np.nansum(xy_ary_nan, axis = 0) # 忽略缺失值的求和,
np.nanprod(xy_ary_nan, axis = 0) # 忽略缺失值的乘积
需要注意的是,我们这里numpy常用的统计里不支持峰度和偏度的计算,stats包支持偏度计算,但没有峰度计算,这个在pandas中可以实现。
3、基于numpy方法统计DataFrame
上述介绍的是numpy方法的统计,传入函数的参数也是numpy数组。实际上,我们也可以直接传递Series或DataFrame。当传入的参数是DataFrame时,对应mean
、max
、min
、var
、std
五个函数,其结果是可以返回Series序列的。
这五个函数,对于参数axis
,仍然是传递0为对列进行运算,传递1为对行进行运算,而且此时是已经忽略掉缺失值的计算结果,比较如下三种计算结果::
np.mean(array_nan, axis = 0)
np.nanmean(array_nan, axis = 0)
np.mean(frame_nan, axis = 0)
输出结果如下:
array([nan, 5.5, nan])
array([3. , 5.5, 3. ])
a 3.0
b 5.5
c 3.0
dtype: float64
相应地,dataframe的五个函数使用如下,在此为了使篇幅简洁,不展示运算结果:
np.mean(frame_nan, axis = 0) # 平均值
np.max(frame_nan, axis = 0) # 最大值
np.min(frame_nan, axis = 0) # 最小值
np.var(frame_nan, axis = 0) # 方差
np.std(frame_nan, axis = 0) # 标准差
4、基于pandas方法进行统计
如果对dataframe进行处理,可首先考虑其内置方法,举一些基本的例子如下:
frame_nan.count() # 非零元素的计数
frame_nan.sum() # 求和
frame_nan.mean() # 平均值
frame_nan.median() # 中位数
frame_nan.min() # 最小值
frame_nan.max() # 最大值
frame_nan.std() # 标准差
frame_nan.var() # 方差
frame_nan.skew() # 偏度
frame_nan.kurt() # 峰度
frame_nan.quantile()