R İLE KÜMELEME ANALİZİ K-MEANS ALGORITMASI

tarihinde yayınlandıGrafik Datamining, Machine Learning, R yazılımı, Veri Analizi içinde yayınlandı
Facebooktwittergoogle_plusredditpinterestlinkedinmail

Doç. Dr. Kutlu MERİH

Kümeleme (Clustering) veri setleri içindeki gizli grup veya ilişki şemalarını belirlemeyi amaçlayan eğitimsiz (unsupervised) bir veri analizi tekniğidir. İki temel kümeleme tekniği söz konusudur:
  • Partisyon Yöntemi ve
  • Hiyerarşik Kümeleme.
Algoritmik zekanın gelişimi ile çok çeşitli kümeleme tekniği geliştirlmiş ve geliştirilmeye devam edilmektedir. Bu çalışma ile en popüler kümeleme teknikleri olan K-means tekniğini R paketlerinin uygulaması ve görselleştirilmesi olarak açıklamaya çalışacağız. Bu yöntemlerin herbirisinin temel matematik mantığını, kümeleme algoritmalarını ve kullanılacak R paketlerini sergileyeceğiz.
Kullanacağımız R paketleri;
library(cluster)
library(FactoMineR)
library(factoextra)
library(ggplot2)
library(ggthemes)
library(car)
olacaktır. factoextra paketi bütün bu algoritmaları ggplot2 desteği ile elegant görseller olarak verebilmektedir. Bunun yanında diğer paketlerin de yetenekleri hakkında bilgi sahibi olmak faydalı olacaktır. 

Kümeleme (Clustering) Kavramı

Genel olarak Kümeleme (Clustering), bir veri kümesinde kümeleri (alt gruplar) bulmak için kullanılan bir dizi teknik ve algoritmayı belirtir ve verilerin benzer gözlem gruplarına bölünmesini içerir. ‘Benzer gözlemler’ kavramı biraz göreli ve subjektiftir, ancak esas olarak belirli bir gruptaki veri noktalarının, farklı bir gruptaki veri noktalarına göre daha birbirine benzediği anlamına gelir. Veri toplama algoritmalarının ve modellerinin birçoğu, veriyi belli sayıda benzer verilere ayıran benzerlik (veya benzemezlik) metriklerini kullanan birçok türde kümeleme algoritması ve modeli vardır. Bu metriklerin en popüleri bildiğimiz Öklit uzaklık metriğidir. Bunun yanında farklı metrikler de kullanılabilir. Bu yaklaşımlardaki önemli fark nedeniyle, sonuçlar büyük oranda etkilenebilir ve bu nedenle, bu algoritmaları, uygulanacak en uygun yaklaşımı seçmek bir ölçüde anlamlıdır.

Grupiçi değişkenlik metriği 

Grupiçi değişkenliği belirlemek için bir çok metrik önerilebilir. R yazılımı Hartigan and Wong (1979) tarafından önerilen küme içi ve kümeler arası ayırımda Öklit metriğini default olarak kullanmaktır. Böylece her gözlem belirlenmiş olan sınıfların merkezine en yakın olarak sınıfa atanır ve sınıf merkezi buna göre yeniden belirlenir. Böylece öncelikle veri seti belirlenen sınıf sayısına göre kabaca bölünür, merkezleri belirlenir ve her bi gözlemin nereye düşeceği ve yeni sınıf merkezleri hesap edilerek devam edilir. Algoritma sınıf içi toplam uzaklıkları minimize edecek şekilde çalışacaktır. Bunun matematik ayrıntılarına burada girmeyeceğiz. Bunu R paketleri çeşitli şekillerde yapabilmektedir. Burada bu teknikten nasıl yararlanabileceğimizi inceleyeceğiz.

K-means clustering

K-means kümeleme (bunu algoritmanın jenerik adı olarak kullanacağız) bir veri setini k adet gruba (kümeye) ayırmak için en basit ve en çok kullanılan yöntemlerden biridir. Sorunlu bir özelliği analizciyi belirlenecek grup sayıs k değerini önceden belirleme durumunda bırakmasıdır. Bu da optimum küme sayısı problemini doğurmakta ve bunun için yeni algoritmalar gerektirmektedir 

K-means Algoritması

