Data

Excel 자료 읽어들이기

midterm.roll <- read.xlsx("../data/midterm_02.xlsx", 
                          sheetIndex = 1, 
                          startRow = 3, 
                          endRow  = 30, 
                          colIndex = c(4, 10:49), 
                          colClasses = rep("character", 41), 
                          encoding = "UTF-8",
                          header = FALSE, 
                          stringsAsFactors = FALSE)
names(midterm.roll) <- c("id", paste("Q", 1:40, sep = ""))
kable(head(midterm.roll[, 2:21]))
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16 Q17 Q18 Q19 Q20
4 3 3 2 1 1 2 3 2 3 1 3 1 1 4 3 1 2 4 1
4 4 4 1 1 4 2 4 1 2 1 4 1 1 2 3 3 2 1 2
3 3 4 2 3 4 2 4 2 4 4 3 1 1 2 2 3 3 4 1
4 4 3 1 1 4 2 4 1 2 2 4 1 1 2 3 1 2 1 2
4 4 4 2 1 4 2 4 1 2 1 4 1 2 1 3 3 1 2 3
3 4 4 1 4 2 2 4 1 1 4 4 2 1 4 3 3 2 3 3
kable(head(midterm.roll[, 22:41]))
Q21 Q22 Q23 Q24 Q25 Q26 Q27 Q28 Q29 Q30 Q31 Q32 Q33 Q34 Q35 Q36 Q37 Q38 Q39 Q40
3 3 2 2 2 3 2 3 1 3 1 2 2 1 2 4 3 1 4 3
1 3 1 2 1 3 2 2 2 1 1 4 1 2 2 4 3 4 3 4
1 4 1 1 3 2 2 3 3 4 4 2 3 2 2 2 3 1 3 3
1 3 1 3 1 1 2 4 1 1 1 4 1 2 2 2 1 1 3 4
4 3 4 2 4 3 4 4 2 2 4 4 1 2 2 4 2 1 1 4
1 3 3 2 4 3 2 2 2 1 4 2 4 1 2 2 3 2 2 3
str(midterm.roll)
## 'data.frame':    28 obs. of  41 variables:
##  $ id : chr  "20133301" "20133404" "20157096" "20143404" ...
##  $ Q1 : chr  "4" "4" "3" "4" ...
##  $ Q2 : chr  "3" "4" "3" "4" ...
##  $ Q3 : chr  "3" "4" "4" "3" ...
##  $ Q4 : chr  "2" "1" "2" "1" ...
##  $ Q5 : chr  "1" "1" "3" "1" ...
##  $ Q6 : chr  "1" "4" "4" "4" ...
##  $ Q7 : chr  "2" "2" "2" "2" ...
##  $ Q8 : chr  "3" "4" "4" "4" ...
##  $ Q9 : chr  "2" "1" "2" "1" ...
##  $ Q10: chr  "3" "2" "4" "2" ...
##  $ Q11: chr  "1" "1" "4" "2" ...
##  $ Q12: chr  "3" "4" "3" "4" ...
##  $ Q13: chr  "1" "1" "1" "1" ...
##  $ Q14: chr  "1" "1" "1" "1" ...
##  $ Q15: chr  "4" "2" "2" "2" ...
##  $ Q16: chr  "3" "3" "2" "3" ...
##  $ Q17: chr  "1" "3" "3" "1" ...
##  $ Q18: chr  "2" "2" "3" "2" ...
##  $ Q19: chr  "4" "1" "4" "1" ...
##  $ Q20: chr  "1" "2" "1" "2" ...
##  $ Q21: chr  "3" "1" "1" "1" ...
##  $ Q22: chr  "3" "3" "4" "3" ...
##  $ Q23: chr  "2" "1" "1" "1" ...
##  $ Q24: chr  "2" "2" "1" "3" ...
##  $ Q25: chr  "2" "1" "3" "1" ...
##  $ Q26: chr  "3" "3" "2" "1" ...
##  $ Q27: chr  "2" "2" "2" "2" ...
##  $ Q28: chr  "3" "2" "3" "4" ...
##  $ Q29: chr  "1" "2" "3" "1" ...
##  $ Q30: chr  "3" "1" "4" "1" ...
##  $ Q31: chr  "1" "1" "4" "1" ...
##  $ Q32: chr  "2" "4" "2" "4" ...
##  $ Q33: chr  "2" "1" "3" "1" ...
##  $ Q34: chr  "1" "2" "2" "2" ...
##  $ Q35: chr  "2" "2" "2" "2" ...
##  $ Q36: chr  "4" "4" "2" "2" ...
##  $ Q37: chr  "3" "3" "3" "1" ...
##  $ Q38: chr  "1" "4" "1" "1" ...
##  $ Q39: chr  "4" "3" "3" "3" ...
##  $ Q40: chr  "3" "4" "3" "4" ...
midterm <- midterm.roll[, -1]
kable(midterm[1:16])
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16
4 3 3 2 1 1 2 3 2 3 1 3 1 1 4 3
4 4 4 1 1 4 2 4 1 2 1 4 1 1 2 3
3 3 4 2 3 4 2 4 2 4 4 3 1 1 2 2
4 4 3 1 1 4 2 4 1 2 2 4 1 1 2 3
4 4 4 2 1 4 2 4 1 2 1 4 1 2 1 3
3 4 4 1 4 2 2 4 1 1 4 4 2 1 4 3
4 4 4 2 1 4 2 3 1 2 2 4 1 1 2 3
4 4 4 1 1 4 2 4 1 2 2 4 1 1 2 3
4 3 4 2 1 4 2 4 2 3 2 2 3 2 2 2
4 4 4 1 1 4 2 4 1 2 2 4 1 1 3 3
4 4 4 4 1 4 1 3 1 3 4 2 4 1 2 2
4 4 4 1 1 4 1 4 1 2 1 4 1 1 2 3
4 4 4 1 1 4 4 4 1 2 1 4 1 1 2 3
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
4 4 4 1 1 4 3 4 1 2 4 4 3 1 2 3
4 4 4 1 1 4 2 4 1 2 4 4 1 1 2 3
4 4 4 1 1 4 2 4 1 2 2 4 1 1 2 3
4 4 3 2 1 4 2 4 3 1 2 4 1 1 2 3
4 4 3 1 1 4 2 4 1 2 2 4 1 1 2 3
4 4 4 1 1 4 2 4 1 2 1 4 1 1 2 3
4 4 4 2 1 4 3 4 1 2 2 4 4 1 2 3
4 3 3 2 1 4 2 1 2 3 1 3 2 1 2 3
1 4 4 1 1 4 2 4 1 3 4 4 2 1 2 3
4 4 4 1 2 2 2 3 1 1 4 4 1 1 2 1
4 4 4 1 1 4 2 4 1 3 2 4 1 1 2 3
4 4 3 1 1 4 3 4 1 2 2 4 1 2 2 1
4 4 4 1 4 4 2 4 1 1 2 4 3 1 2 3
4 4 4 2 1 4 2 3 1 2 3 4 3 1 2 3
kable(midterm[17:33])
Q17 Q18 Q19 Q20 Q21 Q22 Q23 Q24 Q25 Q26 Q27 Q28 Q29 Q30 Q31 Q32 Q33
1 2 4 1 3 3 2 2 2 3 2 3 1 3 1 2 2
3 2 1 2 1 3 1 2 1 3 2 2 2 1 1 4 1
3 3 4 1 1 4 1 1 3 2 2 3 3 4 4 2 3
1 2 1 2 1 3 1 3 1 1 2 4 1 1 1 4 1
3 1 2 3 4 3 4 2 4 3 4 4 2 2 4 4 1
3 2 3 3 1 3 3 2 4 3 2 2 2 1 4 2 4
3 2 1 1 2 3 2 1 3 3 4 1 2 2 1 2 4
4 2 1 2 1 3 4 3 1 3 2 4 1 1 2 4 1
1 2 4 1 1 1 3 2 2 3 4 4 1 1 4 1 3
3 2 3 2 1 2 3 3 1 3 4 4 2 4 1 4 4
3 2 3 3 2 3 4 1 2 1 4 3 2 3 4 2 3
3 2 1 2 1 4 4 3 3 3 2 1 1 3 1 4 1
3 2 1 2 1 3 1 3 1 3 2 2 1 1 1 4 1
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
3 1 3 1 1 4 4 1 2 1 2 2 2 1 3 4 1
3 2 2 2 1 3 1 2 3 3 4 2 4 1 1 2 1
3 2 3 2 1 3 2 3 1 3 2 4 1 1 1 4 1
3 2 3 4 1 3 1 1 4 1 4 1 2 1 1 2 3
3 2 3 2 1 3 1 2 4 3 2 1 2 1 4 2 1
3 2 3 1 1 4 4 1 1 4 4 4 1 1 1 4 1
3 2 2 2 1 4 2 3 1 3 4 3 1 2 1 2 1
3 1 3 4 2 4 2 2 4 3 2 4 1 1 1 2 3
3 2 3 2 1 3 2 3 1 3 2 2 1 1 4 2 1
3 2 1 2 1 3 3 1 4 4 4 2 2 2 4 4 4
3 2 1 2 1 3 1 3 1 1 2 2 1 1 1 4 1
3 2 1 2 1 3 2 2 4 1 2 3 2 1 1 4 1
3 1 3 2 1 4 3 2 1 1 4 1 1 1 4 3 1
3 2 1 3 4 2 4 1 1 1 4 1 4 1 1 4 2

