左手用R右手Python系列10——统计描述与列联分析

浏览: 2583

数据统计描述与列联表分析是数据分析人员需要掌握的基础核心技能,R语言与Python作为优秀的数据分析工具,在数值型数据的描述,类别型变量的交叉分析方面,提供了诸多备选方法。

这里根据我们平时对于数据结构的分类习惯,按照数值型和类别型变量分别给大家盘点一下R与Python中那些简单使用的分析函数。

R语言:

描述性统计:(针对数值型)

library("ggplot2")

myvars<-names(diamonds)[c(5,6,7)];myvars

[1] "depth" "table" "price"

summary(diamonds[myvars]) #描述性统计(数值型)

image.png

sapply()  #可自由定义输出统计量

mystats <- function(x, na.omit=FALSE){

  if (na.omit)

    x <- x[!is.na(x)]

  m <- mean(x)

  n <- length(x)

  s <- sd(x)

  skew <- sum((x-m)^3/s^3)/n

  kurt <- sum((x-m)^4/s^4)/n - 3

  return(c(n=n, mean=m, stdev=s, skew=skew, kurtosis=kurt))

}

sapply(diamonds[myvars],mystats)

image.png

Hmisc::describe(diamonds[myvars]) 

#可输出变量与观测值个数、缺失值与唯一值个数、均值与分位数,五最大值最小值。

image.png

pastecs::stat.desc(diamonds[myvars])

#可以计算所有值、空值、缺失值数量,最大值、最小值、值域即总和。

image.png

psych::describe(diamonds[myvars])

#可以计算非缺失值的数量、平均值、标准差、中位数、截尾均值、绝对中位差、最小值、最大值、值域、偏度、峰度和平均值的标准误。

image.png

分组聚合并计算描述性统计量:

image.png

by(diamonds[myvars],diamonds$cut,function(x)sapply(x, mystats))

image.png

除此之外,doBy包中的summaryBy函数和psych包中的describeBy函数也提供了更为个性化的描述性统计量输出。


library("doBy")

library("psych")

summaryBy(mpg+hp+wt~am, data=mtcars, FUN=mystats)

image.png

相比summaryBy,describeBy不允许指定任意函数。

describeBy(diamonds[myvars], list(diamonds$cut))

image.png

列联表统计(针对类别型变量的)

  • table()          #简单的频数统计表(输出列联表矩阵,等同于count函数)

  • xtabs()         #公式法输入,输出列联表

  • prop.table()   #份数表示的列联表

  • margin.table() #添加边际和

  • addmargins()   #将边际和放入表中

  • ftable()        #创建紧凑型列联表

一维列联表:

mytable<-with(diamonds,table(cut));mytable

prop.table(mytable)

image.png

二维列联表:

mytable<-with(diamonds,table(cut,color));mytable

mytable<-xtabs(~cut+color,diamonds);mytable

image.png

margin.table(mytable,1) #生成行边际频数

margin.table(mytable,2) #生成列边际频数

prop.table(mytable,1) #生成行边际比例

prop.table(mytable,2) #生成列边际比例

image.png

addmargins(mytable)  #为表格添加边际和

addmargins(prop.table(mytable,1),2)  #为表格添加行边际和

addmargins(prop.table(mytable,2),1)  #为表格添加行边际和

image.png

gmodels包中的CrossTable()函数可以输出SPSS和SAS风格的二维列联表:

library(gmodels)

with(diamonds,CrossTable(cut,color))

image.png

三维列联表:

mytable<-xtabs(~cut+color+clarity,data=diamonds);mytable

image.png

ftable(mytable)  #使用ftable函数将三维列联表进行矩阵化

image.png

Python:

关于Python中的变量与数据描述函数,因为之前已经介绍过一些基础的聚合函数,这里仅就我使用最多的数据透视表和交叉表进行讲解:Pandas中的数据透视表【pivot_table】和交叉表【crosstab】的规则几乎与Excel中的透视表理念很像,可以作为所有的数值型、类别型变量的表述统计、频率统计和交叉列联表统计使用。

import pandas as pd

import numpy as np

diamonds=pd.read_csv('D:/R/File/diamonds.csv',sep = ',',encoding = 'utf-8')

diamonds.info()

image.png

image.png

pivot_table()内的参数列表如下:

pandas.pivot_table(data,   #数据框名称

             index=None,        #行索引(对应Excel透视表中的行字段,通常为类别型字段)

             columns=None,    #列字段(对应Excel透视表中的列字段,通常为类别型字段)

             values=None,       #度量值字段(通常为数值型字段)

             aggfunc='mean',   #度量的聚合方式(默认为均值)

             fill_value=None,   #缺失值填充方式

             dropna=True,       #是否删除无效值列

             margins=False,     #是否添加边际和

             margins_name='All' #是否添加边际和的名称

                   )

数值型变量的聚合分析:

pd.pivot_table(diamonds,index="cut",columns="color",values="carat",aggfunc=np.sum,margins=True,margins_name='All')

image.png

pd.pivot_table(diamonds,index=["cut","color"],columns="clarity",values="carat",aggfunc=np.sum,margins=True,margins_name='All')

image.png
pd.pivot_table(diamonds,index=["cut"],columns=["clarity","color"],values="carat",aggfunc=np.sum,margins=True,margins_name='All')

image.png

pd.pivot_table(diamonds,index=["cut","color"],columns="clarity",values=["carat","depth"],aggfunc=np.sum,margins=True,margins_name='All')

image.png

pandas的交叉表函数pd.crosstab参数设定规则与透视表保持了很高的相似度,确实从呈现形式上来讲,数值型变量的尽管聚合方式有很多【均值、求和、最大值、最小值、众数、中位数、方差、标准差、求和等 】,但是数据表的行列规则、和形式都是类似的。

pandas.crosstab(

                index,              #行字段(类别型)

                columns,         #列字段(类别型)

                values=None, #值字段

                rownames=None, 

                colnames=None, 

                aggfunc=None, #聚合函数

                margins=False, #边际和

                dropna=True, 

                normalize=False

                )


透视表的参数设定非常直观,其理念大致与Excel中的透视表理念一致,只要把握好关于行、列、度量值和聚合函数的设定规则即可。

以上透视表是针对数值型变量的分组聚合,那么针对类别型变量则需要使用pandas中的交叉表函数进行列表分析。

pd.crosstab(index=diamonds["cut"],columns=diamonds["color"],margins=True)

image.png

pd.crosstab(index=diamonds["cut"],columns=diamonds["color"],values=diamonds["carat"],aggfunc=sum,margins=True)

image.png

事实上,crosstab似乎同时也能兼容透视表的完整功能,但是奇怪的是透视表提供了数据框名称参数,指定参数时无需声明数据框名称,而且行列字段都可指定列表对象(二维以上,指定多个 字段),但是交叉表则没有给出数据框名称向量,这样 内部参数又限定在数组和序列、列表内,因而指定参数时,只能带着数据框前缀,指定单个序列,对此不是很理解。

本文小结:

R语言:

描述性统计:

summary

sapply

Hmisc::describe

pastecs::stat.desc

psych::describe

aggregate

by

doBy::summaryBy

psych::describeBy

列联表:

table()        

xtabs()        

prop.table()   

margin.table() 

addmargins()   

ftable()  

    

Python:

变量描述、聚合统计:

pivot_table

交叉列联表:

pandas.crosstab



推荐 0
本文由 杜雨 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册