Weiter zum Inhalt

Customer Lifetime Value

In diesem Tutorial lernst du, wie du den Customer Lifetime Value in Python berechnest.
Aktualisiert 18. Sept. 2026  · 11 Min. lesen

Mit KI erkunden

ChatGPTClaudePerplexity

Der italienische Ökonom Vilfredo Pareto stellte fest, dass 80% der Wirkung aus 20% der Ursachen stammen – bekannt als 80/20-Regel oder Pareto-Prinzip. Ähnlich verhält es sich im Business: 80% des Umsatzes kommen oft von 20% der Kundschaft. Unternehmen müssen diese Top-Kundinnen und -Kunden identifizieren und die Beziehung pflegen, um kontinuierliche Einnahmen zu sichern. Um langfristige Kundenbeziehungen aufzubauen, sollten Programme zur Kundenbindung geplant werden, etwa Rabatte, Angebote, Coupons, Bonuspunkte und Geschenke.

Neue Kundschaft zu gewinnen ist teurer, als bestehende zu halten, denn du musst weniger Ressourcen, Zeit und Aufwand investieren. Es gilt vor allem, bestehende Kundinnen und Kunden zufrieden zu stellen. Business-Analysten berechnen die Akquisitionskosten präzise mithilfe des CLTV (Customer Lifetime Value). Der CLTV zeigt den gesamten Umsatz, der während der gesamten Kundenbeziehung erzielt wird. Er hilft Unternehmen, sich auf diejenigen Kundensegmente zu konzentrieren, die künftig den meisten Umsatz bringen können.

Customer Lifetime Value (CLTV)

"Customer Lifetime Value ist ein Geldwert, der den Umsatz oder Gewinn repräsentiert, den eine Kundin oder ein Kunde dem Unternehmen über die gesamte Dauer der Beziehung bringt." CLTV macht den Unterschied zwischen langfristig und kurzfristig gebundenen Kundinnen und Kunden sichtbar. Der Customer Lifetime Value (CLV) hilft dir, die wichtigsten Vertriebsfragen in jedem Unternehmen zu beantworten:

  • Wie identifiziere ich die profitabelsten Kundinnen und Kunden?
  • Wie kann ein Unternehmen das beste Angebot machen und den höchsten Ertrag erzielen?
  • Wie segmentiere ich profitable Kundensegmente?
  • Wie viel Budget sollte in die Neukundengewinnung fließen?

Customer Lifetime Value berechnen

Es gibt viele Ansätze, um den CLTV zu berechnen. Jede Person hat dazu ihre eigene Sicht. Für die Berechnung benötigen wir historische Kundendaten – für neue Kundinnen und Kunden ist das zunächst nicht möglich. Um dieses Problem zu lösen, entwickeln Business-Analysten Machine-Learning-Modelle, die den CLTV für Neukundschaft vorhersagen. Lass uns ein paar Ansätze anschauen:

1) Du kannst den CLTV berechnen, indem du den Gewinn/Umsatz je Kundin bzw. Kunde über einen definierten Zeitraum aufsummierst. Beispiel: Wenn die Kundin seit 3 Jahren bei dir kauft, summierst du die Gewinne dieser 3 Jahre. Du kannst den Gewinn jährlich, halbjährlich oder monatlich mitteln. Mit diesem Ansatz lässt sich jedoch kein Vorhersagemodell für neue Kundinnen und Kunden bauen.

2) Baue ein Regressionsmodell für bestehende Kundschaft. Nutze die jüngsten sechs Monate als unabhängige Variablen und den Gesamtumsatz über drei Jahre als abhängige Variable und trainiere darauf ein Regressionsmodell.

3) CLTV lässt sich auch über RFM-Werte (Recency, Frequency, Monetary) implementieren. Mehr dazu findest du in meinem Tutorial.

