Ana içeriğe atla

Pazarlamada Veri Bilimi: Müşteri Terk Oranı Tahmini

Pazarlama verilerini anlamlı içgörülere dönüştürerek müşteri terk oranlarını tahmin etmek için Python makine öğrenimi modellerini nasıl kullanacağınızı öğrenin.
Güncel 31 Ağu 2026  · 10 dk. oku

Yapay Zekâyla Keşfet

ChatGPTClaudePerplexity

 

Giriş 

Son 10-15 yılda dijital teknolojilerin ilerlemesiyle birlikte pazarlama stratejileri önemli ölçüde değişti. Ünlü markalar ve daha küçük pazarlar; işlemler, müşteri satın alımları, tercihleri, satın alma gücü, satın alma aktivitesi, demografi, yorumlar vb. hakkında büyük miktarda veri topladı. Tüm bu veriler, pazarlamacıların müşterilerin davranışlarını farklı aşamalarda anlamasına yardımcı olabilir; bir şey satın alma niyetinden, gerçek bir satın alma işlemine ve sürekli bir müşteri olmaya kadar. İşte bu noktada veri biliminin potansiyeli devreye girer.

Veri bilimi, ilk bakışta bazen çok sezgisel olmasa da (ör. açık olmayan tüketici davranış kalıpları ve birlikte gerçekleşmeler gibi) pazarlamadaki büyük veriyi uygulanabilir içgörülere dönüştürür. Sonuç olarak pazarlamacılar hedef kitlelerinin daha net bir resmini görür, yeni müşteriler çeker ve mevcutları elde tutar, pazarlama stratejilerini optimize eder, şirketin görünürlüğünü artırır, daha başarılı reklam kampanyaları oluşturur, yeni kanallar devreye alır ve bunun karşılığında şirketin gelirini önemli ölçüde maksimize eder.

Pazarlamadaki en tipik veri bilimi kullanım alanlarından biri müşteri terk oranı tahminidir. Bu konuyu daha ayrıntılı ele alalım.

Pazarlamada Veri Bilimi Kullanım Alanı: Müşteri Terk Oranı Tahmini

Müşteri terki, müşterilerin kullandıkları bir hizmetin aboneliğini iptal etme ve dolayısıyla o hizmetin müşterisi olmaktan çıkma eğilimidir. Müşteri terk oranı ise önceden tanımlanmış bir zaman aralığındaki terk eden müşterilerin yüzdesidir. Yeni müşterileri takip eden müşteri büyüme oranının tersidir.

Müşteri terk oranı, müşteri memnuniyetinin ve şirketin genel iş sağlığının çok önemli bir göstergesidir. Her işletmede doğal olarak gerçekleşen terklerin yanı sıra bazı hizmetlere özgü mevsimsel terkler dışında, şirkette bir şeylerin yanlış gittiğini ve düzeltilmesi gerektiğini gösterebilecek başka etkenler de vardır. Bu etkenler şunlardır:

  • müşteri desteğinin yetersiz olması veya düşük kalitede sunulması,
  • olumsuz müşteri deneyimleri,
  • daha iyi koşullara ya da fiyatlandırma stratejisine sahip bir rakibe geçiş,
  • müşterilerin önceliklerinin değişmesi,
  • uzun süreli müşterilerin tatmin olmaması,
  • hizmetin müşterilerin beklentilerini karşılamaması,
  • finansal sorunlar,
  • müşteri ödemelerinde dolandırıcılık koruması.

Yüksek müşteri terk oranı, aşağıdaki nedenlerle herhangi bir şirket için ciddi bir sorun teşkil eder:

  • Şirketin gelir kaybıyla ilişkilidir.
  • Yeni müşteri kazanmak, mevcut müşterileri elde tutmaktan çok daha fazla maliyetlidir. Bu özellikle rekabetin yüksek olduğu pazarlarda geçerlidir.
  • Kötü müşteri hizmeti nedeniyle yaşanan terklerde, memnuniyetsiz eski müşterilerin sosyal medyada veya değerlendirme sitelerinde bırakacağı olumsuz yorumlar yüzünden şirketin itibarı ciddi şekilde zarar görebilir.

