Sebuah perusahaan ingin berusaha untuk mengenal lebih baik pelanggan nya. Tujuannya agar perusahaan dapat membuat strategi pemasaran yang lebih tepat dan juga efisien bagi tiap tiap pelanggan. Untuk menyelesaikan masalah tersebut terdapat salah satu metode yang bisa dilakukan yaitu melakukan segmentasi pelanggan. Segmentasi Pelanggan adalah mengelompokkan pelanggan-pelanggan yang ada berdasarkan kesamaan karakter dari pelanggan tersebut. Untuk melakukan hal tersebut kamu akan menggunakan teknik clustering*.

Clustering adalah proses pembagian objek-objek ke dalam beberapa kelompok atau cluster berdasarkan tingkat kemiripan antara satu objek dengan yang lain. Salah satunya teknik clustering yang dapat digunakan adalah algoritma K-Prototypes, dimana algoritma K-Prototypes merupakan gabungan dari K-means dan juga K-modes. K-means itu sendiri biasa nya hanya digunakan untuk data-data yang bersifat numerik. Sedangkan untuk yang bersifat kategorikal saja, kita bisa menggunakan K-modes. Untuk dokumentasi lebih lanjut mengenail algoritma K-Prototypes bisa anda lihat disini.

Dataset

Dataset yang digunakan dalam pembahasan ini berasal dari https://dqlab-dataset.s3-ap-southeast-1.amazonaws.com/customer_segments.txt.

Data tersebut memiliki tujuh kolom dengan penjelasan sebagai berikut:

  • Customer ID: Kode pelanggan dengan format campuran teks CUST- diikuti angka
  • Nama Pelanggan: Nama dari pelanggan dengan format teks tentunya
  • Jenis Kelamin: Jenis kelamin dari pelanggan, hanya terdapat dua isi data kategori yaitu Pria dan Wanita
  • Umur: Umur dari pelanggan dalam format angka
  • Profesi: Profesi dari pelanggan, juga bertipe teks kategori yang terdiri dari Wiraswasta, Pelajar, Professional, Ibu Rumah Tangga, dan Mahasiswa.
  • Tipe Residen: Tipe tempat tinggal dari pelanggan kita, untuk dataset ini hanya ada dua kategori: Cluster dan Sector.
  • Nilai Belanja Setahun: Merupakan total belanja yang sudah di keluarkan oleh pelanggan tersebut.

Library

Masalah ini akan dapat di selesaikan dengan menggunakan bantuan library - library di bawah ini:

  • Pandas, di gunakan untuk melakukan pemrosesan analisis data
  • Matplotlib, di gunakan sebagai dasar untuk melakukan visualisasi data
  • Seaborn, di gunakan di atas matplotlib untuk melakukan data visualisasi yang lebih menarik
  • Scikit-Learn, digunakan untuk mempersiapkan data sebelum dilakukan permodelan
  • Kmodes, digunakan untuk melakukan permodelan menggunakan algoritma K-Modes dan K-Prototypes.
  • Pickle, digunakan untuk melakukan penyimpanan dari model yang akan di buat.

Library kmodes harus dinstall terlebih dahulu dengan cara berikut.

# Install kmodes
!pip install kmodes
Requirement already satisfied: kmodes in c:\users\feri\anaconda3\lib\site-packages (0.10.2)
Requirement already satisfied: scikit-learn>=0.19.0 in c:\users\feri\anaconda3\lib\site-packages (from kmodes) (0.23.2)
Requirement already satisfied: scipy>=0.13.3 in c:\users\feri\anaconda3\lib\site-packages (from kmodes) (1.5.2)
Requirement already satisfied: joblib>=0.11 in c:\users\feri\anaconda3\lib\site-packages (from kmodes) (0.17.0)
Requirement already satisfied: numpy>=1.10.4 in c:\users\feri\anaconda3\lib\site-packages (from kmodes) (1.19.2)
Requirement already satisfied: threadpoolctl>=2.0.0 in c:\users\feri\anaconda3\lib\site-packages (from scikit-learn>=0.19.0->kmodes) (2.1.0)
# Load library
import pandas as pd  
import matplotlib.pyplot as plt  
import seaborn as sns
from sklearn.preprocessing import StandardScaler  
from sklearn.preprocessing import LabelEncoder  
  
from kmodes.kmodes import KModes
from kmodes.kprototypes import KPrototypes  
  
