Matriks adalah susunan angka-angka di dalam kotak yang dibagi ke dalam baris dan kolom. Jika suatu matriks terdiri dari \(m\) baris dan \(n\) kolom, maka matriks tersebut dikatakan berukuran (ordo) \(m \times n\).
\[ A = \begin{bmatrix} 3 & 4 & 5 \\ 1 & 9 & 2 \\ 12 & 0 & 7 \end{bmatrix} \]
Matriks \(A\) di atas merupakan matriks persegi berordo \(3 \times 3\) yang terdiri dari 9 elemen. Setiap elemen matriks dituliskan sebagai \(a_{ij}\) dengan \(i\) menyatakan baris dan \(j\) menyatakan kolom. Sebagai contoh, \(a_{12} = 4\) menunjukkan elemen pada baris ke-1 dan kolom ke-2.
Di dalam R, cara menuliskan matriks adalah dengan menggunakan fungsi
matrix()
. Fungsi ini membutuhkan data, jumlah baris
(nrow
), dan jumlah kolom (ncol
). Adapun
byrow
adalah argumen yang menentukan cara pengisian elemen
ke dalam matriks:
- Jika byrow = TRUE
, maka elemen akan diisi per baris
(row-wise).
- Jika byrow = FALSE
, maka elemen akan diisi per kolom
(column-wise), yang merupakan nilai default di R.
# Input Data
X = matrix(c(1,8,9,
5,6,6,
2,9,10), nrow = 3, ncol = 3); X
## [,1] [,2] [,3]
## [1,] 1 5 2
## [2,] 8 6 9
## [3,] 9 6 10
Y = matrix(c(3,6,5,
9,7,1,
4,8,7), nrow = 3, ncol = 3, byrow = TRUE); Y
## [,1] [,2] [,3]
## [1,] 3 6 5
## [2,] 9 7 1
## [3,] 4 8 7
Operasi penjumlahan matriks dilakukan dengan menjumlahkan elemen yang seposisi (baris dan kolom yang sama) antara dua matriks yang berordo sama. Secara umum:
\[ (A + B)_{ij} = a_{ij} + b_{ij} \]
Dalam R, penjumlahan matriks \(X\) dan \(Y\) ditulis dengan perintah:
X + Y # X ditambah Y
## [,1] [,2] [,3]
## [1,] 4 11 7
## [2,] 17 13 10
## [3,] 13 14 17
Operasi pengurangan matriks dilakukan dengan mengurangkan elemen yang seposisi antara dua matriks yang berordo sama. Secara umum:
\[
(A - B)_{ij} = a_{ij} - b_{ij}
\]
Dalam R, pengurangan matriks \(X\) dan
\(Y\) ditulis dengan perintah:
X - Y # X dikurang Y
## [,1] [,2] [,3]
## [1,] -2 -1 -3
## [2,] -1 -1 8
## [3,] 5 -2 3
Operasi perkalian matriks hanya dapat dilakukan jika jumlah kolom matriks pertama sama dengan jumlah baris matriks kedua. Hasilnya berupa matriks baru dengan ukuran baris matriks pertama × kolom matriks kedua. Setiap elemen hasil \(c_{ij}\) diperoleh dengan menjumlahkan hasil kali elemen baris ke-\(i\) dari matriks pertama dengan elemen kolom ke-\(j\) dari matriks kedua:
\[ c_{ij} = \sum_{k=1}^n a_{ik} \cdot b_{kj} \]
dengan \(a_{ik}\) elemen matriks pertama dan \(b_{kj}\) elemen matriks kedua. Dalam R, pengurangan matriks \(X\) dan \(Y\) ditulis dengan perintah:
X %*% Y # X dikali Y
## [,1] [,2] [,3]
## [1,] 56 57 24
## [2,] 114 162 109
## [3,] 121 176 121
Y %*% X # Y dikali X
## [,1] [,2] [,3]
## [1,] 96 81 110
## [2,] 74 93 91
## [3,] 131 110 150
Perkalian skalar–matriks adalah operasi yang mengalikan setiap elemen suatu matriks dengan bilangan real \(k\). Jika matriks \(X = [x_{ij}]\) berukuran \(m \times n\), maka hasil kali skalar adalah
\[ M = kX = [k \cdot x_{ij}], \]
yang juga berukuran \(m \times n\). Demikian pula untuk matriks \(Y\):
\[ N = cY = [c \cdot y_{ij}]. \]
Berikut contoh perkalian matriks dengan skalar dalam R:
k = 2
c = 5
M = k * X; M # skalar k dikali matriks X
## [,1] [,2] [,3]
## [1,] 2 10 4
## [2,] 16 12 18
## [3,] 18 12 20
N = c * Y; N # skalar c dikali matriks Y
## [,1] [,2] [,3]
## [1,] 15 30 25
## [2,] 45 35 5
## [3,] 20 40 35
Invers matriks adalah suatu matriks yang jika dikalikan dengan matriks asalnya akan menghasilkan matriks identitas. Jika sebuah matriks \(A\) berukuran \(n \times n\) dan memiliki invers, maka matriks tersebut disebut invertibel, dan inversnya ditulis sebagai \(A^{-1}\). Hubungan yang berlaku adalah
\[ A \cdot A^{-1} = A^{-1} \cdot A = I, \]
di mana \(I\) adalah matriks identitas berukuran \(n \times n\). Tidak semua matriks memiliki invers; hanya matriks persegi dengan determinan tidak sama dengan nol yang bisa diinverskan.
Dalam R, perhitungan invers matriks dilakukan dengan fungsi
solve()
.
inv_X = solve(X); inv_X #Invers X
## [,1] [,2] [,3]
## [1,] -6 38 -33
## [2,] -1 8 -7
## [3,] 6 -39 34
inv_Y = solve(Y); inv_Y #Invers Y
## [,1] [,2] [,3]
## [1,] -3.727273 0.18181818 2.636364
## [2,] 5.363636 -0.09090909 -3.818182
## [3,] -4.000000 0.00000000 3.000000
Transpose matriks adalah operasi yang menukar baris menjadi kolom dan kolom menjadi baris dari suatu matriks. Jika \(A = [a_{ij}]\) adalah sebuah matriks berukuran \(m \times n\), maka transpose dari \(A\), yang ditulis \(A^T\), berukuran \(n \times m\) dengan elemen \(a_{ij}\) pada \(A\) berpindah menjadi \(a_{ji}\) pada \(A^T\).
Dalam R, transpose matriks dilakukan dengan fungsi
t()
.
transX = t(X); transX #Transpose Matriks X
## [,1] [,2] [,3]
## [1,] 1 8 9
## [2,] 5 6 6
## [3,] 2 9 10
transY = t(Y); transY #Transpose Matriks Y
## [,1] [,2] [,3]
## [1,] 3 9 4
## [2,] 6 7 8
## [3,] 5 1 7
Determinan adalah nilai skalar dari matriks persegi yang ditulis sebagai \(|A|\) atau \(det(A)\). Determinan dapat menunjukkan apakah suatu matriks invertibel \((det(A) \neq 0)\) dan juga berfungsi sebagai faktor skala pada transformasi linier.
Dalam R, perhitungan determinan matriks dilakukan dengan fungsi
det()
.
det(X) #Determinan X
## [1] -1
det(Y) #Determinan Y
## [1] -11
Dalam R, kita dapat membuat matriks dari sebuah deret angka dengan
menggunakan fungsi matrix()
. Fungsi ini membutuhkan
beberapa argumen penting, yaitu data yang ingin dimasukkan, jumlah baris
(nrow
), dan jumlah kolom (ncol
). Jika data
yang diberikan berupa urutan bilangan, maka elemen matriks akan terisi
sesuai urutan tersebut. Secara default, pengisian dilakukan per kolom
terlebih dahulu, dari atas ke bawah, lalu berlanjut ke kolom
berikutnya.
A <- matrix(21:40, nrow=4, ncol=5) ; A
## [,1] [,2] [,3] [,4] [,5]
## [1,] 21 25 29 33 37
## [2,] 22 26 30 34 38
## [3,] 23 27 31 35 39
## [4,] 24 28 32 36 40
Pada contoh di atas, kita membuat matriks A dengan ukuran 4 baris \(\times\) 5 kolom. Data yang digunakan adalah deret angka dari 21 sampai 40. Karena jumlah datanya ada 20, tepat sesuai dengan kapasitas matriks (4 \(\times\) 5 = 20), maka semua elemen akan terisi penuh. Angka 21 menempati posisi baris pertama kolom pertama, angka 22 pada baris kedua kolom pertama, dan seterusnya hingga angka 40 yang berada pada baris keempat kolom kelima.
Untuk membuat matriks di R, selain menggunakan deret angka secara langsung, kita juga bisa membentuknya dari sebuah vektor. Vektor adalah kumpulan elemen data yang disusun dalam satu dimensi. Dengan memanfaatkan vektor, kita dapat menentukan sendiri angka-angka yang ingin dimasukkan ke dalam matriks, kemudian mengatur bagaimana elemen tersebut akan ditempatkan ke dalam baris dan kolom.
b <- c(4,7,2,8,5,9,6,3,1,10,12,11)
B <- matrix(b, nrow=3, ncol=4, byrow=TRUE) ; B
## [,1] [,2] [,3] [,4]
## [1,] 4 7 2 8
## [2,] 5 9 6 3
## [3,] 1 10 12 11
Pada contoh ini, kita terlebih dahulu membuat sebuah vektor bernama b
yang berisi kumpulan angka acak, yaitu 4, 7, 2, 8, 5, 9, 6, 3, 1, 10,
12, dan 11. Selanjutnya, vektor tersebut digunakan sebagai data untuk
membentuk matriks \(B\) berukuran \(3 \times 4\). Karena digunakan argumen
byrow=TRUE
, maka angka pertama yaitu 4 akan ditempatkan
pada baris pertama kolom pertama, angka kedua yaitu 7 akan ditempatkan
di sebelahnya, dan begitu seterusnya hingga satu baris penuh. Setelah
baris pertama penuh, pengisian berlanjut ke baris kedua, kemudian ke
baris ketiga, sampai seluruh angka dalam vektor tersusun ke dalam bentuk
matriks.
Selain menggunakan deret angka berurutan atau vektor biasa, dalam R
kita juga dapat membuat matriks dengan menambahkan nama pada baris dan
kolom. Pemberian nama ini bermanfaat agar elemen-elemen matriks lebih
mudah dikenali, terutama ketika matriks tersebut mewakili data dengan
kategori tertentu. Penamaan dilakukan dengan argumen
dimnames
di dalam fungsi matrix()
, yang
menerima daftar berisi nama baris dan nama kolom. Dengan begitu, hasil
akhir matriks tidak hanya berupa angka, tetapi juga memiliki keterangan
yang jelas di setiap sisi.
sel <- c(15,9,27,18)
nama_kolom <- c("C1", "C2")
nama_baris <- c("R1", "R2")
C <- matrix(sel, nrow=2, ncol=2,
byrow=TRUE, dimnames=list(nama_baris,
nama_kolom)) ; C
## C1 C2
## R1 15 9
## R2 27 18
Pada contoh ini, kita membuat sebuah vektor sel yang berisi angka 15,
9, 27, dan 18. Vektor tersebut kemudian disusun ke dalam matriks \(C\) dengan ukuran \(2 \times 2\). Karena digunakan argumen
byrow=TRUE
, maka angka 15 akan ditempatkan pada baris
pertama kolom pertama, angka 9 di sebelahnya, lalu berlanjut ke baris
kedua dengan angka 27 dan 18. Selanjutnya, kita mendefinisikan nama
kolom melalui nama_kolom <- c("C1", "C2")
dan nama baris
melalui nama_baris <- c("R1", "R2")
. Nama-nama ini
kemudian digabungkan dalam argumen
dimnames=list(nama_baris, nama_kolom)
sehingga hasil
matriks \(C\) menampilkan label \(R1\) dan \(R2\) di sisi kiri sebagai penanda baris,
serta label \(C1\) dan \(C2\) di bagian atas sebagai penanda
kolom.
Setelah sebuah matriks berhasil dibuat, sering kali kita tidak
membutuhkan keseluruhan isinya, melainkan hanya bagian tertentu saja,
misalnya satu baris, satu kolom, atau elemen tertentu. Dalam R,
pemanggilan komponen matriks dilakukan dengan tanda kurung siku
[ ]
, di mana posisi baris dituliskan sebelum koma dan
posisi kolom dituliskan setelah koma. Jika salah satu bagian dibiarkan
kosong, maka artinya kita mengambil semua baris atau semua kolom. Dengan
cara ini, kita dapat mengakses bagian mana pun dari matriks sesuai
kebutuhan.
A
## [,1] [,2] [,3] [,4] [,5]
## [1,] 21 25 29 33 37
## [2,] 22 26 30 34 38
## [3,] 23 27 31 35 39
## [4,] 24 28 32 36 40
A[,2] # Kolom 2
## [1] 25 26 27 28
A[3,] # Baris 3
## [1] 23 27 31 35 39
A[3,2] # Sel(3, 2)
## [1] 27
A[c(1,3),2] # Sel(1,2) dan sel(3,2)
## [1] 25 27
A[,1:3] # kolom(1,2,3)
## [,1] [,2] [,3]
## [1,] 21 25 29
## [2,] 22 26 30
## [3,] 23 27 31
## [4,] 24 28 32
A[2:4,] # baris(2,3,4)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 22 26 30 34 38
## [2,] 23 27 31 35 39
## [3,] 24 28 32 36 40
Sebagai contoh, ketika kita menuliskan A
, maka seluruh
isi matriks \(A\) akan ditampilkan
secara lengkap. Jika kita ingin mengambil hanya kolom tertentu, misalnya
kolom kedua, maka digunakan perintah A[,2]
. Pada perintah
ini, bagian baris dibiarkan kosong sehingga semua baris tetap
ditampilkan, tetapi hanya untuk kolom ke-2 saja. Sebaliknya, jika ingin
menampilkan seluruh isi baris tertentu, misalnya baris ke-3, maka
digunakan perintah A[3,]
.
Selain itu, kita juga dapat mengakses elemen tunggal pada posisi
tertentu. Misalnya, A[3,2]
akan mengambil nilai dari elemen
yang berada pada baris ke-3 dan kolom ke-2. Jika kita ingin memanggil
lebih dari satu elemen sekaligus dalam satu kolom, misalnya elemen pada
baris ke-1 kolom ke-2 dan baris ke-3 kolom ke-2, maka digunakan perintah
A[c(1,3),2]
. Bentuk c(1,3)
di sini berarti
kita mengambil baris ke-1 dan ke-3.
Tidak hanya itu, kita juga bisa mengambil beberapa kolom atau
beberapa baris sekaligus. Perintah A[,1:3]
digunakan untuk
menampilkan semua baris dari kolom ke-1 hingga kolom ke-3, sehingga
hasilnya adalah submatriks berukuran \(4
\times 3\). Sedangkan perintah A[2:4,]
akan
menampilkan semua kolom, tetapi hanya untuk baris ke-2 hingga ke-4.
Secara sederhana, nilai eigen (eigenvalue) adalah bilangan skalar yang menunjukkan seberapa besar suatu vektor berubah arah atau panjangnya ketika dikenakan transformasi linier oleh sebuah matriks, sedangkan vektor eigen (eigenvector) adalah vektor tak nol yang arah perubahannya tetap ketika dikenakan transformasi tersebut.
Dengan kata lain, jika sebuah matriks \(A\) mengalikan vektor \(v\) dan menghasilkan hasil yang searah dengan \(v\) itu sendiri, maka \(v\) disebut vektor eigen dari \(A\), dan skalar pengalinya yaitu \(\lambda\) disebut nilai eigen yang bersesuaian. Secara umum, hubungan antara matriks, nilai eigen, dan vektor eigen dapat dituliskan sebagai:
\[ A v = \lambda v \]
eigX = eigen(X); eigX
## eigen() decomposition
## $values
## [1] 18.90178326 -1.92920648 0.02742322
##
## $vectors
## [,1] [,2] [,3]
## [1,] -0.2623239 -0.8282409 -0.6871266
## [2,] -0.6562066 0.2945256 -0.1506428
## [3,] -0.7075161 0.4767303 0.7107487
eigY = eigen(Y); eigY
## eigen() decomposition
## $values
## [1] 16.4107337 1.1647491 -0.5754827
##
## $vectors
## [,1] [,2] [,3]
## [1,] 0.4960227 0.3544900 0.5422048
## [2,] 0.5461083 -0.6602220 -0.7045920
## [3,] 0.6750757 0.6621508 0.4577817
eigvalX = eigX$values; eigvalX
## [1] 18.90178326 -1.92920648 0.02742322
eigvalY = eigY$values; eigvalY
## [1] 16.4107337 1.1647491 -0.5754827
eigvecX = eigX$vectors; eigvecX
## [,1] [,2] [,3]
## [1,] -0.2623239 -0.8282409 -0.6871266
## [2,] -0.6562066 0.2945256 -0.1506428
## [3,] -0.7075161 0.4767303 0.7107487
eigvecY = eigY$vectors; eigvecY
## [,1] [,2] [,3]
## [1,] 0.4960227 0.3544900 0.5422048
## [2,] 0.5461083 -0.6602220 -0.7045920
## [3,] 0.6750757 0.6621508 0.4577817
Dalam R, perhitungan nilai eigen (eigenvalue) dan vektor
eigen (eigenvector) dapat dilakukan dengan fungsi
eigen()
. Misalnya, untuk sebuah matriks \(X\), kita dapat memanggil fungsi
eigX = eigen(X); eigX
. Perintah ini akan menghasilkan
keluaran berupa nilai eigen dan vektor eigen dari matriks \(X\). Hal yang sama berlaku untuk matriks
\(Y\) dengan syntax
eigY = eigen(Y); eigY
.
Jika ingin memisahkan hasilnya, nilai eigen dapat diakses dengan
menambahkan $values
, sehingga ditulis
eigvalX = eigX$values; eigvalX
untuk mendapatkan nilai
eigen dari matriks \(X\), dan
eigvalY = eigY$values; eigvalY
untuk matriks \(Y\). Sedangkan vektor eigen dapat diakses
dengan $vectors
, yaitu
eigvecX = eigX$vectors; eigvecX
untuk matriks \(X\), dan
eigvecY = eigY$vectors; eigvecY
untuk matriks $Y`.
Dengan demikian, fungsi eigen()
di R memudahkan kita
untuk langsung memperoleh baik nilai eigen maupun vektor eigen, serta
memungkinkan kita mengakses keduanya secara terpisah sesuai kebutuhan
analisis.
Singular Value Decomposition (SVD) adalah salah satu teknik penting dalam aljabar linear yang memfaktorkan sebuah matriks \(A\) berukuran \(m \times n\) menjadi tiga matriks, yaitu:
\[A = U \Sigma V^T\]
di mana \(U\) adalah matriks ortogonal berukuran \(m \times m\), \(\Sigma\) adalah matriks diagonal berukuran \(m \times n\) yang berisi nilai singular (singular values), dan \(V^T\) adalah transpose dari matriks ortogonal \(V\) berukuran \(n \times n\). Nilai singular dalam \(\Sigma\) dapat dianggap sebagai akar kuadrat dari nilai eigen matriks \(A^TA\) atau \(AA^T\).
Kegunaan SVD sangat luas, baik dalam teori maupun aplikasi. Dalam analisis data, SVD digunakan sebagai dasar dari Principal Component Analysis (PCA) untuk mereduksi dimensi data tanpa kehilangan informasi penting. Selain itu, SVD banyak dimanfaatkan dalam kompresi citra, pengolahan sinyal, sistem rekomendasi, deteksi pola, hingga penyelesaian sistem persamaan linear yang tidak stabil. Dengan kemampuan memecah matriks menjadi bentuk yang lebih sederhana, SVD membantu memahami struktur internal data serta mempercepat berbagai metode analisis multivariat.
library(MASS)
a <- matrix(c(5,-3,6,2,-4,8,-2,5,-1,7,3,9), 4, 3, byrow=TRUE)
a
## [,1] [,2] [,3]
## [1,] 5 -3 6
## [2,] 2 -4 8
## [3,] -2 5 -1
## [4,] 7 3 9
svd_result <- svd(a)
singular_value <- svd_result$d ; singular_value
## [1] 16.07076 7.41936 3.11187
U <- svd_result$u ; U
## [,1] [,2] [,3]
## [1,] -0.5046975 0.2278362 -0.3742460
## [2,] -0.5178195 0.4138180 0.7413297
## [3,] 0.1646416 -0.6063789 0.5337354
## [4,] -0.6708477 -0.6396483 -0.1596770
V <- svd_result$v ; V
## [,1] [,2] [,3]
## [1,] -0.5341591 -0.17494276 -0.8270847
## [2,] 0.1490928 -0.98251336 0.1115295
## [3,] -0.8321330 -0.06373793 0.5509011
Pada syntax di atas, pertama-tama dipanggil library MASS
yang berisi berbagai fungsi untuk analisis statistik dan aljabar linear.
Selanjutnya, dibuat sebuah matriks a
berukuran \(4 \times 3\) dengan perintah
matrix(c(...), 4, 3, byrow=TRUE)
, di mana elemen-elemen
matriks dimasukkan secara baris demi baris karena digunakan argumen
byrow=TRUE
. Setelah matriks a
terbentuk,
dilakukan dekomposisi nilai singular dengan fungsi svd(a)
,
dan hasilnya disimpan dalam objek svd_result
.
Hasil SVD ini berupa tiga komponen utama: nilai singular, matriks
\(U\), dan matriks \(V\). Nilai singular dapat diakses melalui
svd_result$d
, yang berisi diagonal dari matriks \(\Sigma\). Matriks \(U\) dapat dipanggil dengan
svd_result$u
, sedangkan matriks \(V\) diperoleh dengan
svd_result$v
. Dengan demikian, dari syntax ini kita
memperoleh secara lengkap hasil faktorisasi SVD, yaitu \(A = U \Sigma V^T\).
Konsep jarak dalam analisis data multivariat digunakan untuk mengukur tingkat kesamaan atau perbedaan antara dua objek atau unit observasi berdasarkan sekumpulan variabel. Jarak ini tidak hanya terbatas pada perbedaan nilai tunggal, tetapi mencakup perbedaan dari banyak dimensi sekaligus. Beberapa ukuran jarak yang umum digunakan antara lain Euclidean Distance, Manhattan Distanc*, Chebyshev Distance, Minkowski Distance, hingga Mahalanobis Distance.
Untuk memudahkan analisis, hasil perhitungan jarak antar semua pasangan observasi biasanya disajikan dalam bentuk matriks jarak (distance matrix). Matriks jarak adalah matriks simetris berukuran \(n \times n\), di mana \(n\) adalah jumlah observasi, dan setiap elemen \(d_{ij}\) menunjukkan jarak antara observasi ke-\(i\) dan ke-\(j\). Elemen diagonal selalu bernilai nol karena jarak suatu objek terhadap dirinya sendiri adalah nol.
set.seed(321)
ss <- sample(1:50, 15)
df <- USArrests[ss, ]
df.scaled <- scale(df); df.scaled
## Murder Assault UrbanPop Rape
## Wyoming -0.3721741 -0.02296746 -0.3418930 -0.62039386
## Illinois 0.4221896 1.02244775 1.2520675 0.62633064
## Mississippi 1.6799322 1.14124493 -1.4507350 -0.39776448
## Kansas -0.5486994 -0.56943449 0.0739228 -0.26418686
## New York 0.5766492 1.08184634 1.4599754 0.93801176
## Kentucky 0.2677300 -0.64071280 -0.8963140 -0.51650015
## Oklahoma -0.4163054 -0.14176464 0.2125281 0.03265231
## Hawaii -0.7031590 -1.38913505 1.2520675 0.06233622
## Missouri 0.1132704 0.17898775 0.3511333 1.24969289
## New Mexico 0.6428462 1.45011760 0.3511333 1.82852926
## Louisiana 1.5254725 1.02244775 0.0739228 0.35917539
## South Dakota -1.0341439 -0.91394632 -1.3814324 -1.03596869
## Iowa -1.3871944 -1.27033787 -0.5498008 -1.25859806
## North Dakota -1.6961136 -1.40101477 -1.4507350 -1.85227639
## Texas 0.9296998 0.45222127 1.0441596 0.84896001
## attr(,"scaled:center")
## Murder Assault UrbanPop Rape
## 8.486667 162.933333 64.933333 19.780000
## attr(,"scaled:scale")
## Murder Assault UrbanPop Rape
## 4.531929 84.177081 14.429467 6.737655
Pada syntax di atas, fungsi set.seed(321)
digunakan
terlebih dahulu untuk menetapkan seed dari generator bilangan acak. Hal
ini bertujuan agar hasil pengambilan sampel dapat direproduksi (selalu
sama setiap kali kode dijalankan).
Selanjutnya, perintah ss <- sample(1:50, 15)
digunakan untuk mengambil 15 sampel acak dari angka 1 sampai 50.
Hasilnya berupa sebuah vektor ss
yang berisi indeks-indeks
terpilih.
Kemudian, df <- USArrests[ss, ]
berfungsi untuk
memilih 15 baris data dari dataset bawaan R bernama
USArrests
sesuai dengan indeks yang ada pada
ss
. Dengan demikian, df
merupakan subset dari
dataset USArrests
yang hanya berisi 15 observasi hasil
sampel acak tersebut.
Terakhir, df.scaled <- scale(df); df.scaled
digunakan
untuk melakukan standardisasi pada setiap variabel dalam data
df
. Fungsi scale()
menstandarkan data dengan
cara mengurangi setiap nilai dengan rata-rata variabelnya, lalu
membaginya dengan standar deviasi variabel tersebut. Hasilnya, setiap
variabel dalam df.scaled
akan memiliki rata-rata nol dan
standar deviasi satu. Standardisasi ini penting untuk analisis
multivariat, karena semua variabel menjadi berada pada skala yang sama
sehingga tidak ada variabel yang mendominasi perhitungan jarak akibat
perbedaan satuan.
Jarak Euclidean merupakan ukuran jarak yang paling umum digunakan dalam analisis multivariat. Secara sederhana, jarak Euclidean adalah panjang garis lurus antara dua titik dalam ruang berdimensi banyak. Jika terdapat dua buah observasi \(x = (x_1, x_2, \dots, x_p)\) dan \(y = (y_1, y_2, \dots, y_p)\) yang masing-masing memiliki \(p\) variabel, maka jarak Euclidean di antara keduanya dapat dihitung dengan rumus:
\[ d(x, y) = \sqrt{ \sum_{i=1}^p (x_i - y_i)^2 } \]
Dengan kata lain, rumus ini menjumlahkan selisih kuadrat dari setiap pasangan variabel, kemudian diakarkan. Jarak Euclidean akan selalu bernilai non-negatif, dan bernilai nol hanya jika kedua observasi identik.
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.4.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.4.3
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
dist.eucl <- dist(df.scaled, method = "euclidean"); dist.eucl
## Wyoming Illinois Mississippi Kansas New York Kentucky
## Illinois 2.4122476
## Mississippi 2.6164146 3.1543527
## Kansas 0.7934567 2.3786048 3.1993198
## New York 2.7921742 0.4095812 3.3878156 2.7128511
## Kentucky 1.0532156 2.9515362 2.3433244 1.2948587 3.2757206
## Oklahoma 0.8659748 1.8685718 2.9986711 0.5547563 2.2043102 1.4993175
## Hawaii 2.2322175 2.7203365 4.4270510 1.4800030 2.9246694 2.5403456
## Missouri 2.0625111 1.4167282 3.0563398 1.8349434 1.5351057 2.3176129
## New Mexico 3.1109091 1.5775154 3.0617092 3.1551035 1.4705638 3.4011133
## Louisiana 2.4137967 1.6360410 1.7133330 2.6879097 1.7776353 2.4609320
## South Dakota 1.5765126 3.9457686 3.4644086 1.7515852 4.3067435 1.5082173
## Iowa 1.7426214 3.9154083 4.0958166 1.6038155 4.2724405 1.9508929
## North Dakota 2.5296038 4.8794481 4.4694938 2.6181473 5.2524274 2.5546862
## Texas 2.4496576 0.8218968 2.9692463 2.3259192 0.8377979 2.6949264
## Oklahoma Hawaii Missouri New Mexico Louisiana South Dakota
## Illinois
## Mississippi
## Kansas
## New York
## Kentucky
## Oklahoma
## Hawaii 1.6491638
## Missouri 1.3724911 2.3123720
## New Mexico 2.6268378 3.7154012 1.4937447
## Louisiana 2.2916633 3.5012381 1.8909275 1.7882330
## South Dakota 2.1588538 2.9115203 3.2767510 4.4281177 3.7902169
## Iowa 2.1130016 2.3395756 3.3845451 4.6758935 4.0922753 0.9964108
## North Dakota 3.0891779 3.4578871 4.3173165 5.5131433 4.8442635 1.1604313
## Texas 1.8768374 2.5920693 1.1756214 1.5867966 1.3643137 3.8935265
## Iowa North Dakota
## Illinois
## Mississippi
## Kansas
## New York
## Kentucky
## Oklahoma
## Hawaii
## Missouri
## New Mexico
## Louisiana
## South Dakota
## Iowa
## North Dakota 1.1298867
## Texas 3.9137858 4.8837032
fviz_dist(dist.eucl)
Perintah
dist.eucl <- dist(df.scaled, method = "euclidean")
digunakan untuk menghitung jarak Euclidean antar setiap pasangan
observasi pada data df.scaled
. Hasilnya berupa matriks jara
berisi nilai jarak antar baris data. Nilai yang lebih kecil menunjukkan
bahwa dua observasi relatif lebih mirip (posisinya berdekatan dalam
ruang multidimensi), sedangkan nilai yang lebih besar menunjukkan
perbedaan yang lebih jauh atau kurang mirip antar observasi
tersebut.
Selanjutnya, fviz_dist(dist.eucl)
digunakan untuk
memvisualisasikan matriks jarak dalam bentuk heatmap. Pada
visualisasi ini, warna yang lebih terang biasanya menunjukkan jarak yang
lebih kecil (objek lebih mirip), sedangkan warna yang lebih gelap
menunjukkan jarak yang lebih besar (objek lebih berbeda). Dengan cara
ini, kita dapat dengan cepat mengidentifikasi kelompok observasi yang
saling berdekatan (cluster alami) maupun observasi yang sangat berbeda
dari yang lain (outlier).
Interpretasinya:
Jika terdapat beberapa observasi dengan nilai jarak Euclidean yang rendah terhadap satu sama lain, maka mereka cenderung membentuk satu kelompok (cluster).
Sebaliknya, jika ada observasi dengan nilai jarak tinggi terhadap hampir semua lainnya, maka observasi tersebut bisa dianggap berbeda signifikan atau bahkan sebagai outlier.
Jarak Chebyshev merupakan ukuran jarak yang mendefinisikan jarak maksimum antar dimensi dari dua titik dalam ruang berdimensi banyak. Dengan kata lain, jarak ini hanya mempertimbangkan selisih terbesar di antara semua variabel. Jika terdapat dua observasi \(x = (x_1, x_2, \dots, x_p)\) dan \(y = (y_1, y_2, \dots, y_p)\), maka jarak Chebyshev didefinisikan sebagai:
\[ d(x, y) = \max_i |x_i - y_i| \]
Artinya, jarak Chebyshev melihat dimensi mana yang memiliki perbedaan terbesar, dan itulah yang dijadikan ukuran jarak. Karena itu, metrik ini juga dikenal dengan nama jarak maksimum (maximum metric) atau jarak papan catur (chessboard distance), karena mencerminkan langkah terpanjang yang harus diambil dalam satu arah untuk mencapai titik lain.
dist.cheb <- dist(df.scaled, method = "maximum"); dist.cheb
## Wyoming Illinois Mississippi Kansas New York Kentucky
## Illinois 1.5939604
## Mississippi 2.0521063 2.7028025
## Kansas 0.5464670 1.5918822 2.2286315
## New York 1.8018683 0.3116811 2.9107104 1.6512808
## Kentucky 0.6399041 2.1483815 1.7819577 0.9702368 2.3562894
## Oklahoma 0.6530462 1.1642124 2.0962376 0.4276699 1.2474473 1.1088421
## Hawaii 1.5939604 2.4115828 2.7028025 1.1781447 2.4709814 2.1483815
## Missouri 1.8700867 0.9009342 1.8018683 1.5138797 1.1088421 1.7661930
## New Mexico 2.4489231 1.2021986 2.2262937 2.0927161 1.1088421 2.3450294
## Louisiana 1.8976467 1.1781447 1.5246578 2.0741719 1.3860526 1.6631605
## South Dakota 1.0395394 2.6334999 2.7140760 1.4553552 2.8414078 1.3018739
## Iowa 1.2473704 2.2927856 3.0671266 0.9944112 2.3521842 1.6549244
## North Dakota 1.3780473 2.7028025 3.3760458 1.5880895 2.9107104 1.9638436
## Texas 1.4693539 0.5702265 2.4948946 1.4783991 0.6296251 1.9404736
## Oklahoma Hawaii Missouri New Mexico Louisiana South Dakota
## Illinois
## Mississippi
## Kansas
## New York
## Kentucky
## Oklahoma
## Hawaii 1.2473704
## Missouri 1.2170406 1.5681228
## New Mexico 1.7958770 2.8392526 1.2711298
## Louisiana 1.9417780 2.4115828 1.4122022 1.4693539
## South Dakota 1.5939604 2.6334999 2.2856616 2.8644979 2.5596164
## Iowa 1.2912504 1.8018683 2.5082909 3.0871273 2.9126670 0.8316315
## North Dakota 1.8849287 2.7028025 3.1019693 3.6808057 3.2215862 0.8163077
## Texas 1.3460052 1.8413563 0.8164294 0.9978963 0.9702368 2.4255920
## Iowa North Dakota
## Illinois
## Mississippi
## Kansas
## New York
## Kentucky
## Oklahoma
## Hawaii
## Missouri
## New Mexico
## Louisiana
## South Dakota
## Iowa
## North Dakota 0.9009342
## Texas 2.3168942 2.7012364
fviz_dist(dist.cheb)
Perintah
dist.cheb <- dist(df.scaled, method = "maximum")
digunakan untuk menghitung jarak Chebyshev antar setiap pasangan
observasi pada data df.scaled
. Rumus jarak Chebyshev
mengambil selisih absolut terbesar dari semua variabel antara dua
observasi. Dengan kata lain, jika ada satu dimensi di mana kedua
observasi sangat berbeda, maka itulah yang dianggap sebagai jarak utama
di antara keduanya.
Hasil dist.cheb
berupa matriks jarak yang berisi nilai
perbedaan maksimum antar observasi. Nilai kecil berarti tidak ada
perbedaan ekstrem pada variabel manapun (observasi relatif mirip),
sedangkan nilai besar menunjukkan adanya perbedaan yang sangat
signifikan pada salah satu variabel.
Selanjutnya, fviz_dist(dist.cheb)
digunakan untuk
memvisualisasikan matriks jarak tersebut dalam bentuk heatmap.
Pada visualisasi, warna terang biasanya merepresentasikan jarak kecil
(observasi mirip), sedangkan warna gelap merepresentasikan jarak besar
(observasi berbeda jauh pada satu variabel tertentu).
Interpretasinya:
Dua observasi bisa saja tampak mirip pada sebagian besar variabel, tetapi jika terdapat satu variabel dengan selisih besar, jarak Chebyshev akan tinggi.
Jarak ini cocok digunakan ketika analisis lebih menekankan pada perbedaan maksimum antar variabel dibanding rata-rata perbedaan.
Jarak Manhattan, juga dikenal sebagai taxicab distance atau L1 norm, adalah ukuran jarak antar dua titik yang dihitung berdasarkan jumlah selisih absolut dari masing-masing variabel. Ibaratnya, jarak Manhattan menggambarkan jarak yang ditempuh taksi di jalan berbentuk grid (kotak-kotak), sehingga hanya bisa bergerak ke arah horizontal atau vertikal, bukan diagonal.
Secara matematis, jika terdapat dua observasi \(x = (x_1, x_2, \dots, x_p)\) dan \(y = (y_1, y_2, \dots, y_p)\), maka jarak Manhattan didefinisikan sebagai:
\[ d(x, y) = \sum_{i=1}^p |x_i - y_i| \]
Artinya, jarak Manhattan menjumlahkan seluruh perbedaan absolut pada setiap variabel antar dua observasi.
dist.man <- dist(df.scaled, method = "manhattan"); dist.man
## Wyoming Illinois Mississippi Kansas New York Kentucky
## Illinois 4.6804639
## Mississippi 4.5477901 5.1034373
## Kansas 1.4950151 4.6314334 5.5975464
## New York 5.4139111 0.7334472 5.4091682 5.3648806
## Kentucky 1.9159642 5.1088324 3.8673166 2.1102578 5.8422796
## Oklahoma 1.3703957 3.6359252 5.4729270 0.9955082 4.3693724 2.8409781
## Hawaii 3.9738430 4.1009258 8.0763743 2.4788279 4.8343730 4.4465291
## Missouri 3.2505127 2.6766756 5.9782446 3.2014823 2.7867606 3.9878005
## New Mexico 5.6300548 2.7514592 5.3741207 5.5810243 2.4338278 6.0584233
## Louisiana 4.3384469 2.5485829 2.5548545 4.2894164 2.9731109 4.7668154
## South Dakota 3.0080629 7.6885267 5.4767741 3.0570933 8.4219740 2.5796943
## Iowa 3.1085028 7.7889667 7.2404771 3.1575333 8.5224139 3.3731605
## North Dakota 5.0427114 9.7231753 7.3728174 5.0917419 10.4566225 4.6143429
## Texas 4.6324690 1.5082739 5.1808752 4.5834386 1.4875431 5.0608376
## Oklahoma Hawaii Missouri New Mexico Louisiana
## Illinois
## Mississippi
## Kansas
## New York
## Kentucky
## Oklahoma
## Hawaii 2.6034473
## Missouri 2.2059740 4.4728430
## New Mexico 4.5855161 6.8523850 2.3795420
## Louisiana 3.5711187 6.1151982 3.4233902 3.0568606
## South Dakota 4.0526016 4.5379784 6.2585756 8.6381176 7.3465098
## Iowa 4.1530415 3.9256352 6.3590155 8.7385576 7.4469497
## North Dakota 6.0872501 5.6222495 8.2932241 10.6727662 9.3811583
## Texas 3.5879303 4.4687467 2.1834220 2.9573454 2.6260207
## South Dakota Iowa North Dakota
## Illinois
## Mississippi
## Kansas
## New York
## Kentucky
## Oklahoma
## Hawaii
## Missouri
## New Mexico
## Louisiana
## South Dakota
## Iowa 1.7637030
## North Dakota 2.0346485 1.9342086
## Texas 7.6405319 7.7409718 9.6751804
fviz_dist(dist.man)
Perintah
dist.man <- dist(df.scaled, method = "manhattan")
digunakan untuk menghitung jarak Manhattan antar setiap pasangan
observasi pada data df.scaled
. Rumus jarak Manhattan
menghitung jumlah dari semua selisih absolut antar variabel. Dengan
demikian, jarak ini mencerminkan akumulasi perbedaan di seluruh
dimensi.
Hasil dist.man
berupa matriks jarak yang berisi nilai
jarak Manhattan untuk setiap pasangan observasi. Nilai yang lebih kecil
menunjukkan bahwa dua observasi sangat mirip secara keseluruhan,
sedangkan nilai yang lebih besar menunjukkan banyaknya perbedaan yang
terakumulasi di berbagai variabel.
Perintah fviz_dist(dist.man)
memvisualisasikan matriks
jarak dalam bentuk heatmap. Dalam peta panas tersebut, warna
terang biasanya menunjukkan jarak kecil (observasi mirip), sedangkan
warna gelap menunjukkan jarak besar (observasi berbeda jauh).
Interpretasinya:
Jika dua observasi hanya berbeda sedikit di banyak variabel, jarak Manhattan tetap bisa menjadi besar karena perbedaan kecil itu dijumlahkan.
Jika terdapat perbedaan besar di beberapa variabel saja, nilainya juga akan terlihat signifikan.
Jarak Manhattan cocok digunakan ketika kita ingin memperhatikan total perbedaan akumulatif antar observasi, bukan hanya perbedaan terbesar (Chebyshev) atau jarak lurus (Euclidean).
Jarak Mahalanobis adalah ukuran jarak antar dua observasi yang memperhitungkan korelasi antar variabel. Tidak seperti Euclidean atau Manhattan yang mengasumsikan semua variabel independen, Mahalanobis menyesuaikan perhitungan dengan mempertimbangkan struktur kovarian data. Oleh karena itu, jarak ini sangat berguna untuk mendeteksi outlier multivariat atau mengukur kemiripan ketika variabel-variabel saling berkorelasi.
Secara matematis, jika \(x\) adalah vektor observasi dan \(\mu\) adalah vektor rata-rata, maka jarak Mahalanobis didefinisikan sebagai:
\[ D_M(x) = \sqrt{ (x - \mu)^T S^{-1} (x - \mu) } \]
di mana \(S^{-1}\) adalah invers dari matriks kovarian \(S\). Untuk jarak antar dua observasi \(x\) dan \(y\), formulanya ditulis sebagai:
\[ D_M(x, y) = \sqrt{ (x - y)^T S^{-1} (x - y) } \]
library(StatMatch)
## Warning: package 'StatMatch' was built under R version 4.4.3
## Loading required package: proxy
## Warning: package 'proxy' was built under R version 4.4.3
##
## Attaching package: 'proxy'
## The following objects are masked from 'package:stats':
##
## as.dist, dist
## The following object is masked from 'package:base':
##
## as.matrix
## Loading required package: survey
## Warning: package 'survey' was built under R version 4.4.3
## Loading required package: grid
## Loading required package: Matrix
## Loading required package: survival
##
## Attaching package: 'survey'
## The following object is masked from 'package:graphics':
##
## dotchart
## Loading required package: lpSolve
## Warning: package 'lpSolve' was built under R version 4.4.2
## Loading required package: dplyr
## Warning: package 'dplyr' was built under R version 4.4.3
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:MASS':
##
## select
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
dist.mah <- mahalanobis.dist(df.scaled); dist.mah
## Wyoming Illinois Mississippi Kansas New York Kentucky
## Wyoming 0.000000 1.7186109 2.820779 1.4195095 1.8695558 2.867847
## Illinois 1.718611 0.0000000 3.658323 2.2905255 0.4722069 3.878642
## Mississippi 2.820779 3.6583235 0.000000 3.2139075 3.6566922 2.544477
## Kansas 1.419510 2.2905255 3.213907 0.0000000 2.1522535 2.048031
## New York 1.869556 0.4722069 3.656692 2.1522535 0.0000000 3.698342
## Kentucky 2.867847 3.8786421 2.544477 2.0480310 3.6983422 0.000000
## Oklahoma 1.146496 1.8980286 3.237573 0.6499978 1.7772007 2.505941
## Hawaii 3.466671 3.6449604 4.722203 2.2108491 3.3748818 2.753554
## Missouri 3.198071 3.6796400 3.956918 2.2592572 3.3618939 2.642756
## New Mexico 3.281318 3.5101406 4.057258 3.1016653 3.2869855 3.870023
## Louisiana 2.284940 2.5550539 1.688058 2.2700723 2.4136664 2.119635
## South Dakota 1.826205 3.3564158 3.087365 1.6274307 3.3404110 2.261154
## Iowa 1.327907 2.6329606 3.559587 1.1128197 2.6839965 2.621704
## North Dakota 1.582582 3.1919907 3.553572 1.9466491 3.3317039 3.040465
## Texas 2.540604 2.4769381 3.093919 1.7462066 2.1399545 2.108949
## Oklahoma Hawaii Missouri New Mexico Louisiana South Dakota
## Wyoming 1.1464956 3.466671 3.198071 3.281318 2.284940 1.826205
## Illinois 1.8980286 3.644960 3.679640 3.510141 2.555054 3.356416
## Mississippi 3.2375727 4.722203 3.956918 4.057258 1.688058 3.087365
## Kansas 0.6499978 2.210849 2.259257 3.101665 2.270072 1.627431
## New York 1.7772007 3.374882 3.361894 3.286985 2.413666 3.340411
## Kentucky 2.5059414 2.753554 2.642756 3.870023 2.119635 2.261154
## Oklahoma 0.0000000 2.705865 2.203038 2.660216 2.350208 1.672866
## Hawaii 2.7058650 0.000000 3.193764 4.645567 3.383255 3.551072
## Missouri 2.2030382 3.193764 0.000000 1.836797 3.256319 2.505784
## New Mexico 2.6602159 4.645567 1.836797 0.000000 3.676879 3.026024
## Louisiana 2.3502077 3.383255 3.256319 3.676879 0.000000 3.021642
## South Dakota 1.6728664 3.551072 2.505784 3.026024 3.021642 0.000000
## Iowa 1.3299426 2.790197 3.145245 3.792086 2.954252 1.518854
## North Dakota 1.9813596 3.780966 3.590548 3.950259 3.434074 1.304743
## Texas 1.9635201 2.082005 2.576037 3.501666 1.527269 3.090805
## Iowa North Dakota Texas
## Wyoming 1.327907 1.582582 2.540604
## Illinois 2.632961 3.191991 2.476938
## Mississippi 3.559587 3.553572 3.093919
## Kansas 1.112820 1.946649 1.746207
## New York 2.683996 3.331704 2.139954
## Kentucky 2.621704 3.040465 2.108949
## Oklahoma 1.329943 1.981360 1.963520
## Hawaii 2.790197 3.780966 2.082005
## Missouri 3.145245 3.590548 2.576037
## New Mexico 3.792086 3.950259 3.501666
## Louisiana 2.954252 3.434074 1.527269
## South Dakota 1.518854 1.304743 3.090805
## Iowa 0.000000 1.045923 2.734770
## North Dakota 1.045923 0.000000 3.563193
## Texas 2.734770 3.563193 0.000000
dist.mah_matrix <- as.matrix(dist.mah)
Pada syntax ini, fungsi mahalanobis.dist()
dari package
StatMatch
digunakan untuk menghitung jarak Mahalanobis
antar setiap pasangan observasi pada data df.scaled
.
Perintah dist.mah <- mahalanobis.dist(df.scaled)
menghasilkan sebuah objek matriks jarak khusus, sedangkan
dist.mah_matrix <- as.matrix(dist.mah)
mengubahnya ke
bentuk matriks biasa sehingga dapat dilihat dan dianalisis lebih mudah.
Setiap elemen \(d_{ij}\) dalam matriks
tersebut merepresentasikan jarak Mahalanobis antara observasi ke-\(i\) dan observasi ke-\(j\).
Interpretasinya:
Jika \(d_{ij}\) bernilai kecil, berarti observasi ke-\(i\) dan ke-\(j\) mirip, bahkan setelah menyesuaikan efek korelasi antar variabel.
Jika \(d_{ij}\) bernilai besar, berarti kedua observasi tersebut berbeda signifikan, bisa jadi salah satunya merupakan outlier multivariat.
Elemen diagonal dari matriks selalu bernilai nol, karena jarak setiap observasi dengan dirinya sendiri adalah nol.
Jarak Minkowski adalah ukuran jarak yang merupakan generalisasi dari jarak Euclidean dan Manhattan. Ukuran ini menggunakan parameter \(q\) (atau \(p\)) untuk menyesuaikan bentuk perhitungannya.
Secara matematis, jarak Minkowski antara dua observasi \(x = (x_1, x_2, \dots, x_p)\) dan \(y = (y_1, y_2, \dots, y_p)\) didefinisikan sebagai:
\[ d(x,y) = \left( \sum_{i=1}^p |x_i - y_i|^q \right)^{1/q} \]
Dengan demikian, Minkowski dapat dianggap sebagai ukuran jarak yang fleksibel, di mana nilai parameter \(q\) menentukan karakteristik metriknya.
set.seed(123)
# Data random (5 observasi dengan 3 variabel)
data <- matrix(runif(15, min = 1, max = 10), nrow = 5, ncol = 3)
colnames(data) <- c("X1", "X2", "X3")
print("Data random:")
## [1] "Data random:"
print(data)
## X1 X2 X3
## [1,] 3.588198 1.410008 9.611500
## [2,] 8.094746 5.752949 5.080007
## [3,] 4.680792 9.031771 7.098136
## [4,] 8.947157 5.962915 6.153701
## [5,] 9.464206 5.109533 1.926322
# Tentukan dua titik yang akan dihitung jaraknya
p1 <- data[1, ];p1
## X1 X2 X3
## 3.588198 1.410008 9.611500
p2 <- data[2, ];p2
## X1 X2 X3
## 8.094746 5.752949 5.080007
# Fungsi jarak Minkowski
minkowski_distance <- function(x, y, p) {
sum(abs(x - y)^p)^(1/p)
}
Interpretasi perhitungan jarak Minkowski di R:
set.seed(123)
digunakan untuk mengatur seed agar
hasil data acak dapat direproduksi.
data <- matrix(runif(15, min = 1, max = 10), nrow = 5, ncol = 3)
menghasilkan sebuah matriks acak berukuran 5 observasi \(\times\) 3 variabel dengan nilai antara 1
hingga 10. Kolom dinamai X1
, X2
, dan
X3
.
p1 <- data[1, ]
dan
p2 <- data[2, ]
memilih observasi pertama dan observasi
kedua dari dataset sebagai dua titik yang akan dihitung
jaraknya.
Dibuat fungsi
minkowski_distance <- function(x, y, p) { sum(abs(x - y)^p)^(1/p) }
.
Fungsi ini menghitung jarak Minkowski antara dua vektor x
dan y
, dengan parameter pangkat p
.
Dalam analisis multivariat, vektor rata-rata adalah vektor yang berisi nilai rata-rata dari setiap variabel dalam sebuah dataset. Jika terdapat data dengan \(n\) observasi dan \(p\) variabel, maka vektor rata-rata ditulis sebagai:
\[ \bar{x} = \begin{bmatrix} \bar{x}_1 \\ \bar{x}_2 \\ \vdots \\ \bar{x}_p \end{bmatrix} = \begin{bmatrix} \frac{1}{n}\sum_{i=1}^n x_{i1} \\ \frac{1}{n}\sum_{i=1}^n x_{i2} \\ \vdots \\ \frac{1}{n}\sum_{i=1}^n x_{ip} \end{bmatrix} \]
dengan \(\bar{x}_j\) menyatakan rata-rata dari variabel ke-\(j\).
Makna:
Vektor rata-rata mewakili titik pusat (center) dari seluruh observasi dalam ruang berdimensi \(p\)
Dalam ruang dua dimensi, vektor rata-rata adalah titik koordinat yang diperoleh dari rata-rata sumbu \(x\) dan rata-rata sumbu \(y\).
Dalam ruang berdimensi lebih tinggi, vektor ini berfungsi sebagai pusat data (centroid).
Kegunaan:
Vektor rata-rata sangat penting dalam perhitungan jarak Mahalanobis, karena jarak setiap observasi sering dihitung terhadap pusat data ini.
Digunakan sebagai pusat klaster dalam algoritma clustering (misalnya K-Means).
Menjadi dasar dalam perhitungan kovarian dan analisis Principal Component Analysis (PCA).
Pada perhitungan ini, kita memasukkan data mengenai 10 ekor kadal dengan tiga variabel pengukuran, yaitu:
BB: Berat badan (dalam gram)
PM: Panjang moncong (dalam milimeter)
RTB: Panjang tubuh rata-rata (dalam milimeter)
Data dimasukkan ke dalam bentuk vektor di R dengan perintah:
BB = c(6.2,11.5,8.7,10.1,7.8,6.9,12.0,3.1,14.8,9.4)
PM = c(61,73,68,70,64,60,76,49,84,71)
RTB = c(115,138,127,123,131,120,143,95,160,128)
lizard = as.matrix(cbind(BB,PM,RTB)); lizard
## BB PM RTB
## [1,] 6.2 61 115
## [2,] 11.5 73 138
## [3,] 8.7 68 127
## [4,] 10.1 70 123
## [5,] 7.8 64 131
## [6,] 6.9 60 120
## [7,] 12.0 76 143
## [8,] 3.1 49 95
## [9,] 14.8 84 160
## [10,] 9.4 71 128
Matriks rata-rata dalam analisis multivariat adalah bentuk representasi dari vektor rata-rata setiap variabel pada data yang kita miliki. Dari data kadal yang terdiri atas tiga variabel: berat badan (BB), panjang moncong (PM), dan rata-rata panjang tubuh (RTB); kita dapat menghitung nilai rata-rata masing-masing variabel, kemudian menyusunnya dalam bentuk vektor berukuran \(3 \times 1\).
Secara matematis, matriks rata-rata dituliskan sebagai:
\[ \bar{x} = \begin{bmatrix} \bar{BB} \\ \bar{PM} \\ \bar{RTB} \end{bmatrix} = \begin{bmatrix} \frac{1}{n}\sum_{i=1}^n BB_i \\ \frac{1}{n}\sum_{i=1}^n PM_i \\ \frac{1}{n}\sum_{i=1}^n RTB_i \end{bmatrix} \]
vecMeans = as.matrix(colMeans(lizard)); vecMeans
## [,1]
## BB 9.05
## PM 67.60
## RTB 128.00
vecRata = matrix(c(mean(BB), mean(PM), mean(RTB)), nrow=3, ncol=1); vecRata
## [,1]
## [1,] 9.05
## [2,] 67.60
## [3,] 128.00
Perintah vecMeans = as.matrix(colMeans(lizard))
menghitung rata-rata setiap kolom pada matriks lizard
, lalu
mengubah hasilnya ke dalam bentuk matriks kolom. Dengan demikian,
vecMeans
adalah vektor rata-rata yang berisi nilai
rata-rata dari variabel BB, PM, dan RTB.
Perintah kedua,
vecRata = matrix(c(mean(BB), mean(PM), mean(RTB)), nrow=3, ncol=1)
,
menghitung rata-rata dari masing-masing vektor variabel secara terpisah
(mean(BB)
, mean(PM)
, dan
mean(RTB)
), lalu menyusunnya kembali menjadi sebuah matriks
berukuran \(3 \times 1\).
Kedua cara ini menghasilkan output yang sama, yaitu sebuah vektor rata-rata:
\[ \bar{x} = \begin{bmatrix} \bar{BB} \\ \bar{PM} \\ \bar{RTB} \end{bmatrix} \]
Dengan demikian, baik vecMeans
maupun
vecRata
sama-sama menyajikan titik pusat
(centroid) dari seluruh data kadal. Perbedaan syntax hanya pada
cara penulisan, tetapi hasil akhirnya identik.
Matriks kovarians adalah matriks yang menunjukkan seberapa besar hubungan linier antar variabel dalam suatu dataset multivariat. Kovarians mengukur apakah dua variabel cenderung berubah bersama-sama (positif), berlawanan arah (negatif), atau tidak memiliki hubungan (mendekati nol).
Jika terdapat data dengan \(p\) variabel, maka matriks kovarian berukuran \(p \times p\), dengan bentuk:
\[ S = \begin{bmatrix} s_{11} & s_{12} & \cdots & s_{1p} \\ s_{21} & s_{22} & \cdots & s_{2p} \\ \vdots & \vdots & \ddots & \vdots \\ s_{p1} & s_{p2} & \cdots & s_{pp} \end{bmatrix} \]
dengan:
- \(s_{jj} = \text{Var}(X_j)\) →
varians dari variabel ke-\(j\)
(diagonal).
- \(s_{jk} = \text{Cov}(X_j, X_k)\) →
kovarian antara variabel \(j\) dan
\(k\) (elemen luar diagonal).
Secara umum, kovarians dihitung dengan rumus:
\[ \text{Cov}(X,Y) = \frac{1}{n-1}\sum_{i=1}^n (X_i - \bar{X})(Y_i - \bar{Y}) \]
Untuk data kadal (lizard
) dengan variabel BB, PM, dan
RTB, matriks kovarian dapat dihitung dengan:
varkov = cov(lizard); varkov
## BB PM RTB
## BB 10.98056 31.80000 54.96667
## PM 31.80000 94.04444 160.22222
## RTB 54.96667 160.22222 300.66667
Hasil perintah ini adalah sebuah matriks berukuran \(3 \times 3\) di mana:
Matriks korelasi adalah matriks yang menunjukkan hubungan linier relatif antar variabel dalam bentuk koefisien korelasi Pearson. Tidak seperti kovarian yang bergantung pada satuan pengukuran, korelasi telah dinormalisasi sehingga nilainya selalu berada pada rentang \([-1, 1]\).
Secara matematis, korelasi antar dua variabel \(X\) dan \(Y\) didefinisikan sebagai:
\[ r_{XY} = \frac{\text{Cov}(X,Y)}{\sqrt{\text{Var}(X)} \cdot \sqrt{\text{Var}(Y)}} \]
Dengan demikian, matriks korelasi untuk \(p\) variabel berbentuk:
\[ R = \begin{bmatrix} 1 & r_{12} & \cdots & r_{1p} \\ r_{21} & 1 & \cdots & r_{2p} \\ \vdots & \vdots & \ddots & \vdots \\ r_{p1} & r_{p2} & \cdots & 1 \end{bmatrix} \]
Untuk data kadal (lizard
), kita dapat menghitung matriks
korelasi dengan:
korel = cor(lizard); korel
## BB PM RTB
## BB 1.0000000 0.9895743 0.9566313
## PM 0.9895743 1.0000000 0.9528259
## RTB 0.9566313 0.9528259 1.0000000
Hasil korel
adalah matriks \(3
\times 3\) dengan nilai korelasi antar pasangan variabel.
cor(BB, PM)
→ menunjukkan seberapa kuat hubungan antara
berat badan kadal dengan panjang moncongnya. Korelasi positif berarti
kadal dengan berat lebih besar cenderung memiliki moncong lebih
panjang.cor(BB, RTB)
→ mengukur hubungan antara berat badan dan
panjang tubuh. Jika nilainya tinggi dan positif, berarti kadal yang
lebih berat cenderung memiliki tubuh lebih panjang.cor(PM, RTB)
→ mengukur hubungan antara panjang moncong
dan panjang tubuh. Nilai positif menunjukkan bahwa semakin panjang
moncongnya, semakin panjang pula tubuhnya.Matriks standardisasi merupakan matriks diagonal yang berisi akar kuadrat dari variansi masing-masing variabel. Matriks ini digunakan untuk menormalisasi data sehingga setiap variabel memiliki skala yang sebanding.
Jika terdapat \(p\) variabel, maka matriks standardisasi \(D\) berbentuk:
\[ D = \begin{bmatrix} \sqrt{\text{Var}(X_1)} & 0 & \cdots & 0 \\ 0 & \sqrt{\text{Var}(X_2)} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \sqrt{\text{Var}(X_p)} \end{bmatrix} \]
Matriks korelasi (\(R\)) dapat diturunkan dari matriks kovarian (\(S\)) melalui matriks standardisasi (\(D\)):
\[ R = D^{-1} S D^{-1} \]
dengan \(D\) adalah matriks diagonal dari akar variansi tiap variabel.
Perhitungan di R untuk data lizard
:
n = nrow(lizard);n
## [1] 10
u = matrix(1,n,1); u
## [,1]
## [1,] 1
## [2,] 1
## [3,] 1
## [4,] 1
## [5,] 1
## [6,] 1
## [7,] 1
## [8,] 1
## [9,] 1
## [10,] 1
xbar = cbind((1/n)*t(u)%*%lizard); xbar
## BB PM RTB
## [1,] 9.05 67.6 128
D = lizard - u %*% xbar; D
## BB PM RTB
## [1,] -2.85 -6.6 -13
## [2,] 2.45 5.4 10
## [3,] -0.35 0.4 -1
## [4,] 1.05 2.4 -5
## [5,] -1.25 -3.6 3
## [6,] -2.15 -7.6 -8
## [7,] 2.95 8.4 15
## [8,] -5.95 -18.6 -33
## [9,] 5.75 16.4 32
## [10,] 0.35 3.4 0
S = (1/(n-1))*t(D)%*%D; S
## BB PM RTB
## BB 10.98056 31.80000 54.96667
## PM 31.80000 94.04444 160.22222
## RTB 54.96667 160.22222 300.66667
Ds = diag(sqrt(diag(S))); Ds
## [,1] [,2] [,3]
## [1,] 3.313692 0.000000 0.00000
## [2,] 0.000000 9.697651 0.00000
## [3,] 0.000000 0.000000 17.33974
R = solve(Ds) %*% S %*% solve(Ds); R
## [,1] [,2] [,3]
## [1,] 1.0000000 0.9895743 0.9566313
## [2,] 0.9895743 1.0000000 0.9528259
## [3,] 0.9566313 0.9528259 1.0000000
Interpretasi:
n = nrow(lizard); n
: Menghitung banyaknya observasi
pada data lizard
(jumlah baris).
u = matrix(1, n, 1); u
: Membentuk vektor kolom
berisi angka 1 sebanyak \(n\) baris.
Vektor ini digunakan untuk mempermudah operasi aljabar dalam menghitung
rata-rata.
xbar = cbind((1/n)*t(u)%*%lizard); xbar
: Menghitung
vektor rata-rata dari data lizard
menggunakan pendekatan
matriks.
D = lizard - u %*% xbar; D
: Membentuk matriks
deviasi, yaitu selisih setiap observasi terhadap vektor
rata-rata.
S = (1/(n-1))*t(D)%*%D; S
: Menghitung matriks
kovarian dari data lizard
dengan pendekatan manual melalui
matriks deviasi.
`Ds = diag(sqrt(diag(S))); Ds : Membentuk matriks standardisasi, yaitu matriks diagonal yang berisi akar kuadrat dari variansi masing-masing variabel (standar deviasi).
R = solve(Ds) %*% S %*% solve(Ds); R
: Menghasilkan
matriks korelasi dengan menormalkan kovarian menggunakan matriks
standardisasi. Rumus yang dipakai: \(R =
D^{-1} S D^{-1}\). Hasil \(R\)
identik dengan matriks korelasi yang dihitung dengan
cor(lizard)
.
Ds
adalah jembatan antara
kovarian dan korelasi.Hasil akhirnya:
Ds
= berisi standar deviasi tiap variabel.
R
= matriks korelasi yang menunjukkan kekuatan dan
arah hubungan antar variabel setelah menormalkan efek skala.