Lewati ke konten utama

Pengantar Segmentasi Pelanggan di Python

Dalam tutorial ini, Anda akan mempelajari cara mengimplementasikan segmentasi pelanggan menggunakan analisis RFM (Recency, Frequency, Monetary) dari nol di Python.
· 8 mnt Baca

Jelajahi bersama AI

Di sektor Ritel, berbagai jaringan hipermarket menghasilkan jumlah data yang sangat besar. Data ini dihasilkan setiap hari di seluruh gerai. Basis data transaksi pelanggan yang luas ini perlu dianalisis untuk merancang strategi yang menguntungkan.

Setiap pelanggan memiliki kebutuhan yang berbeda-beda. Seiring bertambahnya basis pelanggan dan transaksi, tidak mudah memahami kebutuhan masing-masing pelanggan. Mengidentifikasi pelanggan potensial dapat meningkatkan kampanye pemasaran, yang pada akhirnya menaikkan penjualan. Segmentasi dapat berperan lebih baik dalam mengelompokkan pelanggan ke dalam berbagai segmen.

Apa itu Segmentasi Pelanggan?

Segmentasi pelanggan adalah metode membagi pelanggan ke dalam kelompok atau klaster berdasarkan karakteristik yang sama. Peneliti pasar dapat membagi pelanggan dalam model B2C menggunakan berbagai karakteristik demografis pelanggan seperti pekerjaan, jenis kelamin, usia, lokasi, dan status pernikahan. Karakteristik psikografis seperti kelas sosial, gaya hidup, dan kepribadian serta karakteristik perilaku seperti pola belanja, kebiasaan konsumsi, penggunaan produk/layanan, dan produk yang pernah dibeli. Dalam model B2B menggunakan berbagai karakteristik perusahaan seperti ukuran perusahaan, jenis industri, dan lokasi.

chart

Kebutuhan Segmentasi Pelanggan

  • Membantu mengidentifikasi pelanggan paling potensial.
  • Memudahkan manajer berkomunikasi dengan kelompok audiens yang ditargetkan.
  • Juga membantu memilih media terbaik untuk berkomunikasi dengan segmen yang ditargetkan.
  • Meningkatkan kualitas layanan, loyalitas, dan retensi.
  • Memperbaiki hubungan pelanggan melalui pemahaman kebutuhan setiap segmen.
  • Menyediakan peluang untuk upselling dan cross-selling.
  • Membantu manajer merancang penawaran khusus bagi pelanggan yang ditargetkan untuk mendorong pembelian lebih banyak produk.
  • Membantu perusahaan selangkah lebih maju dari pesaing.
  • Membantu pula mengidentifikasi produk baru yang mungkin diminati pelanggan.

Jenis-jenis Segmentasi

jenis segmentasi

Segmentasi Pelanggan dengan analisis RFM

Analisis RFM (Recency, Frequency, Monetary) adalah pendekatan berbasis perilaku untuk mengelompokkan pelanggan ke dalam segmen. Ini mengelompokkan pelanggan berdasarkan transaksi pembelian sebelumnya. Seberapa baru, seberapa sering, dan seberapa banyak pelanggan berbelanja. RFM menyaring pelanggan ke dalam berbagai kelompok untuk tujuan layanan yang lebih baik. Ini membantu manajer mengidentifikasi pelanggan potensial untuk bisnis yang lebih menguntungkan. Ada segmen pelanggan yang pemboros besar, tetapi bagaimana jika mereka hanya membeli sekali atau seberapa baru mereka membeli? Apakah mereka sering membeli produk kita? Selain itu, ini membantu manajer menjalankan kampanye promosi yang efektif untuk layanan yang dipersonalisasi.

  • Recency (R): Siapa yang membeli baru-baru ini? Jumlah hari sejak pembelian terakhir (recency paling kecil)
  • Frequency (F): Siapa yang membeli dengan frekuensi tinggi? Artinya total jumlah pembelian (frekuensi tinggi)
  • Monetary Value (M): Siapa yang memiliki nilai pembelian tinggi? Artinya total uang yang dibelanjakan pelanggan (nilai moneter tinggi)

Di sini, masing-masing dari tiga variabel (Recency, Frequency, dan Monetary) terdiri dari empat kelompok yang sama besar, yang menghasilkan 64 (4x4x4) segmen pelanggan berbeda.

Langkah-langkah RFM (Recency, Frequency, Monetary):

  1. Hitung nilai Recency, Frequency, Monetary untuk setiap pelanggan.
  2. Tambahkan nilai bin segmen ke tabel RFM menggunakan kuartil.
  3. Urutkan skor RFM pelanggan secara menaik.