import pickle  
from pathlib import Path 

import warnings
warnings.filterwarnings('ignore')

Load Dataset

Melakukan pembacaan dataset ke dalam bentuk dataframe, kemudian melihat preview data dan informasi data yang terbaca.

# Load file into dataframe 
df = pd.read_csv("data/customer_segments.txt", sep="\t")  
  
# Print first five rows
df.head()
Customer_ID Nama Pelanggan Jenis Kelamin Umur Profesi Tipe Residen NilaiBelanjaSetahun
0 CUST-001 Budi Anggara Pria 58 Wiraswasta Sector 9497927
1 CUST-002 Shirley Ratuwati Wanita 14 Pelajar Cluster 2722700
2 CUST-003 Agus Cahyono Pria 48 Professional Cluster 5286429
3 CUST-004 Antonius Winarta Pria 53 Professional Cluster 5204498
4 CUST-005 Ibu Sri Wahyuni, IR Wanita 41 Wiraswasta Cluster 10615206
# View info data
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 50 entries, 0 to 49
Data columns (total 7 columns):
 #   Column               Non-Null Count  Dtype 
---  ------               --------------  ----- 
 0   Customer_ID          50 non-null     object
 1   Nama Pelanggan       50 non-null     object
 2   Jenis Kelamin        50 non-null     object
 3   Umur                 50 non-null     int64 
 4   Profesi              50 non-null     object
 5   Tipe Residen         50 non-null     object
 6   NilaiBelanjaSetahun  50 non-null     int64 
dtypes: int64(2), object(5)
memory usage: 2.9+ KB

Terlihat tidak ditemukan missing values dan wrong format.

Exploratory Data Analysis

Proses eksplorasi data bisa berupa univariate maupun multivariate. Univariate Analysis melihat karakteristik tiap-tiap feature, misal nya dengan melihat statistik deskriptif, membuat histogram, kdeplot, count plot maupun boxplot. Sedangkan untuk Multivariate Analysis, kita melihat hubungan tiap variabel dengan variabel lainnya, misal kan dengan membuat korelasi matrix, melihat predictive power, cross tabulasi, dan lainnya. Disini kita akan melakukan univariate analysis terhadap kolom bertipe numerik dan kategorik.

EDA Numerical Data

Melakukan analisa distribusi data pada kolom bertipe numerik dengan menggunakan visualisasi boxplot dan histogram. Kolom yang bertipe numerik adalah Umur dan NilaiBelanjaSetahun.

# Setting canvas
sns.set(style='white')
  
# Function plotting numerical data
def observasi_num(features):  
    fig, axs = plt.subplots(2, 2, figsize=(10, 9))
    for i, kol in enumerate(features):
        sns.boxplot(df[kol], ax = axs[i][0])
        sns.distplot(df[kol], ax = axs[i][1])   
        axs[i][0].set_title('mean = %.2f\n median = %.2f\n std = %.2f'%
                         (df[kol].mean(), df[kol].median(), df[kol].std()))
    plt.tight_layout()
    plt.show()  

# Apply function
kolom_numerik = ['Umur','NilaiBelanjaSetahun'] 
observasi_num(kolom_numerik) 

png

EDA Categorical Data

Melakukan analisa distribusi data pada kolom bertipe kategorik dengan menggunakan visualisasi count plot. Kolom yang bertipe kategorik yaitu Jenis Kelamin, Profesi dan Tipe Residen.

# Define categorical column
kolom_kategorikal = ['Jenis Kelamin','Profesi','Tipe Residen']  

# Setting canvas
fig, axs = plt.subplots(3,1,figsize=(7,10)) 

# Plotting categorical data 
for i, kol in enumerate(kolom_kategorikal):  
    # Plotting data
    sns.countplot(df[kol], order = df[kol].value_counts().index, ax = axs[i])  
    axs[i].set_title('\nCount Plot %s\n'%(kol), fontsize=15)  
      
    # Create annotate  
    for p in axs[i].patches:  
        axs[i].annotate(format(p.get_height(), '.0f'),  
                        (p.get_x() + p.get_width() / 2., p.get_height()),  
                        ha = 'center',  
                        va = 'center',  
                        xytext = (0, 10),  
                        textcoords = 'offset points') 
          
    # Setting Plot  
    sns.despine(right=True,top = True, left = True)  
    axs[i].axes.yaxis.set_visible(False)
    plt.tight_layout()

plt.show()

