Analisis Segmentasi Pelanggan

Segmentasi pelanggan merupakan kegiatan mengelompokkan pelanggan menjadi beberapa kelompok berbeda berdasarkan karakteristik umum seperti usia, gender, penghasilan tahunan, tempat tinggal, frekuensi pembelian, dan lainnya. Hasil dari analisis segmentasi pasar ini akan sangat berguna bagi pelaku bisnis dalam menentukan kebijakan berdasarkan karakter tiap-tiap segmen pelanggan. Sebagai contoh: Hasil analisis segmentasi pelanggan Mall X merepresentasikan bahwa segmen terbesarnya adalah kelompok wanita di rentang usia 25–35 tahun, dengan penghasilan tahunan relatif paling tinggi daripada segmen lainnya. Kira-kira apa yang sebaiknya Mall X lakukan?

Mungkin saya akan usulkan pengadaan produk baru (yang sebelumnya tidak dijual di Mall X) yang banyak digunakan oleh masyarakat dengan karakter segmen ini. Selain itu, Mall X mungkin juga dapat mencoba menaikkan harga produk (yang sering dibeli segmen ini) sedikit demi sedikit, mengingat income tahunan segmen ini paling tinggi di sini? Hehehe. Pokoknya, cukup banyak manfaat dari segmentasi pasar, itu semua tergantung bagaimana perusahaan memanfaatkan data yang dimiliki info untuk strategi bisnisnya.

Pada tulisan ini, akan dilakukan segmentasi/clustering, oleh karena itu algoritma yang cocok untuk project ini adalah algoritma unsupervised learning seperti dibahas di tulisan sebelumnya. Algoritma yang akan digunakan pada tulisan ini adalah K-Means Clustering.

  1. Prepare the Datasets

Pada project ini saya menggunakan google colaboratory (mager install-install hehe), jadi berikut code yang digunakan untuk import dataset ke notebook sekaligus membacanya ke dalam DataFrame Pandas. Adapun dataset yang saya gunakan berasal dari Kaggle di sini. Dataset yang saya gunakan ini adalah dataset yang sengaja di-publish untuk keperluan pembelajaran.
P.S. karena saya masih serba belum mengetahui dan kata Aristotle “The more you know, the more you realize you don’t know.” maka import library akan saya lakukan tepat sebelum ia akan digunakan supaya lebih mengerti. Namun yang saya lihat untuk kalangan professional semua perintah import library dilakukan di cell paling awal notebook.

Setelah import dataset, dimasukkan perintah df untuk mencetak dataframe tadi. Di sini dapat dilihat bahwa dataset kita terdiri dari 5 kolom, dimana kolom pertama (CustomerID) sudah kita set untuk menjadi kolom indeks di perintah sebelumnya.

Adapun keterangan singkat dari tiap-tiap kolom:

  • Customer ID merupakan angka khusus yang digunakan sebagai representasi dari tiap-tiap customer (pelanggan). Sehingga tiap customer memiliki ID nya sendiri-sendiri dan berbeda satu sama lain. Dari print tabel di atas dapat diketahui bahwa terdapat 200 pelanggan dalam dataset pelanggan mall ini,
  • Gender/jenis kelamin. Di dataset ini terdapat dua jenis gender saja yaitu Male (laki-laki) dan Female (perempuan).
  • Age: umur (dalam tahun)
  • Annual Income (Pendapatan tahunan) dalam satuan ribu dolar.
  • Spending score. Merupakan angka integer (1–100) yang ditentukan oleh pihak mall berdasarkan sifat, behaviour, dan kebiasaan belanja dari tiap-tiap pelanggan. Makin tinggi nilainya berarti makin bagus nilai yang diberikan pihak mall terhadap pelanggan tersebut.

Tambahan: Sebelum dilanjutkan, saya memastikan terlebih dahulu apakah data pada dataset ini ada yang miss atau tidak dengan perintah df.isnull().any().any()

2. Getting to Know the Dataset More and More
Selanjutnya saya ingin melihat beberapa nilai statistik dasar dari data Mall Customer ini. Perintah ini dapat diberikan menggunakan df.describe()

