data.frame(
  ` ` = c(
    "**Keracunan Program MBG 2025**",
    "Kelompok 8 - Statistika Kelas D",
    "Muhammad Raffi | Nur Raflin | Lanang | Ripky | Fathir Aliffa",
    "Analisis sebaran dan statistik korban keracunan MBG di Indonesia"
  ),
  check.names = FALSE
) %>%
  kbl(col.names = NULL, align = "c") %>%
  kable_styling(full_width = TRUE, font_size = 15) %>%
  row_spec(1, background = "#c1121f", color = "white", bold = TRUE, font_size = 20) %>%
  row_spec(2, background = "#e63946", color = "white", bold = TRUE) %>%
  row_spec(3, background = "#e63946", color = "white") %>%
  row_spec(4, background = "#f8d7da", color = "#c1121f")
Keracunan Program MBG 2025
Kelompok 8 - Statistika Kelas D
Muhammad Raffi | Nur Raflin | Lanang | Ripky | Fathir Aliffa
Analisis sebaran dan statistik korban keracunan MBG di Indonesia

1 Latar Belakang

Program Makan Bergizi Gratis (MBG) merupakan salah satu program unggulan pemerintah Indonesia yang bertujuan meningkatkan gizi anak sekolah. Namun sepanjang tahun 2025, program ini menuai perhatian publik akibat maraknya kasus keracunan makanan yang berdampak pada ribuan anak di berbagai provinsi.

Fakta Kritis: Komisi Perlindungan Anak Indonesia (KPAI) mencatat 12.658 anak mengalami keracunan MBG di 38 provinsi sepanjang 2025. Laporan terpisah per Oktober 2025 mencatat korban bisa melampaui 16.000 siswa secara nasional.

Analisis ini menggunakan data dari dua sumber utama:

  • KPAI - Laporan Akhir Tahun 2025 (Januari 2026)
  • Databoks.co.id - Rekapitulasi per Oktober 2025

2 Ringkasan Data

2.1 Statistik Utama (Sumber: KPAI)

stat_utama <- data.frame(
  Indikator = c("Total Anak Korban Keracunan (Sepanjang 2025)",
                "Jumlah Provinsi Terdampak",
                "Estimasi Korban per Akhir Oktober 2025"),
  Nilai     = c("12.658 anak", "38 provinsi", "> 16.000 siswa")
)

stat_utama %>%
  kbl(col.names = c("Indikator", "Nilai"),
      align     = c("l", "c"),
      caption   = "Ringkasan Statistik Utama - Sumber: KPAI 2025") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = TRUE, font_size = 15) %>%
  row_spec(0, background = "#c1121f", color = "white", bold = TRUE) %>%
  row_spec(1, background = "#fff5f5") %>%
  row_spec(2, background = "#fff8f0") %>%
  row_spec(3, background = "#f0f5ff") %>%
  column_spec(2, bold = TRUE, color = "#c1121f")
Ringkasan Statistik Utama - Sumber: KPAI 2025
Indikator Nilai
Total Anak Korban Keracunan (Sepanjang 2025) 12.658 anak
Jumlah Provinsi Terdampak 38 provinsi
Estimasi Korban per Akhir Oktober 2025 > 16.000 siswa

2.2 Provinsi dengan Korban Tertinggi (KPAI)

kpai_df <- data.frame(
  Peringkat     = 1:4,
  Provinsi      = c("Jawa Barat", "Jawa Tengah", "DI Yogyakarta", "Provinsi Lainnya (35 prov.)"),
  Jumlah_Korban = c(4877, 1961, 1517, 4303),
  stringsAsFactors = FALSE
)
kpai_df$Persentase <- paste0(round(kpai_df$Jumlah_Korban / 12658 * 100, 1), "%")

kpai_df %>%
  kbl(col.names = c("No.", "Provinsi", "Jumlah Korban", "% dari Total"),
      align     = c("c", "l", "r", "r"),
      caption   = "Tabel 1. Rekapitulasi KPAI - Korban Keracunan MBG 2025") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = FALSE, font_size = 14) %>%
  row_spec(0, background = "#e63946", color = "white", bold = TRUE) %>%
  row_spec(1:3, background = "#fff5f5") %>%
  row_spec(4, background = "#f7fafc") %>%
  column_spec(3, bold = TRUE, color = "#c1121f")
