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

Setelah memperoleh variabel dan eksplorasi, selanjutnya dimodelkan dengan machine learning klasifikasi (Random Forest)

library(tidyverse)
## 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
library(sf)
## 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
library(foreign)
## Warning: package 'foreign' was built under R version 4.4.3
library(dplyr)

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")
#head(korind1)
#glimpse(korind1)

Variabel Respon (NEET)

variabel respon yang digunakan dalam penelitian ini adalah individu berusia 15-24 tahun.

Filter umur 15-24 dari modul KOR individu

df <- korind1 %>%
  filter(R407 >= 15 & R407 <= 24) #filter usia 15–24

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

df %>%
  count(NEET) %>%
  mutate(prop = n / sum(n))
##   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 
    )
)
library(ggplot2)
library(dplyr)
library(tidyr)
library(forcats)
library(scales)
## 
## 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))
summary(data_model)
##       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_
    )
  )
data_model <- data_model %>%
  left_join(krt, by = "URUT")
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

kp3 <- kp3 %>% 
  select(URUT, KAPITA)
data_model <- data_model %>%
  left_join(kp3, by = "URUT")
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

head(korrt)
##    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 <- korrt
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
  ))
df_RT <- df_RT %>%
  mutate(menerima_PKH = if_else(menerima_PKH == 1, 1, 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 %>%
  mutate(kep_rumah = if_else(kep_rumah == 1, 1, 2))
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
  )
data_model <- data_model %>%
  left_join(df_RT, by = "URUT")

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"
  )

summary(data_model)
##     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

data_model<-data_model %>% 
  dplyr::select(-URUT)
glimpse(data_model)
## 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,…
write.csv(data_model, "data NEETT(2).csv", row.names = FALSE)

Modelling RF Coba-Coba

data_model<-data_model %>% 
  dplyr::select(-kab_kot, -bobot_RT)
data_model <- data_model %>%
  mutate(
    NEET = factor(NEET, levels = c("Non-NEET", "NEET"))
  ) %>%
  na.omit()
set.seed(123)
library(caret)
## 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, ]
library(randomForest)
## 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       
## 
library(caret)

# Hitung F1-score
f1_score<- F_meas(pred_rf, test_data$NEET)
f1_score
## [1] 0.880378
library(pROC)
## 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
auc_value <- auc(roc_obj)
auc_value
## Area under the curve: 0.7949
plot(roc_obj, col = "blue", lwd = 2, main = "ROC Curve (Random Forest)")

varImpPlot(rf_model, main = "Feature Importance - Random Forest")