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.