Kalıplaşmış Veri Bilimi: Müşteri Kaybının Analizi

Müşteri İlişkileri Yönetimi (CRM) sadece yeni müşteriler kazanmakla değil, özellikle mevcut müşterileri elde tutmakla da ilgilidir. Bunun nedeni, edinmenin genellikle elde tutmaktan çok daha pahalı olmasıdır. Bu gönderide, müşteri kaybını (yani, şirketten ayrılan müşteriler) nedenlerini nasıl analiz edeceğimizi öğreniyoruz. Bunu, R’nin üzerinde veri bilimi yapmak için çok uygun bir işaretle ve tıkla arabirimiyle yapıyoruz, o yüzden okumaya devam edin! 

R için en popüler Grafik Kullanıcı Arayüzü (GUI) RStudio’dur, ancak başka arayüzler de vardır. Boş ekranın dehşetinden korkuyorsanız, çok kullanışlı ve gelişmiş veri bilimi GUI Rattle’ı kullanabilirsiniz. R altında sadece rattle kurunuz. Ayrıca RGtk2 paketini de kurmanız gerekebilir. Sonrasında rattle’ı aşağıdaki kod ile yükleyebilir ve başlatabilirsiniz. 

library(rattle)
rattle()

Kullanacağımız veri seti, yeni ve mükemmel olan Yönetim İçin Kantitatif Yöntemler (Quantitative Methods for Management) kitabından alınmıştır. Pratik Bir Yaklaşım (Yazarlar: Canela, Miguel Angel; Alegre, Inés; Ibarra, Alberto) ve herkese açık, verileri doğrudan Github deposundan (repository) churn.csv‘den yükleyebilir ve seçtiğiniz bir dizine kaydedebilirsiniz. 

Veri seti, aşağıdaki özelliklere sahip bir cep telefonu hizmetleri şirketinin 5.000 müşterisinden oluşan rastgele bir örneklemdir: 

ID, a customer ID (the phone number).
ACLENGTH, the number of days the account had been active at the beginning of the period monitored (September 30th).
INTPLAN, a dummy for having an international plan during at least one month of the third quarter.
DATAPLAN, the same for a data plan.
DATAGB, the data allowance of the data plan (either 0, 100M, 250M, 500M, 1G, 1.5G or 2G).
OMMIN, the total minutes in calls to Omicron mobile phone numbers during the third quarter.
OMCALL, the total number of calls to Omicron mobile phone numbers during the third quarter.
OTMIN, the total minutes in calls to other mobile networks during the third quarter.
OTCALL, the total number of calls to other networks during the third quarter.
NGMIN, the total minutes in calls to non-geographic numbers, typically used by helplines and call centers, during the third quarter.
NGCALL, the total number of calls to non-geographic numbers during the third quarter.
IMIN, the total minutes in international calls during the third quarter.
ICALL, the total number of international calls during the third quarter.
CUSCALL, the total number of calls to the customer service, up to September 30th.
CHURN, a dummy for churning during the period monitored.

Son özellik CHURN, tahmin etmek istediğimiz hedef değişkendir. Rattle arayüzünün sekmeleri, tipik bir veri bilimi iş akışına göre sıralanmıştır. İlk önce dizin sembolüne tıklayıp kaydettiğimiz churn.csv dosyasını seçerek veri setini yükleyeceğiz. Bundan sonra Execute’e tıklıyoruz; 

CHURN doğru bir şekilde Target  olarak tanımlanmıştır. Öncelikle verilere genel bir bakış atmak istiyoruz. İlk iki değişken için Explore sekmesine geçiyoruz ve Distributions altında Box Plot ve Histogram’ı seçiyoruz (bu durumda sadece iki örnekleme amacıyla); 

Aynı sonucu elde etmek için, menüdeki Ayarlar altında Advanced Graphics  devre dışı bırakın ve Execute‘e tıklayın; 

