Panduan Definitif untuk Pengelompokan Hirarki dengan Python dan Scikit-Learn PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.

Panduan Definitif untuk Pengelompokan Hirarki dengan Python dan Scikit-Learn

Pengantar

Dalam panduan ini, kami akan fokus pada penerapan Algoritma Pengelompokan Hirarki dengan Scikit-Learn untuk memecahkan masalah pemasaran.

Setelah membaca panduan ini, Anda akan memahami:

  • Kapan harus menerapkan Pengelompokan Hirarki
  • Bagaimana memvisualisasikan kumpulan data untuk memahami apakah itu cocok untuk pengelompokan
  • Cara melakukan pra-proses fitur dan merekayasa fitur baru berdasarkan kumpulan data
  • Cara mengurangi dimensi dataset menggunakan PCA
  • Cara menggunakan dan membaca dendrogram untuk memisahkan grup
  • Apa perbedaan metode penautan dan metrik jarak yang diterapkan pada dendrogram dan algoritme pengelompokan?
  • Apa strategi pengelompokan aglomeratif dan memecah belah dan bagaimana cara kerjanya?
  • Bagaimana menerapkan Pengelompokan Hirarki Agglomerative dengan Scikit-Learn
  • Apa masalah yang paling sering terjadi ketika berhadapan dengan algoritma pengelompokan dan bagaimana menyelesaikannya?

Catatan: Anda dapat mengunduh buku catatan yang berisi semua kode dalam panduan ini di sini.

Motivasi

Bayangkan sebuah skenario di mana Anda adalah bagian dari tim ilmu data yang berinteraksi dengan departemen pemasaran. Pemasaran telah mengumpulkan data belanja pelanggan untuk sementara waktu, dan mereka ingin memahami, berdasarkan data yang dikumpulkan, jika ada kesamaan antara pelanggan. Kesamaan tersebut membagi pelanggan menjadi beberapa grup dan memiliki grup pelanggan membantu dalam penargetan kampanye, promosi, konversi, dan membangun hubungan pelanggan yang lebih baik.

Apakah ada cara Anda dapat membantu menentukan pelanggan mana yang serupa? Berapa banyak dari mereka yang termasuk dalam kelompok yang sama? Dan ada berapa kelompok yang berbeda?

Salah satu cara untuk menjawab pertanyaan tersebut adalah dengan menggunakan kekelompokan algoritma, seperti K-Means, DBSCAN, Hierarchical Clustering, dll. Secara umum, algoritma clustering menemukan kesamaan antara titik data dan mengelompokkannya.

Dalam hal ini, data pemasaran kami cukup kecil. Kami memiliki informasi tentang hanya 200 pelanggan. Mempertimbangkan tim pemasaran, penting bagi kami untuk dapat menjelaskan dengan jelas kepada mereka bagaimana keputusan dibuat berdasarkan jumlah cluster, oleh karena itu menjelaskan kepada mereka bagaimana sebenarnya algoritme bekerja.

Karena data kami kecil dan penjelasan adalah faktor utama, kita dapat memanfaatkan Pengelompokan Hierarki untuk memecahkan masalah ini. Proses ini juga dikenal sebagai Analisis Pengelompokan Hirarki (HCA).

Salah satu keuntungan dari HCA adalah dapat diinterpretasikan dan bekerja dengan baik pada kumpulan data kecil.

Hal lain yang perlu dipertimbangkan dalam skenario ini adalah bahwa HCA adalah tidak diawasi algoritma. Saat mengelompokkan data, kami tidak akan memiliki cara untuk memverifikasi bahwa kami mengidentifikasi dengan benar bahwa pengguna termasuk dalam grup tertentu (kami tidak mengetahui grup tersebut). Tidak ada label bagi kami untuk membandingkan hasil kami. Jika kami mengidentifikasi grup dengan benar, grup tersebut nantinya akan dikonfirmasi oleh departemen pemasaran setiap hari (sebagaimana diukur dengan metrik seperti ROI, tingkat konversi, dll.).

Sekarang kita telah memahami masalah yang kita coba pecahkan dan bagaimana menyelesaikannya, kita dapat mulai melihat data kita!

Analisis Data Eksplorasi Singkat

Catatan: Anda dapat mengunduh kumpulan data yang digunakan dalam panduan ini di sini.

Setelah mengunduh kumpulan data, perhatikan bahwa itu adalah CSV (nilai yang dipisahkan koma) file bernama shopping-data.csv. Untuk memudahkan penjelajahan dan manipulasi data, kami akan memuatnya ke dalam a DataFrame menggunakan Panda:

import pandas as pd


path_to_file = 'home/projects/datasets/shopping-data.csv'
customer_data = pd.read_csv(path_to_file)

Pemasaran mengatakan telah mengumpulkan 200 catatan pelanggan. Kami dapat memeriksa apakah data yang diunduh lengkap dengan 200 baris menggunakan shape atribut. Ini akan memberi tahu kita berapa banyak baris dan kolom yang kita miliki, masing-masing:

customer_data.shape

Ini menghasilkan:

(200, 5)

Besar! Data kami lengkap dengan 200 baris (catatan klien) dan kami juga memiliki 5 kolom (fitur). Untuk melihat karakteristik apa yang telah dikumpulkan departemen pemasaran dari pelanggan, kita dapat melihat nama kolom dengan columns atribut. Untuk melakukan itu, jalankan:

customer_data.columns

Script di atas mengembalikan:

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')

Di sini, kita melihat bahwa pemasaran telah menghasilkan CustomerID, mengumpulkan Genre, Age, Annual Income (dalam ribuan dolar), dan a Spending Score pergi dari 1 sampai 100 untuk masing-masing dari 200 pelanggan. Saat dimintai klarifikasi, mereka mengatakan bahwa nilai-nilai dalam Spending Score kolom menandakan seberapa sering seseorang menghabiskan uang di mal dalam skala 1 sampai 100. Dengan kata lain, jika pelanggan memiliki skor 0, orang ini tidak pernah menghabiskan uang, dan jika skornya 100, kita baru saja melihat pembelanja tertinggi.