png

Berdasarkan hasil visualisasi diatas diketahui bahwa:

  • Rata-rata dari umur pelanggan adalah 37.5 tahun.
  • Rata-rata dari nilai belanja setahun pelanggan adalah 7,069,874.82.
  • Jenis kelamin pelanggan di dominasi oleh wanita sebanyak 41 orang (82%) dan laki-laki sebanyak 9 orang (18%).
  • Profesi terbanyak adalah Wiraswasta (40%) diikuti dengan Professional (36%) dan lainnya sebanyak (24%).
  • Dari seluruh pelanggan 64% dari mereka tinggal di Cluster dan 36% nya tinggal di Sector.

Preprocessing Data

Setiap machine learning model memiliki karakteristik yang berbeda-beda. Hal ini membuat kita harus mempersiapkan data yang dimiliki sebelum digunakan untuk melakukan permodelan sehingga dapat menyesuaikan dengan karakteristik yang dimiliki oleh tiap model dan mendapatkan hasil yang optimal.

Kita akan melakukan permodelan dengan menggunakan teknik unsupervised clustering. Algoritma yang akan di gunakan adalah K-Prototypes. Salah satu faktor utama dalam algoritma ini adalah perlu menggunakan data yang skala antar variabel nya setara. Selain itu kita juga perlu melakukan pengkodean kolom-kolom kategorikal yang di miliki menjadi numerik.

Standardization

Tujuannya adalah agar data pada kolom bertipe numerik yang memiliki skala besar tidak mendominasi bagaimana cluster akan di bentuk dan juga tiap kolom akan dianggap sama pentingnya oleh algoritma yang akan digunakan.

# Define numerical columns 
kolom_numerik = ['Umur','NilaiBelanjaSetahun']  
  
# Statistics before standardization 
print('Statistik Sebelum Standardisasi\n')  
print(df[kolom_numerik].describe().round(1))  
  
# Standardization 
df_std = StandardScaler().fit_transform(df[kolom_numerik])  
df_std = pd.DataFrame(data=df_std, index=df.index, columns=df[kolom_numerik].columns)  
  
# Statistics after standardization
print('Statistik hasil standardisasi\n')  
print(df_std.describe().round(0)) 
# Print the result 
df_std.head()
Statistik Sebelum Standardisasi

       Umur  NilaiBelanjaSetahun
count  50.0                 50.0
mean   37.5            7069874.8
std    14.7            2590619.0
min    14.0            2722700.0
25%    25.0            5257529.8
50%    35.0            5980077.0
75%    49.8            9739615.0
max    64.0           10884508.0
Statistik hasil standardisasi

       Umur  NilaiBelanjaSetahun
count  50.0                 50.0
mean    0.0                 -0.0
std     1.0                  1.0
min    -2.0                 -2.0
25%    -1.0                 -1.0
50%    -0.0                 -0.0
75%     1.0                  1.0
max     2.0                  1.0
Umur NilaiBelanjaSetahun
0 1.411245 0.946763
1 -1.617768 -1.695081
2 0.722833 -0.695414
3 1.067039 -0.727361
4 0.240944 1.382421

Label Encoding

Merubah data pada kolom bertipe kategorikal menjadi angka dengan menggunakan salah satu fungsi dari sklearn yaitu LabelEncoder. Sebagai contoh untuk kolom Jenis Kelamin, data bernilai “Pria” akan diubah menjadi angka 0 dan “Wanita” akan di rubah menjadi angka 1.

# Define categorical columns  
kolom_kategorikal = ['Jenis Kelamin','Profesi','Tipe Residen']  
  
# Encoding categorical data 
df_encode = df[kolom_kategorikal].copy()   
for col in kolom_kategorikal:  
    df_encode[col] = LabelEncoder().fit_transform(df_encode[col])
      
# Print the result 
df_encode.head()
Jenis Kelamin Profesi Tipe Residen
0 0 4 1
1 1 2 0
2 0 3 0
3 0 3 0
4 1 4 0

Joining Dataframe

Hasil data dari proses standardization yaitu df_std dan proses label encoding yaitu df_encode akan digabung menjadi dataframe baru.

# Concatenate dataframe
df_model = pd.concat([df_encode, df_std], axis=1)
 
