经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » R语言 » 查看文章
初次用R的实际案例数据分析
来源:cnblogs  作者:kisaragiRY  时间:2019/7/25 8:39:10  对本文有异议

这是一次教授布置的期末作业,也是书籍《商务数据分析与应用》的一个课后作业

目录

数据描述

数据预处理

描述性统计分析

模型分析(方差分析)

数据描述

非学位职业培训机构的178个学员的数据,目的是了解什么样的学员可能获得更好的学习效果

数据预处理

打开数据,查看一部分数据并锁定数据(这样之后可以直接使用变量名而不用$来指定数据)

  1. grades=read.table('E:/SWlearning/R/assighment/RegressionAnalysis/Report/ins1.csv',
  2. header=TRUE,sep=',')
  3. head(grades)
  4. attach(grades)



结果显示



将变量名改成英文

  1. names(grades)=c('aveGrades','gender','birth','firmType','eduBG','eduGrd')



响应变量(因变量):因变量.平均成绩(aveGrades)
自变量:性别(gender),出生日期(birth),企业性质(firmType),最高学历(eduBG),最高学历毕业时间(eduGrd)


检查相应变量的正态性

  1. shapiro.test(aveGrades)



结果显示

  1. Shapiro-Wilk normality test
  2. data: aveGrades
  3. W = 0.89736, p-value = 9.286e-10



p值非常的小故拒绝原假设,即拒绝数据是正态分布的原假设


接下来用BoxCox的方法,建立新的相应变量从而保证其正态性,注意BoxCox.ar是包TSA里的函数

  1. library(TSA)
  2. boxcox=BoxCox.ar(aveGrades,lambda = seq(4, 8, 0.1))




查看最优的lamda值

  1. boxcox$mle




建立新的响应变量

  1. aveGrades_mod=grades$aveGrades^6.6



检验新的响应变量的正态性

  1. shapiro.test(aveGrades_mod)



结果显示

  1. Shapiro-Wilk normality test
  2. data: aveGrades_mod
  3. W = 0.99007, p-value = 0.2522



p值达到了我们期望的结果,不拒绝原假设,即接受新的响应变量是正态分布的假设

描述性统计分析



注意我们的因变量中,出生日期(birth)和最高学历毕业时间(eduGrd)不是离散变量,我们将以十年的单位将这两个变量分类
出生日期(birth)中最大是 1952-6-26,最小是 1979-11-10,分成五十年代(1),六十年代(2), 七十年代(3)
最高学历毕业时间(eduGrd)中最大是 1982-1-1,最小是 2004-3-1,分为八十年代(1),九十年代(2), 零零后(3)



第一步
将出生日期(birth)和最高学历毕业时间(eduGrd)变成日期型变量以便之后的操作

  1. birthmod=as.Date(grades$birth)
  2. eduGrdmod=as.Date(grades$eduGrd)



第二步
我们先对出生年月进行分类

  1. //d1~d4分别是四个时间节点,用来将数据分成五十年代(1),六十年代(2), 七十年代(3)
  2. d1=as.Date('1950/1/1')
  3. d2=as.Date('1960/1/1')
  4. d3=as.Date('1970/1/1')
  5. d4=as.Date('1980/1/1')
  6. //计算出生日期(birthmod)中的数据个数
  7. s=0
  8. for(i in birthmod){
  9. s=s+1
  10. }
  11. //建立新的数值型变量。因为birthmod是日期型变量,不能直接赋数值型的值如1,2,3
  12. birth_mod=1:s
  13. //开始分类
  14. for(i in 1:s){
  15. fac1=birthmod[i]-d1>0 & birthmod[i]-d2<=0
  16. fac2=birthmod[i]-d2>0 & birthmod[i]-d3<=0
  17. fac3=birthmod[i]-d3>0 & birthmod[i]-d4<=0
  18. if(fac1){birth_mod[i]=1}
  19. if(fac2){birth_mod[i]=2}
  20. if(fac3){birth_mod[i]=3}
  21. }
  22. //给新变量birth_mod三个水平1,2,3
  23. levels(birth_mod)=c(1,2,3)
  24. //将数据类型变成factor,以便之后的统计
  25. birth_mod=as.factor(birth_mod)



对最高学历毕业时间是同样的程序

  1. d5=as.Date('1990/1/1')
  2. d6=as.Date('2000/1/1')
  3. d7=as.Date('2010/1/1')
  4. s=0
  5. for(i in eduGrdmod){
  6. s=s+1
  7. }
  8. eduGrd_mod=1:s
  9. for(i in 1:s){
  10. fac3=eduGrdmod[i]-d4>0 & eduGrdmod[i]-d5<=0;fac3
  11. fac4=eduGrdmod[i]-d5>0 & eduGrdmod[i]-d6<=0;fac4
  12. fac5=eduGrdmod[i]-d6>0 & eduGrdmod[i]-d7<=0;fac5
  13. if(fac3){eduGrd_mod[i]=1}
  14. if(fac4){eduGrd_mod[i]=2}
  15. if(fac5){eduGrd_mod[i]=3}
  16. }
  17. levels(eduGrd_mod)=c(1,2,3)
  18. eduGrd_mod=as.factor(eduGrd_mod)



