首页 > 代码库 > r语言学习笔记:分析学生的考试成绩

r语言学习笔记:分析学生的考试成绩

测试数学为某一年级所有班的所有科目的考试成绩表,为了不泄漏孩子的姓名,就用学号代替了。谁感觉兴趣,可以下载测试数据。

num class chn math eng phy chem politics bio history geo pe
0158 3 99 120 114 70 49.5 50 49 48.5 49.5 60
0442 7 107 120 118.5 68.6 43 49 48.5 48.5 49 56
0249 4 98 120 116 70 47.5 47 49 47.5 49 60
0573 9 102 113 111.5 70 47 49 49 49 49.5 60
0310 5 103 120 111.5 70 44.75 46.5 48 48 48 60

# 在windows中设置工作目录

setwd("D:/scores_test")

 

# 读入成绩表,第一行是header

scores <- read.table("scores.txt", header=TRUE, row.names="num")

head(scores)

str(scores)    # 显示对象的结构

names(scores)  # 显示每一列的名称

attach(scores)

 

# 给出数据的概略信息

summary(scores)

summary(scores$math)

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.

   3.00   84.00  100.00   93.98  111.00  120.00

# 1st Qu. 第一个4分位数

# 选择某行

child <- scores[‘239‘,]

sum(child) #求孩子的总分 
[1] 647.45

 

scores.class4 <- scores[class==4,]    # 挑出4班的

 

# 求每个班的平均数学成绩

aver <- tapply(math, class, mean)

# 画条曲线看看每个班的数学平均成绩

plot(aver, type=‘b‘, ylim=c(80,100), main="各班数学成绩平均分", xlab="班级", ylab="数学平均分")

image

# 查看数据的分布情况

table(math, class)

     class

math  1 2 3 4 5 6 7 8 9 10

  3   0 0 0 0 0 0 1 0 0  0

  9   1 0 0 0 0 0 0 0 0  0

  10  1 0 1 0 0 0 0 0 0  0

  18  0 0 0 1 0 1 0 0 1  0

……………

# 求4班每一科的平均成绩

subjects <- c(‘chn‘,‘math‘,‘eng‘,‘phy‘,‘chem‘,‘politics‘,‘bio‘,‘history‘,‘geo‘,‘pe‘)

sapply(scores[class==4, subjects], mean)

     chn     math      eng      phy     chem politics      bio  history      geo       pe

83.10938 97.29688 85.60156 54.30469 34.67969 42.41406 41.79688 36.77344 44.24219 54.31250

 

# 看看数学成绩的分布图

hist(math)

image

boxplot(math)

 

image

# 看看各科成绩的相关性

# 可以看出:数学和物理的相关性达88%,物理和化学成绩的相关性达86%。

cor(scores[,subjects])

               chn      math       eng       phy      chem  politics       bio   history       geo        pe
chn      1.0000000 0.6588126 0.7326778 0.6578172 0.6271155 0.7257003 0.6902282 0.6971145 0.6438662 0.2712453
math     0.6588126 1.0000000 0.8079255 0.8860467 0.8304643 0.7090681 0.7951987 0.7732791 0.7723853 0.3300249
eng      0.7326778 0.8079255 1.0000000 0.8170998 0.7868710 0.7498946 0.7731044 0.7948219 0.7265406 0.3159347
phy      0.6578172 0.8860467 0.8170998 1.0000000 0.8615512 0.7081717 0.8077105 0.8100599 0.7814152 0.3251233
chem     0.6271155 0.8304643 0.7868710 0.8615512 1.0000000 0.6441334 0.7578770 0.7993298 0.7264814 0.2769066
politics 0.7257003 0.7090681 0.7498946 0.7081717 0.6441334 1.0000000 0.7071181 0.7192860 0.6906930 0.3033607
bio      0.6902282 0.7951987 0.7731044 0.8077105 0.7578770 0.7071181 1.0000000 0.7771735 0.8382525 0.2428081
history  0.6971145 0.7732791 0.7948219 0.8100599 0.7993298 0.7192860 0.7771735 1.0000000 0.7731044 0.2708434
geo      0.6438662 0.7723853 0.7265406 0.7814152 0.7264814 0.6906930 0.8382525 0.7731044 1.0000000 0.2605251
pe       0.2712453 0.3300249 0.3159347 0.3251233 0.2769066 0.3033607 0.2428081 0.2708434 0.2605251 1.0000000

# 画个图出来看看

pairs(scores[,subjects])

image

# 详细看看数学和物理的线性相关性

cor_phy_math <- lm(phy ~ math, scores)

plot(math, phy)

abline(cor_phy_math)

cor_phy_math

# 也就是说拟合公式为:phy = 0.5258 * math + 4.7374,为什么是0.52?因为数学最高分为120,物理最高分为70

Call:
lm(formula = phy ~ math, data = http://www.mamicode.com/scores)

Coefficients:
(Intercept)         math 
     4.7374       0.5258

image

r语言学习笔记:分析学生的考试成绩