INTPLAN (üçüncü çeyreğin en az bir ayı boyunca uluslararası bir plana sahip olmak için bir kukla) değişkeni ile karşılaştırıldığında, izlenen dönemin başında hesabın aktif olduğu gün sayısının (ACLENGTH) CHURN ‘ü tahmin etme gücüne neredeyse hiç sahip olmadığını açıkça görebiliriz. Görünüşe göre müşteriler bu plandan özellikle memnun değiller ve daha çok vazgeçiyorlar. Bu grafiklerde çok daha fazla bilgi var ama bu yazının kapsamı dışındadır. 

Ayrıca DATAGB kategorik değişkenini (yani veri planının veri ödeneği, 0, 100M, 250M, 500M, 1G, 1.5G veya 2G) Box Plot , Dot Plot ve Mosaic ‘e tıklayarak test ediyoruz ve bundan sonra tekrar Execute’e tıklıyoruz; 

Yine aynı şekilde, DATAGB’nin bizim için herhangi bir şekilde yararlı olabileceği görünmüyor (bu, CHURN oranlarının yaklaşık aynı kaldığı mozaik çizimde iyi görülebilir). Şimdi, iyi bir yorumlanabilirlik avantajına sahip bir karar ağacı olan gerçek bir veri bilimi modeli oluşturmak istiyoruz. Bu konuda Model sekmesine geçiyoruz ve Execute’e tıklıyoruz; 