Tabel 1. Rekapitulasi KPAI - Korban Keracunan MBG 2025
No.  Provinsi Jumlah Korban % dari Total
1 Jawa Barat 4877 38.5%
2 Jawa Tengah 1961 15.5%
3 DI Yogyakarta 1517 12%
4 Provinsi Lainnya (35 prov.) 4303 34%

3 Import Data dari Excel

df_mbg <- read_excel("data korban MBG.xlsx", col_names = TRUE) %>%
  select(1:4) %>%
  slice(-n()) %>%
  rename(No = 1, Daerah = 2, Korban = 3, Persen = 4) %>%
  mutate(
    Korban = as.numeric(Korban),
    Persen = round(Korban / sum(Korban, na.rm = TRUE) * 100, 2),
    Daerah = trimws(Daerah)
  ) %>%
  arrange(desc(Korban))

cat("Data berhasil dimuat:", nrow(df_mbg), "provinsi | Total korban:",
    format(sum(df_mbg$Korban, na.rm = TRUE), big.mark = "."))
## Data berhasil dimuat: 26 provinsi | Total korban: 16.109
df_mbg %>%
  mutate(Persen = paste0(Persen, "%")) %>%
  select(No, Daerah, Korban, Persen) %>%
  kbl(col.names  = c("No.", "Provinsi/Daerah", "Jumlah Korban", "Persentase"),
      align      = c("c", "l", "r", "r"),
      caption    = "Tabel 2. Data Lengkap Korban Keracunan MBG per Provinsi (Databoks, Oktober 2025)",
      format.args = list(big.mark = ".")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = TRUE, font_size = 13) %>%
  row_spec(0, background = "#e63946", color = "white", bold = TRUE) %>%
  row_spec(1:3, background = "#fff5f5", bold = TRUE)
Tabel 2. Data Lengkap Korban Keracunan MBG per Provinsi (Databoks, Oktober 2025)
No.  Provinsi/Daerah Jumlah Korban Persentase
1 Jawa Barat 4.955 30.76%
2 Jawa Tengah 2.736 16.98%
3 DI Yogyakarta 2.707 16.8%
4 Jawa Timur 1.312 8.14%
5 Nusa Tenggara Timur 800 4.97%
6 Sulawesi Tengah 603 3.74%
7 Bengkulu 539 3.35%
8 Lampung 486 3.02%
9 Nusa Tenggara Barat 343 2.13%
10 Sulawesi Selatan 336 2.09%
11 Maluku 308 1.91%
12 Kalimantan Selatan 170 1.06%
13 Sumatera Barat 151 0.94%
14 Jakarta 132 0.82%
15 Kalimantan Utara 113 0.7%
16 Sumatera Utara 99 0.61%
17 Sulawesi Tenggara 73 0.45%
18 Banten 55 0.34%
19 Riau 46 0.29%
20 Kalimantan Barat 40 0.25%
21 Sulawesi Barat 35 0.22%
22 Kalimantan Tengah 27 0.17%
23 Kepulauan Riau 14 0.09%
24 Papua Barat 13 0.08%
25 Gorontalo 11 0.07%
26 Kalimantan Timur 5 0.03%

4 Visualisasi Data

4.1 Bar Chart - Seluruh Provinsi Terdampak

pal_red <- colorRampPalette(c("#c1121f", "#e63946", "#f4a261", "#adb5bd"))(nrow(df_mbg))

ggplot(df_mbg, aes(x = reorder(Daerah, Korban), y = Korban,
                   fill = reorder(Daerah, Korban))) +
  geom_col(width = 0.72, show.legend = FALSE, color = NA) +
  geom_text(aes(label = format(Korban, big.mark = ".")),
            hjust = -0.15, size = 3.1, color = "#2d3748", fontface = "bold") +
  coord_flip() +
  scale_fill_manual(values = pal_red) +
  scale_y_continuous(labels = label_number(big.mark = "."),
                     expand = expansion(mult = c(0, .18))) +
  labs(
    title    = "Jumlah Korban Keracunan MBG per Provinsi",
    subtitle = "Data per Oktober 2025 - Sumber: Databoks.co.id",
    x        = NULL,
    y        = "Jumlah Korban"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title         = element_text(face = "bold", size = 14, color = "#c1121f"),
    plot.subtitle      = element_text(size = 10, color = "#718096"),
    panel.grid.major.y = element_blank(),
    panel.grid.minor   = element_blank(),
    axis.text.y        = element_text(color = "#2d3748"),
    plot.background    = element_rect(fill = "#fff", color = NA)
  )

