RFM ANALİZİ İLE MÜŞTERİ SEGMANTASYONU VE VERİ SETİNİ ANLAMA

Merhaba arkadaşlar yeni öğrendiğim ve ilgimi çeken bir konudan sizlere de bahsetmek istiyorum. RFM analizi, müşteri eylemlerini segmentlere ayırmak için kullanılan bir yöntemdir. Müşterilerin satın alma alışkanlıkları üzerinden pazarlama ve satış stratejileri belirlemeye yardımcı olur.
RFM , Recency, Frequency ve Monetary kelimelerinin baş harflerinin birleşiminden oluşur. Peki bu kelimeler bize ne ifade ediyor? Bu kelimeler bize aslında RFM yönteminin amacını göstermektedir.
Recency(Yenilik): Müşteri en son alışveriş ne zaman alışveriş yapmıştır?
=Bugünün Tarihi — Son satın alma tarihi
Frequency(Sıklık): Müşteri hangi sıklıkla alışveriş yapmış?
Monetary(Parasal Değer):Müşteri ne kadar para harcamıştır?
RFM analizi uygulayan şirketler karlarını belli değerlerde artırmaktadır. Müşterinin hareketlerini gözle görülür şekilde ortaya koyup buna uygun olarak müşteriye karşı önlemler alıp, gelirlerini belirli değerde tutabilir veya yıllık karlarını arttırmayı amaçlamaktadırlar.
RFM Analizi 3 Adımdan Oluşur
- Adım: Müşterilerin R,F,M değerlerini belirlemek.
- Adım: Tabloya göre gruplama işlemi yapmak.
- Adım: Müşterinin bulunduğu gruba göre önlemler almak veya özel yöntemler belirlemek.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Görüldüğü gibi müşterilerimizi Recency ve Frequency değerlerine göre grupladık.
Champions: En sık, en son ve en çok çok harcama yapan gruptur. Şirketlerin gözbebeğidir. Bu gruptaki müşteriler yeni ürünleri hemen benimser ürünün tanıtımını sağlar.
At Risk Customers: Sık sık alışveriş yapan ama son zamanlarda alışveriş yapmayan müşteri grubudur. Bu müşteriler kişisel kampanyalar yapılarak çekilebilir.
Can’t Lose Them: Bu gibi müşterilerle sık sık ilgilenip tekrar kendinize çekebilirsiniz son zamanlarda alışveriş yapmayan gruptur.
RFM ile Customer Segmentation
Bir e-ticaret şirketi müşterilerini segmentlere ayırıp bu segmentlere göre belirli stratejiler belirlemek istiyor.
Veri Seti Hikayesi
Bu şirketin ürün kataloğunda hediyelik eşyalar yer alıyor. Çoğu müşterisi de toptancı olduğu bilgisi verilmektedir.
Değişkenlerimiz
InvoiceNo: Fatura numarası. Her işleme yani faturaya ait eşsiz numara. Eğer bu kod C ile başlıyorsa işlemin iptal edildiğini ifade eder.
StockCode: Ürün kodu. Her bir ürün için eşsiz numara.
Description: Ürün ismi
Quantity: Ürün adedi. Faturalardaki ürünlerden kaçar tane satıldığını ifade etmektedir.
InvoiceDate: Fatura tarihi ve zamanı.
UnitPrice: Ürün fiyatı (Sterlin cinsinden)
CustomerID: Eşsiz müşteri numarası
Country: Müşterinin yaşadığı ülke.
Veri setini aşağıdaki linkten indirebilirsiniz:
Index of /ml/machine-learning-databases/00502 (uci.edu)
Gerekli olan kütüphaneler
import datetime as dt
import pandas as pd
import matplotlib.pyplot as plt
Veri setimi çektim
df=data.copy()
data = pd.read_excel("datasets/online_retail_II.xlsx", sheet_name="Year 2010-2011")df.head()

