blog posts

Python'da kayıp tahmini veya müşteri düşüşü analizi

Python’da kayıp tahmini veya müşteri düşüşü analizi

Python, birçok faydalı kütüphaneye ve yerleşik fonksiyona sahip olan, finansal veri analizi için en yaygın kullanılan programlama dillerinden biridir. Bu eğitici makalede, müşteri kaybını tahmin etmek için Python makine öğrenimi kitaplıklarını kullanmak istiyoruz. Bir müşteri, kullanıcı, abone ya da herhangi bir geri dönen Python’da kayıp tahmini veya müşteri düşüşü analizi müşteri, şirketimizle iş yapmayı bıraktığında ya da bir şirketle ilişkisini sonlandırdığında buna müşteri kaybı diyoruz.

Müşteri kaybı

Müşteri kaybı, müşteri veya kullanıcı kaybını ifade eden bir finansal terimdir; Yani bir müşteri bir şirket veya işletmeyle etkileşime girmeyi reddettiğinde. Benzer şekilde kayıp oranı, müşterilerin veya müşterilerin belirli bir süre içinde bir şirketten ayrılma oranıdır. Belirli bir eşiğin üzerindeki yıpranma oranlarının, bir şirketin iş başarısı üzerinde somut ve soyut etkileri olabilir. İdeal durumda şirketler mümkün olduğu kadar çok müşteriyi ellerinde tutmak isterler. Bu nedenle birçok şirket müşterilerini analiz etmek için kayıp tahminini kullanıyor.

Gelişmiş veri bilimi ve makine öğrenimi tekniklerinin ortaya çıkmasıyla birlikte şirketlerin, yakın gelecekte işleriyle etkileşimi kesebilecek potansiyel müşterileri tespit etmesi artık mümkün. Bir bankanın müşterileri için yazdığımız bu makalede, bir bankanın yaş, cinsiyet, coğrafya gibi çeşitli müşteri özelliklerine göre müşteri kaybının nasıl tahmin edilebileceğini göreceksiniz. Python ile müşteri kaybını tahmin etmek için kullanılan özelliklerin ayrıntıları bir sonraki bölümde verilmektedir.

Kayıpları tahmin etmek için Python’u kullanma

Python, bir veri kümesinin çeşitli özelliklerine veya özelliklerine dayalı olarak tahminler yapmak için kullanılabilecek bir dizi veri bilimi ve makine öğrenimi kitaplığıyla birlikte gelir. SCIKIT-LEARN Python kütüphanesi bu araçlardan biridir. Bu eğitimde, müşteri kaybını tahmin etmek için bu kütüphaneyi kullanıyoruz.

Veri seti: Banka müşteri kaybının modellenmesi

Bu eğitimde bir kayıp tahmin modeli geliştirmek için kullandığımız veri setini aşağıdaki KAGGLE bağlantısından indirebilirsiniz. Zip dosyasını çıkardığınızdan ve CSV dosyasını sabit sürücünüze kaydettiğinizden emin olun.

Müşteri kaybının tahmin edilmesine yönelik veri kümesini indirme bağlantısı:

https://www.kaggle.com/barelydedicated/bank-customer-churn-modeling/version/1

Söz konusu dosyayı açtığımızda veri setinin 14 sütun (özellikler veya değişkenler olarak da bilinir) içerdiğini görüyoruz. İlk 13 sütun bağımsız değişkendir, son sütun ise ikili değeri 1 veya 0 olan bağımlı değişkendir.

 

Burada 1, müşterinin 6 ay sonra bankadan ayrıldığı durumu, 0 ise bankadan ayrıldığı durumu ifade etmektedir. Müşteri 6 ay geçmesine rağmen bankadan çıkmadı. Bu, bağımlı değişken için yalnızca iki olası değerin olduğu ikili sınıflandırma problemi olarak bilinir. Bu durumda müşteri ya 6 ay sonra bankadan ayrılacak ya da ayrılmayacaktır.

Bağımsız değişken verilerinin bağımlı değişken verilerinden 6 ay önce toplandığını belirtmek önemlidir, çünkü görev, bir müşterinin 6 ay sonra bankadan ayrılıp ayrılmayacağını tahmin edebilecek bir makine öğrenme modeli geliştirmektir. Bu sorunu çözmek için MAKİNE ÖĞRENME sınıflandırma algoritmalarını kullanabilirsiniz.

