R ile Principal Component Analizi (PCA)

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

Doç. DR. Kutlu MERİH

Principal component analysis (PCA) çok değişkenli nümerik bir veri seti içindeki bilgiyi daha az değişkenler ile fakat minimum bilgi kaybı ile açıklamanın matematik tekniğidir. Bir veri setindeki bilgi buradaki toplam değişkenlik ile açıklanmaktadır. PCA büyük boyutlu verisetlerindeki boyutsallığı azaltır. Simetrik matrislerin spektral analiz yöntemlerine dayanan PCA kullanıcıların ileri düzeyde matematik, istatistik ve linear cebir bilgisini gerektirir. R nin Datamining paketleri ve görselleştirme yetenekleri kullanıcılardan böyle bir bilgi talep etmeden analize ve sonuçlara odaklanabilmelerine olanak sağlar.

(PCA) Nedir? 

PCA nın boyut indirgemesi verisetindeki mevcut aralarında korelasyon olan değişkenleri bazı linear transformasyonlarla aynı sayıda ama aralarında korelasyon olmayan (ortogonal) değişkenlere dönüştürmeye dayanmaktadır. Bu yeni değişkenler mevcutların bir linear  kombinasyonu olup Asal Bileşenler (= Principal Components) olarak anılmaktadır. Verisetlerindeki değişkenler arasında aşırı korelasyon olduğu (ekonometrik modellerde olduğu gibi) ve verilerin yüksek hata içerebildiği durumlarda bu teknik oldukça işe yaramaktadır.
Değişkenler arası yüksek korelasyon setin gereksiz (reduntant) bilgi taşıdığının göstergesidir. Tekniğin matematik yapısı gereği verisetindeki toplam enformasyon az sayıdaki asal bileşende yoğunlaşmış hale gelmektedir. Çok elegant bir matematik teori olan bu tekniğin ayrıntılarına burada girmeyeceğiz. Sadece bazı temel kavramları vurgulayıp tekniğin R paketleri yardımı ile nasıl uygulanabileceği üzerinde yoğunlaşacağız.

PCA Temel Matematik Yapısı

PCA analizinin temeli verisetindeki değişkenlerarası KOVARYANS veya KORELASYON matrisinin spektral özelliklerine dayanmaktadır.  Yapısı gereği pozitif ve simetrik olan bu matrisin özdeğerleri (= eigenvalues) pozitiftir ve verilerin varyansları ile özdeştir. İşte bu hareket noktasından son derece etkili bir PCA tekniği ortaya çıkar. Diğer bir deyişle PCA verisetlerinin kovaryans veya korealasyon matrislerinin özdeğerlerini ve özvektörlerini bulma probleminden başka bir şey değildir. Yazılımlar öncesi bu teknik oldukça kahırlı bir süreç idi. Bilgisayar programları nispeten kolaylaştırdı ama sonuçlar son derece sayısal idi. R paketleri ise tekniği hem kolay hem de son derece görsel hala getirdi. Burada bunun örneklerini sergileyeceğiz.
PCA tekniğinin ayrıntılarının ileri düzeyde lineer cebir gerektirdiğini vurgulamıştık. Burada sadece R paketlerini kullanmamızda yardımı olacak bazı temel kavramların altını çizeceğiz. PCA değişken gruplarının varyanslarını yansıtan özdeğerler ile orijinal değişkenleri gruplandırır. En büyük varyansa sahip grub en önemlidir ve Asal Bileşen (Principal Component) olarak anılır. Aslında bunların sayısı orijinal değişken sayısı ile aynıdır ama önemleri hızla azalır. Uygulamalar veri setini açıklayan asal bileşen sayısının nadiren 3 ü geçtiğini göstermektedir. Bu çalışmada örnek veriseti olarak R datasets paketindeki mtcars verisetini kullanacağız (bunu eğitimlerde de yoğun bir şekilde kullanıyoruz). Bu verisetini görselleştirdiğimizde anlattıklarımız net bir şekilde görülecektir.

PCA Uygulama Adımları

