KARAKTERISTIK PENGELUARAN DAN KONSUMSI GIZI RUMAH TANGGA MENURUT KELOMPOK PENGELUARAN DI JAWA BARAT TAHUN 2023

Jawa Barat merupakan salah satu provinsi dengan jumlah penduduk terbesar di Indonesia.

Penelitian ini bertujuan untuk menganalisis bagaimana rumah tangga berpengeluaran tinggi di Jawa Barat mengelola anggaran mereka, khususnya dalam aspek konsumsi menggunakan data Susenas 2023.

Data konsumsi non-makanan

sensus5 <- read.csv("C:\\Users\\ASUS\\Downloads\\2023 Maret JABAR - SUSENAS KP BP 4.2.csv")
tail(sensus5)

Data konsumsi makanan

sensus4 <- read.csv("C:\\Users\\ASUS\\Downloads\\2023 Maret JABAR - SUSENAS KP BP 4.3.csv")
tail(sensus4)

URUT : Nomor urut RT
R101 : Kode provinsi
R102 : Kode kabupaten/kota
R105 : Klasifikasi perkotaan/perdesaan
R301 : Jumlah anggota rumah tangga
FOOD : Rata-rata pengeluaran makanan rumah tangga sebulan
NONFOOD : Rata-rata pengeluaran bukan makanan rumah tangga sebulan
EXPEND : Rata=rata pengeluaran rumah tangga sebulan
KAPITA : Rata-rata pengeluaran perkapita sebulan
KALORI_KAP: banyaknya konsumsi kalori perkapita sehari
PROTE_KAP : banyaknya konsumsi protein perkapita sehari
LEMAK_KAP : banyaknya konsumsi lemak perkapita sehari
KARBO_KAP : banyaknya konsumsi karbohidrat perkapita sehari
WERT : Penimbang estimasi rumah tangga
WEIND : Penimbang untuk estimasi penduduk
PSU : Primary Sampling Unit
SSU : Secondary Sampling Unit
WI1 : Renumbering NKS
WI2 : Renumbering NURT

length(sensus4$URUT)
## [1] 25890
summary(sensus4)
##        X              URUT             R101         R102           R105      
##  Min.   :    0   Min.   :500001   Min.   :32   Min.   : 1.0   Min.   :1.000  
##  1st Qu.: 6472   1st Qu.:506473   1st Qu.:32   1st Qu.: 6.0   1st Qu.:1.000  
##  Median :12944   Median :512946   Median :32   Median :13.0   Median :1.000  
##  Mean   :12944   Mean   :512946   Mean   :32   Mean   :28.2   Mean   :1.345  
##  3rd Qu.:19417   3rd Qu.:519418   3rd Qu.:32   3rd Qu.:72.0   3rd Qu.:2.000  
##  Max.   :25889   Max.   :525890   Max.   :32   Max.   :79.0   Max.   :2.000  
##       R301             FOOD             NONFOOD              EXPEND         
##  Min.   : 1.000   Min.   :  130367   Min.   :    58333   Min.   :   335202  
##  1st Qu.: 2.000   1st Qu.: 1433904   1st Qu.:   899592   1st Qu.:  2454899  
##  Median : 3.000   Median : 2126700   Median :  1486733   Median :  3725250  
##  Mean   : 3.271   Mean   : 2608072   Mean   :  2846429   Mean   :  5454501  
##  3rd Qu.: 4.000   3rd Qu.: 3163232   3rd Qu.:  2741938   3rd Qu.:  5916417  
##  Max.   :13.000   Max.   :28058571   Max.   :320844250   Max.   :329531393  
##      KAPITA            KALORI_KAP     PROTE_KAP        LEMAK_KAP      
##  Min.   :   215471   Min.   :1002   Min.   : 18.52   Min.   :  9.801  
##  1st Qu.:   789223   1st Qu.:1851   1st Qu.: 53.09   1st Qu.: 38.844  
##  Median :  1207729   Median :2208   Median : 65.39   Median : 49.712  
##  Mean   :  1855078   Mean   :2316   Mean   : 69.95   Mean   : 54.064  
##  3rd Qu.:  1956817   3rd Qu.:2669   3rd Qu.: 81.44   3rd Qu.: 64.065  
##  Max.   :100801869   Max.   :4500   Max.   :311.68   Max.   :300.226  
##    KARBO_KAP           WERT              WEIND               PSU       
##  Min.   : 67.26   Min.   :   2.145   Min.   :    2.93   Min.   :   22  
##  1st Qu.:260.46   1st Qu.: 170.617   1st Qu.:  438.13   1st Qu.:11281  
##  Median :317.52   Median : 383.224   Median : 1168.56   Median :20775  
##  Mean   :331.60   Mean   : 533.346   Mean   : 1971.36   Mean   :19760  
##  3rd Qu.:384.69   3rd Qu.: 716.808   3rd Qu.: 2497.65   3rd Qu.:30398  
##  Max.   :834.65   Max.   :3821.023   Max.   :37770.55   Max.   :34485  
##       SSU              WI1             WI2        
##  Min.   :    96   Min.   :    9   Min.   :    81  
##  1st Qu.:111888   1st Qu.:11268   1st Qu.:111873  
##  Median :206114   Median :20762   Median :206099  
##  Mean   :195949   Mean   :19747   Mean   :195934  
##  3rd Qu.:301412   3rd Qu.:30385   3rd Qu.:301397  
##  Max.   :341775   Max.   :34472   Max.   :341760
str(sensus4)
## 'data.frame':    25890 obs. of  20 variables:
##  $ X         : int  0 1 2 3 4 5 6 7 8 9 ...
##  $ URUT      : int  500001 500002 500003 500004 500005 500006 500007 500008 500009 500010 ...
##  $ R101      : int  32 32 32 32 32 32 32 32 32 32 ...
##  $ R102      : int  7 72 6 72 77 77 75 11 10 1 ...
##  $ R105      : int  2 1 2 1 1 1 1 2 2 1 ...
##  $ R301      : int  4 2 3 7 3 2 2 6 2 4 ...
##  $ FOOD      : num  2660400 1108714 2413886 7770000 4932557 ...
##  $ NONFOOD   : num  2304033 525167 1398333 4313333 46219750 ...
##  $ EXPEND    : num  4964433 1633881 3812219 12083333 51152307 ...
##  $ KAPITA    : num  1241108 816940 1270740 1726190 17050769 ...
##  $ KALORI_KAP: num  2365 2612 2527 3656 2331 ...
##  $ PROTE_KAP : num  67.1 69.1 68.7 141.5 78.5 ...
##  $ LEMAK_KAP : num  43.2 30.1 58.5 119.5 53.1 ...
##  $ KARBO_KAP : num  353 472 360 455 255 ...
##  $ WERT      : num  454.9 172.4 241.6 93.7 122.2 ...
##  $ WEIND     : num  1820 345 725 656 367 ...
##  $ PSU       : int  12448 31373 12092 31135 33988 34062 33428 18431 18089 114 ...
##  $ SSU       : int  123442 311039 119908 308689 336798 337531 331261 182888 179477 1020 ...
##  $ WI1       : int  12435 31360 12079 31122 33975 34049 33415 18418 18076 101 ...
##  $ WI2       : int  123427 311024 119893 308674 336783 337516 331246 182873 179462 1005 ...
datapakai <- c('EXPEND', 'FOOD', 'NONFOOD', 'KALORI_KAP', 'PROTE_KAP', 'LEMAK_KAP', 'KARBO_KAP')

