關卡 1

A/B測試(A/BTesting),又稱隨機對照實驗(RandomControlTrial,RCT)是一種透過實驗方式比較方案成效的統計方法,也是一種能夠驗證因果關係的方式。透過以下範例將帶同學熟悉如何在R中進行A/B測試。

關卡 2

範例1.板球顏色與球員移動速度實驗,實驗數據收錄在變數cricket_color中。請同學輸入cricket_color以觀察這份實驗數據。

cricket_color

關卡 3

這份資料共包含兩個欄位,板球顏色(color,1=red,2=white)、移動初速(speed,毫秒)。

關卡 4

練習使用R套件dplyrcricket_color做敘述統計,請同學先輸入skip()檢查有無安裝dplyr套件。

check_then_install("dplyr", "0.4.3")

關卡 5

接著請同學載入dplyr套件

library(dplyr)

關卡 6

請使用dplyr對不同板球顏色分別計算移動初速的平均數與標準差。完成後,請存檔並回到console輸入submit()

library(dplyr) # 載入套件

# 請修改xxx, yyy 以計算 cricket_color 這筆資料,
# 對不同板球顏色 (color) 分別計算移動初速 (speed) 的
# 平均數 (mean) 與標準差 (sd)
# 並將結果指向 out1
out1 <- group_by(cricket_color, color) %>%
  summarise(mean=mean(speed), sd=sd(speed))

stopifnot("data.frame" %in% class(out1))
stopifnot(round(out1[1,2],4) == 156.6667)
stopifnot(round(out1[2,2],4) == 111.0000)
# 完成後,請存檔並回到console輸入`submit()`

關卡 7

紅色球設定之下,球員的平均(標準差)移動初速為156.667(31.213);白色球設定之下,球員的平均(標準差)移動初速為111.000(20.100)。看起來兩種顏色對於球員移動初速的平均值有所差異,標準差也有差異。

關卡 8

練習使用R內建的plot函數做視覺化篩檢,請同學輸入plot(speed~color,data=cricket_color)

plot(speed~color, data=cricket_color)

關卡 9

觀察boxplot可以發現,左圖(color=red)的box明顯高於右圖,也就是說紅色球讓球員有高於白色球的移動初速。本例中的boxplot是一種適合作為比較不同試驗方案優劣的dashboard。

關卡 10

然而在實務上,我們仍需要一個數值指標作為差異性的自動化篩檢。古典統計學會使用p值作為衡量標準。

關卡 11

練習使用R內建的T-test函數做A/B測試,並計算p值,請同學輸入t.test(speed~color,data=cricket_color)

t.test(speed~color, data=cricket_color)

關卡 12

由上述結果可知p值=0.0177,表示在兩種顏色沒有差異的假設下,比觀察值更極端的機率為0.0177。關於p值的解釋請參考https://en.wikipedia.org/wiki/P-value

關卡 13

範例2.考慮A、B兩種網頁排版方案,比較會員註冊的成效。在同一時間內隨機分派訪客進入A、B兩種排版的網頁,其中A版本在2,981個瀏覽數中有343個註冊數;B版本在2,945個瀏覽數中有403個註冊數。A版本的轉換率為11.5%;B版本為13.7%。

關卡 14

練習使用R內建的比例檢定函數做轉換率A/B測試,並計算p值,請同學輸入prop.test(x=c(343,403),n=c(2981,2945))

prop.test(x=c(343,403), n=c(2981,2945))

關卡 15

轉換率問題,也可以使用t.test達到類似的結果。完成後,請存檔並回到console輸入submit()

# 範例2. 計算A/B測試的p值。
# 考慮A、B兩種網頁排版方案,比較會員註冊的成效。
# 在同一時間內隨機分派訪客進入A、B兩種排版的網頁,
# A版本在2,981個瀏覽數中有343個註冊數;
# B版本在2,945個瀏覽數中有403個註冊數。
# A版本的轉換率為11.5%;B版本為13.7% 。

# 生成 web log data
a <- rep(c(1,0), c(343, 2981-343))
b <- rep(c(1,0), c(403, 2945-403))
out2 <- data.frame(method=rep(c("A","B"), c(2981,2945)),
                   value=c(a,b))

tab <- table(out2)  # 印出交叉表
tab 

