Ana içeriğe geç

Customer Lifetime Value

Bu eğitimde, Python’da Customer Lifetime Value hesaplamayı öğrenin.
· 11 dk. oku

Yapay Zeka ile Keşfedin

İtalyan ekonomist Vilfredo Pareto, etkinin %80’inin nedenlerin %20’sinden geldiğini söyler; bu, 80/20 kuralı veya Pareto ilkesi olarak bilinir. Benzer şekilde, şirketlerin işlerinin %80’i müşterilerin %20’sinden gelir. Şirketlerin bu en iyi müşterileri belirleyip onlarla ilişkiyi sürdürmesi, düzenli gelir için kritik önemdedir. Müşterilerle uzun vadeli ilişkiyi sürdürmek için indirim, kampanya, kupon, puan ve hediye gibi sadakat programları planlanmalıdır.

Yeni bir müşteriyi hedeflemek, mevcut müşterileri elde tutmaktan daha maliyetlidir; çünkü yeni müşteri kazanımı için kaynak, zaman ve yoğun çaba harcamanız gerekir. Yapmanız gereken, mevcut müşterileri memnun etmektir. İş analistleri, CLTV (Customer Lifetime Value) kullanarak müşteri edinme maliyetini doğru şekilde hesaplar. CLTV, müşteriyle tüm ilişki süresince elde edilen toplam geliri gösterir. CLTV, gelecekte daha fazla gelir getirebilecek potansiyel müşterilere odaklanmaya yardımcı olur.

Customer Lifetime Value (CLTV)

"Customer Lifetime Value, bir müşterinin ilişki süresi boyunca şirkete sağlayacağı gelir veya kâr miktarını ifade eden parasal bir değerdir". CLTV, kısa vadeli müşterilere kıyasla uzun vadeli müşterilerin kazanımının sonuçlarını ortaya koyar. Müşteri yaşam boyu değeri (CLV), her şirket için satışla ilgili en önemli soruların yanıtlanmasına yardımcı olabilir:

  • En kârlı müşteriler nasıl belirlenir?
  • Bir şirket en iyi ürünü nasıl sunar ve en fazla geliri nasıl elde eder?
  • Kârlı müşteriler nasıl segmentlere ayrılır?
  • Müşteri edinmek için ne kadar bütçe harcanmalıdır?

Customer Lifetime Value Hesaplama

CLTV hesaplamak için pek çok yaklaşım vardır. Herkesin bu konuda kendi görüşü olabilir. CLTV’yi hesaplamak için geçmiş müşteri verilerine ihtiyaç duyarız; ancak yeni müşteriler için hesaplama yapamazsınız. Bu sorunu çözmek için İş Analistleri, yeni müşterilerin CLTV’sini tahmin eden makine öğrenmesi modelleri geliştirir. CLTV hesaplamasına yönelik bazı yaklaşımları inceleyelim:

1) Belirli bir döngüde müşterilerden elde edilen kâr/geliri toplayarak hesaplayabilirsiniz. Örneğin, müşteri son 3 yıldır sizinle ilişkiliyse bu 3 yıldaki toplam kârı toplayabilirsiniz. Kârı yıllık, altı aylık veya aylık ortalama alabilirsiniz; ancak bu yaklaşımda yeni müşteriler için öngörü modeli kuramazsınız.

2) Mevcut müşteriler için bir regresyon modeli kurun. Son altı aylık verileri bağımsız değişken, üç yıldaki toplam geliri bağımlı değişken olarak alın ve bu verilerle bir regresyon modeli oluşturun.

3) CLTV, RFM (Recency, Frequency, Monetary) değerleri kullanılarak da uygulanabilir. Daha fazla bilgi için bu eğitimime bakabilirsiniz.

