PCA(Principal Component Analysis) ile Boyutların Üstesinden Gelmek

PCA(Principal Component Analysis - Temel Bileşenler Analizi), veri analizi ve boyut azaltma konularında sıkça kullanılan güçlü bir araçtır.Bu yazı da PCA'yı ele alacağım.

Posted by Şuheda Karabudak on October 1, 2023

PCA (Temel Bileşenler Analizi) Nedir

PCA,çok boyutlu veri kümelerinin boyutlarını azaltmak ve veri setinin temel yapısını anlamak için kullanılan bir istatistiksel tekniktir. Temel olarak, veri setindeki karmaşıklığı azaltır ve verilerin en önemli özelliklerini belirler.

PCA Nasıl Çalışır

PCA’nın temel mantığı, veri setinin değişkenlerinin bir kombinasyonunu kullanarak yeni bir değişken seti oluşturmaktır. Bu yeni değişkenler, orijinal veri setinin “temel bileşenleri” olarak adlandırılır ve bu temel bileşenler, verinin çoğu varyasyonunu açıklar.

PCA işlemi şu adımları içerir:

Veri Standartlaştırma: İlk adım, veri setini standartlaştırmaktır. Bu, veri değişkenlerinin ortalamasını sıfıra ve standart sapmasını bir birime getirmek anlamına gelir. Bu,farklı ölçeklerdeki değişkenlerin karşılaştırılabilir hale gelmesini sağlar.

Kovaryans Matrisinin Hesaplanması: Veri setinin kovaryans matrisi hesaplanır. Bu matris, değişkenler arasındaki ilişkileri gösterir.

Özdeğer ve Özvektörlerin Hesaplanması: Kovaryans matrisinin özdeğerleri ve özvektörleri hesaplanır. Özdeğerler, yeni değişkenlerin açıkladığı varyasyon miktarını gösterirken, özvektörler yeni değişkenlerin yönünü belirler.

Özdeğerlerin Sıralanması: Özdeğerler büyükten küçüğe sıralanır ve bu sıralama, veri setinin en önemli bileşenlerini belirler.

Temel Bileşenlerin Seçilmesi: İlgilenilen bileşen sayısını seçin ve bu bileşenlerin özvektörlerini kullanarak yeni değişkenleri hesaplayın.

Yeni Veri Kümesinin Oluşturulması: Seçilen temel bileşenlere dayalı olarak yeni bir veri kümesi oluşturun.Ve elde edilen yeni veri kümesi incelenir ve analiz edilebilir hale gelir.

PCA Amacı

- Değişken sayısını azalatmak (Boyut indirgeme)

- Değişkenler arasındaki bağımlılık yapısını yok etmek.Birbiri ile bağımsız yeni değişkenler oluşturmak.

- Gözlenen değişkenlerdeki varyansları maximum düzeyde temsil edecek matris oluşturmak.

- Büyük boyutlu uzaydaki bir verinin, bir alt uzaya indirgemeyi amaçlar.

- Gereksiz sayılan değişkeni veri setinden tamamen yok etmek yerine sıkılaştırmayı amaçlar.

- Yeni bir eksen oluşturduğumuzda varyansların yani değişimleri en iyi şekilde açıklayan bir temel bileşen oluşturmaktır.

Temel Bileşenler Analizine başlamadan önce İstatistiksel olarak Bartlett Testi (Küresellik Testi) yapmalıyız.Nedeni temel bileşenler analizinin incelene bilmesi için değişkenler arasındaki ilişkinin önemli olması gerekir.

1-Bartlett Testi (Küresellik Testi)

H0 : R=I (Değişkenler arasındaki ilişki önemsizdir.)

H0 : R≠I (Değişkenler arasındaki ilişki önemlidir.)

Screenshot from 2023-10-05 14-51-40

R:Özdeğer matrisi

-PCA’ın uygulanması için H0 reddedilmelidir.(Değişkenler arasındaki ilişki önemlidir.)

-Bileşen sayısına karar verebiliriz.

λ1, … λp büyükten küçüğe sırala. En büyük özdeğerden başlamak üzere;

Screenshot from 2023-10-05 14-51-55

2/3 yaklaşık 0.67 geliyor.Bu koşulu sağlayan en büyük m saysısı bize temel bileşen sayısını verir.Önemli temel bileşene kara vermemiz için 1’den büyük özdeğerleri toplayarak bulabiliriz.

2-Her özdeğere karşılık gelen özvektör matrisi bulunur.(Component eigenvector matrix)

