K-means Clustering di R dengan Contoh

Daftar Isi:

Anonim

Dalam tutorial ini, Anda akan belajar

  • Apa itu Analisis Cluster?
  • Algoritma K-means
  • Optimal k

Apa itu Analisis Cluster?

Analisis cluster adalah bagian dari pembelajaran tanpa pengawasan . Kluster adalah sekumpulan data yang memiliki fitur serupa. Kita dapat mengatakan, analisis pengelompokan lebih tentang penemuan daripada prediksi. Mesin mencari kesamaan dalam datanya. Misalnya, Anda dapat menggunakan analisis cluster untuk aplikasi berikut:

  • Segmentasi pelanggan: Mencari kesamaan antara kelompok pelanggan
  • Pengelompokan Pasar Saham: Kelompok saham berdasarkan kinerja
  • Kurangi dimensi kumpulan data dengan mengelompokkan pengamatan dengan nilai serupa

Analisis clustering tidak terlalu sulit untuk diterapkan dan bermakna serta dapat ditindaklanjuti untuk bisnis.

Perbedaan paling mencolok antara pembelajaran yang diawasi dan pembelajaran tanpa pengawasan terletak pada hasilnya. Pembelajaran tanpa pengawasan membuat variabel baru, diberi label, sementara pembelajaran yang diawasi memprediksi hasil. Mesin membantu praktisi dalam pencarian untuk memberi label data berdasarkan keterkaitan yang erat. Terserah analis untuk menggunakan kelompok dan memberi nama kepada mereka.

Mari kita buat contoh untuk memahami konsep clustering. Untuk kesederhanaan, kami bekerja dalam dua dimensi. Anda memiliki data tentang total pembelanjaan pelanggan dan usia mereka. Untuk meningkatkan periklanan, tim pemasaran ingin mengirim lebih banyak email bertarget ke pelanggan mereka.

Pada grafik berikut, Anda memplot total pengeluaran dan usia pelanggan.

library(ggplot2)df <- data.frame(age = c(18, 21, 22, 24, 26, 26, 27, 30, 31, 35, 39, 40, 41, 42, 44, 46, 47, 48, 49, 54),spend = c(10, 11, 22, 15, 12, 13, 14, 33, 39, 37, 44, 27, 29, 20, 28, 21, 30, 31, 23, 24))ggplot(df, aes(x = age, y = spend)) +geom_point()

Sebuah pola terlihat pada saat ini

  1. Di kiri bawah, Anda bisa melihat kaum muda dengan daya beli yang lebih rendah
  2. Orang menengah ke atas mencerminkan orang-orang dengan pekerjaan yang mereka mampu menghabiskan lebih banyak uang
  3. Terakhir, orang tua dengan anggaran lebih rendah.

Pada gambar di atas, Anda mengelompokkan pengamatan dengan tangan dan menentukan masing-masing dari tiga kelompok. Contoh ini agak lugas dan sangat visual. Jika pengamatan baru ditambahkan ke kumpulan data, Anda dapat menandainya di dalam lingkaran. Anda mendefinisikan lingkaran berdasarkan penilaian kami. Sebagai gantinya, Anda dapat menggunakan Machine Learning untuk mengelompokkan data secara objektif.

Dalam tutorial ini, Anda akan belajar bagaimana menggunakan algoritma k-means .

Algoritma K-means

Tidak diragukan lagi, K-mean adalah metode pengelompokan yang paling populer. Peneliti merilis algoritme beberapa dekade yang lalu, dan banyak peningkatan telah dilakukan pada k-means.

Algoritma mencoba menemukan kelompok dengan meminimalkan jarak antar pengamatan, yang disebut solusi optimal lokal . Jarak tersebut diukur berdasarkan koordinat pengamatan. Misalnya, dalam ruang dua dimensi, koordinatnya sederhana dan.

Algoritme bekerja sebagai berikut:

  • Langkah 1: Pilih grup di rencana fitur secara acak
  • Langkah 2: Minimalkan jarak antara pusat cluster dan pengamatan yang berbeda ( centroid ). Ini menghasilkan kelompok dengan observasi
  • Langkah 3: Geser sentroid awal ke rata-rata koordinat dalam sebuah grup.
  • Langkah 4: Minimalkan jarak sesuai dengan sentroid baru. Batasan baru dibuat. Dengan demikian, pengamatan akan berpindah dari satu kelompok ke kelompok lainnya
  • Ulangi sampai tidak ada pengamatan yang mengubah kelompok

