查看原文
其他

个人生活的量化分析(三):考研英语初探

林筱越 R语言中文社区 2019-04-22

点击蓝字关注这个神奇的公众号~

作者简介

林筱越:华东政法大学 社会学专业 R语言爱好者 


往期回顾:

使用ggplot2绘制心形

定量论文:探究「健康水平、婚姻状况」对幸福感的影响

个人生活的量化分析(一):时间管理

个人生活的量化分析(二):Apple健康数据分析


全文目录:

1. 前言

2. 数据预处理

3. 可视化部分

  3.1 正确率情况

        3.1.1 各年份试题的正确率
        3.1.2 各题型正确率
  3.2 得分情况
        3.2.1 各年份试题的得分情况
        3.2.2 各题型的得分情况
  3.3 用时情况
          3.3.1 各年份试题用时情况
          3.3.2 各题型用时情况

4. 读图部分
  4.1 正确率
  4.2 得分情况
  4.3 用时情况

5. 总结

 



1. 前言

本人目前正处于考研备考阶段,考研英语是考研中重要部分之一,所以每天在英语上花费了大量的时间。随着2005年-2014年的真题的客观题(客观题部分)一刷已经完成,第一阶段的英语复习也暂告一段落。

为了探索一下自己对于这些真题的做题状况,所以就有了这第三篇的量化分析的想法。在此之前我已经自己建立好了两个有关2005年-2014年的做题记录的csv,分别是「正确记录」和「用时记录」,全文都是围绕这两个数据集展开。

 

2. 数据预处理

首先,在「正确记录」的基础上我分别重新生成了「正确率」数据集(包含各题型的正确率和总的正确率)和「得分分数」数据集(各题型加权后的分数和总分数);并将最后的总正确率和总得分添加到原数据集里。

其次,由于ggplot绘图对于数据集的要求是「长格式数据」(变量和值分别归入一个列中)而非「宽格式数据」,因此在三个宽格式数据集的基础上使用gather函数分别将其转化为长格式:

# 加载包
library(tidyverse) #数据处理工具包
library(lubridate) #处理日期值
library(gridExtra) #一页多图

#预处理
## 1.正确记录数据处理
options(digits =3)
data <-read_csv('1st_corrects.csv')
head(data)
data<-data[1:10,] #提取2005-2014年的记录
names(data) <-tolower(names(data)) #变量名小写转换

###  1.1建立其他数据集
#正确率数据集
correct_prop <-tibble(exams = data$exams,
                      cloze_prop = data$cloze/20,
                      text1_prop =data$text1/5,
                      text2_prop =data$text2/5,
                      text3_prop = data$text3/5,
                      text4_prop =data$text4/5,
                      sort_prop = data$sort/5)
data$total_prop <-apply(data[,-1], 1, sum)/45

#分数数据集
grade <-cbind(data[,2]*0.5, data[,3:7]*2)
names(grade) <-paste0(names(grade),'_score')
data$grade<-apply(grade, 1, sum)
grade$exams <-data$exams


### 1.2宽数据转为长数据
data_long <-data %>%
  gather(cloze:sort, key='types', value ='corrects')

correct_long <-correct_prop %>%
  gather(cloze_prop:sort_prop, key ='types', value ='prop')

grade_long <-grade %>%
  select(exams,cloze_score:sort_score) %>%
  gather(cloze_score:sort_score,key='types', value='score')

在「用时记录」数据中,由于我已经做了分列汇总,所以要将2005年-2014年的记录提取出来,使用filter函数来过滤掉未记录的缺失值以及其他汇总信息;

同时,避免Excel表格自动给单元格设定格式的问题,我使用「'」英文输入下的单引号来间隔分与秒;然后使用str_replace将其替换为冒号后,再通过lubridate包中的ms函数来将其转化正确的时间,最后为了便于分析将时间转化为保留两位数的数值型:

## 2.用时记录数据处理
### 2.1 日期值变量
use_time$use_time <-str_replace(use_time$use_time, '\'',':') %>%ms() %>%as.numeric()/60%>%round(.,digits=2)