round(cor(sensus4[, datapakai]), 3)
##            EXPEND  FOOD NONFOOD KALORI_KAP PROTE_KAP LEMAK_KAP KARBO_KAP
## EXPEND      1.000 0.736   0.974      0.126     0.217     0.243    -0.007
## FOOD        0.736 1.000   0.564      0.248     0.351     0.402     0.073
## NONFOOD     0.974 0.564   1.000      0.071     0.147     0.163    -0.033
## KALORI_KAP  0.126 0.248   0.071      1.000     0.859     0.707     0.894
## PROTE_KAP   0.217 0.351   0.147      0.859     1.000     0.705     0.697
## LEMAK_KAP   0.243 0.402   0.163      0.707     0.705     1.000     0.448
## KARBO_KAP  -0.007 0.073  -0.033      0.894     0.697     0.448     1.000
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.5.2
## corrplot 0.95 loaded
corrplot(cor(sensus4[, datapakai]), 
         method = "color", # tampilan kotak warna
         type = "upper", # tampilkan segitiga atas saja
         addCoef.col = "black", # tampilkan angka korelasi
         tl.col = "black", # warna label
         diag = FALSE, # hilangkan diagonal
         col = colorRampPalette(c("#FFF176", "white", "#66BB6A"))(200)
         ) 

Distribusi Pengeluaran Masyarakat Jawa barat (EXPEND)

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.3
library(scales)
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
n_obs <- length(sensus4$EXPEND)
bin_sturges <- ceiling(1 + 3.3 * log10(n_obs))

ggplot(sensus4, aes(x = EXPEND)) +
  geom_histogram(bins = bin_sturges, 
                 alpha = 1) +
  labs(title = "Distribusi Rataan Pengeluaran Rumah Tangga Sebulan (EXPEND)",
       subtitle = "Provinsi Jawa Barat",
       x = "Rataan Pengeluaran (Rupiah)",
       y = "Frekuensi") +
  theme_minimal() +
  scale_x_continuous(labels = label_number(scale = 1e-6, suffix = " jt")) +
  coord_cartesian(xlim = c(0, 300e6))

qqnorm(sensus4$EXPEND)
qqline(sensus4$EXPEND, col = "red")

library(dplyr)
library(moments)
## Warning: package 'moments' was built under R version 4.5.2
sk <- skewness(sensus4$EXPEND, na.rm = TRUE)
kt <- kurtosis(sensus4$EXPEND, na.rm = TRUE)

jenis_sk <- ifelse(sk > 0, "Miring ke Kanan", ifelse(sk < 0, "Miring ke Kiri", "Simetris"))
jenis_kt <- ifelse(kt > 3, "Leptokurtik", ifelse(kt < 3, "Platikurtik", "Mesokurtik"))

summary_total_expend <- data.frame(
  Kategori = "Total",
  Skewness = sk,
  Jenis_Skewness = jenis_sk,
  Kurtosis = kt,
  Jenis_Kurtosis = jenis_kt
)

print(summary_total_expend)
##   Kategori Skewness  Jenis_Skewness Kurtosis Jenis_Kurtosis
## 1    Total 12.47641 Miring ke Kanan 408.8897    Leptokurtik

Adjusted Boxplot (EXPEND)

library(robustbase)
## Warning: package 'robustbase' was built under R version 4.5.3
adjbox(sensus4$EXPEND, 
       horizontal = TRUE,
       main = "Adjusted Boxplot: Rataan Pengeluaran Rumah Tangga Sebulan (EXPEND)",
       xlab = "Rataan Pengeluaran (Rupiah)",
       xaxt = "n")