PCA genel olarak 5 temel adımdan oluşur
1. Verileri Hazırla :
Veriyi Merkezle: Burada her değişkenden ortalaması çıkartılarak veri merkezlenir. Bylece ortalaması 0 olan bir veri seti elde edilir.
Veriyi Ölçekle: Şayet orijinal verisetinin varyansları (aralıkları) birbirinden çok farklı ise verileri bilinen teknikle 0 ortlama ve 1 varyanslı hale dönüştürmek iyi bir fikirdir. Değişkenler karşılaştırılabilir hale gelir.
2. Kovaryans/Korelasyon matrisini oluştur: Ölçeklenmiş verilerde ikisi de aynıdır.
3. Kovaryans/Korelasyon matrisinin özdeğerlerini (eigenvaluse) ve özvektörlerini (eigen vectors) hesapla
4. Asal Bileşenleri (Principal Components) seç. Özdeğerler büyükten küçüğe sıralanır ve karşı gelen özvektörler bulunur.
5. Yeni verisetini hesapla.
Özvektörleri satır olarak transpoze et.
Satırları değişkenler ve sütünları vakalar olan verisetini transpoze et.
Yeni.Veriseti = Transpoze.Özvektörler X Transpoze . Ayarlanmış Veriseti
Şimdi bütün bunlar matematikçi olmayanlar için Çince gibi gelmiştir ama sorun yok. R ve datamining paketleri bütün bunları tek komutla gerçekleştiren yeteneklere sahip. R kullandığımızda bütün bunlar tek komutla gerçekleştiği gibi sonuçlarını görsel olarak değerlendirebileceğimiz etkin grafiklere sahip olacağız. Böylece;
  • Verisetimizdeki anlamlı Asal Bileşenleri görebileceğiz.
  • Bize ilginç enformasyon sağlayan Korelasyon Dairemiz Olacak.
  • Değişkenlerin sisteme ne katkı sağladığını grafik olarak görebileceğiz.
  • Vakaların sisteme nasıl katkı sağladığını grafik olarak görebileceğiz.
  • Sisteme sonradan gelen vakaların nereye uyduğunu tahmin edebileceğiz.
 

PCA R Uygulaması ve Veri Görselleştirme

Bu bölümde kısa ve özet olarak verisetlerimize R ve paketlerini kullnarak nasıl PCA uygulayabileceğimizi ve bunun görsel sonuçlarını açıklamaya çalışacağız. R de PCA uygulaması için iki genel teknik söz konusudur. Değişkenlerarası Kovaryans/Korelasyon matrisinin spektral analizin yoğunlaşan
  • Spektral Dekompozisyon
  • Vakalararası Kovaryans/Korelasyon matrisinin analizine dayanan Singular Value Dekompozisyon
Numerik etkinliği daha yüksek olan Singuler Value Dekompozisyonu tercih edilen tekniktir. PCA uygulaması için R nin base/stats paketinde ve diğer paketlerde bir çok fonksiyon bulunmaktadır.
  • R base/stats paketinde prcomp() ve princomp() fonksiyonları
  • FactoMineR paketinde PCA() fonksiyonu
  • ade4 paketinde dudi.pca() fonksiyonu
PCA analizi için gerkli sonuçları sağlamaktadır. Fakat en onemlisi facto extra paketi bütün bu paket sonuçlarını ggplot2 grafikleri halinde sergileyebilmektedir.
DATALAB olarak veri görselleştirme R ile olan ilişkimizde öncelikli bir yer almaktadır. Bu neden analize doğrudan PCA ile değil verisetinin korelasyon yapısını sergileyen bir uygulama ile başlamayı öneriyoruz. Bunun için R de yine bir çok paket var ama korelasyon ve regresyon yapısına yoğunlaşmıs car ve corrplot paketleri bunun için yeterli olacaktır. Şimdi PCA için gerekli paketlerimizi yükleyerek ve datasets paketindeki demo mtcars veri setini kullanarak PCA analizimizi ve görselleştirmesini sergileyebiliriz. 
car, FactoMineR, factoextra, ggplot2, ggthemes paketlerinin yüklenmiş olması koşulu ile aşağıdaki R programını sonuna kadar kopyalayıp RGUI de run edebilirsiniz. Daha ayrıntılı bir görünüm ortaya çıkacaktır.
 