Her bir sütun özdeğere gelen özvektörlerdir.Kaç tane değişkenimiz varsa o kadar özdeğer ve özvektöre ulaşabiliriz.

Screenshot from 2023-10-05 14-52-06

3-Asıl Temel Bileşen Matrisi (Component Matrix)

Değişkenlerin hangi bileşen üzerine yüklendiğini gösteren matrisdir.

Screenshot from 2023-10-05 14-52-20

4-Yükler Matrisi (Communalities)

Temel bileşenlerin değişkenleri açıklama oranını gösterir.

Screenshot from 2023-10-05 14-52-35

Burada sütun toplamları özdeğerleri, satır toplamları temel bileşenleri ve değişkenleri açıklama oranını verir. hj^2 (Extraction) hj büyük olması gerekir.

1- hj^2 açıklanamayan oranı verir.

Python Uygulaması

Uygulamaya başlamadan önce gerekli olan python kütüphanlerini ve Kaggle’dan bulduğumuz veri setini içe aktarıyoruz.

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib as mpl
import seaborn as sns
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
%matplotlib inline

data= pd.read_csv('Country-data.csv')
data.head()
index country child_mort exports health imports income inflation life_expec total_fer gdpp
0 Afghanistan 90.2 10.0 7.58 44.9 1610 9.44 56.2 5.82 553
1 Albania 16.6 28.0 6.55 48.6 9930 4.49 76.3 1.65 4090
2 Algeria 27.3 38.4 4.17 31.4 12900 16.1 76.5 2.89 4460
3 Angola 119.0 62.3 2.85 42.9 5900 22.4 60.1 6.16 3530
4 Antigua and Barbuda 10.3 45.5 6.03 58.9 19100 1.44 76.8 2.13 12200
1
2
3
4
5
6
# Sütun adlarını değiştirme
new_column_names = {'country': 'Ulke', 'child_mort': 'cocuk_olum','exports':'ihracat','health':'saglık','imports':'ithalat','income': 'gelir', 'inflation':'enflasyon','life_expec':'yasan_cocuk', 'total_fer':'toplam_cocuk','gdpp':'GSYİH'}  # Yeni sütun adları
data.rename(columns=new_column_names, inplace=True)

