查看原文
其他

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

杜雨 R语言中文社区 2019-04-22

杜雨,EasyCharts团队成员,R语言中文社区专栏作者,兴趣方向为:Excel商务图表,R语言数据可视化,地理信息数据可视化。个人公众号:数据小魔方(微信ID:datamofang) ,“数据小魔方”创始人。


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


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


R语言:


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


library("ggplot2")

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

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


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



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)



Hmisc::describe(diamonds[myvars]) 

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



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

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



psych::describe(diamonds[myvars])

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



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

aggregate(.~cut,data=diamonds[,c("depth","table","price","cut")],FUN=mean)


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



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


library("doBy")

library("psych")

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



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

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



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


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

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

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

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

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

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


一维列联表:

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

prop.table(mytable)



二维列联表:

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

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



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

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

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

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



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

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

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



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

library(gmodels)

with(diamonds,CrossTable(cut,color))



三维列联表:


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



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



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


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



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



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



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



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)



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



事实上,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

R语言(ggplot2入门)可视化在商务场景中的应用,已经有220+小伙伴加入了!

感兴趣的可点击阅读原文报名参加哦,满满的干货!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存