K-means biasanya mengambil jarak Euclidean antara fitur dan fitur:

Ukuran yang berbeda tersedia seperti jarak Manhattan atau jarak Minlowski. Perhatikan bahwa, K-mean mengembalikan grup yang berbeda setiap kali Anda menjalankan algoritme. Ingatlah bahwa tebakan awal pertama adalah acak dan hitung jarak sampai algoritme mencapai homogenitas dalam kelompok. Artinya, k-mean sangat sensitif terhadap pilihan pertama, dan kecuali jumlah observasi dan grupnya kecil, hampir tidak mungkin untuk mendapatkan pengelompokan yang sama.

Pilih jumlah cluster

Kesulitan lain yang ditemukan dengan k-mean adalah pemilihan jumlah cluster. Anda dapat menetapkan nilai tinggi, yaitu sejumlah besar grup, untuk meningkatkan stabilitas tetapi Anda mungkin berakhir dengan data yang terlalu pas . Overfitting berarti kinerja model menurun secara substansial untuk data baru yang datang. Mesin mempelajari detail kecil dari kumpulan data dan berjuang untuk menggeneralisasi pola keseluruhan.

Jumlah cluster bergantung pada sifat kumpulan data, industri, bisnis, dan sebagainya. Namun, ada aturan praktis untuk memilih jumlah cluster yang sesuai:

dengan sama dengan jumlah observasi dalam dataset.

Secara umum, sangatlah menarik untuk meluangkan waktu untuk mencari nilai terbaik yang sesuai dengan kebutuhan bisnis.

Kami akan menggunakan kumpulan data Harga Komputer Pribadi untuk melakukan analisis pengelompokan kami. Dataset ini berisi 6259 observasi dan 10 fitur. Dataset mengamati harga dari 1993 hingga 1995 dari 486 komputer pribadi di AS. Variabelnya adalah harga, kecepatan, ram, layar, cd antara lain.

Anda akan melanjutkan sebagai berikut:

  • Impor data
  • Latih modelnya
  • Evaluasi modelnya

Impor data

K mean tidak cocok untuk variabel faktor karena didasarkan pada jarak dan nilai diskrit tidak mengembalikan nilai yang berarti. Anda dapat menghapus tiga variabel kategori dalam kumpulan data kami. Selain itu, tidak ada nilai yang hilang dalam kumpulan data ini.

library(dplyr)PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/computers.csv"df <- read.csv(PATH) %>%select(-c(X, cd, multi, premium))glimpse(df)
Keluaran
## Observations: 6, 259## Variables: 7## $ price < int > 1499, 1795, 1595, 1849, 3295, 3695, 1720, 1995, 2225, 2… ##$ speed < int > 25, 33, 25, 25, 33, 66, 25, 50, 50, 50, 33, 66, 50, 25,… ##$ hd < int > 80, 85, 170, 170, 340, 340, 170, 85, 210, 210, 170, 210… ##$ ram < int > 4, 2, 4, 8, 16, 16, 4, 2, 8, 4, 8, 8, 4, 8, 8, 4, 2, 4,… ##$ screen < int > 14, 14, 15, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14,… ##$ ads < int > 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,… ## $ trend  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1… 

Dari ringkasan statistik, Anda dapat melihat data memiliki nilai yang besar. Praktik yang baik dengan kalkulasi mean dan jarak adalah dengan mengubah skala data sehingga meannya sama dengan satu dan deviasi standarnya sama dengan nol.

summary(df)

Keluaran:

## price speed hd ram## Min. : 949 Min. : 25.00 Min. : 80.0 Min. : 2.000## 1st Qu.:1794 1st Qu.: 33.00 1st Qu.: 214.0 1st Qu.: 4.000 `## Median :2144 Median : 50.00 Median : 340.0 Median : 8.000## Mean :2220 Mean : 52.01 Mean : 416.6 Mean : 8.287## 3rd Qu.:2595 3rd Qu.: 66.00 3rd Qu.: 528.0 3rd Qu.: 8.000## Max. :5399 Max. :100.00 Max. :2100.0 Max. :32.000## screen ads trend## Min. :14.00 Min. : 39.0 Min. : 1.00## 1st Qu.:14.00 1st Qu.:162.5 1st Qu.:10.00## Median :14.00 Median :246.0 Median :16.00## Mean :14.61 Mean :221.3 Mean :15.93## 3rd Qu.:15.00 3rd Qu.:275.0 3rd Qu.:21.50## Max. :17.00 Max. :339.0 Max. :35.00