## The default of 'doScale' is FALSE now for stability;
##   set options(mc_doScale_quiet=TRUE) to suppress this (once per session) message
max_exp <- max(sensus4$EXPEND, na.rm = TRUE)
ticks_exp <- seq(0, max_exp, length.out = 6)
axis(1, at = ticks_exp, labels = paste0(round(ticks_exp/1e6, 1), " jt"), las = 1)

Adjusted Boxplot (Plot Gabungan FOOD dan NONFOOD)

library(robustbase)
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.5.3
data_long_jabar <- sensus4 %>%
  pivot_longer(cols = c(FOOD, NONFOOD), 
               names_to = "Jenis_Konsumsi", 
               values_to = "Nilai")

adjbox(Nilai ~ Jenis_Konsumsi, 
       data = data_long_jabar,
       horizontal = TRUE,
       main = "Adjusted Boxplot: FOOD vs NONFOOD",
       xlab = "Total Pengeluaran (Rupiah)",
       ylab = "",
       col = c("#FED80B", "#263C92"),
       border = "black",
       xaxt = "n",
       yaxt = "n")

max_val <- max(data_long_jabar$Nilai, na.rm = TRUE)
ticks_x <- seq(0, max_val, length.out = 6)
axis(1, at = ticks_x, labels = paste0(round(ticks_x/1e6, 1), " jt"), las = 1)

axis(2, at = 1:2, labels = c("FOOD", "NONFOOD"), las = 1)

Adjusted Boxplot (FOOD)

library(robustbase)

adjbox(sensus4$FOOD, 
       horizontal = TRUE,
       main = "Adjusted Boxplot: Pengeluaran Makanan (FOOD)",
       xlab = "Total Pengeluaran (Rupiah)",
       col = "#FED80B",
       border = "black",
       xaxt = "n")

max_food <- max(sensus4$FOOD, na.rm = TRUE)
ticks_food <- seq(0, max_food, length.out = 6)
axis(1, at = ticks_food, labels = paste0(round(ticks_food/1e6, 1), " jt"), las = 1)

hist(sensus4$FOOD)

Adjusted Boxplot (NONFOOD)

library(robustbase)

adjbox(sensus4$NONFOOD, 
       horizontal = TRUE,
       main = "Adjusted Boxplot: Pengeluaran Bukan Makanan (NONFOOD)",
       xlab = "Total Pengeluaran (Rupiah)",
       col = "#263C92",
       border = "black",
       xaxt = "n")

max_nonfood <- max(sensus4$NONFOOD, na.rm = TRUE)
ticks_nonfood <- seq(0, max_nonfood, length.out = 6)
axis(1, at = ticks_nonfood, labels = paste0(round(ticks_nonfood/1e6, 1), " jt"), las = 1)

Kategori Data FOOD

library(robustbase)
library(dplyr)

stats_adj <- adjboxStats(sensus4$EXPEND)
pagar_bawah <- stats_adj$fence[1]
pagar_atas  <- stats_adj$fence[2]

sensus4_kategori <- sensus4 %>%
  mutate(Kategori_Penghasilan = case_when(
    EXPEND < pagar_bawah                        ~ "berpenghasilan rendah",
    EXPEND >= pagar_bawah & EXPEND <= pagar_atas ~ "berpenghasilan menengah",
    EXPEND > pagar_atas                         ~ "berpenghasilan tinggi"
  ))
library(robustbase)

data_total <- sensus4_kategori$FOOD
data_rendah <- sensus4_kategori$FOOD[sensus4_kategori$Kategori_Penghasilan == "berpenghasilan rendah"]
data_sedang <- sensus4_kategori$FOOD[sensus4_kategori$Kategori_Penghasilan %in% c("berpenghasilan sedang", "berpenghasilan menengah")]
data_tinggi <- sensus4_kategori$FOOD[sensus4_kategori$Kategori_Penghasilan == "berpenghasilan tinggi"]

adjbox(list(data_tinggi, data_sedang, data_rendah, data_total),
       horizontal = TRUE,
       main = "Perbandingan Pengeluaran Pangan (FOOD)",
       xlab = "Pengeluaran Pangan (Rupiah)",
       col = c("#66BB6A", "#A5D6A7", "#FFF176", "white"),
       yaxt = "n",
       xaxt = "n")

axis(2, at = 1:4, labels = c("Tinggi", "Menengah", "Rendah", "Total"), las = 1)

max_food <- max(sensus4_kategori$FOOD, na.rm = TRUE)
ticks_food <- seq(0, max_food, length.out = 6)
axis(1, at = ticks_food, labels = paste0(round(ticks_food/1e6, 1), " jt"), las = 1)

library(dplyr)

summary_kategori_food <- sensus4_kategori %>%
  group_by(Kategori_Penghasilan) %>%
  summarise(
    Minimal = min(FOOD, na.rm = TRUE),
    Mean = mean(FOOD, na.rm = TRUE),
    Median = median(FOOD, na.rm = TRUE),
    Maksimal = max(FOOD, na.rm = TRUE)
  )

summary_total_food <- sensus4_kategori %>%
  summarise(
    Kategori_Penghasilan = "Total",
    Minimal = min(FOOD, na.rm = TRUE),
    Mean = mean(FOOD, na.rm = TRUE),
    Median = median(FOOD, na.rm = TRUE),
    Maksimal = max(FOOD, na.rm = TRUE)
  )