Müşteri elde tutma, abonelik tabanlı tüm hizmetler için iş stratejisinin kritik bir bileşenidir. Müşteri terk oranını tahmin etmek ve buna karşılık gelen önleyici tedbirleri almak için, müşteri davranışlarına ilişkin bilgileri (satın alma aralıkları, müşteri olma süresinin tamamı, iptaller, takip aramaları ve mesajları, çevrimiçi aktivite) toplamak ve analiz etmek ve hangi özniteliklerin ve bunların kombinasyonlarının ayrılma riski taşıyan müşterilere özgü olduğunu belirlemek gerekir. Özellikle yüksek gelir getiren veya uzun süreli müşteriler söz konusu olduğunda, hangi müşterilerin yakında terk edebileceğini önceden bilmek, şirketin tam olarak onlara odaklanmasına ve kalmalarını sağlamaya yönelik etkili bir strateji geliştirmesine yardımcı olabilir. Yaklaşım; bu tür müşterilerle özel bir hediye, indirim, aynı fiyata abonelik yükseltmesi veya başka herhangi bir kişiselleştirilmiş deneyim teklifiyle iletişime geçmeyi içerebilir.

Teknik olarak, müşteri terk tahmini, müşterilerin terk riski taşıyıp taşımadıkları açısından "evet" veya "hayır" şeklinde etiketlendiği tipik bir makine öğrenimi sınıflandırma problemidir. Bu kullanım alanını Python ile gerçek dünya verileri üzerinde inceleyelim.

Telekom iş modelinde terk davranışını modelleyeceğiz; burada müşteriler bir telekomünikasyon şirketiyle tek bir ana sözleşme altında birden fazla hizmete sahip olabilir. Veri kümesi, temizlenmiş müşteri aktivitesi özelliklerini ve bir müşterinin terk edip etmediğini belirten bir terk etiketini içerir.

Verilere bakalım ve terk oranı dağılımını inceleyelim:

import pandas as pd

telcom = pd.read_csv('telco.csv')
print(f'Number of customers: {telcom.shape[0]:,}\n'
      f'Churn values: {set(telcom['Churn'])}\n\n'
      f'Churn distribution, %:\n{round(telcom.groupby(['Churn']).size()/telcom.shape[0]*100).convert_dtypes()}')
Number of customers: 7,032
Churn values: {0, 1}

Churn distribution, %:
Churn
0    73
1    27
dtype: float64

Müşterilerin %27’si terk etmiş, bu oldukça yüksek bir orandır. Yine de, önceki veri bilimi kullanım alanıyla karşılaştırıldığında, bu veri kümesi ciddi bir sınıf dengesizliği sorunu barındırmıyor gibi görünüyor.

Şimdi, terk tahmini yapmak için makine öğrenimi tekniklerini uygulamadan önce verileri ön işlemden geçireceğiz. Buna verilerin eğitim ve test setlerine bölünmesi ve özellikler ile hedef değişkenlerin çıkarılması dahildir:

from sklearn.model_selection import train_test_split

target = ['Churn']
custid = ['customerID']

cols = [col for col in telcom.columns if col not in custid + target]

X = telcom[cols]
y = telcom[target]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)

Terk etiketlerini tahmin etmek ve sonuçların doğruluğunu ölçmek için kullanacağımız ilk modelleme algoritması, basit bir lojistik regresyon sınıflandırma modelidir:

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

lr = LogisticRegression()
lr.fit(X_train, y_train)
predictions = lr.predict(X_test)
print(f'Test accuracy: {round(accuracy_score(y_test, predictions), 4)}')
Test accuracy: 0.8009

Şimdi lojistik regresyon modelimize bir işlev daha ekleyelim: modeli, özellik seçimini model kurulumuyla birlikte yapmak üzere L1 düzenlileştirme ile ölçeklenmiş veriler üzerinde çalıştırmak. C parametresinin (düzenlileştirme gücünün tersi) farklı değerleri model doğruluğu üzerinde etkiye sahiptir. Şimdilik C değerini 0,025 olarak ayarlayalım:

lr = LogisticRegression(penalty='l1', C=0.025, solver='liblinear')
lr.fit(X_train, y_train)
predictions = lr.predict(X_test)
print(f'Test accuracy: {round(accuracy_score(y_test, predictions), 4)}')
Test accuracy: 0.7969

Şimdi, L1 düzenlileştirme için C parametresini ayarlayarak, model karmaşıklığını azaltırken iyi performans ölçütlerini koruyan en uygun değeri keşfedeceğiz. Bu amaçla farklı C değerlerini dolaşacak, her biri için lojistik regresyon örnekleri oluşturacak ve performans ölçütlerini hesaplayacağız.