Anda mengubah skala variabel dengan fungsi scale () dari pustaka dplyr. Transformasi mengurangi dampak pencilan dan memungkinkan untuk membandingkan pengamatan tunggal terhadap mean. Jika nilai standar (atau skor-z ) tinggi, Anda dapat yakin bahwa pengamatan ini memang di atas rata-rata (skor-z yang besar menyiratkan bahwa titik ini jauh dari rata-rata dalam istilah deviasi standar. A z- Skor dua menunjukkan bahwa nilai tersebut berjarak 2 standar deviasi dari mean Catatan, skor-z mengikuti distribusi Gaussian dan simetris di sekitar mean.

rescale_df <- df % > %mutate(price_scal = scale(price),hd_scal = scale(hd),ram_scal = scale(ram),screen_scal = scale(screen),ads_scal = scale(ads),trend_scal = scale(trend)) % > %select(-c(price, speed, hd, ram, screen, ads, trend))

Basis R berfungsi untuk menjalankan algoritma k mean. Fungsi dasar k mean adalah:

kmeans(df, k)arguments:-df: dataset used to run the algorithm-k: Number of clusters

Latih modelnya

Dalam gambar tiga, Anda merinci cara kerja algoritme. Anda dapat melihat setiap langkah secara grafis dengan paket hebat yang dibangun oleh Yi Hui (juga pencipta Knit for Rmarkdown). Animasi paket tidak tersedia di pustaka conda. Anda dapat menggunakan cara lain untuk menginstal paket dengan install.packages ("animasi"). Anda dapat memeriksa apakah paket tersebut diinstal di folder Anaconda kami.

install.packages("animation") 

Setelah Anda memuat perpustakaan, Anda menambahkan .ani setelah kmeans dan R akan memplot semua langkah. Untuk tujuan ilustrasi, Anda hanya menjalankan algoritme dengan variabel yang diskalakan ulang hd dan ram dengan tiga kluster.

set.seed(2345)library(animation)kmeans.ani(rescale_df[2:3], 3)

Penjelasan Kode

  • kmeans.ani (rescale_df [2: 3], 3): Pilih kolom 2 dan 3 dari kumpulan data rescale_df dan jalankan algoritme dengan k set ke 3. Plot animasinya.

Anda dapat menafsirkan animasi sebagai berikut:

  • Langkah 1: R secara acak memilih tiga poin
  • Langkah 2: Hitung jarak Euclidean dan gambar clusternya. Anda memiliki satu kelompok berwarna hijau di kiri bawah, satu kelompok besar berwarna hitam di kanan dan satu kelompok merah di antara mereka.
  • Langkah 3: Hitung centroid, yaitu mean dari cluster
  • Ulangi sampai tidak ada data yang mengubah cluster

Algoritme berkumpul setelah tujuh iterasi. Anda dapat menjalankan algoritma k-mean dalam dataset kami dengan lima cluster dan menyebutnya pc_cluster.

pc_cluster <-kmeans(rescale_df, 5)
  • Daftar pc_cluster berisi tujuh elemen menarik:
  • pc_cluster $ cluster: Menunjukkan cluster dari setiap observasi
  • pc_cluster $ center: Pusat cluster
  • pc_cluster $ totss: Jumlah total kotak
  • pc_cluster $ withinss: Dalam jumlah persegi. Jumlah komponen yang dikembalikan sama dengan `k`
  • pc_cluster $ tot.withinss: Jumlah withins
  • pc_clusterbetweenss: Jumlah total minus kuadrat Dalam jumlah kuadrat
  • pc_cluster $ size: Jumlah observasi dalam setiap cluster

Anda akan menggunakan jumlah dalam jumlah kuadrat (yaitu tot.withinss) untuk menghitung jumlah optimal cluster k. Menemukan k memang merupakan tugas yang penting.

Optimal k

Salah satu teknik untuk memilih k terbaik disebut metode siku . Metode ini menggunakan homogenitas dalam kelompok atau heterogenitas dalam kelompok untuk mengevaluasi variabilitas. Dengan kata lain, Anda tertarik pada persentase varian yang dijelaskan oleh setiap cluster. Anda dapat mengharapkan variabilitas meningkat dengan jumlah cluster, sebagai alternatif, heterogenitas menurun. Tantangan kami adalah menemukan k yang berada di luar hasil yang semakin berkurang. Menambahkan cluster baru tidak meningkatkan variabilitas dalam data karena sangat sedikit informasi yang tersisa untuk dijelaskan.

Dalam tutorial ini, kami menemukan poin ini menggunakan ukuran heterogenitas. Jumlah total dalam kluster dari kuadrat adalah tot.withins dalam daftar yang dikembalikan oleh kmean ().

Anda dapat membuat grafik siku dan menemukan k optimal sebagai berikut:

  • Langkah 1: Buat fungsi untuk menghitung total dalam cluster jumlah kuadrat
  • Langkah 2: Jalankan waktu algoritme
  • Langkah 3: Buat bingkai data dengan hasil algoritma
  • Langkah 4: Buat plot hasilnya

Langkah 1) Buat fungsi untuk menghitung total dalam cluster jumlah kuadrat

