單元摘要: 使用第三周作業互評的數據來練習R的


(安裝)載入套件

pacman::p_load(dplyr, tidyr, ggplot2, ggthemes)

【A】The Ascomebe Quartet

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】目的導向的圖形設計

FIG1 - 互評進度圖

🗿 問題討論:
  ■   「互評進度圖」的目的是?

任何一個專案都要做時程管理,互評進度圖的目的為用簡易明瞭的圖形,呈現現在互評的人數狀況,以利老師觀察同學的互評進度。

  ■   我們如何使用圖形來促成這個目的?

看圖形中各組互評狀況,敦促互評人數較少的那組趕緊互評!

  ■   你覺得這做會有效嗎? 為甚麼?

有效!沒有此圖形老師難以掌控現在同學互評狀況,有這互評進度圖輕鬆看出各組有多少人還沒評,可適時給予提醒!




【C】匿名互評資料探索性分析

以下資料的人名和小組名稱都已經過匿名化處理:

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

轉換資料排列 Data Alignment

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")

評分的分布 3作業 x 3評分標準

ggplot(X2, aes(x=Score)) + 
  geom_bar(position="dodge") + facet_grid(AS ~ TYPE) +
  theme(text=element_text(family="黑體-繁 中黑", size=12))

FIG2 - 評分的分布

🗿: 如果我們要同時看大學生和研究生在每一份作業和每一個評分標準上面給分的分布(如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))


  ■   對資料科學家而言,上述哪一種方法比較有說服力呢?

對資料科學家而言,用嚴謹的統計檢定方法對他們來說較有說服力,因為任何統計圖形都是很有可能騙人的。

  ■   對一般經理人員來說,上述哪一種方法比較有說服力呢?


這並不是二擇一的問題,對於一般經理人來說,一定是直接給圖形說明最直接明瞭,但圖形也要輔以檢定統計方法的說明,才能給出最正確的資訊,以利下合理的決策。