Bu kısımda sadece RFM ile yakından alakadar olan kısımları anlatacağım. Kodumun tamamına en aşağıdaki linkten ulaşabilirsiniz.
df["InvoiceDate"].max() #veri setindeki son tarih
thisday=dt.datetime(2011, 12, 12) #son tarihten 3 gün sonrasını aldım
rfm_ = df.groupby('Customer ID').agg({'InvoiceDate': lambda date: (thisday-date.max()).days,
'Invoice': lambda num: len(num),
'TotalPrice': lambda TotalPrice: TotalPrice.sum()})
rfm_.columns = ['Recency', 'Frequency', 'Monetary']
rfm_.head()
rfm_ = rfm_[(rfm_["Monetary"]) > 0 & (rfm_["Frequency"] > 0)]
Yukarıdaki kodumun çıktısı aşağıda verilmiştir.

Burada Customer ID değişkenine göre groupby yapıp InvoiceDate, Invoice ve TotalPrice değerlerini isimsiz fonksiyon olan lambda ile bulduk. Daha sonra elimizde olan bu üç sutünun isimlerini sırasıyla Receny, Frequency ve Monetary değerleri ile değiştirdim.
Sıradaki işlemim RFM değişkenlerini bulma aslında amacımız şu bir puanlama işlemi yapıp en üsteki tabloda gözüken görseli oluşturmak. Recency değişkenimiz müşterimizin en yakın zamanda gelmesiyle ödüllendirip 5 puanı veriyoruz. Daha sonra bunları string tipine çevirip RFMSCORE sutünunda birleştirme işlemi yaptım.
rfm_["Recency_Score"] = pd.qcut(rfm_['Recency'], 5, labels=[5, 4, 3, 2, 1])# 1 gün önce geldiyse 5 puan
rfm_["Frequency_Score"] = pd.qcut(rfm_['Frequency'], 5, labels=[1, 2, 3, 4, 5])
rfm_["Monetary_Score"] = pd.qcut(rfm_['Monetary'], 5, labels=[1, 2, 3, 4, 5])
#string tipine çevirdim ve birleştirip RFMSCORE sutünuna yerleştirdim.
rfm_["RFMSCORE"] = (rfm_['Recency_Score'].astype(str)+rfm_['Frequency_Score'].astype(str)+rfm_['Monetary_Score'].astype(str))

En iyi müşterilerimizi bulmak için RFM deki her bir değerin 5 olması doğrultusunda bize bu kişilerin ID değerlerini getirir.
rfm_[rfm_["RFM_SCORE"] == "555"].head()

En kötü müşterilerimizi görmek için,
rfm_[rfm_["RFMSCORE"] == "111"].head()

Şimdi sıra geldi segment haritamızı oluşturmaya aşağıda gözüktüğü gibi segment isimlendirmesini yaptım. Bu oluşturduğumuz sözlüğü key değerlerine göre arama yapıp value değerleri değiştirmesini isteyip yeni oluşturduğum Segment sutünuna yerleştirdim.
segment_map = { #sözlük oluşturduk
r'[1-2][1-2]': 'Hibernating',
r'[1-2][3-4]': 'At_Risk',
r'[1-2]5': 'Cant_Loose',
r'3[1-2]': 'About_to_Sleep',
r'33': 'Need_Attention',
r'[3-4][4-5]': 'Loyal_Customers',
r'41': 'Promising',
r'51': 'New_Customers',
r'[4-5][2-3]': 'Potential_Loyalists',
r'5[4-5]': 'Champions'
}
rfm_['Segment'] = rfm_['Recency_Score'].astype(str) + rfm_['Frequency_Score'].astype(str)
rfm_['Segment'] = rfm_['Segment'].replace(segment_map, regex=True)

Aşağıdaki kodda Segment değişkenine göre Segment, Recency, Frequency ve Monetary değişkenini groupby yapıp mean, count, max ve min değerlerini istedim.
df[["Customer ID"]].nunique()
rfm_[["Segment", "Recency", "Frequency", "Monetary"]].groupby("Segment").agg(["mean", "count","max","min"])
rfm_[rfm_["Segment"] == "Loyal_Customers"].head() #Loyal_Customers sınıfımız
rfm_[rfm_["Segment"] == "Loyal_Customers"].index #bu sınıfın Customer ID lerini seçtim :)

Buradaki amacım RFM analizi mantığını incelemekti. Kodumun tamamını incelemek isterseniz aşağıda belirttiğim linklerden ulaşabilirsiniz. Bir sonraki yazımda görüşmek üzere kendinize çok iyi bakın…