Interpretasi: Jawa Barat mendominasi dengan 4.955 korban (30,7%), diikuti Jawa Tengah 2.736 (16,9%) dan DI Yogyakarta 2.707 (16,7%). Ketiga provinsi di Jawa ini menyumbang lebih dari 64% total korban nasional, mengindikasikan konsentrasi kasus yang signifikan di Pulau Jawa.


4.2 Pie Chart - Komposisi Top 5 vs Lainnya

top5 <- df_mbg %>% slice(1:5)
others <- data.frame(
  Daerah = "Provinsi Lainnya (21 prov.)",
  Korban = sum(df_mbg$Korban[6:nrow(df_mbg)], na.rm = TRUE),
  Persen = NA
)

pie_df <- bind_rows(top5 %>% select(Daerah, Korban), others) %>%
  mutate(
    Persen = round(Korban / sum(Korban) * 100, 1),
    label  = paste0(Daerah, "\n", format(Korban, big.mark = "."), " (", Persen, "%)")
  )

pie_colors <- c("#e63946", "#f4a261", "#457b9d", "#2a9d8f", "#8338ec", "#adb5bd")

ggplot(pie_df, aes(x = "", y = Korban, fill = Daerah)) +
  geom_col(width = 1, color = "white", linewidth = 0.8) +
  coord_polar(theta = "y") +
  geom_text(aes(label = paste0(Persen, "%")),
            position = position_stack(vjust = 0.5),
            size = 3.8, color = "white", fontface = "bold") +
  scale_fill_manual(values = pie_colors) +
  labs(
    title    = "Proporsi Korban: Top 5 Provinsi vs Lainnya",
    subtitle = "Total keseluruhan: 16.137 korban (per Oktober 2025)",
    fill     = "Wilayah"
  ) +
  theme_void() +
  theme(
    plot.title      = element_text(face = "bold", hjust = 0.5, size = 14, color = "#c1121f"),
    plot.subtitle   = element_text(hjust = 0.5, size = 10, color = "#718096"),
    legend.text     = element_text(size = 9),
    plot.background = element_rect(fill = "#fff", color = NA)
  )

Interpretasi: Lima provinsi teratas menyumbang hampir 77% total korban nasional. Pola ini menunjukkan bahwa kasus keracunan MBG tidak tersebar merata, terdapat ketimpangan yang signifikan antara Jawa dan luar Jawa.


4.3 Bar Chart - Perbandingan Data KPAI vs Databoks (3 Provinsi Utama)

compare_df <- data.frame(
  Provinsi = rep(c("Jawa Barat", "Jawa Tengah", "DI Yogyakarta"), 2),
  Sumber   = rep(c("KPAI (Akhir 2025)", "Databoks (Okt 2025)"), each = 3),
  Korban   = c(4877, 1961, 1517, 4955, 2736, 2707)
)

ggplot(compare_df, aes(x = Provinsi, y = Korban, fill = Sumber)) +
  geom_col(position = "dodge", width = 0.6, color = NA) +
  geom_text(aes(label = format(Korban, big.mark = ".")),
            position = position_dodge(width = 0.6),
            vjust = -0.5, size = 3.4, fontface = "bold") +
  scale_fill_manual(values = c("#e63946", "#457b9d")) +
  scale_y_continuous(labels = label_number(big.mark = "."),
                     expand = expansion(mult = c(0, .15))) +
  labs(
    title    = "Perbandingan Data: KPAI vs Databoks",
    subtitle = "Tiga provinsi dengan korban keracunan MBG tertinggi",
    x        = "Provinsi",
    y        = "Jumlah Korban",
    fill     = "Sumber Data"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title         = element_text(face = "bold", color = "#c1121f", hjust = 0.5),
    plot.subtitle      = element_text(color = "#718096", hjust = 0.5),
    legend.position    = "top",
    panel.grid.major.x = element_blank(),
    plot.background    = element_rect(fill = "#fff", color = NA)
  )