1- Analist k grup sayısını belirler
2- veri seti kabaca k gruba bölünür ve grup merkezleri belirlenir
3- Her gözlem merkezlere olan uzaklığı (genellikle Öklit metriğidir)  minimum olan gruba yerleştirilir ve grup merkezi yeniden hesaplanır
4- Gözlemlerin yerleştirilmesi ile her bir k grubun üye sayısı merkezi değişecek ve bunlar yeniden hesaplanacaktır.
5- 3 v3 4 adımları grup içi toplam uzaklıklar minimum oluncaya veya maksimum iterayon sayısını ulaşıncaya kadar sürdürülür, R için default maksimum iterasyon sayısı 10 dur.
Bu tanımlara göre K-means kümelemenin sürekli verilerden oluşan verisetleri için geçerli olacağı açıktır. Algoritmanın kullanacağı ortalamaların anlamlı olması gerekir. Algoritma verisetinden rasgele k eleman seçerek başlar. Sonra seçilen elemanların buna uyduğu veya uymadığı metriklenerek devam edilir. Gruplar ayrıştıkça gözlemler mesafe metriğine göre en yakın gruba yerleştirilir. Bu süreç artık yeni bir grup oluşturulamayıncağa kadar devam eder.

K-means zaafları

Kümeleme analizi için k-means basit ve oldukça etkin bir algoritma sağlar. Bunun yanında temel zaafları da söz konusudur. Öncelikle algoritma ortalama hesabı ve Öklit metriği kullandığı için sadece nümerik verisetleri için kullanılabilir. Bunun dışında küme sayısının başlangıçta belirlenmesi ve sonuçların başlangıç seçimi ile oluşan merkezlere aşırı duyarlı olması sonuçları etkiler. Bunları aşmak için algoritma farklı k değerleri ve farklı merkez değerleri için tekrar çalıştırılır. R paketleri bunları zımni olarak gerçekleştirir.
  • Grup sayısı k nın önceden belirlenmesi bunları en başında gelir.
  • Sonuç dağılımı da başlangıçtakı rasgele grup seçiminden oldukça etkilenir.
  • Ortalamaları kullandığı için anaomalik değerlere duyarlıdır.
  • Diğer taraftan bu sorunları aşılabildiği yaklaşımlar da söz konusudur.
  • Bunların başında sistemi alternatif k değerleri ve alternatif başlangıç grupları ile yeniden çalıştırmak gelir.
R function for K-means kümeleme için R fonksiyonu ve paketleri 
K-means kümeleme için standart R fonksiyonu base/stats paketinde bulunana kmeans() fonksiyonudur. Basitçe formatı:
            kmeans(x, centers, iter.max=10, nstart=1) 
x: numerik matrix, numerik data frame veya numeric vector
centers: Küme sayıs (k) değeri veya başlangıç küme merkezlerin değerleri
iter.max: Maximum iterasyon sayısı. Default değeri 10.
nstart: Centers sayı olduğunda rasgele başlangıç partisyonu sayısı. nstart > 1 ile başlamak önerilir
kmeans() function sonucları list formunda verilir ve aşağıdakileri içerir::
cluster:          Bir tamsayı vektörü (1:k) gözlemleri atandağı kümeleri belirler
centers:        Küme merkezlerinin (küme ortalamalarının) matrixi
totss:             Toplam kareler toplamı (TSS), TSS verisetindeki toplam varyasyonu belirler.
withinss:       Küme içi kareler toplamı, her küme için bir sayı
tot.withinss: Toplam kümeiçi kareler toplamı
betweenss: Kümelerarası kareler toplamı
size:                Her kümedeki  gözlem sayısı
K-means kümeleme  algoritması k rastgele secilmiş merkez ile başladığından tekrarlı testlerin tutarlılığı için R’nin random number generatörü için set.seed() fonksiyonunun kullanılması önerilir.

Örnek Uygulama 

Şimdi K-means kümeleme algoritmasını gerçek veri ile test edelim
Burada (ve genel olarak) R base/datasets verisetinde bulunan demo veriseti mtcars dan yararlanacağız.  Bu 11 değişkenli 32 satırdan oluşur
# Load the data set
data(“mtcars”)
# k-means tekniği de PCA gibi sadece nümerik matriksler üzerinde çalıştığından nümerik formdaki kategorik değişkenleri ayıklamalıyız.
df<-mtcars
df<-df[, c(-2,-7:-10)]
#df boyutları
dim(df)
# İlk 3 df satırı
head(df, n=3)
desc_stats<-data.frame(
Min=apply(df, 2, min), # minimum
Med=apply(df, 2, median), # median
Mean=apply(df, 2, mean), # mean
SD=apply(df, 2, sd), # Standard deviation
Max=apply(df, 2, max)# Maximum
)
desc_stats<-round(desc_stats, 1)
head(desc_stats)