1. Hitung nilai Recency, Frequency, Monetary untuk setiap pelanggan.

Nilai Recency, Frequency, Monetary

2. Tambahkan nilai bin segmen ke tabel RFM menggunakan kuartil.

nilai bin segmen pada tabel RFM

3. Gabungkan semua skor dalam satu kolom (RFM_Score).

semua skor dalam satu kolom

Identifikasi Segmen Pelanggan Potensial menggunakan RFM di Python

Mengimpor Pustaka yang Diperlukan

#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

Memuat Dataset

Mari kita muat terlebih dahulu dataset HR yang diperlukan menggunakan fungsi read CSV dari pandas. Anda dapat mengunduh datanya dari tautan ini.

data = pd.read_excel("Online_Retail.xlsx")
data.head()
dataset 1
data.tail()
dataset 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'])]

Menghapus Duplikasi

Terkadang Anda mendapatkan dataset yang berantakan. Anda mungkin harus menangani duplikasi, yang akan mengacaukan analisis. Dalam python, pandas menyediakan fungsi drop_duplicates(), yang menghapus catatan yang berulang atau duplikat.

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

Mari Masuk ke Insight Data

#Top ten country's customer
filtered_data.Country.value_counts()[:10].plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0x7fd81725dfd0>
insight data

Pada dataset yang diberikan, Anda dapat melihat sebagian besar pelanggan berasal dari "United Kingdom". Jadi, Anda dapat memfilter data untuk pelanggan United Kingdom.

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

Fungsi describe() di pandas memudahkan untuk mendapatkan berbagai statistik ringkas. Fungsi ini mengembalikan jumlah, rata-rata, simpangan baku, nilai minimum dan maksimum, serta kuantil data.

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

Di sini, Anda dapat melihat sebagian pelanggan memesan dengan kuantitas negatif, yang tidak mungkin. Jadi, Anda perlu memfilter Quantity yang lebih besar dari nol.

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

Saring Kolom yang Diperlukan

Di sini, Anda dapat menyaring kolom yang diperlukan untuk analisis RFM. Anda hanya membutuhkan lima kolom: CustomerID, InvoiceDate, InvoiceNo, Quantity, dan UnitPrice. CustomerID akan mendefinisikan pelanggan secara unik, InvoiceDate membantu Anda menghitung recency pembelian, InvoiceNo membantu Anda menghitung berapa kali transaksi dilakukan (frekuensi). Quantity yang dibeli di setiap transaksi dan UnitPrice dari setiap unit yang dibeli pelanggan akan membantu Anda menghitung total nilai pembelian.

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

Analisis RFM

Di sini, Anda akan melakukan operasi berikut:

  • Untuk Recency, hitung jumlah hari antara tanggal saat ini dan tanggal pembelian terakhir tiap pelanggan.
  • Untuk Frequency, hitung jumlah pesanan untuk tiap pelanggan.
  • Untuk Monetary, hitung jumlah total harga pembelian untuk tiap pelanggan.
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

Menghitung Kuantil dari nilai RFM

Pelanggan dengan recency terendah, serta frequency dan monetary tertinggi dianggap sebagai pelanggan teratas.

qcut() adalah fungsi diskretisasi berbasis kuantil. qcut membagi data berdasarkan kuantil sampel. Misalnya, 1000 nilai untuk 4 kuantil akan menghasilkan objek kategorikal yang menunjukkan keanggotaan kuantil untuk setiap pelanggan.

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

Interpretasi Hasil RFM

Gabungkan ketiga kuartil (r_quartile, f_quartile, m_quartile) dalam satu kolom; peringkat ini akan membantu Anda mensegmentasi pelanggan dengan baik.

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

Kesimpulan

Selamat, Anda telah sampai di akhir tutorial ini!

Dalam tutorial ini, Anda telah membahas banyak detail tentang Segmentasi Pelanggan. Anda telah mempelajari apa itu segmentasi pelanggan, kebutuhan akan Segmentasi Pelanggan, jenis-jenis Segmentasi, analisis RFM, implementasi RFM dari nol di python. Anda juga membahas beberapa konsep dasar pandas seperti menangani duplikasi, groupby, dan qcut() untuk bin berdasarkan kuantil sampel.

Semoga sekarang Anda dapat memanfaatkan pemodelan topik untuk menganalisis dataset Anda sendiri. Terima kasih telah membaca tutorial ini!

Jika Anda ingin mempelajari lebih lanjut tentang Python, ikuti kursus gratis DataCamp Intro to Python for Data Science.

Topik

Terkait

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026