No 6. Lakukan preprosesing, analisis deskriptif, dan analisis multivariat untuk data susenas berikut, gunakan minimal 1 metode. Link data: https://s.id/DataSusenas Link penjelasan variabel: https://s.id/VariabelSusenas atau Penjelasan variabel (excel):https://s.id/ExcelVarSusenas Catatan: file dalam formal .dbf. Gunakan package foreign untuk mengakses menggunakan R.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(FactoMineR)
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(foreign)
data <- read.dbf("blok43.dbf")
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
Pada tahap awal, proses dimulai dengan menyiapkan pustaka-pustaka yang dibutuhkan: dplyr untuk manipulasi data, ggplot2 untuk visualisasi, FactoMineR dan factoextra untuk analisis serta visualisasi PCA, dan foreign untuk membaca file berformat DBF. Dataset kemudian dimuat menggunakan fungsi read.dbf() dari pustaka foreign, dengan file yang diambil dari direktori lokal pengguna.
# melakukan Rename pada tiap kolom untuk memudahkan preprocessing
data <- data %>% rename(
ID = RENUM,
Region = R101,
SubRegion = R102,
Gender = R105,
AgeGroup = R203,
Education = R301,
FoodExp = FOOD,
NonFoodExp = NONFOOD,
TotalExp = EXPEND,
PerCapitaExp = KAPITA,
CalorieIntake = KALORI_KAP,
ProteinIntake = PROTE_KAP,
FatIntake = LEMAK_KAP,
CarbIntake = KARBO_KAP,
Weight = WERT,
WeightIndex = WEIND,
Index1 = WI1,
Index2 = WI2
)
Tahap berikutnya adalah penyesuaian nama kolom agar lebih deskriptif dan sesuai dengan konteks analisis. Proses ini dilakukan menggunakan fungsi rename() dari pustaka dplyr, yang mengganti nama kolom asli dengan nama baru yang lebih informatif. Misalnya, kolom RENUM diubah menjadi ID, dan FOOD menjadi FoodExp. Penyesuaian ini bertujuan untuk meningkatkan pemahaman terhadap data dan mempermudah analisis selanjutnya.
# Cek missing value
summary(data)
## ID Region SubRegion Gender AgeGroup
## 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
## Education FoodExp NonFoodExp TotalExp
## 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
## PerCapitaExp CalorieIntake ProteinIntake FatIntake
## 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
## CarbIntake Weight WeightIndex Index1
## 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
## Index2
## Min. : 1
## 1st Qu.: 71016
## Median :156026
## Mean :156601
## 3rd Qu.:241034
## Max. :326043
# Rangkuman statistika
numeric_cols <- c("FoodExp", "NonFoodExp", "TotalExp", "PerCapitaExp", "CalorieIntake",
"ProteinIntake", "FatIntake", "CarbIntake", "Weight", "WeightIndex")
summary_stats <- data %>%
summarise(across(all_of(numeric_cols), list(mean = mean, sd = sd, median = median), na.rm = TRUE))
## Warning: There was 1 warning in `summarise()`.
## ℹ In argument: `across(...)`.
## Caused by warning:
## ! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
## Supply arguments directly to `.fns` through an anonymous function instead.
##
## # Previously
## across(a:b, mean, na.rm = TRUE)
##
## # Now
## across(a:b, \(x) mean(x, na.rm = TRUE))
print(summary_stats)
## FoodExp_mean FoodExp_sd FoodExp_median NonFoodExp_mean NonFoodExp_sd
## 1 2226646 1403996 1916079 2142186 3073706
## NonFoodExp_median TotalExp_mean TotalExp_sd TotalExp_median PerCapitaExp_mean
## 1 1403417 4368832 3985908 3429452 1308460
## PerCapitaExp_sd PerCapitaExp_median CalorieIntake_mean CalorieIntake_sd
## 1 1251696 997299.3 2217.353 671.5323
## CalorieIntake_median ProteinIntake_mean ProteinIntake_sd ProteinIntake_median
## 1 2115.65 64.08786 24.69328 59.67746
## FatIntake_mean FatIntake_sd FatIntake_median CarbIntake_mean CarbIntake_sd
## 1 55.37402 24.66434 51.13617 327.7386 102.6821
## CarbIntake_median Weight_mean Weight_sd Weight_median WeightIndex_mean
## 1 312.1765 222.3764 239.071 141.845 798.7036
## WeightIndex_sd WeightIndex_median
## 1 975.9791 474.8736
Setelah itu, dilakukan analisis deskriptif untuk mengidentifikasi karakteristik utama dataset, termasuk mendeteksi potensi data yang hilang atau distribusi yang tidak normal. Statistik seperti rata-rata, median, serta nilai minimum dan maksimum dihitung menggunakan fungsi summary(). Analisis lebih rinci dilakukan pada kolom numerik tertentu, seperti pengeluaran makanan (FoodExp) dan total pengeluaran (TotalExp), dengan memanfaatkan fungsi summarise() dan across(). Tahap ini memberikan wawasan awal mengenai struktur data yang akan menjadi dasar untuk langkah berikutnya.
data_scaled <- data %>% select(all_of(numeric_cols)) %>% scale()
Sebelum melanjutkan ke analisis PCA, data dinormalisasi menggunakan fungsi scale(). Normalisasi ini diterapkan pada kolom numerik yang relevan, untuk menyamakan skala variabel sehingga setiap variabel memiliki rata-rata nol dan deviasi standar satu. Proses ini penting dalam analisis PCA, karena perbedaan skala antar variabel dapat memengaruhi hasil. Dengan normalisasi, semua variabel setara dalam analisis komponen utama, memungkinkan interpretasi yang lebih adil.
pca_result <- PCA(data_scaled, graph = FALSE)
# Scree plot
fviz_eig(pca_result)
# PCA individu
fviz_pca_ind(pca_result,
geom.ind = "point",
col.ind = "cos2",
gradient.cols = c("#A6CEE3", "#B2DF8A", "#FDBF6F"))
# PCA variabel
fviz_pca_var(pca_result,
col.var = "contrib",
gradient.cols = c("#A6CEE3", "#B2DF8A", "#FDBF6F"))
# PCA biplot
fviz_pca_biplot(pca_result,
geom.ind = "point",
col.ind = "cos2",
col.var = "contrib",
gradient.cols = c("#A6CEE3", "#B2DF8A", "#FDBF6F"))
Langkah terakhir adalah visualisasi hasil PCA menggunakan pustaka factoextra. Beragam jenis grafik dibuat untuk memudahkan interpretasi, seperti scree plot untuk melihat kontribusi setiap komponen terhadap total variansi, plot individu untuk memetakan distribusi data dalam ruang PCA, dan plot variabel untuk menganalisis pengaruh variabel terhadap komponen utama. Visualisasi ini memberikan gambaran intuitif dari hasil PCA, mendukung analisis lebih lanjut dan pengambilan keputusan berbasis data.
Penjelasan Output Visualisasi:
Scree Plot menunjukkan proporsi variansi yang dijelaskan oleh setiap dimensi dalam analisis PCA. Dimensi pertama menjelaskan sekitar 40% variansi, sedangkan dimensi kedua mencakup 24,5%. Dimensi lainnya memberikan kontribusi yang lebih kecil, sehingga dua dimensi pertama cukup untuk merepresentasikan sebagian besar informasi dalam dataset.
Plot individu pada dua dimensi utama (Dim1 dan Dim2) menggambarkan distribusi data berdasarkan kontribusi mereka terhadap komponen utama. Titik-titik yang jauh dari pusat memiliki nilai cos2 tinggi, menandakan bahwa mereka lebih baik terwakili dalam dua dimensi ini. Dim1 yang mencakup 40,4% variansi menunjukkan penyebaran data yang signifikan.
Plot variabel memvisualisasikan kontribusi dan hubungan antar variabel asli terhadap komponen utama. Panjang vektor mencerminkan kontribusi suatu variabel terhadap dimensi tertentu, sementara sudut antar vektor menunjukkan korelasi antar variabel. Contohnya, variabel seperti CalorieIntake, ProteinIntake, dan CarbIntake dominan pada Dim1, sementara Weight dan WeightIndex memiliki pengaruh yang lebih kecil.
Biplot menggabungkan informasi dari plot individu dan plot variabel, memberikan pandangan menyeluruh tentang interaksi antara individu dan variabel. Titik individu yang terletak di arah vektor, seperti CalorieIntake, cenderung memiliki nilai tinggi pada variabel tersebut. Dimensi pertama merepresentasikan pola konsumsi utama, sedangkan dimensi kedua mencerminkan variasi sekunder dalam dataset.