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.
sensus5 <- read.csv("C:\\Users\\ASUS\\Downloads\\2023 Maret JABAR - SUSENAS KP BP 4.2.csv")
tail(sensus5)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
## [1] 25890
## 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
## '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
## 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)
) ## Warning: package 'ggplot2' was built under R version 4.5.3
##
## 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))## 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
## 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)## 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)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)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)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
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
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.
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)"
## 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
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)"
## 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
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)"
## 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.
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)"
## 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
## Jumlah RT Normal: 25169
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"))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"))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")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")