factor 변환

midterm <- lapply(midterm, 
                  factor, 
                  levels = 1:4, 
                  labels = c("가", "나", "다", "라"))
str(midterm)
## List of 40
##  $ Q1 : Factor w/ 4 levels "가","나","다",..: 4 4 3 4 4 3 4 4 4 4 ...
##  $ Q2 : Factor w/ 4 levels "가","나","다",..: 3 4 3 4 4 4 4 4 3 4 ...
##  $ Q3 : Factor w/ 4 levels "가","나","다",..: 3 4 4 3 4 4 4 4 4 4 ...
##  $ Q4 : Factor w/ 4 levels "가","나","다",..: 2 1 2 1 2 1 2 1 2 1 ...
##  $ Q5 : Factor w/ 4 levels "가","나","다",..: 1 1 3 1 1 4 1 1 1 1 ...
##  $ Q6 : Factor w/ 4 levels "가","나","다",..: 1 4 4 4 4 2 4 4 4 4 ...
##  $ Q7 : Factor w/ 4 levels "가","나","다",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ Q8 : Factor w/ 4 levels "가","나","다",..: 3 4 4 4 4 4 3 4 4 4 ...
##  $ Q9 : Factor w/ 4 levels "가","나","다",..: 2 1 2 1 1 1 1 1 2 1 ...
##  $ Q10: Factor w/ 4 levels "가","나","다",..: 3 2 4 2 2 1 2 2 3 2 ...
##  $ Q11: Factor w/ 4 levels "가","나","다",..: 1 1 4 2 1 4 2 2 2 2 ...
##  $ Q12: Factor w/ 4 levels "가","나","다",..: 3 4 3 4 4 4 4 4 2 4 ...
##  $ Q13: Factor w/ 4 levels "가","나","다",..: 1 1 1 1 1 2 1 1 3 1 ...
##  $ Q14: Factor w/ 4 levels "가","나","다",..: 1 1 1 1 2 1 1 1 2 1 ...
##  $ Q15: Factor w/ 4 levels "가","나","다",..: 4 2 2 2 1 4 2 2 2 3 ...
##  $ Q16: Factor w/ 4 levels "가","나","다",..: 3 3 2 3 3 3 3 3 2 3 ...
##  $ Q17: Factor w/ 4 levels "가","나","다",..: 1 3 3 1 3 3 3 4 1 3 ...
##  $ Q18: Factor w/ 4 levels "가","나","다",..: 2 2 3 2 1 2 2 2 2 2 ...
##  $ Q19: Factor w/ 4 levels "가","나","다",..: 4 1 4 1 2 3 1 1 4 3 ...
##  $ Q20: Factor w/ 4 levels "가","나","다",..: 1 2 1 2 3 3 1 2 1 2 ...
##  $ Q21: Factor w/ 4 levels "가","나","다",..: 3 1 1 1 4 1 2 1 1 1 ...
##  $ Q22: Factor w/ 4 levels "가","나","다",..: 3 3 4 3 3 3 3 3 1 2 ...
##  $ Q23: Factor w/ 4 levels "가","나","다",..: 2 1 1 1 4 3 2 4 3 3 ...
##  $ Q24: Factor w/ 4 levels "가","나","다",..: 2 2 1 3 2 2 1 3 2 3 ...
##  $ Q25: Factor w/ 4 levels "가","나","다",..: 2 1 3 1 4 4 3 1 2 1 ...
##  $ Q26: Factor w/ 4 levels "가","나","다",..: 3 3 2 1 3 3 3 3 3 3 ...
##  $ Q27: Factor w/ 4 levels "가","나","다",..: 2 2 2 2 4 2 4 2 4 4 ...
##  $ Q28: Factor w/ 4 levels "가","나","다",..: 3 2 3 4 4 2 1 4 4 4 ...
##  $ Q29: Factor w/ 4 levels "가","나","다",..: 1 2 3 1 2 2 2 1 1 2 ...
##  $ Q30: Factor w/ 4 levels "가","나","다",..: 3 1 4 1 2 1 2 1 1 4 ...
##  $ Q31: Factor w/ 4 levels "가","나","다",..: 1 1 4 1 4 4 1 2 4 1 ...
##  $ Q32: Factor w/ 4 levels "가","나","다",..: 2 4 2 4 4 2 2 4 1 4 ...
##  $ Q33: Factor w/ 4 levels "가","나","다",..: 2 1 3 1 1 4 4 1 3 4 ...
##  $ Q34: Factor w/ 4 levels "가","나","다",..: 1 2 2 2 2 1 2 2 2 1 ...
##  $ Q35: Factor w/ 4 levels "가","나","다",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ Q36: Factor w/ 4 levels "가","나","다",..: 4 4 2 2 4 2 4 2 2 1 ...
##  $ Q37: Factor w/ 4 levels "가","나","다",..: 3 3 3 1 2 3 2 3 3 2 ...
##  $ Q38: Factor w/ 4 levels "가","나","다",..: 1 4 1 1 1 2 3 2 3 1 ...
##  $ Q39: Factor w/ 4 levels "가","나","다",..: 4 3 3 3 1 2 1 3 4 4 ...
##  $ Q40: Factor w/ 4 levels "가","나","다",..: 3 4 3 4 4 3 4 4 3 4 ...
midterm <- data.frame(midterm, 
                      row.names = NULL)