summary_food <- bind_rows(summary_total_food, summary_kategori_food)
print(summary_food)
##      Kategori_Penghasilan   Minimal      Mean    Median   Maksimal
## 1                   Total  130367.1 2608072.0 2126700.0 28058571.4
## 2 berpenghasilan menengah  272571.4 2512935.1 2139085.7 15517971.4
## 3   berpenghasilan rendah  130367.1  518144.5  513985.7   981814.3
## 4   berpenghasilan tinggi 1620497.1 8388751.4 7857428.6 28058571.4

Kategori Data NONFOOD

library(robustbase)

data_total <- sensus4_kategori$NONFOOD
data_rendah <- sensus4_kategori$NONFOOD[sensus4_kategori$Kategori_Penghasilan == "berpenghasilan rendah"]
data_sedang <- sensus4_kategori$NONFOOD[sensus4_kategori$Kategori_Penghasilan %in% c("berpenghasilan sedang", "berpenghasilan menengah")]
data_tinggi <- sensus4_kategori$NONFOOD[sensus4_kategori$Kategori_Penghasilan == "berpenghasilan tinggi"]

adjbox(list(data_tinggi, data_sedang, data_rendah, data_total),
       horizontal = TRUE,
       main = "Perbandingan Pengeluaran Non-Pangan (NONFOOD)",
       xlab = "Pengeluaran Non-Pangan (Rupiah)",
       col = c("#66BB6A", "#A5D6A7", "#FFF176", "white"),
       yaxt = "n",
       xaxt = "n")

axis(2, at = 1:4, labels = c("Tinggi", "Menengah", "Rendah", "Total"), las = 1)

max_nonfood <- max(sensus4_kategori$NONFOOD, na.rm = TRUE)
ticks_nonfood <- seq(0, max_nonfood, length.out = 6)
axis(1, at = ticks_nonfood, labels = paste0(round(ticks_nonfood/1e6, 1), " jt"), las = 1)

library(dplyr)

summary_kategori_nonfood <- sensus4_kategori %>%
  group_by(Kategori_Penghasilan) %>%
  summarise(
    Minimal = min(NONFOOD, na.rm = TRUE),
    Mean = mean(NONFOOD, na.rm = TRUE),
    Median = median(NONFOOD, na.rm = TRUE),
    Maksimal = max(NONFOOD, na.rm = TRUE)
  )

summary_total_nonfood <- sensus4_kategori %>%
  summarise(
    Kategori_Penghasilan = "Total",
    Minimal = min(NONFOOD, na.rm = TRUE),
    Mean = mean(NONFOOD, na.rm = TRUE),
    Median = median(NONFOOD, na.rm = TRUE),
    Maksimal = max(NONFOOD, na.rm = TRUE)
  )

summary_nonfood <- bind_rows(summary_total_nonfood, summary_kategori_nonfood)
print(summary_nonfood)
##      Kategori_Penghasilan    Minimal       Mean     Median  Maksimal
## 1                   Total   58333.33  2846429.4  1486733.3 320844250
## 2 berpenghasilan menengah  110333.33  2285216.8  1496329.2  17135383
## 3   berpenghasilan rendah   58333.33   362516.4   353833.3    787000
## 4   berpenghasilan tinggi 5767750.00 24808206.9 19289366.7 320844250
library(robustbase)

stats_adj <- adjboxStats(sensus4$EXPEND)
lower_fence <- stats_adj$fence[1]
upper_fence <- stats_adj$fence[2]
max_exp <- max(sensus4$EXPEND, na.rm = TRUE)
min_exp <- min(sensus4$EXPEND, na.rm = TRUE)

adjbox(sensus4$EXPEND, 
       horizontal = TRUE,
       main = "Adjusted Boxplot: Rataan Pengeluaran Rumah Tangga Sebulan (EXPEND)",
       xlab = "Rataan Pengeluaran (Rupiah)",
       xaxt = "n",
       col = "white")

rect(xleft = min_exp, ybottom = 0.6, xright = lower_fence, ytop = 1.4, col = "#FFF176", border = NA)
rect(xleft = lower_fence, ybottom = 0.6, xright = upper_fence, ytop = 1.4, col = "#A5D6A7", border = NA)
rect(xleft = upper_fence, ybottom = 0.6, xright = max_exp, ytop = 1.4, col = "#66BB6A", border = NA)

adjbox(sensus4$EXPEND, 
       horizontal = TRUE,
       add = TRUE,
       col = "transparent",
       border = "black",
       xaxt = "n")

ticks_exp <- seq(0, max_exp, length.out = 6)
axis(1, at = ticks_exp, labels = paste0(round(ticks_exp/1e6, 1), " jt"), las = 1)

library(dplyr)

summary_lima_serangkai <- sensus4_kategori %>%
  summarise(
    Kategori = "Total",
    Minimal = min(EXPEND, na.rm = TRUE),
    Kuartil_1 = quantile(EXPEND, 0.25, na.rm = TRUE),
    Median = median(EXPEND, na.rm = TRUE),
    Mean = mean(EXPEND, na.rm = TRUE),
    Kuartil_3 = quantile(EXPEND, 0.75, na.rm = TRUE),
    Maksimal = max(EXPEND, na.rm = TRUE)
  )

print(summary_lima_serangkai)
##   Kategori  Minimal Kuartil_1  Median    Mean Kuartil_3  Maksimal
## 1    Total 335202.4   2454899 3725250 5454501   5916417 329531393

Pisahkan Data Pengeluaran Tinggi dengan Pengeluaran Biasa

library(robustbase)

stats_adj <- adjbox(sensus4$EXPEND, plot = FALSE)

# 2. Ambil nilai Upper Fence (Pagar Atas)
# Pagar disimpan dalam stats_adj$fence: [1] adalah Lower, [2] adalah Upper
pagar_atas <- stats_adj$fence[2]