Dari tabel di atas saya memperoleh beberapa hal sebagai pegangan informasi dasar dalam mengolah data lebih lanjut. Informasi menarik (menurut saya) antara lain:

  • Rata-rata usia pelanggan mall ini adalah sekitar 39 tahun dengan usia paling muda adalah 18 tahun dan yang paling tua 70 tahun!
  • Rata-rata pendapatan tahunan pelanggan adalah 60,560 $ dengan pendapatan paling rendah 15000$ dan paling tinggi 137000$
  • Spending score tiap pelanggan bervariasi dari 1 hingga 99 (tidak ada yang dapat nilai sempurna) dengan nilai rata-rata 50,2.

Berbekal informasi dasar sebelumnya, saya tertarik untuk mengetahui persebaran jumlah masing-masing data tadi. Oleh karena itu saya memanfaatkan fitur countplot yang telah tersedia di library seaborn.

Output:

Beberapa informasi yang saya peroleh:

  • 56% pelanggan mall adalah perempuan
  • Pelanggan berusia 32 tahun jumlahnya cukup jauh lebih banyak dari usia lainnya
  • Pendapatan tahunan pelanggan hanya terdiri dari empat variasi, dengan pelanggan berpendapatan 54.000$ dan 77.000$ memiliki frekuensi terbanyak diantara pelanggan lainnya.

Dari visualisasi data di atas saya memang memperoleh informasi tambahan yang menurut saya cukup berguna. Menurut saya, karena tidak ada data tertentu dengan frekuensi yang ‘aneh’ atau ‘sangat banyak’, maka lebih baik visualisasi untuk data Age, Income, dan Spending Score ditampilkan dalam bentuk plot distribusinya saja dengan fungsi distplot. Berbeda bila ternyata terdapat satu data tertentu dengan jumlah frekuensi melambung tinggi daripada yang lainnya, maka menurut saya ‘frekuensi tinggi’ tersebut butuh ‘perhatian khusus’ dari kita sebagai pihak Mall.

Output:

Beberapa informasi yang saya peroleh dari sini:

  • Pelanggan paling banyak berusia 30–40 tahun. Dari hasil analisis sebelumnya, diperoleh usia rata-rata pelanggan adalah 39 tahun, dan pelanggan paling banyak adalah pelanggan berusia 32 tahun. Make sense berarti ya.
  • Pelanggan paling banyak berpendapatan tahunan 60.000–80.000$
  • Spending score 40–60 merupakan nilai yang paling banyak dimiliki pelanggan, cukup berada di sekitar nilai rata-rata spending score keseluruhan pelanggan.

Dari informasi-informasi di atas, sebenarnya dapat dilakukan analisis lebih mendalam lagi terhadap nilai-nilai parameter lainnya. Contohnya, seberapa berpengaruh nilai pendapatan terhadap spending score pelanggan? Berapa usia rata-rata pelanggan dengan pendapatan dan spending score tinggi? Siapa yang memiliki nilai spending score lebih tinggi, pria atau wanita?

Mungkin beberapa pertanyaan-pertanyaan ini akan terjawab di tulisan ini karena berkaitan dengan tujuan akhir dari tulisan ini (segmentasi pelanggan). Namun beberapa pertanyaan sisanya mungkin tak akan terjawab di tulisan ini, jadi jangan berharap terlalu tinggi.

3. Set the Data
Seperti yang telah dibahas di atas, dataset ini terdiri dari 5 kolom dengan masing-masing kolom merepresentasikan parameter tertentu seorang pelanggan. Kolom pertama merupakan kolom index yang sekaligus merepresentasikan ID tiap customer. Dalam analisis segmentasi ini, saya hanya akan menggunakan data Age, Income, dan Spending Score saja. (Saya sudah mencoba menggunakan data gender juga dalam analisis, akan tetapi menurut saya sulit untuk memperoleh hasil segmentasi yang optimal, akan saya jelaskan di bawah). Oleh karena itu, mula-mula dilakukan copy data (tanpa data gender) ke DataFrame baru. Tujuannya, agar tetap memiliki dataframe yang asli untuk kebutuhan analisis lainnya atau kebutuhan tak terduga lainnya.