Min Med Mean SD Max
mpg 10.4 19.2 20.1 6.0 33.9
disp 71.1 196.3 230.7 123.9 472.0
hp 52.0 123.0 146.7 68.6 335.0
drat 2.8 3.7 3.6 0.5 4.9
wt 1.5 3.3 3.2 1.0 5.4
carb 1.0 2.0 2.8 1.6 8.0

# Bu değişkenlerin anlamlı aralık farkları var. Bunları scale() ile ölçekleyelim
df<-scale(df)
head(df)

mpg             disp                hp
Mazda RX4 0.1508848 -0.57061982 -0.5350928
Mazda RX4 Wag 0.1508848 -0.57061982 -0.5350928
Datsun 710 0.4495434 -0.99018209 -0.7830405
Hornet 4 Drive 0.2172534 0.22009369 -0.5350928
Hornet Sportabout -0.2307345 1.04308123 0.4129422
Valiant -0.3302874 -0.04616698 -0.6080186
drat              wt                    carb
Mazda RX4 0.5675137 -0.610399567 0.7352031
Mazda RX4 Wag 0.5675137 -0.349785269 0.7352031
Datsun 710 0.4739996 -0.917004624 -1.1221521
Hornet 4 Drive -0.9661175 -0.002299538 -1.1221521
Hornet Sportabout -0.8351978 0.227654255 -0.5030337
Valiant -1.5646078 0.248094592 -1.1221521 

Optimal Küme Sayısının Belirlenmesi

Partisyon Yöntemlerinde analistini partisyon sayısını baştan belirlemesi gerektiğini söylemiştik. Böylece oluşacak kümelerin gerçek sayısını belirlemek gibi bir sorunla karşı karşıyayız. Bunun için R paketlerinin marifetlerine güveneceğiz. Bize bu sayıyı veren çeşitli paket fonksiyonları var. aslında bunlar da k-means algoritmalarının ardışık uygulanmasına dayanıyor bu nedenle matematik kısmını pas geçebiliriz. Bunun için factoextra paketinin fviz_nbclust() fonksiyonunu  kullanacağız. Genel formu:
            fviz_nbclust(x, FUNcluster, method=c(“silhouette”, “wss”))
Buradaki FUNcluster henüz görmediğimiz diğer kümeleme algoritmalarını da kapsıyor
library(factoextra)
set.seed(123)
fviz_nbclust(df, kmeans, method=”wss”)
#Burada kırılma k=2 de görülüyor. Bunu bir doğru ile gösterelim
fviz_nbclust(df, kmeans, method=”wss”)+
geom_vline(xintercept=2, linetype=2)
#factoextra ggplot2 grafikleri üretir temasını değiştirelim
library(ggthemes)
tma<-theme_igray()
fviz_nbclust(df, kmeans, method=”wss”)+
geom_vline(xintercept=2, linetype=2)+tma
 # İki küme önerildi
# Compute k-means clustering with k = 2
set.seed(123)
km.res<-kmeans(df, 2, nstart=25)
print(km.res)

 

 

 

 

 

 

 

 

 

 

 

Sonucun Grafiklenmesi

Şimdi bu analitik sonucu grafik olarak görselleştirmek isteyelim. Burada problem verisetlerinini genelde 2 den fazla değişkeni içermesidir. 2-boyutlu bir saçılım grafiği için hangi değişkenlerin seçileceği sorun yaratır. Böyle bir durumda çözüm daha önce inceledeğimiz Principal Componenets (PCA) tekniği olacaktır. Böylece sonuçları bir çeşit değişken kombinezonu olan 1. ve 2. asal bileşenlere göre grafikleyebiliriz
Elegant grafikler için factoextra paketinin fviz_cluster() fonksiyonu kullanılabilir. Burada gözlemler PCA nın 1. 2. asal bileşenlerine göre noktalanır ve her küme etrafına bir elips çizilir.
fviz_cluster(km.res, data=df)  # en basit opsiyonlar ile
# veya tema özelleştirerek
fviz_cluster(km.res, data=df)+ tma # igray teması
 

 
Facebooktwittergoogle_plusredditpinterestlinkedinmail