4) Über folgende Gleichung: CLTV = ((Durchschnittlicher Bestellwert × Kaufhäufigkeit)/Churn-Rate) × Gewinnmarge.

      Customer Value = Average Order Value * Purchase Frequency
  • Average Order Value (AOV): Der durchschnittliche Bestellwert ist das Verhältnis aus Gesamtumsatz und Gesamtanzahl der Bestellungen. Er zeigt, wie viel Umsatz im Mittel pro Bestellung erzielt wird.

                         Average Order Value = Total Revenue / Total Number of Orders
    
  • Purchase Frequency (PF): Die Kaufhäufigkeit ist das Verhältnis aus Gesamtanzahl der Bestellungen und Gesamtanzahl der Kundinnen und Kunden. Sie zeigt, wie viele Bestellungen eine Person im Schnitt tätigt.

                        Purchase Frequency =  Total Number of Orders / Total Number of Customers
    
  • Churn-Rate: Der Anteil der Kundinnen und Kunden, die nicht erneut bestellen.

  • Kundenlebensdauer: Der Zeitraum, in dem eine Kundin oder ein Kunde kontinuierlich bestellt.

                                  Customer Lifetime=1/Churn Rate
    
  • Repeat-Rate: Das Verhältnis aus der Anzahl der Kundinnen und Kunden mit mehr als einer Bestellung zur Zahl der einzigartigen Kundinnen und Kunden. Beispiel: Wenn du in einem Monat 10 Kundinnen/Kunden hast und 4 davon zurückkommen, beträgt deine Repeat-Rate 40%.

                                   Churn Rate= 1-Repeat Rate
    

CLTV-Implementierung in Python (mit Formel)

Erforderliche Bibliotheken importieren

#import modules
import pandas as pd # for dataframes
import matplotlib.pyplot as plt # for plotting graphs
import seaborn as sns # for plotting graphs
import datetime as dt
import numpy as np

Datensatz laden

Lass uns zuerst den benötigten Online-Retail-Datensatz mit der pandas-Funktion read_csv laden. Du kannst die Daten hier herunterladen.

data = pd.read_excel("Online_Retail.xlsx")
data.head()
  InvoiceNo StockCode Description Quantity InvoiceDate UnitPrice CustomerID Country
0 536365 85123A WHITE HANGING HEART T-LIGHT HOLDER 6 2010-12-01 08:26:00 2.55 17850.0 United Kingdom
1 536365 71053 WHITE METAL LANTERN 6 2010-12-01 08:26:00 3.39 17850.0 United Kingdom
2 536365 84406B CREAM CUPID HEARTS COAT HANGER 8 2010-12-01 08:26:00 2.75 17850.0 United Kingdom
3 536365 84029G KNITTED UNION FLAG HOT WATER BOTTLE 6 2010-12-01 08:26:00 3.39 17850.0 United Kingdom
4 536365 84029E RED WOOLLY HOTTIE WHITE HEART. 6 2010-12-01 08:26:00 3.39 17850.0 United Kingdom

Duplikate entfernen

Manchmal sind Datensätze unaufgeräumt. Duplikate können deine Analyse verzerren. In Python bietet pandas die Funktion drop_duplicates(), die doppelte Einträge entfernt.

filtered_data=data[['Country','CustomerID']].drop_duplicates()

Lass uns in die Insights einsteigen

#Top ten country's customer
filtered_data.Country.value_counts()[:10].plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0x7fe677a887f0>
bar chart

Im gegebenen Datensatz stammen die meisten Kundinnen und Kunden aus dem „United Kingdom“. Du kannst die Daten also auf diese Gruppe filtern.

uk_data=data[data.Country=='United Kingdom']
uk_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 495478 entries, 0 to 541893
Data columns (total 8 columns):
InvoiceNo      495478 non-null object
StockCode      495478 non-null object
Description    494024 non-null object
Quantity       495478 non-null int64
InvoiceDate    495478 non-null datetime64[ns]
UnitPrice      495478 non-null float64
CustomerID     361878 non-null float64
Country        495478 non-null object
dtypes: datetime64[ns](1), float64(2), int64(1), object(4)
memory usage: 34.0+ MB