4. Standardize the Data
Step selanjutnya adalah melakukan standardisasi data. Step ini diperlukan untuk menghindari bias sehingga tiap data memiliki skala dan satuan yang sebanding. Pada tulisan ini digunakan StandardScaller untuk standardisasi data, jujur saja saat menulis tulisan ini saya belum tahu lebih dalam alasannya. Informasi yang saya tahu, untuk melakukan K-Means Clustering disarankan untuk menggunakan StandardScaler. Hal ini karena K-Means sensitif terhadap nilai varians dan algoritma StandardScaler adalah algoritma yang sejauh ini paling cocok dengan requirements tersebut.

5. Menentukan Jumlah Cluster
Untuk menentukan jumlah cluster pertama saya menggunakan Elbow Method.

Perintah di atas akan memberikan grafik plot nilai wcss pada tiap nilai jumlah cluster (2–10). WCSS (Within Cluster Sum of Squares) pada dasarnya merupakan jumlah dari jarak kuadrat antara setiap anggota kluster terhadap centroid-nya. Jadi semakin besar nilai wcss maka jarak anggota kluster ke centroid semakin besar pula, menyebabkan jumlah klusternya menjadi lebih sedikit. Nilai n_cluster=1 berarti semua dataset berada dalam satu kluster dan wcss pasti semakin besar, begitu pula sebaliknya.

Dengan grafik Elbow ini, untuk memperoleh nilai jumlah kluster yang optimal dipilih nilai n_cluster dimana kurva mulai bengkok dan melandai seperti elbow (siku lengan). Pada gambar di atas, saya tidak yakin apakah nilai optimalnya 4 atau 6. Oleh karena itu saya mencoba metode lain dalam menentukan jumlah cluster yaitu Silhouette Analysis.

Nilai silhouette score merepresentasikan jarak antar tiap kluster yang dihasilkan. Nilai +1 menunjukkan bahwa suatu sampel pada suatu kluster ‘jauh’ dari kluster lainnya. Nilai 0 menunjukkan bahwa suatu sampel berada pada atau sangat dekat dengan decision boundary dua kluster yang berdekatan. Sehingga, jumlah cluster yang paling baik adalah jumlah kluster yang menghasilkan silhouette score paling tinggi. Dari analisis ini, diperoleh output sebagai berikut.

Dari output di atas, diperoleh nilai silhouette score paling tinggi adalah n_cluster = 6 . Karena dengan metode Elbow sebelumnya nilai n_cluster antara 4 atau 6, maka dipilih nilai n_cluster = 6 untuk kasus ini.

Pada step 3 sebelumnya saya mengatakan bahwa alasan saya tidak memasukkan data gender ke analisis ini adalah karena sulit menemukan hasil segmentasi yang optimal. Pada step kelima ini, ketika saya menggunakan data gender (yang telah di-convert bentuknya ke integer) baik ketika menggunakan Elbow Method ataupun Silhouette Analysis saya tidak memperoleh nilai n_cluster yang optimal. Ketika menggunakan Elbow Method, kurva yang dihasilkan tidak memiliki elbow yang cukup tajam. Selanjutnya ketika menggunakan Silhouette Analysis, silhouette score yang dihasilkan terus naik seiring dengan bertambahnya jumlah kluster (saya mencoba hingga 20 kluster). Sehingga saya pikir data gender ini memang dalam kasus ini sebaiknya tidak di-include dalam analisis segmentasi karena dapat menimbulkan bias.

6. Clustering
Langkah selanjutnya adalah melakukan clustering. Di tulisan ini clustering dilakukan menggunakan K-Means Clustering, dengan menggunakan nilai n_cluster yang telah ditentukan pada step 5.

7. Result
Hasil clustering saya tampilkan dalam bentuk tabel dengan isi tabel berupa nilai rata-rata tiap feature/parameter pada segmen tersebut, dan dikelompokkan berdasarkan kluster yang telah dibuat. Selain itu, saya menambahkan dua kolom baru berupa Frequency dan Percentage untuk menampilkan jumlah dan persentasi pelanggan pada kluster tersebut.