Mari kita lihat sekilas distribusi skor ini untuk memeriksa kebiasaan belanja pengguna di kumpulan data kami. Di situlah Panda hist() metode datang untuk membantu:

customer_data['Spending Score (1-100)'].hist()

img

Dengan melihat histogram kami melihat bahwa lebih dari 35 pelanggan memiliki skor antara 40 dan 60, maka kurang dari 25 memiliki skor antara 70 dan 80. Jadi sebagian besar pelanggan kami adalah pembelanja seimbang, diikuti oleh pembelanja sedang hingga tinggi. Kita juga bisa melihat ada garis setelahnya 0, di sebelah kiri distribusi, dan baris lain sebelum 100, di sebelah kanan distribusi. Ruang kosong ini mungkin berarti bahwa distribusi tidak berisi non-pembelanja, yang akan memiliki skor 0, dan juga tidak ada pembelanja tinggi dengan skor 100.

Untuk memverifikasi apakah itu benar, kita dapat melihat nilai minimum dan maksimum dari distribusi. Nilai-nilai tersebut dapat dengan mudah ditemukan sebagai bagian dari statistik deskriptif, sehingga kita dapat menggunakan describe() metode untuk mendapatkan pemahaman tentang distribusi nilai numerik lainnya:


customer_data.describe().transpose()

Ini akan memberi kita tabel dari mana kita dapat membaca distribusi nilai lain dari dataset kita:

 						count 	mean 	std 		min 	25% 	50% 	75% 	max
CustomerID 				200.0 	100.50 	57.879185 	1.0 	50.75 	100.5 	150.25 	200.0
Age 					200.0 	38.85 	13.969007 	18.0 	28.75 	36.0 	49.00 	70.0
Annual Income (k$) 		200.0 	60.56 	26.264721 	15.0 	41.50 	61.5 	78.00 	137.0
Spending Score (1-100) 	200.0 	50.20 	25.823522 	1.0 	34.75 	50.0 	73.00 	99.0

Hipotesis kami dikonfirmasi. Itu min nilai dari Spending Score is 1 dan maksimumnya adalah 99. Jadi kita tidak punya 0 or 100 pemboros skor. Mari kita lihat kolom lain dari transposed describe meja. Saat melihat mean dan std kolom, kita dapat melihatnya untuk Age itu mean is 38.85 dan std adalah sekitar 13.97. Hal yang sama terjadi untuk Annual Income, Dengan mean of 60.56 dan std 26.26, Dan untuk Spending Score dengan mean of 50 dan std of 25.82. Untuk semua fitur, mean jauh dari standar deviasi, yang menunjukkan data kami memiliki variabilitas yang tinggi.

Untuk lebih memahami bagaimana data kita bervariasi, mari kita gambarkan Annual Income distribusi:

customer_data['Annual Income (k$)'].hist()

Yang akan memberi kita:

img

Perhatikan di histogram bahwa sebagian besar data kami, lebih dari 35 pelanggan, terkonsentrasi di dekat nomor 60, pada kita mean, pada sumbu mendatar. Tapi apa yang terjadi saat kita bergerak menuju ujung distribusi? Saat bergerak ke kiri, dari rata-rata $60.560, nilai berikutnya yang akan kita temui adalah $34.300 โ€“ rata-rata ($60.560) dikurangi variasi standar ($26.260). Jika kita melangkah lebih jauh ke kiri distribusi data kita, aturan serupa berlaku, kita kurangi variasi standar ($26.260) dari nilai saat ini ($34.300). Oleh karena itu, kita akan menemukan nilai $8.040. Perhatikan bagaimana data kami berubah dari $60k menjadi $8k dengan cepat. Itu "melompat" $26.260 setiap kali โ€“ sangat bervariasi, dan itulah mengapa kami memiliki variabilitas yang tinggi.

img

Variabilitas dan ukuran data penting dalam analisis clustering karena pengukuran jarak dari kebanyakan algoritma clustering sensitif terhadap besaran data. Perbedaan ukuran dapat mengubah hasil pengelompokan dengan membuat satu titik tampak lebih dekat atau lebih jauh ke titik lain daripada yang sebenarnya, mendistorsi pengelompokan data yang sebenarnya.

Sejauh ini, kami telah melihat bentuk data kami, beberapa distribusinya, dan statistik deskriptif. Dengan Pandas, kami juga dapat membuat daftar tipe data kami dan melihat apakah semua 200 baris kami terisi atau memiliki beberapa null nilai:

customer_data.info()

Ini menghasilkan:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 5 columns):
 #   Column                  Non-Null Count  Dtype 
---  ------                  --------------  ----- 
 0   CustomerID              200 non-null    int64 
 1   Genre                   200 non-null    object
 2   Age                     200 non-null    int64 
 3   Annual Income (k$)      200 non-null    int64 
 4   Spending Score (1-100)  200 non-null    int64 
dtypes: int64(4), object(1)
memory usage: 7.9+ KB

Di sini, kita dapat melihat bahwa tidak ada null nilai dalam data dan kami hanya memiliki satu kolom kategoris โ€“ Genre. Pada tahap ini, penting untuk memikirkan fitur apa yang tampaknya menarik untuk ditambahkan ke model pengelompokan. Jika kita ingin menambahkan kolom Genre ke model kita, kita perlu mengubah nilainya dari kategorikal untuk numerik.

Mari kita lihat caranya Genre diisi dengan mengintip 5 nilai pertama dari data kami:

customer_data.head() 

Ini menghasilkan:

    CustomerID 	Genre 	Age 	Annual Income (k$) 	Spending Score (1-100)
0 	1 			Male 	19 		15 					39
1 	2 			Male 	21 		15 					81
2 	3 			Female 	20 		16 					6
3 	4 			Female 	23 		16 					77
4 	5 			Female 	31 		17 					40

Tampaknya hanya ada Female dan Male kategori. Kami dapat memastikannya dengan melihat nilai uniknya dengan unique:

customer_data['Genre'].unique()

Ini mengkonfirmasi asumsi kami:

array(['Male', 'Female'], dtype=object)