同时,「用时记录」的基础上,我利用类似于SQL语句中联结(join)语句的方法创立了一个新的「联结数据」:

  • 首先,由于用时数据中题型的记录我以数字来表示,所以要生成一个「因子处理」后题型变量才能成功;

  • 然后,使用inner_join函数进行全联接(关键字一一对应匹配)以「题型」和「各年份试题」为联结的关键字与「长格式」的正确记录数据集连接;

  • 最后,使用select函数进行切片,提取出了新的「联结数据」

至此,数据的预处理基本处理完毕,好在本次用的数据集都是及时记录,因此也不存在处理缺失值的问题:

### 2.1 题型变量
use_time$types <-factor(use_time$parts, levels =c(0,1,2,3,4,5), labels =c('cloze',paste0('text',seq(1:4)),'sort')) #先将题型转化为因子
### 2.2 数据集联结
join_data <-inner_join(use_time, data_long, by=c('exams','types')) #全联接
slice_data <-join_data %>%
  select(exams, use_time, types, corrects)
head(slice_data)


3. 可视化部分

为了减少修饰细节的代码量,我提前先设置了一套自己稍微修改的主题,后面只需要使用theme_set函数来加载即可:

# 创建一套简洁的通用的主题
mytheme <-theme_bw() +
  theme(text =element_text(family='STHeiti'),
        plot.title =element_text(hjust =0.5))

3.1 正确率情况

3.1.1 各年份试题的正确率

为了易于读图、理解,这里提前将正确率转化为百分比形式,并且通过以下函数来对整体进行修整,后面部分同类型的函数应该能容易理解,就不再多做解释:

  • 由于y轴是百分比属于连续型变量,所以使用scale_y_continuous的breaks参数来手动设定刻度点,然后通过labels参数来为每个刻度点添加百分号

  • 然后使用geom_text来将前面已经建立好的数值标签映射到每个分类条上,并适当调整间距位置

yearProp_label<-paste0(round(data$total_prop,
                               digits =2), '%')
yearOfprop <-data%>%
  ggplot(aes(x=as.factor(exams),
             y=total_prop*100, fill=as.factor(exams))) +
  geom_bar(stat='identity', show.legend = F) +
  labs(title ='各年份试题正确率对比', x='年份', y='正确率(%)') +
  # y轴刻度添加百分比符号
  scale_y_continuous(breaks =c(0,20,40,60),
                     labels =paste0(c(0,20,40,60),'%')) +
  # 给每个条形添加百分比数值
  geom_text(aes(label = yearProp_label, hjust=1)) +
  # theme_set来设定前面已经创建好的主题
  theme_set(mytheme) +
  coord_flip()


3.1.2 各题型正确率

在这一部分我添加了中位线,不过这里有一个小技巧需要说明的是,由于ggplot语法是层叠绘图,因此为了避免中位线影响到了分类条,所以要先于geom_bar进行绘制:

  • 首先,为了减少误差而使用中位数,并且由于我对整个坐标轴进行了x与y轴的翻转,所以通过geom_hline来添加线条,并对其进行修饰

  • 然后,使用annotate函数来生成用以注释的公式标签

  • 最后,使用geom_segment来创建一个箭头从中位线指向注释

typeProp_label<-correct_long %>%
  group_by(types) %>%
  summarize(type_prop = (sum(prop)/10)*100)

correct_long$types_f<-factor(correct_long$types,
                            labels =c('完形','排序','阅读1',
                                       '阅读2','阅读3','阅读4'))
typeOfprop <-correct_long %>%
  group_by(types_f) %>%
  summarize(type_prop = (sum(prop)/10)*100) %>%
  ggplot(aes(x=types_f, y=type_prop, fill=types_f)) +
  # 绘制中位数线
  geom_hline(yintercept =54, alpha=0.5, colour='darkred',
             linetype='dashed') +
 # 添加注释
  annotate('text', x=1.2, y=60,
           label ='Median = 54%',size=4) +
  # 添加箭头
  geom_segment(aes(x=2, y=54, xend=1.5, yend=56),
               arrow=arrow(length =unit(0.1,'cm')),size=0.5,
               colour='purple') +
 
  geom_bar(stat='identity', position ='stack',show.legend = F) +
  coord_flip()+
  geom_text(aes(label=paste0(round(typeProp_label$type_prop,2),'%'),
                hjust=1)) +
  # 作用同下
  scale_x_discrete(label =levels(correct_long$types_f)) +
  scale_y_continuous(breaks =c(0,20,40,60,80),
                     labels =paste0(c(0,20,40,60,80),'%')) +
  labs(title='各题型正确率对比', x='题型', y='正确率(%)') +
  theme_set(mytheme)
 


