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

作者简介

林筱越:华东政法大学 社会学专业 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语言爬虫实战案例分享

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

  1. python与金融量化_day33 Python与金融量化分析(三)

    1 # 导入函数库2 import jqdata3 import numpy asnp4 5 # 初始化函数,设定基准等等6 def initialize(context):7 set_option( ...

  2. 用Python分析了1980~2015年考研英语真题词汇,原来考研英语应该这样考!

    微信改版,加星标不迷路! 用Python分析了1980~2015年考研英语真题词汇,原来考研应该这样考! 作者:阿广 概述 前言 数据介绍 实现过程 考研英语词汇统计分析 搞笑一刻 阿广说 每日问题 ...

  3. Python 分析 35 年的考研英语真题词汇,解读孤独的考研大军!

    作者 | 阿广 责编 | 郭芮 我们渐渐长大,从一开始的初生牛犊不怕虎到渐渐惧怕孤独,从一开始的单打独斗到渐渐合群躲避孤独.不巧的是,考研就是一个孤单修炼的事情,没有任何人能够去帮你,于是二十出头的我 ...

  4. 考研英语长难句分析方法

    无论是什么种类的英语考试,让同学们头痛的事有两个,一个是单词不认识,另一个就是单词都认识,但句子却看不懂.相信只要这两个问题解决了,那所有的英语考试的难度就降低了一大半.     首先就考研的阅读理解 ...

  5. 2011年考研英语一与英语二区别分析

    给弟弟妹妹! 2011年考研英语一与英语二区别分析 http://www.sina.com.cn   2010年09月06日 17:11   跨考网 随着2011年考研英语大纲的公布,明年将继续延续今 ...

  6. 考研:研究生考试(十五天学完)之研究生学霸重点知识点总结之考研必知(考研时间/科目/必备物件)、【考研政治】/【考研英语】/【考研数学】经验总结(历年规律分析、技巧总结、经验分享)

    考研:研究生考试(十五天学完)之研究生学霸重点知识点总结之考研必知(考研时间/科目/必备物件).[考研政治]/[考研英语]/[考研数学]经验总结(历年规律分析.技巧总结.经验分享) 文章转自: 考研: ...

  7. 18考研感悟-大三考研狗一路的学习生活感悟

    Yolov-1-TX2上用YOLOv3训练自己数据集的流程(VOC2007-TX2-GPU) Yolov--2--一文全面了解深度学习性能优化加速引擎---TensorRT Yolov--3--Ten ...

  8. 【做题策略】考研英语一初步分析

    [做题策略]考研英语一初步分析 前言 今天看一下英语一的试卷,思考一下考试时候的做题策略. 之前写了考研政治的做题策略:<[2021考研]政治做题策略>.<马克思主义基本理论重点背诵 ...

  9. 计算机专业考研英语二国家线,近五年不同专业考研英语国家线分析:变化范围1~8分...

    教育部已公布<2018年全国硕士研究生招生考试考生进入复试的初试成绩基本要求>,2018年硕士研究生招生复试录取工作也全面展开.跨考教育英语教研室谷存波老师分析了近五年考研英语国家线的变化 ...

  10. 2017年考研英语二真题中文章来源及规律分析

    2017年 篇目 题型 标题 材料来源 文体 题材 Part1 完形填空 Would a Work-Free World Be So Bad? The Atlantic<大西洋月刊> 议论 ...

最新文章

  1. 计算机信息技术在教学中的发展,浅析计算机在信息技术教学中的应用
  2. 架构师必备技能指南:SaaS(软件即服务)架构设计
  3. Vue项目如何提高效率?大厂2大实践总结告诉你
  4. python pytorch自定义_PyTorch使用自定义模块创建数据模型
  5. Session 和 Cookie 的区别与联系
  6. 介绍一个开源的SIP(VOIP)协议库PJSIP
  7. cisco 2960-24 配置(生产环境)
  8. linux 配置EPEL源
  9. 95-910-335-源码-FlinkSQL-Calcite-FlinkSQL解析
  10. 【VS开发】VS2010中导入ActiveX控件
  11. 高级工程师java_Java从0到高级工程师
  12. android比较两个字符串,关于java:两个字符串的比较在android中不起作用
  13. python做病毒传播的空间数据_利用4行Python代码监测每一行程序的运行时间和空间消耗...
  14. linux下截图软件 shutter
  15. python︱写markdown一样写网页,代码快速生成web工具:streamlit 缓存(五)
  16. exports module.exports export export default之间的关系
  17. 【图像修复】基于matlab GUI约束最小二乘方滤波图像复原【含Matlab源码 852期】
  18. win10下 你需要来自trustedinstaller的权限 修改权限
  19. uniapp重新渲染页面_uni-app里面使用uni.request请求并且渲染列表
  20. Open Street Map—2022年道路数据

热门文章

  1. ubuntu12.04.4安装搜狗输入法
  2. 一份来自亚马逊技术专家的Google面试指南,GitHub收获9.8万星,已翻译成中文
  3. 互联网公司的黑话,你都经历过吗?
  4. PAT乙级真题 | 1006 换个格式输出整数
  5. SQL语言入门(一)
  6. 部署hexo后github pages页面未更新或无法打开问题
  7. 用R语言实现对不平衡数据的四种处理方法
  8. woff字体找不到导致的404错误
  9. [转载].net常用函数
  10. 转载:兼容IE的内阴影和外阴影效果