Sejauh ini, kami tahu bahwa kami hanya memiliki dua genre, jika kami berencana untuk menggunakan fitur ini pada model kami, Male dapat diubah menjadi 0 dan Female untuk 1. Penting juga untuk memeriksa proporsi antar genre, untuk melihat apakah mereka seimbang. Kita bisa melakukannya dengan value_counts() metode dan argumennya normalize=True untuk menunjukkan persentase antara Male dan Female:

customer_data['Genre'].value_counts(normalize=True)

Output ini:

Female    0.56
Male      0.44
Name: Genre, dtype: float64

Kami memiliki 56% wanita dalam dataset dan 44% pria. Perbedaan di antara mereka hanya 16%, dan data kami bukan 50/50 tetapi adalah cukup seimbang untuk tidak menimbulkan masalah. Jika hasilnya 70/30, 60/40, maka mungkin diperlukan baik untuk mengumpulkan lebih banyak data atau menggunakan beberapa jenis teknik augmentasi data untuk membuat rasio itu lebih seimbang.

Sampai sekarang, semua fitur tapi Age, telah dieksplorasi secara singkat. Dalam hal apa? Age, biasanya menarik untuk membaginya menjadi tempat sampah untuk dapat mengelompokkan pelanggan berdasarkan kelompok usia mereka. Jika kita melakukannya, kita perlu mengubah kategori usia menjadi satu angka sebelum menambahkannya ke model kita. Dengan begitu, alih-alih menggunakan kategori 15-20 tahun, kami akan menghitung berapa banyak pelanggan yang ada di 15-20 kategori, dan itu akan menjadi nomor di kolom baru yang disebut 15-20.

Saran: Dalam panduan ini, kami hanya menyajikan analisis data eksplorasi singkat. Tapi Anda bisa melangkah lebih jauh dan Anda harus melangkah lebih jauh. Anda dapat melihat apakah ada perbedaan pendapatan dan perbedaan skor berdasarkan genre dan usia. Ini tidak hanya memperkaya analisis tetapi mengarah pada hasil model yang lebih baik. Untuk mempelajari Analisis Data Eksplorasi lebih dalam, lihat Bab EDA dalam โ€œPrediksi Harga Rumah Langsung โ€“ Pembelajaran Mesin dengan Python" Proyek yang Dipandu.

Setelah menduga apa yang bisa dilakukan dengan kategoris โ€“ atau kategorikal โ€“ Genre dan Age kolom, mari kita terapkan apa yang telah dibahas.

Variabel Encoding dan Rekayasa Fitur

Mari kita mulai dengan membagi Age menjadi kelompok yang bervariasi dalam 10, sehingga kita memiliki 20-30, 30-40, 40-50, dan seterusnya. Karena pelanggan termuda kami berusia 15 tahun, kami dapat memulainya pada usia 15 tahun dan berakhir pada usia 70 tahun, yang merupakan usia pelanggan tertua dalam data. Mulai dari 15, dan berakhir pada 70, kita akan memiliki interval 15-20, 20-30, 30-40, 40-50, 50-60, dan 60-70.

Untuk mengelompokkan atau bin Age nilai ke dalam interval ini, kita dapat menggunakan Pandas cut() metode untuk memotongnya menjadi tempat sampah dan kemudian menetapkan tempat sampah ke yang baru Age Groups kolom:

intervals = [15, 20, 30, 40, 50, 60, 70]
col = customer_data['Age']
customer_data['Age Groups'] = pd.cut(x=col, bins=intervals)


customer_data['Age Groups'] 

Ini menghasilkan:

0      (15, 20]
1      (20, 30]
2      (15, 20]
3      (20, 30]
4      (30, 40]
         ...   
195    (30, 40]
196    (40, 50]
197    (30, 40]
198    (30, 40]
199    (20, 30]
Name: Age Groups, Length: 200, dtype: category
Categories (6, interval[int64, right]): [(15, 20] < (20, 30] < (30, 40] < (40, 50] < (50, 60] < (60, 70]]

Perhatikan bahwa ketika melihat nilai kolom, ada juga garis yang menentukan bahwa kita memiliki 6 kategori dan menampilkan semua interval data yang di-binned. Dengan cara ini, kami telah mengkategorikan data numerik kami sebelumnya dan membuat yang baru Age Groups fitur.

Dan berapa banyak pelanggan yang kita miliki di setiap kategori? Kita dapat dengan cepat mengetahuinya dengan mengelompokkan kolom dan menghitung nilainya dengan groupby() dan count():

customer_data.groupby('Age Groups')['Age Groups'].count()

Ini menghasilkan:

Age Groups
(15, 20]    17
(20, 30]    45
(30, 40]    60
(40, 50]    38
(50, 60]    23
(60, 70]    17
Name: Age Groups, dtype: int64

Sangat mudah untuk mengetahui bahwa kebanyakan pelanggan berusia antara 30 dan 40 tahun, diikuti oleh pelanggan antara 20 dan 30 dan kemudian pelanggan antara 40 dan 50. Ini juga merupakan informasi yang baik untuk departemen Pemasaran.

Saat ini, kami memiliki dua variabel kategori, Age dan Genre, yang perlu kita ubah menjadi angka agar dapat digunakan dalam model kita. Ada banyak cara berbeda untuk membuat transformasi itu โ€“ kita akan menggunakan Panda get_dummies() metode yang membuat kolom baru untuk setiap interval dan genre dan kemudian mengisi nilainya dengan 0s dan 1s- operasi semacam ini disebut pengkodean satu-panas. Mari kita lihat bagaimana tampilannya:


customer_data_oh = pd.get_dummies(customer_data)

customer_data_oh 

Ini akan memberi kita gambaran awal dari tabel yang dihasilkan:

img

Dengan output, mudah untuk melihat bahwa kolom Genre dibagi menjadi kolom- Genre_Female dan Genre_Male. Ketika pelanggan adalah wanita, Genre_Female adalah sama dengan 1, dan ketika pelanggan adalah laki-laki, itu sama dengan 0.