str(midterm)
## 'data.frame':    28 obs. of  40 variables:
##  $ Q1 : Factor w/ 4 levels "가","나","다",..: 4 4 3 4 4 3 4 4 4 4 ...
##  $ Q2 : Factor w/ 4 levels "가","나","다",..: 3 4 3 4 4 4 4 4 3 4 ...
##  $ Q3 : Factor w/ 4 levels "가","나","다",..: 3 4 4 3 4 4 4 4 4 4 ...
##  $ Q4 : Factor w/ 4 levels "가","나","다",..: 2 1 2 1 2 1 2 1 2 1 ...
##  $ Q5 : Factor w/ 4 levels "가","나","다",..: 1 1 3 1 1 4 1 1 1 1 ...
##  $ Q6 : Factor w/ 4 levels "가","나","다",..: 1 4 4 4 4 2 4 4 4 4 ...
##  $ Q7 : Factor w/ 4 levels "가","나","다",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ Q8 : Factor w/ 4 levels "가","나","다",..: 3 4 4 4 4 4 3 4 4 4 ...
##  $ Q9 : Factor w/ 4 levels "가","나","다",..: 2 1 2 1 1 1 1 1 2 1 ...
##  $ Q10: Factor w/ 4 levels "가","나","다",..: 3 2 4 2 2 1 2 2 3 2 ...
##  $ Q11: Factor w/ 4 levels "가","나","다",..: 1 1 4 2 1 4 2 2 2 2 ...
##  $ Q12: Factor w/ 4 levels "가","나","다",..: 3 4 3 4 4 4 4 4 2 4 ...
##  $ Q13: Factor w/ 4 levels "가","나","다",..: 1 1 1 1 1 2 1 1 3 1 ...
##  $ Q14: Factor w/ 4 levels "가","나","다",..: 1 1 1 1 2 1 1 1 2 1 ...
##  $ Q15: Factor w/ 4 levels "가","나","다",..: 4 2 2 2 1 4 2 2 2 3 ...
##  $ Q16: Factor w/ 4 levels "가","나","다",..: 3 3 2 3 3 3 3 3 2 3 ...
##  $ Q17: Factor w/ 4 levels "가","나","다",..: 1 3 3 1 3 3 3 4 1 3 ...
##  $ Q18: Factor w/ 4 levels "가","나","다",..: 2 2 3 2 1 2 2 2 2 2 ...
##  $ Q19: Factor w/ 4 levels "가","나","다",..: 4 1 4 1 2 3 1 1 4 3 ...
##  $ Q20: Factor w/ 4 levels "가","나","다",..: 1 2 1 2 3 3 1 2 1 2 ...
##  $ Q21: Factor w/ 4 levels "가","나","다",..: 3 1 1 1 4 1 2 1 1 1 ...
##  $ Q22: Factor w/ 4 levels "가","나","다",..: 3 3 4 3 3 3 3 3 1 2 ...
##  $ Q23: Factor w/ 4 levels "가","나","다",..: 2 1 1 1 4 3 2 4 3 3 ...
##  $ Q24: Factor w/ 4 levels "가","나","다",..: 2 2 1 3 2 2 1 3 2 3 ...
##  $ Q25: Factor w/ 4 levels "가","나","다",..: 2 1 3 1 4 4 3 1 2 1 ...
##  $ Q26: Factor w/ 4 levels "가","나","다",..: 3 3 2 1 3 3 3 3 3 3 ...
##  $ Q27: Factor w/ 4 levels "가","나","다",..: 2 2 2 2 4 2 4 2 4 4 ...
##  $ Q28: Factor w/ 4 levels "가","나","다",..: 3 2 3 4 4 2 1 4 4 4 ...
##  $ Q29: Factor w/ 4 levels "가","나","다",..: 1 2 3 1 2 2 2 1 1 2 ...
##  $ Q30: Factor w/ 4 levels "가","나","다",..: 3 1 4 1 2 1 2 1 1 4 ...
##  $ Q31: Factor w/ 4 levels "가","나","다",..: 1 1 4 1 4 4 1 2 4 1 ...
##  $ Q32: Factor w/ 4 levels "가","나","다",..: 2 4 2 4 4 2 2 4 1 4 ...
##  $ Q33: Factor w/ 4 levels "가","나","다",..: 2 1 3 1 1 4 4 1 3 4 ...
##  $ Q34: Factor w/ 4 levels "가","나","다",..: 1 2 2 2 2 1 2 2 2 1 ...
##  $ Q35: Factor w/ 4 levels "가","나","다",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ Q36: Factor w/ 4 levels "가","나","다",..: 4 4 2 2 4 2 4 2 2 1 ...
##  $ Q37: Factor w/ 4 levels "가","나","다",..: 3 3 3 1 2 3 2 3 3 2 ...
##  $ Q38: Factor w/ 4 levels "가","나","다",..: 1 4 1 1 1 2 3 2 3 1 ...
##  $ Q39: Factor w/ 4 levels "가","나","다",..: 4 3 3 3 1 2 1 3 4 4 ...
##  $ Q40: Factor w/ 4 levels "가","나","다",..: 3 4 3 4 4 3 4 4 3 4 ...

