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

数据统计描述与列联表分析是数据分析人员需要掌握的基础核心技能,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

原文发布于微信公众号 - 数据小魔方(datamofang)

原文发表时间:2017-09-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏mathor

从暴力递归到动态规划

 动态规划没有那么难,但是很多老师在讲课的过程中讲的并不好,由此写下一篇文章记录学习过程

2011
来自专栏数说工作室

SAS里的平行世界 | 【SAS Says · 扩展篇】IML:1.入门

本节目录: 1. IML基本语句 2. 标量、向量与矩阵 (1)定义标量 (2)定义向量 (3)定义矩阵 3. 矩阵的元素运算 (1...

3956
来自专栏Python小屋

详解Python科学计算扩展库numpy中的矩阵运算(1)

首先解答上一篇文章中使用with关键字让你的Python代码更加Pythonic最后的习题,该题答案是False,原因在于内置函数sorted()的参数reve...

2874
来自专栏偏前端工程师的驿站

代数几何:点,线,抛物线,圆,球,弧度和角度

一, 笛卡尔坐标系                         ? 笛卡尔坐标系是数学中的坐标系,而计算机中则采用屏幕坐标系统. ? 而三维坐标系则没有一个...

2438
来自专栏菩提树下的杨过

“AS3.0高级动画编程”学习:第四章 寻路(AStar/A星/A*)算法 (上)

一提到“A*算法”,可能很多人都有"如雷贯耳"的感觉。用最白话的语言来讲:把游戏中的某个角色放在一个网格环境中,并给定一个目标点和一些障碍物,如何让角色快速“绕...

2196
来自专栏AI研习社

如何准备机器学习工程师的面试?

本文给到的是相关具体可能会被问及的问题 (编程、基础算法、机器学习算法)。从本次关于算法工程师常见的九十个问题大多是各类网站的问题汇总,希望你能从中分析出一些端...

40916
来自专栏深度学习之tensorflow实战篇

Python中map函数

python中的map()函数 map(function, iterable, ...) 1.对可迭代函数'iterable'中的每一个元素应用‘functi...

3554
来自专栏chenjx85的技术专栏

leetcode-661-Image Smoother

1032
来自专栏机器学习算法工程师

经典算法题之Maximal Square

作者:叶 虎 编辑:邓高锦 Maximal Square是道非常有意思的算法题。它是一个典型的动态规划问题,同时也是2017京东面试题,2016华为机考题...

4099
来自专栏Java Web

最长公共子序列问题

问题描述: 求两个字符序列的公共最长子序列。 ---- 最长公共子串 在回到子序列问题之前,先来了解一下子串的问题。 例如,HISH和FISH两个字符序列的公...

3514

扫码关注云+社区