Anda membuat fungsi yang menjalankan algoritme k-mean dan menyimpan total dalam jumlah cluster kotak

kmean_withinss <- function(k) {cluster <- kmeans(rescale_df, k)return (cluster$tot.withinss)}

Penjelasan Kode

  • function (k): Mengatur jumlah argumen dalam fungsi
  • kmeans (rescale_df, k): Jalankan algoritma k kali
  • return (cluster $ tot.withinss): Menyimpan total dalam cluster jumlah kotak

Anda dapat menguji fungsi tersebut dengan sama dengan 2.

Keluaran:

## Try with 2 cluster
kmean_withinss(2)

Keluaran:

## [1] 27087.07 

Langkah 2) Jalankan algoritma sebanyak n kali

Anda akan menggunakan fungsi sapply () untuk menjalankan algoritme pada rentang k. Teknik ini lebih cepat daripada membuat loop dan menyimpan nilainya.

# Set maximum clustermax_k <-20# Run algorithm over a range of kwss <- sapply(2:max_k, kmean_withinss)

Penjelasan Kode

  • max_k <-20: Tetapkan jumlah maksimum hingga 20
  • sapply (2: max_k, kmean_withinss): Jalankan fungsi kmean_withinss () pada rentang 2: max_k, yaitu 2 hingga 20.

Langkah 3) Buat bingkai data dengan hasil algoritma

Setelah membuat dan menguji fungsi kami, Anda dapat menjalankan algoritme k-mean pada rentang dari 2 hingga 20, menyimpan nilai tot.withinss.

# Create a data frame to plot the graphelbow <-data.frame(2:max_k, wss)

Penjelasan Kode

  • data.frame (2: max_k, wss): Buat bingkai data dengan output dari penyimpanan algoritma di wss

Langkah 4) Buat plot hasilnya

Anda memplot grafik untuk memvisualisasikan di mana titik siku

# Plot the graph with gglopggplot(elbow, aes(x = X2.max_k, y = wss)) +geom_point() +geom_line() +scale_x_continuous(breaks = seq(1, 20, by = 1))

Dari grafik tersebut, Anda dapat melihat k optimal adalah tujuh, di mana kurva mulai mengalami pengembalian yang semakin berkurang.

Setelah Anda mendapatkan k optimal, Anda menjalankan kembali algoritme dengan k sama dengan 7 dan mengevaluasi cluster.

Memeriksa cluster

pc_cluster_2 <-kmeans(rescale_df, 7)

Seperti disebutkan sebelumnya, Anda dapat mengakses informasi menarik yang tersisa dalam daftar yang dikembalikan oleh kmean ().

pc_cluster_2$clusterpc_cluster_2$centerspc_cluster_2$size 

Bagian evaluasi bersifat subjektif dan bergantung pada penggunaan algoritme. Tujuan kami di sini adalah untuk mengumpulkan komputer dengan fitur serupa. Seorang pria komputer dapat melakukan pekerjaan dengan tangan dan komputer kelompok berdasarkan keahliannya. Namun, prosesnya akan memakan banyak waktu dan rawan kesalahan. Algoritme K-mean dapat menyiapkan bidang untuknya dengan menyarankan cluster.