C listesi, parametrenin olası değerleriyle önceden oluşturuldu. l1_metrics dizisi 3 sütundan oluşacak şekilde kuruldu; birincisi C değerleri, sonraki ikisi ise sıfır olmayan katsayı sayıları ve modelin doğruluk puanı için yer tutucular. Bu yaklaşımı deneyelim:

 C  Non-Zero Coeffs  Accuracy
0  1.0000             23.0  0.801479
1  0.5000             22.0  0.799204
2  0.2500             21.0  0.802048
3  0.1000             20.0  0.802617
4  0.0500             18.0  0.802048
5  0.0250             13.0  0.796928
6  0.0100              5.0  0.790102
7  0.0050              3.0  0.783276
8  0.0025              2.0  0.745734

Daha düşük C değerlerinin sıfır olmayan katsayı sayısını (yani modellemede kullanılan özellikleri) azalttığını, dolayısıyla model karmaşıklığını düşürdüğünü; ancak doğruluğu da azalttığını görebiliyoruz. 0,05 C değerinin en uygun değer olduğu görülüyor: Özellik sayısını 18’e indirirken, düzenlileştirilmemiş modelden biraz daha yüksek bir doğruluk skoru sağlıyor.

Şimdi başka bir modelleme algoritmasını deneyelim – karar ağacı modeli:

from sklearn.tree import DecisionTreeClassifier

clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)
predictions = clf.predict(X_test)
print(f'Test accuracy: {round(accuracy_score(y_test, predictions), 4)}')
Test accuracy: 0.7275

Aşırı uyumdan kaçınırken daha isabetli bir model seçmek için, ağaç derinliğini (max_depth parametresi) ayarlamayı deneyebilir ve en uygun değerini belirleyebiliriz. Teknik olarak süreç, yukarıda lojistik regresyon modelinin en uygun C parametresini seçmeye çok benzer: burada max_depth parametresinin birden çok değeri arasında dolaşacak, her biri için bir karar ağacı kuracak ve ardından performans ölçütlerini hesaplayacağız.

depth_list listesi, parametrenin olası değerleriyle önceden oluşturuldu. depth_tuning dizisi 2 sütunlu olacak şekilde kuruldu; ilk sütun derinlik adaylarıyla dolduruldu, diğeri ise doğruluk skoru için bir yer tutucu. Bu yaklaşımı uygulayalım ve en uygun ağaç derinliğini bulalım:

depth_list = list(range(2, 15))
depth_tuning = np.zeros((len(depth_list), 2))
depth_tuning[:, 0] = depth_list

for index in range(len(depth_list)):
    clf = DecisionTreeClassifier(max_depth=depth_list[index])
    clf.fit(X_train, y_train)
    predictions = clf.predict(X_test)
    depth_tuning[index, 1] = accuracy_score(y_test, predictions)
   
col_names = ['Max_Depth', 'Accuracy']
print(pd.DataFrame(depth_tuning, columns=col_names))
 Max_Depth  Accuracy
0         2.0  0.756542
1         3.0  0.783276
2         4.0  0.782708
3         5.0  0.791809
4         6.0  0.778157
5         7.0  0.780432
6         8.0  0.757110
7         9.0  0.762230
8        10.0  0.763936
9        11.0  0.752560
10       12.0  0.745165
11       13.0  0.732651
12       14.0  0.727531

Dolayısıyla doğruluk skoru, derinlik arttıkça önce yükseliyor, sonra düşmeye başlıyor. max_depth 5 iken ağaç en yüksek doğruluk skorunu veriyor; bu nedenle bu değeri en uygun ağaç derinliği olarak kabul edebiliriz.

Hem lojistik regresyon hem de karar ağacı modelleri için en iyi parametre değerlerini belirledikten sonra, bu modelleri yeniden kuralım ve ardından terki artıran veya azaltan başlıca etkenleri tespit edip yorumlayalım.

Lojistik regresyon modeli için, ortaya çıkan katsayıların üstel değerlerini çıkarıp inceleyeceğiz:

# En iyi modeli yeniden kurma
lr = LogisticRegression(penalty='l1', C=0.05, solver='liblinear')
lr.fit(X_train, y_train)
predictions = lr.predict(X_test)

