Bab 1 Tugas 10 (Linear Algebra)

Dataset Bunga Iris mencakup kolom-kolom berikut:

1.1 Persiapan Data

SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm Species
1 5.1 3.5 1.4 0.2 Iris-setosa
2 4.9 3 1.4 0.2 Iris-setosa
3 4.7 3.2 1.3 0.2 Iris-setosa
4 4.6 3.1 1.5 0.2 Iris-setosa
5 5 3.6 1.4 0.2 Iris-setosa
6
147 6.3 2.5 5 1.9 Iris-virginica
148 6.5 3 5.2 2 Iris-virginica
149 6.2 3.4 5.4 2.3 Iris-virginica
150 5.9 3 5.1 1.8 Iris-virginica

Kita akan normalisasi kolom Sepal Length (Cm) untuk baris pertama (\(x = 5.1\)). Tujuannya adalah mengubah nilai ini jadi z-score, yaitu angka yang menunjukkan seberapa jauh nilai \(x\) dari rata-rata kolom, diukur dalam satuan standar deviasi.

1.1.1 Langkah 1 : Hitung Rata-Rata (\(\mu\))

Rata-rata adalah nilai tengah data, yang didapat dengan menjumlahkan semua angka di kolom lalu bagi jumlah datanya.

Ambil semua nilai di kolom Sepal Length (Cm): Contoh nilai: 5.1, 4.9, 4.7, 4.6, 5.0, …, 5.9.

Jumlah totalnya: \[ \sum x_i = 876.5 \]

Hitung rata-rata: Bagi jumlah total dengan jumlah data (\(n = 150\)):

\[ \mu = \frac{\sum x_i}{n} = \frac{876.5}{150} = 5.8433333 \]

Jadi, rata-rata kolom Sepal Length (Cm) adalah 5.8433333. Ini yang nantinya menjadi “patokan” buat ngecek apakah nilai \(x\) lebih besar atau lebih kecil dari rata-rata.

1.1.2 Langkah 2 : Hitung Standar Deviasi (\(\sigma\))

Standar deviasi itu buat ngukur seberapa jauh data menyebar dari rata-rata. Kalau datanya dekat rata-rata, standar deviasinya kecil. Kalau tersebar jauh, standar deviasinya besar.

Kurangi setiap nilai dengan rata-rata (\(\mu\)): Ambil nilai dari kolom Sepal Length (Cm) satu per satu, lalu kurangi rata-rata.

Contoh:

  • \(5.1 - 5.8433333 = -0.7433333\)

  • \(4.9 - 5.8433333 = -0.9433333\)

  • \(4.7 - 5.8433333 = -1.1433333\)

Kuadratkan hasil selisihnya:

  • \((-0.7433333)^2 = 0.5525371\)

  • \((-0.9433333)^2 = 0.8898709\)

  • \((-1.1433333)^2 = 1.3072094\)

Jumlahkan semua hasil kuadrat: \[ \sum (x_i - \mu)^2 = 102.945862 \]

Bagi jumlahnya dengan \(n - 1\): Karena ini data sampel (bukan populasi penuh), bagi hasil tadi dengan \(n - 1\) (di sini \(n = 150\), jadi \(n - 1 = 149\)):

\[ \frac{\sum (x_i - \mu)^2}{n - 1} = \frac{102.945862}{149} = 0.6910981 \]

Ambil akar kuadrat hasilnya: \[ \sigma = \sqrt{0.6910981} = 0.8280661 \]

Standar deviasi kolom Sepal Length (Cm) adalah 0.8280661. Ini buat ngukur jarak data ke rata-rata.

1.1.3 Langkah 3 : Hitung Z-Score untuk Baris Pertama

Z-Score menunjukkan seberapa jauh nilai \(x\) (data mentah) dari rata-rata \(\mu\), diukur dengan standar deviasi \(\sigma\). Rumusnya:

\[ z = \frac{x - \mu}{\sigma} \]

Masukkan nilai pertama (\(x = 5.1\)), rata-rata (\(\mu = 5.8433333\)), dan standar deviasi (\(\sigma = 0.8280661\)):

\[ z = \frac{5.1 - 5.8433333}{0.8280661} \]

Hitung step by step: - \(x - \mu = 5.1 - 5.8433333 = -0.7433333\) - \(\frac{-0.7433333}{0.8280661} = -0.8976739\)

Hasil: Z-Score untuk baris pertama di kolom Sepal Length (Cm) adalah -0.8976739.

Kenapa Normalisasi Penting?

  1. Membandingkan Fitur yang Skalanya Beda: Misalnya, panjang sepal dihitung dalam cm, tapi jumlah kelopak bisa jadi cuma angka utuh. Tanpa normalisasi, fitur dengan angka besar bakal lebih dominan.

  2. Persiapan Analisis Statistik: Analisis seperti PCA atau regresi butuh data yang “seimbang”. Kalau nggak, hasilnya tidak sistematis.

1.1.4 Kesimpulan

Langkah normalisasi ini bisa diaplikasikan ke semua kolom data, tapi setiap kolom harus dihitung rata-rata (\(\mu\)) dan standar deviasinya (\(\sigma\)) masing-masing. Untuk kolom lain seperti Sepal Width (Cm) atau Petal Length (Cm), ulang langkah-langkah di atas dengan nilai datanya masing-masing. Berikut data tabel yang sudah dilakukan normalisasi sehingga setiap fitur memiliki nilai rata-rata 0 dan deviasi standar 1.

import pandas as pd

data_bunga = pd.read_csv('data/data_bunga.csv')
normalisasi = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']

# Normalisasi (X - mean)
data_bunga[normalisasi] = (data_bunga[normalisasi] - data_bunga[normalisasi].mean()) / data_bunga[normalisasi].std()

# Menampilkan 4 data pertama dan 3 data terakhir
output = pd.concat([data_bunga[normalisasi].head(4), data_bunga[normalisasi].tail(3)])
print(output)
##      SepalLengthCm  SepalWidthCm  PetalLengthCm  PetalWidthCm
## 0        -0.897674      1.028611      -1.336794     -1.308593
## 1        -1.139200     -0.124540      -1.336794     -1.308593
## 2        -1.380727      0.336720      -1.393470     -1.308593
## 3        -1.501490      0.106090      -1.280118     -1.308593
## 147       0.793012     -0.124540       0.816888      1.050019
## 148       0.430722      0.797981       0.930239      1.443121
## 149       0.068433     -0.124540       0.760212      0.787951

1.2 Hitung Matriks Kovariansi

Data Normalisasi yang Diberikan

\[ Z = \begin{bmatrix} -0.897674 & 1.028611 & -1.336794 & -1.308593 \\ -1.139200 & -0.124540 & -1.336794 & -1.308593 \\ -1.380727 & 0.336720 & -1.393470 & -1.308593 \\ -1.501490 & 0.106090 & -1.280118 & -1.308593 \end{bmatrix} \]

Jumlah data (\(n = 4\)).


Rumus Matriks Kovarians

Rumus Dasar

Untuk menghitung kovarians antara dua variabel (misalnya, Sepal Length dan Sepal Width), kita gunakan rumus:

\[ \text{Cov}(X, Y) = \frac{1}{n-1} \sum_{i=1}^{n} X_i Y_i \]

Karena data sudah dinormalisasi, rata-rata \(\bar{X}\) dan \(\bar{Y}\) = 0.

  • \(X_i\) dan \(Y_i\): nilai masing-masing variabel
  • \(n\): jumlah data (di sini \(n = 150\)).

1.2.1 Produk Deviasi

Contoh 1: Kovarians Sepal Length (\(X\)) dengan Sepal Length (\(X\)) Ini sebenarnya adalah variansi, karena kita menghitung hubungan variabel dengan dirinya sendiri. Rumusnya:

\[ S = \sum_{i=1}^{n} (X_i)^2 \]

Data Normalisasi Sepal Length (\(X\)):

\[ X = \{-0.897674, -1.139200, \dots, 0.068430\} \]

Langkah:

  1. Kuadratkan setiap nilai \(X_i\):

    \[ (-0.897674)^2 = 0.805813, \quad (-1.139200)^2 = 1.297804, \dots \]

  2. Jumlahkan hasil kuadrat:

    \[ S = 0.805813 + 1.297804 + \dots + (0.068430)^2 = 149 \]

  3. Bagi hasilnya dengan \(n-1\):

    \[ \text{Cov}(X, X) = \frac{S}{n-1} = \frac{149}{149} = 1 \]

Hasil: Kovarians untuk Sepal Length dengan Sepal Length adalah \(1\).


Contoh 2: Kovarians Sepal Length (\(X\)) dengan Sepal Width (\(Y\))

Rumusnya:

\[ S = \sum_{i=1}^{n} (X_i \cdot Y_i) \]

Data Normalisasi:

\[ X = \{-0.897674, -1.139200, \dots, 0.068430\}, \quad Y = \{1.028611, -0.124540, \dots, -0.124540\} \]

Langkah:

  1. Kalikan setiap pasangan \(X_i\) dan \(Y_i\):

    \[ (-0.897674 \cdot 1.028611) = -0.922967, \quad (-1.139200 \cdot -0.124540) = 0.141846, \dots \]

  2. Jumlahkan hasilnya:

    \[ S = -0.922967 + 0.141846 + \dots + (0.068430 \cdot -0.124540) = -16.29601824 \]

  3. Bagi hasilnya dengan \(n-1\):

    \[ \text{Cov}(X, Y) = \frac{S}{n-1} = \frac{-16.29601824}{149} = -0.109369 \]

Hasil: Kovarians untuk Sepal Length dengan Sepal Width adalah \(-0.109369\).


1.2.2 Ulangi untuk Semua Pasangan Variabel

Lakukan langkah yang sama untuk setiap kombinasi variabel lainnya (Sepal Length vs Petal Length, Petal Length vs Petal Width, dan sebagainya). Gunakan rumus:

\[ \text{Cov}(X, Y) = \frac{1}{n-1} \sum_{i=1}^{n} X_i Y_i \]

Setelah selesai, Anda akan mendapatkan matriks kovariansi seperti ini:

\[ \text{Cov}(Z) = \begin{bmatrix} 1.000000 & -0.109369 & 0.871754 & 0.817954 \\ -0.109369 & 1.000000 & -0.420516 & -0.356544 \\ 0.871754 & -0.420516 & 1.000000 & 0.962757 \\ 0.817954 & -0.356544 & 0.962757 & 1.000000 \end{bmatrix} \]

import pandas as pd
import numpy as np
import sys

# Memuat dataset
file_path = 'data/data_bunga.csv'
data = pd.read_csv(file_path)

features = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']
data_relevant = data[features]
# Normalisasi manual (z-score): (x - mean) / std
means = data_relevant.mean()
stds = data_relevant.std(ddof=1) 
data_normalized = (data_relevant - means) / stds
# Menghitung matriks kovarians
cov_matrix = data_normalized.cov()
# Membulatkan hasil untuk memastikan presisi
cov_matrix = cov_matrix.round(7)

print(cov_matrix)
##                SepalLengthCm  SepalWidthCm  PetalLengthCm  PetalWidthCm
## SepalLengthCm       1.000000     -0.109369       0.871754      0.817954
## SepalWidthCm       -0.109369      1.000000      -0.420516     -0.356544
## PetalLengthCm       0.871754     -0.420516       1.000000      0.962757
## PetalWidthCm        0.817954     -0.356544       0.962757      1.000000