Juga Age Groups kolom dibagi menjadi 6 kolom, satu untuk setiap interval, seperti Age Groups_(15, 20], Age Groups_(20, 30], dan seterusnya. Dengan cara yang sama seperti Genre, ketika pelanggan berusia 18 tahun, Age Groups_(15, 20] Nilai adalah 1 dan nilai semua kolom lainnya adalah 0.

Grafik keuntungan pengkodean satu-panas adalah kesederhanaan dalam mewakili nilai kolom, mudah untuk memahami apa yang terjadi โ€“ sementara kerugian adalah bahwa kita sekarang telah membuat 8 kolom tambahan, untuk meringkas dengan kolom yang sudah kita miliki.

peringatan: Jika Anda memiliki kumpulan data di mana jumlah kolom yang disandikan satu-panas melebihi jumlah baris, yang terbaik adalah menggunakan metode pengkodean lain untuk menghindari masalah dimensi data.

Encoding one-hot juga menambahkan 0 ke data kami, membuatnya lebih jarang, yang dapat menjadi masalah bagi beberapa algoritme yang sensitif terhadap data yang jarang.

Untuk kebutuhan pengelompokan kami, penyandian satu-panas tampaknya berfungsi. Tetapi kita dapat memplot data untuk melihat apakah memang ada kelompok yang berbeda untuk kita klaster.

Plot Dasar dan Pengurangan Dimensi

Dataset kami memiliki 11 kolom, dan ada beberapa cara untuk memvisualisasikan data tersebut. Yang pertama adalah dengan memplotnya dalam 10 dimensi (semoga berhasil). Sepuluh karena Customer_ID kolom tidak dipertimbangkan. Yang kedua adalah dengan memplot fitur numerik awal kami, dan yang ketiga adalah dengan mengubah 10 fitur kami menjadi 2 โ€“ oleh karena itu, melakukan pengurangan dimensi.

Merencanakan Setiap Pasangan Data

Karena merencanakan 10 dimensi agak tidak mungkin, kami akan memilih untuk menggunakan pendekatan kedua โ€“ kami akan memplot fitur awal kami. Kami dapat memilih dua di antaranya untuk analisis pengelompokan kami. Salah satu cara kami dapat melihat semua pasangan data kami digabungkan adalah dengan Seaborn pairplot():

import seaborn as sns


customer_data = customer_data.drop('CustomerID', axis=1)

sns.pairplot(customer_data)

Yang menampilkan:

img

Sepintas, kita bisa melihat scatterplot yang tampaknya memiliki kelompok data. Salah satu yang tampaknya menarik adalah scatterplot yang menggabungkan Annual Income dan Spending Score. Perhatikan bahwa tidak ada pemisahan yang jelas antara scatterplot variabel lainnya. Paling-paling, kita mungkin dapat mengatakan bahwa ada dua konsentrasi titik yang berbeda di Spending Score vs Age petak sebar.

Kedua scatterplot yang terdiri dari Annual Income dan Spending Score pada dasarnya sama. Kita bisa melihatnya dua kali karena sumbu x dan y saling bertukar. Dengan melihat salah satu dari mereka, kita dapat melihat apa yang tampak sebagai lima kelompok yang berbeda. Mari kita plot dua fitur itu dengan Seaborn scatterplot() untuk melihat lebih dekat:

sns.scatterplot(x=customer_data['Annual Income (k$)'],
                y=customer_data['Spending Score (1-100)'])

img

Dengan melihat lebih dekat, kita pasti dapat membedakan 5 kelompok data yang berbeda. Tampaknya pelanggan kami dapat dikelompokkan berdasarkan berapa banyak yang mereka hasilkan dalam setahun dan berapa banyak yang mereka belanjakan. Ini adalah poin lain yang relevan dalam analisis kami. Penting bahwa kami hanya mempertimbangkan dua fitur untuk mengelompokkan klien kami. Informasi lain yang kami miliki tentang mereka tidak dimasukkan ke dalam persamaan. Ini memberikan arti analisis โ€“ jika kita tahu berapa banyak penghasilan dan pengeluaran klien, kita dapat dengan mudah menemukan kesamaan yang kita butuhkan.

img

Itu keren! Sejauh ini, kita sudah memiliki dua variabel untuk membangun model kita. Selain apa yang diwakilinya, ini juga membuat model lebih sederhana, hemat, dan lebih mudah dijelaskan.

Lihat panduan praktis dan praktis kami untuk mempelajari Git, dengan praktik terbaik, standar yang diterima industri, dan termasuk lembar contekan. Hentikan perintah Googling Git dan sebenarnya belajar itu!

Catatan: Ilmu Data biasanya menyukai pendekatan sesederhana mungkin. Bukan hanya karena lebih mudah dijelaskan untuk bisnis, tetapi juga karena lebih langsung โ€“ dengan 2 fitur dan model yang dapat dijelaskan, jelas apa yang dilakukan model dan cara kerjanya.

Merencanakan Data Setelah Menggunakan PCA

Tampaknya pendekatan kedua kami mungkin yang terbaik, tetapi mari kita lihat juga pendekatan ketiga kami. Ini dapat berguna ketika kita tidak dapat memplot data karena memiliki terlalu banyak dimensi, atau ketika tidak ada konsentrasi data atau pemisahan yang jelas dalam kelompok. Ketika situasi tersebut terjadi, disarankan untuk mencoba mengurangi dimensi data dengan metode yang disebut Analisis Komponen Utama (PCA).

Catatan: Kebanyakan orang menggunakan PCA untuk pengurangan dimensi sebelum visualisasi. Ada metode lain yang membantu dalam visualisasi data sebelum pengelompokan, seperti: Pengelompokan Spasial Berbasis Kepadatan Aplikasi dengan Kebisingan (DBSCAN) dan Peta Pengorganisasian Mandiri (SOM) kekelompokan. Keduanya adalah algoritma pengelompokan, tetapi juga dapat digunakan untuk visualisasi data. Karena analisis pengelompokan tidak memiliki standar emas, penting untuk membandingkan visualisasi yang berbeda dan algoritma yang berbeda.