4) Aşağıdaki denklemi kullanarak: CLTV = ((Ortalama Sipariş Değeri x Satın Alma Sıklığı)/Terk Oranı) x Kâr marjı.

      Customer Value = Average Order Value * Purchase Frequency
  • Average Order Value (AOV): Ortalama Sipariş Değeri, toplam gelirinizin toplam sipariş sayısına oranıdır. AOV, müşterinin bir siparişte harcadığı ortalama gelir tutarını temsil eder.

                         Average Order Value = Total Revenue / Total Number of Orders
    
  • Purchase Frequency (PF): Satın Alma Sıklığı, toplam sipariş sayısının toplam müşteri sayısına oranıdır. Her müşterinin verdiği ortalama sipariş sayısını temsil eder.

                        Purchase Frequency =  Total Number of Orders / Total Number of Customers
    
  • Churn Rate: Terk Oranı, tekrar sipariş vermeyen müşterilerin yüzdesidir.

  • Customer Lifetime: Müşteri Yaşam Süresi, müşterinin kesintisiz olarak sipariş verdiği zaman aralığıdır.

                                  Customer Lifetime=1/Churn Rate
    
  • Repeat Rate: Tekrar Oranı, birden fazla siparişi olan müşteri sayısının benzersiz müşteri sayısına oranı olarak tanımlanabilir. Örnek: Bir ayda 10 müşteriniz varsa ve bunlardan 4’ü geri dönerse tekrar oranınız %40’tır.

                                   Churn Rate= 1-Repeat Rate
    

Python’da CLTV Uygulaması (Formül Kullanarak)

Gerekli Kütüphaneyi İçe Aktarma

#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

Veri Kümesini Yükleme

Önce pandas read CSV işlevini kullanarak gerekli Online Retail veri setini yükleyelim. Veriyi buradan indirebilirsiniz.

data = pd.read_excel("Online_Retail.xlsx")
data.head()
 InvoiceNoStockCodeDescriptionQuantityInvoiceDateUnitPriceCustomerIDCountry
053636585123AWHITE HANGING HEART T-LIGHT HOLDER62010-12-01 08:26:002.5517850.0United Kingdom
153636571053WHITE METAL LANTERN62010-12-01 08:26:003.3917850.0United Kingdom
253636584406BCREAM CUPID HEARTS COAT HANGER82010-12-01 08:26:002.7517850.0United Kingdom
353636584029GKNITTED UNION FLAG HOT WATER BOTTLE62010-12-01 08:26:003.3917850.0United Kingdom
453636584029ERED WOOLLY HOTTIE WHITE HEART.62010-12-01 08:26:003.3917850.0United Kingdom

Çift Kayıtları Kaldırma

Bazen karmaşık bir veri kümesiyle karşılaşırsınız. Yinelenen kayıtlarla uğraşmanız gerekebilir; bu da analizinizin sapmasına yol açar. Python’da pandas, tekrarlanan veya yinelenen kayıtları düşüren drop_duplicates() işlevini sunar.

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

Veri İçgörülerine Geçelim

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

Verilen veri setinde müşterilerin çoğunun "United Kingdom" kaynaklı olduğunu gözlemleyebilirsiniz. Bu nedenle, Birleşik Krallık müşterileri için veriyi filtreleyebilirsiniz.

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

pandas’taki describe() işlevi, çeşitli özet istatistikleri elde etmek için kullanışlıdır. Bu işlev, sayım, ortalama, standart sapma, minimum ve maksimum değerler ile çeyreklikleri döndürür.

uk_data.describe()
 QuantityUnitPriceCustomerID
count495478.000000495478.000000361878.000000
mean8.6054864.53242215547.871368
std227.58875699.3154381594.402590
min-80995.000000-11062.06000012346.000000
25%1.0000001.25000014194.000000
50%3.0000002.10000015514.000000
75%10.0000004.13000016931.000000
max80995.00000038970.00000018287.000000

Burada, bazı müşterilerin negatif miktarda sipariş verdiğini görebilirsiniz ki bu mümkün değildir. Bu nedenle, Quantity değerini sıfırdan büyük olacak şekilde filtrelemeniz gerekir.

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