답안 분포

kable(midterm[1:20])
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16 Q17 Q18 Q19 Q20
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
kable(midterm[21:40])
Q21 Q22 Q23 Q24 Q25 Q26 Q27 Q28 Q29 Q30 Q31 Q32 Q33 Q34 Q35 Q36 Q37 Q38 Q39 Q40
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
kable(t(sapply(midterm, table)))
Q1 1 0 2 24
Q2 0 0 4 23
Q3 0 0 6 21
Q4 17 9 0 1
Q5 23 1 1 2
Q6 1 2 0 24
Q7 2 21 3 1
Q8 1 0 5 21
Q9 22 4 1 0
Q10 4 16 6 1
Q11 7 12 1 7
Q12 0 2 3 22
Q13 18 3 4 2
Q14 24 3 0 0
Q15 1 23 1 2
Q16 2 3 22 0
Q17 3 0 23 1
Q18 4 22 1 0
Q19 10 3 11 3
Q20 6 15 4 2
Q21 21 3 1 2
Q22 1 2 17 7
Q23 8 7 5 7
Q24 8 10 9 0
Q25 12 4 4 7
Q26 8 1 16 2
Q27 0 15 0 12
Q28 6 8 5 8
Q29 13 11 1 2
Q30 18 4 3 2
Q31 16 1 1 9
Q32 1 11 1 14
Q33 16 2 5 4
Q34 4 20 1 2
Q35 1 25 0 1
Q36 1 19 0 7
Q37 9 6 12 0
Q38 10 10 4 3
Q39 4 7 10 6
Q40 0 1 13 13

barplot

막대그래프로 답안 분포를 시각적으로 살핀다. 차후 나오는 정답률과 함께 어느 문항에서 어느 답안을 많이 고르는지 파악하는 데 활용한다.

# par(family = "Malgun Gothic", 
par(mar = c(5.1, 4.1, 4.1, 8.1))
midterm.tbl <- sapply(midterm, 
                      table, 
                      useNA = "no")
kable(midterm.tbl[, 1:20])
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16 Q17 Q18 Q19 Q20
1 0 0 17 23 1 2 1 22 4 7 0 18 24 1 2 3 4 10 6
0 0 0 9 1 2 21 0 4 16 12 2 3 3 23 3 0 22 3 15
2 4 6 0 1 0 3 5 1 6 1 3 4 0 1 22 23 1 11 4
24 23 21 1 2 24 1 21 0 1 7 22 2 0 2 0 1 0 3 2
kable(midterm.tbl[, 21:40])
Q21 Q22 Q23 Q24 Q25 Q26 Q27 Q28 Q29 Q30 Q31 Q32 Q33 Q34 Q35 Q36 Q37 Q38 Q39 Q40
21 1 8 8 12 8 0 6 13 18 16 1 16 4 1 1 9 10 4 0
3 2 7 10 4 1 15 8 11 4 1 11 2 20 25 19 6 10 7 1
1 17 5 9 4 16 0 5 1 3 1 1 5 1 0 0 12 4 10 13
2 7 7 0 7 2 12 8 2 2 9 14 4 2 1 7 0 3 6 13
str(midterm.tbl)
##  int [1:4, 1:40] 1 0 2 24 0 0 4 23 0 0 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : chr [1:4] "가" "나" "다" "라"
##   ..$ : chr [1:40] "Q1" "Q2" "Q3" "Q4" ...
midterm.ptbl <- round(apply(midterm.tbl, 
                            2, 
                            prop.table) * 100, 
                      digits = 0)
kable(midterm.ptbl[, 1:20])
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16 Q17 Q18 Q19 Q20
4 0 0 63 85 4 7 4 81 15 26 0 67 89 4 7 11 15 37 22
0 0 0 33 4 7 78 0 15 59 44 7 11 11 85 11 0 81 11 56
7 15 22 0 4 0 11 19 4 22 4 11 15 0 4 81 85 4 41 15
89 85 78 4 7 89 4 78 0 4 26 81 7 0 7 0 4 0 11 7
kable(midterm.ptbl[, 21:40])
Q21 Q22 Q23 Q24 Q25 Q26 Q27 Q28 Q29 Q30 Q31 Q32 Q33 Q34 Q35 Q36 Q37 Q38 Q39 Q40
78 4 30 30 44 30 0 22 48 67 59 4 59 15 4 4 33 37 15 0
11 7 26 37 15 4 56 30 41 15 4 41 7 74 93 70 22 37 26 4
4 63 19 33 15 59 0 19 4 11 4 4 19 4 0 0 44 15 37 48
7 26 26 0 26 7 44 30 7 7 33 52 15 7 4 26 0 11 22 48
str(midterm.ptbl)
##  num [1:4, 1:40] 4 0 7 89 0 0 15 85 0 0 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : chr [1:4] "가" "나" "다" "라"
##   ..$ : chr [1:40] "Q1" "Q2" "Q3" "Q4" ...
label.ptbl <- matrix(paste(format(midterm.ptbl, 
                                  digits = 2, 
                                  nsmall = 0), 
                           "%", 
                           sep =""), 
                     nrow = 4)