第三步
建立新的数据集grades_mod,注意此处的响应变量(aveGrades)没有用之前为了正态性修改的新的响应变量(aveGrades_mod),这里用aveGrades是为了结果好看,且不影响我们进行描述性统计分析

  1. grades_mod=cbind(grades$aveGrades,grades[2],birth_mod,grades[4:5],eduGrd_mod)
  2. summary(grades_mod)

结果显示

  1. grades$aveGrades gender birth_mod firmType eduBG eduGrd_mod
  2. Min. :50.00 男:133 1:10 国企:95 本科 :148 1: 48
  3. 1st Qu.:77.00 女: 45 2:85 民企:43 大专 : 25 2:104
  4. Median :81.00 3:83 外企:40 硕士 : 2 3: 26
  5. Mean :79.72 硕士或以上: 3
  6. 3rd Qu.:84.00
  7. Max. :91.00



第四步
我们还想知道,各个因变量不同水平对应的学员平均成绩

  1. //编写一个输出均值,标准差,最大值,中位数,最小值的函数
  2. stats = function(x){
  3. m = mean(x)
  4. sd= sd(x)
  5. max = max(x)
  6. median = median(x)
  7. min= min(x)
  8. return=c(m,sd,max,median,min)
  9. }
  10. //aggregate是一个重新显示数据的函数,比如在aggdata1中,能显示按性别分类后,男性学员和女性学员对应的平均成绩的均值,标准差,最大值,中位数,最小值,FUN是function函数的意思
  11. aggdata1= aggregate(grades['aveGrades'],
  12. by=list(gender),FUN=stats);aggdata1
  13. aggdata2= aggregate(grades['aveGrades'],
  14. by=list(birth_mod),FUN=stats)
  15. aggdata3= aggregate(grades['aveGrades'],
  16. by=list(firmType),FUN=stats)
  17. aggdata4= aggregate(grades['aveGrades'],
  18. by=list(eduBG),FUN=stats);aggdata
  19. aggdata5= aggregate(grades['aveGrades'],
  20. by=list(eduGrd_mod),FUN=stats)
  21. //按行将数据重叠起来
  22. aggdata=rbind(aggdata1,aggdata2,aggdata3,aggdata4,aggdata5);aggdata



结果显示


模型分析

接下来我们将进行方差分析
第一步

  1. //进行方差分析的函数是aov,~前面是响应变量,注意此时我们得保证响应变量的正态性,所以用的是新的响应变量(aveGrades_mod)而非原始数据,~后面是自变量,在此模型中还包括了所有的交互项
  2. res.ano1=aov(aveGrades_mod~gender+birth_mod+firmType+eduBG+eduGrd_mod+
  3. gender:birth_mod+gender:firmType+gender:eduBG+gender:eduGrd_mod+
  4. birth_mod:firmType+birth_mod:eduBG+birth_mod:eduGrd_mod+
  5. firmType:eduBG+firmType:eduGrd_mod+
  6. eduBG:eduGrd_mod)
  7. //显示方差分析结果
  8. res1=summary(res.ano1);res1



结果显示



第二步
剔除没通过显著性检验的变量, 用剩下的变量再做一次方差分析

  1. res.ano2=aov(aveGrades_mod~gender+birth_mod+eduBG+
  2. gender:firmType+gender:eduGrd_mod+
  3. birth_mod:firmType+
  4. firmType:eduBG)
  5. res2=summary(res.ano2);res2



结果显示



第三步
剔除没通过显著性检验的变量, 用剩下的变量再做一次方差分析

  1. res.ano3=aov(aveGrades_mod~gender+birth_mod+eduBG+
  2. gender:eduGrd_mod+
  3. birth_mod:firmType)
  4. res3=summary(res.ano3);res3



结果显示



性别(gender),出生日期(birth_mod),最高学历(eduBG)以及交互作用, 性别:最高学历毕业日期(gender:eduGrd_mod),出生日期:企业性质(birth_mod:firmType)都通过了在 0.1 水平下的显著性检验
拒绝原假设,即变量的水平不同会显著影响成绩,如性别中,男生和女生的成绩显著不同,而企业性质的不同不影响学员的成绩

原文链接:http://www.cnblogs.com/kisaragi/p/11148803.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号