# Print new rows data
df_model.head()
Jenis Kelamin Profesi Tipe Residen Umur NilaiBelanjaSetahun
0 0 4 1 1.411245 0.946763
1 1 2 0 -1.617768 -1.695081
2 0 3 0 0.722833 -0.695414
3 0 3 0 1.067039 -0.727361
4 1 4 0 0.240944 1.382421

Hasil diatas adalah preview data setelah dilakukan preprocessing data.

K-Prototypes Clustering

Elbow Plot

Salah satu parameter penting yang harus dimasukkan pada algoritma K-Prototypes adalah jumlah cluster yang diinginkan. Oleh karena itu, kamu perlu mencari jumlah cluster yang optimal. Salah satu cara untuk mendapatkan nilai optimal tersebut adalah dengan menggunakan bantuan Elbow Plot. Caranya dengan memvisualisasikan total jarak seluruh data kita ke pusat cluster nya. Selanjutnya kita memilih titik siku dari pola yang terbentuk dan menjadikannya sebagai jumlah cluster optimal kita.

# Looping cost values using K-Prototypes  
cost = {}  
for k in range(2,10):  
    kproto = KPrototypes (n_clusters = k, random_state=75)  
    kproto.fit_predict(df_model, categorical=[0,1,2])  
    cost[k]= kproto.cost_

# Create elbow plot
sns.set_style('darkgrid')
sns.pointplot(x=list(cost.keys()), y=list(cost.values()))
plt.title('Elbow Plot')
plt.xlabel('Number of Cluster')
plt.ylabel('Cost')
plt.show()

png

Terlihat pada jumlah cluster = 5 adalah titik siku yang terbentuk dan akan digunakan sebagai jumlah cluster optimal untuk membuat model clustering kita. Model yang terbentuk akan disimpan yang nantinya akan digunakan kembali untuk memprediksi data baru.

# Setting n_clusters = 5
kproto = KPrototypes(n_clusters=5, random_state = 75)  
kproto = kproto.fit(df_model, categorical=[0,1,2])  
  
# Save Model  
pickle.dump(kproto, open('data/cluster.pkl', 'wb'))  

Selanjutnya melakukan prediksi terhadap data yang sudah dilakukan preprocessing kemudian menggabungkan dengan data asli nya.

# Predict cluster
clusters =  kproto.predict(df_model, categorical=[0,1,2])    
print('segmen pelanggan: {}\n'.format(clusters))    
    
# Add cluster data into raw data    
df_final = df.copy()    
df_final['Cluster'] = clusters
df_final.head()
segmen pelanggan: [1 2 4 4 0 3 1 4 3 3 4 4 1 1 0 3 3 4 0 2 0 4 3 0 0 4 0 3 4 4 2 1 2 0 3 0 3
 1 3 2 3 0 3 0 3 0 4 1 3 1]
Customer_ID Nama Pelanggan Jenis Kelamin Umur Profesi Tipe Residen NilaiBelanjaSetahun Cluster
0 CUST-001 Budi Anggara Pria 58 Wiraswasta Sector 9497927 1
1 CUST-002 Shirley Ratuwati Wanita 14 Pelajar Cluster 2722700 2
2 CUST-003 Agus Cahyono Pria 48 Professional Cluster 5286429 4
3 CUST-004 Antonius Winarta Pria 53 Professional Cluster 5204498 4
4 CUST-005 Ibu Sri Wahyuni, IR Wanita 41 Wiraswasta Cluster 10615206 0

Kita bisa melakukan segmentasi data pelanggan berdasarkan kelompok atau cluster nya

# Segmentation customer data by cluster 
for i in range(len(df_final['Cluster'].unique())):  
    print('Pelanggan cluster: {}'.format(i))  
    display(df_final[df_final['Cluster']== i])
    print('\n')
