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 pertama, proses dimulai dengan mempersiapkan pustaka dplyr untuk manipulasi data, ggplot2 untuk visualisasi, FactoMineR dan factoextra untuk analisis dan visualisasi PCA, serta foreign untuk membaca file dalam format dbf. Selanjutnya, dataset 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
)

Langkah berikutnya adalah mengganti nama kolom agar lebih deskriptif. Proses ini dilakukan menggunakan fungsi rename() dari pustaka dplyr, yang memetakan nama kolom asli ke nama baru yang lebih mudah dimengerti dan sesuai dengan tujuan analisis. Sebagai contoh, kolom RENUM diubah menjadi ID, dan FOOD menjadi FoodExp, sehingga setiap kolom memberikan informasi yang lebih jelas dan relevan. Penyesuaian ini bertujuan untuk meningkatkan keterbacaan data sekaligus mempermudah proses pengolahan pada tahap berikutnya.

# 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

Tahap berikutnya melibatkan analisis deskriptif untuk menilai karakteristik utama dataset sekaligus mengidentifikasi kemungkinan adanya data yang hilang atau distribusi yang tidak normal. Statistik deskriptif, seperti nilai rata-rata, median, serta minimum dan maksimum untuk setiap kolom dataset, diperoleh menggunakan fungsi summary(). Untuk kolom numerik tertentu, seperti pengeluaran makanan (FoodExp) dan total pengeluaran (TotalExp), dilakukan analisis statistik lebih mendalam menggunakan fungsi summarise() dan across(). Proses ini memberikan gambaran awal yang penting mengenai kondisi data, yang menjadi dasar untuk tahap analisis lebih lanjut.

data_scaled <- data %>% select(all_of(numeric_cols)) %>% scale()

Sebelum melangkah ke tahap analisis dan visualisasi data, data terlebih dahulu dinormalisasi menggunakan fungsi scale(). Proses ini hanya diterapkan pada kolom numerik yang relevan, karena tujuan normalisasi adalah menyamakan skala semua variabel. Hal ini penting terutama dalam analisis PCA, di mana perbedaan skala antar variabel dapat memengaruhi hasil. Dengan normalisasi, unit pengukuran dihapus, sehingga setiap variabel memiliki rata-rata nol dan deviasi standar satu. Ini memungkinkan interpretasi yang lebih seimbang dalam analisis komponen utama.

pca_result <- PCA(data_scaled, graph = FALSE)

fviz_eig(pca_result)  # Scree plot

fviz_pca_ind(pca_result, 
             geom.ind = "point", 
             col.ind = "cos2", 
             gradient.cols = c("#56B4E9", "#F0E442", "#D55E00"))

fviz_pca_var(pca_result, 
             col.var = "contrib", 
             gradient.cols = c("#56B4E9", "#F0E442", "#D55E00"))  

fviz_pca_biplot(pca_result, 
                geom.ind = "point", 
                col.ind = "cos2", 
                col.var = "contrib", 
                gradient.cols = c("#56B4E9", "#F0E442", "#D55E00"))  

Langkah terakhir dalam proses ini adalah visualisasi hasil PCA, yang menjadi bagian penting dari analisis. Beragam jenis grafik dibuat menggunakan pustaka factoextra, seperti scree plot untuk menganalisis kontribusi setiap komponen terhadap variansi total, plot individu untuk menunjukkan distribusi data dalam ruang komponen utama, serta plot variabel untuk menilai pengaruh variabel terhadap komponen utama. Visualisasi ini memberikan gambaran grafis hasil PCA sehingga mempermudah interpretasi dan mendukung pengambilan keputusan berbasis data. Semua tahapan saling berkesinambungan, membentuk alur kerja yang terstruktur mulai dari persiapan data hingga analisis mendalam dan penyajian hasil.

Penjelasan Output Visualisasi:

  1. Visualisasi Scree Plot menggambarkan persentase variansi yang dijelaskan oleh setiap dimensi dalam analisis PCA. Berdasarkan grafik, dimensi pertama mencakup sekitar 40% variansi, sedangkan dimensi kedua menjelaskan 24,5%. Kontribusi dimensi lainnya berkurang secara drastis. Ini menunjukkan bahwa dimensi pertama dan kedua sudah cukup mewakili sebagian besar informasi dalam data.

  2. Plot individu pada dua dimensi utama PCA (Dim1 dan Dim2) memperlihatkan penyebaran data berdasarkan kontribusi mereka terhadap komponen utama. Titik-titik yang berada lebih jauh dari pusat memiliki nilai cos2 lebih tinggi, menandakan representasi yang lebih baik dalam dua dimensi tersebut. Data terlihat tersebar secara signifikan pada Dim1, yang menjelaskan 40,4% dari total variansi.

  3. Plot variabel memvisualisasikan kontribusi dan korelasi variabel asli terhadap komponen utama. Panjang vektor atau panah mencerminkan besarnya kontribusi variabel terhadap dimensi tertentu, sedangkan sudut antarpanah menunjukkan hubungan antarvariabel. Variabel seperti “CalorieIntake,” “ProteinIntake,” dan “CarbIntake” memberikan kontribusi dominan pada Dim1, sementara “Weight” dan “WeightIndex” memiliki kontribusi lebih kecil dan orientasi yang berbeda.

  4. Biplot menggabungkan representasi individu dan variabel. Visualisasi ini menunjukkan bagaimana individu dan variabel berinteraksi. Titik-titik individu yang terletak di arah vektor seperti “CalorieIntake” cenderung memiliki nilai yang lebih tinggi pada variabel tersebut. Dimensi pertama secara signifikan dipengaruhi oleh pola konsumsi, sedangkan dimensi kedua merepresentasikan variasi sekunder dalam dataset.