Gerekli Sütunları Filtreleme

Burada, CLTV hesaplamak için gerekli sütunları filtreleyebilirsiniz. Yalnızca beş sütuna ihtiyacınız var: CustomerID, InvoiceDate, InvoiceNo, Quantity ve UnitPrice.

  • CustomerID müşterilerinizi benzersiz olarak tanımlar.
  • InvoiceDate müşterinin ürününüzle kaldığı gün sayısını hesaplamanıza yardımcı olur.
  • InvoiceNo işlem sayısını (sıklık) saymanıza yardımcı olur.
  • Quantity her işlemde satın alınan birim adedidir.
  • UnitPrice müşterinin satın aldığı her birimin fiyatıdır; toplam satın alma tutarını hesaplamanıza yardımcı olur.
uk_data=uk_data[['CustomerID','InvoiceDate','InvoiceNo','Quantity','UnitPrice']]
#Calulate total purchase
uk_data['TotalPurchase'] = uk_data['Quantity'] * uk_data['UnitPrice']

Burada şu işlemleri yapacaksınız:

  • Her müşteri için mevcut tarih ile son satın alma tarihi arasındaki gün sayısını hesaplayın.
  • Her müşteri için sipariş sayısını hesaplayın.
  • Her müşteri için satın alma tutarlarının toplamını hesaplayın.
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()
 InvoiceDateInvoiceNoQuantityTotalPurchase
CustomerID    
12346.0017421577183.60
12747.036610312754196.01
12748.037245962574833719.73
12749.020919914714090.88
12820.032359722942.34

Sütunları Yeniden Adlandırma

# Change the name of columns
uk_data_group.columns=['num_days','num_transactions','num_units','spent_money']
uk_data_group.head()
 num_daysnum_transactionsnum_unitsspent_money
CustomerID    
12346.0017421577183.60
12747.036610312754196.01
12748.037245962574833719.73
12749.020919914714090.88
12820.032359722942.34

Aşağıdaki formülü kullanarak CLTV hesaplayın:

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

 Customer Value = Average Order Value * Purchase Frequency

1. Ortalama Sipariş Değeri Hesaplama

# Average Order Value
uk_data_group['avg_order_value']=uk_data_group['spent_money']/uk_data_group['num_transactions']
uk_data_group.head()
 num_daysnum_transactionsnum_unitsspent_moneyavg_order_value
CustomerID     
12346.0017421577183.6077183.600000
12747.036610312754196.0140.737961
12748.037245962574833719.737.336756
12749.020919914714090.8820.557186
12820.032359722942.3415.971864

2. Satın Alma Sıklığı Hesaplama

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

3. Tekrar Oranı ve Terk Oranı Hesaplama

# 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. Kâr Marjı Hesaplama

Kâr marjı, yaygın olarak kullanılan bir kârlılık oranıdır. Toplam satışın yüzde kaçının kâr olarak elde edildiğini gösterir. Toplam satış üzerinden yaklaşık %5 kârımız olduğunu varsayalım.

# Profit Margin
uk_data_group['profit_margin']=uk_data_group['spent_money']*0.05
uk_data_group.head()
 num_daysnum_transactionsnum_unitsspent_moneyavg_order_valueprofit_margin
CustomerID      
12346.0017421577183.6077183.6000003859.1800
12747.036610312754196.0140.737961209.8005
12748.037245962574833719.737.3367561685.9865
12749.020919914714090.8820.557186204.5440
12820.032359722942.3415.97186447.1170

5. Müşteri Yaşam Boyu Değeri Hesaplama

# 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_daysnum_transactionsnum_unitsspent_moneyavg_order_valueprofit_marginCLVcust_lifetime_value
CustomerID        
12346.0017421577183.6077183.6000003859.18003.852060e+081.486579e+12
12747.036610312754196.0140.737961209.80052.033140e+054.265538e+07
12748.037245962574833719.737.3367561685.98653.661610e+046.173424e+07
12749.020919914714090.8820.557186204.54401.025963e+052.098545e+07
12820.032359722942.3415.97186447.11707.971198e+043.755789e+06