1.3 Hitung Nilai Eigen dan Vektor Eigen

Rumus Dasar

Nilai eigen (\(\lambda\)) dan vektor eigen (\(v\)) dihitung menggunakan persamaan dasar berikut:

\[ A \cdot v = \lambda \cdot v \]

  • \(A\) adalah matriks kovariansi.

  • \(\lambda\) adalah nilai eigen.

  • \(v\) adalah vektor eigen.

Artinya, vektor eigen adalah vektor yang ketika dikalikan dengan matriks kovariansi, hasilnya akan sama dengan vektor itu sendiri, hanya saja diskalakan dengan nilai eigen \(\lambda\).


1.3.1 Bentuk Persamaan

Langkah pertama adalah mencari persamaan karakteristik untuk matriks kovariansi \(A\). Kita mendapatkan persamaan ini dengan mengurangkan \(\lambda\) yang diskalakan pada matriks identitas \(I\) dari matriks kovariansi \(A\). Matriks identitas \(I\) adalah matriks yang memiliki nilai 1 di diagonal utama dan 0 di elemen lainnya.

Matriks kovariansi \(A\) yang diberikan adalah:

\[ A = \begin{bmatrix} 1.000000 & -0.109369 & 0.871754 & 0.817954 \\ -0.109369 & 1.000000 & -0.420516 & -0.356544 \\ 0.871754 & -0.420516 & 1.000000 & 0.962757 \\ 0.817954 & -0.356544 & 0.962757 & 1.000000 \end{bmatrix} \]

Untuk menemukan persamaan karakteristik, kita kurangi matriks identitas yang diskalakan oleh \(\lambda\):

\[ A - \lambda I = \begin{bmatrix} 1 - \lambda & -0.109369 & 0.871754 & 0.817954 \\ -0.109369 & 1 - \lambda & -0.420516 & -0.356544 \\ 0.871754 & -0.420516 & 1 - \lambda & 0.962757 \\ 0.817954 & -0.356544 & 0.962757 & 1 - \lambda \end{bmatrix} \]


1.3.2 Menghitung Determinan Matriks \(A - \lambda I\)

Selanjutnya, kita harus menghitung determinannya dan menyelesaikan persamaan untuk mencari nilai eigen \(\lambda\). Determinannya dihitung menggunakan aturan ekspansi Laplace (untuk matriks 4x4, ini membutuhkan perhitungan yang lebih panjang). Namun, untuk menyederhanakan, kita akan menunjukkan bahwa hasil determinan ini memberikan persamaan karakteristik:

\[ \text{det}(A - \lambda I) = 0 \]

Setelah menyelesaikan persamaan ini, kita mendapatkan nilai eigen \(\lambda\):

\[ \lambda_1 = 2.91081808, \quad \lambda_2 = 0.92122093, \quad \lambda_3 = 0.14735328, \quad \lambda_4 = 0.02060771 \]


1.3.3 Menghitung Vektor Eigen

Sekarang kita akan menghitung vektor eigen untuk setiap nilai eigen \(\lambda\). Vektor eigen dapat dihitung dengan menggantikan \(\lambda\) yang telah ditemukan ke dalam persamaan:

\[ (A - \lambda I) \cdot v = 0 \]

Ini adalah sistem persamaan linier yang bisa diselesaikan untuk \(v\), vektor eigen.

Contoh: Menghitung Vektor Eigen untuk \(\lambda_1 = 2.91081808\)

Substitusikan \(\lambda_1 = 2.91081808\) ke dalam persamaan:

\[ (A - 2.91081808 I) \cdot v = 0 \]

Kita akan mendapatkan sistem persamaan linier:

