如何使用reshape包进行数据汇总

Python011

如何使用reshape包进行数据汇总,第1张

在数据分析过程中,利用各种图表进行数据探索是必要的前期工作。描述性统计中就包括了直方图、散点图等工具来探索连续数据,对于分类数据,则可以采用条形图、交叉分组表等工具。Excel中所谓的“数据透视表”,其实就是一个交互式的交叉分组表。在R语言中可以很容易的用table()等函数得到相应的结果。对于一些更为复杂的任务,就需要其它的函数或包来完成。本例先以iris数据集为研究对象示范一些基本函数的用法,再介绍reshape包的强大功能。

iris数据集中有五个变量,其中Species表示鸢尾属花的子类,其它四个变量分别是花瓣和萼片的长度和宽度。你可以用head(iris)来观察原始数据的一些样本。我们的第一个任务是想计算不同种类花在四个指标上的平均值。用到的函数有tapply,by及aggregate。这篇文章对它们有所涉及。

将数据解包后,先用tapply函数尝试,但会发现该函数一次只允许输入一个变量。如果要完全四个变量的计算可能得用到循环。放弃这个函数来试试用by函数,该函数可以一次输入多个变量,但输出结果为一个list格式,还需要用do.call函数进行整合,有点麻烦。最方便友好的还是aggregate函数,直接输出为数据框格式。另外它还允许用公式来设置分组因子。

attach(iris)

names(iris)

tapply(X=Sepal.Length,INDEX=Species,FUN=mean)

temp <-by(data=iris[,1:4],INDICES=Species,FUN=mean)

do.call(rbind,temp)

aggregate(x=iris[,1:4],by=list(Species),FUN=mean)

aggregate(.~ Species, data = iris, mean)aggreagate函数表现已然不错,但还不够强大。比如说它没法直接得出表格的边际值,所以下面就请出本场的主角,即reshape包中的两员大将:melt与cast。这两个通常是配合使用,melt专门负责“融合”原始数据,形成长型(long)数据结构。cast则专职将融合后的数据“重铸”为新的形式(让人想起了“铁索连环”)。基本上只要有这两个函数,就能统一解决所有的汇总问题。

还是以上面的问题为例子,先加载reshape包,然后用melt函数进行融合数据,其中参数id指定了用Species为编号变量,measure参数用来指定分析变量(即被融合的变量),本例中只指定了参数id,所以原始数据中未包括在id中的其它变量均指定为分析变量。你可以观察到新的数据iris.melt其实就是堆叠(stack)后的数据。然后我们再用cast来重铸,cast函数中可以使用公式,波浪号左侧变量将纵列显示,右侧变量将以横行显示。margins参数设定了以列作为边际汇总方向。如果希望在计算中只包括两种花,可以使用subset参数。

library(reshape)

iris.melt <- melt(iris,id='Species')

cast(Species~variable,data=iris.melt,mean,margins="grand_row")

cast(Species~variable,data=iris.melt,mean,

subset=Species %in% c('setosa','versicolor'),

margins='grand_row')reshape包的作者也是ggplot2包的开发者,这个牛人是个完美主义者,在reshape包推出五年后,他重构代码推出了新的reshape2包。这个新包的特性在于:

改进算法,使计算与内存使用效能增强;

用dcast和acast代替了原来的cast函数;

用变量名来设定边际参数;

删除cast中的一些特性,因为他确认plyr包能更好的处理;

所有的melt函数族都增加了处理缺失值的参数。

下面我们以diamonds数据为例,来完成一个略为复杂的任务。我们希望计算不同切工和不同纯净度条件下,钻石的单位平均价格,并加以比较。首先加载reshape2包和ggplot2包,然后取子集。将原始数据融合,以切工、颜色和净度为编号变量。再利用dcast函数重铸数据,得到汇总结果。计算出单位价格,最后用条形图表现结果。

library(reshape2)

library(ggplot2)

data <- diamonds[1:7]

data.melt <- melt(data,id=c('cut','color','clarity'))

diam.sum <- dcast(data.melt,cut+clarity~variable,

subset=.(variable %in% c('price','carat')),mean)

diam.sum$average <- diam.sum$price/diam.sum$carat

p <- ggplot(diam.sum,aes(cut,average,fill=clarity))

p + geom_bar(position='dodge')

除了reshape包以外,R语言中还有stack、unstack、reshape等函数能完成类似的工作,但论功能的强大,还是首推reshape包中的哼哈二将。

记得关 注" R语言与统计 "~~ 简单线性回归(Simple linear regression) 也称为一元线性回归,是分析一个自变量(x)与因变量(y)之间线性关系的方法,它的目的是拟合出一个线性函数或公式来描述x与y之间的关系。 线性回归是统计学中最基础、重要、并且被广泛使用的方法之一。 据KD Nuggets网站的调查报告显示,回归方程位列Top1,是被数据科学家应用次数最多的方法,据说这样的领先地位将会持续到2118年!