cat("Batas Pagar Atas Adjusted Boxplot:", pagar_atas / 1e6, "jt\n")
## Batas Pagar Atas Adjusted Boxplot: 20.47929 jt
stats_adj <- adjbox(sensus4$EXPEND, plot = FALSE)

# 2. Ambil nilai Upper Fence (Pagar Atas)
# Pagar disimpan dalam stats_adj$fence: [1] adalah Lower, [2] adalah Upper
pagar_bawah <- stats_adj$fence[1]

cat("Batas Pagar Bawah Adjusted Boxplot:", pagar_bawah / 1e6, "jt\n")
## Batas Pagar Bawah Adjusted Boxplot: 1.141747 jt

Kategori:
Penghasilan rendah : <Rp1,141,747
Penghasilan menengah: Rp1,141,748 s.d Rp20,479,290
Penghasilan tinggi : >Rp20,479,291

Pengeluaran ini didasarkan dari rumah tangga dan bukan per kapita. Rp335,202.4 merupakan minimum rataan pengeluaran rumah tangga di Jawa Barat pada tahun 2023.

library(robustbase)
library(dplyr)

stats_adj <- adjboxStats(sensus4$EXPEND)
pagar_bawah <- stats_adj$fence[1]
pagar_atas <- stats_adj$fence[2]

sensus4_kategori <- sensus4 %>%
  mutate(Kategori_Penghasilan = case_when(
    EXPEND < pagar_bawah ~ "berpenghasilan rendah",
    EXPEND >= pagar_bawah & EXPEND <= pagar_atas ~ "berpenghasilan menengah",
    EXPEND > pagar_atas ~ "berpenghasilan tinggi"
  ))
library(ggplot2)
library(scales)
library(dplyr)

ggplot(sensus4_kategori, aes(x = PROTE_KAP, fill = factor(Kategori_Penghasilan, 
                                                          levels = c("berpenghasilan rendah", 
                                                                     "berpenghasilan menengah", 
                                                                     "berpenghasilan tinggi")))) +
  geom_histogram(bins = bin_sturges, 
                 color = "white", 
                 alpha = 0.75) +
  labs(title = "Analisis Sebaran Konsumsi Protein per Kapita (PROTE_KAP)",
       subtitle = "Perbandingan Distribusi Berdasarkan Kategori Penghasilan",
       x = "Konsumsi Protein per Kapita",
       y = "Frekuensi (Jumlah RT)",
       fill = "Kategori Penghasilan") +
  theme_minimal() +
  scale_fill_manual(values = c("berpenghasilan rendah" = "#FFF176", 
                               "berpenghasilan menengah" = "#A5D6A7", 
                               "berpenghasilan tinggi" = "#66BB6A")) +
  scale_x_continuous(labels = label_number(big.mark = "."))
## Warning in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L, :
## 'big.mark' and 'decimal.mark' are both '.', which could be confusing

Histogram tidak cukup representatif karena saling bertumpuk dan sulit untuk dilihat perbedaannya.

Konsumsi Kalori Per Kapita

library(robustbase)

data_total <- sensus4_kategori$KALORI_KAP
data_rendah <- sensus4_kategori$KALORI_KAP[sensus4_kategori$Kategori_Penghasilan == "berpenghasilan rendah"]
data_sedang <- sensus4_kategori$KALORI_KAP[sensus4_kategori$Kategori_Penghasilan %in% c("berpenghasilan sedang", "berpenghasilan menengah")]
data_tinggi <- sensus4_kategori$KALORI_KAP[sensus4_kategori$Kategori_Penghasilan == "berpenghasilan tinggi"]

adjbox(list(data_tinggi, data_sedang, data_rendah, data_total),
       horizontal = TRUE,
       main = "Perbandingan Konsumsi Kalori per Kapita (KALORI_KAP)",
       xlab = "Konsumsi Kalori per Kapita",
       col = c("#66BB6A", "#A5D6A7", "#FFF176", "white"),
       yaxt = "n")

axis(2, at = 1:4, labels = c("Berpenghasilan Tinggi", "Berpenghasilan Menengah", "Berpenghasilan Rendah", "Total"), las = 1)

library(dplyr)

# 1. Hitung summary statistik untuk masing-masing kategori penghasilan
summary_kategori <- sensus4_kategori %>%
  group_by(Kategori_Penghasilan) %>%
  summarise(
    Minimal = min(KALORI_KAP, na.rm = TRUE),
    Mean = mean(KALORI_KAP, na.rm = TRUE),
    Median = median(KALORI_KAP, na.rm = TRUE),
    Maksimal = max(KALORI_KAP, na.rm = TRUE)
  )

# 2. Hitung summary statistik untuk seluruh data (Total)
summary_total <- sensus4_kategori %>%
  summarise(
    Kategori_Penghasilan = "Total",
    Minimal = min(KALORI_KAP, na.rm = TRUE),
    Mean = mean(KALORI_KAP, na.rm = TRUE),
    Median = median(KALORI_KAP, na.rm = TRUE),
    Maksimal = max(KALORI_KAP, na.rm = TRUE)
  )

# 3. Gabungkan ringkasan Total dan per Kategori menjadi satu tabel
summary_kalori_kap <- bind_rows(summary_total, summary_kategori)