Dari hasil segmentasi di atas, saya mencoba membuat visualisasinya dalam tiga dimensi:

8. Analisis
Dari hasil clustering di atas dapat dilihat bahwa kluster dengan jumlah pelanggan terbanyak adalah segmen 4. Segmen 1 dan 5 memiliki jumlah member yang hampir sama, dan segmen 0 memiliki anggota paling sedikit yaitu 21 orang. Beberapa karakter, julukan untuk tiap segmen, dan kesimpulan yang saya ambil antara lain:

  • Segmen 0 memiliki rata-rata spending score kecil, annual income relatif kecil dibanding segmen lainnya, dan usia rata-rata 45 tahun. Fewer opportunity
  • Segmen 1 rata-rata spending score paling tinggi dibanding segmen lainnya. Annual income relatif tinggi dibanding lainnya. Good opportunity. Dengan karakter ini dan jumlah anggota klusternya yang relatif tinggi, segmen ini merupakan target market yang paling baik. Produk yang cocok untuk segmen ini adalah produk-produk orang dewasa usia 32 tahunan. Saya pikir melakukan pengadaan produk baru yang sering dibeli oleh masyarakat dengan karakter segmen ini adalah ide yang dapat dipertimbangkan. Perubahan harga produk (yang masih rasional dan sesuai dengan kualitas produk tentunya) tidak akan terlalu mempengaruhi daya beli dan daya tarik segmen ini.
  • Segmen 2 memiliki rata-rata pendapatan tinggi dibanding segmen lainnya, tetapi nilai spending score-nya paling rendah. Usia rata-rata segmen ini sedikit di atas rata-rata (41 tahun). Thrifty people. Trick promo produk beli 1 gratis 1 mungkin dapat merangsang daya tarik anggota segmen untuk memberikan lebih banyak penghasilan mereka (yang relatif paling tinggi daripada segmen lainnya) untuk berbelanja. No offense please.
  • Segmen 3 rata-rata merupakan orang-orang muda dengan penghasilan rendah (paling rendah dibandingkan lainnya) tetapi dengan nilai spending score cukup tinggi di atas rata-rata (rata-rata spending score 50,2 dari analisis sebelumnya). Consumptive young people 😮. Produk-produk dengan harga relatif murah merupakan produk yang baik untuk mempertahankan segmen ini.
  • Segmen 4 merupakan segmen dengan jumlah anggota paling banyak dengan spending score dan annual income sedang (mendekati rata-rata) dan usia di atas rata-rata (usia rata-rata = 30–40 tahun). Standard old people.
  • Segmen 5 merupakan segmen dengan spending score dan pendapatan sedang tetapi usia rata-rata membernya adalah anak muda usia 26 tahunan. Standard young people. Karakter segmen ini secara keseluruhan hampir sama dengan segmen 4, hanya saja segmen ini banyak terdiri dari masyarakat usia lebih muda. Kedua segmen terakhir ini (segmen 4 dan 5) merupakan segmen standar yang menurut saya harus dapat dipertahankan oleh pihak Mall. Tidak ada salahnya untuk mencoba memperkenalkan produk baru ke segmen ini (tentu saja produk yang sesuai dengan karakter usia mereka). Namun perlu diperhatikan bahwa mungkin penetapan dan sedikit perubahan harga produk yang segmen ini beli dapat mempengaruhi daya beli mereka.

NOTE:
Untuk melengkapi visualisasi hasil segmentasi, dilakukan rename nama kluster sesuai dengan karakteristik masing-masing

Sehingga hasil akhir segmentasi berdasarkan karakteristiknya:

Hasil segmentasi di atas mungkin dapat dijadikan insight tambahan bagi pihak Mall dalam mengembangkan bisnisnya (jika memang Mall ini ada). Tentunya masih banyak lagi informasi yang dapat diperoleh dari dataset ini. Namun karena tujuan akhir dari tulisan ini adalah segmentasi pelanggan, maka tulisan ini cukup sampai di sini 👌. Tidak lupa, semua kritik dan saran akan didengar! Dan semoga hari Anda menyenangkan!

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store