PCA akan mengurangi dimensi data kami sambil mencoba menyimpan sebanyak mungkin informasinya. Pertama-tama mari kita mendapatkan gambaran tentang cara kerja PCA, dan kemudian kita dapat memilih berapa banyak dimensi data yang akan kita perkecil datanya.

Untuk setiap pasangan fitur, PCA melihat apakah nilai yang lebih besar dari satu variabel sesuai dengan nilai yang lebih besar dari variabel lain, dan melakukan hal yang sama untuk nilai yang lebih rendah. Jadi, pada dasarnya menghitung berapa banyak nilai fitur yang berbeda satu sama lain โ€“ kami menyebutnya kovarians. Hasil-hasil tersebut kemudian diorganisasikan ke dalam sebuah matriks, memperoleh matriks kovarians.

Setelah mendapatkan matriks kovarians, PCA mencoba menemukan kombinasi linear dari fitur yang paling menjelaskannya โ€“ cocok dengan model linier hingga mengidentifikasi yang menjelaskan maksimum jumlah varians.

Note: PCA adalah transformasi linier, dan linieritas sensitif terhadap skala data. Oleh karena itu, PCA bekerja paling baik ketika semua nilai data berada pada skala yang sama. Ini dapat dilakukan dengan mengurangkan kolom berarti dari nilainya dan membagi hasilnya dengan standar deviasinya. Itu yang dipanggil standarisasi data. Sebelum menggunakan PCA, pastikan data diskalakan! Jika Anda tidak yakin bagaimana caranya, baca kami โ€œFitur Penskalaan Data dengan Scikit-Learn untuk Machine Learning dengan Pythonโ€!

Dengan ditemukannya garis (kombinasi linier) terbaik, PCA mendapatkan arah sumbunya, yang disebut vektor eigen, dan koefisien liniernya, nilai eigen. Kombinasi vektor eigen dan nilai eigen โ€“ atau arah sumbu dan koefisien โ€“ adalah Komponen Utama dari PCA. Dan saat itulah kita dapat memilih jumlah dimensi berdasarkan varians yang dijelaskan dari setiap fitur, dengan memahami komponen utama mana yang ingin kita pertahankan atau buang berdasarkan seberapa banyak varians yang dijelaskannya.

Setelah mendapatkan komponen utama, PCA menggunakan vektor eigen untuk membentuk vektor fitur yang mengorientasikan ulang data dari sumbu asli ke sumbu yang diwakili oleh komponen utama โ€“ begitulah pengurangan dimensi data.

Catatan: Satu detail penting yang perlu dipertimbangkan di sini adalah, karena sifatnya yang linier, PCA akan memusatkan sebagian besar varians yang dijelaskan dalam komponen utama pertama. Jadi, ketika melihat varians yang dijelaskan, biasanya dua komponen pertama kami sudah cukup. Tapi itu mungkin menyesatkan dalam beberapa kasus โ€“ jadi cobalah untuk terus membandingkan plot dan algoritme yang berbeda saat mengelompokkan untuk melihat apakah mereka memiliki hasil yang serupa.

Sebelum menerapkan PCA, kita harus memilih antara Age kolom atau Age Groups kolom dalam data encode one-hot kami sebelumnya. Karena kedua kolom mewakili informasi yang sama, memasukkannya dua kali akan memengaruhi varians data kami. jika Age Groups kolom dipilih, cukup hapus Age kolom menggunakan Pandas drop() metode dan menetapkan kembali ke customer_data_oh variabel:

customer_data_oh = customer_data_oh.drop(['Age'], axis=1)
customer_data_oh.shape 

Sekarang data kami memiliki 10 kolom, yang berarti kami dapat memperoleh satu komponen utama per kolom dan memilih berapa banyak dari mereka yang akan kami gunakan dengan mengukur seberapa banyak pengenalan satu dimensi baru menjelaskan lebih banyak varian data kami.

Mari kita lakukan itu dengan Scikit-Learn PCA. Kami akan menghitung varians yang dijelaskan dari setiap dimensi, yang diberikan oleh explained_variance_ratio_ , dan kemudian lihat jumlah kumulatifnya dengan cumsum() :

from sklearn.decomposition import PCA

pca = PCA(n_components=10)
pca.fit_transform(customer_data_oh)
pca.explained_variance_ratio_.cumsum()

Varians yang dijelaskan kumulatif kami adalah:

array([0.509337  , 0.99909504, 0.99946364, 0.99965506, 0.99977937,
       0.99986848, 0.99993716, 1.        , 1.        , 1.        ])

Kita dapat melihat bahwa dimensi pertama menjelaskan 50% dari data, dan ketika digabungkan ke dimensi kedua, mereka menjelaskan 99% persen. Ini berarti bahwa 2 dimensi pertama sudah menjelaskan 99% dari data kita. Jadi kita bisa menerapkan PCA dengan 2 komponen, dapatkan komponen utama kita dan plot mereka:

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pcs = pca.fit_transform(customer_data_oh)

pc1_values = pcs[:,0]
pc2_values = pcs[:,1]
sns.scatterplot(x=pc1_values, y=pc2_values)

img

Plot data setelah PCA sangat mirip dengan plot yang hanya menggunakan dua kolom data tanpa PCA. Perhatikan bahwa titik-titik yang membentuk kelompok lebih dekat, dan sedikit lebih terkonsentrasi setelah PCA daripada sebelumnya.

img

Memvisualisasikan Struktur Hirarki dengan Dendogram

Sejauh ini, kami telah menjelajahi data, kolom kategorikal enkode satu-panas, memutuskan kolom mana yang cocok untuk pengelompokan, dan mengurangi dimensi data. Plot menunjukkan bahwa kami memiliki 5 cluster dalam data kami, tetapi ada juga cara lain untuk memvisualisasikan hubungan antara titik kami dan membantu menentukan jumlah cluster โ€“ dengan membuat dendogram (biasanya salah eja sebagai dendogram). dendro cara pohon dalam bahasa Latin.

