Keywords: Kundenabwanderungsrate, Churn Rate, Prognose Kundenbindung, Berechnung Abwanderungsquote, Statistik Beratung, Data Science
Die folgende Prognose basiert auf dem Aufsatz “How to project customer retention”. Es geht um die Kundenbindung bei Vertragskunden. Im Aufsatz wird ein mathematisches Model erstellt, welcher auf folgende Annahmen beruht:
Jeder Kunde verlängert am Ende eines Jahres seinen Vertrag mit einer bestimmten Wahrscheinlichkeit \(\phi\).
Die Wahrscheinlichkeit \(\phi\), mit der ein Kunde seinen Vertrag verlängert, ändert sich nicht mit der Zeit.
Zwei unterschiedliche Kunden haben womöglich unterschiedliche Wahrscheinlichkeiten \(\phi_1, \phi_2\) mit der sie Ihren Vertrag verlängern.
Das Modell welches im Aufsatz vorgeschlagen wird ist ein sogenanntes parametrisches Modell. Es hat zwei Parameter \(\alpha,\beta\) welche es gilt anhand der Daten zu schätzen. Dazu verwenden die Autoren die folgende Zielfunktion: \[LL(\alpha,\beta | \text{data}) = \sum_{t=1}^{t_f} n_t \ln [P(T=t | \alpha,\beta)] + (n-\sum_{t=1}^{t_f} n_t) \ln [S(t_{f} | \alpha,\beta)]\] Hierbei ist
Die einzelnen Wahrscheinlichkeiten lassen sich nach dem obigen Aufsatz berechnen zu: \[P(T=t) = \begin{cases} \frac{\alpha}{\alpha + \beta}, & \mbox{falls } t=1 \\ \frac{\beta+t-2}{\alpha+\beta+t-1}, & \mbox{falls } t>1 \end{cases}\] und \[S(t | \alpha, \beta) = \begin{cases} 1-P(T=1 | \alpha, \beta), & \mbox{falls } t=1 \\ S(t-1) - P(T=t | \alpha,\beta), & \mbox{falls } t>1 \end{cases}\]
Hiermit können wir in R die Wahrscheinlichkeiten berechnen. Die Funktion churnBG berechenet \(P(T=t|\alpha,\beta)\) während die Funktion survivalBG die Wahrscheinlichkeit \(S(t|\alpha,\beta)\) berechnet.
Wir lesen die Daten ein aus der Datei kundenbindung.csv und schauen uns die ersten Datensätze an. Die Kunden sind in unterschiedliche Gruppen aufgeteilt (Kundengruppe A, Kundengruppe B). In der Praxis würde man die Kunden nach anderen Kriterien, zum Beispiel nach Vertrieb, aufteilen und darauf die Prognose aufbauen.
kb <- read.csv("kundenbindung.csv",header=TRUE,sep=";")
head(kb);
## Kundengruppe Jahr AnzahlAktiv AnzahlGekuendigt
## 1 A 2006 961313 562162
## 2 A 2007 712986 248327
## 3 A 2008 581967 131019
## 4 A 2009 496653 85314
## 5 A 2010 440284 56369
## 6 A 2011 399150 41134
# Prognose fuer Kundengruppe A
activeCust = kb$AnzahlAktiv[kb$Kundengruppe=="A"];
lostCust = kb$AnzahlGekuendigt[kb$Kundengruppe=="A"];
opt = optim(c(1,1),MLL);
alpha <- opt$par[1];
beta <- opt$par[2];
n <- activeCust[1]+lostCust[1];
T <- 20;
prognoseJahre <- seq(0,(T-1))+2006;
prognoseA <- round(n*survivalBG(alpha,beta,(1:T)));
# Prognose fuer Kundengruppe B
activeCust = kb$AnzahlAktiv[kb$Kundengruppe=="B"];
lostCust = kb$AnzahlGekuendigt[kb$Kundengruppe=="B"];
opt = optim(c(1,1),MLL);
alpha <- opt$par[1];
beta <- opt$par[2];
n <- activeCust[1]+lostCust[1];
prognoseB <- round(n*survivalBG(alpha,beta,(1:T)));
# plot
# Kundengruppe A
plot(prognoseJahre,prognoseA,type="b",col="green",main="Prognose Kundenbindung", sub="Schwarz=Anzahl aktiver Kunden (Kundengruppe A), Grün=Prognose", xlab="Jahr", ylab="Anzahl aktiver Kunden");
lines(kb$Jahr[kb$Kundengruppe=="A"],kb$AnzahlAktiv[kb$Kundengruppe=="A"],type="b",col="black");
abline(v=2017, col="black",lty="dashed");
kA <- kb$AnzahlAktiv[kb$Kundengruppe=="A"];
pA <- prognoseA[prognoseJahre<=2017];
dA <- data.frame(prognoseJahre[prognoseJahre<=2017],kA,pA, abs(kA-pA)/kA*100.0);
names(dA) <- c("jahr","aktiveKundenA","prognoseA","relativerFehlerInProzent");
print(dA);
## jahr aktiveKundenA prognoseA relativerFehlerInProzent
## 1 2006 961313 954277 0.7319156
## 2 2007 712986 722103 1.2787067
## 3 2008 581967 591849 1.6980344
## 4 2009 496653 507027 2.0887823
## 5 2010 440284 446746 1.4676890
## 6 2011 399150 401367 0.5554303
## 7 2012 367157 365780 0.3750439
## 8 2013 339735 337006 0.8032731
## 9 2014 315359 313182 0.6903244
## 10 2015 295554 293080 0.8370721
## 11 2016 278796 275853 1.0556106
## 12 2017 263561 260899 1.0100129
# Kundengruppe B
plot(prognoseJahre,prognoseB,type="b",col="green",main="Prognose Kundenbindung", sub="Schwarz=Anzahl aktiver Kunden (Kundengruppe B), Grün=Prognose", xlab="Jahr", ylab="Anzahl aktiver Kunden")
lines(kb$Jahr[kb$Kundengruppe=="B"],kb$AnzahlAktiv[kb$Kundengruppe=="B"],type="b",col="black")
abline(v=2017, col="black",lty="dashed")
kB <- kb$AnzahlAktiv[kb$Kundengruppe=="B"]
pB <- prognoseB[prognoseJahre<=2017]
dB <- data.frame(prognoseJahre[prognoseJahre<=2017],kB,pB, abs(kB-pB)/kB*100.0)
names(dB) <- c("jahr","aktiveKundenB","prognoseB","relativerFehlerInProzent")
print(dB)
## jahr aktiveKundenB prognoseB relativerFehlerInProzent
## 1 2006 806830 787379 2.4107929
## 2 2007 689844 692046 0.3192026
## 3 2008 606283 622406 2.6593192
## 4 2009 550576 568822 3.3139839
## 5 2010 511580 526033 2.8251691
## 6 2011 480013 490898 2.2676469
## 7 2012 455873 461414 1.2154701
## 8 2013 434518 436239 0.3960710
## 9 2014 413164 414434 0.3073840
## 10 2015 396452 395322 0.2850282
## 11 2016 379739 378400 0.3526106
## 12 2017 365812 363289 0.6896985
Man sieht in beiden Kundengruppen, dass die Prognose sehr gut ist (relativer Fehler <3%). Diese Methode kann immer dann angewendet werden, wenn man die Anzahl der aktiven und gekündigten Vertragskunden in den einzelnen Jahren kennt. Die Autoren bemerken, dass bei der typischen Berechnung der Churn-Rate nicht die Heterogenität in den Kunden nicht berücksichtigt wird. D.h. es wird angenommen, dass jeder Kunde mit der gleichen Wahrscheinlichkeit kündigen / seinen Vertrag verlängern wird. Diese Annahme führt jedoch zu schwachen Prognosen, wie die Autoren bemerken.