Die describe()-Funktion in pandas liefert bequeme Übersichtsstatistiken. Sie gibt Anzahl, Mittelwert, Standardabweichung, Minimum, Maximum und Perzentile der Daten zurück.

uk_data.describe()
  Quantity UnitPrice CustomerID
count 495478.000000 495478.000000 361878.000000
mean 8.605486 4.532422 15547.871368
std 227.588756 99.315438 1594.402590
min -80995.000000 -11062.060000 12346.000000
25% 1.000000 1.250000 14194.000000
50% 3.000000 2.100000 15514.000000
75% 10.000000 4.130000 16931.000000
max 80995.000000 38970.000000 18287.000000

Hier siehst du, dass manche Bestellmengen negativ sind – das ist nicht plausibel. Also filtern wir Quantity > 0.

uk_data = uk_data[(uk_data['Quantity']>0)]
uk_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 486286 entries, 0 to 541893
Data columns (total 8 columns):
InvoiceNo      486286 non-null object
StockCode      486286 non-null object
Description    485694 non-null object
Quantity       486286 non-null int64
InvoiceDate    486286 non-null datetime64[ns]
UnitPrice      486286 non-null float64
CustomerID     354345 non-null float64
Country        486286 non-null object
dtypes: datetime64[ns](1), float64(2), int64(1), object(4)
memory usage: 33.4+ MB

Benötigte Spalten filtern

Hier filterst du die relevanten Spalten für die CLTV-Berechnung. Du brauchst fünf Spalten: CustomerID, InvoiceDate, InvoiceNo, Quantity und UnitPrice.

  • CustomerID identifiziert deine Kundinnen und Kunden eindeutig.
  • InvoiceDate hilft, die Anzahl der Tage im Kundenlebenszyklus zu berechnen.
  • InvoiceNo dient zur Zählung der Transaktionen (Frequenz).
  • Quantity ist die Stückzahl pro Transaktion.
  • UnitPrice ermöglicht zusammen mit Quantity die Berechnung des Gesamtbetrags.
uk_data=uk_data[['CustomerID','InvoiceDate','InvoiceNo','Quantity','UnitPrice']]
#Calulate total purchase
uk_data['TotalPurchase'] = uk_data['Quantity'] * uk_data['UnitPrice']

Als Nächstes führst du Folgendes aus:

  • Berechne die Zahl der Tage zwischen dem ersten und letzten Kauf jeder Kundin/jedes Kunden.
  • Zähle die Bestellungen pro Kundin/Kunde.
  • Summiere die Einkaufsbeträge pro Kundin/Kunde.
uk_data_group=uk_data.groupby('CustomerID').agg({'InvoiceDate': lambda date: (date.max() - date.min()).days,
                                        'InvoiceNo': lambda num: len(num),
                                        'Quantity': lambda quant: quant.sum(),
                                        'TotalPurchase': lambda price: price.sum()})
uk_data_group.head()
  InvoiceDate InvoiceNo Quantity TotalPurchase
CustomerID        
12346.0 0 1 74215 77183.60
12747.0 366 103 1275 4196.01
12748.0 372 4596 25748 33719.73
12749.0 209 199 1471 4090.88
12820.0 323 59 722 942.34

Spalten umbenennen

# Change the name of columns
uk_data_group.columns=['num_days','num_transactions','num_units','spent_money']
uk_data_group.head()
  num_days num_transactions num_units spent_money
CustomerID        
12346.0 0 1 74215 77183.60
12747.0 366 103 1275 4196.01
12748.0 372 4596 25748 33719.73
12749.0 209 199 1471 4090.88
12820.0 323 59 722 942.34

CLTV mit folgender Formel berechnen:

 CLTV = ((Average Order Value x Purchase Frequency)/Churn Rate) x Profit margin.

 Customer Value = Average Order Value * Purchase Frequency

1. Durchschnittlichen Bestellwert berechnen

# Average Order Value
uk_data_group['avg_order_value']=uk_data_group['spent_money']/uk_data_group['num_transactions']
uk_data_group.head()
  num_days num_transactions num_units spent_money avg_order_value