Not: Bu makaledeki tüm kodlar SPYDER programlama ortamı kullanılarak uygulanmıştır. Bunu yapmak için diğer Python programlama ortamlarını kullanabilirsiniz.

Python kullanarak müşteri kaybını tahmin etme adımları

Bu makalede atacağımız adımlara genel bir bakış:

  1. Kitaplıkları içe aktar
  2. Veri kümesi yükleniyor
  3. İlgili özellikleri seçin
  4. Sınıflandırılmış sütunları sayısala dönüştür
  5. Veri ön işleme
  6. Makine öğrenimi algoritmasını öğretme
  7. Makine öğrenmesi algoritmasının değerlendirilmesi
  8. Veri seti özelliklerinin değerlendirilmesi

Bu kayıp tahmin adımlarını birbirimizle adım adım uyguluyoruz.

1. Adım: Python’da karmaşayı tahmin etmek için kitaplıkları içe aktarın

İlk adım, her zaman olduğu gibi gerekli kütüphaneleri içe aktarmaktır. Bunun için aşağıdaki kodu çalıştırıyoruz. Kütüphanelerin önceden kurulmamış olması ve kütüphanelerin kurulu olmadığı hatasını vermesi mümkündür, bu durumda onları örümcek konsolunda veya python konsolunda pip komutuyla çiziyoruz.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

Örneğin pandas kütüphanesi henüz kurulu değilse şu komutu kullanırız:

Pip pandaları yükle

Biz onu kuruyoruz. Diğer kütüphaneler için de prosedür aynıdır.

2. Adım: Veri kümesini yükleyin

İkinci adım, veri kümesini yerel CSV dosyasından Python programına yüklemektir. Pandas kütüphanesinin read_csv metodunu kullanalım. Aşağıdaki kodu çalıştırın:

customer_data = pd.read_csv(r'C:/Users/user/Dropbox/PC/Desktop/churn/Churn_Modelling.csv')

Spyder Variable Explorer penceresinde customer_data veri çerçevesini açarsanız, sütunları aşağıda gösterildiği gibi görmelisiniz:

 

Bu dersimizde veri dosyasını ve kod dosyamızı içeren churn adında bir klasör oluşturduk.

3. Adım: Kaybı tahmin etmek için özellikleri seçin

Bir hatırlatma olarak, veri setimizde toplam 14 sütun bulunmaktadır (yukarıdaki resme bakınız). Aşağıdaki kodu çalıştırarak bunu doğrulayabilirsiniz:

columns = customer_data.columns.values.tolist()
print(columns)

Çıktıda aşağıdaki listeyi görmelisiniz:

 

Tüm sütunlar müşteri kaybını etkilemez, dolayısıyla müşteri kaybının tahmin edilmesinde pek etkili değiller: Her sütunu tek tek ele alalım:

  1. RowNumber – kayıt (satır) numarasını ifade eder ve çıktıyı etkilemez. Bu sütun silinecek.
  2. CustomerId – rastgele değerler içerir ve müşterinin bankadan çıkışını etkilemez. Bu sütun silinecek.
  3. Soyadı – Müşterinin soyadı bankadan ayrılma kararını etkilemez. Bu sütun da silinecek.
  4. Kredi Puanı – daha yüksek kredi puanına sahip bir müşterinin bankadan ayrılma olasılığı daha düşük olduğundan, müşteri kaybını etkileyebilir.
  5. Coğrafya: Bir müşterinin konumu, bankadan ayrılma kararını etkileyebilir. Bu sütunu saklayacağız.
  6. Cinsiyet: Müşterinin bankadan ayrılmasında cinsiyetin bir rolü var mı? Ne olacağını görmek için bu sütunu da dahil edeceğiz.
  7. Yaş – Bu özellik kesinlikle müşteri kaybıyla ilişkilidir, çünkü daha yaşlı müşterilerin bankadan ayrılma veya banka değiştirme olasılıkları gençlere göre daha azdır.
  8. Görev Süresi: Bankanın müşteri olduğu yıl sayısını ifade eder. Genellikle yaşlı müşteriler daha sadıktır ve bankadan ayrılma olasılıkları daha düşüktür.
  9. Bakiye – Hesaplarında daha fazla bakiyesi olan kişilerin, daha az bakiyesi olan kişilere kıyasla bankadan ayrılma olasılıkları daha düşük olduğundan, bu aynı zamanda müşteri kaybının da çok iyi bir göstergesidir.
  10. NumOfProducts – müşterinin banka aracılığıyla satın aldığı ürün sayısını ifade eder.
  11. HasCrCard – Müşterinin kredi kartı olup olmadığını gösterir. Bu sütun aynı zamanda kredi kartı sahibi kişilerin bankadan ayrılma olasılığının daha düşük olması nedeniyle de geçerlidir.
  12. IsActiveMember—Aktif müşterilerin bankadan ayrılma olasılığı daha düşüktür, bu yüzden bunu saklıyoruz.
  13. Tahmini Maaş – Envanterde olduğu gibi, düşük maaşlı kişilerin bankadan ayrılma olasılığı yüksek maaşlı kişilere göre daha yüksektir.
  14. Çıkış – Müşteri bankadan ayrılsa da ayrılmasa da, müşteri kaybı tahmininde bu özelliği dikkate almalıyız.

