Мы завершаем рассматриваем в R примеры SAS на наборах данных из книги Kumar V., Petersen Andrew J. “Statistical Methods in Customer Relationship Management”.
Менеджеры обычно считают, что оттока клиентов - это конец жизненного цикла клиента. Но это не должно быть завершением жизненного цикла. Компании все еще могут вернуть потерянных клиентов и дать им вторую жизнь. В отличие от новых клиентов, у потерянных клиентов есть определенные знания о продуктах и услугах компании и они имеют собственное мнение об атрибутах и функциях продуктов и услуг. С одной стороны, легче подойти к потерянным клиентам, так как они знакомы с компанией. С другой стороны, потерянные клиенты часто переключают продавцов, потому что они не удовлетворены продуктом, поэтому не всегда легко изменить свое отношение и убедить их вернуться. Авторы также должны рассмотреть вопрос о том, стоит ли возвращать клиентов обратно в фирму - не все клиенты стоят того, чтобы оставить их после выхода.
Как только авторы определили, когда клиент, скорее всего, уйдет в отток (см. шестую главу для подробного анализа определения вероятности оттока), следует решить, будет ли в интересах компании пытаться вернуть клиента. Итак, есть несколько ключевых вопросов, на которые следует ответить. К ним относятся:
Следует ли вмешиваться в уход клиентов?
Как следует подойти к клиентам, чтобы вернуть их?
Ответы на каждый из этих вопросов будут способствовать оптимальной стратегии возврата клиентов. В этой области было проведено несколько исследований, хотя исследования в области защиты клиентов все еще недостаточны. Чтобы обеспечить полное понимание того, как моделировать обратную связь с клиентами, авторы предлагают рассмотривать проблемы в исследованиях один за другим вместе с соответствующими методами моделирования. Авторы также представят эмпирический пример, который продемонстрирует, как применять эти знания к представительной выборке клиентов из фирмы B2C.
Как и в моделях привлечения клиентов и моделях удержания клиентов, первым вопросом, на который нужно ответить, является вопрос о том, вступают ли клиенты с фирмой в договорные или внедоговорные отношения. В большинстве случаев это определяет тип статистической модели, который необходимо использовать для получения информации о данных.
В этой главе авторы дают описание основных этапов моделирования, которое пытается ответить на каждый ключевой вопрос исследования, поднятый в начале главы. Авторы приводят эмпирический пример, который покажет, как образцы данных могут использоваться для ответа на эти ключевые вопросы исследования. Для эмпирического примера авторы предоставляем набор данных под названием customerWinBack. В этом наборе данных содержится репрезентативная выборка из 500 текущий и бывших клиентов типичной фирмы B2C. Данные включают следующие 10 переменные:
| Переменные | Описание |
|---|---|
| Reacquire | 1, если клиент был вновь привлечен, 0 в противном случае |
| Duration_2 | Время в днях, когда клиент стал вторично активным или продолжает быть клиентом |
| SCLV | Прогноз ценности клиента на втором цикле жизни. Это 0, если клиента не зашел вновь |
| Duration_1 | Время в днях, когда клиент оставался активным на первом цикле сотрудничества с фирмой |
| Offer | Стоимость предложения, предоставленного клиенту для повторного привлечения |
| Duration_lapse | Время в днях, между тем как клиент ушел в отток и затем получив предложение о возвращении |
| Price_Change | Увеличение (или уменьшение) цены подписки второго жизненного цикла против первого цикла |
| Gender | 1, если клиент является мужчиной, 0, если клиент является женщиной |
| Age | Возраст клиента на момент получения предложение о возвращении к сотрудничеству с фирмой |
Эти данные будут использованы для эмпирического примера, который поможет понять драйверы и вероятность повторного возврата клиентов.
library('tidyverse')## -- Attaching packages ----------------------------------------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 2.2.1 v purrr 0.2.4
## v tibble 1.4.2 v dplyr 0.7.5
## v tidyr 0.8.1 v stringr 1.3.1
## v readr 1.1.1 v forcats 0.3.0
## -- Conflicts -------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library('caret')## Loading required package: lattice
##
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
##
## lift
library('car')## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
## The following object is masked from 'package:purrr':
##
## some
utils::data('customerWinBack', package = 'SMCRM')
# Check for Class Imbalances
writeLines("Distribution Variable 'customerWinBack' by Reacquisition factor")## Distribution Variable 'customerWinBack' by Reacquisition factor
customerWinBack$reacquire %>%
factor() %>%
table() # %>%## .
## 0 1
## 205 295
# prop.test() Следует отметить, что авторы авторы получили случайную выборку, которую сложно счесть сбалансированной по признаку reacquire. Поэтому при построении моделей авторам было важно учитывать этот явление. Однако они, как и в предыдущих главах, упустили этот моменте своем анализе.
Чтобы понять, нужно ли пытаться вернуть потерянного клиента, нам необходимо разработать набор моделей, которые описывают процесс повторного привлечения (WinBack) и второго жизненного цикла клиента. Этот процесс будет включать в себя три разные модели: модель повторного привлечения, модель продолжительности жизни клиента во втором цикле и модель CLV второго цикла жизни. Как только авторы смогут получим результаты от трех моделей, появиться лучшее понимание того, как повторно приобретать клиентов, а потерянные клиенты заслуживают повторного привлечения. Авторы предлагают оценить три модели:
\[ \displaystyle \large \begin{array}{ll} y_{L_i} = \begin{cases} \beta'_L x_{Li} + \gamma' y_{Di} + \varepsilon_{Li} & {\text{if}}\ z_i = 1 \\ 0 & {\text{в противном случае}} {} \\ \end{cases} (уравнение \enspace CLV \enspace второго \enspace цикла \enspace жизни) \end{array} \hspace{.5 in} [1] \]
\[ \displaystyle \large \hspace{.5 in} \begin{array}{ll} y_{D_i} = \begin{cases} \beta'_D x_{Di} + \varepsilon_{Di} & {\text{if}}\ z_i = 1 \\ 0 & {\text{в противном случае}} {} \\ \end{cases} (уравнение \enspace CLV \enspace продолжительности \enspace жизни \enspace во \enspace втором \enspace цикле) \end{array} \hspace{.5 in} [2] \]
\[ \displaystyle \large \hspace{2.5 in} z^*_{i} = \alpha'v_i + \mu_i \hspace{.5 in} (уравнение \enspace возвращения \enspace клиентов)\]
\[ \displaystyle \large \begin{array}{ll} z_{i} = \begin{cases} 1 & {\text{if}}\ z_i^* > 0 \hspace{.5 in} [3]\\ 0 & {\text{if}}\ z_i^* \le 0 {} \\ \end{cases} \end{array} \]
где \(z^*_{i}\) - скрытая переменная, указывающая на полезность потребителя i для участия во втором цикле с фирмой;
\(z_{i}\) - индикаторная переменная, показывающая, будет ли клиент i повторно привлечен (\(z_{i}\) = 1) или нет (\(z_{i}\) = 0);
\(v_{i}\) - вектор ковариатов влияющих на повторное привлечение клиента i;
\(y_{D_i}\) - продолжительность второго жизненного цикла отношений клиента с фирмой;
\(x_{D_i}\) - вектор ковариатов, влияющий на продолжительность второго жизненного цикло клиента;
\(y_{L_i}\) - CLV второго жизненного цикла клиента i;
\(x_{L_i}\) - вектор ковариатов, влияющих на CLV второго жизненного цикла клиента i;
\(\alpha, \beta_L, \beta_D\) - вектора параметров модели повторного привлечения, модели продолжительности жизни клиента во втором цикле и модели CLV второго цикла жизни соответственно;
и \(\mu_i, \varepsilon_{Di} \enspace и \enspace \varepsilon_{Li}\) - случайные ошибки моделей.
Учитывая, что структура моделирования носит рекурсивный характер, авторы предлагают ее оценить поэтапно. В этом эмпирическом примере будут три подраздела (аналогичные оценке в шестой главе). В первом подразделе будет описана и оценена модель повторного привлечения, вторая будет описывать и оценивать продолжительности жизни клиента во втором цикле, а третья будет описывать и оценивать модель CLV второго цикла жизни.
Ключевой вопрос, который авторы хотят ответить в отношении повторного привлечения клиентов, заключается в том, можем ли определиться, какие будущие перспективы имеют наивысшую вероятность повторного привлечения. Для этого сначала нужно знать, какие ранее потерянные клиенты были приобретены, а какие нет. В наборе данных, предоставленном для этой главы, имеется бинарная переменная, которая идентифицирует, был ли ранее потерянный клиент повторно подключен фирмой (и, следовательно, снова стал клиентом) и набор драйверов, которые могут помочь объяснить решение клиента о воссоединении с фирмой. Случайная выборка из 500 ранее потерянных клиентов (некоторые из которых стали клиентами снова) была взята из фирмы B2C. Информация, необходимая для нашей модели повторного привлечения, включает следующий список переменных:
| Переменные | Описание |
|---|---|
| Зависимая переменная | |
| Reacquire | 1, если клиент был вновь привлечен, 0 в противном случае |
| Предикторы | |
| Duration_1 | Время в днях, когда клиент оставался активным на первом цикле сотрудничества с фирмой |
| Offer | Стоимость предложения, предоставленного клиенту для повторного привлечения |
| Duration_lapse | Время в днях, между тем как клиент ушел в отток и затем получив предложение о возвращении |
| Price_Change | Увеличение (или уменьшение) цены подписки второго жизненного цикла против первого цикла |
| Gender | 1, если клиент является мужчиной, 0, если клиент является женщиной |
| Age | Возраст клиента на момент получения предложение о возвращении к сотрудничеству с фирмой |
Во-первых, нужно смоделировать вероятность того, что отношения фирмы с клиентом будут восстановлены. Поскольку наша зависимая переменная (Reacquire) является двоичной и нужна оценивать две другие последовательные модели (как нормально распределенные), то следует выбирать пробит-регрессию для этой модели. Выбор логистической регрессии потребовал бы, чтобы мы преобразовали выход модели, прежде чем интегрировать результаты с двумя другими уравнениями. В этом случае переменная y является Reacquire, а переменные x представляют ряд независимых переменных в нашей базе данных. Когда запускается пробит-регрессия, получаем следующий результат:
# Fit Probit Model for Customer Reacquisition by Authors
# https://stats.idre.ucla.edu/sas/dae/probit-regression & https://stats.idre.ucla.edu/r/dae/probit-regression
Ch07.reacq <- glm(reacquire ~ duration_1 + offer + duration_lapse + gender + age,
data = customerWinBack, family = binomial(link = 'probit'))## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(Ch07.reacq)##
## Call:
## glm(formula = reacquire ~ duration_1 + offer + duration_lapse +
## gender + age, family = binomial(link = "probit"), data = customerWinBack)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.49177 -0.17664 0.00077 0.21576 2.10314
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.4988483 0.6627930 -2.261 0.0237 *
## duration_1 0.0091057 0.0008641 10.538 < 2e-16 ***
## offer 0.1571163 0.0260571 6.030 1.64e-09 ***
## duration_lapse -0.0333472 0.0035778 -9.321 < 2e-16 ***
## gender -0.2063509 0.1950058 -1.058 0.2900
## age -0.0387717 0.0070828 -5.474 4.40e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 676.86 on 499 degrees of freedom
## Residual deviance: 232.35 on 494 degrees of freedom
## AIC: 244.35
##
## Number of Fisher Scoring iterations: 8
writeLines(sprintf("-2 Log L of Intercept and Only Covariates: %.3f", -2 * logLik(Ch07.reacq)[1]))## -2 Log L of Intercept and Only Covariates: 232.351
writeLines(sprintf(" AIC (smaller is better): %.3f", extractAIC(Ch07.reacq)[2]))## AIC (smaller is better): 244.351
writeLines("\n Wald test of predictors")##
## Wald test of predictors
car::Anova(Ch07.reacq, type="II", test="Wald")## Analysis of Deviance Table (Type II tests)
##
## Response: reacquire
## Df Chisq Pr(>Chisq)
## duration_1 1 111.0429 < 2.2e-16 ***
## offer 1 36.3573 1.643e-09 ***
## duration_lapse 1 86.8745 < 2.2e-16 ***
## gender 1 1.1197 0.29
## age 1 29.9656 4.398e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
writeLines("\n Variance Inflation Factors - if vif() > 2 - feature has multicollinearity with others")##
## Variance Inflation Factors - if vif() > 2 - feature has multicollinearity with others
car::vif(Ch07.reacq) # Variance Inflation Factors - if vif() > 2 - feature has multicollinearity ## duration_1 offer duration_lapse gender age
## 2.275105 1.365581 2.293438 1.004909 1.271632
writeLines("\n Probit Model: Association of Predicted Probabilities and Observed Responses \n")##
## Probit Model: Association of Predicted Probabilities and Observed Responses
prob <- predict(Ch07.reacq, newdata = customerWinBack, type = "response")
caret::confusionMatrix(data = ifelse(prob > 0.5, "1", "0") %>% factor,
reference = customerWinBack$reacquire %>% factor,
positive = "1", mode = "everything")## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 172 35
## 1 33 260
##
## Accuracy : 0.864
## 95% CI : (0.8308, 0.8928)
## No Information Rate : 0.59
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.7193
## Mcnemar's Test P-Value : 0.9035
##
## Sensitivity : 0.8814
## Specificity : 0.8390
## Pos Pred Value : 0.8874
## Neg Pred Value : 0.8309
## Precision : 0.8874
## Recall : 0.8814
## F1 : 0.8844
## Prevalence : 0.5900
## Detection Rate : 0.5200
## Detection Prevalence : 0.5860
## Balanced Accuracy : 0.8602
##
## 'Positive' Class : 1
##
Как видно из результатов, пять из шести (включая засчитанный авторами свободный член) независимых переменных значимы при p-значении 5% или выше - единственной несущественной переменной является Gender. Во-первых, это означает, что чем дольше первоначальные отношения связывали клиента с фирмой (Duration_1), тем выше вероятность возвращения клиента вновь. Во-вторых, результаты показывают, что чем выше Offer, сделанное для бывшего клиента, то, тем вероятнее, повторное привлечение. В-третьих, результаты показывают, что чем дольше время, прошедшее с момента завершения первого цикла работы с клиентом (Duration_Lapse), тем менее вероятно, что клиент будет повторно приобретен. Наконец, результаты показывают, что чем старше клиент (Age), тем меньше вероятность того, что клиент будет восстановлен.
Теперь, когда мы определили драйверы восстановления клиента, следует использовать выводы модели для определения предсказательной точности авторской модели. Для этого нужно использовать оценки, полученные нами по модели повторного привлечения, чтобы помочь определить предсказуемую вероятность того, что каждый клиент будет восстановлен.
Авторы обсуждают в книге как правильнее учесть несбалансированность двух классов предлагая для этого экстравагантные подходы. Я рекомендую обратиться к хорошо зарекомендовавшему способу взвешивания классов, который вкупе с 25-ти кратным бустингом на имеющихся данных и выбором коэффициент Cohen’s Kappa в качестве критерия отбора наиболее точной модели, существенно увеличивает устойчивость модели.
# Fit Probit Regression Model for Customer Reacquisition (Improved)
uno = 'probit'
# Weights of cases to resolve Class Imbalances Problem
weight.cases <- customerWinBack$reacquire
for(val in unique(weight.cases)) {weight.cases[weight.cases==val]=
1/sum(weight.cases==val)*length(weight.cases)/2} # normalized to sum to length(samples)
set.seed(2018) #From random.org
(Ch07pr.AR <- train(factor(reacquire) ~ duration_1 + offer + duration_lapse + gender + age,
data = customerWinBack, metric = 'Kappa', weights = weight.cases,
method = "glm", family = binomial(link = uno)))#,## Generalized Linear Model
##
## 500 samples
## 5 predictor
## 2 classes: '0', '1'
##
## No pre-processing
## Resampling: Bootstrapped (25 reps)
## Summary of sample sizes: 500, 500, 500, 500, 500, 500, ...
## Resampling results:
##
## Accuracy Kappa
## 0.8707447 0.7332039
# trControl = trainControl(method = "none", number = 1)))
summary(Ch07pr.AR)##
## Call:
## NULL
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.5530 -0.1496 0.0012 0.2510 2.0899
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.7208997 0.6662376 -2.583 0.00979 **
## duration_1 0.0091122 0.0008586 10.612 < 2e-16 ***
## offer 0.1566367 0.0258785 6.053 1.42e-09 ***
## duration_lapse -0.0332461 0.0035733 -9.304 < 2e-16 ***
## gender -0.2062609 0.1939269 -1.064 0.28751
## age -0.0384836 0.0070226 -5.480 4.25e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 693.15 on 499 degrees of freedom
## Residual deviance: 236.20 on 494 degrees of freedom
## AIC: 249.27
##
## Number of Fisher Scoring iterations: 8
# Odds Ratio Estimates and 95% CI
writeLines("\n Odds Ratio Estimates and 95% CI")##
## Odds Ratio Estimates and 95% CI
car::Confint(Ch07pr.AR$finalModel) %>%
exp() %>%
arm::pfround(digits = 3)## Estimate 2.5 % 97.5 %
## (Intercept) 0.179 0.048 0.647
## duration_1 1.009 1.008 1.011
## offer 1.170 1.114 1.232
## duration_lapse 0.967 0.960 0.974
## gender 0.814 0.556 1.187
## age 0.962 0.949 0.975
# Logistic regression diagnostics
writeLines("\n Wald test of predictors")##
## Wald test of predictors
car::Anova(Ch07pr.AR$finalModel, type="II", test="Wald")## Analysis of Deviance Table (Type II tests)
##
## Response: .outcome
## Df Chisq Pr(>Chisq)
## duration_1 1 112.6219 < 2.2e-16 ***
## offer 1 36.6361 1.424e-09 ***
## duration_lapse 1 86.5626 < 2.2e-16 ***
## gender 1 1.1312 0.2875
## age 1 30.0303 4.254e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
writeLines("\n Variance Inflation Factors - if vif() > 2 - feature has multicollinearity with others")##
## Variance Inflation Factors - if vif() > 2 - feature has multicollinearity with others
car::vif(Ch07pr.AR$finalModel) # Variance Inflation Factors - if vif() > 2 - feature has multicollinearity## duration_1 offer duration_lapse gender age
## 2.292250 1.361226 2.299312 1.006855 1.266035
writeLines("\n Variable Importance for Model \n")##
## Variable Importance for Model
caret::varImp(Ch07pr.AR) %>% .$importance %>% print.AsIs()## Overall
## duration_1 100.00000
## offer 52.24956
## duration_lapse 86.29720
## gender 0.00000
## age 46.25098
# Create the scatter plots Probit versus model predictors
predictors <- Ch07pr.AR$coefnames
Ch07pr.AR$trainingData %>%
dplyr::select(one_of(predictors)) %>%
mutate(link = predict(Ch07pr.AR$finalModel, newdata = customerWinBack, type = "link")) %>%
gather(key = "predictors", value = "predictor.value", -link) %>%
ggplot(aes(predictor.value, link))+
geom_point(size = 0.5, alpha = 0.5) +
geom_smooth(method = "loess") +
facet_wrap(~ predictors, scales = "free_x") +
ylab(stringr::str_to_title(uno))# Plot matrix of statistical model diagnostics
GGally::ggnostic(Ch07pr.AR$finalModel, title = paste(paste(formula(Ch07pr.AR)[c(2, 1, 3)], collapse = " ")))## `geom_smooth()` using method = 'loess'
## `geom_smooth()` using method = 'loess'
## `geom_smooth()` using method = 'loess'
## `geom_smooth()` using method = 'loess'
## `geom_smooth()` using method = 'loess'
# wide variety of diagnostic plots for checking the quality of regression fit
# https://bookdown.org/jefftemplewebb/IS-6489/logistic-regression.html
car::influenceIndexPlot(Ch07pr.AR$finalModel)writeLines("\n Improved Probit Model: Association of Predicted Probabilities and Observed Responses \n")##
## Improved Probit Model: Association of Predicted Probabilities and Observed Responses
caret::confusionMatrix(data = predict(Ch07pr.AR, newdata = customerWinBack),
reference = customerWinBack$reacquire %>% factor,
positive = "1", mode = "everything")## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 182 40
## 1 23 255
##
## Accuracy : 0.874
## 95% CI : (0.8417, 0.9018)
## No Information Rate : 0.59
## P-Value [Acc > NIR] : < 2e-16
##
## Kappa : 0.7428
## Mcnemar's Test P-Value : 0.04382
##
## Sensitivity : 0.8644
## Specificity : 0.8878
## Pos Pred Value : 0.9173
## Neg Pred Value : 0.8198
## Precision : 0.9173
## Recall : 0.8644
## F1 : 0.8901
## Prevalence : 0.5900
## Detection Rate : 0.5100
## Detection Prevalence : 0.5560
## Balanced Accuracy : 0.8761
##
## 'Positive' Class : 1
##
qplot(`Observed Classes`, `Predicted Classes`,
data=bind_cols(`Observed Classes`= factor(customerWinBack$reacquire),
`Predicted Classes` = predict(Ch07pr.AR, newdata = customerWinBack)),
colour= `Observed Classes`, geom = c("boxplot", "jitter"),
main = "Predicted Classes vs. Observed Classes", xlab = "Observed Classes", ylab = "Predicted Classes")В результате я получаю значительнее устойчивее модель, которая имеет большую точность против авторской за счет использования корректных весов бинарного класса (“Kappa” = 0.7428). Правда, небольшое снижение чуствительности модели становится платой за её устойчивость.
Как видно из таблицы, авторская модель на этих данных точно предсказывает хорошо - 83.9% клиентов (коэффициент специфичности), которые решили не возвращаться (172/205) и 88.1% клиентов (коэффициент чуствительности), которые решили возвращаться (260/295). Для предсказания по клиентом, которые решили повторно приобрести продукт и для прогнозирования клиентов, которые решили не повторно приобретать продукт, это значительное увеличение прогностической способности наивной модели случайных догадок, которая была бы только на 59.0% (см. показатель “No Information Rate” в Матрице ошибок) для этого набора данных , Чтобы определить общую прогнозируемую производительность модели, мы рассмотрим диагональ и видим, что в целом наша точность предсказания (коэффициент аккуратности) составляет 86.4% (432/500). Учитывая, что модель в целом предсказывает лучше, чем наивная модель случайных догадок, можно определить, что предсказание по модели хорошее.
В результате теперь стало известно, как анализировать прошлую продолжительность жизни клиента; время, прошедшее с того момента, когда клиент отказался от сотрудничества с фирмой; уровень предложения, который предоставляется клиенту для стимулирования возвращения, а демографические характеристики клиента могут либо увеличить, либо уменьшить вероятность возвращения вновь.
Второй этап этого процесса - оценить модель продолжительности жизни клиента во втором цикле. Цель этой модели - понять драйверы, которые описывают продолжительность времени, когда клиент, вероятно, будет клиентом во второй раз, зависит от того, что произошло ранее. Таким образом, уравнение принимает следующий формат:
\[ \displaystyle \large E(Duration \text _ 2) = P(Reacquisition = 1) * E(Duration \text _ 2 | Reacquisition = 1) \hspace{.5 in} [4]\]
Это уравнение показывает, что ожидаемая вторичной продолжительность (Duration_2) является функцией вероятности повторного приобретения клиента, умноженной на ожидаемое значение вторичной продолжительности при условии, что клиент был повторно привлечен. Если бы мы просто выполняли регрессию с Duration_2 как зависимую переменную и игнорировали вероятность того, что клиент прочитает, мы получим смещенные оценки из-за возможного смещения выборки.
Смещение выборки (англ. “Sample Selection Bias”) является проблемой, которая распространена во многих маркетинговых задачах и должна быть статистически учтена во многих процессах моделирования. Если у клиента есть выбор, нужно ли повторно приобретать продукт, прежде чем принимать решение о том, как долго будут длится вторый цикл связь, то наличие выбора о повторном привлечение надо учитывать в модели. Если бы авторы проигнорировали этот выбор, то бы сместили оценки в модели, и были бы получены менее точные предсказания для значения Duration_2. Чтобы учесть эту проблему, авторы предлагают иметь возможность предсказывать значение как вероятности Reacquisition (что авторы уже на первом шаге этого примера), так и ожидаемое значение Duration_2, учитывая, как долго клиент будет сотрудничать с фирмой предже, чем вновь будет потерян.
Наконец, авторы хотим оценить регрессионную модель для Duration_2 и включить переменную \(\lambda\) в качестве дополнительной независимой переменной. Это делается простым способом, используя следующее уравнение:
\[ \displaystyle \large Duration \text _ 2 = \gamma' \alpha + \mu \lambda + \varepsilon. \hspace{.5 in} [5] \]
В этом случае Duration_2 является значением вторичной продолжительность, \(\gamma\) является матрицей переменных, используемой для объяснения значения Duration_2, \(\alpha\) - коэффициенты для независимых переменных, \(mu\) - коэффициент обратного отношения Миллса, l - обратный коэффициент Миллса, а \(\varepsilon\) - это случайная ошибка модели. Таким образом, для этого примера мы будем использовать следующий список переменных:
| Переменные | Описание |
|---|---|
| Зависимая переменная | |
| Duration_2 | Время в днях, когда клиент стал вторично активным или продолжает быть клиентом |
| Предикторы | |
| Duration_1 | Время в днях, когда клиент оставался активным на первом цикле сотрудничества с фирмой |
| Offer | Стоимость предложения, предоставленного клиенту для повторного привлечения |
| Duration_lapse | Время в днях, между тем как клиент ушел в отток и затем получив предложение о возвращении |
| Price_Change | Увеличение (или уменьшение) цены подписки второго жизненного цикла против первого цикла |
| Gender | 1, если клиент является мужчиной, 0, если клиент является женщиной |
| Age | Возраст клиента на момент получения предложение о возвращении к сотрудничеству с фирмой |
| Lambda (\(\lambda\)) | Рассчитанное обратное отношение Миллса из модели повторного привлечения клиента |
Когда авторы оценивали второй этап модели, они получили следующие оценки параметров второго из двух уравнений (оценки параметров для модели повторного привлечения подробно описаны в первой части этого примера):
# Fit Linear Regression Model for Second Duration by Authors
# https://stats.idre.ucla.edu/sas/webbooks/reg/
# SAS Code: imr_win = (pdf(’Normal’,xb_probit))/(probnorm(xb_probit));
xbeta <- predict(Ch07.reacq, newdata = customerWinBack, type = "link")
customerWinBack <- customerWinBack %>%
mutate(imr_win = dnorm(xbeta) / pnorm(xbeta)) # Cumulative normal pdf
(Ch07.2Dur <- lm(duration_2 ~ duration_1 + offer + duration_lapse + price_change + gender + age + imr_win,
data = filter(customerWinBack, reacquire == 1) )) %>%
summary##
## Call:
## lm(formula = duration_2 ~ duration_1 + offer + duration_lapse +
## price_change + gender + age + imr_win, data = filter(customerWinBack,
## reacquire == 1))
##
## Residuals:
## Min 1Q Median 3Q Max
## -75.14 -20.06 2.23 20.01 81.61
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 152.63874 13.37634 11.411 < 2e-16 ***
## duration_1 1.21242 0.01111 109.177 < 2e-16 ***
## offer 2.35052 0.45184 5.202 3.75e-07 ***
## duration_lapse -0.97247 0.05380 -18.077 < 2e-16 ***
## price_change -7.83839 0.11605 -67.544 < 2e-16 ***
## gender 10.33492 3.66215 2.822 0.00510 **
## age -2.50635 0.12703 -19.731 < 2e-16 ***
## imr_win 19.13685 6.82265 2.805 0.00538 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 29.58 on 287 degrees of freedom
## Multiple R-squared: 0.9905, Adjusted R-squared: 0.9902
## F-statistic: 4265 on 7 and 287 DF, p-value: < 2.2e-16
writeLines("Variance Inflation Factors - if vif() > 2 - feature has multicollinearity with others")## Variance Inflation Factors - if vif() > 2 - feature has multicollinearity with others
car::vif(Ch07.2Dur) # Variance Inflation Factors - if vif() > 2 - feature has multicollinearity ## duration_1 offer duration_lapse price_change gender age imr_win
## 2.258689 1.292271 1.577023 1.001950 1.106526 1.127765 2.117181
Как видно из результатов второй авторской модели коэффициент \(\lambda\), т.е. imr_win является положительным и значительным. Это означает, что существует потенциальная проблема смещения выбора, поскольку коэффициент ошибки нашего уравнения выбора положительно коррелирует с погрешностью авторского уравнения линейной регрессии. Также видно, что все другие предикторы модели Duration_2 значитимы, что означает, что мы, вероятно, обнаружены многие из драйверов вторичной продолжительности.
Коэффициент Duration_1 является положительным, предполагается, что чем дольше срок жизни клиента с фирмой, тем дольше будет вторая жизнь, которую клиент будет продолжать с фирмой. Мы считаем, что Offer является положительным, предполагая, что чем выше сумма предложения (т. е. чем больше стимул), тем дольше будет вторичная продолжительность жизни. Авторы нашли, что чем дольше времени, клиент провел после первого сотрудничества с фирмой (Duration_lapse), тем короче вторичная продолжительность жизни с фирмой. Обнаруживается, что когда цена, которую клиент платит за продукт во втором цикле жизни, ниже, чем в первом (Price_Change < 0), то вторичная продолжительность жизни клиента больше. Наконец, становится известным, что у клиентов мужского пола или у более молодых клиентов больше шансов иметь более продолжительный вторую цикл, чем у женщин или пожилых клиентов.
Следующий шаг - предсказать значение Duration_2, чтобы увидеть, насколько хорошо наша модель сравнивается с фактическими значениями. Делается это начиная с уравнения ожидаемой продолжительности в начале этого примера:
\[ \displaystyle \large E(Duration \text _ 2) = P(Reacquisition = 1) * E(Duration \text _ 2 | Reacquisition = 1) = Ф(X' \beta) * \gamma' \alpha + \mu \lambda. \hspace{.5 in} [5]\] В этом случае \(Ф\) является кумулятивной функция вероятности нормального распределения;
\(X\) является матрицей независимых значений переменных из уравнения Reacquisition;
\(\beta\) - вектор коэффициентов предикторов из уравнения Reacquisition;
\(\gamma\) - матрица предикторов из уравнения Duration_2;
\(\alpha\) - вектор коэффициентов предикторов из уравнения Duration_2;
\(\mu\) - коэффициент для обратного отношения Миллса;
\(\lambda\) - обратное отношение Миллса.
# Computing the Mean Absolute Deviation (MAD) and Mean Absolute Percent Error (MAPE)
# SAS Code: pred_dur2 = probnorm(xb_probit)*(xbeta_duration2);
with(filter(customerWinBack, reacquire == 1), {
pred_dur2 <- pnorm(xbeta[ifelse(customerWinBack$reacquire == 1, TRUE, FALSE)]) *
predict(Ch07.2Dur, newdata = filter(customerWinBack, reacquire == 1))
# mad = mean(abs(abs(duration_2 - pred_dur2));
writeLines(sprintf("Mean Absolute Deviation (MAD): %.2f дней", mean(abs(duration_2 - pred_dur2))))
# mape = mean(abs(duration_2 - pred_dur2)/duration_2);
writeLines(sprintf("Mean Absolute Percent Error (MAPE): %.3f %% \n", mean(abs(duration_2 - pred_dur2) /
duration_2) * 100))
})## Mean Absolute Deviation (MAD): 62.71 дней
## Mean Absolute Percent Error (MAPE): 14.990 %
with(customerWinBack, {
writeLines(sprintf("Mean `Duration_2` for Naive Model: %.2f дней \n", mean(duration_2)))
# mad1 = mean(abs(duration_2 - mean(duration_2));
mad1 <- mean(abs(duration_2 - mean(duration_2)))
writeLines(sprintf("Naive Mean Absolute Deviation (MAD1): %.2f дней", mad1))
# mape1 = mean(abs(duration_2 - mean(duration_2))/duration_2);
mape1 <- mean(abs(duration_2 - mean(duration_2)) / duration_2) * 100
writeLines(sprintf("Naive Mean Absolute Percent Error (MAPE1): %.3f %%", mape1))
})## Mean `Duration_2` for Naive Model: 394.61 дней
##
## Naive Mean Absolute Deviation (MAD1): 353.01 дней
## Naive Mean Absolute Percent Error (MAPE1): Inf %
Авторы проверя точность второй модели рассчитывают по клиентам, что откливнулдись на призыв к возвращению, но пишут в книге, что для всех клиентов, что MAD = 62.71. Это означает, что в среднем каждое из авторских прогнозов Duration_2 отклоняется от фактического значения примерно на 63 дней. Если бы вместо этого использовали среднее значение Duration_2 (394.61) дней уже точно для всех клиентов как наивное предсказание для всех вторых сроков жизни, то обнаружилось бы, что MAD1 около 353 дней. Очевидно, авторская модель значительно улучшает работу по прогнозированию продолжительности взаимоотношений с клиентами, чем по наивной модели.
Благодаря этой двухэтапной модели менеджмент может точнее прогнозировать продолжительность сотрудничества с возвращенными клиентов, что существенно улучшает аккуратность планирования доходов от поступлений “старых” потребителей. При этом руководство может четко представлять драйверы, которые влияют на продолжительность второго цикла жизни повторно привлеченных клиентов.
Третий этап этого процесса - оценить модель вторичного CLV. Цель этой модели - понять драйверы, которые описывают ожидаемое значение стоимости жизни клиента на втором цикле сотрудничества с фирмой. Таким образом, уравнение принимает следующий формат:
\[ \displaystyle \large E(SCLV) = P(Reacquisition = 1) * E(SCLV | Reacquisition = 1, E( Duration \text _ 2 )). \hspace{.5 in} [6] \]
Это уравнение показывает, что ожидаемый SCLV является функцией вероятности того, что клиент будет восстановлен, умноженный на ожидаемое значение SCLV, учитывая, что клиент был привлечен повторно и оценка вторичной продолжительности отношений клиента с фирмой. Опять же, если бы просто выполнять регрессию с SCLV в качестве зависимой переменной и игнорировали вероятность того, что клиент будет повторно приобретен и оцененная вторичная продолжительность, то можно получить смещенные оценки из-за возможного смещения выборки.
Наконец, авторы сформировали регрессионную модель для SCLV и решили оценить ее включая переменные \(\lambda\) и \(E( Duration \text _ 2 )\) в качестве дополнительных независимых переменных. Это делается простым способом, используя следующее уравнение:
\[ \displaystyle \large SCLV = \gamma' \alpha + \mu \lambda + \rho Durâtion \text _ 2 + \varepsilon. \hspace{.5 in} [7] \]
В этом случае SCLV - это значениеCLV второго цикла жизни;
\(\gamma\) - матрица переменных, используемых для объяснения значения SCLV;
\(\alpha\) - коэффициенты для независимых переменных (предикторов);
\(\mu\) - коэффициент обратного отношения Миллса;
\(\lambda\) - обратное отношение Миллса;
\(\rho\) - коэффициент ожидаемой вторичной продолжительности жизни клиента;
Duration_2 - ожидаемая вторичная длительность жизни клиента;
\(\varepsilon\) - случайная ошибка модели.
Таким образом, для этого примера мы будем использовать следующий список переменных:
| Переменные | Описание |
|---|---|
| Зависимая переменная | |
| SCLV | Прогноз ценности клиента на втором цикле жизни. Это 0, если клиента не зашел вновь |
| Предикторы | |
| Duration_1 | Время в днях, когда клиент оставался активным на первом цикле сотрудничества с фирмой |
| Offer | Стоимость предложения, предоставленного клиенту для повторного привлечения |
| Duration_lapse | Время в днях, между тем как клиент ушел в отток и затем получив предложение о возвращении |
| Gender | 1, если клиент является мужчиной, 0, если клиент является женщиной |
| Age | Возраст клиента на момент получения предложение о возвращении к сотрудничеству с фирмой |
| Lambda (\(\lambda\)) | Рассчитанное обратное отношение Миллса из модели повторного привлечения клиента |
| Duration_2 | Время в днях, когда клиент стал вторично активным или продолжает быть клиентом |
Когда авторы оценивали третий этап модели возвращения клиентов, они получили следующие оценки параметров (оценки параметров для модели повторного привлечения подробно описаны в первой части этого примера, а оценки параметров модели вторичной длительности подробно описаны во второй части):
# Fit Linear Regression Model for SCLV by Authors
# https://stats.idre.ucla.edu/sas/webbooks/reg/
# SAS Code: pred_dur2 = probnorm(xb_probit)*(xbeta_duration2);
pred_dur2 <- pnorm(xbeta[ifelse(customerWinBack$reacquire == 1, TRUE, FALSE)]) *
predict(Ch07.2Dur, newdata = filter(customerWinBack, reacquire == 1))
(Ch07.SCLV <- lm(sclv ~ duration_1 + offer + price_change + gender + age + imr_win + pred_dur2,
data = filter(customerWinBack, reacquire == 1) )) %>%
summary##
## Call:
## lm(formula = sclv ~ duration_1 + offer + price_change + gender +
## age + imr_win + pred_dur2, data = filter(customerWinBack,
## reacquire == 1))
##
## Residuals:
## Min 1Q Median 3Q Max
## -143.638 -39.299 1.413 39.844 156.566
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 337.81741 27.50274 12.283 < 2e-16 ***
## duration_1 0.93246 0.06007 15.522 < 2e-16 ***
## offer 1.62478 0.80850 2.010 0.0454 *
## price_change -7.73026 0.44233 -17.476 < 2e-16 ***
## gender 14.15861 7.01455 2.018 0.0445 *
## age -2.15523 0.25375 -8.493 1.10e-15 ***
## imr_win 124.05402 18.40360 6.741 8.64e-11 ***
## pred_dur2 0.70136 0.05459 12.847 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 56.52 on 287 degrees of freedom
## Multiple R-squared: 0.9851, Adjusted R-squared: 0.9848
## F-statistic: 2715 on 7 and 287 DF, p-value: < 2.2e-16
writeLines("Variance Inflation Factors - if vif() > 2 - feature has multicollinearity with others")## Variance Inflation Factors - if vif() > 2 - feature has multicollinearity with others
car::vif(Ch07.SCLV) # Variance Inflation Factors - if vif() > 2 - feature has multicollinearity ## duration_1 offer price_change gender age imr_win pred_dur2
## 18.100500 1.133125 3.986301 1.111758 1.232481 4.218712 31.512522
Авторы получают вышеуказанные результаты. Очевидно, что \(\lambda\) (pred_dur2) является положительным и значимым. Это означает, что существует потенциальная проблема смещения выбора, поскольку коэффициент ошибки нашего уравнения выбора положительно коррелирует с погрешностью нашего уравнения регрессии. Также видно, что все другие предикторы модели SCLV являются значимыми, что означает, что мы, вероятно, обнаружили многие из драйверов вторичного жизненного цикла клиента.
При этом Duration_1 является положительным, поэтому можно предположить, что чем дольше длительность первого цикла, тем выше ожидаемый размер SCLV. Из модели видно, что чем выше Offer, предоставляемый клиенту для повторного привлечения, тем выше ожидаемый SCLV. Мы находим, что когда цена, которую клиент платит за продукт во втором периоде жизни, ниже (Price_Change < 0), то SCLV выше. Обнаруживается, что клиенты, которые являются мужчинами или молодыми, с большей вероятностью имеют более высокий SCLV. Наконец, мы находим, что коэффициент ожидаемой вторичной продолжительности - положительный, что предполагает, что клиенты, которые возвратились к сотрудничеству во второй раз, более склонны к принесению значительной прибыли.
Следующий шаг - предсказать значение SCLV, чтобы увидеть, насколько хорошо авторская модель сравнивается с фактическими значениями. Это делается, начиная с уравнений для ожидаемого SCLV в начале этого примера:
\[ \displaystyle \large E(SCLV) = P(Reacquisition = 1) * E(SCLV | Reacquisition = 1, E( Duration \text _ 2 )) = Ф(X' \beta) * \gamma' \alpha + \mu \lambda + \rho Durâtion \text _ 2 + \varepsilon . \hspace{.5 in} [7] \]
# Computing the Mean Absolute Deviation (MAD) and Mean Absolute Percent Error (MAPE)
# SAS Code: pred_sclv = probnorm(xb_probit)*(xbeta_sclv);
with(filter(customerWinBack, reacquire == 1), {
pred_sclv <- pnorm(xbeta[ifelse(customerWinBack$reacquire == 1, TRUE, FALSE)]) *
predict(Ch07.SCLV, newdata = filter(customerWinBack, reacquire == 1))
# mad = mean(abs(abs(sclv - pred_sclv));
writeLines(sprintf("Mean Absolute Deviation (MAD): %.2f долл.", mean(abs(sclv - pred_sclv))))
# mape = mean(abs(sclv - pred_sclv)/sclv);
writeLines(sprintf("Mean Absolute Percent Error (MAPE): %.3f %% \n", mean(abs(sclv - pred_sclv) /
sclv) * 100))
})## Mean Absolute Deviation (MAD): 126.30 долл.
## Mean Absolute Percent Error (MAPE): 14.112 %
with(customerWinBack, {
writeLines(sprintf("Mean `SCLV` for Naive Model: %.2f долл. \n", mean(sclv)))
# mad1 = mean(abs(sclv - mean(sclv));
mad1 <- mean(abs(sclv - mean(sclv)))
writeLines(sprintf("Naive Mean Absolute Deviation (MAD1): %.2f долл.", mad1))
# mape1 = mean(abs(sclv - mean(sclv))/sclv);
mape1 <- mean(abs(sclv - mean(sclv)) / sclv) * 100
writeLines(sprintf("Naive Mean Absolute Percent Error (MAPE1): %.3f %%", mape1))
})## Mean `SCLV` for Naive Model: 730.15 долл.
##
## Naive Mean Absolute Deviation (MAD1): 630.23 долл.
## Naive Mean Absolute Percent Error (MAPE1): -6003.211 %
В R авторская модель по клиентам, откливнувшимся на кампанию Winback получила среднюю абсолютную ошибку 126.30 долл. (хотя авторы написали, что это относится ко всем клиентам, но ведь сама авторская модель строилась на фильтре данных reacquire == 1) . Это означает, что в среднем каждое из авторских предсказаний значения SCLV отклоняется от фактического значения примерно на 126 долл. Если бы авторы вместо своей модели использовали среднее значение SCLV (730.15 долл.) для всех клиентов в качестве наивного прогноза, то обнаружилась бы, что MAD = 630.23 долл.. Очевидно, что авторская регрессионая модель значительно улучшает работу по предсказанию ожидаемой прибыли клиентов, чем к наивная.
devtools::session_info()## Session info ----------------------------------------------------------------------------------------------------------
## setting value
## version R version 3.5.0 (2018-04-23)
## system x86_64, mingw32
## ui RTerm
## language (EN)
## collate Russian_Russia.1251
## tz Asia/Dhaka
## date 2018-07-20
## Packages --------------------------------------------------------------------------------------------------------------
## package * version date source
## abind 1.4-5 2016-07-21 CRAN (R 3.5.0)
## arm 1.10-1 2018-04-13 CRAN (R 3.5.0)
## assertthat 0.2.0 2017-04-11 CRAN (R 3.5.0)
## backports 1.1.2 2017-12-13 CRAN (R 3.5.0)
## base * 3.5.0 2018-04-23 local
## bindr 0.1.1 2018-03-13 CRAN (R 3.5.0)
## bindrcpp * 0.2.2 2018-03-29 CRAN (R 3.5.0)
## broom 0.4.4 2018-03-29 CRAN (R 3.5.0)
## car * 3.0-0 2018-04-02 CRAN (R 3.5.0)
## carData * 3.0-1 2018-03-28 CRAN (R 3.5.0)
## caret * 6.0-79 2018-03-29 CRAN (R 3.5.0)
## cellranger 1.1.0 2016-07-27 CRAN (R 3.5.0)
## class 7.3-14 2015-08-30 CRAN (R 3.5.0)
## cli 1.0.0 2017-11-05 CRAN (R 3.5.0)
## coda 0.19-1 2016-12-08 CRAN (R 3.5.0)
## codetools 0.2-15 2016-10-05 CRAN (R 3.5.0)
## colorspace 1.3-2 2016-12-14 CRAN (R 3.5.0)
## compiler 3.5.0 2018-04-23 local
## crayon 1.3.4 2017-09-16 CRAN (R 3.5.0)
## curl 3.2 2018-03-28 CRAN (R 3.5.0)
## CVST 0.2-1 2013-12-10 CRAN (R 3.5.0)
## data.table 1.11.2 2018-05-08 CRAN (R 3.5.0)
## datasets * 3.5.0 2018-04-23 local
## ddalpha 1.3.3 2018-04-30 CRAN (R 3.5.0)
## DEoptimR 1.0-8 2016-11-19 CRAN (R 3.5.0)
## devtools 1.13.5 2018-02-18 CRAN (R 3.5.0)
## digest 0.6.15 2018-01-28 CRAN (R 3.5.0)
## dimRed 0.1.0 2017-05-04 CRAN (R 3.5.0)
## dplyr * 0.7.5 2018-05-19 CRAN (R 3.5.0)
## DRR 0.0.3 2018-01-06 CRAN (R 3.5.0)
## e1071 1.6-8 2017-02-02 CRAN (R 3.5.0)
## evaluate 0.10.1 2017-06-24 CRAN (R 3.5.0)
## forcats * 0.3.0 2018-02-19 CRAN (R 3.5.0)
## foreach 1.4.4 2017-12-12 CRAN (R 3.5.0)
## foreign 0.8-70 2017-11-28 CRAN (R 3.5.0)
## geometry 0.3-6 2015-09-09 CRAN (R 3.5.0)
## GGally 1.4.0 2018-05-17 CRAN (R 3.5.0)
## ggplot2 * 2.2.1 2016-12-30 CRAN (R 3.5.0)
## glue 1.2.0 2017-10-29 CRAN (R 3.5.0)
## gower 0.1.2 2017-02-23 CRAN (R 3.5.0)
## graphics * 3.5.0 2018-04-23 local
## grDevices * 3.5.0 2018-04-23 local
## grid 3.5.0 2018-04-23 local
## gtable 0.2.0 2016-02-26 CRAN (R 3.5.0)
## haven 1.1.1 2018-01-18 CRAN (R 3.5.0)
## hms 0.4.2 2018-03-10 CRAN (R 3.5.0)
## htmltools 0.3.6 2017-04-28 CRAN (R 3.5.0)
## httr 1.3.1 2017-08-20 CRAN (R 3.5.0)
## ipred 0.9-6 2017-03-01 CRAN (R 3.5.0)
## iterators 1.0.9 2017-12-12 CRAN (R 3.5.0)
## jsonlite 1.5 2017-06-01 CRAN (R 3.5.0)
## kernlab 0.9-26 2018-04-30 CRAN (R 3.5.0)
## knitr 1.20 2018-02-20 CRAN (R 3.5.0)
## labeling 0.3 2014-08-23 CRAN (R 3.5.0)
## lattice * 0.20-35 2017-03-25 CRAN (R 3.5.0)
## lava 1.6.1 2018-03-28 CRAN (R 3.5.0)
## lazyeval 0.2.1 2017-10-29 CRAN (R 3.5.0)
## lme4 1.1-17 2018-04-03 CRAN (R 3.5.0)
## lubridate 1.7.4 2018-04-11 CRAN (R 3.5.0)
## magic 1.5-8 2018-01-26 CRAN (R 3.5.0)
## magrittr 1.5 2014-11-22 CRAN (R 3.5.0)
## MASS 7.3-49 2018-02-23 CRAN (R 3.5.0)
## Matrix 1.2-14 2018-04-13 CRAN (R 3.5.0)
## memoise 1.1.0 2017-04-21 CRAN (R 3.5.0)
## methods * 3.5.0 2018-04-23 local
## minqa 1.2.4 2014-10-09 CRAN (R 3.5.0)
## mnormt 1.5-5 2016-10-15 CRAN (R 3.5.0)
## ModelMetrics 1.1.0 2016-08-26 CRAN (R 3.5.0)
## modelr 0.1.2 2018-05-11 CRAN (R 3.5.0)
## munsell 0.4.3 2016-02-13 CRAN (R 3.5.0)
## nlme 3.1-137 2018-04-07 CRAN (R 3.5.0)
## nloptr 1.0.4 2017-08-22 CRAN (R 3.5.0)
## nnet 7.3-12 2016-02-02 CRAN (R 3.5.0)
## openxlsx 4.0.17 2017-03-23 CRAN (R 3.5.0)
## parallel 3.5.0 2018-04-23 local
## pillar 1.2.2 2018-04-26 CRAN (R 3.5.0)
## pkgconfig 2.0.1 2017-03-21 CRAN (R 3.5.0)
## plyr 1.8.4 2016-06-08 CRAN (R 3.5.0)
## prodlim 2018.04.18 2018-04-18 CRAN (R 3.5.0)
## psych 1.8.4 2018-05-06 CRAN (R 3.5.0)
## purrr * 0.2.4 2017-10-18 CRAN (R 3.5.0)
## R6 2.2.2 2017-06-17 CRAN (R 3.5.0)
## RColorBrewer 1.1-2 2014-12-07 CRAN (R 3.5.0)
## Rcpp 0.12.17 2018-05-18 CRAN (R 3.5.0)
## RcppRoll 0.2.2 2015-04-05 CRAN (R 3.5.0)
## readr * 1.1.1 2017-05-16 CRAN (R 3.5.0)
## readxl 1.1.0 2018-04-20 CRAN (R 3.5.0)
## recipes 0.1.2 2018-01-11 CRAN (R 3.5.0)
## reshape 0.8.7 2017-08-06 CRAN (R 3.5.0)
## reshape2 1.4.3 2017-12-11 CRAN (R 3.5.0)
## rio 0.5.10 2018-03-29 CRAN (R 3.5.0)
## rlang 0.2.0 2018-02-20 CRAN (R 3.5.0)
## rmarkdown 1.9 2018-03-01 CRAN (R 3.5.0)
## robustbase 0.93-0 2018-04-24 CRAN (R 3.5.0)
## rpart 4.1-13 2018-02-23 CRAN (R 3.5.0)
## rprojroot 1.3-2 2018-01-03 CRAN (R 3.5.0)
## rstudioapi 0.7 2017-09-07 CRAN (R 3.5.0)
## rvest 0.3.2 2016-06-17 CRAN (R 3.5.0)
## scales 0.5.0 2017-08-24 CRAN (R 3.5.0)
## sfsmisc 1.1-2 2018-03-05 CRAN (R 3.5.0)
## splines 3.5.0 2018-04-23 local
## stats * 3.5.0 2018-04-23 local
## stats4 3.5.0 2018-04-23 local
## stringi 1.1.7 2018-03-12 CRAN (R 3.5.0)
## stringr * 1.3.1 2018-05-10 CRAN (R 3.5.0)
## survival 2.41-3 2017-04-04 CRAN (R 3.5.0)
## tibble * 1.4.2 2018-01-22 CRAN (R 3.5.0)
## tidyr * 0.8.1 2018-05-18 CRAN (R 3.5.0)
## tidyselect 0.2.4 2018-02-26 CRAN (R 3.5.0)
## tidyverse * 1.2.1 2017-11-14 CRAN (R 3.5.0)
## timeDate 3043.102 2018-02-21 CRAN (R 3.5.0)
## tools 3.5.0 2018-04-23 local
## utils * 3.5.0 2018-04-23 local
## withr 2.1.2 2018-03-15 CRAN (R 3.5.0)
## xml2 1.2.0 2018-01-24 CRAN (R 3.5.0)
## yaml 2.1.19 2018-05-01 CRAN (R 3.5.0)
Цель этой главы состояла в том, чтобы изучить текущие модели возвращения клиентов и представить эмпирический пример того, как фирмы могут применять эти знания на своих клиентских базах данных. Авторы показали, что, когда фирмы могут сначала понять движущие силы возвращения клиентов, продолжительность обслуживания клиентов в течение второго цикла и рентабельность клиентов второго цикла, фирмы могут более взвешенно принимать стратегические решения о том, какие клиенты попытаются вернуться и какой уровень предложений предлагать, чтобы предоставить от этих клиентам максимальную рентабельность фирме.