Ana içeriğe geç

Python ile Müşteri Segmentasyonuna Giriş

Bu eğitimde, Python’da sıfırdan RFM (Recency, Frequency, Monetary) analizini kullanarak müşteri segmentasyonunun nasıl uygulanacağını öğreneceksiniz.
· 8 dk. oku

Yapay Zeka ile Keşfedin

Perakende sektöründe, farklı hipermarket zincirleri olağanüstü büyük miktarda veri üretmektedir. Bu veriler mağazalar genelinde günlük olarak oluşur. Bu kapsamlı müşteri işlem veritabanının, kârlı stratejiler tasarlamak için analiz edilmesi gerekir.

Tüm müşterilerin ihtiyaçları farklıdır. Müşteri tabanı ve işlem sayısı arttıkça, her bir müşterinin gereksinimlerini anlamak kolay değildir. Potansiyel müşterileri belirlemek, pazarlama kampanyasını iyileştirerek nihayetinde satışları artırabilir. Segmentasyon, bu müşterileri çeşitli segmentler halinde gruplamakta daha iyi bir rol oynayabilir.

Müşteri Segmentasyonu Nedir?

Müşteri segmentasyonu, müşterileri ortak özelliklere göre gruplara veya kümelere ayırma yöntemidir. Pazar araştırmacısı, B2C modelinde müşterileri; meslek, cinsiyet, yaş, konum ve medeni durum gibi çeşitli demografik özelliklere göre segmentlere ayırabilir. Sosyo-psikolojik özellikler olarak sosyal sınıf, yaşam tarzı ve kişilik özellikleri ile harcama, tüketim alışkanlıkları, ürün/hizmet kullanımı ve daha önce satın alınan ürünler gibi davranışsal özellikler de kullanılabilir. B2B modelinde ise şirket büyüklüğü, sektör türü ve konum gibi çeşitli şirket özellikleri kullanılır.

grafik

Müşteri Segmentasyonuna Neden İhtiyaç Var?

  • En potansiyelli müşterileri belirlemeye yardımcı olur.
  • Yöneticilerin hedef kitleyle daha kolay iletişim kurmasına yardımcı olur.
  • Ayrıca hedeflenen segmente iletişim için en iyi mecranın seçilmesine yardımcı olur.
  • Hizmet kalitesini, sadakati ve elde tutmayı artırır.
  • Segmentlerin ihtiyaçlarını daha iyi anlayarak müşteri ilişkilerini geliştirir.
  • Üst satış ve çapraz satış için fırsatlar sunar.
  • Yöneticilerin hedef müşteriler için daha fazla ürün almalarını teşvik edecek özel teklifler tasarlamasına yardımcı olur.
  • Şirketlerin rakiplerinden bir adım önde kalmasına yardımcı olur.
  • Müşterilerin ilgi duyabileceği yeni ürünlerin belirlenmesine de yardımcı olur.

Segmentasyon Türleri

segmentasyon türleri

RFM Analizi ile Müşteri Segmentasyonu

RFM (Recency, Frequency, Monetary) analizi, müşterileri segmentlere ayıran davranış temelli bir yaklaşımdır. Müşterileri önceki satın alma işlemlerine göre gruplar. Bir müşteri ne kadar yakın zamanda, ne sıklıkla ve ne kadar tutarda satın aldı? RFM, daha iyi hizmet sunma amacıyla müşterileri çeşitli gruplara ayırır. Yöneticilerin daha kârlı iş yapmak için potansiyel müşterileri belirlemesine yardımcı olur. Yüksek harcama yapan bir müşteri segmenti vardır, peki ya sadece bir kez mi satın aldılar ya da en son ne zaman satın aldılar? Ürünümüzü sık sık satın alıyorlar mı? Ayrıca, kişiselleştirilmiş hizmet için etkili bir promosyon kampanyası yürütmelerine yardımcı olur.

  • Recency (R): Son zamanlarda kim satın aldı? Son satın almadan bu yana geçen gün sayısı (daha az recency daha iyidir)
  • Frequency (F): Kim sık sık satın aldı? Toplam satın alma sayısı anlamına gelir (yüksek frequency)
  • Monetary Value (M): Kimlerin satın alma tutarı yüksek? Müşterinin harcadığı toplam para anlamına gelir (yüksek monetary value)

Burada, üç değişkenin (Recency, Frequency ve Monetary) her biri dört eşit gruptan oluşur ve bu da 64 (4x4x4) farklı müşteri segmenti oluşturur.

RFM (Recency, Frequency, Monetary) adımları:

  1. Her müşteri için Recency, Frequency, Monetary değerlerini hesaplayın.
  2. Çeyreklikleri kullanarak RFM tablosuna segment kutu değerlerini ekleyin.
  3. Müşteri RFM skorunu artan sırada sıralayın.

1. Her müşteri için Recency, Frequency, Monetary değerlerini hesaplayın.

Recency, Frequency, Monetary değerleri

2. Çeyreklikleri kullanarak RFM tablosuna segment kutu değerlerini ekleyin.

