欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Python统计分析】描述统计:describe命令及groupby/pd.crosstab/pivot_table的应用

程序员文章站 2024-02-13 16:56:34
...

1. 连续变量的统计描述

1. 直接使用汇总函数(绝大部分分组状态下也可以使用)
count()	#计数时包含NaN值		size()	#计数时包含NaN值
sum()
mean()							std()
min()							max()
skew()	#偏度系数				kurt()	#峰度系数
median()						quantile()
apply()
cov()	#相关系数				corr()	#协相关系数
argmax()	#最值对应的绝对位置(整数)
idxmax		#最值对应的索引值

例子:

print(ccss.median())
ccss.s3.mean()				

ccss.groupby('s0').mean()
ccss.groupby('s0').s3.mean()
ccss.groupby('s0')['s3','index1'].mean()

ccss.s3.plot.hist()
ccss.s3.plot.box()
2. describe命令
ccss.describe()
ccss.groupby('s0').s3.describe(percentiles = [.05,.1])
3. statsmodels实现

(其实这种方式做统计分析不是很灵活)

#基于DescrStatsW类,可计算的统计量
from statsmodels.stats import weightstats as ws

nobs()					sum()
sum_weights()			mean()
quantile(probs)			var()
std()					std_mean()
sumsquares()

例子:

des = ws.DescrStatsW(ccss)
des = ws.DescrStatsW(ccss.loc[:,['index1','index1a']])

des.quantile([.05,.1,.5,.9,.95])
des.nobs  #返回有多少列。无参函数不写括号,否则将报错
des.var	#注意:statsmdels对数据格式严格,混入字符型变量报错

二、分类变量的统计描述

1. 单变量的频数统计

ccss.time.value_counts()  ##列出频数表
ccss.s3.value_counts(bins = 20)
ccss.s5.value_counts(True)      ##列出百分比表
ccss.s5.value_counts().plot.pie()

2. 交叉表

方法一:groupby(简单易用)
top_10 = (df.groupby(['name'])['ext price','quantity'].agg({
				'ext price': 'sum',
				'quantity': 'count'
				}).sort_values(by='ext price',
							   ascending=False
								))[:10].reset_index()
top_10.rename(columns={'name': 'Name',
					   'ext price': 'Sales',
					   'quantity': 'Purchases'
					   },
		      inplace=True)
方法二:pd.crosstab(专用于计算分组频率)
pd.crosstab(ccss.s2,ccss.s0).plot.bar()
pd.crosstab([ccss.s2,ccss.o1],[ccss.s0,ccss.s5])
#给出百分比,合计
pd.crosstab(ccss.s2,ccss.s0,normalize = 0,margins = True)
#频数堆积条图
pd.crosstab(ccss.s2,ccss.s0).plot.bar(stacked = True)
#百分比堆积条数
pd.crosstab(ccss.s2,ccss.s0,normalize = 0).plot.bar(stacked = True)
方法三:pivot_table(万能,但也比较繁琐)
tips.pivot_table(row=['sex', 'smoker'])
tips.pivot_table(values=['tip_pct', 'size'], index=['sex', 'day'], columns='smoker')
tips.pivot_table(values=['tip_pct', 'size'], index=['sex', 'day'], columns='smoker', margins=True)

#使用count或len可以得到有关分组大小的交叉表
tips.pivot_table('tip_pct', index=['sex', 'smoker'], columns='day', aggfunc=len, margins=True)

#根据性别和用手习惯对这段数据进行统计汇总
data.pivot_table(values = 'Sample',index = 'Gender',columns = 'Handedness',aggfunc = len,margins = True)