Power BI ile CRM Analitiği II: RFM ile Müşteri Segmentasyonu

Power BI ile CRM Analitiği II: RFM ile Müşteri Segmentasyonu

Bir Python scripti vasıtasıyla PowerBI’da RFM ile yaptığımız müşteri segmentasyonunu görselleştiriyoruz.
Melda Özdin10 Haz 2021

Dijital dünyada müşterimizi tanımanın en basit yollarından biri kural tabanlı olan RFM metriklerini kullanmaktır. RFM ile müşterilerin satın alma alışkanlıkları analiz edilir. Hangi müşterinin daha sadık olduğu veya hangi müşteriyi kaybetmek üzere olduğumuz tespit edilerek bu müşterilere özel kampanyalar düzenlenebilir. Kısaca RFM yardımıyla müşterilerimizi daha yakından tanıyabiliriz.

RFM ile Müşteri Segmentasyonu

Öncelikle RFM'deki temel kavramların üzerinden hızlıca geçelim.

Recency 

  • Müşterinin en son yaptığı alışverişten bu yana geçen süre bilgisini verir. Gün, hafta, ay cinsinden ifade edilebilir.

Frequency

  •  Müşterinin ne sıklıkla satın alım yaptığını gösterir.

Monetary

  • Müşterinin yaptığı alışverişlerde harcadığı toplam tutardır.

Elde ettiğimiz bu metrikleri 1–5 arasında skorlara çevirerek her bir müşteri için belli aralıkta olan değerler elde etmiş oluruz. Böylece her müşteri birbiri ile rahatlıkla karşılaştırılabilir hale gelir. 

Tablo 1'de metrik olarak müşteri özelinde recency, monetary, frequency değerleri yer almaktadır. Tablo 2'de ise bu metrikler skor haline getirilip ilgili segmentlere ayrılmıştır.

Bu çalışmayı bir Python scripti hazırlayarak doğrudan Power BI’da gerçekleştireceğiz. Çalışma kapsamında Online Retail II isimli veri setini kullanıyor olacağız. 

PowerBI’da Python kodu çalıştırabilmek için “Get Data” ve ardından “More” yazısına tıklayıp arama çubuğuna “Python” yazmamız yeterli. Bu kısma RFM segmentleri atanmış şekilde scriptimizi yapıştırıyoruz.

Kodu çalıştırmadan önce bilgisayarınızda ilgili excel dosyasının bulunduğu yeri doğru şekilde belirtmeniz gerektiğini unutmayın!

import datetime as dt
import pandas as pd
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
warnings.filterwarnings("ignore", category=FutureWarning)

pd.set_option('display.max_columns', None)
pd.set_option('display.max_columns', None)

df_ = pd.read_excel("D:/online_retail_II.xlsx", sheet_name="Year 2010-2011")
df = df_.copy()

##########################################
# Data Preperation
##########################################

def outlier_thresholds(dataframe, variable):
    quartile1 = dataframe[variable].quantile(0.01)
    quartile3 = dataframe[variable].quantile(0.99)
    interquantile_range = quartile3 - quartile1
    up_limit = quartile3 + 1.5 * interquantile_range
    low_limit = quartile1 - 1.5 * interquantile_range
    return low_limit, up_limit

def replace_with_thresholds(dataframe, variable):
    low_limit, up_limit = outlier_thresholds(dataframe, variable)
    # dataframe.loc[(dataframe[variable] < low xss=removed>
    dataframe.loc[(dataframe[variable] > up_limit), variable] = up_limit

def crm_data_prep(dataframe):
    dataframe.dropna(axis=0, inplace=True)
    dataframe = dataframe[~dataframe["Invoice"].str.contains("C", na=False)]
    dataframe = dataframe[dataframe["Quantity"] > 0]
    replace_with_thresholds(dataframe, "Quantity")
    replace_with_thresholds(dataframe, "Price")
    dataframe["TotalPrice"] = dataframe["Quantity"] * dataframe["Price"]
    return dataframe

df_prep = crm_data_prep(df)

##########################################
# Creating RFM Segments
##########################################

def create_rfm(dataframe):
    today_date = dt.datetime(2011, 12, 11)
    rfm = dataframe.groupby('Customer ID').agg({'InvoiceDate': lambda date: (today_date - date.max()).days,
                                                'Invoice': lambda num: num.nunique(),
                                                "TotalPrice": lambda price: price.sum()})
    rfm.columns = ['recency', 'frequency', "monetary"]
    rfm = rfm[(rfm['monetary'] > 0)]

    rfm["recency_score"] = pd.qcut(rfm['recency'], 5, labels=[5, 4, 3, 2, 1])
    rfm["frequency_score"] = pd.qcut(rfm["frequency"].rank(method="first"), 5, labels=[1, 2, 3, 4, 5])
    rfm['rfm_segment'] = rfm['recency_score'].astype(str) + rfm['frequency_score'].astype(str)

    seg_map = {
        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['rfm_segment'] = rfm['rfm_segment'].replace(seg_map, regex=True)
    rfm = rfm[["recency", "frequency", "monetary", "recency_score","frequency_score", "rfm_segment"]]
    return rfm

rfm = create_rfm(df_prep)
rfm = rfm.reset_index()

Kod bloğunu çalıştırdıktan sonra script içerisinde oluşturulan tablolar karşımıza çıkıyor. Oluşturmuş olduğumuz rfm tablosunu seçerek yüklemeyi yapalım.

Veri import edilirken nokta virgül uyumsuzluğu problemini giderelim. “Replace Values” kısmına basarak nokta değerleri virgül ile değiştirelim.

Bu aşamada string olarak gelen sütunları seçip sayısal değere çevirmeliyiz. Bunun için ilgili sütunları seçerek üstteki panelden “Data Type” → “Decimal Number” seçeneğine gitmeliyiz.


Ardından “Close & Apply” diyerek query editörden çıkıyoruz. Tablo yüklendikten sonra “fields” kısmında sütunları görebiliriz.

Şimdi sıra veriyi görselleştirmekte. RFM ile segmentasyon için en sık kullanılan görsel “Visualization” kısmında yer alan “Treemap”tir. Bunu seçerek ilerleyelim.

Aşağıdaki görseli elde etmek için “Group” kısmına rfm_segment, “Values” kısmına CustomerID’yi seçip saydırmasını yapalım. CustomerID’ye sağ tıklayıp “Count Distinct”e basmamız yeterli.

Görsel ana hatlarıyla oluştu. Başlık kısmını düzenleyip font ayarları ile oynayarak görseli daha okunabilir hale getirebiliriz. Bu tür düzenlemeler tercihe bağlı olup boya fırçası ile belirtilen format kısmından gerçekleştirilebilir.

Sayfada yer alan en üstteki görsel kısım için üç ayrı slicer seçip sırayla recency, frequency, monetary değerlerini field alanına ekleyelim. Aşağıdaki gibi Between seçerek değerleri kaydırmalı olarak üstten filtreleyebiliriz. Böylelikle RFM değerlerini slicer yardımı ile görselleştirerek müşteri segment analizini Power BI’da gerçekleştirmiş olduk.

RFM yanı sıra CRM analitiği çalışmalarının ardındaki mantığı daha detaylı bir biçimde anlayabilmek için Miuul'un CRM Analitiği eğitimine katılabilirsiniz. Power BI yeteneklerinizi geliştirmek içinse Power BI ile Veri Analizi ve Veri Görselleştirme eğitimini inceleyebilirsiniz.

Miuul topluluğunun bir parçası ol!

Abone ol butonuna tıklayarak Miuul'dan pazarlama ve haber içerikleri almayı onaylıyorum.