# 請使用 t.test 執行轉換率A/B測試
# 將 formula 修改成適當格式 xxx ~ yyy
test1 <- t.test(value~method, data=out2)
test1

# 請使用 prop.test 執行轉換率A/B測試
# 請將xxx, yyy修改後,執行prop.test
test2 <- prop.test(x=c(343,403), n=c(2981,2945), correct=FALSE)
test2

stopifnot(round(test1$p.value,4) == 0.0115)
stopifnot(round(test2$p.value,4) == 0.0115)

# 完成後,請存檔並回到console輸入`submit()`

關卡 16

範例3.手機遊戲的儲值AB測試,這筆資料的單位已經被模糊化。這個範例將說明AB測試一個很重要的議題,不能夠隨意停止實驗。

關卡 17

這筆資料已經被預載到game這個變數中,請同學輸入summary(game)來觀察這筆資料。

summary(game)

關卡 18

這份資料從2015-03-01開始,每一個禮拜記錄一次;method=A/B表示兩群會員;value表示這群會員的儲值量;cumvalue則為累進儲值量。在2015-05-24之前,A/B兩組會員是使用相同促銷方案,此後開始區分不同方案。

關卡 19

請使用R套件ggplot2對這筆資料做基本的視覺化,請同學輸入以下指令檢查套件ggplot2:skip()

check_then_install("ggplot2", "2.0.0")

關卡 20

接著請同學載入ggplot2套件

library(ggplot2)

關卡 21

請使用ggplot2繪製linecahrt,請同學輸入以下指令:ggplot(game,aes(x=as.Date(date),y=value,colour=method))+geom_line()

ggplot(game, aes(x=as.Date(date), y=value, colour=method)) + geom_line()

關卡 22

請同學輸入以下指令,將ggplot存入變數gg<-ggplot(game,aes(x=as.Date(date),y=value,colour=method))+geom_line()

g <- ggplot(game, aes(x=as.Date(date), y=value, colour=method)) + geom_line()

關卡 23

經查我們知道2015-05-24才開始實驗,而A/B方案在2015-08-30產生黃金交叉。請同學輸入以下指令,對兩個日期做註記:node<-as.numeric(as.Date(c("2015-05-24","2015-08-30")))

node <- as.numeric(as.Date(c("2015-05-24", "2015-08-30")))

關卡 24

請同學輸入以下指令,將兩個日期劃到ggplot上:g+geom_vline(xintercept=node,lty=2)

g + geom_vline(xintercept = node, lty=2)

關卡 25

假設自2015-05-24起,做三個月的A/B測試,即2015-05-24至2015-08-23。請同學在rstatistics-03-03-01.R裡面進行作答,完成後,請存檔並回到console輸入submit()

# 請練習使用 dplyr::filter 
# 選出時間介於 2015-05-24到2015-08-23的資料
# Hint: as.Date(date) >= as.Date("2015-05-24)
game1 <- filter(game, as.Date(date) >= as.Date("2015-05-24"), 
                as.Date(date) <= as.Date("2015-08-23"))

# 執行兩方案對value的A/B測試
# 請修改formula成適當內容
# Note: alternative="less" 表示單尾檢定,請見help(t.test)
test3 <- t.test(value~method, data=game1, alternative="less")
test3

stopifnot(round(test3$p.value,5)==0.00016)
# 完成後,請存檔並回到console輸入`submit()`

關卡 26

請問同學,在上例中哪種方案表現較佳?

B

關卡 27

假設自2015-05-24起,做六個月的A/B測試,即2015-05-24至2015-11-22。請同學在rstatistics-03-03-02.R裡面進行作答,完成後,請存檔並回到console輸入submit()

# 請練習使用 dplyr::filter 
# 選出時間介於 2015-05-24到2015-11-22的資料
# Hint: as.Date(date) >= as.Date("2015-05-24)
game2 <- filter(game, as.Date(date) >= as.Date("2015-05-24"), 
                as.Date(date) <= as.Date("2015-11-22"))

# 執行兩方案對value的A/B測試
# 請修改formula成適當內容
# Note: alternative="less" 表示單尾檢定,請見help(t.test)
test4 <- t.test(value~method, data=game2, alternative="greater")
test4

stopifnot(round(test4$p.value,5)==0.09505)
# 完成後,請存檔並回到console輸入`submit()`

關卡 28

請問同學,在上例中哪種方案表現較佳?

A