CustomerID          
12346.0 0 1 74215 77183.60 77183.600000
12747.0 366 103 1275 4196.01 40.737961
12748.0 372 4596 25748 33719.73 7.336756
12749.0 209 199 1471 4090.88 20.557186
12820.0 323 59 722 942.34 15.971864

2. Kaufhäufigkeit berechnen

purchase_frequency=sum(uk_data_group['num_transactions'])/uk_data_group.shape[0]

3. Repeat-Rate und Churn-Rate berechnen

# Repeat Rate
repeat_rate=uk_data_group[uk_data_group.num_transactions > 1].shape[0]/uk_data_group.shape[0]
#Churn Rate
churn_rate=1-repeat_rate
purchase_frequency,repeat_rate,churn_rate
(90.37107880642694, 0.9818923743942872, 0.018107625605712774)

4. Gewinnmarge berechnen

Die Gewinnmarge ist eine gängige Profitabilitätskennzahl. Sie zeigt, wie viel Prozent des Umsatzes als Gewinn verbleiben. Nehmen wir an, unser Geschäft erzielt ca. 5% Marge auf den Gesamtumsatz.

# Profit Margin
uk_data_group['profit_margin']=uk_data_group['spent_money']*0.05
uk_data_group.head()
  num_days num_transactions num_units spent_money avg_order_value profit_margin
CustomerID            
12346.0 0 1 74215 77183.60 77183.600000 3859.1800
12747.0 366 103 1275 4196.01 40.737961 209.8005
12748.0 372 4596 25748 33719.73 7.336756 1685.9865
12749.0 209 199 1471 4090.88 20.557186 204.5440
12820.0 323 59 722 942.34 15.971864 47.1170

5. Customer Lifetime Value berechnen

# Customer Value
uk_data_group['CLV']=(uk_data_group['avg_order_value']*purchase_frequency)/churn_rate
#Customer Lifetime Value
uk_data_group['cust_lifetime_value']=uk_data_group['CLV']*uk_data_group['profit_margin']
uk_data_group.head()
  num_days num_transactions num_units spent_money avg_order_value profit_margin CLV cust_lifetime_value
CustomerID                
12346.0 0 1 74215 77183.60 77183.600000 3859.1800 3.852060e+08 1.486579e+12
12747.0 366 103 1275 4196.01 40.737961 209.8005 2.033140e+05 4.265538e+07
12748.0 372 4596 25748 33719.73 7.336756 1685.9865 3.661610e+04 6.173424e+07
12749.0 209 199 1471 4090.88 20.557186 204.5440 1.025963e+05 2.098545e+07
12820.0 323 59 722 942.34 15.971864 47.1170 7.971198e+04 3.755789e+06

Vorhersagemodell für CLTV

Lass uns ein CLTV-Vorhersagemodell bauen.

Hier sagst du den CLTV mit einem linearen Regressionsmodell voraus.

Wir nutzen die oben geladenen und gefilterten Daten.

uk_data.head()
  CustomerID InvoiceDate InvoiceNo Quantity UnitPrice TotalPurchase month_yr
0 17850.0 2010-12-01 08:26:00 536365 6 2.55 15.30 Dec-2010
1 17850.0 2010-12-01 08:26:00 536365 6 3.39 20.34 Dec-2010
2 17850.0 2010-12-01 08:26:00 536365 8 2.75 22.00 Dec-2010
3 17850.0 2010-12-01 08:26:00 536365 6 3.39 20.34 Dec-2010
4 17850.0 2010-12-01 08:26:00 536365 6 3.39 20.34 Dec-2010

Extrahiere Monat und Jahr aus InvoiceDate.

uk_data['month_yr'] = uk_data['InvoiceDate'].apply(lambda x: x.strftime('%b-%Y'))
uk_data.head()
  CustomerID InvoiceDate InvoiceNo Quantity UnitPrice TotalPurchase month_yr
