



学生成绩统计分析通过读取Excel文件中的学生成绩数据,然后进行数据计算、分组统计并绘制相应的图表来详细分析学生各科成绩的情况,其中主要使用了第三方R包openxlsx、数据计算、分组统计和基本绘图函数,这些知识在《R语言数据分析从入门到精通》一书中有详细的讲解,对这些知识不太熟悉的读者可以参考该书对应的内容。
除此之外,本项目实现了通过可视化图表对缺失值进行探索,主要使用了第三方R包VIM,在对学生成绩进行综合排名时使用了rank()函数。下面对这两部分内容进行详细的介绍并举例说明,以确保读者顺利完成本项目的开发,同时拓展相关知识以便更好地利用R语言进行数据分析。
当数据量较大时,想要详细了解数据集中数据的缺失值情况,通过可视化图表探索缺失值是绝佳的选择。第三方R包VIM提供了大量的可视化缺失值函数,如aggr()函数、barMiss()函数、scattMiss()函数、histMiss()函数、matrixplot()函数、marginplot()函数、marginmatrix()函数,下面介绍几个常用的可视化缺失值函数。
aggr()函数不仅可以展示每个变量里缺失值的个数(或比例),还可以展示多个变量组合下缺失值的个数(或比例),例如下面的代码:
library(VIM)
dataset <- sleep[, c("Dream", "NonD", "BodyWgt", "Span")]
aggr(dataset)
运行程序,结果如图1.2所示。
图1.2 aggr()函数可视化缺失值
说明
aggr()函数在可视化缺失值时使用了三种颜色,每一种颜色代表一个属性,具体如下:
观测值用蓝色高亮显示。
缺失值用红色突出显示。
计算值用橙色突出显示。
barMiss()函数提供了一个柱形图,主要分析某一变量在另一变量不同取值情况下的缺失值情况。例如下面的代码:
x <- sleep[, c("Exp", "NonD", "Sleep")]
barMiss(x, only.miss = FALSE)
运行程序,结果如图1.3所示。
图1.3 barMiss()函数可视化缺失值
marginplot()函数提供了一个散点图,在图形边界展示两个变量的缺失值情况。例如下面的代码:
marginplot(sleep[c("Gest","Dream")], pch=c(20),
col=c("darkgray", "red", "blue"))
运行程序,结果如图1.4所示。
图1.4 marginplot()函数可视化缺失值
数据分析过程中,经常需要对数据进行排名。排名主要实现对数据进行排序,然后标记数据在排序中的位置,如学生成绩排名。在R语言中,可以通过rank()函数实现数据排名,默认情况下,rank()函数按照升序排列数据,即排名从低到高。如果需要降序排名,可以使用负号(-)。语法格式如下:
rank(x, na.last = TRUE,ties.method = c("average", "first", "last", "random", "max", "min"))
参数说明:
x:一维数组或向量(数值、复数、字符或逻辑向量)。
na.last:如果参数值为TRUE,则将数据中的缺失值放在排名最后;如果参数值为FALSE,则将缺失值放在第一位;如果参数值为NA,则缺失值会被移除;如果参数值为keep,则不参与排名,保持为NA。
ties.method:排名方法,参数值说明如下。
➢ average:相同元素都取该组中的平均水平,该水平可能是个小数。
➢ first:最基本的排序,小数在前大数在后,相同元素先者在前后者在后。
➢ last:与first类似,不同的是相同元素后者在前先者在后。
➢ random:相同元素随机编排次序,避免了“先到先得”,“权重”优于“先后顺序”的机制增大了随机的程度。
➢ max:小数在前大数在后,相同元素都取该组中最好的水平,即通常所讲的并列排序。
➢ min:小数在前大数在后,相同元素都取该组中最差的水平,可以增大序列的等级差异。
下面通过具体的示例详细介绍rank()函数。例如,使用rank()函数计算学生数学成绩排名,代码如下:
scores <- c(99, 88, 104, 75, 118,60) # 数学成绩 ranks <- rank(-scores) # 降序排名,即高分在前低分在后 print(ranks)
运行程序,结果为:
3 4 2 5 1 6
上述代码输出的是每个学生数学成绩的排名,按照成绩从高到低排列。那么,如果成绩相同,则默认情况下排名相同,并且排名以平均数表示,代码如下:
scores <- c(99, 88, 104, 75, 118,60,88) # 数学成绩 ranks <- rank(-scores) # 降序排名,即高分在前低分在后 print(ranks)
运行程序,结果为:
3.0 4.5 2.0 6.0 1.0 7.0 4.5
从运行结果得知:数学成绩88分的有两名同学,原排名为第4和第5,那么,默认情况下取平均数4.5,这种排名显然不科学。此时可以设置ties.method参数值为min,这样,当有相同的成绩时,将根据成绩排名的最小值来确定相同成绩的排名,代码如下:
ranks <- rank(-scores,ties.method = "min") print(ranks)
运行程序,结果为:
3 4 2 6 1 7 4
从运行结果得知:数学成绩88分的两名同学,排名为并列第4。
那么,如果成绩中存在缺失值,rank()函数又该如何处理呢?这种情况下,可以通过设置na.last参数来决定如何处理缺失值排名的问题,例如下面的代码:
# 数学成绩 scores <- c(99, NA, 104, 75, 118,60) # 排名 ranks <- rank(-scores) print(ranks) # 缺失值放在第一位 ranks <- rank(-scores,na.last = FALSE) print(ranks) # 删除缺失值 ranks <- rank(-scores,na.last = NA) print(ranks) # 不参与排名,保持为NA ranks <- rank(-scores,na.last = "keep") print(ranks)
运行程序,结果如图1.5所示。
图1.5 通过na.last参数处理缺失值排名的问题