單元摘要: 使用第三周作業互評的數據來練習R的
dplyr
tidyr
ggplot2
(安裝)載入套件
pacman::p_load(dplyr, tidyr, ggplot2, ggthemes)
The Ascomebe Quartet完全不同的數據有可能會產生完全相同的統計量,以下我們練習使用R的資料處理(tidyr
,dplyr
)和繪圖套件(ggplot2
)來畫Ascomebe Quartet.
先讀進並檢視資料
A = read.csv("data/anscombe.csv")
head(A)
X x1 x2 x3 x4 y1 y2 y3 y4
1 1 10 10 10 8 8.04 9.14 7.46 6.58
2 2 8 8 8 8 6.95 8.14 6.77 5.76
3 3 13 13 13 8 7.58 8.74 12.74 7.71
4 4 9 9 9 8 8.81 8.77 7.11 8.84
5 5 11 11 11 8 8.33 9.26 7.81 8.47
6 6 14 14 14 8 9.96 8.10 8.84 7.04
轉換資料排列方式
A = as.matrix(A)
A = cbind(
rep(1:4, each=11), rep(1:11, 4),
rbind(A[,c(2,6)],A[,c(3,7)],A[,c(4,8)],A[,c(5,9)])) %>%
data.frame %>% as.tbl %>%
setNames(c("set","id","x","y"))
head(A,12)
# A tibble: 12 x 4
set id x y
<dbl> <dbl> <dbl> <dbl>
1 1 1 10 8.04
2 1 2 8 6.95
3 1 3 13 7.58
4 1 4 9 8.81
5 1 5 11 8.33
6 1 6 14 9.96
7 1 7 6 7.24
8 1 8 4 4.26
9 1 9 12 10.8
10 1 10 7 4.82
11 1 11 5 5.68
12 2 1 10 9.14
畫出圖形
ggplot(A, aes(x, y)) +
geom_point(size=2, col='navyblue') +
geom_smooth(method="lm", se=F, col="orange", lty=2) +
facet_wrap(~set) +
theme_wsj()
🗿 問題討論:
■ 「互評進度圖」的目的是?
■ 我們如何使用圖形來促成這個目的?
■ 你覺得這做會有效嗎? 為甚麼?
以下資料的人名和小組名稱都已經過匿名化處理:
B
-大學部; M
-研究所load("data/X.rdata")
str(X)
'data.frame': 116 obs. of 13 variables:
$ xID : Factor w/ 116 levels "ID1","ID10","ID100",..: 34 99 33 105 68 111 23 50 73 39 ...
$ xGrade : Factor w/ 2 levels "B","M": 1 1 1 1 2 2 2 2 1 2 ...
$ xTeam : Factor w/ 21 levels "XT01","XT02",..: 20 15 6 17 9 1 14 12 1 6 ...
$ rTeam : Factor w/ 21 levels "RT01","RT02",..: 2 21 14 9 13 8 21 5 21 15 ...
$ AS31.程式: int 6 9 8 7 8 7 10 8 6 9 ...
$ AS31.註解: int 6 6 8 7 8 7 7 8 6 9 ...
$ AS31.整體: int 6 8 8 7 8 6 7 8 6 8 ...
$ AS32.程式: int 7 9 9 7 9 7 9 8 10 8 ...
$ AS32.註解: int 7 6 9 6 8 7 7 8 6 8 ...
$ AS32.整體: int 7 8 9 7 8 6 7 8 8 7 ...
$ AS33.程式: int 8 9 8 7 9 7 10 7 9 9 ...
$ AS33.註解: int 8 8 8 7 8 9 8 7 8 9 ...
$ AS33.整體: int 8 9 8 7 8 8 8 7 8 8 ...
rbind(table(X$xTeam), table(X$rTeam))
XT01 XT02 XT03 XT04 XT05 XT06 XT07 XT08 XT09 XT10 XT11 XT12 XT13 XT14 XT15
[1,] 6 6 5 6 6 6 5 6 6 5 6 5 5 6 5
[2,] 5 5 5 6 5 6 5 6 5 6 5 6 6 6 5
XT16 XT17 XT18 XT19 XT20 XT21
[1,] 4 6 6 6 5 5
[2,] 6 4 6 6 6 6
X2 = gather(X, "key", "Score", 5:13) %>% separate(key, c("AS","TYPE"), sep="\\.")
X2[4:5] = lapply(X2[4:5], factor)
as.tbl(X2)
# A tibble: 1,044 x 7
xID xGrade xTeam rTeam AS TYPE Score
<fct> <fct> <fct> <fct> <fct> <chr> <int>
1 ID24 B XT20 RT02 AS31 程式 6
2 ID83 B XT15 RT21 AS31 程式 9
3 ID23 B XT06 RT14 AS31 程式 8
4 ID89 B XT17 RT09 AS31 程式 7
5 ID55 M XT09 RT13 AS31 程式 8
6 ID94 M XT01 RT08 AS31 程式 7
7 ID14 M XT14 RT21 AS31 程式 10
8 ID39 M XT12 RT05 AS31 程式 8
9 ID6 B XT01 RT21 AS31 程式 6
10 ID29 M XT06 RT15 AS31 程式 9
# ... with 1,034 more rows
par(cex=0.8, mar=c(3,3,3,3))
table(X2$Score) %>% barplot(main="Dist. Scores")
ggplot(X2, aes(x=Score)) +
geom_bar(position="dodge") + facet_grid(AS ~ TYPE)
🗿: 如果我們要同時看大學生和研究生在每一份作業和每一個評分標準上面給分的分布(如FIG2),我們應該要怎麼做呢?
tapply(X2$Score, X2$xGrade, mean)
B M
7.2854 7.5333
rating = tapply(X2$Score, X2$xTeam, mean)
rating
XT01 XT02 XT03 XT04 XT05 XT06 XT07 XT08 XT09 XT10 XT11
8.3889 7.6296 7.4889 6.7963 7.0926 7.9444 7.1778 6.9630 6.7963 7.4222 6.7593
XT12 XT13 XT14 XT15 XT16 XT17 XT18 XT19 XT20 XT21
7.4667 7.8444 7.8889 7.2667 7.6944 7.4630 7.5926 7.7963 6.6222 7.8667
range(rating)
[1] 6.6222 8.3889
rated = tapply(X2$Score, X2$rTeam, mean) %>% sort
rated
RT19 RT05 RT03 RT02 RT15 RT13 RT06 RT07 RT12 RT16 RT21
6.2778 6.4667 6.6667 6.7111 6.9111 6.9259 7.0185 7.1333 7.4074 7.5185 7.5370
RT20 RT10 RT11 RT09 RT14 RT08 RT01 RT04 RT17 RT18
7.5556 7.6667 7.6889 7.7333 7.7778 7.8148 7.9111 8.1296 8.5278 8.5370
range(rated)
[1] 6.2778 8.5370
🗿 問題討論:
■ 由於我們的評分是自己小組的作業為基準,被評分數較高的小組會不會傾向於評出較低的分數呢?
■ 請用統計的方法來檢定這一件事
■ 請畫一個圖來檢驗這一件事
■ 對資料科學家而言,上述哪一種方法比較有說服力呢?
■ 對一般經理人員來說,上述哪一種方法比較有說服力呢?