#Değişknelerin yapısına ve boş değerlerin olup olmadığını inceleyelim.
data.info()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 167 entries, 0 to 166
Data columns (total 10 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   Ulke          167 non-null    object 
 1   cocuk_olum    167 non-null    float64
 2   ihracat       167 non-null    float64
 3   saglık        167 non-null    float64
 4   ithalat       167 non-null    float64
 5   gelir         167 non-null    int64  
 6   enflasyon     167 non-null    float64
 7   yasan_cocuk   167 non-null    float64
 8   toplam_cocuk  167 non-null    float64
 9   GSYİH         167 non-null    int64  
dtypes: float64(7), int64(2), object(1)
memory usage: 13.2+ KB

Temel Bileşenler Analizinde önemli olan değişkenler arasında ilişki olup olmadığıdır.Bunun için ilişki matrisini incelemeliyiz.

1
2
3
4
5
6
7
# Heatmap grafiği (koyu olan renklerde ilişkinin yüksek olduğu anlaşılıyor.)
corr=data.corr()
sns.heatmap(corr, annot=True, cmap="YlGnBu")
plt.xlabel("X Ekseni")
plt.ylabel("Y Ekseni")
plt.title("Heatmap Grafiği")
plt.show()

download

1
2
3
4
5
6
7
8
9
plt.figure(figsize=(30, 20))
for Ulke, data in data.groupby('Ulke'):
    plt.scatter(data['GSYİH'], data['cocuk_olum'], label=Ulke)
plt.xlabel('Kişi başına GSYİH')
plt.ylabel('Çocuk Ölümü')
plt.title('Çocuk Ölümü ve Kişi Başına GSYİH')
plt.legend(ncol=10)
plt.grid(True)
plt.show()

Burada genel olarak ülkeleri 1000 canlı doğumda 5 yaş altı çocuk ölümü (cocuk_olum) değişkeni ile Kişi Başına GSYİH değişkenine göre scatter plot gösterimini açıklar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
X = data.drop('Ulke', axis=1)  # Ülke adları hariç verileri seçtik
scaler = StandardScaler()  # Ölçeklendirme işlemi için bir ölçeklendirici oluşturalım
X_scaled = scaler.fit_transform(X)  # Verileri ölçeklendirin

# PCA uygulama
pca = PCA(n_components=2)  # İki bileşen alın (istediğiniz bileşen sayısını ayarlayabilirsiniz)
X_pca = pca.fit_transform(X_scaled)

plt.figure(figsize=(10, 6))

# Tüm ülkeleri gösteren scatter plot
plt.scatter(X_pca[:, 0], X_pca[:, 1], alpha=0.5, label='Diğer Ülkeler', c='gray')

# Türkiye'yi farklılaştıran bir scatter plot
turkey_indices = data[data['Ulke'] == 'Turkey'].index
plt.scatter(X_pca[turkey_indices, 0], X_pca[turkey_indices, 1], alpha=0.5, label='Türkiye', c='blue', marker='s')

plt.xlabel('PCA Bileşeni 1')
plt.ylabel('PCA Bileşeni 2')
plt.title('Tüm Ülkeler için PCA Sonuçları')
plt.legend()
plt.grid(True)

plt.show()

download

Bileşenlerin Önemi: PCA, orijinal değişkenlerin varyansını temsil eden bileşenleri üretir. İlk bileşen, verilerdeki en fazla varyansı açıklar ve sırayla gelen bileşenler daha az varyans açıklar. Bileşenlerin toplam varyansı genellikle %95 veya daha fazla olduğunda, verileri yeterince iyi temsil ettikleri kabul edilir.

Bileşenlerin Yönleri: Her bileşen, orijinal değişkenlerin bir lineer kombinasyonu olarak ifade edilir. Bu nedenle, her bileşenin ağırlıkları, orijinal değişkenlerin katkılarını gösterir. Bu ağırlıklar, bileşenlerin yönlerini belirler.

Değişkenlerin Katkıları: Her bileşen, orijinal verilerin hangi değişkenlerinin ne kadar katkı sağladığını yansıtır. Bazen, bazı bileşenler belirli değişkenlerle güçlü bir şekilde ilişkilidir ve bu, bu değişkenlerin önemli olduğunu gösterebilir.

Değişkenler Arası İlişkiler: PCA, değişkenler arasındaki ilişkileri ve benzerliği ortaya çıkarabilir. İki bileşen arasındaki benzerlik, bu bileşenlerin veri içeriğinde ne kadar örtüştüğünü gösterir.

Bileşenlerin İşlevi: PCA bileşenleri, genellikle orijinal veri setini daha düşük boyutlu bir temsile dönüştürmek için kullanılır. Örneğin, ilk iki bileşeni seçerek, verilerin bir iki boyutlu haritasını oluşturabilir ve bu harita üzerinde benzer ülkelerin bir arada olduğunu gözlemleyebilirsiniz.

Burada Hacettepe Üniversitenin İstatistik Bölümü Çok Değişkenli İstatistiksel Yöntemler dersinde çözdüğümüz örnekten bahsetmek istiyorum.Basit bir örnekle python da yaptığımız işlemlerin arka planın da ne gibi matematiksel işlemler döndüğüne bakacağız.

Örnek 370 öğrencinin sözel,sayısal,şekilsel zeka puanları korelasyon matrisi bulunmuştur.Korelasyon matrisini kullanarak özdeğer,özvektör ve temel bileşen değerlerini bulalım.

Screenshot from 2023-10-02 15-30-46

Screenshot from 2023-10-02 15-35-33

Screenshot from 2023-10-02 15-37-06

Screenshot from 2023-10-02 22-31-08

Sonuç

Artık PCA’nın büyüleyici dünyasının derinliklerine bir yolculuk yaptık ve sonunda bu etkileyici analizin gücünü anladık. Birçok veri setinde boyut azaltma ve desenleri anlama konularında bize yardımcı olan PCA, veri bilimi ve istatistik dünyasının vazgeçilmez araçlarından biri haline gelmiştir. Ancak unutmayın ki, PCA sadece bir başlangıç ​​noktasıdır. Bu temel bileşenler analizi, daha karmaşık analizlerin temelini oluştururken, gerçek dünya verileriyle çalışırken dikkatli olunması gereken bazı önemli detayları içerir. Özellikle, hangi bileşenlerin verileriniz için en önemli olduğunu anlamak ve sonuçları yorumlamak her zaman bir sanattır.Umarım bu yazı, PCA’nın amacını anlamaya yardımcı olmuştur.

Kaynakça

MIT

Principal Component Analysis

code