# PCA RUN
Doç. Dr. Kutlu MERİH
Mayıs 2017
# PCA
library(FactoMineR)     # PCA ve CLUSTER analizi
library(factoextra)       # PCA ve CLUSTER grafikleri
library(car)         # scatterplot matrix için
library(corrplot)  # corelogram matrisleri için
library(MASS)              # wine veriseti icin
library(ggthemes)        # orijinal ggplot2 temaları
tma<-theme_igray()
# Veri setini belirlemek
dset <-  mtcars  # R datasets paketinden demo veriseti
print(dim(dset))
print(head(dset,3))
datas<-na.omit(dset)
datas<-as.data.frame(scale(dset))
print(dim(datas))
print(head(datas))
# Scatterplot Matrisler
par(ask=TRUE)
if(ncol(dset)<12) {p<-scatterplotMatrix(dset, diagonal=”histogram”); print(p)}
# corrplot ile korelasyon matrisleri
library(corrplot)
par(ask=TRUE)
corel<-cor(datas)
corrplot(corel, method = “number”)
corrplot(corel)
corrplot(corel, order= “AOE”)
corrplot(corel, order= “hclust”, addrect=2)
# FactoMineR  PCA() ile Analiz
res.pca<-PCA(datas, scale=FALSE, graph=FALSE)
print(res.pca)
par(ask=TRUE)
par(mfrow=c(1,2))
plot(res.pca)
plot(res.pca, choix=”var”)
indiv<-TRUE
scores <- res.pca$x
loadings <- res.pca$rotation
# facto_summarize() ile pca() sonuçları dökümü
# Summarize variables on axes 1:2:3
fsv<- facto_summarize(res.pca, “var”, axes = 1:3)[,-1]
print(fsv)
fsvmax<- max(fsv$cos2)
print(fsvmax)
# fviz_eig() ile özdeğerler için screeplot
p <- fviz_eig(res.pca, addlabels = TRUE, hjust = -0.4,
      linecolor = “#FC4E07″, barfill=”white”, barcolor =”darkblue” )+ ylim(0, 85) # y axis limits
tit<-paste(tit,”Bileşenlerin Varyans Yüzdeleri  y-Range %85″)    
print(p+tma+ggtitle(tit))
 
p<- fviz_eig(res.pca, choice = “eigenvalue”, addlabels=TRUE)
print(p+tma+ggtitle(“Eigenvalue Barplot”))
  • # fviz_pca_var() ile Değişken Grafikleri
# Defaultplot: Korelasyon Çemberi
p<- fviz_pca_var(res.pca)+ tma
print(p+ggtitle(“PCA Değişkenler Korelasyon Çemberi”))
# Control variable colors using their contributions
p<- fviz_pca_var(res.pca, col.var=”contrib”)+
scale_color_gradient2(low=”orange”, mid=”red”, high=”darkred”, midpoint=66)+ tma
t<- ggtitle(“Değişkenlerin Katkısal Renk Gradientleri”)
print(p+t)
# Değişkenlerin katkılarına göre şeffaflıkları
p<- fviz_pca_var(res.pca, alpha.var=”contrib”)+ tma
print(p+ggtitle(“Değişkenlerin Katkısal Şeffaflıkları”))
# fviz_contrib() ile Değişkenlerin Faktörlere Katkıları 1,2,3 1:3
p<- fviz_contrib(res.pca, choice=”var”, axes = 1, sort.val =”asc”)
print(p+coord_flip()+tma)
p<- fviz_contrib(res.pca, choice=”var”, axes = 2, sort.val =”asc”)
print(p+coord_flip()+tma)
p<- fviz_contrib(res.pca, choice=”var”, axes = 3, sort.val =”asc”)
print(p+coord_flip()+tma)
p<- fviz_contrib(res.pca, choice=”var”, axes = 1:3, sort.val =”asc”)
print(p+coord_flip()+tma)
# fviz_contrib() Gözlemlerin Faktörlere Katkıları 1,2,3 1:3
p<- fviz_contrib(res.pca, choice=”ind”, axes = 1, sort.val =”asc” )
print(p+coord_flip()+tma)
p<- fviz_contrib(res.pca, choice=”ind”, axes = 2, sort.val =”asc” )
print(p+coord_flip()+tma)
p<- fviz_contrib(res.pca, choice=”ind”, axes = 3, sort.val =”asc” )
print(p+coord_flip()+tma)
 p<- fviz_contrib(res.pca, choice=”ind”, axes = 1:3, sort.val =”asc” )
print(p+coord_flip()+tma)
# Gözlemlerin asal bileşenlere göre pozisyonları
p<- fviz_pca_ind(res.pca, col.ind=”blue”)+ xlim(-4, 4)+ylim(-4, 4)+ tma
print(p+ggtitle(“Gözlemlerin Asal Bileşenlere Göre Pozisyonları”))
# Gözlemlerin Katkısal Gradientleri
p<- fviz_pca_ind(res.pca, col.ind=”contrib”)+
scale_color_gradient2(low=”orange”, mid=”red”, high=”darkred”, midpoint=4)
print(p+tma+ggtitle(“Gözlemlerin Contrib Katkısal Gradientleri”))
# fviz_pca_biplot(): Biplot of individuals and variables
par(ask=TRUE)
p<- fviz_pca_biplot(res.pca)+ tma ; print(p)
# Hide labels
p<- fviz_pca_biplot(res.pca, label=”var”)+ tma ; print(p)
# Hide individuals
p<- fviz_pca_biplot(res.pca, invisible=”ind”)+ tma ; print(p)
# program sonu

 

 

 

 

 

 

 

 

Facebooktwittergoogle_plusredditpinterestlinkedinmail