Interpretasi: Terdapat selisih angka antara data KPAI (akhir 2025) dan Databoks (Oktober 2025). Data Databoks umumnya lebih tinggi karena mencakup periode yang berbeda. Selisih terbesar terlihat di DI Yogyakarta (+1.190 korban) dan Jawa Tengah (+775 korban), mengindikasikan lonjakan kasus di akhir tahun.


5 Statistik Deskriptif

stats_df <- df_mbg %>%
  summarise(
    `Jumlah Provinsi`   = n(),
    `Total Korban`      = sum(Korban),
    `Rata-rata (Mean)`  = round(mean(Korban), 1),
    `Median`            = median(Korban),
    `Nilai Terbesar`    = max(Korban),
    `Nilai Terkecil`    = min(Korban),
    `Standar Deviasi`   = round(sd(Korban), 1),
    `Koefisien Variasi` = paste0(round(sd(Korban) / mean(Korban) * 100, 1), "%")
  )

stats_df %>%
  mutate(across(everything(), as.character)) %>%
  pivot_longer(everything(), names_to = "Statistik", values_to = "Nilai") %>%
  kbl(align   = c("l", "r"),
      caption = "Tabel 3. Statistik Deskriptif Korban MBG per Provinsi") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = FALSE, font_size = 14, position = "left") %>%
  row_spec(0, background = "#e63946", color = "white", bold = TRUE) %>%
  row_spec(c(1, 3, 5, 7), background = "#f7fafc")
Tabel 3. Statistik Deskriptif Korban MBG per Provinsi
Statistik Nilai
Jumlah Provinsi 26
Total Korban 16109
Rata-rata (Mean) 619.6
Median 141.5
Nilai Terbesar 4955
Nilai Terkecil 5
Standar Deviasi 1150.1
Koefisien Variasi 185.6%

Interpretasi: Koefisien variasi yang tinggi (lebih dari 200%) menunjukkan ketimpangan distribusi yang sangat besar antar provinsi. Beberapa provinsi seperti Jawa Barat memiliki ribuan korban, sementara Kalimantan Timur hanya 5 korban. Kesenjangan ini mencerminkan perbedaan cakupan implementasi program MBG.


5.1 Histogram - Sebaran Jumlah Korban per Provinsi

mean_korban   <- mean(df_mbg$Korban)
median_korban <- median(df_mbg$Korban)

ggplot(df_mbg, aes(x = Korban)) +
  geom_histogram(bins = 8, fill = "#e63946", color = "white", alpha = 0.85) +
  geom_vline(xintercept = mean_korban,   color = "#457b9d",
             linetype = "dashed",   linewidth = 1.2) +
  geom_vline(xintercept = median_korban, color = "#f4a261",
             linetype = "dotdash", linewidth = 1.2) +
  annotate("text", x = mean_korban   + 350, y = Inf,
           label = paste("Mean =", round(mean_korban)),
           vjust = 2, color = "#457b9d", size = 3.6, fontface = "bold") +
  annotate("text", x = median_korban + 350, y = Inf,
           label = paste("Median =", round(median_korban)),
           vjust = 4, color = "#d97706", size = 3.6, fontface = "bold") +
  scale_x_continuous(labels = label_number(big.mark = ".")) +
  labs(
    title    = "Distribusi Jumlah Korban per Provinsi",
    subtitle = "Distribusi sangat right-skewed akibat dominasi Jawa Barat",
    x        = "Jumlah Korban",
    y        = "Frekuensi Provinsi"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title      = element_text(face = "bold", color = "#c1121f"),
    plot.subtitle   = element_text(color = "#718096"),
    panel.grid.minor  = element_blank(),
    plot.background   = element_rect(fill = "#fff", color = NA)
  )

Interpretasi: Histogram menunjukkan distribusi yang sangat miring ke kanan (right-skewed). Mayoritas provinsi (lebih dari 18 dari 26) memiliki kurang dari 500 korban, namun beberapa provinsi di Jawa menarik distribusi secara ekstrem ke atas. Mean (621) jauh lebih besar dari Median (135), menandakan adanya outlier yang signifikan.


5.2 Boxplot - Deteksi Outlier per Wilayah