3.2 得分情况

3.2.1 各年份试题的得分情况

由于在之前已经通过得分分数数据集获取到了总分,因此这里就直接就在正确记录的数据集上绘制;同时在最后重新通过theme来删去了一些多余的网格线,使得整个图形看起来更加简洁:

yearOfgrade<-data %>%
  ggplot(aes(x=exams, y=grade, group=1)) +
  # 先绘制分数中位数线避免重叠
  geom_hline(yintercept =median(data$grade),
             color='red', linetype='dotdash', alpha=0.5) +
  geom_point() +
  geom_line() +
  labs(title ='各年份试题得分情况', x='年份', y='得分') +
  geom_text(aes(y=data$grade-0.5 ,label=data$grade), hjust=-0.35) +
  # parse使标签以数学表达式的形式呈现
  annotate('text', x=2, y=40,label ='italic(Median) == 33',parse=T) +
  # 指定箭头的方向、长短、颜色等
  geom_segment(aes(x=1.2, y=33, xend=2,yend=38),
               arrow =arrow(length=unit(0.1,'cm')),
               color='purple')+
  # \n 表示换行
  scale_x_discrete(label =paste0(c(2005:2014),'\nyears'))+
  theme_set(mytheme) +
  theme(panel.grid.major.y =element_blank(),
        panel.grid.minor.y =element_blank())
 


3.2.2 各题型的得分情况

由于分数数据集是基于正确记录数据生成的,而在后者中,题型变量一直都属于字符串型,所以这里为了便于展示生成了一个新的因子型题型变量:

grade_long$types_f<-factor(grade_long$types,
                            labels =c('完形','排序','阅读1',
                                       '阅读2','阅读3','阅读4'))
typeOfgrade <-grade_long %>%
  ggplot(aes(x=types_f, y=score, fill=types_f)) +
  geom_boxplot(show.legend = F) +
  theme_set(mytheme) +
  labs(title='各题型分数线对比图', x='题型', y='分数(分)')

 


3.3 用时情况

3.3.1 各年份试题用时情况

在前面处理中,我将用时处理成数值型的形式,不过一般而言英语考研时间大概3小时,所以这里就通过summarize函数来将总计的用时由分钟转化小时:

yearOftime<-use_time %>%
  group_by(exams) %>%
  summarize(total_time =sum(use_time)/60) %>%
  ggplot(aes(x=exams, y=total_time, fill=as.factor(exams))) +
  # 先绘制平均线避免覆盖
  geom_hline(yintercept =1.77, alpha=0.5, colour='darkred',
             linetype='dashed') +
  geom_bar(stat='identity',show.legend = F) +
  geom_text(aes(label=paste0(round(total_time,2), 'h')),
            hjust=1.1) +
  geom_segment(aes(x=3, y=1.77, xend=2, yend=2),
               arrow=arrow(length =unit(0.1,'cm')),size=0.1,
               colour='purple') +
  annotate('text', x=1.5, y=2,
           label =c('Mean=1.77h'),size=3) +
  scale_y_continuous(breaks=c(0,0.5,1,1.5,2),
                     labels=paste0(c(0,0.5,1,1.5,2),'h')) +
  coord_flip() +
  labs(title='各年份试题客观题耗时', x='年份',y='用时(h)') +
  theme_set(mytheme)


3.3.2 各题型用时情况

为了想更好的了解在各题型上是否存在用时的差异,所以使用箱线图(boxplot)来查看是一个非常好的方式:

typeOftime<-slice_data %>%
  group_by(types)%>%
  ggplot(aes(x=types, y=use_time, fill=types)) +
  geom_boxplot(show.legend = F) +
  labs(title ='各题型平均用时对比',x='题型', y='用时(分钟)') +
  scale_x_discrete(labels =c('完形',paste0('阅读',seq(1:4)),'排序'))+
  scale_y_continuous(breaks=pretty(slice_data$use_time),
                     labels=paste0(pretty(slice_data$use_time),'mins'))+
  theme_set(mytheme)


4. 读图部分

为了便于比较第三部分中所绘制的6张图形,这里我就将按照第三部分的三类,将其分别绘制到三张图上,并最后使用ggsave导出为PDF格式;不过由于 R 在 MacOS 一直存在着乱码问题,通过指定device=cairo_pdf可以解决(Windows上应该是没有这个问题,可以不使用这个参数):

# 图形整合
g <-grid.arrange(yearOfgrade, typeOfgrade,ncol=2)
p <-grid.arrange(yearOfprop, typeOfprop,ncol=2)
t <-grid.arrange(yearOftime, typeOftime,ncol=2)

#这里就只其中一个部分的保存
ggsave('p.pdf', p, device=cairo_pdf,
       height=5.5, width=11, dpi=400)

4.1 正确率 

通过图形可以看出:

  • 随着对于题型的适应,除了2010年的试题(这一年的题目我觉得还是挺难的……),2006年后的试题基本上正确率都处于增加的趋势,最好的一次是13年的试题。虽然我没为图形加上中位线,不过可以看出自己的正确率也就大概53%~55%这样

  • 在各题型中,除了阅读前三篇过了中位线外,其他三部分想要做好还是有困难的。


4.2 得分情况 

通过图形可以看出:

  • 考研英语的客观题部分满分为60分,保守估计,正常发挥下一般可以拿到30分左右,如果在后面40分的主观题上即使拿只能拿一半分,那么过国家线(学硕大概40左右)还是十分有信心的。

  • 在题型正确率图下,再比对一下每个题型上的分数差异还是可以自己的不足:完形、排序和阅读第4篇这三部分分数不太理想,这也就说明在后面的阶段,有必要针对这三部分加大训练。


4.3 用时情况

通过图形可以看出:

  • 通过第一轮做题可以看出,自己平时在一套卷子的客观题部分大约在1.7小时以下,剩下的时间用于翻译、写作部分可以说是最基本的要求了;不过还是有少数情况下超过了平均用时

  • 在各类题型的用时上可以看出,除了完形以外,每类题型用时基本限定于15分钟左右;随着自己摸索出了一些做题技巧,找答案的速度有所上升,也可能在10分钟左右完成。


5. 总结

本文通过量化的方式来对自己目前考研复习情况进行了初次的探索,在后面的学习阶段应该有所改进:

  • 提高做题的正确率,除了完形以外,在其他题型的用时尽可能压缩到15分钟以下,为主观题争取更多的时间分配

  • 在完形、阅读4和排序题上需要有针对性的加强训练,尽可能的多拿分,并且保证其他客观题型不易失分

在每一个复习阶段中做好每次相应训练的记录,可以位后续的计划或者调整可以提供一些决策的依据;做到科学备考、心里有数可以为自己增加不少的自信心。也希望自己和2019年准备考研的各位如愿以偿。

 

 


 大家都在看 

2017年R语言发展报告(国内)

R语言中文社区历史文章整理(作者篇)

R语言中文社区历史文章整理(类型篇)


公众号后台回复关键字即可学习

回复 R                  R语言快速入门及数据挖掘 
回复 Kaggle案例  Kaggle十大案例精讲(连载中)
回复 文本挖掘      手把手教你做文本挖掘
回复 可视化          R语言可视化在商务场景中的应用 
回复 大数据         大数据系列免费视频教程 
回复 量化投资      张丹教你如何用R语言量化投资 
回复 用户画像      京东大数据,揭秘用户画像
回复 数据挖掘     常用数据挖掘算法原理解释与应用
回复 机器学习     人工智能系列之机器学习与实践
回复 爬虫            R语言爬虫实战案例分享

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

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