CLTV için Tahmin Modeli

CLTV tahmin modelini oluşturalım.

Burada, Doğrusal Regresyon Modeli kullanarak CLTV’yi tahmin edeceksiniz.

Önce yukarıda yüklenen ve filtrelenen verileri kullanalım.

uk_data.head()
 CustomerIDInvoiceDateInvoiceNoQuantityUnitPriceTotalPurchasemonth_yr
017850.02010-12-01 08:26:0053636562.5515.30Dec-2010
117850.02010-12-01 08:26:0053636563.3920.34Dec-2010
217850.02010-12-01 08:26:0053636582.7522.00Dec-2010
317850.02010-12-01 08:26:0053636563.3920.34Dec-2010
417850.02010-12-01 08:26:0053636563.3920.34Dec-2010

InvoiceDate alanından ay ve yılı çıkarın.

uk_data['month_yr'] = uk_data['InvoiceDate'].apply(lambda x: x.strftime('%b-%Y'))
uk_data.head()
 CustomerIDInvoiceDateInvoiceNoQuantityUnitPriceTotalPurchasemonth_yr
017850.02010-12-01 08:26:0053636562.5515.30Dec-2010
117850.02010-12-01 08:26:0053636563.3920.34Dec-2010
217850.02010-12-01 08:26:0053636582.7522.00Dec-2010
317850.02010-12-01 08:26:0053636563.3920.34Dec-2010
417850.02010-12-01 08:26:0053636563.3920.34Dec-2010

Pivot tablo, sütunları girdi olarak alır ve veriyi iki boyutlu bir tabloda gruplayarak çok boyutlu bir özet sağlar.

sale=uk_data.pivot_table(index=['CustomerID'],columns=['month_yr'],values='TotalPurchase',aggfunc='sum',fill_value=0).reset_index()
sale.head()
month_yrCustomerIDApr-2011Aug-2011Dec-2010Dec-2011Feb-2011Jan-2011Jul-2011Jun-2011Mar-2011May-2011Nov-2011Oct-2011Sep-2011
012346.00.000.000.000.000.0077183.600.000.000.000.000.000.000.00
112747.00.00301.70706.27438.500.00303.040.00376.30310.78771.31312.73675.380.00
212748.01100.37898.244228.131070.27389.64418.771113.272006.261179.372234.5010639.232292.846148.84
312749.00.001896.130.00763.060.000.000.000.000.00859.10572.590.000.00
412820.00.000.000.00210.350.00170.460.000.000.000.000.00343.76217.77

Tüm ayların satışlarını toplayalım.

sale['CLV']=sale.iloc[:,2:].sum(axis=1)
sale.head()
month_yrCustomerIDApr-2011Aug-2011Dec-2010Dec-2011Feb-2011Jan-2011Jul-2011Jun-2011Mar-2011May-2011Nov-2011Oct-2011Sep-2011CLV
012346.00.000.000.000.000.0077183.600.000.000.000.000.000.000.0077183.60
112747.00.00301.70706.27438.500.00303.040.00376.30310.78771.31312.73675.380.004196.01
212748.01100.37898.244228.131070.27389.64418.771113.272006.261179.372234.5010639.232292.846148.8432619.36
312749.00.001896.130.00763.060.000.000.000.000.00859.10572.590.000.004090.88
412820.00.000.000.00210.350.00170.460.000.000.000.000.00343.76217.77942.34

Özellik Seçimi

Burada, verilen sütunları iki tür değişkene ayırmanız gerekir: bağımlı (veya hedef değişken) ve bağımsız değişkenler (veya özellik değişkenleri). Bağımsız değişken olarak son 6 ayı seçin.

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

Veriyi Bölme

Model performansını anlamak için veri kümesini eğitim ve test seti olarak bölmek iyi bir stratejidir.