Pelanggan cluster: 0
Customer_ID Nama Pelanggan Jenis Kelamin Umur Profesi Tipe Residen NilaiBelanjaSetahun Cluster
4 CUST-005 Ibu Sri Wahyuni, IR Wanita 41 Wiraswasta Cluster 10615206 0
14 CUST-015 Shirley Ratuwati Wanita 20 Wiraswasta Cluster 10365668 0
18 CUST-019 Mega Pranoto Wanita 32 Wiraswasta Cluster 10884508 0
20 CUST-021 Lestari Fabianto Wanita 38 Wiraswasta Cluster 9222070 0
23 CUST-024 Putri Ginting Wanita 39 Wiraswasta Cluster 10259572 0
24 CUST-025 Julia Setiawan Wanita 29 Wiraswasta Sector 10721998 0
26 CUST-027 Grace Mulyati Wanita 35 Wiraswasta Cluster 9114159 0
33 CUST-034 Deasy Arisandi Wanita 21 Wiraswasta Sector 9759822 0
35 CUST-036 Ni Made Suasti Wanita 30 Wiraswasta Cluster 9678994 0
41 CUST-042 Yuliana Wati Wanita 26 Wiraswasta Cluster 9880607 0
43 CUST-044 Anna Wanita 18 Wiraswasta Cluster 9339737 0
45 CUST-046 Elfira Surya Wanita 25 Wiraswasta Sector 10099807 0
Pelanggan cluster: 1
Customer_ID Nama Pelanggan Jenis Kelamin Umur Profesi Tipe Residen NilaiBelanjaSetahun Cluster
0 CUST-001 Budi Anggara Pria 58 Wiraswasta Sector 9497927 1
6 CUST-007 Cahyono, Agus Pria 64 Wiraswasta Sector 9837260 1
12 CUST-013 Cahaya Putri Wanita 64 Wiraswasta Cluster 9333168 1
13 CUST-014 Mario Setiawan Pria 60 Wiraswasta Cluster 9471615 1
31 CUST-032 Chintya Winarni Wanita 47 Wiraswasta Sector 10663179 1
37 CUST-038 Agatha Salim Wanita 46 Wiraswasta Sector 10477127 1
47 CUST-048 Maria Hutagalung Wanita 45 Wiraswasta Sector 10390732 1
49 CUST-050 Lianna Nugraha Wanita 55 Wiraswasta Sector 10569316 1
Pelanggan cluster: 2
Customer_ID Nama Pelanggan Jenis Kelamin Umur Profesi Tipe Residen NilaiBelanjaSetahun Cluster
1 CUST-002 Shirley Ratuwati Wanita 14 Pelajar Cluster 2722700 2
19 CUST-020 Irene Novianto Wanita 16 Pelajar Sector 2896845 2
30 CUST-031 Eviana Handry Wanita 19 Mahasiswa Cluster 3042773 2
32 CUST-033 Cecilia Kusnadi Wanita 19 Mahasiswa Cluster 3047926 2
39 CUST-040 Irene Darmawan Wanita 14 Pelajar Sector 2861855 2
Pelanggan cluster: 3
Customer_ID Nama Pelanggan Jenis Kelamin Umur Profesi Tipe Residen NilaiBelanjaSetahun Cluster
5 CUST-006 Rosalina Kurnia Wanita 24 Professional Cluster 5215541 3
8 CUST-009 Elisabeth Suryadinata Wanita 29 Professional Sector 5993218 3
9 CUST-010 Mario Setiawan Pria 33 Professional Cluster 5257448 3
15 CUST-016 Bambang Rudi Pria 35 Professional Cluster 5262521 3
16 CUST-017 Yuni Sari Wanita 32 Ibu Rumah Tangga Cluster 5677762 3
22 CUST-023 Denny Amiruddin Pria 34 Professional Cluster 5239290 3
27 CUST-028 Adeline Huang Wanita 40 Ibu Rumah Tangga Cluster 6631680 3
34 CUST-035 Ida Ayu Wanita 39 Professional Sector 5962575 3
36 CUST-037 Felicia Tandiono Wanita 25 Professional Sector 5972787 3
38 CUST-039 Gina Hidayat Wanita 20 Professional Cluster 5257775 3
40 CUST-041 Shinta Aritonang Wanita 24 Ibu Rumah Tangga Cluster 6820976 3
42 CUST-043 Yenna Sumadi Wanita 31 Professional Cluster 5268410 3
44 CUST-045 Rismawati Juni Wanita 22 Professional Cluster 5211041 3
48 CUST-049 Josephine Wahab Wanita 33 Ibu Rumah Tangga Sector 4992585 3
Pelanggan cluster: 4
Customer_ID Nama Pelanggan Jenis Kelamin Umur Profesi Tipe Residen NilaiBelanjaSetahun Cluster
2 CUST-003 Agus Cahyono Pria 48 Professional Cluster 5286429 4
3 CUST-004 Antonius Winarta Pria 53 Professional Cluster 5204498 4
7 CUST-008 Danang Santosa Pria 52 Professional Cluster 5223569 4
10 CUST-011 Maria Suryawan Wanita 50 Professional Sector 5987367 4
11 CUST-012 Erliana Widjaja Wanita 49 Professional Sector 5941914 4
17 CUST-018 Nelly Halim Wanita 63 Ibu Rumah Tangga Cluster 5340690 4
21 CUST-022 Novita Purba Wanita 52 Professional Cluster 5298157 4
25 CUST-026 Christine Winarto Wanita 55 Professional Cluster 5269392 4
28 CUST-029 Tia Hartanti Wanita 56 Professional Cluster 5271845 4
29 CUST-030 Rosita Saragih Wanita 46 Ibu Rumah Tangga Sector 5020976 4
46 CUST-047 Mira Kurnia Wanita 55 Ibu Rumah Tangga Cluster 6130724 4

