Kepadatan penduduk menggambarkan seberapa banyak jiwa yang tinggal dalam setiap kilometer persegi wilayah. Indikator ini penting untuk perencanaan tata ruang, penyediaan layanan publik (kesehatan, pendidikan, transportasi), dan pengelolaan lingkungan.
Provinsi Banten terdiri atas 4 kabupaten (Pandeglang, Lebak, Tangerang, Serang) dan 4 kota (Tangerang, Cilegon, Serang, Tangerang Selatan). Wilayah yang berbatasan langsung dengan DKI Jakarta cenderung jauh lebih padat dibandingkan wilayah selatan Banten. Laporan ini memvisualisasikan pola tersebut dengan R dan R Markdown.
# ====== ISI BAGIAN INI SEBELUM PUBLISH ======
link_sumber <- "https://banten.bps.go.id/" # GANTI dengan link tabel BPS yang tepat (Kepadatan Penduduk menurut Kab/Kota)
link_excel <- "https://drive.google.com/..." # GANTI dengan link download file Excel (Google Drive / GitHub)Sumber data: Badan Pusat Statistik (BPS) Provinsi Banten, tabel Kepadatan Penduduk Menurut Kabupaten/Kota di Provinsi Banten (jiwa/km²), 2026.
Alasan pemilihan data (review singkat):
File Excel diberi nama data_kepadatan_banten_2026.xlsx
dan diletakkan di folder yang sama dengan file .Rmd ini.
Format kolom: Kabupaten_Kota, Jenis_Wilayah,
Kepadatan.
file_data <- "data_kepadatan_banten_2026.xlsx"
if (file.exists(file_data)) {
data_banten <- read_excel(file_data)
data_contoh <- FALSE
} else {
# ------------------------------------------------------------------
# DATA CONTOH (PLACEHOLDER) - hanya agar kode bisa dijalankan.
# WAJIB diganti dengan angka asli dari BPS, lalu simpan di file Excel.
# ------------------------------------------------------------------
data_banten <- data.frame(
Kabupaten_Kota = c("Pandeglang", "Lebak", "Tangerang", "Serang",
"Kota Tangerang", "Kota Cilegon", "Kota Serang",
"Kota Tangerang Selatan"),
Jenis_Wilayah = c(rep("Kabupaten", 4), rep("Kota", 4)),
Kepadatan = c(420, 400, 3900, 850, 12000, 2200, 2400, 9300)
)
write_xlsx(data_banten, file_data) # membuat template Excel otomatis
data_contoh <- TRUE
}Variabel kategorik dibuat dari kolom
Jenis_Wilayah dan pengelompokan
Kategori_Kepadatan. Variabel numerik
adalah Kepadatan.
data_banten <- data_banten %>%
mutate(
Kepadatan = as.numeric(Kepadatan),
Jenis_Wilayah = factor(Jenis_Wilayah, levels = c("Kabupaten", "Kota")),
Kategori_Kepadatan = cut(
Kepadatan,
breaks = c(-Inf, 1000, 3000, 8000, Inf),
labels = c("Rendah (<1.000)", "Sedang (1.000-3.000)",
"Tinggi (3.000-8.000)", "Sangat Tinggi (>8.000)"),
right = FALSE
)
)
kable(data_banten, caption = "Data Kepadatan Penduduk Kabupaten/Kota di Provinsi Banten (jiwa/km²)",
format.args = list(big.mark = ".", decimal.mark = ","))| Kabupaten_Kota | Jenis_Wilayah | Kepadatan | Kategori_Kepadatan |
|---|---|---|---|
| Pandeglang | Kabupaten | 420 | Rendah (<1.000) |
| Lebak | Kabupaten | 400 | Rendah (<1.000) |
| Tangerang | Kabupaten | 3.900 | Tinggi (3.000-8.000) |
| Serang | Kabupaten | 850 | Rendah (<1.000) |
| Kota Tangerang | Kota | 12.000 | Sangat Tinggi (>8.000) |
| Kota Cilegon | Kota | 2.200 | Sedang (1.000-3.000) |
| Kota Serang | Kota | 2.400 | Sedang (1.000-3.000) |
| Kota Tangerang Selatan | Kota | 9.300 | Sangat Tinggi (>8.000) |
## tibble [8 × 4] (S3: tbl_df/tbl/data.frame)
## $ Kabupaten_Kota : chr [1:8] "Pandeglang" "Lebak" "Tangerang" "Serang" ...
## $ Jenis_Wilayah : Factor w/ 2 levels "Kabupaten","Kota": 1 1 1 1 2 2 2 2
## $ Kepadatan : num [1:8] 420 400 3900 850 12000 2200 2400 9300
## $ Kategori_Kepadatan: Factor w/ 4 levels "Rendah (<1.000)",..: 1 1 3 1 4 2 2 4
ringkasan <- data_banten %>%
summarise(
Jumlah_Wilayah = n(),
Minimum = min(Kepadatan),
Kuartil_1 = quantile(Kepadatan, 0.25),
Median = median(Kepadatan),
Rata_rata = mean(Kepadatan),
Kuartil_3 = quantile(Kepadatan, 0.75),
Maksimum = max(Kepadatan),
Simpangan_Baku = sd(Kepadatan)
)
kable(ringkasan, digits = 1, caption = "Ringkasan Statistik Kepadatan Penduduk",
format.args = list(big.mark = ".", decimal.mark = ","))| Jumlah_Wilayah | Minimum | Kuartil_1 | Median | Rata_rata | Kuartil_3 | Maksimum | Simpangan_Baku |
|---|---|---|---|---|---|---|---|
| 8 | 400 | 742,5 | 2.300 | 3.933,8 | 5.250 | 12.000 | 4.368,1 |
ringkasan_jenis <- data_banten %>%
group_by(Jenis_Wilayah) %>%
summarise(Jumlah = n(), Rata_rata = mean(Kepadatan), Median = median(Kepadatan),
Minimum = min(Kepadatan), Maksimum = max(Kepadatan), .groups = "drop")
kable(ringkasan_jenis, digits = 1, caption = "Ringkasan Menurut Jenis Wilayah",
format.args = list(big.mark = ".", decimal.mark = ","))| Jenis_Wilayah | Jumlah | Rata_rata | Median | Minimum | Maksimum |
|---|---|---|---|---|---|
| Kabupaten | 4 | 1.392,5 | 635 | 400 | 3.900 |
| Kota | 4 | 6.475,0 | 5.850 | 2.200 | 12.000 |
Palet warna dibuat senada dengan identitas UNTIRTA: maroon, biru navy, dan emas, dengan krem lembut sebagai latar.
maroon <- "#7B2D2F"
navy <- "#0F2A80"
emas <- "#F2B705"
krem <- "#F8ECEC"
# Kategori kepadatan: gradasi emas -> maroon (makin padat makin gelap)
warna_kategori <- c("Rendah (<1.000)" = "#F6C945",
"Sedang (1.000-3.000)" = "#E08E45",
"Tinggi (3.000-8.000)" = "#B4483F",
"Sangat Tinggi (>8.000)" = "#7B2D2F")
# Jenis wilayah
warna_jenis <- c("Kabupaten" = navy, "Kota" = maroon)
tema_untirta <- theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", color = navy, size = 16),
plot.subtitle = element_text(color = maroon, size = 11),
plot.caption = element_text(color = "grey40", size = 9),
axis.title = element_text(color = navy, face = "bold"),
axis.text = element_text(color = "grey20"),
panel.grid.minor = element_blank(),
panel.grid.major = element_line(color = "#E6D5D5"),
plot.background = element_rect(fill = "white", color = NA),
legend.position = "bottom",
legend.title = element_text(color = navy, face = "bold")
)
sumber_bps <- "Sumber: BPS Provinsi Banten (2026)"ggplot(data_banten, aes(x = Kategori_Kepadatan, fill = Kategori_Kepadatan)) +
geom_bar(width = 0.65, show.legend = FALSE) +
geom_text(stat = "count", aes(label = after_stat(count)),
vjust = -0.5, fontface = "bold", color = navy, size = 5) +
scale_fill_manual(values = warna_kategori, drop = FALSE) +
scale_x_discrete(drop = FALSE) +
scale_y_continuous(breaks = pretty_breaks(), expand = expansion(mult = c(0, 0.15))) +
labs(title = "Jumlah Kabupaten/Kota menurut Kategori Kepadatan",
subtitle = "Provinsi Banten, 2026",
x = "Kategori Kepadatan (jiwa/km²)", y = "Jumlah Kabupaten/Kota",
caption = sumber_bps) +
tema_untirtaInterpretasi: Dari 8 kabupaten/kota di Banten, kategori kepadatan yang paling banyak muncul adalah Rendah (<1.000) dengan 3 wilayah. Sebaran antar kategori menunjukkan bahwa tingkat kepadatan penduduk di Banten tidak merata, ada wilayah yang tergolong jarang penduduk dan ada yang sangat padat.
pie_data <- data_banten %>%
count(Kategori_Kepadatan, .drop = FALSE) %>%
filter(n > 0) %>%
mutate(persen = n / sum(n),
label = paste0(n, " wilayah\n(", percent(persen, accuracy = 0.1), ")"))
ggplot(pie_data, aes(x = 2, y = n, fill = Kategori_Kepadatan)) +
geom_col(width = 1, color = "white", linewidth = 1.2) +
geom_text(aes(label = label), position = position_stack(vjust = 0.5),
color = "white", fontface = "bold", size = 4) +
coord_polar(theta = "y") +
xlim(0.5, 2.5) +
scale_fill_manual(values = warna_kategori, name = "Kategori Kepadatan") +
labs(title = "Proporsi Kabupaten/Kota menurut Kategori Kepadatan",
subtitle = "Provinsi Banten, 2026", caption = sumber_bps) +
theme_void(base_size = 13) +
theme(plot.title = element_text(face = "bold", color = navy, size = 16, hjust = 0.5),
plot.subtitle = element_text(color = maroon, hjust = 0.5),
plot.caption = element_text(color = "grey40", hjust = 0.5),
legend.position = "bottom",
legend.title = element_text(color = navy, face = "bold"))Interpretasi: Diagram lingkaran memperlihatkan porsi tiap kategori terhadap seluruh wilayah. Kategori Rendah (<1.000) memiliki porsi terbesar, yaitu 37.5% dari seluruh kabupaten/kota. Warna yang makin gelap menandakan wilayah yang makin padat.
ggplot(data_banten, aes(x = Jenis_Wilayah, fill = Kategori_Kepadatan)) +
geom_bar(width = 0.6, color = "white") +
geom_text(stat = "count", aes(label = after_stat(count)),
position = position_stack(vjust = 0.5), color = "white",
fontface = "bold", size = 5) +
scale_fill_manual(values = warna_kategori, name = "Kategori Kepadatan", drop = FALSE) +
scale_y_continuous(breaks = pretty_breaks()) +
labs(title = "Kategori Kepadatan menurut Jenis Wilayah",
subtitle = "Kabupaten vs Kota di Provinsi Banten, 2026",
x = "Jenis Wilayah", y = "Jumlah Wilayah", caption = sumber_bps) +
tema_untirtaInterpretasi: Grafik ini membandingkan komposisi kategori kepadatan antara kabupaten dan kota. Wilayah berstatus kota umumnya berada pada kategori kepadatan yang lebih tinggi dibandingkan kabupaten, karena kota memiliki wilayah yang lebih sempit dan menjadi pusat aktivitas ekonomi dan permukiman.
ggplot(data_banten, aes(x = fct_reorder(Kabupaten_Kota, Kepadatan), y = Kepadatan,
fill = Jenis_Wilayah)) +
geom_col(width = 0.7) +
geom_text(aes(label = format(Kepadatan, big.mark = ".", decimal.mark = ",")),
hjust = -0.15, color = navy, fontface = "bold", size = 4) +
geom_hline(yintercept = rata2, linetype = "dashed", color = emas, linewidth = 1) +
annotate("text", x = 1, y = rata2, label = paste("Rata-rata:", fmt(rata2)),
hjust = -0.1, vjust = -1, color = "#8a6a00", fontface = "bold", size = 3.8) +
coord_flip() +
scale_fill_manual(values = warna_jenis, name = "Jenis Wilayah") +
scale_y_continuous(labels = label_number(big.mark = ".", decimal.mark = ","),
expand = expansion(mult = c(0, 0.15))) +
labs(title = "Kepadatan Penduduk menurut Kabupaten/Kota",
subtitle = "Provinsi Banten, 2026 (jiwa/km²)",
x = NULL, y = "Kepadatan Penduduk (jiwa/km²)", caption = sumber_bps) +
tema_untirtaInterpretasi: Kepadatan tertinggi berada di Kota Tangerang sebesar 12.000 jiwa/km², sedangkan terendah di Lebak sebesar 400 jiwa/km². Selisihnya sekitar 30 kali lipat, yang menunjukkan kesenjangan persebaran penduduk yang sangat besar. Rata-rata kepadatan adalah 3.934 jiwa/km², dan hanya 2 dari 8 wilayah yang berada di atas rata-rata.
ggplot(data_banten, aes(x = fct_reorder(Kabupaten_Kota, Kepadatan), y = Kepadatan,
color = Kategori_Kepadatan)) +
geom_segment(aes(xend = Kabupaten_Kota, y = 0, yend = Kepadatan), linewidth = 1.6) +
geom_point(size = 6) +
coord_flip() +
scale_color_manual(values = warna_kategori, name = "Kategori Kepadatan", drop = FALSE) +
scale_y_continuous(labels = label_number(big.mark = ".", decimal.mark = ",")) +
labs(title = "Peringkat Kepadatan Penduduk Kabupaten/Kota",
subtitle = "Warna menunjukkan kategori kepadatan", x = NULL,
y = "Kepadatan Penduduk (jiwa/km²)", caption = sumber_bps) +
tema_untirtaInterpretasi: Grafik lollipop mempertegas urutan wilayah dari yang paling jarang hingga paling padat. Warna titik memperlihatkan bahwa wilayah dengan kepadatan tinggi terkonsentrasi pada kelompok kota dan kabupaten yang berdekatan dengan Jakarta.
ggplot(data_banten, aes(x = Kepadatan)) +
geom_histogram(bins = 5, fill = navy, color = "white", alpha = 0.9) +
geom_vline(xintercept = rata2, color = emas, linewidth = 1.2, linetype = "dashed") +
geom_vline(xintercept = med, color = maroon, linewidth = 1.2) +
annotate("text", x = rata2, y = Inf, label = "Rata-rata", color = "#8a6a00",
vjust = 2, hjust = -0.1, fontface = "bold") +
annotate("text", x = med, y = Inf, label = "Median", color = maroon,
vjust = 4, hjust = 1.1, fontface = "bold") +
scale_x_continuous(labels = label_number(big.mark = ".", decimal.mark = ",")) +
scale_y_continuous(breaks = pretty_breaks()) +
labs(title = "Distribusi Kepadatan Penduduk Kabupaten/Kota",
subtitle = "Garis putus-putus emas = rata-rata, garis maroon = median",
x = "Kepadatan Penduduk (jiwa/km²)", y = "Frekuensi", caption = sumber_bps) +
tema_untirtaInterpretasi: Rata-rata kepadatan (3.934) lebih besar daripada median (2.300). Kondisi ini menandakan distribusi yang menjulur ke kanan (right-skewed), yaitu sebagian besar wilayah berkepadatan relatif rendah, sementara sedikit wilayah memiliki kepadatan sangat tinggi yang menarik nilai rata-rata ke atas.
Data 2026 adalah data satu tahun (cross-section), sehingga sumbu-x diurutkan berdasarkan peringkat kepadatan (dari terendah ke tertinggi). Garis dipakai untuk melihat pola kenaikan dari satu wilayah ke wilayah berikutnya.
data_urut <- data_banten %>% arrange(Kepadatan) %>%
mutate(Kabupaten_Kota = factor(Kabupaten_Kota, levels = Kabupaten_Kota))
ggplot(data_urut, aes(x = Kabupaten_Kota, y = Kepadatan, group = 1)) +
geom_area(fill = emas, alpha = 0.25) +
geom_line(color = navy, linewidth = 1.4) +
geom_point(aes(color = Jenis_Wilayah), size = 5) +
geom_text(aes(label = format(Kepadatan, big.mark = ".", decimal.mark = ",")),
vjust = -1.2, color = maroon, fontface = "bold", size = 3.8) +
geom_hline(yintercept = rata2, linetype = "dashed", color = maroon) +
annotate("text", x = 1, y = rata2, label = paste("Rata-rata:", fmt(rata2)),
hjust = 0, vjust = -0.8, color = maroon, fontface = "bold", size = 3.8) +
scale_color_manual(values = warna_jenis, name = "Jenis Wilayah") +
scale_y_continuous(labels = label_number(big.mark = ".", decimal.mark = ","),
expand = expansion(mult = c(0.02, 0.15))) +
labs(title = "Profil Kepadatan Penduduk Kabupaten/Kota (Terurut)",
subtitle = "Provinsi Banten, 2026 (jiwa/km²)",
x = NULL, y = "Kepadatan Penduduk (jiwa/km²)", caption = sumber_bps) +
tema_untirta +
theme(axis.text.x = element_text(angle = 30, hjust = 1))Interpretasi: Garis naik dari Lebak (400 jiwa/km²) hingga Kota Tangerang (12.000 jiwa/km²). Kenaikan tidak berjalan landai: terdapat lonjakan tajam pada wilayah-wilayah teratas, sementara wilayah di bagian bawah relatif berdekatan nilainya. Warna titik menunjukkan bahwa wilayah kota banyak menempati sisi kanan (paling padat).
Bagian ini akan tampil otomatis jika file Excel memiliki sheet kedua
bernama Tren dengan kolom
Kabupaten_Kota, Tahun, dan
Kepadatan (data beberapa tahun, misalnya 2020-2026, dari
BPS). Jika sheet tidak ada, bagian ini dilewati.
data_tren <- read_excel(file_data, sheet = "Tren") %>%
mutate(Tahun = as.integer(Tahun), Kepadatan = as.numeric(Kepadatan))
# Palet 8 warna senada tema (maroon - emas - navy)
palet_8 <- colorRampPalette(c(navy, "#5B6FB5", emas, "#E08E45", "#B4483F", maroon))(
n_distinct(data_tren$Kabupaten_Kota))
ggplot(data_tren, aes(x = Tahun, y = Kepadatan, color = Kabupaten_Kota, group = Kabupaten_Kota)) +
geom_line(linewidth = 1.2) +
geom_point(size = 3) +
scale_color_manual(values = palet_8, name = "Kabupaten/Kota") +
scale_x_continuous(breaks = unique(data_tren$Tahun)) +
scale_y_continuous(labels = label_number(big.mark = ".", decimal.mark = ",")) +
labs(title = "Tren Kepadatan Penduduk Kabupaten/Kota di Provinsi Banten",
x = "Tahun", y = "Kepadatan Penduduk (jiwa/km²)", caption = sumber_bps) +
tema_untirta +
theme(legend.position = "right")Interpretasi (tren): Jika bagian ini tampil, bandingkan kemiringan garis tiap wilayah. Garis yang lebih curam menandakan pertumbuhan kepadatan yang lebih cepat, dan garis yang berjauhan menandakan kesenjangan kepadatan yang menetap antar wilayah dari tahun ke tahun.