df_mbg_region <- df_mbg %>%
  mutate(Wilayah = case_when(
    Daerah %in% c("Jawa Barat", "Jawa Tengah", "DI Yogyakarta",
                  "Jawa Timur", "Jakarta", "Banten")             ~ "Jawa",
    Daerah %in% c("Sumatera Barat", "Sumatera Utara", "Lampung",
                  "Bengkulu", "Riau", "Kepulauan Riau")          ~ "Sumatera",
    grepl("Kalimantan", Daerah)                                  ~ "Kalimantan",
    grepl("Sulawesi|Gorontalo", Daerah)                          ~ "Sulawesi",
    TRUE                                                         ~ "Indonesia Timur"
  ))

ggplot(df_mbg_region, aes(x = Wilayah, y = Korban, fill = Wilayah)) +
  geom_boxplot(outlier.colour = "#e63946", outlier.shape = 16,
               outlier.size = 2.5, alpha = 0.75, show.legend = FALSE) +
  geom_jitter(width = 0.15, alpha = 0.5, color = "#2d3748", size = 1.8) +
  scale_fill_manual(values = c("#e63946", "#f4a261", "#457b9d", "#2a9d8f", "#8338ec")) +
  scale_y_continuous(labels = label_number(big.mark = ".")) +
  labs(
    title    = "Boxplot Korban MBG per Wilayah",
    subtitle = "Titik merah = outlier | Titik abu = data individual",
    x        = "Wilayah",
    y        = "Jumlah Korban"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title         = element_text(face = "bold", color = "#c1121f"),
    plot.subtitle      = element_text(color = "#718096"),
    panel.grid.major.x = element_blank(),
    plot.background    = element_rect(fill = "#fff", color = NA)
  )

Interpretasi: Boxplot memperlihatkan bahwa wilayah Jawa memiliki rentang nilai dan outlier tertinggi. Jawa Barat (4.955) dan Jawa Tengah (2.736) merupakan outlier yang jauh melampaui rata-rata wilayah Jawa lainnya. Wilayah Kalimantan dan Sulawesi memiliki distribusi yang relatif homogen dengan nilai rendah.


6 Kesimpulan

Berdasarkan analisis data korban keracunan Program Makan Bergizi Gratis (MBG) tahun 2025, dapat ditarik beberapa kesimpulan penting.

1. Skala Masalah yang Serius. Tercatat minimal 12.658 hingga lebih dari 16.000 anak terdampak keracunan MBG di seluruh Indonesia, menjadikannya isu kesehatan publik yang mendesak untuk ditangani.

2. Ketimpangan Geografis yang Ekstrem. Pulau Jawa, khususnya Jawa Barat, Jawa Tengah, dan DI Yogyakarta, mendominasi dengan lebih dari 64% korban nasional. Hal ini berbanding terbalik dengan provinsi-provinsi di Kalimantan dan Papua yang hanya mencatat belasan korban.

3. Tren Kenaikan Kasus. Perbandingan data KPAI (akhir 2025) dan Databoks (Oktober 2025) mengindikasikan adanya lonjakan kasus yang signifikan di triwulan keempat 2025, terutama di DI Yogyakarta (+1.190 korban) dan Jawa Tengah (+775 korban).

4. Distribusi Sangat Right-Skewed. Koefisien variasi lebih dari 200% dan nilai mean yang jauh dari median mengkonfirmasi bahwa distribusi korban sangat tidak merata, mencerminkan perbedaan skala implementasi dan pengawasan program MBG antar daerah.

Rekomendasi: Perlu dilakukan evaluasi menyeluruh terhadap rantai pasok dan standar keamanan pangan dalam program MBG, khususnya di provinsi-provinsi Jawa yang menjadi episentrum kasus. Transparansi data yang konsisten antar sumber juga perlu ditingkatkan.


7 Referensi

  1. Komisi Perlindungan Anak Indonesia (KPAI). (2026, Januari). Laporan Akhir Tahun 2025 - Kasus Keracunan MBG. Diakses dari detiknews.com.
  2. Databoks.co.id. (2025). Korban Keracunan MBG Capai 16 Ribu Orang per Akhir Oktober 2025, Ini Sebarannya!
  3. Wikipedia Indonesia. (2025). Program Makan Bergizi Gratis.


Kelompok 8 - Statistika Kelas D - 2026 | Data: KPAI & Databoks.co.id