Nitelikleri daha yakından inceledikten sonra RowNumber, CustomerId ve Surname sütunlarını öznitelik setimizden kaldırıyoruz. Geriye kalan tüm sütunlar müşteri kaybına aynı şekilde katkıda bulunur. Bu üç sütunu yoksaymak için aşağıdaki kodu çalıştırın:

dataset = customer_data.drop(['RowNumber', 'CustomerId', 'Surname'], axis=1)

Burada filtrelenmiş verilerimizi veri kümesi adı verilen yeni bir veri çerçevesinde sakladığımıza dikkat edin. Customer_data veri çerçevesi hala tüm sütunları içermektedir. Daha sonra tekrar kullanacağız.

 

4. Adım: Kategori sütunlarını sayısal sütunlara dönüştürün

Makine öğrenmesi algoritmaları sayısal verilerle çok daha iyi performans sağlar. Toplam verilerimizde iki kategori sütunumuz var: Coğrafya (“Coğrafya”) ve Cinsiyet (“Cinsiyet”). Bu iki sütun metin biçimindeki verileri içerir. Bunları sayısal sütunlara dönüştürmeliyiz.

Öncelikle bu iki sütunu veri kümemizden ayıralım. Bunun için aşağıdaki kodu çalıştırıyoruz:

dataset =  dataset.drop(['Geography', 'Gender'], axis=1)

Kategorik sütunları sayısal sütunlara dönüştürmenin bir yolu, her kategoriyi bir sayıyla değiştirmektir. Örneğin, cinsiyet sütununda kadın yerine 0, erkek yerine 1 yazılabilir veya tam tersi de yapılabilir. Bu, ikiye bölünmüş sütunlar için işe yarar.

Coğrafya gibi üç veya daha fazla kategoriye sahip bir sütun için Fransa, Almanya ve İspanya olmak üzere üç ülke için 0, 1 ve 2 değerlerini kullanabilirsiniz. Ancak bunu yaparsak makine öğrenmesi algoritmaları üç ülke arasında sıralı bir ilişki olduğunu varsayacaktır. Başka bir deyişle, algoritma 2’nin 1 ve 0’dan büyük olduğunu varsayar ancak sayıların temsil ettiği temel ülkeler açısından durum böyle değildir.

Bu tür kategorik sütunları sayısal sütunlara dönüştürmenin daha iyi bir yolu, tek geçişli kodlama kullanmaktır. Bu süreçte kategorilerimizi (Fransa, Almanya, İspanya) alıp sütunlarla temsil ediyoruz. Her sütunda, geçerli satır için kategorinin mevcut olup olmadığını belirlemek için 1’i, aksi halde 0’ı kullanırız.