# 4. Tampilkan tabel hasil summary
print("RINGKASAN KONSUMSI KALORI (KALORI_KAP)")
## [1] "RINGKASAN KONSUMSI KALORI (KALORI_KAP)"
print(summary_kalori_kap)
##      Kategori_Penghasilan  Minimal     Mean   Median Maksimal
## 1                   Total 1001.598 2316.151 2208.059 4499.799
## 2 berpenghasilan menengah 1002.081 2310.852 2202.963 4499.799
## 3   berpenghasilan rendah 1001.598 2256.997 2182.534 4367.116
## 4   berpenghasilan tinggi 1037.545 2567.546 2454.967 4495.565

Konsumsi Protein Per Kapita

library(robustbase)

data_total <- sensus4_kategori$PROTE_KAP
data_rendah <- sensus4_kategori$PROTE_KAP[sensus4_kategori$Kategori_Penghasilan == "berpenghasilan rendah"]
data_sedang <- sensus4_kategori$PROTE_KAP[sensus4_kategori$Kategori_Penghasilan %in% c("berpenghasilan sedang", "berpenghasilan menengah")]
data_tinggi <- sensus4_kategori$PROTE_KAP[sensus4_kategori$Kategori_Penghasilan == "berpenghasilan tinggi"]

adjbox(list(data_tinggi, data_sedang, data_rendah, data_total),
       horizontal = TRUE,
       main = "Perbandingan Konsumsi Protein per Kapita (PROTE_KAP)",
       xlab = "Konsumsi Protein per Kapita",
       col = c("#66BB6A", "#A5D6A7", "#FFF176", "white"),
       yaxt = "n")

axis(2, at = 1:4, labels = c("Berpenghasilan Tinggi", "Berpenghasilan Menengah", "Berpenghasilan Rendah", "Total"), las = 1)

library(dplyr)

summary_kategori_prote <- sensus4_kategori %>%
  group_by(Kategori_Penghasilan) %>%
  summarise(
    Minimal = min(PROTE_KAP, na.rm = TRUE),
    Mean = mean(PROTE_KAP, na.rm = TRUE),
    Median = median(PROTE_KAP, na.rm = TRUE),
    Maksimal = max(PROTE_KAP, na.rm = TRUE)
  )

summary_total_prote <- sensus4_kategori %>%
  summarise(
    Kategori_Penghasilan = "Total",
    Minimal = min(PROTE_KAP, na.rm = TRUE),
    Mean = mean(PROTE_KAP, na.rm = TRUE),
    Median = median(PROTE_KAP, na.rm = TRUE),
    Maksimal = max(PROTE_KAP, na.rm = TRUE)
  )

summary_prote_kap <- bind_rows(summary_total_prote, summary_kategori_prote)
print("RINGKASAN KONSUMSI PROTEIN (PROTE_KAP)")
## [1] "RINGKASAN KONSUMSI PROTEIN (PROTE_KAP)"
print(summary_prote_kap)
##      Kategori_Penghasilan  Minimal     Mean   Median Maksimal
## 1                   Total 18.51571 69.95189 65.38658 311.6753
## 2 berpenghasilan menengah 19.09000 69.56789 65.10426 311.6753
## 3   berpenghasilan rendah 18.51571 65.05850 62.46586 164.0109
## 4   berpenghasilan tinggi 29.38143 88.91677 83.10696 261.6636