# Özellik adları ile katsayıları tek bir veri çerçevesinde birleştirme
feature_names = pd.DataFrame(X_train.columns, columns=['Feature'])
log_coef = pd.DataFrame(np.transpose(lr.coef_), columns=['Coefficient'])
coefficients = pd.concat([feature_names, log_coef], axis=1)

# Katsayıların üstel değerlerini hesaplama
coefficients['Exp_Coefficient'] = np.exp(coefficients['Coefficient'])

# Sıfıra eşit katsayıları kaldırma
coefficients = coefficients[coefficients['Coefficient']!=0]
print(coefficients.sort_values(by=['Exp_Coefficient']))
                          Feature  Coefficient  Exp_Coefficient
21                          tenure    -0.907750         0.403431
4                 PhoneService_Yes    -0.820517         0.440204
17               Contract_Two year    -0.595271         0.551413
8                  TechSupport_Yes    -0.418254         0.658195
16               Contract_One year    -0.414158         0.660896
5               OnlineSecurity_Yes    -0.412228         0.662173
6                 OnlineBackup_Yes    -0.143100         0.866667
3                   Dependents_Yes    -0.039299         0.961463
7             DeviceProtection_Yes    -0.017465         0.982687
11            PaperlessBilling_Yes     0.071389         1.073999
1                SeniorCitizen_Yes     0.097904         1.102857
19  PaymentMethod_Electronic check     0.188533         1.207477
22                  MonthlyCharges     0.901454         2.463182

Terk olasılığı üzerindeki en büyük etkiye sahip özelliğin tenure olduğunu görüyoruz. Genel olarak, 1’den küçük katsayı üstelleri olasılığı azaltırken, 1’den büyük olanlar artırır.

Karar ağacı modeli için, if-else kurallarını çıkarıp görselleştireceğiz:

# En iyi modeli yeniden kurma
clf = DecisionTreeClassifier(max_depth=5)
clf.fit(X_train, y_train)
predictions = clf.predict(X_test)

from sklearn import tree
import graphviz

# Eğitilmiş karar ağacından bir graphviz nesnesi dışa aktarma
exported = tree.export_graphviz(decision_tree=clf,
                                out_file=None,
                                feature_names=cols,
                                precision=1,
                                class_names=['Not churn', 'Churn'],
                                filled=True)
graph = graphviz.Source(exported)
display(graph)

Makine Öğrenimi Karar Ağacı

Yukarıdan başlayarak bir dizi if-else kuralı olarak yorumlanabilecek, görsel olarak anlaşılır bir karar ağacı elde ettik. Yine müşteri sadakat süresinin (tenure) terki yönlendiren en önemli değişken olduğunu görüyoruz. Karar ağacı daha fazla katmanla da kurulabilir ve bu, diğer değişkenlere ilişkin daha fazla içgörü sağlayacaktır.

İleriye dönük olarak; model parametrelerini daha da ayarlamayı, farklı eğitim/test bölme yaklaşımlarını kullanmayı, diğer makine öğrenimi algoritmalarını uygulayıp karşılaştırmayı ve model performansını değerlendirmek için çeşitli skor türlerini analiz etmeyi deneyebiliriz.

Müşteri terk oranı tahmini ve pazarlamada veri biliminin diğer uygulamalarına daha derinlemesine dalmak istiyorsanız, Python ile Pazarlama için Makine Öğrenimi kursu iyi bir başlangıç olabilir.

Konular
Veri Bilimi
Makine Öğrenimi
İlgili

blog

2026’da En Popüler 40 Yazılım Mühendisi Mülakat Sorusu

Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Dario Radečić's photo

Dario Radečić

15 dk.

blog

Hızlı Sevkiyat İçin Pratik Vibe Kodlama Teknoloji Yığını

Ön uç, arka uç, veritabanları, kimlik doğrulama, depolama, e-posta, test, dağıtım ve izleme için en iyi araçları keşfedin.
Abid Ali Awan's photo

Abid Ali Awan

14 dk.

Eğitim

Python'da Listeyi String'e Nasıl Dönüştürürsünüz

Bu hızlı eğitimde, Python'da bir listeyi string'e nasıl dönüştüreceğinizi öğrenin.
Adel Nehme's photo

Adel Nehme

Eğitim

.gitignore Nasıl Kullanılır: Örneklerle Pratik Bir Giriş

Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Kurtis Pykes 's photo

Kurtis Pykes

8 dk.

Devamını GörDevamını Gör