Selain itu kita juga melakukan visualisasi untuk melihat persebaran data hasil clustering agar dapat mempermudah melakukan penamaan di tiap-tiap cluster.

# Plotting distribution numerical data by cluster
for i in kolom_numerik:  
    plt.figure(figsize=(6,4))  
    ax = sns.boxplot(x = 'Cluster',y = i, data = df_final)  
    plt.title ('\nBox Plot {}\n'.format(i), fontsize=14, fontweight='bold')  
    plt.show() 

png

png

# Plotting distribution categorical data by cluster
for i in kolom_kategorikal:  
    plt.figure(figsize=(6,4))  
    ax = sns.countplot(data = df_final, x = 'Cluster', hue = i )  
    plt.title('\nCount Plot {}\n'.format(i), fontsize=14, fontweight='bold')  
    ax.legend(loc="upper center")  
    for p in ax.patches:  
        ax.annotate(format(p.get_height(), '.0f'),  
                    (p.get_x() + p.get_width() / 2., p.get_height()),  
                     ha = 'center',  
                     va = 'center',  
                     xytext = (0, 10),  
                     textcoords = 'offset points')  
      
    sns.despine(right=True,top = True, left = True)  
    ax.axes.yaxis.set_visible(False)  
    plt.show() 

png

png

png

Berdasarkan hasil visualisasi tersebut maka data pelanggan akan dikelompokkan sebagai berikut:

  • Cluster 0: Diamond Young Entrepreneur, isi cluster ini adalah para wiraswasta yang memiliki nilai transaksi rata-rata mendekati 10 juta. Selain itu isi dari cluster ini memiliki umur sekitar 18 - 41 tahun dengan rata-ratanya adalah 29 tahun.
  • Cluster 1: Diamond Senior Entrepreneur, isi cluster ini adalah para wiraswata yang memiliki nilai transaksi rata-rata mendekati 10 juta. Isi dari cluster ini memiliki umur sekitar 45 - 64 tahun dengan rata-ratanya adalah 55 tahun.
  • Cluster 2: Silver Students, isi cluster ini adalah para pelajar dan mahasiswa dengan rata-rata umur mereka adalah 16 tahun dan nilai belanja setahun mendekati 3 juta.
  • Cluster 3: Gold Young Member, isi cluster ini adalah para professional dan ibu rumah tangga yang berusia muda dengan rentang umur sekitar 20 - 40 tahun dan dengan rata-rata 30 tahun dan nilai belanja setahun nya mendekati 6 juta.
  • Cluster 4: Gold Senior Member, isi cluster ini adalah para professional dan ibu rumah tangga yang berusia tua dengan rentang umur 46 - 63 tahun dan dengan rata-rata 53 tahun dan nilai belanja setahun nya mendekati 6 juta.
# Create segment cluster 
df_final['Segment'] = df_final['Cluster'].map({  
    0: 'Diamond Young Member',  
    1: 'Diamond Senior Member',  
    2: 'Silver Member',  
    3: 'Gold Young Member',  
    4: 'Gold Senior Member'  
})  

df_final.head()
Customer_ID Nama Pelanggan Jenis Kelamin Umur Profesi Tipe Residen NilaiBelanjaSetahun Cluster Segment
0 CUST-001 Budi Anggara Pria 58 Wiraswasta Sector 9497927 1 Diamond Senior Member
1 CUST-002 Shirley Ratuwati Wanita 14 Pelajar Cluster 2722700 2 Silver Member
2 CUST-003 Agus Cahyono Pria 48 Professional Cluster 5286429 4 Gold Senior Member
3 CUST-004 Antonius Winarta Pria 53 Professional Cluster 5204498 4 Gold Senior Member
4 CUST-005 Ibu Sri Wahyuni, IR Wanita 41 Wiraswasta Cluster 10615206 0 Diamond Young Member