train_test_split() işlevini kullanarak veri kümesini bölelim. Üç parametre geçirmeniz gerekir: özellikler, hedef ve test_set boyutu. Ek olarak, yeniden üretilebilirliği korumak için random_state’i tohum değeri olarak kullanabilirsiniz; bu, veriyi her bölüşünüzde sonuçların etkilenmeyeceği anlamına gelir. Ayrıca, random_state None ise, kayıtları rastgele seçmek için rastgele sayı üreteci np.random’ı kullanır. Yani bir tohum ayarlamazsanız, her seferinde farklıdır.

#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)

Model Geliştirme

Önce Doğrusal Regresyon modülünü içe aktarın ve bir Doğrusal Regresyon nesnesi oluşturun. Ardından, fit() işlevini kullanarak modelinizi eğitim setine oturtun ve predict() işlevini kullanarak test seti üzerinde tahmin yapın.

# 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]]

Model Veriye Ne Kadar İyi Uyar?

Doğrusal modelin genel uyumunu değerlendirmek için R-kare değerini kullanırız. R-kare, model tarafından açıklanan varyans oranıdır. R-kare değeri 0 ile 1 arasında değişir. Daha yüksek R-kare değeri daha iyidir; çünkü modelin daha büyük bir varyansı açıkladığını gösterir.

from sklearn import metrics

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

Bu modelin R-kare değeri yüksektir (0,96). Model, veriye daha iyi uyum sağlamaktadır.

Model Değerlendirme

Regresyon problemleri için aşağıdaki değerlendirme metrikleri kullanılır (Ritchie Ng):

  • Mean Absolute Error (MAE) hataların mutlak değerlerinin ortalamasıdır.
  • Mean Squared Error (MSE) hataların karelerinin ortalamasıdır.
  • Root Mean Squared Error (RMSE) hataların karelerinin ortalamasının kareköküdür.
# 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, MSE ve MAE’den daha popülerdir; çünkü RMSE’nin birimi y ile aynıdır ve bu nedenle daha yorumlanabilirdir.

CLTV’nin Artıları ve Eksileri

CLTV, etkili bir iş planı tasarlamanıza yardımcı olur ve işinizi ölçeklendirme fırsatı da sunar. CLTV, anlamlı müşteri segmentleri çıkarır; bu segmentler, farklı segmentlerin ihtiyaçlarını belirlemenize yardımcı olabilir.

Customer Lifetime Value bir araçtır, strateji değil. CLTV en kârlı müşterileri ortaya çıkarabilir; ancak onlardan nasıl kâr edeceğiniz stratejinize bağlıdır. Genel olarak CLTV modelleri kafa karıştırılabilir ve yanlış kullanılabilir. CLTV’ye aşırı odaklanma körlüğe yol açabilir. Şirketler yalnızca en iyi müşteri grubunu bulmaya, onlara odaklanmaya ve işi tekrarlamaya yönelir; ancak diğer müşterilere de dikkat etmek önemlidir.

Sonuç

Tebrikler, bu eğitimin sonuna ulaştınız!

Bu eğitimde, Customer Lifetime Value hakkında birçok detayı ele aldınız. CLTV’nin ne olduğunu, CLTV hesaplama yaklaşımlarını, Python’da sıfırdan CLTV uygulamasını, CLTV için bir tahmin modelini ve CLTV’nin artıları ile eksilerini öğrendiniz. Ayrıca, seçili sütun ve satırların özetlenmesi için groupby ve pivot tablo gibi bazı temel pandas kavramlarını da gördünüz.

Umarız artık kendi veri kümelerinizi analiz etmek için CLTV kavramını kullanabilirsiniz. Bu eğitimi okuduğunuz için teşekkürler!

Python’da müşteri verilerini analiz etmeyi daha fazla öğrenmek isterseniz, DataCamp’in Customer Analytics & A/B Testing in Python kursunu inceleyin.

Konular

İlgili