Alınan sonuç çok okunaklı değil, bu yüzden ağaç diyagramı olarak daha net bir temsil istiyoruz. Bunun için  Advanced Graphics ‘i tekrar etkinleştiriyoruz ve Draw’a tıklıyoruz ve sonrasında aşağıdaki ağaç görünmelidir (tüm alanın yalnızca üst yarısını kaplaması durumunda, grafiği yalnızca bir satır ve bir sütuna sıfırlamak için lütfen aşağıdaki kod parçasını kullanın.  

par(mfrow = c(1, 1)) 

Uluslararası bir planı olmayan müşterilerin, böyle bir plana sahip olan müşterilerin, abone olup olmayacağı diğer değişkenlere bağlıyken, çok düşük bir çalkantı olasılığına sahip olduğunu görebiliriz. Rules’a tıklayarak kesin kuralları alabiliriz. 

Gerçek bir veri bilimi projesinde, pazarlama ekibi tüm kuralların artık mantıklı olup olmadıklarını ve ek eylemlerin çıkarılıp çıkarılamayacağını görmek için tüm bu kuralları gözden geçirecektir. Örneğin, kurallardan biri 14 ve 15’in kombinasyonu ilginç olabilir: her iki kuralda da müşterilerin uluslararası bir planı vardır, ancak bir grubun buna gerçekten ihtiyacı yoktur. Bu durum da onların sistemi terk etmesine(churn) yol açarken, onu kullanan diğer grup yüksek olasılıkla sistemi terk eder(churn) (unutmayın, IMIN, uluslararası aramalardaki toplam dakikadır). Bu, planın bu haliyle kötü olarak algılanmadığı, ancak işleyişinde bazı sorunlar olabileceği anlamına gelebilir. Fakat her durumda, bu daha fazla araştırmayı garanti eder! 

Son adım olarak modelimizin kalitesini kontrol etmek istiyoruz. Evaluate sekmesine geçiyoruz ve Testing ve Execute ‘e tıklıyoruz; 

Bu ağaç modelini kullanarak ör. %17,5’lik bir genel hata var, bu sonuç çok da kötü değil fakat Model sekmesinde Random Forest, Boost, SVM (Destek Vektör Makinesi (Support Vector Machine) için) ve Neural Net gibi daha karmaşık modeller oluşturarak bu hata oranını daha da düşürmeye çalışabiliriz. 

Pratik bir ortamda, sistemde kalacağı tahmin edilen bir müşteriyi kaybetmek, kaybedileceği tahmin edilen bir müşteriyi elde tutmaktan daha pahalı olabilir. İlk durumda, tüm bir müşteriyi ve tüm gelirini kaybedersiniz, ikinci durumda, yalnızca daha küçük bir kar marjıyla daha iyi bir plan sunmuş olabilirsiniz. Farklı modeller farklı türde hatalar yapacaktır, hangi hataların tercih edileceği ayara bağlıdır. 

Rattle’ın çok güzel bir özelliği, tüm oturumunuzun gerçek, yürütülebilir R kodu olarak kaydedilmesidir. Bunu, kaputun altında gerçekten neler olup bittiğini görmek ve analizlerinizi yeniden üretmek ve yeniden kullanmak için kullanabilirsiniz! Sadece son sekme  Log’a gidin: 

Tüm komut dosyasını ExportExport ‘a tıklatarak dışa aktarabilirsiniz. 

Bu yazıyı sonuçlandırmak için, bir akıl sağlığı kontrolü ve kıyaslama olarak, veri setinin OneROneR paketinden geçmesine izin verdik (CRAN’da, daha fazla bilgi için ayrıca vignette bakın). 

library(OneR)
#churn <- read.csv("https://raw.githubusercontent.com/quants-book/CSV_Files/master/churn.csv")
churn <- read.csv("data/churn.csv")

data <- maxlevels(optbin(churn))
## Warning in optbin.data.frame(churn): target is numeric

model <- OneR(data, verbose = TRUE)
## 
##     Attribute Accuracy
## 1 * INTPLAN   83.38%  
## 2   ACLENGTH  80.64%  
## 2   DATAPLAN  80.64%  
## 2   DATAGB    80.64%  
## 2   OMMIN     80.64%  
## 2   OMCALL    80.64%  
## 2   OTMIN     80.64%  
## 2   OTCALL    80.64%  
## 2   NGMIN     80.64%  
## 2   NGCALL    80.64%  
## 2   IMIN      80.64%  
## 2   ICALL     80.64%  
## 2   CUSCALL   80.64%  
## ---
## Chosen attribute due to accuracy
## and ties method (if applicable): '*'

summary(model)
## 
## Call:
## OneR.data.frame(x = data, verbose = TRUE)
## 
## Rules:
## If INTPLAN = 0 then CHURN = 0
## If INTPLAN = 1 then CHURN = 1
## 
## Accuracy:
## 4169 of 5000 instances classified correctly (83.38%)
## 
## Contingency table:
##      INTPLAN
## CHURN      0     1  Sum
##   0   * 3839   193 4032
##   1      638 * 330  968
##   Sum   4477   523 5000
## ---
## Maximum in each column: '*'
## 
## Pearson's Chi-squared test:
## X-squared = 712.58, df = 1, p-value < 2.2e-16

plot(model)
prediction <- predict(model, data)
eval_model(prediction, data)
## 
## Confusion matrix (absolute):
##           Actual
## Prediction    0    1  Sum
##        0   3839  638 4477
##        1    193  330  523
##        Sum 4032  968 5000
## 
## Confusion matrix (relative):
##           Actual
## Prediction    0    1  Sum
##        0   0.77 0.13 0.90
##        1   0.04 0.07 0.10
##        Sum 0.81 0.19 1.00
## 
## Accuracy:
## 0.8338 (4169/5000)
## 
## Error rate:
## 0.1662 (831/5000)
## 
## Error rate reduction (vs. base rate):
## 0.1415 (p-value = 3.256e-07)

Yine, uluslararası plandaki sorun yüksek doğrulukla desteklenmektedir. 

Sevgili Pazarlama ekibi: Derhal harekete geçilmesi gerekiyor! 

Kaynak: https://www.r-bloggers.com/2019/11/data-science-on-rails-analyzing-customer-churn/

Çeviren: Cemre Nur Yılmaz