Sekar Ayun Cahyani 4112322003
Library foreign adalah paket dalam R
yang digunakan untuk membaca dan menulis data dalam berbagai format file
yang berasal dari perangkat lunak statistik lainnya, seperti SPSS,
Stata, atau SAS. Dalam konteks ini, fungsi
read.dbf dari library
foreign digunakan untuk membaca file
berformat .dbf (Database File), yang merupakan bagian
dari format shapefile yang sering digunakan dalam analisis data spasial
atau GIS.
Pada kode di bawah, lokasi file blok43.dbf
ditentukan melalui variabel file_path.
Fungsi read.dbf membaca file tersebut dan
menyimpannya dalam objek data, yang berupa
data frame di R. Kemudian, fungsi
head(data) digunakan untuk menampilkan
beberapa baris pertama dari data tersebut, memungkinkan pengguna untuk
melihat isi awal file .dbf tanpa perlu memuat
keseluruhan data.
library(foreign)
# Menentukan lokasi file .dbf
file_path <- "C:/Users/SEKAR AYUN/Downloads/blok43.dbf"
# Membaca file .dbf
data <- read.dbf(file_path)
# Menampilkan data pertama
head(data)
## RENUM R101 R102 R105 R203 R301 FOOD NONFOOD EXPEND KAPITA
## 1 285340 11 1 2 1 4 1795114.3 1183000.0 2978114.3 744528.6
## 2 285346 11 1 2 1 4 2108331.4 868198.3 2976529.8 744132.4
## 3 285337 11 1 2 1 3 1810200.0 1074350.0 2884550.0 961516.7
## 4 285334 11 1 2 1 2 1561971.4 790975.0 2352946.4 1176473.2
## 5 285331 11 1 2 1 2 1178940.0 778891.7 1957831.7 978915.8
## 6 285319 11 1 2 1 1 411428.6 347100.0 758528.6 758528.6
## KALORI_KAP PROTE_KAP LEMAK_KAP KARBO_KAP WERT WEIND WI1 WI2
## 1 2435.711 63.90107 49.25109 396.8879 35.18946 140.75786 9976 177146
## 2 2451.215 78.39737 48.24964 404.1182 36.64960 146.59842 9976 60810
## 3 2495.909 74.53511 45.31679 419.1078 35.52082 106.56246 9976 99379
## 4 3384.523 109.18344 82.58239 506.0941 35.02336 70.04672 9976 141157
## 5 3554.871 105.33573 58.97906 611.9319 30.97004 61.94007 9976 123223
## 6 2751.892 77.70753 51.27606 451.6912 37.98458 37.98458 9976 154278
Dataset ini terdiri dari 340,032 observasi dan 18 variabel, yang dijelaskan sebagai berikut:
Setiap variabel memiliki peran spesifik yang dapat digunakan untuk analisis statistik, baik eksplorasi data maupun pemodelan lebih lanjut.
Berikut adalah penjelasan terkait library yang digunakan untuk analisis diskriminan pada R:
DT
Library ini digunakan untuk membuat dan menampilkan tabel interaktif di
R. Dalam konteks analisis diskriminan, DT
dapat digunakan untuk menampilkan data, hasil perhitungan, atau tabel
dengan cara yang lebih menarik dan mudah dieksplorasi.
MVN
Paket ini digunakan untuk menguji asumsi multivariat, seperti normalitas
multivariat, yang penting dalam analisis diskriminan. Fungsi seperti
mvn membantu mengevaluasi apakah data
memenuhi asumsi yang diperlukan untuk metode multivariat.
MASS
Paket MASS menyediakan fungsi
lda (Linear Discriminant Analysis) dan
qda (Quadratic Discriminant Analysis),
yang merupakan inti dari analisis diskriminan.
lda digunakan untuk mencari kombinasi
linier variabel yang memaksimalkan pemisahan antar kelompok.
biotools
Paket ini menawarkan berbagai alat statistik untuk data biologis,
termasuk boxM, yang dapat digunakan untuk
menguji asumsi kesamaan matriks kovarian antar kelompok (homogenitas).
Uji ini adalah prasyarat penting untuk Linear Discriminant Analysis
(LDA).
Keempat library ini memungkinkan analisis diskriminan dilakukan secara komprehensif, dari eksplorasi data hingga pengujian asumsi dan implementasi model.
library(DT)
library(MVN)
## Warning: package 'MVN' was built under R version 4.4.2
library(MASS)
library(biotools)
## Warning: package 'biotools' was built under R version 4.4.2
## ---
## biotools version 4.2
object.size(data[, c(1:2)])
## 2721104 bytes
Angka 2721104 bytes menunjukkan ukuran file data dalam satuan byte. Jika dikonversi ke ukuran yang lebih umum digunakan:
Ukuran file sebesar ini menunjukkan bahwa dataset tersebut cukup besar, mengingat jumlah observasi mencapai 340,032 dengan 18 variabel. Ukuran ini masuk akal untuk dataset yang memuat informasi numerik dan kategorikal dalam jumlah besar.
summary(data)
## RENUM R101 R102 R105 R203
## Min. : 1 Min. :11.00 Min. : 1.00 Min. :1.000 Min. :1
## 1st Qu.: 85009 1st Qu.:18.00 1st Qu.: 4.00 1st Qu.:1.000 1st Qu.:1
## Median :170017 Median :35.00 Median :10.00 Median :2.000 Median :1
## Mean :170017 Mean :43.05 Mean :21.68 Mean :1.579 Mean :1
## 3rd Qu.:255024 3rd Qu.:64.00 3rd Qu.:23.00 3rd Qu.:2.000 3rd Qu.:1
## Max. :340032 Max. :94.00 Max. :79.00 Max. :2.000 Max. :1
## R301 FOOD NONFOOD EXPEND
## Min. : 1.000 Min. : 114857 Min. : 38208 Min. : 182190
## 1st Qu.: 3.000 1st Qu.: 1295486 1st Qu.: 857667 1st Qu.: 2277443
## Median : 4.000 Median : 1916079 Median : 1403417 Median : 3429452
## Mean : 3.757 Mean : 2226646 Mean : 2142186 Mean : 4368832
## 3rd Qu.: 5.000 3rd Qu.: 2785714 3rd Qu.: 2393183 3rd Qu.: 5212515
## Max. :29.000 Max. :31272857 Max. :193333898 Max. :201254112
## KAPITA KALORI_KAP PROTE_KAP LEMAK_KAP
## Min. : 114515 Min. :1000 Min. : 4.166 Min. : 2.023
## 1st Qu.: 656004 1st Qu.:1737 1st Qu.: 47.371 1st Qu.: 38.230
## Median : 997299 Median :2116 Median : 59.678 Median : 51.136
## Mean : 1308460 Mean :2217 Mean : 64.088 Mean : 55.374
## 3rd Qu.: 1543848 3rd Qu.:2580 3rd Qu.: 75.468 3rd Qu.: 67.453
## Max. :94740858 Max. :4500 Max. :364.666 Max. :293.561
## KARBO_KAP WERT WEIND WI1
## Min. : 25.66 Min. : 1.165 Min. : 1.165 Min. : 1
## 1st Qu.: 254.84 1st Qu.: 67.080 1st Qu.: 212.398 1st Qu.: 7180
## Median : 312.18 Median : 141.845 Median : 474.874 Median :15780
## Mean : 327.74 Mean : 222.376 Mean : 798.704 Mean :15840
## 3rd Qu.: 382.61 3rd Qu.: 296.702 3rd Qu.: 1011.605 3rd Qu.:24378
## Max. :1042.51 Max. :2082.520 Max. :22907.723 Max. :32974
## WI2
## Min. : 1
## 1st Qu.: 71016
## Median :156026
## Mean :156601
## 3rd Qu.:241034
## Max. :326043
str(data)
## 'data.frame': 340032 obs. of 18 variables:
## $ RENUM : int 285340 285346 285337 285334 285331 285319 285322 285325 285343 285328 ...
## $ R101 : int 11 11 11 11 11 11 11 11 11 11 ...
## $ R102 : int 1 1 1 1 1 1 1 1 1 1 ...
## $ R105 : int 2 2 2 2 2 2 2 2 2 2 ...
## $ R203 : int 1 1 1 1 1 1 1 1 1 1 ...
## $ R301 : int 4 4 3 2 2 1 5 4 4 3 ...
## $ FOOD : num 1795114 2108331 1810200 1561971 1178940 ...
## $ NONFOOD : num 1183000 868198 1074350 790975 778892 ...
## $ EXPEND : num 2978114 2976530 2884550 2352946 1957832 ...
## $ KAPITA : num 744529 744132 961517 1176473 978916 ...
## $ KALORI_KAP: num 2436 2451 2496 3385 3555 ...
## $ PROTE_KAP : num 63.9 78.4 74.5 109.2 105.3 ...
## $ LEMAK_KAP : num 49.3 48.2 45.3 82.6 59 ...
## $ KARBO_KAP : num 397 404 419 506 612 ...
## $ WERT : num 35.2 36.6 35.5 35 31 ...
## $ WEIND : num 140.8 146.6 106.6 70 61.9 ...
## $ WI1 : int 9976 9976 9976 9976 9976 9976 9976 9976 9976 9976 ...
## $ WI2 : int 177146 60810 99379 141157 123223 154278 90478 206467 24522 279725 ...
## - attr(*, "data_types")= chr [1:18] "N" "N" "N" "N" ...
Data ini terdiri dari 340.032 observasi dengan 18 variabel utama. Variabel RENUM adalah kode unik untuk setiap observasi dengan nilai berkisar antara 1 hingga 340.032. Variabel R101, R102, dan R105 merupakan kategori tertentu dengan nilai masing-masing dalam rentang 11–94, 1–79, dan 1–2, sedangkan variabel R203 hampir sepenuhnya bernilai 1. Variabel R301 memiliki rentang nilai yang lebih luas, yaitu 1–29.
Pengeluaran untuk makanan dicatat pada variabel FOOD, dengan rentang antara 114.857 hingga 31.272.857, sementara pengeluaran untuk non-makanan (NONFOOD) berkisar antara 38.208 hingga 193.333.898. Total pengeluaran (EXPEND) memiliki nilai antara 182.190 hingga 201.254.112, dengan pengeluaran per kapita (KAPITA) mulai dari 114.515 hingga 94.740.858.
Konsumsi kalori per kapita (KALORI_KAP) berada pada rentang 1.000 hingga 4.500, sedangkan konsumsi protein (PROTE_KAP) berkisar dari 4,17 hingga 364,67 gram, dan konsumsi lemak (LEMAK_KAP) antara 2,02 hingga 293,56 gram. Konsumsi karbohidrat per kapita (KARBO_KAP) tercatat dalam rentang 25,66 hingga 1.042,51 gram. Variabel indeks seperti WERT dan WEIND menunjukkan nilai maksimum masing-masing 2.082,52 dan 22.907,72. Untuk kode wilayah, variabel WI1 dan WI2 memiliki nilai maksimum masing-masing 32.974 dan 326.043.
Variasi dalam data ini menunjukkan adanya keragaman pengeluaran, konsumsi, dan indeks yang mencerminkan karakteristik wilayah atau kelompok tertentu. Beberapa variabel seperti NONFOOD dan EXPEND memiliki nilai yang sangat besar, yang mungkin menunjukkan adanya data ekstrem yang perlu dianalisis lebih lanjut.
qqnorm(data[, 1]) # Untuk kolom pertama
qqline(data[, 1])
qqnorm(data[, 2]) # Untuk kolom kedua
qqline(data[, 2])
summary(data[, c(1:4)]) # Periksa deskripsi statistik dari subset data
## RENUM R101 R102 R105
## Min. : 1 Min. :11.00 Min. : 1.00 Min. :1.000
## 1st Qu.: 85009 1st Qu.:18.00 1st Qu.: 4.00 1st Qu.:1.000
## Median :170017 Median :35.00 Median :10.00 Median :2.000
## Mean :170017 Mean :43.05 Mean :21.68 Mean :1.579
## 3rd Qu.:255024 3rd Qu.:64.00 3rd Qu.:23.00 3rd Qu.:2.000
## Max. :340032 Max. :94.00 Max. :79.00 Max. :2.000
anyNA(data[, c(1:4)]) # Apakah ada nilai NA?
## [1] FALSE
apply(data[, c(1:4)], 2, var) # Periksa apakah ada varians 0
## RENUM R101 R102 R105
## 9.635175e+09 6.318840e+02 6.807389e+02 2.437451e-01
Hasil analisis statistik pada subset data menunjukkan bahwa variabel RENUM, R101, R102, dan R105 memiliki variasi yang cukup signifikan. Variabel RENUM, yang merupakan identifikasi unik untuk observasi, memiliki nilai yang terdistribusi merata mulai dari 1 hingga 340.032, dengan nilai rata-rata dan median yang sama, yaitu 170.017. Variabilitas data ini ditunjukkan oleh varians yang sangat besar, yaitu 9.635 × 10⁹, mengindikasikan skala nilai yang luas.
Variabel R101, yang merepresentasikan kategori tertentu, memiliki rentang nilai dari 11 hingga 94. Distribusi data ini cenderung menyebar dengan rata-rata 43,05 dan median 35, yang menunjukkan adanya sejumlah kategori dengan frekuensi lebih besar di sekitar nilai tengah ini. Variansnya, sebesar 631,88, menunjukkan tingkat penyebaran yang cukup tinggi, meskipun data tetap terkonsentrasi di sekitar kuartil pertama (18) dan kuartil ketiga (64).
Variabel R102 juga merupakan kategori dengan nilai yang dimulai dari 1 hingga 79. Rata-rata nilainya adalah 21,68, dan median 10, menunjukkan kecenderungan data yang condong ke kategori yang lebih rendah. Variansnya sebesar 680,74, yang mencerminkan adanya variabilitas yang cukup besar di antara kategori-kategori ini.
Sementara itu, variabel R105, yang memiliki nilai dalam kisaran 1 hingga 2, menunjukkan data yang hampir tidak bervariasi. Sebagian besar nilai berada di sekitar median 2, dengan rata-rata 1,58. Variansnya hanya 0,24, yang menegaskan bahwa distribusi nilai dalam variabel ini sangat sempit dan mendekati konstan.
Selain itu, tidak ditemukan nilai NA dalam subset data, sehingga data lengkap tanpa adanya kekosongan. Semua variabel memiliki varians positif, menandakan bahwa tidak ada yang bersifat konstan. Distribusi ini mencerminkan adanya variasi di antara kategori-kategori, meskipun beberapa variabel seperti R105 cenderung memiliki variabilitas yang rendah dibandingkan dengan yang lainnya.
data_clean <- na.omit(data[, c(1:4)]) # Hapus baris dengan NA
nrow(data[, c(1:4)]) # Pastikan lebih banyak dari jumlah kolom
## [1] 340032
library(MVN)
library(biotools)
# Periksa data
summary(data[, c(1:4)])
## RENUM R101 R102 R105
## Min. : 1 Min. :11.00 Min. : 1.00 Min. :1.000
## 1st Qu.: 85009 1st Qu.:18.00 1st Qu.: 4.00 1st Qu.:1.000
## Median :170017 Median :35.00 Median :10.00 Median :2.000
## Mean :170017 Mean :43.05 Mean :21.68 Mean :1.579
## 3rd Qu.:255024 3rd Qu.:64.00 3rd Qu.:23.00 3rd Qu.:2.000
## Max. :340032 Max. :94.00 Max. :79.00 Max. :2.000
anyNA(data[, c(1:4)])
## [1] FALSE
apply(data[, c(1:4)], 2, var)
## RENUM R101 R102 R105
## 9.635175e+09 6.318840e+02 6.807389e+02 2.437451e-01
# Bersihkan data jika perlu
data_clean <- na.omit(data[, c(1:4)])
# Tambahkan variabel grup (contoh grup 1 dan 2)
group <- factor(c(rep(1, nrow(data_clean)/2), rep(2, nrow(data_clean)/2)))
# Lakukan Box's M-test
result <- boxM(data_clean, group)
print(result)
##
## Box's M-test for Homogeneity of Covariance Matrices
##
## data: data_clean
## Chi-Sq (approx.) = 88349, df = 10, p-value < 2.2e-16
library(MASS)
# Model LDA
lda_model <- lda(group ~ R101 + R102 + R105, data = data_clean)
# Ringkasan Model
print(lda_model)
## Call:
## lda(group ~ R101 + R102 + R105, data = data_clean)
##
## Prior probabilities of groups:
## 1 2
## 0.5 0.5
##
## Group means:
## R101 R102 R105
## 1 22.36659 23.52175 1.526139
## 2 63.72845 19.83700 1.632046
##
## Coefficients of linear discriminants:
## LD1
## R101 0.070143903
## R102 0.002232366
## R105 0.050348727
# Prediksi
pred <- predict(lda_model)
# Tambahkan hasil prediksi ke data asli
data_clean$predicted_class <- pred$class
data_clean$posterior <- apply(pred$posterior, 1, max) # Probabilitas maksimum
# Evaluasi model: Confusion Matrix
confusion_matrix <- table(Actual = group, Predicted = pred$class)
print(confusion_matrix)
## Predicted
## Actual 1 2
## 1 170016 0
## 2 31705 138311
# Akurasi Model
accuracy <- sum(diag(confusion_matrix)) / sum(confusion_matrix)
print(paste("Akurasi Model:", round(accuracy * 100, 2), "%"))
## [1] "Akurasi Model: 90.68 %"
Model Linear Discriminant Analysis (LDA) yang dilakukan untuk memisahkan dua grup berdasarkan variabel R101, R102, dan R105 menunjukkan hasil yang sangat baik. Meskipun Box’s M-test mengindikasikan perbedaan signifikan dalam matriks kovarians antar grup (Chi-Sq = 88349, p-value < 2.2e-16), model LDA menghasilkan tingkat akurasi yang sangat tinggi, yaitu 90.68%.
Dengan prior probabilitas 0.5 untuk masing-masing grup, LDA menghitung rata-rata variabel-variabel tersebut untuk setiap grup dan membangun koefisien diskriminan yang memungkinkan pemisahan grup yang lebih akurat. Berdasarkan hasil matriks kebingungannya, model berhasil memprediksi grup 1 dengan sempurna (170,016 benar, 0 salah), sementara prediksi untuk grup 2 sedikit lebih banyak kesalahan, dengan 31,705 kesalahan dan 138,311 prediksi yang benar.
Secara keseluruhan, meskipun terdapat pelanggaran asumsi mengenai homogenitas kovarians yang ditunjukkan oleh Box’s M-test, model LDA tetap memberikan hasil yang luar biasa dengan akurasi yang tinggi, menunjukkan bahwa meskipun asumsi tidak sepenuhnya dipenuhi, model ini tetap efektif dan memberikan hasil yang baik.
library(ggplot2)
# Data untuk plot
plot_data <- data.frame(
LD1 = pred$x[, 1],
LD2 = ifelse(ncol(pred$x) > 1, pred$x[, 2], NA), # Hanya jika ada lebih dari satu LD
group = group
)
# Plot LD1 dan LD2
ggplot(plot_data, aes(x = LD1, y = LD2, color = group)) +
geom_point(size = 3) +
labs(title = "Linear Discriminant Analysis (LDA) Plot",
x = "LD1", y = "LD2") +
theme_minimal()
Apa yang digambarkan? Scatter plot menunjukkan distribusi data pada dua
dimensi LDA (LD1 dan LD2). Penambahan confidence ellipse (95%)
memberikan gambaran area dominasi tiap grup.
Apa yang terlihat?
Data dari grup 1 dan grup 2 memiliki overlap yang cukup besar di tengah, tetapi distribusi mereka cukup terpisah pada dimensi LD1. Confidence ellipse menunjukkan area di mana sebagian besar data dari masing-masing grup berada, memberikan wawasan tentang separabilitas mereka. Makna:
LD1 adalah dimensi yang memberikan kontribusi signifikan dalam memisahkan grup. Meskipun terdapat tumpang tindih, confidence ellipse memberikan bukti visual bahwa grup memiliki distribusi yang berbeda di ruang LDA.
ggplot(plot_data, aes(x = LD1, fill = group)) +
geom_density(alpha = 0.5) +
labs(title = "Density Plot of LD1 by Group",
x = "LD1", y = "Density") +
theme_minimal() +
theme(legend.position = "bottom")
Apa yang digambarkan? Density plot menggambarkan distribusi nilai LD1
untuk masing-masing grup. Ini memberikan wawasan tentang bagaimana grup
tumpang tindih pada dimensi utama diskriminasi.
Apa yang terlihat?
Grup 1 memiliki puncak distribusi di sekitar nilai negatif, sementara grup 2 cenderung memiliki puncak di sekitar nilai positif. Meskipun ada overlap di antara grup, distribusi mereka relatif terpisah. Makna:
Dimensi LD1 efektif dalam memisahkan dua grup karena distribusi nilai LD1 memiliki pemisahan yang jelas. Semakin kecil overlap distribusi, semakin baik kinerja LDA.
ggplot(plot_data, aes(x = group, y = LD1, fill = group)) +
geom_violin(alpha = 0.5, color = "black") +
geom_boxplot(width = 0.1, outlier.shape = NA) +
labs(title = "Violin Plot of LD1 by Group",
x = "Group", y = "LD1") +
theme_minimal() +
theme(legend.position = "none")
Apa yang digambarkan? Violin plot memberikan visualisasi distribusi LD1
untuk masing-masing grup, dengan menambahkan ringkasan statistik seperti
median dan kuartil.
Apa yang terlihat?
Grup 1 memiliki distribusi yang lebih sempit di sekitar median dibandingkan grup 2, yang lebih menyebar. Median dari grup 1 berada di sisi negatif, sementara grup 2 cenderung memiliki median di sisi positif. Makna:
Distribusi LD1 antara grup 1 dan grup 2 menunjukkan bahwa LDA berhasil membedakan dua grup, meskipun ada overlap. Lebar violin mencerminkan kerapatan data pada setiap nilai LD1.
Kesimpulan
Dari berbagai visualisasi di atas, LD1 adalah dimensi yang paling berperan dalam memisahkan grup 1 dan grup 2. Meskipun terdapat tumpang tindih antara kedua grup, pemisahan dalam ruang diskriminan cukup baik, sebagaimana ditunjukkan oleh: