Python学习笔记(9-2):数据分析——数据统计

本文详细介绍了Python中数据分析的基础统计方法,包括平均数、中位数、众数、最大值、最小值等,以及基于numpy和pandas的统计计算。此外,讨论了分布检验,如正态性检验、峰度和偏度检验,并介绍了非参数检验,如卡方检验、Mann-Whitney U检验和Friedman检验。还探讨了相关性分析,如皮尔逊和斯皮尔曼相关系数。最后,简要介绍了随机采样和分布拟合的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

文章导读

 - 课程难度:★★★☆☆
 - 重要度:★★★☆☆
 - 预计学习时间: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

对应于meanmedian,我们都有对应的忽略缺失值的方法,即nanmeannanmedian。对于众数已经是忽略了缺失值的了,方法如下:

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时,对应meanmaxminvarstd五个函数,其结果是可以返回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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值