label.ptbl <- ifelse(label.ptbl == "  0%", "", label.ptbl)
label.ptbl[, 1:10]
##      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9]  [,10]
## [1,] " 4%" " 0%" " 0%" "63%" "85%" " 4%" " 7%" " 4%" "81%" "15%"
## [2,] " 0%" " 0%" " 0%" "33%" " 4%" " 7%" "78%" " 0%" "15%" "59%"
## [3,] " 7%" "15%" "22%" " 0%" " 4%" " 0%" "11%" "19%" " 4%" "22%"
## [4,] "89%" "85%" "78%" " 4%" " 7%" "89%" " 4%" "78%" " 0%" " 4%"
b <- barplot(matrix(midterm.tbl, nrow = 4), 
             horiz = TRUE, 
             axes = FALSE, 
             col = rainbow(4), 
             names.arg = colnames(midterm.tbl), 
             las = 1, 
             xpd = TRUE, 
             legend.text = rownames(midterm.tbl), 
             args.legend = list(x = 35, y = 42))
max(b)
## [1] 47.5
midterm.tbl[1, ]
##  Q1  Q2  Q3  Q4  Q5  Q6  Q7  Q8  Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16 Q17 Q18 Q19 Q20 Q21 Q22 Q23 Q24 Q25 Q26 Q27 Q28 Q29 Q30 Q31 Q32 Q33 Q34 Q35 Q36 Q37 Q38 Q39 Q40 
##   1   0   0  17  23   1   2   1  22   4   7   0  18  24   1   2   3   4  10   6  21   1   8   8  12   8   0   6  13  18  16   1  16   4   1   1   9  10   4   0
text(x = midterm.tbl[1, ] / 2, 
     y = b, 
     labels = label.ptbl[1, ])
text(x = midterm.tbl[1, ] + midterm.tbl[2, ] / 2 , 
     y = b, 
     labels = label.ptbl[2, ])
text(x = midterm.tbl[1, ] + midterm.tbl[2, ] + midterm.tbl[3, ] / 2, 
     y = b, 
     labels = label.ptbl[3, ])
text(x = midterm.tbl[1, ] + midterm.tbl[2, ] + midterm.tbl[3, ] + midterm.tbl[4, ]/ 2, 
     y = b, 
     labels = label.ptbl[4, ])

점수

  • 정답 맞춰보기
    • 정답 읽어들이기. what = ""로 설정하여 char취급.
(ans <- scan("../data/ans.txt", what = ""))
##  [1] "라" "라" "라" "가" "가" "라" "나" "라" "가" "나" "나" "라" "가" "가" "나" "다" "다" "나" "가" "나" "가" "다" "가" "다" "가" "다" "나" "나" "가" "가" "가" "라" "가" "나" "나"
## [36] "나" "가" "나" "다" "나"
  • 각 학생들의 답안과 맞춰보기 위하여 정답표 작성.
    • 문항별로 정답과 비교하기 위하여 각 문항을 리스트의 원소로 분리
    • split() 의 기능과 한계에 유의. factor 성격으로부터 1, 10, 11, ..., 2, 20, ..., 3, 4, 5, ... , 9로 순서를 잡게 되므로 다시 한번 정리할 필요.
(ans.l <- split(ans, 
                f = paste("A", 1:40, sep = "")))