Berdasarkan PMK No. 28 Tahun 2019, Angka Kecukupan Protein (AKP) yang dianjurkan secara nasional untuk masyarakat Indonesia adalah 65 gram per orang per hari pada tingkat konsumsi (setara dengan kontribusi minimal 10% hingga 15% dari total kebutuhan 2100 kkal. Sementara itu, Peraturan Badan Pangan Nasional (Bapanas) No. 11 Tahun 2023 menggunakan acuan target ketersediaan protein yang lebih tinggi di tingkat penyediaan, yaitu sebesar 60 gram per kapita per hari, guna memastikan ketahanan pangan dan pemenuhan gizi yang merata di seluruh wilayah.

library(dplyr)

sensus4_kategori %>%
  filter(PROTE_KAP == max(PROTE_KAP, na.rm = TRUE)) %>%
  dplyr::select(PROTE_KAP, KAPITA, FOOD, EXPEND)

Jumlah protein per kapita tertinggi ada di rumah tangga yang berpengeluaran Rp7,494,190 dan berpengeluaran pada makanan sebesar Rp4,872,857

Konsumsi Lemak Per Kapita

library(robustbase)

data_total <- sensus4_kategori$LEMAK_KAP
data_rendah <- sensus4_kategori$LEMAK_KAP[sensus4_kategori$Kategori_Penghasilan == "berpenghasilan rendah"]
data_sedang <- sensus4_kategori$LEMAK_KAP[sensus4_kategori$Kategori_Penghasilan %in% c("berpenghasilan sedang", "berpenghasilan menengah")]
data_tinggi <- sensus4_kategori$LEMAK_KAP[sensus4_kategori$Kategori_Penghasilan == "berpenghasilan tinggi"]

adjbox(list(data_tinggi, data_sedang, data_rendah, data_total),
       horizontal = TRUE,
       main = "Perbandingan Konsumsi Lemak per Kapita (LEMAK_KAP)",
       xlab = "Konsumsi Lemak per Kapita",
       col = c("#66BB6A", "#A5D6A7", "#FFF176", "white"),
       yaxt = "n")

axis(2, at = 1:4, labels = c("Berpenghasilan Tinggi", "Berpenghasilan Menengah", "Berpenghasilan Rendah", "Total"), las = 1)

library(dplyr)

summary_kategori_lemak <- sensus4_kategori %>%
  group_by(Kategori_Penghasilan) %>%
  summarise(
    Minimal = min(LEMAK_KAP, na.rm = TRUE),
    Mean = mean(LEMAK_KAP, na.rm = TRUE),
    Median = median(LEMAK_KAP, na.rm = TRUE),
    Maksimal = max(LEMAK_KAP, na.rm = TRUE)
  )

summary_total_lemak <- sensus4_kategori %>%
  summarise(
    Kategori_Penghasilan = "Total",
    Minimal = min(LEMAK_KAP, na.rm = TRUE),
    Mean = mean(LEMAK_KAP, na.rm = TRUE),
    Median = median(LEMAK_KAP, na.rm = TRUE),
    Maksimal = max(LEMAK_KAP, na.rm = TRUE)
  )

summary_lemak_kap <- bind_rows(summary_total_lemak, summary_kategori_lemak)
print("RINGKASAN KONSUMSI LEMAK (LEMAK_KAP)")
## [1] "RINGKASAN KONSUMSI LEMAK (LEMAK_KAP)"
print(summary_lemak_kap)
##      Kategori_Penghasilan   Minimal     Mean   Median Maksimal
## 1                   Total  9.800786 54.06365 49.71153 300.2260
## 2 berpenghasilan menengah  9.800786 54.05163 49.78296 300.2260
## 3   berpenghasilan rendah 10.913704 39.70053 37.43440 270.1086
## 4   berpenghasilan tinggi 20.922857 72.17853 65.28407 276.6770

Berdasarkan PMK No. 28 Tahun 2019, Angka Kecukupan Lemak yang dianjurkan untuk masyarakat Indonesia adalah berkisar antara 60 hingga 75 gram per orang per hari untuk usia dewasa (atau setara dengan kontribusi 20% hingga 25% dari total kebutuhan 2100 kkal. Sementara itu, Peraturan Badan Pangan Nasional (Bapanas) No. 11 Tahun 2023 tentang Pola Pangan Harapan menggunakan acuan kelompok minyak dan lemak dengan target tingkat ketersediaan energi sebesar 10% dari total porsi pangan ideal demi menjaga keseimbangan konsumsi harian.

Konsumsi Karbohidrat Per Kapita

library(robustbase)

data_total <- sensus4_kategori$KARBO_KAP
data_rendah <- sensus4_kategori$KARBO_KAP[sensus4_kategori$Kategori_Penghasilan == "berpenghasilan rendah"]
data_sedang <- sensus4_kategori$KARBO_KAP[sensus4_kategori$Kategori_Penghasilan %in% c("berpenghasilan sedang", "berpenghasilan menengah")]
data_tinggi <- sensus4_kategori$KARBO_KAP[sensus4_kategori$Kategori_Penghasilan == "berpenghasilan tinggi"]

adjbox(list(data_tinggi, data_sedang, data_rendah, data_total),
       horizontal = TRUE,
       main = "Perbandingan Konsumsi Karbohidrat per Kapita (KARBO_KAP)",
       xlab = "Konsumsi Karbohidrat per Kapita",
       col = c("#66BB6A", "#A5D6A7", "#FFF176", "white"),
       yaxt = "n")

axis(2, at = 1:4, labels = c("Berpenghasilan Tinggi", "Berpenghasilan Menengah", "Berpenghasilan Rendah", "Total"), las = 1)

library(dplyr)

summary_kategori_karbo <- sensus4_kategori %>%
  group_by(Kategori_Penghasilan) %>%
  summarise(
    Minimal = min(KARBO_KAP, na.rm = TRUE),
    Mean = mean(KARBO_KAP, na.rm = TRUE),
    Median = median(KARBO_KAP, na.rm = TRUE),
    Maksimal = max(KARBO_KAP, na.rm = TRUE)
  )

summary_total_karbo <- sensus4_kategori %>%
  summarise(
    Kategori_Penghasilan = "Total",
    Minimal = min(KARBO_KAP, na.rm = TRUE),
    Mean = mean(KARBO_KAP, na.rm = TRUE),
    Median = median(KARBO_KAP, na.rm = TRUE),
    Maksimal = max(KARBO_KAP, na.rm = TRUE)
  )

summary_karbo_kap <- bind_rows(summary_total_karbo, summary_kategori_karbo)
print("RINGKASAN KONSUMSI KARBOHIDRAT (KARBO_KAP)")
## [1] "RINGKASAN KONSUMSI KARBOHIDRAT (KARBO_KAP)"
print(summary_karbo_kap)
##      Kategori_Penghasilan   Minimal     Mean   Median Maksimal
## 1                   Total  67.26462 331.6027 317.5234 834.6468
## 2 berpenghasilan menengah  67.26462 330.9521 316.8031 834.6468
## 3   berpenghasilan rendah 108.70907 357.9151 344.9271 781.7707
## 4   berpenghasilan tinggi 114.78666 321.0709 311.5692 671.3626

Berdasarkan PMK No. 28 Tahun 2019, Angka Kecukupan Karbohidrat (AKK) yang dianjurkan untuk masyarakat Indonesia usia dewasa adalah berkisar antara 340 hingga 430 gram per orang per hari. Jumlah ini direkomendasikan untuk menyumbang sekitar 55% hingga 65% dari total kebutuhan energi harian sebesar 2100 kkal, menjadikannya sebagai sumber bahan bakar utama bagi tubuh.

===================================== EKSPLORASI TAMBAHAN =====================================

library(ggplot2)
library(scales)

quarts <- quantile(sensus4$EXPEND, probs = c(0.25, 0.5, 0.75), na.rm = TRUE)
q1 <- quarts[1]
q2 <- quarts[2]
q3 <- quarts[3]

ggplot(sensus4, aes(x = EXPEND)) +
  geom_histogram(bins = 50, fill = "#D3D3D3", color = "white", alpha = 0.7) +
  
  geom_vline(xintercept = q1, color = "red", linetype = "solid", linewidth = 0.5) +
  geom_vline(xintercept = q2, color = "blue", linetype = "solid", linewidth = 0.5) +
  geom_vline(xintercept = q3, color = "green", linetype = "solid", linewidth = 0.5) +
  
  annotate("text", x = q1, y = Inf, label = paste0("Q1: ", round(q1/1e6, 2), " jt"), 
           vjust = 5, angle = 0, color = "red", size = 3.5, fontface = "bold") +
  annotate("text", x = q2, y = Inf, label = paste0("Q2: ", round(q2/1e6, 2), " jt"), 
           vjust = 10, angle = 0, color = "blue", size = 3.5, fontface = "bold") +
  annotate("text", x = q3, y = Inf, label = paste0("Q3: ", round(q3/1e6, 2), " jt"), 
           vjust = 15, angle = 0, color = "green", size = 3.5, fontface = "bold") +
  
  labs(title = "Distribusi EXPEND dengan Penanda Kuartil",
       subtitle = "Provinsi Jawa Barat - Visualisasi Batas Kelompok Pengeluaran",
       x = "Total Pengeluaran (Rupiah)",
       y = "Frekuensi (Rumah Tangga)") +
  theme_minimal() +
  scale_x_continuous(labels = label_number(scale = 1e-6, suffix = " jt"), 
                     limits = c(0, 150e6))
## Warning: Removed 2 rows containing non-finite outside the scale range
## (`stat_bin()`).
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_bar()`).

library(dplyr)

# Memisahkan data
data_pengeluaran_tinggi <- sensus4 %>% 
  filter(EXPEND > pagar_atas)

data_normal <- sensus4 %>% 
  filter(EXPEND <= pagar_atas)

# Melihat jumlah amatan masing-masing
cat("Jumlah RT Pengeluaran Sangat Tinggi:", nrow(data_pengeluaran_tinggi), "\n")
## Jumlah RT Pengeluaran Sangat Tinggi: 721
cat("Jumlah RT Normal:", nrow(data_normal), "\n")
## Jumlah RT Normal: 25169

Distribusi Rataan Pengeluaran Biasa

n_norm <- nrow(data_normal)
bin_norm <- ceiling(1 + 3.3 * log10(n_norm))

ggplot(data_normal, aes(x = EXPEND)) +
  geom_histogram(bins = bin_norm) +
  labs(title = "Distribusi Rataan Pengeluaran Rumah Tangga Kelompok Normal",
       subtitle = "Data di bawah pagar atas Adjusted Boxplot",
       x = "Rataan Pengeluaran (Rupiah)",
       y = "Frekuensi") +
  theme_minimal() +
  scale_x_continuous(labels = label_number(scale = 1e-6, suffix = " jt"))

Distribusi Rataan Pengeluaran Tinggi

ggplot(data_pengeluaran_tinggi, aes(x = EXPEND)) +
  geom_histogram(bins = 20) +
  labs(title = "Distribusi Rataan Pengeluaran Sangat Tinggi (Pencilan Mayor)",
       subtitle = "Rumah tangga dengan pengeluaran di atas pagar atas Adjusted Boxplot",
       x = "Rataan Pengeluaran (Rupiah)",
       y = "Frekuensi") +
  theme_minimal() +
  scale_x_continuous(labels = label_number(scale = 1e-6, suffix = " jt"))

Perbandingan Adjusted Boxplot VS Boxplot Biasa dengan Data Normal

library(robustbase)

set.seed(42)
data_sim <- rnorm(1000, mean = 50, sd = 10)

q <- quantile(data_sim, probs = c(0.25, 0.75))
iqr <- diff(q)
data_clean <- data_sim[data_sim >= (q[1] - 1.5 * iqr) & data_sim <= (q[2] + 1.5 * iqr)]

par(mfrow = c(3, 1), mar = c(4, 4, 3, 1))

hist(data_clean, breaks = 30, col = "black", border = "white",
     main = "Histogram Data Normal (Tanpa Outlier)", 
     xlab = "Nilai Data", ylab = "Frekuensi")

boxplot(data_clean, horizontal = TRUE, col = "white",
        main = "Boxplot Biasa (Standard Boxplot)", 
        xlab = "Nilai Data")

adjbox(data_clean, horizontal = TRUE, col = "grey",
       main = "Adjusted Boxplot", 
       xlab = "Nilai Data")

par(mfrow = c(1, 1))

Perbandingan Adjusted Boxplot VS Boxplot Biasa dengan Data Normal ada Outlier

library(robustbase)

set.seed(42)
data_sim <- rnorm(1000, mean = 50, sd = 10)
data_outliers <- c(data_sim, 5, 8, 12, 88, 92, 95)

par(mfrow = c(3, 1), mar = c(4, 4, 3, 1))

hist(data_outliers, breaks = 30, col = "black", border = "white",
     main = "Histogram Data Normal (Dengan Outlier)", 
     xlab = "Nilai Data", ylab = "Frekuensi")

boxplot(data_outliers, horizontal = TRUE, col = "white",
        main = "Boxplot Biasa (Standard Boxplot)", 
        xlab = "Nilai Data")

adjbox(data_outliers, horizontal = TRUE, col = "grey",
       main = "Adjusted Boxplot", 
       xlab = "Nilai Data")

par(mfrow = c(1, 1))