單元摘要: 使用第三周作業互評的數據來練習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()
🗿 問題討論:
■ 「互評進度圖」的目的是?
任何一個專案都要做時程管理,互評進度圖的目的為用簡易明瞭的圖形,呈現現在互評的人數狀況,以利老師觀察同學的互評進度。
■ 我們如何使用圖形來促成這個目的?
看圖形中各組互評狀況,敦促互評人數較少的那組趕緊互評!
■ 你覺得這做會有效嗎? 為甚麼?
有效!沒有此圖形老師難以掌控現在同學互評狀況,有這互評進度圖輕鬆看出各組有多少人還沒評,可適時給予提醒!
以下資料的人名和小組名稱都已經過匿名化處理:
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) +
theme(text=element_text(family="黑體-繁 中黑", size=12))🗿: 如果我們要同時看大學生和研究生在每一份作業和每一個評分標準上面給分的分布(如FIG2),我們應該要怎麼做呢?
tapply(X2$Score, X2$xGrade, mean) B M
7.2854 7.5333
rating = tapply(X2$Score, X2$xTeam, mean)
sort(rating) XT20 XT11 XT04 XT09 XT08 XT05 XT07 XT15 XT10 XT17 XT12
6.6222 6.7593 6.7963 6.7963 6.9630 7.0926 7.1778 7.2667 7.4222 7.4630 7.4667
XT03 XT18 XT02 XT16 XT19 XT13 XT21 XT14 XT06 XT01
7.4889 7.5926 7.6296 7.6944 7.7963 7.8444 7.8667 7.8889 7.9444 8.3889
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
🗿 問題討論:
■ 由於我們的評分是自己小組的作業為基準,被評分數較高的小組會不會傾向於評出較低的分數呢?
從common sense來說感覺會有關係,故做一系列統計方法來檢定這回事。
■ 請用統計的方法來檢定這一件事
allRate <- tibble(rating, rated)
summary(lm(rating ~ rated, allRate))
Call:
lm(formula = rating ~ rated, data = allRate)
Residuals:
Min 1Q Median 3Q Max
-0.7922 -0.4240 0.0383 0.2765 1.0078
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 8.1235 1.2673 6.41 0.0000038 ***
rated -0.0939 0.1701 -0.55 0.59
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.475 on 19 degrees of freedom
Multiple R-squared: 0.0158, Adjusted R-squared: -0.036
F-statistic: 0.304 on 1 and 19 DF, p-value: 0.588
直接用簡單線性迴歸來看,發現p-value=0.588,結果是非常不顯著的,所以我們不能說這評分和被評分有明顯關係。
■ 請畫一個圖來檢驗這一件事
ggplot(allRate, aes(x = rated, y = rating)) +
geom_point() +
geom_smooth(method = "lm", formula = y ~ x, se = TRUE) +
labs(title = "rated vs rating 線性迴歸圖") +
theme(text = element_text(family = "黑體-繁 中黑", size = 12))
■ 對資料科學家而言,上述哪一種方法比較有說服力呢?
■ 對一般經理人員來說,上述哪一種方法比較有說服力呢?對資料科學家而言,用嚴謹的統計檢定方法對他們來說較有說服力,因為任何統計圖形都是很有可能騙人的。
這並不是二擇一的問題,對於一般經理人來說,一定是直接給圖形說明最直接明瞭,但圖形也要輔以檢定統計方法的說明,才能給出最正確的資訊,以利下合理的決策。