\[\Delta P = f(x|m,b,a) = m \cdot Logis(\frac{10(x - b)}{a})\]
\[\hat{R}(x) = \left\{\begin{matrix} \Delta P \cdot M \cdot margin - x & , & P + \Delta P \leq 1\\ (1-P) \cdot M \cdot margin - x & , & else \end{matrix}\right.\]
Inst = list( # 定義兩個行銷工具(S曲線的參數:`m`, `b`, `a`)
Camp1 = list(name="Camp1", m=0.12, b=25, a=50),
Camp2 = list(name="Camp2", m=0.14, b=35, a=40),
Camp3 = list(name="Camp3", m=0.14, b=40, a=60)
)
X = seq(5,100,1) # 策略變數向量
rMar=0.5 # 平均毛利率
Simu = function(z) { # 淨預期報酬計算功能
df = tibble(
inst=z$name, cost=X,
eff = z$m * plogis((10/z$a)*(X-z$b)) # 每一個策略的(機率)效果
)
df2 = sapply(1:nrow(df), function(i) {
# 對每一位顧客的淨預期報酬
eR = pmin(1-B$Buy, df$eff[i])*B$Rev*rMar - df$cost[i]
# 對全體顧客的淨預期報酬
c(eReturn=sum(eR), N=sum(eR > 0), eReturn2=sum(eR[eR > 0]))
}) %>% t
cbind(df, df2) %>% as_tibble
}
## # A tibble: 288 x 6
## inst cost eff eReturn N eReturn2
## * <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Camp1 5 0.00216 -114087. 3 1.61
## 2 Camp1 6 0.00263 -136467. 3 2.21
## 3 Camp1 7 0.00319 -157565. 3 3.57
## 4 Camp1 8 0.00388 -177127. 3 5.83
## 5 Camp1 9 0.00470 -194864. 3 9.18
## 6 Camp1 10 0.00569 -210438. 7 15.6
## 7 Camp1 11 0.00688 -223473. 29 36.7
## 8 Camp1 12 0.00830 -233542. 80 104.
## 9 Camp1 13 0.00998 -240180. 166 294.
## 10 Camp1 14 0.0120 -242908. 357 736.
## # ... with 278 more rows
行銷工具的效果曲線
ggplot(df, aes(x=cost, y=eff, col=inst)) +
geom_line(size=1.5,alpha=0.5) + theme_bw() +
ggtitle("效果曲線: S(x|m,b,a)")
行銷工具的淨預期報酬,淨預期報酬>0
ggplot(df, aes(x=cost, y=eReturn2, col=inst)) +
geom_line(size=1.5,alpha=0.5) + theme_bw() +
ggtitle("淨預期報酬")
🗿 練習:
利用上面的程式,請自行定義三個行銷工具並劃出它們的效果與淨預期報酬曲線
定義一個計算淨預期報酬的功能 eRet(x, n, z, rMar)
x
: 工具成本n
: 選擇顧客數z
: 工具參數 (m,b,a)rMar
: 毛利率🌻 效用函數:eRet(x, budget/x, z, rMar)
eRet = function(x, n, z, rMar=0.5) {
eff = z$m * plogis((10/z$a)*(x-z$b))
eR = pmin(1-B$Buy, eff)*B$Rev*rMar - x
sort(eR) %>% tail(n) %>% sum
}
eRet(40,10000,Inst[[1]],0.5)
## [1] 407326.2
如果我們的行銷預算是450,000
,毛利率是0.5
,
假如我們選擇工具Inst[[2]]
,並將成本設定為40
## [1] 385245.5
🗿 練習:
■ 如果行銷預算是500,000
,成本設定為40
,預期報酬是?
■ 如果行銷預算是500,000
,成本設定為多少,才能獲得最大的預期報酬呢?
## [1] 397036.5
🌻 優化:給定效用函數eRet(x, budget/x, z, rMar)
,找出效用最大的參數(\(x^*\))
## [1] 17
## [1] 481197.7 46.0
🌻 參數模擬:如果參數只有一個,通常用簡單的模擬就可以找到最佳參數
budget=500000; x=seq(30,60,1)
tibble(
cost=x,
eRet=sapply(x, function(x) eRet(x,budget/x,Inst[[2]],0.5))
) %>%
ggplot(aes(x=cost,y=eRet)) + geom_line() -> p
plotly::ggplotly(p)
🌻 R的內建優化功能:optim(par, fn, ...)
par
: 參數的起始值向量fn
: 目標函數 function(par, ...)
🌻 一般的優化工具的目標都是讓成本最小,所以目標函數要設為-eRet()
budget=500000
f = function(x) { -eRet(x,budget/x,Inst[[2]],0.5) }
optim(c(40), f) # , method="Brent", lower=c(30), upper=c(60))
## $par
## [1] 45.86735
##
## $value
## [1] -481235.9
##
## $counts
## function gradient
## 61 NA
##
## $convergence
## [1] 0
##
## $message
## NULL
工具參數設為45.867
時,可以得到最大的預期報償481,236
🗿 練習:
行銷預算不變,如果我們用工具Inst[[1]]
…
■ 其成本設定為多少,才能獲得最大的預期報酬呢?
■ 在最大預期報酬的情況下,我們會做多少位顧客呢?
要同時優化很多個參數時,就很難直接模擬全部的參數組合,比如說:
我們要把行銷經費分攤到兩個行銷工具上面:
才能獲得最大的預期報酬呢?
🌻 首先定義效用函數:f(x)
x
: 參數向量x[1]
: 工具1的參數x[2]
: 工具2的參數x[3]
: 工具一的預算百分比budget=500000
f = function(x) {
- eRet(x[1], (x[3]/100)*budget/x[1], Inst[[1]], 0.5) -
eRet(x[2], ((100-x[3])/100)*budget/x[2], Inst[[2]], 0.5) }
## [1] -549346.4
## $par
## [1] 35.51398 45.45441 48.32743
##
## $value
## [1] -677180.8
##
## $counts
## function gradient
## 215 NA
##
## $convergence
## [1] 0
##
## $message
## NULL
最佳參數組合:
x[1]
: 工具1的面額 = 35.514
x[2]
: 工具2的面額 = 45.454
x[3]
: 工具一的預算百分比 = 48.327
可以獲得 最佳預期獲利 = 677,181