Grafik dendogram adalah hasil dari menghubungkan titik-titik dalam dataset. Ini adalah representasi visual dari proses pengelompokan hierarkis. Dan bagaimana proses pengelompokan hierarkis bekerja? Yahโ€ฆ itu tergantung โ€“ mungkin jawaban yang sudah sering Anda dengar di Ilmu Data.

Memahami Pengelompokan Hirarkis

Ketika Algoritma Pengelompokan Hirarki (HCA) mulai menghubungkan titik-titik dan menemukan kelompok, pertama-tama dapat membagi titik menjadi 2 kelompok besar, dan kemudian membagi masing-masing dari dua kelompok menjadi 2 kelompok yang lebih kecil, memiliki total 4 kelompok, yang merupakan memecah belah dan top-down Pendekatan.

Atau, ia dapat melakukan yang sebaliknya โ€“ ia dapat melihat semua titik data, menemukan 2 titik yang lebih dekat satu sama lain, menghubungkannya, dan kemudian menemukan titik lain yang paling dekat dengan titik yang terhubung tersebut dan terus membangun 2 grup dari Dari bawah ke atas. yang mana aglomeratif pendekatan yang akan kami kembangkan.

Langkah-langkah untuk Melakukan Pengelompokan Hirarki Agglomerative

Untuk memperjelas pendekatan aglomerasi, ada langkah-langkah dari Pengelompokan Hierarki Agglomeratif (AHC) algoritma:

  1. Pada awalnya, perlakukan setiap titik data sebagai satu cluster. Oleh karena itu, jumlah cluster di awal adalah K โ€“ sedangkan K adalah bilangan bulat yang mewakili jumlah titik data.
  2. Bentuklah cluster dengan cara menggabungkan dua titik data terdekat sehingga menghasilkan cluster K-1.
  3. Bentuk lebih banyak cluster dengan menggabungkan dua cluster terdekat sehingga menghasilkan cluster K-2.
  4. Ulangi ketiga langkah di atas hingga terbentuk satu cluster besar.

Note: Untuk penyederhanaan, kita mengatakan โ€œdua titik data terdekatโ€ pada langkah 2 dan 3. Tetapi ada lebih banyak cara untuk menghubungkan titik-titik seperti yang akan kita lihat sebentar lagi.

Jika Anda membalik langkah-langkah algoritme ACH, dari 4 ke 1 โ€“ itu akan menjadi langkah-langkah untuk *Pengelompokan Hierarki yang Memecah belah (DHC)*.

Perhatikan bahwa HCA dapat bersifat memecah belah dan top-down, atau aglomeratif dan bottom-up. Pendekatan DHC top-down bekerja paling baik ketika Anda memiliki lebih sedikit, tetapi cluster yang lebih besar, karenanya lebih mahal secara komputasi. Di sisi lain, pendekatan AHC bottom-up cocok ketika Anda memiliki banyak cluster yang lebih kecil. Ini lebih sederhana secara komputasi, lebih banyak digunakan, dan lebih tersedia.

Catatan: Baik dari atas ke bawah atau dari bawah ke atas, representasi dendrogram dari proses pengelompokan akan selalu dimulai dengan pembagian menjadi dua dan berakhir dengan diskriminasi setiap titik individu, setelah struktur dasarnya adalah pohon biner.

Mari kita plot dendrogram data pelanggan kita untuk memvisualisasikan hubungan hierarkis data. Kali ini, kita akan menggunakan scipy library untuk membuat dendrogram untuk dataset kami:

import scipy.cluster.hierarchy as shc
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 7))
plt.title("Customers Dendrogram")


selected_data = customer_data_oh.iloc[:, 1:3]
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(Z=clusters)
plt.show()

Output dari skrip terlihat seperti ini:

img

Dalam skrip di atas, kami telah membuat cluster dan subcluster dengan poin kami, mendefinisikan bagaimana poin kami akan terhubung (dengan menerapkan ward metode), dan cara mengukur jarak antar titik (dengan menggunakan euclidean metrik).

Dengan plot dendrogram, proses DHC dan AHC yang dijelaskan dapat divisualisasikan. Untuk memvisualisasikan pendekatan top-down mulai dari atas dendrogram dan turun, dan lakukan sebaliknya, mulai dari bawah dan bergerak ke atas untuk memvisualisasikan pendekatan bottom-up.

Metode Tautan

Masih banyak metode linkage lainnya, dengan lebih memahami cara kerjanya, Anda akan dapat memilih yang sesuai dengan kebutuhan Anda. Selain itu, masing-masing akan menghasilkan hasil yang berbeda ketika diterapkan. Tidak ada aturan tetap dalam analisis pengelompokan, jika memungkinkan, pelajari sifat masalah untuk melihat mana yang paling cocok, uji metode yang berbeda, dan periksa hasilnya.

Beberapa metode linkage adalah:

  • Tautan tunggal: juga disebut sebagai Tetangga Terdekat (NN). Jarak antar cluster ditentukan oleh jarak antara anggota terdekatnya.

img

  • Tautan lengkap: juga disebut sebagai Tetangga Terjauh (FN), Algoritma Titik Terjauh, atau Algoritma Voor Hees. Jarak antar cluster ditentukan oleh jarak antara anggota terjauh mereka. Metode ini mahal secara komputasi.

img

  • Hubungan rata-rata: juga dikenal sebagai UPGMA (Metode Unweighted Pair Group dengan Mean Aritmatika). Persentase jumlah poin dari setiap cluster dihitung sehubungan dengan jumlah poin dari dua cluster jika digabungkan.

img

  • Keterkaitan tertimbang: juga dikenal sebagai WPGM (Metode Kelompok Pasangan Tertimbang dengan Mean Aritmatika). Titik individu dari dua cluster berkontribusi pada jarak agregat antara cluster yang lebih kecil dan yang lebih besar.
  • Keterkaitan pusat: juga disebut sebagai UPGMC (Metode Unweighted Pair Group menggunakan Centroids). Sebuah titik yang ditentukan oleh rata-rata semua titik (centroid) dihitung untuk setiap cluster dan jarak antar cluster adalah jarak antara masing-masing centroid.