RFM tablosunda segment kutu değerleri

3. Tüm skorları tek bir sütunda (RFM_Score) birleştirin.

tüm skorlar tek sütunda

Python ile RFM Kullanarak Potansiyel Müşteri Segmentlerini Belirleyin

Gerekli Kütüphanelerin İçe Aktarılması

#import modules
import pandas as pd # for dataframes
import matplotlib.pyplot as plt # for plotting graphs
import seaborn as sns # for plotting graphs
import datetime as dt

Veri Kümesini Yükleme

Önce pandas read CSV fonksiyonunu kullanarak gerekli İK veri setini yükleyelim. Veriyi bu bağlantıdan indirebilirsiniz.

data = pd.read_excel("Online_Retail.xlsx")
data.head()
veri kümesi 1
data.tail()
veri kümesi 2
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 541909 entries, 0 to 541908
Data columns (total 8 columns):
InvoiceNo      541909 non-null object
StockCode      541909 non-null object
Description    540455 non-null object
Quantity       541909 non-null int64
InvoiceDate    541909 non-null datetime64[ns]
UnitPrice      541909 non-null float64
CustomerID     406829 non-null float64
Country        541909 non-null object
dtypes: datetime64[ns](1), float64(2), int64(1), object(4)
memory usage: 33.1+ MB
data= data[pd.notnull(data['CustomerID'])]

Yinelenenlerin Kaldırılması

Bazen dağınık bir veri kümesi elde edersiniz. Analizinizi çarpıtacak yinelenen kayıtlarla uğraşmanız gerekebilir. python içinde, pandas tekrar eden veya mükerrer kayıtları düşüren drop_duplicates() fonksiyonunu sunar.

filtered_data=data[['Country','CustomerID']].drop_duplicates()

Hadi Veri İçgörülerine Geçelim

#Top ten country's customer
filtered_data.Country.value_counts()[:10].plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0x7fd81725dfd0>
veri içgörüleri

Verilen veri kümesinde, müşterilerin çoğunun "United Kingdom"dan olduğunu görebilirsiniz. Bu nedenle Birleşik Krallık müşterileri için veriyi filtreleyebilirsiniz.

uk_data=data[data.Country=='United Kingdom']
uk_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 361878 entries, 0 to 541893
Data columns (total 8 columns):
InvoiceNo      361878 non-null object
StockCode      361878 non-null object
Description    361878 non-null object
Quantity       361878 non-null int64
InvoiceDate    361878 non-null datetime64[ns]
UnitPrice      361878 non-null float64
CustomerID     361878 non-null float64
Country        361878 non-null object
dtypes: datetime64[ns](1), float64(2), int64(1), object(4)
memory usage: 24.8+ MB

pandas içindeki describe() fonksiyonu, çeşitli özet istatistikleri elde etmede kullanışlıdır. Bu fonksiyon, sayım, ortalama, standart sapma, minimum ve maksimum değerler ile verinin çeyrekliklerini döndürür.

uk_data.describe()
 QuantityUnitPriceCustomerID
count361878.000000361878.000000361878.000000
mean11.0770293.25600715547.871368
std263.12926670.6547311594.402590
min-80995.0000000.00000012346.000000
25%2.0000001.25000014194.000000
50%4.0000001.95000015514.000000
75%12.0000003.75000016931.000000
max80995.00000038970.00000018287.000000

Burada, bazı müşterilerin negatif miktarda sipariş verdiğini gözlemleyebilirsiniz; bu mümkün değildir. Bu nedenle, Quantity değerini sıfırdan büyük olacak şekilde filtrelemeniz gerekir.

uk_data = uk_data[(uk_data['Quantity']>0)]
In: # Change the name of columns
rfm.columns=['monetary','frequency','recency']
uk_data.info() 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 354345 entries, 0 to 541893
Data columns (total 8 columns):
InvoiceNo      354345 non-null object
StockCode      354345 non-null object
Description    354345 non-null object
Quantity       354345 non-null int64
InvoiceDate    354345 non-null datetime64[ns]
UnitPrice      354345 non-null float64
CustomerID     354345 non-null float64
Country        354345 non-null object
dtypes: datetime64[ns](1), float64(2), int64(1), object(4)
memory usage: 24.3+ MB

Gerekli Sütunları Filtreleyin

Burada, RFM analizi için gerekli sütunları filtreleyebilirsiniz. Yalnızca beş sütuna ihtiyacınız var: CustomerID, InvoiceDate, InvoiceNo, Quantity ve UnitPrice. CustomerID müşterilerinizi benzersiz olarak tanımlar, InvoiceDate satın almanın yakınlığını (recency) hesaplamanıza yardımcı olur, InvoiceNo ise yapılan işlem sayısını (frequency) saymanıza yardımcı olur. Her işlemde satın alınan Quantity ve müşterinin satın aldığı her birimin UnitPrice değeri, toplam satın alma tutarını hesaplamanıza yardımcı olur.