可以这么说:得回归者得天下b74581dab9e0efd3a4de41f6b66e3158.png!

2096f70e901dcd20ebb6bbfb5dbdd65b.png

来源: KD Nuggets

回归(Regression)是一种即简单又复杂的技术。关于回归理论与数学原理的教科书可以厚达上千页。

不过,它的应用相对容易上手,方程的解释也比较的直观简单。 今天选择回归中最基础的简单线性回归作为开始,之后会逐渐延伸到其他类型的回归。 7b15dc28d9ccb710595b433e730da484.png

1. 简单线性回归的公式与基础

简单线性回归可以用下方的数学公式表示: y= a + b*x + error 其中: y为因变量; x为自变量; a为截距; b为斜率; error为残差,即没有被回归方程解释的变异部分。 (关于残差请查看往期文章: 手把手教你画出统计上极其重要的概念:残差 )。 下方的图片可以帮助大家更加清楚的了解上述各个元素到底代表什么:

f525f0f83c8909a3728f3d6b67b3d6d0.png

线性回归的拟合就是将残差的平方和(Residual Sum of Squares或RSS)降到最低的过程。通过找到最小的RSS,从而计算出回归系数(a与b),这种方法也称为最小二乘回归(Least squares regression)。 18ece3bccc453972518e6e01d6eea9d0.png 下图可以帮助我们更加容易的理解残差与RSS(来自我们的往期文章: 手把手教你画出统计上极其重要的概念:残差 ): e8a791acd213b9227070364b0eafc6f7.png RSS即是残差(灰色线条)的平方和。 理论上的介绍就到此为止,现在开始操作部分!

2. 数据的准备

使用到的数据集为R自带的mtcars,首先预览一下:

summary(mtcars)

# mpg cyl disp hp # Min. :10.40 Min. :4.000 Min. : 71.1 Min. : 52.0 # 1st Qu.:15.43 1st Qu.:4.000 1st Qu.:120.8 1st Qu.: 96.5 # Median :19.20 Median :6.000 Median :196.3 Median :123.0 # Mean :20.09 Mean :6.188 Mean :230.7 Mean :146.7 # 3rd Qu.:22.80 3rd Qu.:8.000 3rd Qu.:326.0 3rd Qu.:180.0 # Max. :33.90 Max. :8.000 Max. :472.0 Max. :335.0 # drat wt qsec vs# Min. :2.760 Min. :1.513 Min. :14.50 Min. :0.0000 # 1st Qu.:3.080 1st Qu.:2.581 1st Qu.:16.89 1st Qu.:0.0000 # Median :3.695 Median :3.325 Median :17.71 Median :0.0000 # Mean :3.597 Mean :3.217 Mean :17.85 Mean :0.4375 # 3rd Qu.:3.920 3rd Qu.:3.610 3rd Qu.:18.90 3rd Qu.:1.0000 # Max. :4.930 Max. :5.424 Max. :22.90 Max. :1.0000 # am gearcarb # Min. :0.0000 Min. :3.000 Min. :1.000 # 1st Qu.:0.0000 1st Qu.:3.000 1st Qu.:2.000 # Median :0.0000 Median :4.000 Median :2.000 # Mean :0.4062 Mean :3.688 Mean :2.812 # 3rd Qu.:1.0000 3rd Qu.:4.000 3rd Qu.:4.000 # Max. :1.0000 Max. :5.000 Max. :8.000

其中的 wt 与 mpg 是今天用到的变量。wt为汽车的重量,mpg为汽车每消耗1加仑油能够行驶的距离。 为了简化数据集,提取这两个变量保存到mydata中。

mydata "wt", "mpg")]

我们想要研究wt(汽车重量)与mpg(英里/加仑:每消耗一加仑油的行驶距离)之间的关系。 在后续的回归方程中,wt为自变量(x),mpg是因变量(y) 。

3. 制作散点图(数据的探索)

在做任何统计分析之前作一个图来展示数据的关系是一个好习惯b74581dab9e0efd3a4de41f6b66e3158.png! 因为wt与mpg都是连续变量,所以选择散点图展示两者的关系( R语言画展ggplot2篇-散点图 ),在此基础上再添加一个平滑的曲线( 回答读者系列(一):如何在散点图中添加拟合曲线? )。

library(ggplot2) # 载入ggplot2ggplot(mydata, aes(wt, mpg)) + geom_point() + geom_smooth()# 添加平滑曲线

2ccba87396480cc42928b1e5943adffb.png 从上图中大致可知,两者的关系呈负相关,即随着wt的增加,mpg呈递减的趋势。 也就是说,重量越重的汽车,消耗1加仑油能够行驶的距离越短,这个结果也比较符合我们的经验与常识。 并且,两者之间的关系可以认为是线性的。

4. 回归方程的计算

上述两个变量的关系可以用简单线性回归方程来表示:

mpg = a + b*wt