0 17850.0 2010-12-01 08:26:00 536365 6 2.55 15.30 Dec-2010
1 17850.0 2010-12-01 08:26:00 536365 6 3.39 20.34 Dec-2010
2 17850.0 2010-12-01 08:26:00 536365 8 2.75 22.00 Dec-2010
3 17850.0 2010-12-01 08:26:00 536365 6 3.39 20.34 Dec-2010
4 17850.0 2010-12-01 08:26:00 536365 6 3.39 20.34 Dec-2010

Die Pivot-Tabelle gruppiert Spalten zu einer zweidimensionalen Ansicht und ermöglicht eine verdichtete, mehrdimensionale Zusammenfassung der Daten.

sale=uk_data.pivot_table(index=['CustomerID'],columns=['month_yr'],values='TotalPurchase',aggfunc='sum',fill_value=0).reset_index()
sale.head()
month_yr CustomerID Apr-2011 Aug-2011 Dec-2010 Dec-2011 Feb-2011 Jan-2011 Jul-2011 Jun-2011 Mar-2011 May-2011 Nov-2011 Oct-2011 Sep-2011
0 12346.0 0.00 0.00 0.00 0.00 0.00 77183.60 0.00 0.00 0.00 0.00 0.00 0.00 0.00
1 12747.0 0.00 301.70 706.27 438.50 0.00 303.04 0.00 376.30 310.78 771.31 312.73 675.38 0.00
2 12748.0 1100.37 898.24 4228.13 1070.27 389.64 418.77 1113.27 2006.26 1179.37 2234.50 10639.23 2292.84 6148.84
3 12749.0 0.00 1896.13 0.00 763.06 0.00 0.00 0.00 0.00 0.00 859.10 572.59 0.00 0.00
4 12820.0 0.00 0.00 0.00 210.35 0.00 170.46 0.00 0.00 0.00 0.00 0.00 343.76 217.77

Jetzt summieren wir die Umsätze über alle Monate.

sale['CLV']=sale.iloc[:,2:].sum(axis=1)
sale.head()
month_yr CustomerID Apr-2011 Aug-2011 Dec-2010 Dec-2011 Feb-2011 Jan-2011 Jul-2011 Jun-2011 Mar-2011 May-2011 Nov-2011 Oct-2011 Sep-2011 CLV
0 12346.0 0.00 0.00 0.00 0.00 0.00 77183.60 0.00 0.00 0.00 0.00 0.00 0.00 0.00 77183.60
1 12747.0 0.00 301.70 706.27 438.50 0.00 303.04 0.00 376.30 310.78 771.31 312.73 675.38 0.00 4196.01
2 12748.0 1100.37 898.24 4228.13 1070.27 389.64 418.77 1113.27 2006.26 1179.37 2234.50 10639.23 2292.84 6148.84 32619.36
3 12749.0 0.00 1896.13 0.00 763.06 0.00 0.00 0.00 0.00 0.00 859.10 572.59 0.00 0.00 4090.88
4 12820.0 0.00 0.00 0.00 210.35 0.00 170.46 0.00 0.00 0.00 0.00 0.00 343.76 217.77 942.34

Features auswählen

Teile die Spalten in Zielvariable (dependent) und Feature-Variablen (independent). Wähle die letzten 6 Monate als Features.

X=sale[['Dec-2011','Nov-2011', 'Oct-2011','Sep-2011','Aug-2011','Jul-2011']]
y=sale[['CLV']]

Daten aufteilen

Um die Modellleistung zu beurteilen, ist es sinnvoll, den Datensatz in Trainings- und Testmenge zu teilen.

Wir nutzen train_test_split(). Du übergibst Features, Zielvariable und die Größe des Testsets. Optional sorgt random_state als Seed für Reproduzierbarkeit. Ist random_state None, nutzt der Zufallszahlengenerator np.random – ohne Seed erhältst du bei jedem Split andere Ergebnisse.

#split training set and test set
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,random_state=0)

Modellentwicklung

Importiere das Modul für lineare Regression und erstelle ein Objekt. Trainiere das Modell mit fit() auf dem Trainingsset und sage mit predict() auf dem Testset voraus.