Bu durumda Fransa, Almanya ve İspanya olmak üzere üç kategori ile kategori verilerimizi yalnızca iki sütunla (örneğin Almanya ve İspanya) görüntüleyebiliyoruz. Neden? Coğrafyası Fransa olan belirli bir satır için, Almanya ve İspanya sütunlarının her ikisi de 0 olacaktır, bu da ülkenin herhangi bir sütun tarafından temsil edilmeyen kalan ülke olması gerektiği anlamına gelir. Yani aslında Fransa için ayrı bir sütuna ihtiyacımız olmadığına dikkat edin. Bu yüzden tartışılan kaybı tahmin etmek için bunu kullanıyoruz.

Hem coğrafya hem de cinsiyet sütunlarını sayısal sütunlara dönüştürelim. Aşağıdaki betiği çalıştırın:

Geography = pd.get_dummies(customer_data.Geography).iloc[:,1:]

Gender = pd.get_dummies(customer_data.Gender).iloc[:,1:]

Pandas kütüphanesinin get_dummies yöntemi, kategori sütunlarını sayısal sütunlara dönüştürür. Daha sonra, .iloc[:,1:] ilk sütunu yok sayar ve kalan sütunları (Almanya ve İspanya) döndürür. Yukarıda da bahsettiğimiz gibi bunun nedeni “n” kategoriyi her zaman “n – 1” sütunla temsil edebilmemizdir.

Şimdi, Değişken Gezgini penceresinde Coğrafya ve müşteri_verileri veri çerçevelerini açarsanız şunun gibi bir şey görmelisiniz:

 

Önceki açıklamamıza göre coğrafya veri çerçevesi üç yerine iki sütun içeriyor. Coğrafya Fransa olduğunda, hem Almanya hem de İspanya’da 0 bulunur. Coğrafya İspanya olduğunda İspanya sütununda 1, Almanya sütununda 0 rakamını görebilirsiniz. Benzer şekilde, Almanya örneğinde, Almanya sütununda 1, İspanya sütununda ise 0 değerini görebilirsiniz.

Daha sonra, son veri kümesini oluşturmak için coğrafya ve cinsiyet veri çerçevelerini veri kümesine eklememiz gerekiyor. Aşağıda gösterildiği gibi iki veri çerçevesini yatay olarak birleştirmek için pandaların concat işlevini kullanabilirsiniz:

dataset = pd.concat([dataset,Geography,Gender], axis=1)

Adım 5: Veri ön işleme

Kayıp tahmininin bu aşamasında verilerimiz artık hazır ve makine öğrenimi modelimizi bunun üzerinde eğitebiliriz; Ancak öncelikle tahmin ettiğimiz değişkeni veri setinden ayırmamız gerekiyor. Bu, aşağıdaki yöntem kullanılarak yapılır.

X =  dataset.drop(['Exited'], axis=1)

y = dataset['Exited']

Burada X bizim özellik setimizdir. Bu, tahmin etmemiz gereken (Çıkıldı) dışındaki tüm sütunları içerir. Etiket seti, y, yalnızca Çıkış sütununu içerir; Böylece makine öğrenimi modelimizin performansını daha sonra değerlendirebiliriz.

Şimdi verileri eğitim ve test seti olarak da ayıralım. Eğitim seti, makine öğrenimi modelimizi eğitmek için kullanılan verileri içerir. Test seti modelimizin ne kadar iyi olduğunu değerlendirmek için kullanılacaktır. Verilerin %20’sini test seti için, kalan %80’ini ise eğitim seti için kullanacağız (test_size argümanı ile belirtilir):

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

6. Adım: Makine öğrenimi algoritmasını eğitme

Şimdi, eğitim verilerindeki kalıpları veya eğilimleri tanımlayan dalgalanmayı tahmin etmek için bir makine öğrenme algoritması kullanacağız. Bu adım algoritma eğitimi olarak bilinir. Doğru özellikleri ve çıktıyı algoritmaya besliyoruz. Algoritma, bu verilere dayanarak özellikler ve çıktılar arasındaki ilişkileri bulmayı öğrenecek. Algoritmayı eğittikten sonra yeni verileri tahmin etmek için kullanabilirsiniz.

Bu tür tahminler yapmak için kullanılabilecek çeşitli makine öğrenme algoritmaları vardır. Bu derste rastgele orman algoritmasını kullanacağız çünkü bu algoritma basit ve sınıflandırma problemleri için en güçlü algoritmalardan biridir.