R中的 lm() 可以计算上述方程中的a(截距)与b(斜率)。

fit ~ wt, data = mydata) # 拟合简单线性回归,“lm”指的是linear model, 即线性回归

fit# 显示结果

#Call:#lm(formula = mpg ~ wt, data = mydata)#Coefficients:#(Intercept) wt # 37.285-5.344

从上述的结果可知:a = 37.285, b = -5.344。 所以,wt与mpg之间的关系可以用下方的数学公式表示:

mpg = 37.285- 5.344*wt

在我们这个例子中,b(斜率)的含义指的是:wt每增加一个单位,mpg下降5.344。

5. 回归直线

制作散点图,并且添加回归直线:

ggplot(mydata, aes(wt, mpg)) + geom_point() + geom_smooth(method = "lm") # “lm”指的是linear model, 即线性回归

f9088069fbd5a7689ed56f6529808c8b.png

6. 模型的评估

summary(fit) # 评估模型

代码非常简单,就是一个summary(fit),但是结果却是一大段:

#Call:#lm(formula = mpg ~ wt, data = mydata) #Residuals:#Min1QMedian 3QMax #-4.5432 -2.3647 -0.1252 1.4096 6.8727 #Coefficients:#Estimate Std. Error t value Pr(>|t|) #(Intercept) 37.2851 1.877619.858 <2e-16 ***# wt -5.3445 0.5591-9.559 1.29e-10 ***#---#Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1#Residual standard error: 3.046 on 30 degrees of freedom#Multiple R-squared: 0.7528, Adjusted R-squared: 0.7446 #F-statistic: 91.38 on 1 and 30 DF, p-value: 1.294e-10

上述的结果可以概括为以下几点308e347594c1bae6848bb083b03bfb54.png: 1. call : 指的是输入的回归方程信息。 2. Residuals : 指的是残差的信息。 3. Coefficients : 回归系数的信息(a与b,即截距与斜率)。

#Coefficients:#Estimate Std. Errort value Pr(>|t|) #(Intercept) 37.2851 1.8776 19.858 <2e-16 ***# wt -5.3445 0.5591 -9.559 1.29e-10 ***

这一栏包含回归系数的信息,比如estimate(a与b,即截距与斜率),Std.Error(标准误),t value(t值)与pr(>|t|) p值。

我们最关心的问题是关于wt的一些信息以及wt是否有统计学意义。通过上述的结果,可以知道b = -5.3445, 它的标准误为0.5591, t值为-9.559,p = 1.29e-10。因此,wt每增加一个单位,mpg下降5.344,并且具有统计学意义。

4. Residual standard error(RSE), R2 与校正后的R2 ,F-statistic : 反映模型对于数据的拟合优化程度,即评价一个模型到底好不好的指标。 8d67cff52ccb5e8344be1bf3595fd925.gif 下面对每一个指标作一些“简单”的介绍: Residual standard error( RSE ) : 也称为模型的sigma值,代表残差的变异程度。用数学的话说,就是残差(Residual)的标准差(Standard deviation),有点拗口9a88bab476d7aa06ddb5c4c84e13b8f8.png。

#Residual standard error: 3.046 on 30 degrees of freedom

RSE的数值反映了回归模型无法解释的那一部分信息。所以RSE越小意味着模型越好,越小意味着我们的模型可以解释越多的信息。 以我们的例子来说,RSE值为3.046,即表示每个散点图上的点偏离回归直线的平均距离为3.046个单位。因此,RSE越低,点偏离回归直线的距离越小,意味着回归方程越准确。 R-squared (R方) : 即R方与校正后的R方。R2的数值范围为(0~1),指的是在数据中模型可以解释的那部分信息的比例。R方越接近1,模型能够解释的信息越高,模型就越好。

# Multiple R-squared: 0.7528, Adjusted R-squared: 0.7446

在我们的例子中,R2等于0.7528,说明我们的模型可以解释mpg(每加仑行驶距离)变异程度的75.28%,已经是相当高了! 但是,随着回归方程中变量的增多(比如多元线性回归),R方趋向于变大,所以对于评价一个方程的好坏来说,会有偏移。因此,统计学家们发明了校正后的R2(Adjusted R-squared),将变量的个数也考虑在内。所以,相对与R2要更加准确,尤其是在多元线性回归当中。 F-statistic: 可用于评价回归方程整体的统计学意义。

# F-statistic: 91.38 on 1 and 30 DF, p-value: 1.294e-10

F-statistic的值越大,它的p值将会越小。 f9ed731aa1a5c56dc525061a12bbc02a.gif

好啦,今天不简单的简单线性回归就到这里。

如果有帮助,记得分享6c3c03421f4d9b0a61a1c1920f91bcfa.png给需要的人!

参考文献 1.《The Elements of Statistical Learning》 2. 《Linear Models with R》Julian J. Faraway

edbf626e6662f05b15cceea21eb8cfab.png