Berinteraksi dengan teman di layanan jejaring sosial (SNS), seperti Facebook, Tumblr, dan Instagram telah menjadi ritus peralihan bagi remaja di seluruh dunia.Para remaja ini adalah target potensial bagi para pengusaha atau pembisnis untuk menjual hasil produksinya
Jutaan konsumen remaja yang menggunakan situs semacam itu telah menarik perhatian para marketing yang berjuang untuk menemukan keunggulan di pasar yang semakin kompetitif. Salah satu cara untuk mendapatkan keunggulan ini adalah dengan mengidentifikasi segmen remaja yang memiliki selera yang sama, sehingga klien dapat menghindari penargetan iklan kepada remaja yang tidak tertarik dengan produk yang dijual.
Melakukan indetifikasi para remaja dalam group yang mempunyai minat yang sama.Clustering dapat mengotomatisasi proses penemuan segmen alami dalam populasi ini. Namun, keputusan apakah cluster tersebut menarik atau tidak dan bagaimana dapat menggunakannya untuk iklan. Mari kita coba proses ini dari awal hingga akhir.
Untuk analisis ini, kami akan menggunakan kumpulan data yang mewakili sampel acak dari 30.000 siswa sekolah menengah AS yang memiliki profil di SNS terkenal pada tahun 2006. Untuk melindungi anonimitas pengguna, SNS akan tetap tidak disebutkan namanya. Namun, pada saat data dikumpulkan, SNS adalah tujuan web populer bagi remaja AS. Oleh karena itu, masuk akal untuk mengasumsikan bahwa profil tersebut mewakili profile remaja Amerika yang cukup luas pada tahun 2006.
Data diambil secara merata di empat tahun kelulusan sekolah menengah (2006 sampai 2009) yang mewakili kelas senior, junior, sophomore, dan freshman pada saat pengumpulan data.
Proses pengambilan data SNS dilakukan secara otomatis, dari 500 kata terastas yang muncul disemua halaman, dipilih 36 kata untuk mewakili lima (5) kategori : Kegitatan Extra, Fashion, Religion, Romansa dan Perilaku Antisosial. Ke 36 kata tersebut meliputi termasuk : Football, sexy, kissed, bible, shoping, death dan drugs.
Dataset final menunjukan berapa kali setiap kata muncul di profile SNS orang-orang (remaja) tersebut.
library(tidyverse)
library(dplyr)
library(ggplot2)
library(plotly)
library(ggcorrplot)
library(corrplot)
library(cluster)Kita dapat menggunakan pengaturan default read.csv() untuk memuat data ke dalam data frema:
Mari kita juga melihat sekilas spesifikasi data. Beberapa baris pertama dari output glimpse() adalah sebagai berikut:
teens <- read.csv("data/snsdata.csv")
glimpse(teens)## Rows: 30,000
## Columns: 40
## $ gradyear <int> 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 200~
## $ gender <chr> "M", "F", "M", "F", NA, "F", "F", "M", "F", "F", "F", "F"~
## $ age <dbl> 18.982, 18.801, 18.335, 18.875, 18.995, NA, 18.930, 18.32~
## $ friends <int> 7, 0, 69, 0, 10, 142, 72, 17, 52, 39, 8, 21, 87, 0, 0, 0,~
## $ basketball <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, ~
## $ football <int> 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, ~
## $ soccer <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, ~
## $ softball <int> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ volleyball <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ swimming <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ cheerleading <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ baseball <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ tennis <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ sports <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, ~
## $ cute <int> 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ sex <int> 0, 0, 0, 0, 1, 1, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, ~
## $ sexy <int> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ hot <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ kissed <int> 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ dance <int> 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, ~
## $ band <int> 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ marching <int> 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ music <int> 0, 2, 1, 0, 3, 2, 0, 1, 0, 1, 0, 0, 1, 0, 2, 0, 0, 1, 0, ~
## $ rock <int> 0, 2, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, ~
## $ god <int> 0, 1, 0, 0, 1, 0, 0, 0, 0, 6, 0, 0, 0, 0, 1, 0, 1, 0, 0, ~
## $ church <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, ~
## $ jesus <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ bible <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ hair <int> 0, 6, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ dress <int> 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, ~
## $ blonde <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ mall <int> 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ shopping <int> 0, 0, 0, 0, 2, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ clothes <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, ~
## $ hollister <int> 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ abercrombie <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ die <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ death <int> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ drunk <int> 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ drugs <int> 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
Dataset mencakup 30.000 remaja dengan empat variabel yang menunjukkan karakteristik pribadi dan 36 kata yang menunjukkan minat.
Data gender masih dalam bentuk chr kita perlu merubah dalam bentuk factor
teens <-teens %>%
mutate(gender = as.factor(gender))colSums(is.na(teens))## gradyear gender age friends basketball football
## 0 2724 5086 0 0 0
## soccer softball volleyball swimming cheerleading baseball
## 0 0 0 0 0 0
## tennis sports cute sex sexy hot
## 0 0 0 0 0 0
## kissed dance band marching music rock
## 0 0 0 0 0 0
## god church jesus bible hair dress
## 0 0 0 0 0 0
## blonde mall shopping clothes hollister abercrombie
## 0 0 0 0 0 0
## die death drunk drugs
## 0 0 0 0
Dari list diatas, terdapat nilai NA - missing value yang signifikan pada kolom gender dan age
#kolom gender
table(teens$gender, useNA = "ifany")##
## F M <NA>
## 22054 5222 2724
prop.table(table(teens$gender, useNA = "ifany"))##
## F M <NA>
## 0.7351333 0.1740667 0.0908000
Di sini, kita melihat bahwa 2.724 data (9%) memiliki data NA. Menariknya, Data perempuan yang menggunakan situs SNS itu 73% lebih banyak dari data laki - laki yang menggunakan situs SNS
Selain variabe gender variable lain yang memiliki nilai NA adalah variable age. Untuk data numeric kita cek menggunakan command summary()
summary(teens$age)## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 3.086 16.312 17.287 17.994 18.259 106.927 5086
Ada sebanyak 5.086 NA dan nilai minimum dan maksimum tampaknya tidak masuk akal; kecil kemungkinannya anak berusia 3 tahun atau 106 tahun bersekolah di sekolah menengah. Untuk memastikan bahwa nilai ekstrem ini tidak menyebabkan masalah untuk analisis, kita perlu membersihkannya sebelum melanjutkan.
Rentang usia yang lebih masuk akal untuk siswa sekolah menengah termasuk mereka yang berusia minimal 13 tahun dan belum berusia 20 tahun.
teens$age <- ifelse(teens$age >= 13 & teens$age < 20, teens$age, NA)Dengan memeriksa kembali output summary(), kita melihat bahwa rentang usia sekarang mengikuti distribusi yang lebih mirip sekolah menengah yang sebenarnya:
summary(teens$age)## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 13.03 16.30 17.27 17.25 18.22 20.00 5523
Sayangnya, sekarang kami telah membuat masalah data hilang yang lebih besar. Kita perlu menemukan cara untuk menangani nilai-nilai ini sebelum melanjutkan analisis kita.
Solusi alternatif untuk variabel kategoris seperti jenis kelamin adalah memperlakukan nilai yang hilang sebagai kategori terpisah. Misalnya, daripada membatasi perempuan dan laki-laki, kita dapat menambahkan kategori tambahan untuk jenis kelamin yang tidak diketahui. Hal ini memungkinkan kita untuk melakukan dummy coding
dummy coding melibatkan pembuatan variabel dummy bernilai biner (1 atau 0) yang terpisah untuk setiap level fitur nominal kecuali satu, yang digunakan sebagai grup referensi. Alasan satu kategori dapat dikecualikan adalah karena statusnya dapat disimpulkan dari kategori lainnya. Misalnya, jika seseorang bukan perempuan dan tidak diketahui jenis kelaminnya, mereka harus laki-laki. Oleh karena itu, dalam hal ini kita hanya membuat variabel dummy untuk jenis kelamin perempuan dan tidak diketahui:
teens$female <- ifelse(teens$gender == "F" & !is.na(teens$gender), 1, 0)
teens$no_gender <- ifelse(is.na(teens$gender), 1, 0)Seperti yang Anda duga, fungsi is.na() menguji apakah gender sama dengan NA. Oleh karena itu, pernyataan pertama memberikan nilai 1 pada teens$female jika jenis kelamin sama dengan F dan jenis kelamin tidak sama dengan NA; jika tidak, ia memberikan nilai 0. Dalam pernyataan kedua, jika is.na() mengembalikan TRUE, yang berarti jenis kelamin tidak ada, variabel teens$no_gender ditetapkan 1; jika tidak, itu diberi nilai 0.
Untuk mengonfirmasi bahwa kita melakukan pekerjaan dengan benar, mari bandingkan variabel dummy yang kita buat dengan variabel gender asli:
table(teens$gender, useNA = "ifany")##
## F M <NA>
## 22054 5222 2724
table(teens$female, useNA = "ifany")##
## 0 1
## 7946 22054
table(teens$no_gender, useNA = "ifany")##
## 0 1
## 27276 2724
Jumlah 1 nilai untuk teens$female dan teens$no_gender sesuai dengan jumlah nilai F dan NA masing-masing, jadi kita harus bisa memercayai pekerjaan kita
Selanjutnya, mari kita proses 5.523 nilai age yang NA, Karena age bersifat numerik, kita tidak bisa menambahkan kategori lain seperti pada gender. Sebagai gantinya, kita akan menggunakan strategi berbeda yang dikenal sebagai imputasi, yang melibatkan pengisian data yang hilang dengan menebak nilai sebenarnya.
Salah satu cara untuk mencari nilai tipikal adalah dengan menghitung nilai rata-rata atau mean. Jika kami mencoba menerapkan fungsi mean(), seperti yang kami lakukan untuk analisis sebelumnya, ada masalah:
mean(teens$age)## [1] NA
Masalahnya adalah mean tidak terdefinisi untuk vektor yang berisi data NA Karena data usia yang berisi nilai NA, mean(teens$age) mengembalikan nilai NA. Kita dapat memperbaikinya dengan menambahkan parameter tambahan untuk menghapus nilai yang hilang sebelum menghitung mean:
mean(teens$age, na.rm = TRUE)## [1] 17.25243
Ini menunjukkan bahwa rata-rata siswa dalam data kami berusia sekitar 17 tahun. Ini hanya membawa kita sebagian dari jalan ke sana, kita sebenarnya membutuhkan usia rata-rata untuk setiap tahun kelulusan. Dalam hal ini, fungsi agregat() akan menghitung usia rata-rata berdasarkan tahun kelulusan setelah menghapus nilai NA:
aggregate(data = teens, age ~ gradyear, mean, na.rm = TRUE)## gradyear age
## 1 2006 18.65586
## 2 2007 17.70617
## 3 2008 16.76770
## 4 2009 15.81957
Usia rata-rata berbeda sekitar satu tahun per perubahan tahun kelulusan.
Output agregat() adalah data frame dan akan berguna untuk beberapa tujuan, tetapi akan membutuhkan kerja ekstra untuk menggabungkan kembali ke data asli kami. Sebagai alternatif, kita dapat menggunakan fungsi ave() , yang mengembalikan vektor dengan grup berarti diulang sehingga hasilnya sama panjang dengan vektor aslinya:
ave_age <- ave(teens$age, teens$gradyear, FUN = function(x) mean(x, na.rm = TRUE))Untuk menghubungkan cara ini ke nilai yang hilang, kita memerlukan satu panggilan ifelse() lagi untuk menggunakan nilai ave_age hanya jika nilai usia aslinya adalah NA:
teens$age <- ifelse(is.na(teens$age), ave_age, teens$age)Hasil ringkasan() menunjukkan bahwa nilai yang hilang sekarang telah dihilangkan:
summary(teens$age)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 13.03 16.28 17.24 17.24 18.21 20.00
Data sudah siap diproses lanjut
Untuk mengelompokkan remaja ke dalam segmen pemasaran, kami akan menggunakan implementasi k-means dalam paket stats, yang seharusnya disertakan dalam instalasi R secara default.
Fungsi kmeans() memerlukan data frane yang hanya berisi data numerik dan parameter yang menentukan jumlah cluster yang diinginkan. Jika Anda sudah menyiapkan dua hal ini, proses sebenarnya membangun model itu sederhana. Masalahnya adalah memilih kombinasi data dan cluster yang tepat memerlukan intuisi, terkadang banyak trial and error yang terlibat. Kita akan memulai analisis klaster dengan mempertimbangkan hanya 36 fitur yang mewakili berapa kali berbagai minat muncul di profil SNS remaja. Untuk kenyamanan, mari buat data frame yang hanya berisi fitur-fitur ini:
interests <- teens[5:40]Seperti pada proses clasfifikasi lainnya yang menggunakan perhitungan jarak adalah normalisasi dan z-score standarisation untuk menghasilkan data dengan rentang yang sama.
Untuk menerapkan standarisasi z-score pada frame data interest, kita dapat menggunakan fungsi scale() dengan lapply() sebagai berikut :
interests_z <- as.data.frame(lapply(interests, scale))Selanjutnya memutuskan berapa banyak cluster yang akan digunakan untuk segmentasi data. Jika kita menggunakan terlalu banyak cluster, akan terlalu detail sebaliknya, memilih terlalu sedikit dapat menghasilkan pengelompokan yang heterogen.
wss <- 0
for (i in 1:15) {
km.out <- kmeans(interests_z, centers = i, nstart = 20)
wss[i] <- km.out$tot.withinss
}
plot(1:15, wss, type = "o",
xlab = "Number of Clusters",
ylab = "Within groups sum of squares",
pch = 15)Untuk menggunakan algoritma k-means untuk membagi data minat remaja menjadi lima cluster, kami menggunakan fungsi kmeans() pada data frame interest.
Karena algoritma k-means menggunakan titik awal acak, fungsi set.seed() digunakan untuk memastikan bahwa hasil generator angka acak tetap sama setiap k-means dijalankan
set.seed(2345)
teen_clusters <- kmeans(interests_z, 5)
#teen_clustersHasil dari proses k-means clustering adalah sebuah list bernama teen_clusters yang menyimpan properti dari masing-masing dari kelima cluster tersebut
# clusplot(interests_z, teen_clusters$cluster, color = TRUE, labels = 3)
teens$cluster5 <- factor(teen_clusters$cluster)
dcpr <- prcomp(interests_z)
x <- "PC1"
y <- "PC2"
data <- data.frame(obsnames=seq(nrow(dcpr$x)), dcpr$x)
datapc <- data.frame(varnames = rownames(dcpr$rotation), dcpr$rotation)
mult <- min(
(max(data[,y]) - min(data[,y])/(max(datapc[,y])-min(datapc[,y]))),
(max(data[,x]) - min(data[,x])/(max(datapc[,x])-min(datapc[,x])))
)
datapc <- transform(datapc,
v1 = .9 * mult * (get(x)),
v2 = .9 * mult * (get(y))
)
data <- cbind(data,teens)plotcluster <- ggplot(data, aes_string(x=x, y=y)) +
geom_hline(aes(yintercept=0), size=.2) +
geom_vline(aes(xintercept=0), size=.2) +
coord_equal() +
geom_point(aes(color = cluster5, text = "text")) +
geom_segment(data = datapc, aes(x=0, y=0, xend=v1, yend=v2),
arrow = arrow(length=unit(0.2, "cm"))) +
geom_text(data = datapc, aes(label=varnames), size = 3, vjust=1) +
theme_minimal()
(plotcluster)clusplot(teens,teens$cluster5, color = TRUE, shade = TRUE, label=3)Mengevaluasi hasil pengelompokan bisa agak subjektif. Pada akhirnya, keberhasilan atau kegagalan model bergantung pada apakah cluster berguna untuk tujuan yang dimaksudkan. Karena tujuan dari analisis ini adalah untuk mengidentifikasi kelompok remaja dengan minat yang sama untuk tujuan pemasaran, melihat secara kualitatif cocok untuk kasus ini.
Salah satu cara paling dasar untuk mengevaluasi kegunaan sekumpulan cluster adalah dengan memeriksa jumlah contoh yang termasuk dalam masing-masing grup. Jika kelompok terlalu besar atau terlalu kecil, mereka tidak akan terlalu berguna. Untuk mendapatkan ukuran cluster kmeans(), gunakan komponen teen_clusters$size sebagai berikut:
#in quantity
teen_clusters$size## [1] 1038 601 4066 2696 21599
#in prosen
round(prop.table(teen_clusters$size)*100,2)## [1] 3.46 2.00 13.55 8.99 72.00
Bisa dilihat lima clsuter yang akan dievaluasi. Cluster terkecil memiliki 601 remaja (2 persen) sedangkan cluster terbesar memiliki 21.599 (72 persen). Meskipun kesenjangan yang besar antara jumlah orang dalam kelompok terbesar dan terkecil tidak baik, tanpa memeriksa kelompok-kelompok ini lebih hati-hati, kita tidak akan tahu apakah ini menunjukkan masalah atau tidak. Mungkin saja perbedaan ukuran cluster menunjukkan sesuatu yang nyata, seperti sekelompok besar remaja yang memiliki minat yang sama, atau mungkin kebetulan acak yang disebabkan oleh pusat cluster k-means awal. Kita akan tahu lebih banyak saat kita mulai melihat homogenitas setiap cluster.
Untuk melihat cluster lebih dalam, kita dapat memeriksa koordinat centroid cluster menggunakan komponen teen_clusters$centers, yaitu sebagai berikut untuk empat kepentingan pertama:
as.data.frame.matrix(teen_clusters$centers)## basketball football soccer softball volleyball swimming
## 1 0.362160730 0.37985213 0.13734997 0.1272107 0.09247518 0.26180286
## 2 -0.094426312 0.06691768 -0.09956009 -0.0379725 -0.07286202 0.04578401
## 3 0.003980104 0.09524062 0.05342109 -0.0496864 -0.01459648 0.32944934
## 4 1.372334818 1.19570343 0.55621097 1.1304527 1.07177211 0.08513210
## 5 -0.186822093 -0.18729427 -0.08331351 -0.1368072 -0.13344819 -0.08650052
## cheerleading baseball tennis sports cute sex
## 1 0.2159945 0.25312305 0.11991682 0.77040675 0.475265034 2.043945661
## 2 -0.1070370 -0.11182941 0.04027335 -0.10638613 -0.027044898 -0.042725567
## 3 0.5142451 -0.04933628 0.06703386 -0.05435093 0.796948359 -0.003156716
## 4 0.0400367 1.09279737 0.13887184 1.08316097 -0.005291962 -0.033193640
## 5 -0.1092056 -0.13616893 -0.03683671 -0.15903307 -0.171452198 -0.092301138
## sexy hot kissed dance band marching
## 1 0.547956598 0.314845390 3.02610259 0.455501275 0.39009330 -0.0105463
## 2 -0.027913348 -0.035027022 -0.04581067 0.050772118 4.09723438 5.2196105
## 3 0.266741598 0.623263396 -0.01284964 0.650572336 -0.03301257 -0.1131486
## 4 0.003036966 0.009046774 -0.08755418 -0.001993853 -0.07317758 -0.1039509
## 5 -0.076149916 -0.132614350 -0.13080557 -0.145524147 -0.11740538 -0.1104553
## music rock god church jesus bible
## 1 1.21014015 1.2014998 0.41743650 0.1621804 0.12698409 0.07464400
## 2 0.51624366 0.1865286 0.09706027 0.0675347 0.05333966 0.05836708
## 3 0.24527495 0.1166274 0.32867738 0.5195729 0.26142784 0.23946855
## 4 0.07102323 0.1565155 0.04902918 0.1320602 0.01776986 0.01719220
## 5 -0.12755935 -0.1044230 -0.09075500 -0.1239664 -0.05901846 -0.05243708
## hair dress blonde mall shopping clothes
## 1 2.59053048 0.5312082 0.36322464 0.622896285 0.27607550 1.245121599
## 2 -0.05146837 0.0492724 -0.01238629 -0.087713363 -0.03710273 -0.004395251
## 3 0.35590025 0.5837827 0.03301526 0.808620531 1.07073115 0.616207360
## 4 0.01714820 -0.0653358 0.03690938 -0.004723697 0.03497875 0.016201064
## 5 -0.19220150 -0.1286412 -0.02793327 -0.179127117 -0.21816580 -0.177738408
## hollister abercrombie die death drunk drugs
## 1 0.31525537 0.4131560 1.712160983 0.94713629 1.83371069 2.73878856
## 2 -0.16788599 -0.1413652 0.008941101 0.05464759 -0.08699556 -0.06414588
## 3 0.85951603 0.7935060 0.062399295 0.12642222 0.03594162 -0.05888141
## 4 -0.08381546 -0.0861708 -0.067312427 -0.01611162 -0.06891763 -0.08795059
## 5 -0.16182051 -0.1545430 -0.085876102 -0.06882571 -0.08386703 -0.10777278
Dengan memeriksa apakah klaster berada di atas atau di bawah tingkat rata-rata untuk setiap kategori minat, kita dapat mulai memperhatikan pola yang membedakan klaster satu sama lain. Dalam praktiknya, ini melibatkan pencetakan pusat klaster dan mencari pola atau nilai ekstrim melalu, Screenshoot layar berikut menunjukkan pola yang disorot untuk masing-masing dari lima kelompok, untuk 19 dari 36 minat remaja:
Karena pengelompokan menciptakan informasi baru, kinerja algoritme pengelompokan setidaknya bergantung pada kualitas klaster itu sendiri serta apa yang dilakukan dengan informasi tersebut. Dibagian sebelumnya, lima kelompok menunjukan pola yang jelas untuk minat remaja. Dengan ukuran itu, algoritme tampaknya berkinerja cukup baik. untuk itu kita coba menerapkan pada dataset awal
Objek teen_clusters yang dibuat oleh fungsi kmeans() menyertakan komponen bernama cluster yang berisi penetapan cluster untuk semua 30.000 individu dalam sampel. Kita dapat menambahkan ini sebagai kolom pada data frame dengan perintah berikut:
teens$cluster <- teen_clusters$clusterDengan adanya data baru ini, kita dapat mulai memeriksa bagaimana klaster memperlihatkan hubungan karakteristik antar individu.
teens[1:5, c("cluster", "gender", "age", "friends")]## cluster gender age friends
## 1 5 M 18.982 7
## 2 3 F 18.801 0
## 3 5 M 18.335 69
## 4 5 F 18.875 0
## 5 1 <NA> 18.995 10
Menggunakan fungsi agregat(), kita juga dapat melihat karakteristik demografis dari klaster. Usia rata-rata tidak berbeda jauh menurut kelompok. Ini digambarkan sebagai berikut:
aggregate(data = teens, age ~ cluster, mean)## cluster age
## 1 1 17.09319
## 2 2 17.38488
## 3 3 17.03773
## 4 4 17.03759
## 5 5 17.30265
Di sisi lain, ada beberapa perbedaan substansial dalam proporsi perempuan menurut kelompok. Ini adalah temuan yang sangat menarik karena kami tidak menggunakan data gender untuk membuat klaster, namun klaster masih bersifat prediktif gender:
aggregate(data = teens, female ~ cluster, mean)## cluster female
## 1 1 0.8025048
## 2 2 0.7237937
## 3 3 0.8866208
## 4 4 0.6984421
## 5 5 0.7082735
Bisa diperhatikan dari tampilan diatas Cluster 1 hampir 80 persen perempuan, sedangkan Cluster 2 dan Cluster 5 hanya sekitar 70 persen perempuan. Kesenjangan ini menyiratkan bahwa ada perbedaan minat yang didiskusikan remaja laki-laki dan perempuan di halaman jejaring sosial mereka.
Mengingat keberhasilan kami dalam memprediksi jenis kelamin, Anda mungkin juga menduga bahwa cluster tersebut memprediksi jumlah teman yang dimiliki pengguna. Hipotesis ini tampaknya didukung oleh data, yaitu sebagai berikut:
aggregate(data = teens, friends ~ cluster, mean)## cluster friends
## 1 1 30.66570
## 2 2 32.79368
## 3 3 38.54575
## 4 4 35.91728
## 5 5 27.79221
Gabungan antara keanggotaan kelompok, jenis kelamin, dan jumlah teman menunjukkan bahwa kelompok dapat menjadi prediktor perilaku yang berguna. Memvalidasi kemampuan prediktif mereka dengan cara ini dapat membuat klaster menjadi lebih mudah dijual ketika mereka diajukan ke tim pemasaran, yang pada akhirnya meningkatkan kinerja algoritme.
Dengan menggunakan metode Machine Learning untuk mengelompokkan remaja dengan orang lain yang memiliki minat yang sama, kami dapat mengembangkan tipologi identitas remaja yang dapat memprediksi karakteristik pribadi, seperti jenis kelamin dan jumlah teman. Metode yang sama ini dapat diterapkan pada konteks lain dengan hasil yang serupa.
Sebagai metode pembelajaran mesin yang sangat matang, ada banyak varian dari algoritma k-means serta banyak algoritma pengelompokan lainnya yang membawa bias dan heuristik unik untuk tugas tersebut.
Untuk Mengevaluasi Kinerja Model, yang dapat diterapkan di banyak tugas pembelajaran mesin. Sementara proses kami selalu mencurahkan beberapa upaya untuk mengevaluasi keberhasilan pembelajaran, untuk mendapatkan tingkat kinerja tertinggi, sangat penting untuk dapat mendefinisikan dan mengukurnya dalam istilah yang paling ketat.
###EOF