uk_data=uk_data[['CustomerID','InvoiceDate','InvoiceNo','Quantity','UnitPrice']]
uk_data['TotalPrice'] = uk_data['Quantity'] * uk_data['UnitPrice']
uk_data['InvoiceDate'].min(),uk_data['InvoiceDate'].max()
(Timestamp('2010-12-01 08:26:00'), Timestamp('2011-12-09 12:49:00'))
PRESENT = dt.datetime(2011,12,10)
uk_data['InvoiceDate'] = pd.to_datetime(uk_data['InvoiceDate'])
uk_data.head()
 CustomerIDInvoiceDateInvoiceNoQuantityUnitPriceTotalPrice
017850.02010-12-01 08:26:0053636562.5515.30
117850.02010-12-01 08:26:0053636563.3920.34
217850.02010-12-01 08:26:0053636582.7522.00
317850.02010-12-01 08:26:0053636563.3920.34
417850.02010-12-01 08:26:0053636563.3920.34

RFM Analizi

Burada aşağıdaki işlemleri gerçekleştireceksiniz:

  • Recency için, her bir müşteri için bugünün tarihi ile son satın alma tarihi arasındaki gün sayısını hesaplayın.
  • Frequency için, her bir müşteri için sipariş sayısını hesaplayın.
  • Monetary için, her bir müşteri için satın alma tutarlarının toplamını hesaplayın.
rfm= uk_data.groupby('CustomerID').agg({'InvoiceDate': lambda date: (PRESENT - date.max()).days,
                                        'InvoiceNo': lambda num: len(num),
                                        'TotalPrice': lambda price: price.sum()})
rfm.columns
Index(['InvoiceDate', 'TotalPrice', 'InvoiceNo'], dtype='object')
# Change the name of columns rfm.columns=['recency', 'monetary', 'frequency'] 
rfm['recency'] = rfm['recency'].astype(int)
rfm.head()
 monetaryfrequencyrecency
CustomerID   
12346.032577183.601
12747.024196.01103
12748.0033719.734596
12749.034090.88199
12820.03942.3459

RFM Değerlerinin Çeyrekliklerinin Hesaplanması

En düşük recency, en yüksek frequency ve monetary tutarlarına sahip müşteriler en iyi müşteriler olarak kabul edilir.

qcut(), çeyreklik temelli ayrıştırma fonksiyonudur. qcut, veriyi örnek çeyrekliklerine göre kutulara yerleştirir. Örneğin, 4 çeyreklik için 1000 değer, her müşteri için çeyreklik üyeliğini belirten kategorik bir nesne üretir.

rfm['r_quartile'] = pd.qcut(rfm['recency'], 4, ['1','2','3','4'])
rfm['f_quartile'] = pd.qcut(rfm['frequency'], 4, ['4','3','2','1'])
rfm['m_quartile'] = pd.qcut(rfm['monetary'], 4, ['4','3','2','1'])
rfm.head()
 monetaryfrequencyrecencyr_quartilef_quartilem_quartile
CustomerID      
12346.032577183.601111
12747.024196.01103414
12748.0033719.734596414
12749.034090.88199414
12820.03942.3459324

RFM Sonuçlarının Yorumlanması

Üç çeyrekliği (r_quartile, f_quartile, m_quartile) tek bir sütunda birleştirin; bu sıralama, müşterileri iyi gruplamanıza yardımcı olacaktır.

rfm['RFM_Score'] = rfm.r_quartile.astype(str)+ rfm.f_quartile.astype(str) + rfm.m_quartile.astype(str)
rfm.head()
 monetaryfrequencyrecencyr_quartilef_quartilem_quartileRFM_Score
CustomerID       
12346.032577183.601111111
12747.024196.01103414414
12748.0033719.734596414414
12749.034090.88199414414
12820.03942.3459324324
# Filter out Top/Best cusotmers
rfm[rfm['RFM_Score']=='111'].sort_values('monetary', ascending=False).head()
 monetaryfrequencyrecencyr_quartilef_quartilem_quartileRFM_Score
CustomerID       
16754.03722002.42111111
12346.032577183.61111111
15749.023544534.310111111
16698.02261998.05111111
13135.01963096.01111111

Sonuç

Tebrikler, bu eğitimin sonuna geldiniz!

Bu eğitimde Müşteri Segmentasyonu hakkında birçok ayrıntıyı ele aldınız. Müşteri segmentasyonunun ne olduğunu, müşteri segmentasyonuna neden ihtiyaç duyulduğunu, segmentasyon türlerini, RFM analizini ve Python’da sıfırdan RFM uygulamasını öğrendiniz. Ayrıca pandas’ın yinelenenleri ele alma, groupby ve örnek çeyrekliklere dayalı kutular için qcut() gibi bazı temel kavramlarını da gördünüz.

Umarız artık kendi veri kümelerinizi analiz etmek için konu modellemeden yararlanabilirsiniz. Bu eğitimi okuduğunuz için teşekkürler!

Daha fazla Python öğrenmek isterseniz, DataCamp’in ücretsiz Intro to Python for Data Science kursunu alın.

Konular

İlgili