Bu algoritmayı eğitmek için fit metodunu çağırıyoruz ve özelliği (X) ve karşılık gelen etiket setini (y) aktarıyoruz. Daha sonra test toplamını tahmin etmek için tahmin yöntemini kullanabiliriz. Aşağıdaki komut dosyasına bakın:

from sklearn.ensemble import RandomForestClassifier

classifier = RandomForestClassifier(n_estimators=200, random_state=0)

classifier.fit(X_train, y_train)

predictions = classifier.predict(X_test)

7. Adım: Makine öğrenimi algoritmasını değerlendirin

Artık algoritma eğitildiğine göre, kayıp tahmin algoritmasının ne kadar iyi performans gösterdiğini görmenin zamanı geldi. Bir sınıflandırma algoritmasının performansını değerlendirmek için en yaygın kullanılan kriterler F1 ÖLÇÜMÜ, HASSASİYET, GERİ ÇAĞIRMA ve DOĞRULUKtur. Tüm bu değerleri bulmak için scikit-learn Python kütüphanesinde yerleşik fonksiyonları kullanabiliriz; Bu yüzden aşağıdaki betiği çalıştıracağız:

from sklearn.metrics import classification_report, accuracy_score

print(classification_report(y_test,predictions ))

print(accuracy_score(y_test, predictions ))

Çıktısı aşağıdaki gibi olacaktır:

8. Adım: Müşteri kaybının tahmin edilmesindeki özelliği değerlendirin

Kayıp tahmin eğitiminin son adımı olarak, kaybın belirlenmesinde hangi özelliğin en önemli rolü oynadığını görelim. Neyse ki RandomForestClassifier, belirli bir sınıflandırıcının en önemli özellikleri hakkında bilgi içeren feature_importance adlı bir özniteliğe sahiptir.

Aşağıdaki kod, müşteri kaybını tahmin etmek için en iyi 10 özelliğin çubuk grafiğini oluşturur:

feat_importances = pd.Series(classifier.feature_importances_, index=X.columns)

feat_importances.nlargest(10).plot(kind='barh')

Ve çıktı aşağıdaki gibidir:

 

Bu verilere dayanarak, müşteri kaybı üzerinde en büyük etkiye yaşın sahip olduğunu, bunu müşterinin tahmini maaşı ve hesap bakiyesinin takip ettiğini görebiliriz.

Python için Churn tahmin kodu pasajı

Oluşturduğumuz bu uygulama için müşteri kaybını tahmin etmeye yönelik Python kodunun parçası genel olarak aşağıdaki gibidir:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
customer_data = pd.read_csv(r'C:/Users/user/Dropbox/PC/Desktop/churn/Churn_Modelling.csv')
columns = customer_data.columns.values.tolist()
print(columns)
dataset = customer_data.drop(['RowNumber', 'CustomerId', 'Surname'], axis=1)
dataset =  dataset.drop(['Geography', 'Gender'], axis=1)
Geography = pd.get_dummies(customer_data.Geography).iloc[:,1:]
Gender = pd.get_dummies(customer_data.Gender).iloc[:,1:]
dataset = pd.concat([dataset,Geography,Gender], axis=1)
X =  dataset.drop(['Exited'], axis=1)
y = dataset['Exited']
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(n_estimators=200, random_state=0)
classifier.fit(X_train, y_train)
predictions = classifier.predict(X_test)
from sklearn.metrics import classification_report, accuracy_score
print(classification_report(y_test,predictions ))
print(accuracy_score(y_test, predictions ))
feat_importances = pd.Series(classifier.feature_importances_, index=X.columns)
feat_importances.nlargest(10).plot(kind='barh')

Çözüm

Müşteri kaybı tahmini, bir şirketin uzun vadeli finansal istikrarı için çok önemlidir. Bu yazıda, müşteri kaybını %86,35 doğrulukla tahmin edebilen bir makine öğrenimi modelini başarıyla geliştirdik. Bir sınıflandırma görevi için makine öğrenimi modeli oluşturmanın ne kadar kolay ve basit olduğunu görebiliriz.