NEET (Not In Employment, Education or Training)
RPubs ini menyajikan eksplorasi awal terhadap metadata Survei Sosial Ekonomi Nasional (SUSENAS) 2024, dengan fokus pada identifikasi dan karakterisasi individu berstatus NEET (Not in Education, Employment, or Training). Analisis dilakukan dengan menggabungkan beberapa file data SUSENAS yang mencakup beberapa modul (KOR Individu, KOR RUTA, dan KP)
Tujuan utama dari eksplorasi ini adalah untuk memahami distribusi dan karakteristik individu NEET di Jawa Barat, khususnya dalam kelompok usia muda (15–24 tahun ), serta memilih variabel-variabel prediktor yang mempengaruhi NEET
Variabel prediktor diperoleh dari 3 Modul berbeda
Karakteristik Indivdiu (KOR Individu)
Karakteristik Kepala Rumah Tangga (KOR Individu KRT)
Karakteristik Rumah Tangga (KOR RT)
Konsumsi dan Pengeluaran (KP)
Setelah memperoleh variabel dan eksplorasi, selanjutnya dimodelkan dengan machine learning klasifikasi (Random Forest)
## Warning: package 'ggplot2' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## Warning: package 'sf' was built under R version 4.4.3
## Linking to GEOS 3.13.0, GDAL 3.10.1, PROJ 9.5.1; sf_use_s2() is TRUE
## Warning: package 'foreign' was built under R version 4.4.3
Baca Data
#kp1 <- read.dbf("Modul KP/32_ssn_202403_kp_blok41.dbf")
#kp2 <- read.dbf("Modul KP/32_ssn_202403_kp_blok42.dbf")
kp3 <- read.dbf("Modul KP/32_ssn_202403_kp_blok43.dbf")
korind1 <- read.dbf("KOR/b_34976_2025_05_14_11_05_39_ssn202403_kor_ind1.dbf")
#korind2 <- read.dbf("KOR/b_34976_2025_05_14_11_07_40_ssn202403_kor_ind2.dbf")
#kormig <- read.dbf("KOR/b_34976_2025_05_14_11_08_55_ssn202403_kor_mig.dbf")
korrt <- read.dbf("KOR/b_34976_2025_05_14_11_09_07_ssn202403_kor_rt.dbf")Variabel Respon (NEET)
variabel respon yang digunakan dalam penelitian ini adalah individu berusia 15-24 tahun.
Filter umur 15-24 dari modul KOR individu
Selanjutnya individu yang dikategorikan dalam kategori NEET adalah individu yang tidak bekerja dan tidak sekolah pada saat periode survei berlangsung. Adapun pertanyaan yang digunakan sebagai representasi seseorang masuk ke dalam kategori NEET adalah pertanyaan R703 dan R610.
R610 : Apakah Bersekolah (Termasuk Mengikuti Program Paket A/B/C)?
1 Tidak/belum pernah bersekolah
2 Masih bersekolah
3 Tidak bersekolah lagi
Pertanyaan utama untuk menyusun NEET “Selama minggu lalu, kegiatan apa saja yang telah dilakukan?” (sumber : Indera Ratna Irawati Pattinasarany, 2019)
R703 : Selama Seminggu Terakhir, Apa Saja Kegiatan yang Dilakukan (nama)?
A.BEKERJA
B.SEKOLAH
C.MENGURUS RUMAH TANGGA
D.LAINNYA SELAIN KEGIATAN PRIBADI
X.Tidak melakukan kegiatan
Responden dapat memilih lebih dari satu pilihan jawaban.
Bekerja didefinisikan sebagai kegiatan melakukan pekerjaan dengan tujuan memperoleh atau membantu menghasilkan pendapatan atau keuntungan selama minimal satu jam dalam minggu lalu.
Bersekolah merujuk pada menghadiri sekolah formal dan non-formal (misalnya pendidikan kesetaraan) pada pendidikan dasar, menengah, dan tinggi.
Mengurus rumah tangga adalah kegiatan untuk merawat rumah tangga (seperti memasak, mencuci, dan membersihkan rumah) tanpa dibayar/mendapat gaji.
Melakukan kegiatan selain kegiatan pribadi merujuk pada melakukan aktivitas seperti olahraga, mengikuti kursus, piknik, kegiatan sosial (misalnya organisasi lokal dan pelayanan masyarakat), dan kegiatan ibadah (misalnya majelis ta’lim/ pengajian).
Tidak melakukan kegiatan jika responden selama minggu lalu tidak bekerja, bersekolah, mengurus rumah tangga, dan melakukan kegiatan selain kegiatan pribadi. Untuk lebih jelasnya lihat BPS (2015)
library(dplyr)
library(tidyr)
df_703 <- df %>%
mutate(
A = if_else(R703_A == "A", 1, 0),
B = if_else(R703_B == "B", 1, 0),
C = if_else(R703_C == "C", 1, 0),
D = if_else(R703_D == "D", 1, 0),
X = if_else(R703_X == "X", 1, 0)
)
colSums(df_703[, c("A", "B", "C", "D", "X")], na.rm = TRUE)## A B C D X
## 4025 5136 5941 6416 218
library(tidyverse)
# Ambil 200 baris acak agar bisa diplot
set.seed(1)
df_sub <- df %>%
sample_n(50) %>%
mutate(id = row_number())
# Buat data untuk heatmap
df_plot <- df_sub %>%
select(id, R703_A, R703_B, R703_C, R703_D, R703_X) %>%
pivot_longer(cols = starts_with("R703"),
names_to = "kategori",
values_to = "jawaban") %>%
mutate(
answered = ifelse(is.na(jawaban) | jawaban == "", 0, 1)
)
# Plot heatmap
ggplot(df_plot, aes(x = kategori, y = id, fill = factor(answered))) +
geom_tile(color = "grey80") +
scale_fill_manual(
values = c("1" = "steelblue", "0" = "white"),
labels = c("Tidak Menjawab", "Menjawab"),
name = "Status"
) +
scale_y_reverse() +
labs(
title = "Heatmap Jawaban A–B–C–D–X (200 responden acak)",
x = "Kategori Jawaban",
y = "Responden"
) +
theme_minimal() +
theme(
axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
panel.grid = element_blank()
)library(dplyr)
library(stringr)
df_comb <- df %>%
mutate(
combo = paste0(
ifelse(!is.na(R703_A) & R703_A != "", "A", ""),
ifelse(!is.na(R703_B) & R703_B != "", "B", ""),
ifelse(!is.na(R703_C) & R703_C != "", "C", ""),
ifelse(!is.na(R703_D) & R703_D != "", "D", ""),
ifelse(!is.na(R703_X) & R703_X != "", "X", "")
),
combo = ifelse(combo == "", "NONE", combo) # jika tidak jawab apa pun
) %>%
count(combo, sort = TRUE)df <- df %>%
mutate(
NEET = case_when(
R610 %in% c(1, 3) &
(R703_C %in% c("C") | R703_D %in% c("D") | R703_X %in% c("X")) &
(is.na(R703_A) | R703_A == "") & # tidak menjawab A
(is.na(R703_B) | R703_B == "") ~ 1, # tidak menjawab B
TRUE ~ 0
)
)kode ini identik , karena ketika dia tidak menjawab A atau B pasti disuruh memilih C D X , makanya proporsinya sama
df <- df %>%
mutate(
NEETt = case_when(
R610 %in% c(1, 3) &
(is.na(R703_A) | R703_A == "") & # tidak menjawab A
(is.na(R703_B) | R703_B == "")~ 1, # tidak menjawab B
TRUE ~ 0
)
)NEET 1 = Ya, 0 = Tidak
## NEET n prop
## 1 0 9237 0.7547802
## 2 1 3001 0.2452198
Jika dilihat proporsi NEET tidak seimbang sehingga akan di lakukan penanganan.
library(ggplot2)
library(dplyr)
df %>%
count(NEET) %>%
mutate(prop = n / sum(n),
label = paste0(n, " (", round(prop * 100, 1), "%)")) %>%
ggplot(aes(x = "", y = prop,
fill = factor(NEET,
levels = c(0, 1), # pastikan NEET dulu (jelek)
labels = c("Non-NEET", "NEET")))) +
geom_col(width = 1, color = "black") +
coord_polar(theta = "y") +
geom_text(aes(label = label),
position = position_stack(vjust = 0.5),
color = "black", size = 4.5) + # angka lebih kecil
scale_fill_manual(values = c( "#63B8FF", "#FF3030")) + # NEET merah dulu
labs(
title = "Proporsi NEET (Usia 15–24 Tahun)",
fill = "Status"
) +
theme_void() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
legend.title = element_text(face = "bold")
)Variabel Prediktor
KOR Individu
R105 kota /desa
R404 Status perkawinan
R405 Jenis kelamin
R407 Umur
R607 Apakah dapat membaca dan menulis huruf latin/alfabet
R612 Apa jenjang pendidikan tertinggi yang Sedang/pernah diikuti
R615 Apakah memiliki KIP
R616 Apakah memperoleh PIP
R701 Apakah memiliki rekening tabungan
R702 Apakah menggunakan produk/layanan jasa keuangan
R802 Apakah memiliki/menguasai telepon seluler
R808 Apakah pernah menggunakan internet
R905 Apakah pernah menjadi korban kejahatan
R1010 Apakah menerima bansos atensi (penyandang disabilitas)
R1102 Apakah mempunyai keluhan kesehatan
df <- df %>%
rename(
kota_desa = R105,
status_kawin = R404,
jenis_kelamin = R405,
baca_tulis = R607,
pendidikan = R612,
kip = R615,
pip = R616,
rekening = R701,
jasa_keuangan = R702,
hp = R802,
internet = R808,
korban_kejahatan = R905,
disabilitas = R1010,
sakit = R1102,
umur = R407,
status_keluarga = R403
)Pendidikan
grouping jadi 5 kategori
df <- df %>%
mutate(
pendidikan = case_when(
pendidikan == 0 ~ 0, # Tidak/belum sekolah
pendidikan %in% 1:5 ~ 1, # SD atau sederajat
pendidikan %in% 6:10 ~ 2, # SMP atau sederajat
pendidikan %in% 11:17 ~ 3, # SMA/SMK atau sederajat
pendidikan %in% 18:24 ~ 4, # Perguruan tinggi
TRUE ~ NA_real_
),
pendidikan = as.factor(pendidikan)
)pernah memiliki KIP/PIP
KIP PIP digabung saja sebagai condition salah satunya
df <- df %>%
mutate(
punya_kip_pip = case_when(
kip %in% c(1, 2) | pip == 1 ~ 1, # pernah menerima KIP/PIP
TRUE ~ 5 # tidak menerima
),
punya_kip_pip = factor(punya_kip_pip)
)Kepemilikan Jaminan Kesehatan
R1101_A Memiliki BPJS PBI
R1101_B Memiliki BPJS non-PBI
R1101_C Memiliki jamkesda
R1101_D Memiliki asuransi swasta
R1101_E Memiliki jamkes perusahaan/kantor
R1101_X Tidak memiliki jamkes
recode 1 = ya , setidaknya memiliki salah satu jaminan kesehatan
df <- df %>%
mutate(
punya_jamkes = case_when(
R1101_X == "X" ~ 5, # tidak memiliki jaminan kesehatan
R1101_A == "A" | R1101_B == "B" | R1101_C == "C" |
R1101_D == "D" | R1101_E == "E" ~ 1, # memiliki salah satu jaminan
TRUE ~ NA_real_
),
punya_jamkes= as.factor(punya_jamkes)
)Merokok
R1206 Apakah merokok elektrik
R1207 Apakah merokok tembakau
recode salah satu jawab Ya
df <- df %>%
mutate(
merokok = case_when(
R1206 == 5 & R1207 == 5 ~ 5, # tidak merokok
TRUE ~ 1 # merokok
),
merokok = as.factor(merokok)
)R403 Status di Keluarga 1 Kepala rumah tangga 2 Istri/suami 3 Anak kandung/tiri 4 Anak angkat 5 Menantu 6 Cucu 7 Orang tua/mertua 8 Pembantu/sopir 9 Lainnya
df <- df %>%
mutate(
# Membuat variabel kategori baru
status_keluarga = case_when(
status_keluarga == 1 ~ 0, #KRT
status_keluarga == 2 ~ 1, #Pasangan,
status_keluarga %in% c(3, 4,5,6) ~ 2, #Anak # Kandung, Angkat, Menantu , Cucu
TRUE ~ 3 #"Lainnya" # Sisa kode 7,8,9
)
)##
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
##
## discard
## The following object is masked from 'package:readr':
##
## col_factor
# --- 1. Label variabel (judul facet) ---
label_variabel <- c(
jenis_kelamin = "Jenis Kelamin",
status_kawin = "Status Perkawinan",
pendidikan = "Pendidikan Terakhir",
disabilitas = "Status Disabilitas",
baca_tulis = "Kemampuan Baca Tulis",
punya_kip_pip = "Memiliki KIP/PIP",
rekening = "Kepemilikan Rekening Tabungan",
jasa_keuangan = "Pengguna Layanan Jasa Keuangan",
hp = "Kepemilikan HP",
internet = "Kemampuan Akses Internet",
sakit = "Keluhan Kesehatan",
punya_jamkes = "Kepemilikan Jaminan Kesehatan",
merokok = "Status Merokok",
korban_kejahatan = "Pernah Menjadi Korban Kejahatan",
status_keluarga = "Status di Keluarga"
)
# --- 2. Recode kategori & atur urutan (case corrected) ---
data_labelled <- df %>%
mutate(
jenis_kelamin = factor(recode(jenis_kelamin,
"1" = "Laki-laki", "2" = "Perempuan"),
levels = c("Laki-laki", "Perempuan")),
status_kawin = factor(recode(status_kawin,
"1" = "Belum Kawin", "2" = "Kawin",
"3" = "Cerai"),
levels = c("Belum Kawin", "Kawin", "Cerai")),
pendidikan = factor(recode(pendidikan,
"0" = "Tidak Sekolah", "1" = "SD", "2" = "SMP",
"3" = "SMA", "4" = "PT"),
levels = c("Tidak Sekolah", "SD", "SMP", "SMA", "PT")),
disabilitas = factor(recode(disabilitas,
"1" = "Ya", "5" = "Tidak"),
levels = c("Ya", "Tidak")),
baca_tulis = factor(recode(baca_tulis,
"1" = "Ya", "5" = "Tidak"),
levels = c("Ya", "Tidak")),
punya_kip_pip = factor(recode(punya_kip_pip,
"1" = "Ya", "5" = "Tidak"),
levels = c("Ya", "Tidak")),
rekening = factor(recode(rekening,
"1" = "Ya", "5" = "Tidak"),
levels = c("Ya", "Tidak")),
jasa_keuangan = factor(recode(jasa_keuangan,
"1" = "Ya", "5" = "Tidak"),
levels = c("Ya", "Tidak")),
hp = factor(recode(hp,
"1" = "Ya", "5" = "Tidak"),
levels = c("Ya", "Tidak")),
internet = factor(recode(internet,
"1" = "Ya", "5" = "Tidak"),
levels = c("Ya", "Tidak")),
sakit = factor(recode(sakit,
"1" = "Ya", "5" = "Tidak"),
levels = c("Ya", "Tidak")),
punya_jamkes = factor(recode(punya_jamkes,
"1" = "Ya", "5" = "Tidak"),
levels = c("Ya", "Tidak")),
merokok = factor(recode(merokok,
"1" = "Ya", "5" = "Tidak"),
levels = c("Ya", "Tidak")),
korban_kejahatan = factor(recode(korban_kejahatan,
"1" = "Ya", "5" = "Tidak"),
levels = c("Ya", "Tidak")),
status_keluarga = factor(recode(status_keluarga,
"0" = "KRT", "1" = "Pasangan",
"2" ="Anak", "3" ="Lainnya"),
levels = c("KRT", "Pasangan", "Anak", "Lainnya"))
)
# --- 3. Long format + ganti nama variabel jadi label informatif ---
data_long <- data_labelled %>%
select(NEET, all_of(names(label_variabel))) %>%
pivot_longer(
cols = all_of(names(label_variabel)),
names_to = "Variabel",
values_to = "Kategori"
) %>%
mutate(
Variabel = factor(Variabel, levels = names(label_variabel), labels = label_variabel)
)library(dplyr)
library(ggplot2)
library(scales)
# Hitung frekuensi dan proporsi
data_plot <- data_long %>%
group_by(Variabel, Kategori, NEET) %>%
summarise(n = n(), .groups = "drop_last") %>%
mutate(prop = n / sum(n),
label = paste0(n, "\n(", round(prop * 100, 1), "%)")) # label dua baris
# Plot
ggplot(data_plot, aes(x = Kategori, y = prop, fill = as.factor(NEET))) +
geom_bar(stat = "identity", position = "fill", color = "black") +
geom_text(aes(label = label),
position = position_fill(vjust = 0.5),
color = "black", size = 3, lineheight = 0.75) + # lineheight bisa disesuaikan
facet_wrap(~ Variabel, scales = "free_x", ncol = 5) +
scale_y_continuous(labels = percent_format()) +
scale_fill_manual(
values = c("#63B8FF", "#FF3030"),
labels = c("Non-NEET", "NEET"),
name = "Status"
) +
labs(
title = "Proporsi Status NEET Berdasarkan Karakteristik Individu",
x = "Kategori",
y = "Proporsi"
) +
theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 0, hjust = 0.5),
strip.text = element_text(face = "bold", size = 10),
plot.title = element_text(face = "bold", size = 12, hjust = 0.5),
legend.position = "bottom"
)prediktor_vars <- c(
"kota_desa",
"status_kawin",
"jenis_kelamin",
"baca_tulis",
"pendidikan",
"punya_kip_pip",
"rekening",
"jasa_keuangan",
"hp",
"internet",
"korban_kejahatan",
"disabilitas",
"sakit",
"punya_jamkes",
"merokok",
"umur",
"status_keluarga"
)data_model <- df %>%
select(NEET, URUT, all_of(prediktor_vars)) %>%
mutate(across(setdiff(prediktor_vars, "umur"), as.factor))## NEET URUT kota_desa status_kawin jenis_kelamin
## Min. :0.0000 Min. : 43 1:8867 1:11248 1:6513
## 1st Qu.:0.0000 1st Qu.:186566 2:3371 2: 930 2:5725
## Median :0.0000 Median :280197 3: 60
## Mean :0.2452 Mean :239943
## 3rd Qu.:0.0000 3rd Qu.:312120
## Max. :1.0000 Max. :332804
## baca_tulis pendidikan punya_kip_pip rekening jasa_keuangan hp internet
## 1:12230 0: 32 1: 1331 1:5196 1:5439 1:11694 1:11939
## 5: 8 1: 577 5:10907 5:7042 5:6799 5: 544 5: 299
## 2:3243
## 3:6536
## 4:1850
##
## korban_kejahatan disabilitas sakit punya_jamkes merokok umur
## 1: 77 1: 8 1:2322 1:9235 1:2860 Min. :15.00
## 5:12161 5:12230 5:9916 5:3003 5:9378 1st Qu.:17.00
## Median :19.00
## Mean :19.19
## 3rd Qu.:22.00
## Max. :24.00
## status_keluarga
## 0: 203
## 1: 458
## 2:11344
## 3: 233
##
##
ubah kode 1=ya 5=tidak, jadi 1=ya 2=tidak
cols <- c("baca_tulis","punya_kip_pip","rekening","jasa_keuangan", "hp","internet",
"korban_kejahatan","disabilitas","sakit","punya_jamkes","merokok")
data_model[cols] <- lapply(data_model[cols], function(x) {
x_num <- as.numeric(as.character(x)) # Ubah factor → numeric asli
x_num[x_num == 5] <- 2 # Recode: 5 → 2
factor(x_num) # Kembalikan ke factor
})ggplot(data_model, aes(x = as.factor(NEET), y = umur, fill = as.factor(NEET))) +
geom_boxplot(alpha = 0.7) +
scale_fill_manual(
values = c("#63B8FF", "#FF3030"),
labels = c("Non-NEET", "NEET"),
name = "Status"
) +
labs(
title = "Distribusi Umur Pemuda Berdasarkan Status NEET",
x = "Status NEET",
y = "Umur Pemuda"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 14, hjust = 0.5),
legend.position = "none"
)KOR Individu (KRT)
krt <- korind1 %>%
filter(R403 == 1) %>%
select(URUT, R405, R407, R612, R707) %>%
rename(
jk_krt = R405,
umur_krt = R407,
pendidikan_krt = R612,
status_kerja_krt = R707
) %>%
mutate(
jk_krt = as.factor(jk_krt),
status_kerja_krt = as.factor(status_kerja_krt)
)pendidikan krt
krt <- krt %>%
mutate(
pendidikan_krt = case_when(
pendidikan_krt == 0 ~ 0, # Tidak/belum sekolah
pendidikan_krt %in% 1:5 ~ 1, # SD atau sederajat
pendidikan_krt %in% 6:10 ~ 2, # SMP atau sederajat
pendidikan_krt %in% 11:17 ~ 3, # SMA/SMK atau sederajat
pendidikan_krt %in% 18:24 ~ 4, # Perguruan tinggi
TRUE ~ NA_real_
),
pendidikan_krt = as.factor(pendidikan_krt)
)status kerja krt
0 = tidak bekerja
1 = Berusaha sendiri
2 = Berusaha dibantu buruh tdk tetap/tdk dibayar
3 = Berusaha dibantu buruh tetap/buruh dibayar
4 = Buruh/karyawan/pegawai
5 = Pekerja bebas
6 = Pekerja keluarga atau tidak dibayar
recode –> Tidak bekerja, Usaha sendiri, Pegawai, Pekerja bebas
krt <- krt %>%
mutate(
status_kerja_krt = as.numeric(as.character(status_kerja_krt)),
status_kerja_krt = case_when(
status_kerja_krt == 1 ~ 1, # Usaha sendiri
status_kerja_krt == 2 ~ 1, # Usaha sendiri dibantu buruh tidak dibayar
status_kerja_krt == 3 ~ 1, # Usaha sendiri dibantu buruh dibayar
status_kerja_krt == 4 ~ 2, # Pegawai
status_kerja_krt == 5 ~ 3, # Pekerja bebas
status_kerja_krt == 6 ~ 0, # Tidak bekerja
status_kerja_krt == 0 ~ 0, # Ubah NA jadi 0
TRUE ~ NA_real_
)
)prediktor_vars <- c(
# individu
"status_kawin", "jenis_kelamin", "baca_tulis", "pendidikan", "punya_kip_pip",
"rekening", "jasa_keuangan", "hp", "internet", "korban_kejahatan",
"disabilitas", "punya_jamkes", "merokok", "sakit", "kota_desa",
# konteks rumah tangga (dari KRT)
"jk_krt", "pendidikan_krt", "status_kerja_krt"
)# --- 1. Label variabel (judul facet) ---
label_variabel_krt <- c(
jk_krt = "Jenis Kelamin KRT",
pendidikan_krt = "Pendidikan KRT",
status_kerja_krt = "Status Kerja KRT"
)
# --- 2. Recode kategori & atur urutan (case corrected) ---
data_labelled_krt <- data_model %>%
mutate(
jk_krt = factor(recode(jk_krt,
"1" = "Laki-laki", "2" = "Perempuan"),
levels = c("Laki-laki", "Perempuan")),
pendidikan_krt = factor(recode(pendidikan_krt,
"0" = "Tidak Sekolah", "1" = "SD", "2" = "SMP",
"3" = "SMA", "4" = "PT"),
levels = c("Tidak Sekolah", "SD", "SMP", "SMA", "PT")),
status_kerja_krt = factor(recode(status_kerja_krt,
"0" = "Tidak bekerja", "1" = "Usaha sendiri", "2" = "Pegawai", "3" = "Pekerja bebas"),
levels = c("Tidak bekerja", "Usaha sendiri", "Pegawai", "Pekerja bebas"))
)
# --- 3. Long format + ganti nama variabel jadi label informatif ---
data_long_krt <- data_labelled_krt %>%
select(NEET, all_of(names(label_variabel_krt))) %>%
pivot_longer(
cols = all_of(names(label_variabel_krt)),
names_to = "Variabel",
values_to = "Kategori"
) %>%
mutate(
Variabel = factor(Variabel, levels = names(label_variabel_krt), labels = label_variabel_krt)
)# Hitung frekuensi dan proporsi
data_plot <- data_long_krt %>%
group_by(Variabel, Kategori, NEET) %>%
summarise(n = n(), .groups = "drop_last") %>%
mutate(prop = n / sum(n),
label = paste0(n, "\n(", round(prop * 100, 1), "%)")) # label dua baris
# Plot
ggplot(data_plot, aes(x = Kategori, y = prop, fill = as.factor(NEET))) +
geom_bar(stat = "identity", position = "fill", color = "black") +
geom_text(aes(label = label),
position = position_fill(vjust = 0.5),
color = "black", size = 3.5, lineheight = 0.9) + # lineheight bisa disesuaikan
facet_wrap(~ Variabel, scales = "free_x", ncol = 5) +
scale_y_continuous(labels = percent_format()) +
scale_fill_manual(
values = c("#63B8FF", "#FF3030"),
labels = c("Non-NEET", "NEET"),
name = "Status"
) +
labs(
title = "Proporsi Status NEET Berdasarkan Karakteristik Kepala Rumah Tangga",
x = "Kategori",
y = "Proporsi"
) +
theme_minimal(base_size = 16) +
theme(
axis.text.x = element_text(angle = 0, hjust = 0.5),
strip.text = element_text(face = "bold", size = 12),
plot.title = element_text(face = "bold", size = 16, hjust = 0.5),
legend.position = "bottom"
)data_model <- data_model %>%
mutate(
NEET = case_when(
NEET == 0 ~ "Tidak",
NEET == 1 ~ "Ya",
TRUE ~ NA_character_
),
NEET = factor(NEET, levels = c("Tidak", "Ya"))
)ggplot(data_model, aes(x = as.factor(NEET), y = umur_krt, fill = as.factor(NEET))) +
geom_boxplot(alpha = 0.7) +
scale_fill_manual(
values = c("#63B8FF", "#FF3030"),
labels = c("Non-NEET", "NEET"),
name = "Status"
) +
labs(
title = "Distribusi Umur Kepala Rumah Tangga Berdasarkan Status NEET",
x = "Status NEET",
y = "Umur Kepala Rumah Tangga"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 14, hjust = 0.5),
legend.position = "none" # kalau mau tanpa legenda
)KP 3
Pengeluaran Per Kapita
library(ggplot2)
library(scales)
ggplot(data_model, aes(x = as.factor(NEET), y = KAPITA, fill = as.factor(NEET))) +
geom_boxplot(alpha = 0.7) +
stat_summary(
fun = median,
geom = "text",
aes(label = round(..y.. / 1e6, 2)), # tampilkan median dalam jutaan
vjust = -0.5,
color = "black",
size = 3,
fontface = "bold"
) +
scale_fill_manual(
values = c("#63B8FF", "#FF3030"),
labels = c("Non-NEET", "NEET"),
name = "Status"
) +
scale_y_log10(
labels = label_number(scale = 1e-6, suffix = " jt") # tampilkan dalam jutaan
) +
labs(
title = "Distribusi Pengeluaran Kapita Berdasarkan Status NEET",
x = "Status NEET",
y = "Pengeluaran per Kapita (Skala Log)"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 14, hjust = 0.5),
legend.position = "none"
)## Warning: The dot-dot notation (`..y..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(y)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
KOR RUTA
## URUT PSU SSU STRATA WI1 WI2 R101 R102 R105 NUINFORT R1701 R1702 R1703
## 1 54955 8697 63652 32022 5495 54955 32 2 2 2 5 5 5
## 2 54973 8697 63670 32022 5495 54973 32 2 2 1 1 5 5
## 3 55003 8732 63735 32021 5530 55003 32 2 1 1 5 5 5
## 4 55061 8732 63793 32021 5530 55061 32 2 1 1 5 5 5
## 5 55069 8732 63801 32021 5530 55069 32 2 1 1 5 5 5
## 6 55120 8732 63852 32021 5530 55120 32 2 1 1 5 5 5
## R1704 R1705 R1706 R1707 R1708 NUINFORT1 R1801 R1802 R1803 R1804 R1805 R1806A
## 1 5 5 5 5 5 2 1 1 5 100 5 2
## 2 5 5 5 5 5 1 1 1 5 99 5 2
## 3 5 5 5 5 5 1 1 1 6 40 5 2
## 4 5 5 5 5 5 1 1 2 0 60 5 2
## 5 5 5 5 5 5 1 1 1 1 100 5 2
## 6 5 5 5 5 5 1 1 3 0 80 5 2
## R1806B R1807 R1808 R1809A R1809B R1809C R1809D R1809E R1810A R1810B R1810C
## 1 0 1 2 1 1 4 0 0 2 0 0
## 2 0 1 2 4 0 0 0 0 2 0 0
## 3 0 1 2 1 1 4 0 0 3 1 0
## 4 0 1 2 1 1 4 0 0 3 1 0
## 5 0 1 2 1 1 4 0 0 3 1 0
## 6 0 1 2 1 1 4 0 0 3 1 0
## R1811A R1811B R1812 R1813A R1813B R1813C R1813D R1813E R1814A R1814B R1814C
## 1 2 3 5 5 5 5 5 5 5 0 8
## 2 2 5 5 5 5 5 5 5 8 0 8
## 3 2 998 5 5 5 5 5 5 3 1 0
## 4 2 998 5 5 5 5 5 5 3 1 0
## 5 2 998 5 5 5 5 5 5 3 1 0
## 6 2 998 5 5 5 5 5 5 3 1 0
## R1815A R1815B R1815C R1816 R1816B1 R1816B2 R1816B3 R1817 R1901A R1901B R1901C
## 1 1 1 1 1 1 0 0 4 5 5 5
## 2 2 1 1 1 1 0 0 4 5 5 5
## 3 3 0 0 1 1 0 0 4 5 5 5
## 4 1 1 1 1 1 0 0 4 5 5 5
## 5 1 1 1 1 1 0 0 4 5 5 5
## 6 1 1 1 1 1 0 0 4 5 5 5
## R1901D R1901E R1901F R1901G R1901H R1901I R1901J R1901K R2001A R2001B R2001C
## 1 5 5 5 5 5 5 5 5 5 1 5
## 2 5 5 5 5 5 5 5 5 5 5 5
## 3 5 5 5 5 5 5 5 5 5 1 5
## 4 5 5 5 5 5 5 5 5 5 1 5
## 5 5 5 5 5 5 5 5 5 5 1 5
## 6 5 5 5 5 5 5 5 5 5 1 5
## R2001D R2001E R2001F R2001G R2001H R2001I R2001J R2001K R2001L R2001M R2002_A
## 1 5 5 5 5 1 5 5 5 5 5 <NA>
## 2 5 5 5 5 5 5 5 5 5 5 <NA>
## 3 5 5 5 5 5 5 5 5 5 5 <NA>
## 4 5 5 1 1 1 5 5 5 5 5 <NA>
## 5 5 5 5 5 5 5 5 5 5 1 A
## 6 5 5 5 5 1 5 5 5 5 5 <NA>
## R2002_B R2002_C R2002_D R2101A R2101B R2101C R2201A2 R2201A3 R2201B2 R2201B3
## 1 <NA> <NA> <NA> 1 1 0 5 0 5 0
## 2 <NA> <NA> <NA> 1 1 0 5 0 5 0
## 3 <NA> <NA> <NA> 1 1 0 5 0 5 0
## 4 <NA> <NA> <NA> 1 1 0 5 0 5 0
## 5 <NA> <NA> <NA> 1 1 0 5 0 5 0
## 6 <NA> <NA> <NA> 1 1 0 5 0 5 0
## R2201C2 R2201C3 R2201D2 R2201D3 R2201E2 R2201E3 R2201F2 R2201F3 R2202 R2203
## 1 5 0 5 0 5 0 5 0 5 5
## 2 5 0 5 0 5 0 5 0 5 1
## 3 5 0 5 0 5 0 5 0 5 5
## 4 5 0 5 0 5 0 5 0 5 5
## 5 5 0 5 0 5 0 5 0 5 5
## 6 5 0 5 0 5 0 5 0 5 5
## R2204A R2204B R2204C_A R2204C_B R2204C_C R2204C_D R2204C_E R2204C_F R2204C_G
## 1 0 0 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 2 1 4 A <NA> <NA> <NA> E <NA> <NA>
## 3 0 0 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 4 0 0 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 5 0 0 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 6 0 0 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## R2204LAIN R2205A R2207 R2208A2 R2208B2 R2208BI2 R2208C2 R2208D2 R2208E2_A
## 1 <NA> 5 5 0 0 0 0 0 <NA>
## 2 <NA> 5 5 0 0 0 0 0 <NA>
## 3 <NA> 5 5 0 0 0 0 0 <NA>
## 4 <NA> 5 5 0 0 0 0 0 <NA>
## 5 <NA> 5 5 0 0 0 0 0 <NA>
## 6 <NA> 5 5 0 0 0 0 0 <NA>
## R2208E2_B R2208E2_C R2208E2_D R2208E2_E R2208E2_F R2208E2_G R2208E2LAI
## 1 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 2 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 3 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 4 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 5 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 6 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## R2208A3 R2208B3 R2208BI3 R2208C3 R2208D3 R2208E3_A R2208E3_B R2208E3_C
## 1 0 0 0 0 0 <NA> <NA> <NA>
## 2 0 0 0 0 0 <NA> <NA> <NA>
## 3 0 0 0 0 0 <NA> <NA> <NA>
## 4 0 0 0 0 0 <NA> <NA> <NA>
## 5 0 0 0 0 0 <NA> <NA> <NA>
## 6 0 0 0 0 0 <NA> <NA> <NA>
## R2208E3_D R2208E3_E R2208E3_F R2208E3_G R2208E3LAI R2208A4 R2208B4 R2208BI4
## 1 <NA> <NA> <NA> <NA> <NA> 0 0 0
## 2 <NA> <NA> <NA> <NA> <NA> 0 0 0
## 3 <NA> <NA> <NA> <NA> <NA> 0 0 0
## 4 <NA> <NA> <NA> <NA> <NA> 0 0 0
## 5 <NA> <NA> <NA> <NA> <NA> 0 0 0
## 6 <NA> <NA> <NA> <NA> <NA> 0 0 0
## R2208C4 R2208D4 R2208E4_A R2208E4_B R2208E4_C R2208E4_D R2208E4_E R2208E4_F
## 1 0 0 <NA> <NA> <NA> <NA> <NA> <NA>
## 2 0 0 <NA> <NA> <NA> <NA> <NA> <NA>
## 3 0 0 <NA> <NA> <NA> <NA> <NA> <NA>
## 4 0 0 <NA> <NA> <NA> <NA> <NA> <NA>
## 5 0 0 <NA> <NA> <NA> <NA> <NA> <NA>
## 6 0 0 <NA> <NA> <NA> <NA> <NA> <NA>
## R2208E4_G R2208E4LAI R2208A5 R2208B5 R2208BI5 R2208C5 R2208D5 R2208E5_A
## 1 <NA> <NA> 0 0 0 0 0 <NA>
## 2 <NA> <NA> 0 0 0 0 0 <NA>
## 3 <NA> <NA> 0 0 0 0 0 <NA>
## 4 <NA> <NA> 0 0 0 0 0 <NA>
## 5 <NA> <NA> 0 0 0 0 0 <NA>
## 6 <NA> <NA> 0 0 0 0 0 <NA>
## R2208E5_B R2208E5_C R2208E5_D R2208E5_E R2208E5_F R2208E5_G R2208E5LAI R2209A
## 1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> 5
## 2 <NA> <NA> <NA> <NA> <NA> <NA> <NA> 5
## 3 <NA> <NA> <NA> <NA> <NA> <NA> <NA> 5
## 4 <NA> <NA> <NA> <NA> <NA> <NA> <NA> 5
## 5 <NA> <NA> <NA> <NA> <NA> <NA> <NA> 5
## 6 <NA> <NA> <NA> <NA> <NA> <NA> <NA> 5
## R2209B R2209C R2209D R2210AA R2210B1 R2210B2 R2210B3 R2210B4 R2210B5 R2211A
## 1 5 1 5 5 5 5 5 5 5 5
## 2 5 5 5 5 5 5 5 5 5 5
## 3 5 5 5 5 5 5 5 5 5 5
## 4 5 5 5 5 5 5 5 5 5 5
## 5 5 5 5 5 5 5 5 5 5 5
## 6 5 5 5 5 5 5 5 5 5 5
## R2211A1 R2211A2 R2211A3 R2211A4 R2211A5 R2211B R2211B1 R301 R302 R303 R304
## 1 0 0 0 0 0 5 0 2 0 2 2
## 2 0 0 0 0 0 5 0 2 0 2 2
## 3 0 0 0 0 0 5 0 3 0 3 2
## 4 0 0 0 0 0 5 0 6 1 5 4
## 5 0 0 0 0 0 5 0 1 0 1 1
## 6 0 0 0 0 0 5 0 5 1 4 4
## R305 FWT
## 1 1 157.89106
## 2 1 32.43303
## 3 1 41.62916
## 4 1 598.02331
## 5 0 41.62916
## 6 1 379.03209
df_RT <- df_RT %>%
rename(
kab_kot = R102,
jum_klrg = R1801,
kep_rumah = R1802,
luas_rumah = R1804,
menerima_PKH = R2204A,
PKH_sekolah = R2204C_E,
PKH_hutang = R2204C_F,
jum_art = R301,
bobot_RT = FWT
)df_RT <- df_RT %>%
mutate(aset = if_else(
rowSums(select(., R2001G,R2001H,R2001I,R2001J,R2001K,R2001M) == 1, na.rm = TRUE) > 0, 1, 2 ))df_RT <- df_RT %>%
mutate(kredit = if_else(
rowSums(select(., R1901A:R1901K) == 1, na.rm = TRUE) > 0, 1, 2 ))df_RT <- df_RT %>%
mutate(
jumlah_rawan = rowSums(select(., R1701:R1708) == 1, na.rm = TRUE),
rawan_pangan = case_when(
jumlah_rawan == 0 ~ 0, # Tidak rawan
jumlah_rawan >= 1 & jumlah_rawan <= 3 ~ 1, # Ringan
jumlah_rawan >= 4 & jumlah_rawan <= 6 ~ 2, # Sedang
jumlah_rawan >= 7 ~ 3 # Berat
)
)df_RT <- df_RT %>%
mutate(PKH_sekolah = case_when(
menerima_PKH == 0 & (is.na(PKH_sekolah) | PKH_sekolah == "") ~ 0,
menerima_PKH == 1 & PKH_sekolah == "E" ~ 1,
TRUE ~ 2
))df_RT <- df_RT %>%
mutate(PKH_hutang = case_when(
menerima_PKH == 0 & (is.na(PKH_hutang) | PKH_hutang == "") ~ 0,
menerima_PKH == 1 & PKH_hutang == "F" ~ 1,
TRUE ~ 2
))Status kepemilikan rumah
1 Milik sendiri
2 Kontrak/sewa
3 Bebas sewa
4 Dinas
5 Lainnya
Buat jadi Milik Sendiri, dan Bukan Milik Sendiri
df_RT <- df_RT %>%
select(
URUT, kab_kot, rawan_pangan, jum_klrg, kep_rumah, luas_rumah,
kredit, aset, menerima_PKH, PKH_sekolah, PKH_hutang,
jum_art, bobot_RT
)plot jumlah art
ggplot(data_model, aes(x = as.factor(NEET), y = jum_art, fill = as.factor(NEET))) +
geom_boxplot(alpha = 0.7) +
scale_fill_manual(
values = c("#63B8FF", "#FF3030"),
labels = c("Non-NEET", "NEET"),
name = "Status"
) +
labs(
title = "Distribusi Jumlah Anggota Rumah Tangga Berdasarkan Status NEET",
x = "Status NEET",
y = "Jumlah anggota rumah tangga"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 14, hjust = 0.5),
legend.position = "none"
)plot luas bangunan
ggplot(data_model, aes(x = as.factor(NEET), y = luas_rumah, fill = as.factor(NEET))) +
geom_boxplot(alpha = 0.7) +
scale_fill_manual(
values = c("#63B8FF", "#FF3030"),
labels = c("Non-NEET", "NEET"),
name = "Status"
) +
scale_y_continuous() +
labs(
title = "Distribusi Luas Rumah Berdasarkan Status NEET",
x = "Status NEET",
y = "Luas rumah dalam meter persegi"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 14, hjust = 0.5),
legend.position = "none" # kalau mau tanpa legenda
)plot label kategorik
# --- 1. Label variabel (judul facet) ---
label_variabel_rt <- c(
kota_desa = "Klasifikasi Wilayah",
aset = "Kepemilikan Aset",
jum_klrg = "Jumlah Kepala Keluarga",
kep_rumah = "Status Kepemilikan Tempat Tinggal",
kredit = "Kepemilikan Kredit",
menerima_PKH = "Status Menerima PKH",
PKH_hutang = "Bantuan PKH untuk Hutang",
PKH_sekolah = "Bantuan PKH untuk Sekolah",
rawan_pangan = "Rawan Pangan"
)
# --- 2. Recode kategori & atur urutan (case corrected) ---
data_labelled_rt <- data_model %>%
mutate(
kota_desa = factor(recode(kota_desa, "1" = "Kota", "2" = "Desa"),
levels = c("Kota", "Desa")),
aset = factor(recode(aset, "1" = "Ya", "2" = "Tidak"),
levels = c("Ya", "Tidak")),
jum_klrg = factor(recode(jum_klrg,
"0" = "0", "1" = "1", "2" = "2",
"3" = "3", "4" = "4", "5" = "5"),
levels = c("0", "1", "2", "3", "4", "5")),
kep_rumah = factor(recode(kep_rumah,
"1" = "Milik sendiri",
"2" = "Bukan milik sendiri"),
levels = c("Milik sendiri", "Bukan milik sendiri")),
kredit = factor(recode(kredit, "1" = "Ya", "2" = "Tidak"),
levels = c("Ya", "Tidak")),
menerima_PKH = factor(recode(menerima_PKH, "1" = "Ya", "2" = "Tidak"),
levels = c("Ya", "Tidak")),
PKH_hutang = factor(recode(PKH_hutang,
"0" = "Tidak Menerima",
"1" = "Ya",
"2" = "Tidak"),
levels = c("Tidak Menerima", "Ya", "Tidak")),
PKH_sekolah = factor(recode(PKH_sekolah,
"0" = "Tidak Menerima",
"1" = "Ya",
"2" = "Tidak"),
levels = c("Tidak Menerima", "Ya", "Tidak")),
rawan_pangan = factor(recode(rawan_pangan,
"0" = "Tidak",
"1" = "Ringan",
"2" = "Sedang",
"3" = "Berat"),
levels = c("Tidak", "Ringan", "Sedang", "Berat"))
)
# --- 3. Long format + ganti nama variabel jadi label informatif ---
data_long_rt <- data_labelled_rt %>%
select(NEET, all_of(names(label_variabel_rt))) %>%
pivot_longer(
cols = all_of(names(label_variabel_rt)),
names_to = "Variabel",
values_to = "Kategori"
) %>%
mutate(
Variabel = factor(Variabel, levels = names(label_variabel_rt),
labels = label_variabel_rt)
)library(dplyr)
library(ggplot2)
library(scales)
# Hitung frekuensi dan proporsi
data_plot <- data_long_rt %>%
group_by(Variabel, Kategori, NEET) %>%
summarise(n = n(), .groups = "drop_last") %>%
mutate(prop = n / sum(n),
label = paste0(n, "\n(", round(prop * 100, 1), "%)")) # label dua baris
# Plot
ggplot(data_plot, aes(x = Kategori, y = prop, fill = as.factor(NEET))) +
geom_bar(stat = "identity", position = "fill", color = "black") +
geom_text(aes(label = label),
position = position_fill(vjust = 0.5),
color = "black", size = 3, lineheight = 0.8) +
facet_wrap(~ Variabel, scales = "free_x", ncol = 3) + # 3 kolom × 3 baris
scale_y_continuous(labels = percent_format()) +
scale_fill_manual(
values = c("#63B8FF", "#FF3030"),
labels = c("Non-NEET", "NEET"),
name = "Status"
) +
labs(
title = "Proporsi Status NEET Berdasarkan Karakteristik Kepala Rumah Tangga",
x = "Kategori",
y = "Proporsi"
) +
theme_minimal(base_size = 16) +
theme(
axis.text.x = element_text(angle = 0, hjust = 0.5),
strip.text = element_text(face = "bold", size = 12),
plot.title = element_text(face = "bold", size = 16, hjust = 0.5),
legend.position = "bottom"
)## NEET URUT kota_desa status_kawin jenis_kelamin baca_tulis
## Tidak:9237 Min. : 43 1:8867 1:11248 1:6513 1:12230
## Ya :3001 1st Qu.:186566 2:3371 2: 930 2:5725 2: 8
## Median :280197 3: 60
## Mean :239943
## 3rd Qu.:312120
## Max. :332804
## pendidikan punya_kip_pip rekening jasa_keuangan hp internet
## 0: 32 1: 1331 1:5196 1:5439 1:11694 1:11939
## 1: 577 2:10907 2:7042 2:6799 2: 544 2: 299
## 2:3243
## 3:6536
## 4:1850
##
## korban_kejahatan disabilitas sakit punya_jamkes merokok umur
## 1: 77 1: 8 1:2322 1:9235 1:2860 Min. :15.00
## 2:12161 2:12230 2:9916 2:3003 2:9378 1st Qu.:17.00
## Median :19.00
## Mean :19.19
## 3rd Qu.:22.00
## Max. :24.00
## status_keluarga jk_krt umur_krt pendidikan_krt status_kerja_krt
## 0: 203 1:10725 Min. :17.00 0: 101 Min. :0.000
## 1: 458 2: 1513 1st Qu.:45.00 1:5217 1st Qu.:1.000
## 2:11344 Median :50.00 2:2239 Median :2.000
## 3: 233 Mean :49.83 3:3551 Mean :1.533
## 3rd Qu.:56.00 4:1130 3rd Qu.:2.000
## Max. :97.00 Max. :3.000
## KAPITA kab_kot rawan_pangan jum_klrg
## Min. : 260976 Min. : 1.0 Min. :0.0000 Min. :0.000
## 1st Qu.: 792524 1st Qu.: 6.0 1st Qu.:0.0000 1st Qu.:1.000
## Median : 1185696 Median :14.0 Median :0.0000 Median :1.000
## Mean : 1742473 Mean :30.6 Mean :0.2741 Mean :1.101
## 3rd Qu.: 1905797 3rd Qu.:73.0 3rd Qu.:0.0000 3rd Qu.:1.000
## Max. :41534426 Max. :79.0 Max. :3.0000 Max. :5.000
## kep_rumah luas_rumah kredit aset
## Min. :1.000 Min. : 4.00 Min. :1.000 Min. :1.000
## 1st Qu.:1.000 1st Qu.: 48.00 1st Qu.:1.000 1st Qu.:1.000
## Median :1.000 Median : 65.00 Median :2.000 Median :1.000
## Mean :1.154 Mean : 77.44 Mean :1.729 Mean :1.042
## 3rd Qu.:1.000 3rd Qu.: 96.00 3rd Qu.:2.000 3rd Qu.:1.000
## Max. :2.000 Max. :600.00 Max. :2.000 Max. :2.000
## menerima_PKH PKH_sekolah PKH_hutang jum_art
## Min. :1.000 Min. :0.0000 Min. :0.0000 Min. : 1.000
## 1st Qu.:2.000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.: 3.000
## Median :2.000 Median :0.0000 Median :0.0000 Median : 4.000
## Mean :1.832 Mean :0.2647 Mean :0.3633 Mean : 4.146
## 3rd Qu.:2.000 3rd Qu.:0.0000 3rd Qu.:0.0000 3rd Qu.: 5.000
## Max. :2.000 Max. :2.0000 Max. :2.0000 Max. :13.000
## bobot_RT
## Min. : 3.686
## 1st Qu.: 242.799
## Median : 510.181
## Mean : 684.159
## 3rd Qu.: 919.873
## Max. :4195.752
library(ggplot2)
library(dplyr)
library(tidyr)
# Recode dulu NEET dari Ya/Tidak menjadi NEET/Non-NEET
data_model <- data_model %>%
mutate(NEET = recode(NEET,
"Ya" = "NEET",
"Tidak" = "Non-NEET"))
# Ubah data ke format long agar bisa difacet (tambahkan KAPITA)
data_long <- data_model %>%
select(NEET, jum_art, luas_rumah, KAPITA, umur_krt, umur) %>%
rename(
`Jumlah Anggota Rumah Tangga` = jum_art,
`Luas Rumah` = luas_rumah,
`Pengeluaran per Kapita` = KAPITA,
`Umur Kepala Rumah Tangga` = umur_krt,
`Umur Pemuda` = umur
) %>%
pivot_longer(
cols = -NEET,
names_to = "Variabel",
values_to = "Nilai"
)
# Hitung median per variabel dan status
medians <- data_long %>%
group_by(Variabel, NEET) %>%
summarise(med = median(Nilai), .groups = "drop") %>%
mutate(label = ifelse(Variabel == "Pengeluaran per Kapita",
paste0(round(med/1e6, 2), " jt"), # tampilkan dalam jutaan
round(med, 1)))
# Plot dengan median (angka kecil) + mean (titik kuning)
ggplot(data_long, aes(x = NEET, y = Nilai, fill = NEET)) +
geom_boxplot(alpha = 0.7, width = 0.5) +
# Median ditampilkan sebagai angka kecil
geom_text(data = medians, aes(x = NEET, y = med, label = label),
vjust = -0.5, color = "black", size = 3) +
# Mean ditampilkan sebagai titik kuning
stat_summary(fun = mean, geom = "point",
shape = 21, size = 1, fill = "black", color = "black") +
scale_fill_manual(
values = c("Non-NEET" = "#63B8FF", "NEET" = "#FF3030"),
name = "Status NEET"
) +
facet_wrap(~Variabel, scales = "free_y", ncol = 2) +
labs(
title = "Distribusi Variabel Numerik Berdasarkan Status NEET",
x = "Status NEET",
y = "Nilai"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", size = 14, hjust = 0.5),
legend.position = "bottom",
strip.text = element_text(face = "bold")
)Download data
## Rows: 12,238
## Columns: 35
## $ NEET <fct> Non-NEET, Non-NEET, Non-NEET, Non-NEET, Non-NEET, NEE…
## $ kota_desa <fct> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ status_kawin <fct> 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1,…
## $ jenis_kelamin <fct> 1, 2, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 1,…
## $ baca_tulis <fct> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ pendidikan <fct> 4, 4, 4, 3, 3, 3, 2, 3, 2, 3, 3, 3, 4, 1, 2, 3, 3, 4,…
## $ punya_kip_pip <fct> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
## $ rekening <fct> 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,…
## $ jasa_keuangan <fct> 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,…
## $ hp <fct> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ internet <fct> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ korban_kejahatan <fct> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
## $ disabilitas <fct> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
## $ sakit <fct> 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2,…
## $ punya_jamkes <fct> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1,…
## $ merokok <fct> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 1,…
## $ umur <int> 19, 23, 21, 15, 18, 18, 15, 18, 24, 24, 21, 20, 22, 1…
## $ status_keluarga <fct> 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 1, 2, 2, 2, 2,…
## $ jk_krt <fct> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ umur_krt <int> 45, 56, 48, 48, 55, 44, 44, 63, 32, 27, 47, 58, 64, 2…
## $ pendidikan_krt <fct> 3, 4, 4, 4, 4, 4, 4, 1, 3, 3, 3, 2, 1, 2, 1, 1, 3, 3,…
## $ status_kerja_krt <dbl> 1, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 2,…
## $ KAPITA <dbl> 17438311.9, 17998916.7, 20702339.3, 20702339.3, 24312…
## $ kab_kot <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ rawan_pangan <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 0, 0,…
## $ jum_klrg <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1,…
## $ kep_rumah <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2,…
## $ luas_rumah <int> 256, 360, 240, 240, 180, 254, 254, 130, 70, 80, 110, …
## $ kredit <dbl> 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
## $ aset <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ menerima_PKH <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
## $ PKH_sekolah <dbl> 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ PKH_hutang <dbl> 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ jum_art <int> 5, 5, 4, 4, 3, 4, 4, 4, 3, 2, 3, 3, 3, 3, 8, 8, 3, 4,…
## $ bobot_RT <dbl> 145.70290, 592.30758, 224.45356, 224.45356, 92.25021,…
Modelling RF Coba-Coba
data_model <- data_model %>%
mutate(
NEET = factor(NEET, levels = c("Non-NEET", "NEET"))
) %>%
na.omit()## Loading required package: lattice
##
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
##
## lift
train_index <- createDataPartition(data_model$NEET, p = 0.8, list = FALSE)
train_data <- data_model[train_index, ]
test_data <- data_model[-train_index, ]## Warning: package 'randomForest' was built under R version 4.4.3
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
##
## Attaching package: 'randomForest'
## The following object is masked from 'package:dplyr':
##
## combine
## The following object is masked from 'package:ggplot2':
##
## margin
set.seed(123)
rf_model <- randomForest(
NEET ~ .,
data = train_data,
ntree = 500,
mtry = floor(sqrt(ncol(train_data) - 1)),
importance = TRUE
)# Prediksi
pred_rf <- predict(rf_model, test_data)
# Confusion matrix
confusionMatrix(pred_rf, test_data$NEET)## Confusion Matrix and Statistics
##
## Reference
## Prediction Non-NEET NEET
## Non-NEET 1770 404
## NEET 77 196
##
## Accuracy : 0.8034
## 95% CI : (0.7871, 0.819)
## No Information Rate : 0.7548
## P-Value [Acc > NIR] : 5.918e-09
##
## Kappa : 0.3492
##
## Mcnemar's Test P-Value : < 2.2e-16
##
## Sensitivity : 0.9583
## Specificity : 0.3267
## Pos Pred Value : 0.8142
## Neg Pred Value : 0.7179
## Prevalence : 0.7548
## Detection Rate : 0.7233
## Detection Prevalence : 0.8884
## Balanced Accuracy : 0.6425
##
## 'Positive' Class : Non-NEET
##
## [1] 0.880378
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
# Prediksi probabilitas
pred_rf_prob <- predict(rf_model, newdata = test_data, type = "prob")
roc_obj <- roc(test_data$NEET, pred_rf_prob[, "NEET"]) # probabilitas kelas 1## Setting levels: control = Non-NEET, case = NEET
## Setting direction: controls < cases
## Area under the curve: 0.7949