# import model
from sklearn.linear_model import LinearRegression

# instantiate
linreg = LinearRegression()

# fit the model to the training data (learn the coefficients)
linreg.fit(X_train, y_train)

# make predictions on the testing set
y_pred = linreg.predict(X_test)
# print the intercept and coefficients
print(linreg.intercept_)
print(linreg.coef_)
[208.50969617]
[[0.99880551 0.80381254 1.60226829 1.67433228 1.52860813 2.87959449]]

Wie gut passt das Modell zu den Daten?

Zur Bewertung der Gesamtgüte nutzen wir R-Quadrat. Es beschreibt den durch das Modell erklärten Varianzanteil und liegt zwischen 0 und 1. Je höher, desto besser, da mehr Varianz erklärt wird.

from sklearn import metrics

# compute the R Square for model
print("R-Square:",metrics.r2_score(y_test, y_pred))
R-Square: 0.9666074402817512

Dieses Modell erreicht ein hohes R-Quadrat (0,96) und passt die Daten sehr gut.

Modellevaluation

Für Regressionsprobleme werden folgende Metriken genutzt (Ritchie Ng):

  • Mean Absolute Error (MAE) ist der mittlere Betrag der Fehler.
  • Mean Squared Error (MSE) ist der mittlere quadratische Fehler.
  • Root Mean Squared Error (RMSE) ist die Quadratwurzel des MSE.
# calculate MAE using scikit-learn
print("MAE:",metrics.mean_absolute_error(y_test,y_pred))

#calculate mean squared error
print("MSE",metrics.mean_squared_error(y_test, y_pred))
# compute the RMSE of our predictions
print("RMSE:",np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
MAE: 595.0282284701234
MSE 2114139.8898678957
RMSE: 1454.0082151995896

RMSE ist beliebter als MSE und MAE, weil die Einheit der Zielvariable entspricht und dadurch intuitiver interpretierbar ist.

Vorteile und Nachteile von CLTV

CLTV hilft dir, einen wirksamen Geschäftsplan zu entwickeln und bietet Ansatzpunkte zum Skalieren. Zudem ermöglicht CLTV sinnvolle Kundensegmente, mit denen du die Bedürfnisse verschiedener Gruppen erkennst.

Customer Lifetime Value ist ein Werkzeug, keine Strategie. CLTV identifiziert die profitabelsten Kundinnen und Kunden – wie du daraus Profit schlägst, hängt von deiner Strategie ab. Häufig werden CLTV-Modelle missverstanden oder falsch verwendet. Eine zu starke Fixierung auf CLTV kann Scheuklappen erzeugen: Unternehmen fokussieren sich nur auf die vermeintlich besten Gruppen und wiederholen das Geschäft dort. Es ist jedoch ebenso wichtig, auch andere Kundinnen und Kunden im Blick zu behalten.

Fazit

Glückwunsch, du hast das Ende dieses Tutorials erreicht!

In diesem Tutorial hast du den Customer Lifetime Value im Detail kennengelernt: Definition, Ansätze zur Berechnung, eine Umsetzung in Python von Grund auf, ein Vorhersagemodell sowie die Vor- und Nachteile. Außerdem hast du grundlegende pandas-Konzepte wie groupby und Pivot-Tabellen genutzt, um ausgewählte Spalten und Zeilen zusammenzufassen.

Hoffentlich kannst du das CLTV-Konzept jetzt auf deine eigenen Datensätze anwenden. Danke fürs Lesen!

Wenn du mehr darüber lernen möchtest, Kundendaten in Python zu analysieren, schau dir den DataCamp-Kurs Customer Analytics & A/B Testing in Python an.

Themen
Python
Datenwissenschaft

Python-Kurse

Kurs

Einführung in Python

4 Std.
7M
Lerne in nur vier Stunden die Grundlagen der Datenanalyse mit Python und entdecke beliebte Python-Pakete.
Details anzeigenRight Arrow
Kurs Starten
Mehr anzeigenRight Arrow