## $A1
## [1] "라"
## 
## $A10
## [1] "나"
## 
## $A11
## [1] "나"
## 
## $A12
## [1] "라"
## 
## $A13
## [1] "가"
## 
## $A14
## [1] "가"
## 
## $A15
## [1] "나"
## 
## $A16
## [1] "다"
## 
## $A17
## [1] "다"
## 
## $A18
## [1] "나"
## 
## $A19
## [1] "가"
## 
## $A2
## [1] "라"
## 
## $A20
## [1] "나"
## 
## $A21
## [1] "가"
## 
## $A22
## [1] "다"
## 
## $A23
## [1] "가"
## 
## $A24
## [1] "다"
## 
## $A25
## [1] "가"
## 
## $A26
## [1] "다"
## 
## $A27
## [1] "나"
## 
## $A28
## [1] "나"
## 
## $A29
## [1] "가"
## 
## $A3
## [1] "라"
## 
## $A30
## [1] "가"
## 
## $A31
## [1] "가"
## 
## $A32
## [1] "라"
## 
## $A33
## [1] "가"
## 
## $A34
## [1] "나"
## 
## $A35
## [1] "나"
## 
## $A36
## [1] "나"
## 
## $A37
## [1] "가"
## 
## $A38
## [1] "나"
## 
## $A39
## [1] "다"
## 
## $A4
## [1] "가"
## 
## $A40
## [1] "나"
## 
## $A5
## [1] "가"
## 
## $A6
## [1] "라"
## 
## $A7
## [1] "나"
## 
## $A8
## [1] "라"
## 
## $A9
## [1] "가"
(ans.l.2 <- ans.l[paste("A", 1:40, sep = "")])
## $A1
## [1] "라"
## 
## $A2
## [1] "라"
## 
## $A3
## [1] "라"
## 
## $A4
## [1] "가"
## 
## $A5
## [1] "가"
## 
## $A6
## [1] "라"
## 
## $A7
## [1] "나"
## 
## $A8
## [1] "라"
## 
## $A9
## [1] "가"
## 
## $A10
## [1] "나"
## 
## $A11
## [1] "나"
## 
## $A12
## [1] "라"
## 
## $A13
## [1] "가"
## 
## $A14
## [1] "가"
## 
## $A15
## [1] "나"
## 
## $A16
## [1] "다"
## 
## $A17
## [1] "다"
## 
## $A18
## [1] "나"
## 
## $A19
## [1] "가"
## 
## $A20
## [1] "나"
## 
## $A21
## [1] "가"
## 
## $A22
## [1] "다"
## 
## $A23
## [1] "가"
## 
## $A24
## [1] "다"
## 
## $A25
## [1] "가"
## 
## $A26
## [1] "다"
## 
## $A27
## [1] "나"
## 
## $A28
## [1] "나"
## 
## $A29
## [1] "가"
## 
## $A30
## [1] "가"
## 
## $A31
## [1] "가"
## 
## $A32
## [1] "라"
## 
## $A33
## [1] "가"
## 
## $A34
## [1] "나"
## 
## $A35
## [1] "나"
## 
## $A36
## [1] "나"
## 
## $A37
## [1] "가"
## 
## $A38
## [1] "나"
## 
## $A39
## [1] "다"
## 
## $A40
## [1] "나"
정답과 대조하여 R(Right)/W(Wrong) 표시
  • 채점표라는 의미의 midterm.marks 로 저장, (# 표시한 방식으로는 작동하지 않음)
# midterm.marks.rw.q1_3 <- mapply(function(x, y) factor(ifelse(x == y, "R", "W")), y = ans.l.2[1:3], midterm[, 1:3])
midterm.marks.rw <- mapply(function(x, y) factor(ifelse(x == y, "R", "W")), y = ans.l.2, midterm)
# midterm.marks.rw <- mapply(function(x, y = ans.l.2) factor(ifelse(x == y, "R", "W")), midterm[, -26])
# midterm.marks.rw <- sapply(midterm, function(x, y = ans.l.2) factor(ifelse(x == y, "R", "W")))
kable(midterm.marks.rw[, 1:20])
A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20
R W W W R W R W W W W W R R W R W R W W
R R R R R R R R R R W R R R R R R R R R
W W R W W R R R W W W W R R R W R W W W
R R W R R R R R R R R R R R R R W R R R
R R R W R R R R R R W R R W W R R W W W
W R R R W W R R R W W R W R W R R R W W
R R R W R R R W R R R R R R R R R R R W
R R R R R R R R R R R R R R R R W R R R
R W R W R R R R W W R W W W R W W R W W
R R R R R R R R R R R R R R W R R R W R
R R R W R R W W R W W W W R R W R R W W
R R R R R R W R R R W R R R R R R R R R
R R R R R R W R R R W R R R R R R R R R
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
R R R R R R W R R R W R W R R R R W W W
R R R R R R R R R R W R R R R R R R W R
R R R R R R R R R R R R R R R R R R W R
R R W W R R R R W W R R R R R R R R W W
R R W R R R R R R R R R R R R R R R W R
R R R R R R R R R R W R R R R R R R W W
R R R W R R W R R R R R W R R R R R W R
R W W W R R R W W W W W W R R R R W W W
W R R R R R R R R W W R W R R R R R W R
R R R R W W R W R W W R R R R W R R R R
R R R R R R R R R W R R R R R R R R R R
R R W R R R W R R R R R R W R W R R R R
R R R R W R R R R W R R W R R R R W W R
R R R W R R R W R R W R W R R R R R R W
kable(midterm.marks.rw[, 21:40])
A21 A22 A23 A24 A25 A26 A27 A28 A29 A30 A31 A32 A33 A34 A35 A36 A37 A38 A39 A40
W R W W W R R W R W R W W W R W W W W W
R R R W R R R R W R R R R R R W W W R W
R W R W W W R W W W W W W R R R W W R W
R R R R R W R W R R R R R R R R R W R W
W R W W W R W W W W W R R R R W W W W W
R R W W W R R R W R W W W W R R W R W W
W R W W W R W W W W R W W R R W W W W W
R R W R R R R W R R W R R R R R W R R W
R W W W W R W W R R W W W R R R W W W W
R W W R R R W W W W R R W W R W W W W W
W R W W W W W W W W W W W R R W W R W W
R W W R W R R W R W R R R R R R W R W W
R R R R R R R R R R R R R R R R R R R R
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
R W W W W W R R W R W R R W R R W W R W
R R R W W R W R W R R W R R R W R R W W
R R W R R R R W R R R R R R R R R R R W
R R R W W W W W W R R W W R R R W R W W
R R R W W R R W W R W W R R R W W W W W
R W W W R W W W R R R R R R R R R R W W
R W W R R R W W R W R W R R R R R W W W
W W W W W R R W R R R W W R R R R W W W
R R W R R R R R R R W W R R R R W W R W
R R W W W W W R W W W R W W W R W W R W
R R R R R W R R R R R R R R R R R W W W
R R W W W W R W W R R R R R R R W R R W
R W W W R W W W R R W W R W R R W W W W
W W W W R W W W W R R R W W W R R W W W

학생별 점수 산출
  • 정답을 집계하기 위하여 “R” 갯수를 다시 산출하는 ifelse() 적용.
    • 4점씩 곱하면 100점 만점 기준의 점수가 됨.
    • 답안지는 작성해서 제출했지만 빈칸이 있는 경우는 그 문항을 0점 처리, 결석의 경우는 점수가 모두 0으로 나오는 경우를 NA처리
midterm.marks <- ifelse(midterm.marks.rw == "R", 1, 0)
kable(midterm.marks[, 1:20])
A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20
1 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 0 1 0 0
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1
0 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 0 0
1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
1 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 1 0 0 0
0 1 1 1 0 0 1 1 1 0 0 1 0 1 0 1 1 1 0 0
1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
1 0 1 0 1 1 1 1 0 0 1 0 0 0 1 0 0 1 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1
1 1 1 0 1 1 0 0 1 0 0 0 0 1 1 0 1 1 0 0
1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
1 1 0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0
1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 0
1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1
1 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0
0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 1 1 0 1
1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 1
1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 1 1
1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 0 1
1 1 1 0 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 0
kable(midterm.marks[, 21:40])
A21 A22 A23 A24 A25 A26 A27 A28 A29 A30 A31 A32 A33 A34 A35 A36 A37 A38 A39 A40
0 1 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0
1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 0 0 1 0
1 0 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0
1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0
0 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0
1 1 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 0 0
0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0
1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0
1 0 0 0 0 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0
1 0 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
1 0 0 1 0 1 1 0 1 0 1 1 1 1 1 1 0 1 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
1 0 0 0 0 0 1 1 0 1 0 1 1 0 1 1 0 0 1 0
1 1 1 0 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 0
1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0
1 1 1 0 0 0 0 0 0 1 1 0 0 1 1 1 0 1 0 0
1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 0 0 0 0
1 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
1 0 0 1 1 1 0 0 1 0 1 0 1 1 1 1 1 0 0 0
0 0 0 0 0 1 1 0 1 1 1 0 0 1 1 1 1 0 0 0
1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0
1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0
1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 0 1 1 0
1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0
0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 1 0 0 0
midterm.score <- midterm.marks * 2.5
kable(data.frame("순번" = 1:nrow(midterm), midterm.score)[1:20])
순번 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19
1 2.5 0.0 0.0 0.0 2.5 0.0 2.5 0.0 0.0 0.0 0.0 0.0 2.5 2.5 0.0 2.5 0.0 2.5 0.0
2 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5
3 0.0 0.0 2.5 0.0 0.0 2.5 2.5 2.5 0.0 0.0 0.0 0.0 2.5 2.5 2.5 0.0 2.5 0.0 0.0
4 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 2.5
5 2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 2.5 0.0 0.0 2.5 2.5 0.0 0.0
6 0.0 2.5 2.5 2.5 0.0 0.0 2.5 2.5 2.5 0.0 0.0 2.5 0.0 2.5 0.0 2.5 2.5 2.5 0.0
7 2.5 2.5 2.5 0.0 2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5
8 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 2.5
9 2.5 0.0 2.5 0.0 2.5 2.5 2.5 2.5 0.0 0.0 2.5 0.0 0.0 0.0 2.5 0.0 0.0 2.5 0.0
10 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 2.5 2.5 0.0
11 2.5 2.5 2.5 0.0 2.5 2.5 0.0 0.0 2.5 0.0 0.0 0.0 0.0 2.5 2.5 0.0 2.5 2.5 0.0
12 2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5
13 2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5
14 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
15 2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 2.5 2.5 0.0 2.5 0.0 2.5 2.5 2.5 2.5 0.0 0.0
16 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0
17 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0
18 2.5 2.5 0.0 0.0 2.5 2.5 2.5 2.5 0.0 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0
19 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0
20 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0
21 2.5 2.5 2.5 0.0 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 0.0
22 2.5 0.0 0.0 0.0 2.5 2.5 2.5 0.0 0.0 0.0 0.0 0.0 0.0 2.5 2.5 2.5 2.5 0.0 0.0
23 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0 0.0 2.5 0.0 2.5 2.5 2.5 2.5 2.5 0.0
24 2.5 2.5 2.5 2.5 0.0 0.0 2.5 0.0 2.5 0.0 0.0 2.5 2.5 2.5 2.5 0.0 2.5 2.5 2.5
25 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5
26 2.5 2.5 0.0 2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 0.0 2.5 2.5 2.5
27 2.5 2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 0.0 2.5 2.5 0.0 2.5 2.5 2.5 2.5 0.0 0.0
28 2.5 2.5 2.5 0.0 2.5 2.5 2.5 0.0 2.5 2.5 0.0 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5
# kable(data.frame("학번" = midterm.roll$id, midterm.score)[1:20])
kable(data.frame("순번" = 1:nrow(midterm), midterm.score)[21:40])
A20 A21 A22 A23 A24 A25 A26 A27 A28 A29 A30 A31 A32 A33 A34 A35 A36 A37 A38 A39
0.0 0.0 2.5 0.0 0.0 0.0 2.5 2.5 0.0 2.5 0.0 2.5 0.0 0.0 0.0 2.5 0.0 0.0 0.0 0.0
2.5 2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 0.0 0.0 0.0 2.5
0.0 2.5 0.0 2.5 0.0 0.0 0.0 2.5 0.0 0.0 0.0 0.0 0.0 0.0 2.5 2.5 2.5 0.0 0.0 2.5
2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5
0.0 0.0 2.5 0.0 0.0 0.0 2.5 0.0 0.0 0.0 0.0 0.0 2.5 2.5 2.5 2.5 0.0 0.0 0.0 0.0
0.0 2.5 2.5 0.0 0.0 0.0 2.5 2.5 2.5 0.0 2.5 0.0 0.0 0.0 0.0 2.5 2.5 0.0 2.5 0.0
0.0 0.0 2.5 0.0 0.0 0.0 2.5 0.0 0.0 0.0 0.0 2.5 0.0 0.0 2.5 2.5 0.0 0.0 0.0 0.0
2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 0.0 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 0.0 2.5 2.5
0.0 2.5 0.0 0.0 0.0 0.0 2.5 0.0 0.0 2.5 2.5 0.0 0.0 0.0 2.5 2.5 2.5 0.0 0.0 0.0
2.5 2.5 0.0 0.0 2.5 2.5 2.5 0.0 0.0 0.0 0.0 2.5 2.5 0.0 0.0 2.5 0.0 0.0 0.0 0.0
0.0 0.0 2.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.5 2.5 0.0 0.0 2.5 0.0
2.5 2.5 0.0 0.0 2.5 0.0 2.5 2.5 0.0 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 0.0
2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
0.0 2.5 0.0 0.0 0.0 0.0 0.0 2.5 2.5 0.0 2.5 0.0 2.5 2.5 0.0 2.5 2.5 0.0 0.0 2.5
2.5 2.5 2.5 2.5 0.0 0.0 2.5 0.0 2.5 0.0 2.5 2.5 0.0 2.5 2.5 2.5 0.0 2.5 2.5 0.0
2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5
0.0 2.5 2.5 2.5 0.0 0.0 0.0 0.0 0.0 0.0 2.5 2.5 0.0 0.0 2.5 2.5 2.5 0.0 2.5 0.0
2.5 2.5 2.5 2.5 0.0 0.0 2.5 2.5 0.0 0.0 2.5 0.0 0.0 2.5 2.5 2.5 0.0 0.0 0.0 0.0
0.0 2.5 0.0 0.0 0.0 2.5 0.0 0.0 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0
2.5 2.5 0.0 0.0 2.5 2.5 2.5 0.0 0.0 2.5 0.0 2.5 0.0 2.5 2.5 2.5 2.5 2.5 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 2.5 2.5 0.0 2.5 2.5 2.5 0.0 0.0 2.5 2.5 2.5 2.5 0.0 0.0
2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0 0.0 2.5 2.5 2.5 2.5 0.0 0.0 2.5
2.5 2.5 2.5 0.0 0.0 0.0 0.0 0.0 2.5 0.0 0.0 0.0 2.5 0.0 0.0 0.0 2.5 0.0 0.0 2.5
2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0 0.0
2.5 2.5 2.5 0.0 0.0 0.0 0.0 2.5 0.0 0.0 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.0 2.5 2.5
2.5 2.5 0.0 0.0 0.0 2.5 0.0 0.0 0.0 2.5 2.5 0.0 0.0 2.5 0.0 2.5 2.5 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 2.5 0.0 0.0 0.0 0.0 2.5 2.5 2.5 0.0 0.0 0.0 2.5 2.5 0.0 0.0
# kable(data.frame("학번" = midterm.roll$id, midterm.score)[21:40])
midterm.score <- apply(midterm.marks, 1, sum, na.rm = TRUE) * 2.5
midterm.score[midterm.score == 0] <- NA
which(midterm.score < 60)
##  [1]  1  3  5  6  7  9 11 15 18 22 24 27 28
kable(data.frame("순번" = 1:nrow(midterm), "점수" = midterm.score))
순번 점수
1 32.5
2 82.5
3 37.5
4 85.0
5 47.5
6 50.0
7 55.0
8 85.0
9 40.0
10 62.5
11 35.0
12 75.0
13 95.0
14 NA
15 57.5
16 75.0
17 90.0
18 57.5
19 67.5
20 72.5
21 67.5
22 42.5
23 72.5
24 50.0
25 87.5
26 70.0
27 55.0
28 52.5

문항별 정답률
  • 결석한 경우와 일부 문항에 답을 내지 않은 경우를 구분하는 것이 핵심.
    • midterm.marks를 그대로 이용하면 쉽게 계산되나, is.na학습 목적으로 midterm.mark.rw에서 출발
    • 모든 문항에 NA로 답한 결석한 학생들의 인덱스를 먼저 찾아내고,
apply(midterm.marks.rw, 1, function(x) all(is.na(x)))
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
na.all <- which(apply(midterm.marks.rw, 1, function(x) all(is.na(x))))
  • 정답률 계산
    • NA를 모두 오답처리한 후, 결석한 학생들만 다시 NA로 정정.
    • TRUE의 갯수를 합하여 평균.
midterm.marks.2 <- midterm.marks.rw
midterm.marks.2[is.na(midterm.marks.2)] <- "W"
midterm.marks.2[na.all, ] <- NA
midterm.marks.2 <- ifelse(midterm.marks.2 == "R", 1, 0)
rate.by.item <- apply(midterm.marks.2, 2, mean, na.rm = TRUE) * 100
str(rate.by.item)
##  Named num [1:40] 88.9 85.2 77.8 63 85.2 ...
##  - attr(*, "names")= chr [1:40] "A1" "A2" "A3" "A4" ...
rate.by.item <- as.matrix(rate.by.item, 40)
dimnames(rate.by.item) <- list("문항" =  paste("문", 1:40, sep = ""), "정답률" = "정답률")
colnames(rate.by.item) <- "정답률"
kable(rate.by.item, digits = 3)
정답률
문1 88.889
문2 85.185
문3 77.778
문4 62.963
문5 85.185
문6 88.889
문7 77.778
문8 77.778
문9 81.481
문10 59.259
문11 44.444
문12 81.481
문13 66.667
문14 88.889
문15 85.185
문16 81.481
문17 85.185
문18 81.481
문19 37.037
문20 55.556
문21 77.778
문22 62.963
문23 29.630
문24 33.333
문25 44.444
문26 59.259
문27 55.556
문28 29.630
문29 48.148
문30 66.667
문31 59.259
문32 51.852
문33 59.259
문34 74.074
문35 92.593
문36 70.370
문37 33.333
문38 37.037
문39 37.037
문40 3.704

어려운 문제?

정답률 60% 이하
kable(t(rate.by.item[which(rate.by.item <= 60), , drop = FALSE]))
문10 문11 문19 문20 문23 문24 문25 문26 문27 문28 문29 문31 문32 문33 문37 문38 문39 문40
정답률 59.25926 44.44444 37.03704 55.55556 29.62963 33.33333 44.44444 59.25926 55.55556 29.62963 48.14815 59.25926 51.85185 59.25926 33.33333 37.03704 37.03704 3.703704
정답률 50% 이하
kable(t(rate.by.item[which(rate.by.item <= 50), , drop = FALSE]))
문11 문19 문23 문24 문25 문28 문29 문37 문38 문39 문40
정답률 44.44444 37.03704 29.62963 33.33333 44.44444 29.62963 48.14815 33.33333 37.03704 37.03704 3.703704
정답률 40% 이하
kable(t(rate.by.item[which(rate.by.item <= 40), , drop = FALSE]))
문19 문23 문24 문28 문37 문38 문39 문40
정답률 37.03704 29.62963 33.33333 29.62963 33.33333 37.03704 37.03704 3.703704
정답률 30% 이하
kable(t(rate.by.item[which(rate.by.item <= 30), , drop = FALSE]))
문23 문28 문40
정답률 29.62963 29.62963 3.703704