單元摘要: 使用第三周作業互評的數據來練習R的
dplyrtidyrggplot2
(安裝)載入套件
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()
🗿 問題討論:
■ 「互評進度圖」的目的是?
ans:讓同學知道各組的組內互評並提醒同學要記得填寫互評
■ 我們如何使用圖形來促成這個目的?
ans:同學看到圖表的顏色顯示自己組別有人還沒互評時,就會互相提醒 ■ 你覺得這做會有效嗎? 為甚麼?
ans:會有效,因為看到圖形會想把自己的組別好好填滿
以下資料的人名和小組名稱都已經過匿名化處理:
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),我們應該要怎麼做呢?
ggplot(X2, aes(x=Score,fill=xGrade)) +
geom_bar(position="dodge") + facet_grid(AS ~ TYPE)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
🗿 問題討論:
■ 由於我們的評分是自己小組的作業為基準,被評分數較高的小組會不會傾向於評出較低的分數呢?
■ 請用統計的方法來檢定這一件事
#answer:根據下面的相關係數來看,分數越高與打分數較低的情形較沒辦法看出太明顯的關係
cor(rating,rated) #相關系數為-0.099276,低度負相關[1] -0.099276
■ 請畫一個圖來檢驗這一件事plot = data.frame(rating,rated) %>%
ggplot(aes(rating,rated)) +
geom_point() +
geom_smooth(method = "lm")
plot ■ 對資料科學家而言,上述哪一種方法比較有說服力呢?
answer:個人認為資訊科學家會想要看到數值,以確保真實的數字顯示,故以上面的cor()function較有說服力
■ 對一般經理人員來說,上述哪一種方法比較有說服力呢?
answer:個人認為一般經理人員會對於數值比較沒有敏感性,以圖形呈現可以看出最真實相對關係,故以上面plot方式較有說服力