\[ \begin{bmatrix} 1 - 2.91081808 & -0.109369 & 0.871754 & 0.817954 \\ -0.109369 & 1 - 2.91081808 & -0.420516 & -0.356544 \\ 0.871754 & -0.420516 & 1 - 2.91081808 & 0.962757 \\ 0.817954 & -0.356544 & 0.962757 & 1 - 2.91081808 \end{bmatrix} \cdot \begin{bmatrix} v_1 \\ v_2 \\ v_3 \\ v_4 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \\ 0 \\ 0 \end{bmatrix} \]

Solusi dari sistem persamaan linier ini memberikan vektor eigen \(v_1\):

\[ v_1 = \begin{bmatrix} 0.52237162 \\ -0.26335492 \\ 0.5810 \\ 0.566 \end{bmatrix} \]

Lakukan Hal yang Sama untuk \(\lambda_2\), \(\lambda_3\), \(\lambda_4\)

  • Untuk \(\lambda_2 = 0.92122093\), kita akan mendapatkan vektor eigen \(v_2\):

\[ v_2 = \begin{bmatrix} -0.372 \\ -0.926 \\ -0.021 \\ -0.065 \end{bmatrix} \]

  • Untuk \(\lambda_3 = 0.14735328\), kita akan mendapatkan vektor eigen \(v_3\):

\[ v_3 = \begin{bmatrix} -0.721 \\ 0.242 \\ 0.141 \\ 0.634 \end{bmatrix} \]

  • Untuk \(\lambda_4 = 0.02060771\), kita akan mendapatkan vektor eigen \(v_4\):

\[ v_4 = \begin{bmatrix} 0.262 \\ -0.124 \\ -0.801 \\ 0.524 \end{bmatrix} \]


1.3.4 Matriks Vektor Eigen

Terakhir, kita dapat menggabungkan semua vektor eigen menjadi satu matriks \(P\):

\[ P = \begin{bmatrix} 0.52237162 & -0.372 & -0.721 & 0.262 \\ -0.26335492 & -0.926 & 0.242 & -0.124 \\ 0.5810 & -0.021 & 0.141 & -0.801 \\ 0.566 & -0.065 & 0.634 & 0.524 \end{bmatrix} \]

Matriks \(P\) ini adalah matriks yang berisi vektor-vektor eigen sebagai kolom-kolomnya.


import pandas as pd
import numpy as np

data = pd.read_csv('data/data_bunga.csv')
features = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']
data_features = data[features]

# Normalisasi data menggunakan Z-Score
normalized_data = (data_features - data_features.mean()) / data_features.std()

# Menghitung matriks kovarians
cov_matrix = np.cov(normalized_data.T)

# Menghitung nilai eigen dan vektor eigen
eigen_values, eigen_vectors = np.linalg.eig(cov_matrix)

# Menampilkan hasil
print(f"Eigenvalues: {eigen_values}")
## Eigenvalues: [2.91081808 0.92122093 0.14735328 0.02060771]
print(f"Eigenvectors: {eigen_vectors}")
## Eigenvectors: [[ 0.52237162 -0.37231836 -0.72101681  0.26199559]
##  [-0.26335492 -0.92555649  0.24203288 -0.12413481]
##  [ 0.58125401 -0.02109478  0.14089226 -0.80115427]
##  [ 0.56561105 -0.06541577  0.6338014   0.52354627]]

1.4 Transformasi Data

##           PC1       PC2         Species
## 0   -2.264542  0.505704     Iris-setosa
## 1   -2.086426 -0.655405     Iris-setosa
## 2   -2.367950 -0.318477     Iris-setosa
## 3   -2.304197 -0.575368     Iris-setosa
## 4   -2.388777  0.674767     Iris-setosa
## ..        ...       ...             ...
## 145  1.870522  0.382822  Iris-virginica
## 146  1.558492 -0.905314  Iris-virginica
## 147  1.520845  0.266795  Iris-virginica
## 148  1.376391  1.016362  Iris-virginica
## 149  0.959299 -0.022284  Iris-virginica
## 
## [150 rows x 3 columns]

1.5 Visualisasi Hasil PCA