Hasil diatas adalah preview data setelah dilakukan penamaan segmen data pelanggan.

Predicting New Customer

Berdasarkan model yang telah dibuat sebelumnya kita akan menguji jika terdapat data pelanggan baru yang masuk. Sama seperti sebelumnya data baru akan dilakukan preprocessing terlebih dahulu.

Preprocessing New Data

Melakukan proses standarisasi untuk kolom numerik dan pengkodean label untuk kolom kategorikal.

# Create new data 
data = [{  
    'Customer_ID': 'CUST-100' ,  
    'Nama Pelanggan': 'Joko' ,  
    'Jenis Kelamin': 'Pria',  
    'Umur': 45,  
    'Profesi': 'Wiraswasta',  
    'Tipe Residen': 'Cluster' ,  
    'NilaiBelanjaSetahun': 8230000  
      
}]  
 
new_data = pd.DataFrame(data)  
new_data
Customer_ID Nama Pelanggan Jenis Kelamin Umur Profesi Tipe Residen NilaiBelanjaSetahun
0 CUST-100 Joko Pria 45 Wiraswasta Cluster 8230000
# Create function preprocessing data
def preprocessing_data(new_data):  
    # Encoding categorical data
    kolom_kategorikal = ['Jenis Kelamin', 'Profesi', 'Tipe Residen']
    encode_data = new_data[kolom_kategorikal].copy()  
  
    ## Jenis Kelamin   
    encode_data['Jenis Kelamin'] = encode_data['Jenis Kelamin'].map({  
        'Pria': 0,  
        'Wanita' : 1  
    })        
    ## Profesi  
    encode_data['Profesi'] = encode_data['Profesi'].map({  
        'Ibu Rumah Tangga': 0,  
        'Mahasiswa' : 1,  
        'Pelajar': 2,  
        'Professional': 3,  
        'Wiraswasta': 4  
    })    
    ## Tipe Residen  
    encode_data['Tipe Residen'] = encode_data['Tipe Residen'].map({  
        'Cluster': 0,  
        'Sector' : 1  
    })  
      
    # Standardization numerical data
    kolom_numerik = ['Umur','NilaiBelanjaSetahun']  
    scale_data = new_data[kolom_numerik].copy()  
      
    ## Umur  
    scale_data['Umur'] = (scale_data['Umur'] - 37.5)/14.7        
    ## Nilai Belanja Setahun  
    scale_data['NilaiBelanjaSetahun'] = (scale_data['NilaiBelanjaSetahun'] - 7069874.8)/2590619.0  
      
    # Joining categorical and numerical data
    model_data = pd.concat([encode_data, scale_data], axis=1)
     
    return model_data 
  
# Preprocessing new data 
fix_data = preprocessing_data(new_data)  
fix_data
Jenis Kelamin Profesi Tipe Residen Umur NilaiBelanjaSetahun
0 0 4 0 0.510204 0.447818

Setelah melakukan preprocessing terhadap data baru, maka selanjutnya memprediksi data tersebut termasuk dalam cluster mana atau segmen apa.

# Function clustering new data
def clustering_data(new_data):       
    # Open Model  
    model = pickle.load(open('data/cluster.pkl', 'rb'))        
    # Predict new data
    pred = model.predict(new_data, categorical=[0,1,2])  
      
    return pred  
# Function segmentation new data
def segmentation(new_data, pred_cluster):     
    # Add cluster to new column
    new_data['Cluster'] = pred_cluster
      
    # Choosing Segment
    new_data['Segment'] = new_data['Cluster'].map({  
        0: 'Diamond Young Member',  
        1: 'Diamond Senior Member',  
        2: 'Silver Students',  
        3: 'Gold Young Member',  
        4: 'Gold Senior Member'  
    })  
      
    return new_data
# Predicting new customer
pred_cluster = clustering_data(fix_data) 
result = segmentation(new_data, pred_cluster)  
result
Customer_ID Nama Pelanggan Jenis Kelamin Umur Profesi Tipe Residen NilaiBelanjaSetahun Cluster Segment
0 CUST-100 Joko Pria 45 Wiraswasta Cluster 8230000 1 Diamond Senior Member

Hasil diatas adalah prediksi cluster atau segmen data pelanggan baru.