本文主要參考Cumulative Gains and Lift Charts寫成,再加以進行重點摘要。
- Lift 可以用來衡量預測模型的效率,可以告訴我們,在有模型的情況下,會比沒有模型好多少倍。
- Cumulative Gains Chart以及Lift Chat是用來幫助我們衡量的視覺化模型。
- 這兩張圖都有baseline及lift curve,如果這兩條線圍起來的面積越大,那模型的效果也越佳。
Example 1
假設向一個群體內所有人發傳單,會有20%的人有正向的回應,發傳單的成本是$1。
| Cost($) | Total Customers Contacted | Positive Responses |
|---|---|---|
| 100,000 | 100,000 | 20,000 |
如果我們使用模型,則可以更好的發傳單計畫。
例如第一列,我們用模型找出10,000個人,只發傳單給他們,會有6000人有正向的回覆。其他列以此類推。最後一列表示的是,如果我們發傳單給所有的人,一樣會有20%的人回覆,模型不會讓更多人回覆,只是有個更聰明的找人方法。
| Cost($) | Total Customers Contacted | Positive Responses |
|---|---|---|
| 10000 | 10000 | 6000 |
| 20000 | 20000 | 10000 |
| 30000 | 30000 | 13000 |
| 40000 | 40000 | 15800 |
| 50000 | 50000 | 17000 |
| 60000 | 60000 | 18000 |
| 70000 | 70000 | 18800 |
| 80000 | 80000 | 19400 |
| 90000 | 90000 | 19800 |
| 100000 | 10000 | 20000 |
Cumulative Gains Chart
- y軸代表的是正面回覆的比例,分母是整個群體正面回覆的人數,這個例子是20,000
- x軸表示的發傳單的數量占群體總數的比例
- Baseline:沒有採用模型,隨機從群體挑選出 p% 的人發傳單,那有正面回應的人佔整個群體正面回覆的人數,自然就是 p%。
- Lift Curve:採用模型挑選要發給哪些人傳單。y值的分子代表模型挑出來發傳單且有正面回應的人數,分母是整個群體正面回覆的人數。

建立範例資料1
2
3
4
5
6
7
8baseline <- data.frame(
cost=seq(0,100000,by=10000),
cus_contacted = seq(0,100000,by=10000),
positive_resp = seq(0,100000,by=10000) * 0.2)
model_result <- data.frame(
cost = seq(0,100000,by=10000),
cus_contacted = seq(0,100000,by=10000),
positive_resp = c(0,6000,10000,13000,15800,17000,18000,18800,19400,19800,20000))
建立 Cumulative Gain Chart1
2
3
4
5
6
7
8
9
10
11
12plot(c(0,100),c(0,100), type="n", xlab = "% Customers Contacted", ylab="% Posittive Responses",main = "Cumulative Gains Chart")
axis(1, seq(0,100,by=10))
axis(2, seq(0,100,by=10))
lines(x = seq(0,100,by=10),
baseline$positive_resp/(20000/100),
type='o', col='red', pch=2)
# 當向p%的客戶發傳單時,會有x人回傳,gain就是x除以全部發且會回傳的人
lines(x = seq(0,100,by=10),
model_result$positive_resp/(20000/100),
type='o', col='blue',pch=1)
abline(h=seq(10,100,by=10))
legend("bottomright", c("baseline", "model prediction"), lty = c(1,1), col=c("red","blue"))
Lift Chart
- 顯示出因為模型而提升了多少效率(Lift)
- 計算有模型與沒有模型有正向回覆的人數之比
- 例如:發傳單給佔群體10%的人數,如果使用模型,正向回覆率為30%,亦即正向回覆6000人,而整個群體的正向回覆有20000人,故6000/20000 = 30%。但若沒有使用模型,正向回覆率為10%。所以lift值為30%/10% = 3
- 也就是說,如果用模型的結果發傳單給佔10%群體的人們,我們可能得到回覆會比沒有模型多三倍。

1 | ### Lift Chart |
Example 2:模型案例
模型如下
$$ Y = 100 - Age(x) $$
資料如下
| Cumtomer | Age | Actual Response |
|---|---|---|
| Alan | 39 | N |
| Bob | 21 | Y |
| Jessica | 25 | Y |
| Elizabeth | 30 | Y |
| Hilary | 19 | Y |
| Fred | 48 | N |
| Alex | 12 | Y |
| Margot | 51 | N |
| Sean | 65 | Y |
| Chris | 42 | N |
| Philip | 20 | Y |
| Catherine | 23 | N |
| Amy | 13 | N |
| Erin | 35 | Y |
| Trent | 55 | N |
| Preston | 25 | N |
| John | 76 | N |
| Nancy | 24 | Y |
| Kim | 31 | N |
| Laura | 29 | Y |
- 計算每個欄位的Y值
- 依照Y值排列
| Cumtomer | Y | Actual Response |
|---|---|---|
| Alex | 88 | Y |
| Amy | 87 | N |
| Hilary | 81 | Y |
| Philip | 80 | Y |
| Bob | 79 | Y |
| Catherine | 77 | N |
| Nancy | 76 | Y |
| Jessica | 75 | Y |
| Preston | 75 | N |
| Laura | 71 | Y |
| Elizabeth | 70 | Y |
| Kim | 69 | N |
| Erin | 65 | Y |
| Alan | 61 | N |
| Chris | 58 | N |
| Fred | 52 | N |
| Margot | 49 | N |
| Trent | 45 | N |
| Sean | 35 | Y |
| John | 24 | N |
依據分割點,計算回覆率
Respose Rate = Number of Responses / Total Number of Responses
| #(Cumtomers contacted) | Number of Response | Response Rate |
|---|---|---|
| 2 | 1 | 10% |
| 4 | 3 | 30% |
| 6 | 4 | 40% |
| 8 | 6 | 60% |
| 10 | 7 | 70% |
| 12 | 8 | 80% |
| 14 | 9 | 90% |
| 16 | 9 | 90% |
| 18 | 9 | 90% |
| 20 | 10 | 100% |
Cumulative Gains Chart
資料整理
1 | names <- c("Alan","Bob", "Jessica", "Elizabeth", "Hilary", "Fred","Alex", "Margot", "Sean", |
製作Cumulative Gain Chart
1
2
3
4
5# Cumulative Gains Chart
baseline <- seq(0,100,by=10)
plot(c(0,100),c(0,100), type="n", xlab = "% Customers Contacted", ylab="% Posittive Responses",main = "Cumulative Gains Chart")
axis(1, seq(0,100,by=10))
axis(2, seq(0,100,by=10))
製作Lift Chart

1
2
3
4
5
6
7
8
9
10
11
12### Lift Chart
plot(c(10,100),c(0.6, 1.6), type="n", xlab = "% Customers Contacted", ylab="Lift" ,main = "Lift")
axis(1, seq(0,100,by=10))
axis(2, seq(0,100,by=10))
lines(x = seq(0,100,by=10),
baseline/baseline,
type='o', col='red', pch=2)
lines(x = seq(0,100,by=10),
c(0,cumu_data$resp_rate)/baseline,
type='o', col='blue',pch=1)
abline(h=seq(0.6,1.6,by=0.1))
legend("topright", c("baseline", "model prediction"), lty = c(1,1), col=c("red","blue"))
參考資料
Cumulative Gains and Lift Charts
SPSS的Lift Chart
一分鐘建立與評估資料探勘模型