Sebagai evaluasi sebelumnya, Anda dapat memeriksa ukuran cluster.

pc_cluster_2$size

Keluaran:

## [1] 608 1596 1231 580 1003 699 542

Cluster pertama terdiri dari 608 observasi, sedangkan cluster terkecil nomor 4 hanya memiliki 580 komputer. Mungkin bagus untuk memiliki homogenitas antar cluster, jika tidak, persiapan data yang lebih tipis mungkin diperlukan.

Anda bisa melihat lebih dalam pada data dengan komponen tengah. Baris mengacu pada penomoran cluster dan kolom variabel yang digunakan oleh algoritme. Nilai tersebut merupakan skor rata-rata tiap cluster untuk kolom yang diminati. Standarisasi membuat interpretasi lebih mudah. Nilai positif menunjukkan skor-z untuk kelompok tertentu berada di atas rata-rata keseluruhan. Misalnya, cluster 2 memiliki rata-rata harga tertinggi di antara semua cluster.

center <-pc_cluster_2$centerscenter

Keluaran:

## price_scal hd_scal ram_scal screen_scal ads_scal trend_scal## 1 -0.6372457 -0.7097995 -0.691520682 -0.4401632 0.6780366 -0.3379751## 2 -0.1323863 0.6299541 0.004786730 2.6419582 -0.8894946 1.2673184## 3 0.8745816 0.2574164 0.513105797 -0.2003237 0.6734261 -0.3300536## 4 1.0912296 -0.2401936 0.006526723 2.6419582 0.4704301 -0.4132057## 5 -0.8155183 0.2814882 -0.307621003 -0.3205176 -0.9052979 1.2177279## 6 0.8830191 2.1019454 2.168706085 0.4492922 -0.9035248 1.2069855## 7 0.2215678 -0.7132577 -0.318050275 -0.3878782 -1.3206229 -1.5490909

Anda dapat membuat peta panas dengan ggplot untuk membantu kami menyoroti perbedaan antar kategori.

Warna default ggplot perlu diubah dengan pustaka RColorBrewer. Anda dapat menggunakan pustaka conda dan kode untuk diluncurkan di terminal:

Conda install -cr r-rcolorbrewer

Untuk membuat peta panas, Anda melanjutkan dalam tiga langkah:

  • Bangun bingkai data dengan nilai tengah dan buat variabel dengan jumlah cluster
  • Bentuk kembali data dengan fungsi gathering () dari pustaka tidyr. Anda ingin mengubah data dari lebar menjadi panjang.
  • Buat palet warna dengan fungsi colorRampPalette ()

Langkah 1) Buat bingkai data

Mari buat set data ulang

library(tidyr)# create dataset with the cluster numbercluster <- c(1: 7)center_df <- data.frame(cluster, center)# Reshape the datacenter_reshape <- gather(center_df, features, values, price_scal: trend_scal)head(center_reshape)

Keluaran:

## cluster features values## 1 1 price_scal -0.6372457## 2 2 price_scal -0.1323863## 3 3 price_scal 0.8745816## 4 4 price_scal 1.0912296## 5 5 price_scal -0.8155183## 6 6 price_scal 0.8830191

Langkah 2) Bentuk kembali data

Kode di bawah ini membuat palet warna yang akan Anda gunakan untuk memplot peta panas.

library(RColorBrewer)# Create the palettehm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')

Langkah 3) Visualisasikan

Anda dapat memplot grafik dan melihat seperti apa cluster tersebut.

# Plot the heat mapggplot(data = center_reshape, aes(x = features, y = cluster, fill = values)) +scale_y_continuous(breaks = seq(1, 7, by = 1)) +geom_tile() +coord_equal() +scale_fill_gradientn(colours = hm.palette(90)) +theme_classic()

Ringkasan

Kami dapat meringkas algoritma k-mean pada tabel di bawah ini

Paket

Objektif

fungsi

argumen

mendasarkan

Latih k-mean

kmeans ()

df, k

Akses cluster

kmeans () $ cluster

Pusat cluster

kmeans () $ pusat

Ukuran cluster

kmeans () $ size