img

  • Keterkaitan lingkungan: Juga dikenal sebagai MISSQ (Peningkatan Minimal Jumlah Kuadrat). Ini menentukan jarak antara dua cluster, menghitung jumlah kesalahan kuadrat (ESS), dan berturut-turut memilih cluster berikutnya berdasarkan ESS yang lebih kecil. Metode Ward berusaha meminimalkan peningkatan ESS di setiap langkah. Oleh karena itu, meminimalkan kesalahan.

img

Metrik Jarak

Selain tautan, kami juga dapat menentukan beberapa metrik jarak yang paling sering digunakan:

  • Euclidean: juga disebut sebagai Pythagoras atau garis lurus jarak. Ini menghitung jarak antara dua titik di ruang angkasa, dengan mengukur panjang segmen garis yang lewat di antara mereka. Ini menggunakan teorema Pythagoras dan nilai jarak adalah hasilnya (C) dari persamaan:

$$
c^2 = a^2 + b^2
$$

  • Manhattan: disebut juga Blok kota, Taksi jarak. Ini adalah jumlah perbedaan mutlak antara ukuran di semua dimensi dari dua titik. Jika dimensi itu dua, itu dianalogikan dengan membuat kanan dan kemudian kiri ketika berjalan satu blok.

img

  • Minkowski: ini adalah generalisasi jarak Euclidean dan Manhattan. Ini adalah cara untuk menghitung jarak berdasarkan perbedaan absolut dengan urutan metrik Minkowski p. Meskipun didefinisikan untuk setiap p> 0, jarang digunakan untuk nilai selain 1, 2, dan (tak hingga). Jarak Minkowski sama dengan jarak Manhattan ketika p = 1, dan sama dengan jarak Euclidean ketika p = 2.

$$
Kiri(X,Ykanan) = kiri(jumlah_{i=1}^n |x_i-y_i|^kanan)^{frac{1}{p}}
$$

img

  • Chebyshev: juga dikenal sebagai Papan catur jarak. Ini adalah kasus ekstrim jarak Minkowski. Ketika kita menggunakan infinity sebagai nilai parameter p (p = ), kita berakhir dengan metrik yang mendefinisikan jarak sebagai perbedaan absolut maksimal antara koordinat.
  • Kosinus: itu adalah jarak kosinus sudut antara dua urutan titik, atau vektor. Kesamaan kosinus adalah perkalian titik dari vektor-vektor dibagi dengan hasil kali panjangnya.
  • Jaccard: mengukur kesamaan antara kumpulan titik yang berhingga. Ini didefinisikan sebagai jumlah total poin (kardinalitas) di titik-titik umum di setiap set (persimpangan), dibagi dengan jumlah poin (kardinalitas) dari total poin kedua set (union).
  • Jensen-Shannon: berdasarkan divergensi Kullback-Leibler. Ini mempertimbangkan distribusi probabilitas poin dan mengukur kesamaan antara distribusi tersebut. Ini adalah metode populer teori probabilitas dan statistik.

Kami telah memilih Bangsal dan Euclidean untuk dendrogram karena merupakan metode dan metrik yang paling umum digunakan. Mereka biasanya memberikan hasil yang baik karena Ward menghubungkan poin berdasarkan meminimalkan kesalahan, dan Euclidean bekerja dengan baik di dimensi yang lebih rendah.

Dalam contoh ini, kami bekerja dengan dua fitur (kolom) dari data pemasaran, dan 200 pengamatan atau baris. Karena jumlah pengamatan lebih besar dari jumlah fitur (200 > 2), kami bekerja di ruang dimensi rendah.

Ketika jumlah fitur (F) lebih besar dari jumlah pengamatan (N) โ€“ kebanyakan ditulis sebagai f >> N, itu berarti kita memiliki ruang dimensi tinggi.

Jika kita memasukkan lebih banyak atribut, jadi kita memiliki lebih dari 200 fitur, jarak Euclidean mungkin tidak bekerja dengan baik, karena akan mengalami kesulitan dalam mengukur semua jarak kecil dalam ruang yang sangat besar yang hanya bertambah besar. Dengan kata lain, pendekatan jarak Euclidean memiliki kesulitan bekerja dengan data ketersebaran. Ini adalah masalah yang disebut kutukan dimensi. Nilai jarak akan menjadi sangat kecil, seolah-olah menjadi "diencerkan" di ruang yang lebih besar, terdistorsi hingga menjadi 0.

Catatan: Jika Anda pernah menemukan kumpulan data dengan f >> p, Anda mungkin akan menggunakan metrik jarak lainnya, seperti Mahalanobi jarak. Atau, Anda juga dapat mengurangi dimensi kumpulan data, dengan menggunakan Analisis Komponen Utama (PCA). Masalah ini sering terjadi terutama ketika mengelompokkan data sekuensing biologis.

Kami telah membahas metrik, keterkaitan, dan bagaimana masing-masing metrik dapat memengaruhi hasil kami. Sekarang mari kita lanjutkan analisis dendrogram dan lihat bagaimana hal itu dapat memberi kita indikasi jumlah cluster dalam dataset kita.

Menemukan jumlah cluster yang menarik dalam dendrogram sama dengan menemukan ruang horizontal terbesar yang tidak memiliki garis vertikal (ruang dengan garis vertikal terpanjang). Ini berarti ada lebih banyak pemisahan antara cluster.

Kita dapat menggambar garis horizontal yang melewati jarak terjauh itu:

plt.figure(figsize=(10, 7))
plt.title("Customers Dendogram with line")
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(clusters)
plt.axhline(y = 125, color = 'r', linestyle = '-')

img

Setelah menemukan garis horizontal, kami menghitung berapa kali garis vertikal kami dilintasi โ€“ dalam contoh ini, 5 kali. Jadi 5 tampaknya merupakan indikasi yang baik dari jumlah cluster yang memiliki jarak paling jauh di antara mereka.

Note: Dendrogram harus dianggap hanya sebagai referensi ketika digunakan untuk memilih jumlah cluster. Itu dapat dengan mudah mendapatkan angka itu dan sepenuhnya dipengaruhi oleh jenis metrik tautan dan jarak. Saat melakukan analisis klaster yang mendalam, disarankan untuk melihat dendrogram dengan keterkaitan dan metrik yang berbeda dan untuk melihat hasil yang dihasilkan dengan tiga baris pertama di mana klaster memiliki jarak paling jauh di antara mereka.

Menerapkan Pengelompokan Hirarki Agglomerative

Menggunakan Data Asli

Sejauh ini kami telah menghitung jumlah klaster yang disarankan untuk kumpulan data kami yang dikuatkan dengan analisis awal dan analisis PCA kami. Sekarang kita dapat membuat model pengelompokan hierarkis agglomerative menggunakan Scikit-Learn AgglomerativeClustering dan temukan label poin pemasaran dengan labels_:

from sklearn.cluster import AgglomerativeClustering

clustering_model = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model.fit(selected_data)
clustering_model.labels_

Ini menghasilkan:

array([4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3,
       4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 1,
       4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 0, 2, 0, 2,
       1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2])

Kami telah menyelidiki banyak hal untuk sampai ke titik ini. Dan apa arti label ini? Di sini, kami memiliki setiap titik data kami yang diberi label sebagai grup dari 0 hingga 4:

data_labels = clustering_model.labels_
sns.scatterplot(x='Annual Income (k$)', 
                y='Spending Score (1-100)', 
                data=selected_data, 
                hue=data_labels,
                pallete="rainbow").set_title('Labeled Customer Data')

img

Ini adalah data cluster terakhir kami. Anda dapat melihat titik data berkode warna dalam bentuk lima cluster.

Titik data di kanan bawah (label: 0, titik data ungu) milik pelanggan dengan gaji tinggi tetapi pengeluaran rendah. Ini adalah pelanggan yang menghabiskan uang mereka dengan hati-hati.

Demikian pula pelanggan di kanan atas (label: 2, titik data hijau), adalah pelanggan dengan gaji tinggi dan pengeluaran tinggi. Ini adalah tipe pelanggan yang menjadi target perusahaan.

Pelanggan di tengah (label: 1, titik data biru) adalah yang memiliki pendapatan rata-rata dan pengeluaran rata-rata. Jumlah pelanggan tertinggi termasuk dalam kategori ini. Perusahaan juga dapat menargetkan pelanggan ini mengingat fakta bahwa mereka dalam jumlah besar.

Pelanggan di kiri bawah (label: 4, red) adalah pelanggan yang memiliki gaji rendah dan pengeluaran rendah, mereka mungkin tertarik dengan menawarkan promosi.

Dan terakhir, pelanggan di kiri atas (label: 3, titik data oranye) adalah orang-orang dengan pendapatan tinggi dan pengeluaran rendah, yang idealnya ditargetkan oleh pemasaran.

Menggunakan Hasil dari PCA

Jika kita berada dalam skenario yang berbeda, di mana kita harus mengurangi dimensi data. Kami juga dapat dengan mudah memplot hasil PCA yang terklasterisasi. Itu dapat dilakukan dengan membuat model pengelompokan aglomeratif lain dan memperoleh label data untuk setiap komponen utama:

clustering_model_pca = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model_pca.fit(pcs)

data_labels_pca = clustering_model_pca.labels_

sns.scatterplot(x=pc1_values, 
                y=pc2_values,
                hue=data_labels_pca,
                palette="rainbow").set_title('Labeled Customer Data Reduced with PCA')

img

Perhatikan bahwa kedua hasil sangat mirip. Perbedaan utama adalah bahwa hasil pertama dengan data asli jauh lebih mudah untuk dijelaskan. Jelas terlihat bahwa pelanggan dapat dibagi menjadi lima kelompok berdasarkan pendapatan tahunan dan skor pengeluaran mereka. Sementara, dalam pendekatan PCA, kami mempertimbangkan semua fitur kami, sejauh kami dapat melihat varians yang dijelaskan oleh masing-masing fitur, ini adalah konsep yang lebih sulit untuk dipahami, terutama ketika melapor ke departemen Pemasaran.

Setidaknya kita harus mengubah data kita, semakin baik.

Jika Anda memiliki kumpulan data yang sangat besar dan kompleks di mana Anda harus melakukan pengurangan dimensi sebelum pengelompokan โ€“ cobalah untuk menganalisis hubungan linier antara masing-masing fitur dan residunya untuk mendukung penggunaan PCA dan meningkatkan penjelasan proses. Dengan membuat model linier per pasang fitur, Anda akan dapat memahami bagaimana fitur berinteraksi.

Jika volume data sangat besar, menjadi tidak mungkin untuk memplot pasangan fitur, pilih sampel data Anda, seimbang dan sedekat mungkin dengan distribusi normal dan lakukan analisis pada sampel terlebih dahulu, pahami, sempurnakan itu โ€“ dan menerapkannya nanti ke seluruh dataset.

Anda selalu dapat memilih teknik visualisasi pengelompokan yang berbeda sesuai dengan sifat data Anda (linier, non-linier) dan menggabungkan atau menguji semuanya jika perlu.

Kesimpulan

Teknik pengelompokan bisa sangat berguna dalam hal data yang tidak berlabel. Karena sebagian besar data di dunia nyata tidak berlabel dan membuat anotasi data memiliki biaya lebih tinggi, teknik pengelompokan dapat digunakan untuk memberi label pada data yang tidak berlabel.

Dalam panduan ini, kami telah membawa masalah ilmu data yang nyata, karena teknik pengelompokan sebagian besar digunakan dalam analisis pemasaran (dan juga dalam analisis biologis). Kami juga telah menjelaskan banyak langkah penyelidikan untuk mendapatkan model pengelompokan hierarkis yang baik dan cara membaca dendrogram dan mempertanyakan apakah PCA merupakan langkah yang diperlukan. Tujuan utama kami adalah bahwa beberapa perangkap dan skenario berbeda di mana kami dapat menemukan pengelompokan hierarkis tercakup.

Selamat mengelompokkan!

Stempel Waktu:

Lebih dari penyalahgunaan