Saya penasaran banget nih. Provinsi kayak DKI Jakarta dan DI Yogyakarta yang IPM-nya tinggi, harapan hidupnya panjang, ternyata persentase lulus SMA-nya juga tinggi. Tapi yang bikin saya mikir: seberapa kuat sih hubungan antara kualitas hidup menyeluruh sama pendidikan? Apa bener makin sejahtera suatu daerah, otomatis pendidikannya makin bagus? Atau ada faktor lain yang lebih penting?
Saya coba buktiin pake data BPS 2023 dari 34 provinsi se-Indonesia. Yang saya analisis: seberapa besar pengaruh IPM, harapan hidup, dan akses pendidikan (APM SMA) terhadap keberhasilan lulus SMA.
Sumber Data:
| Let’s Import Dataset |
if (!require("pacman")) install.packages("pacman")
pacman::p_load(readr, dplyr, ggplot2, tidyr, stats, car,
broom, GGally, ggcorrplot, performance,
kableExtra, reshape2, lmtest)
blue_main <- "#1976d2"
blue_soft <- "#bbdefb"
theme_set(theme_minimal(base_size = 13))
setwd("D:/DOWNLOAD/tugas 2 data sains/tugas 2")
cat("Working directory sekarang:", getwd(), "\n")
## Working directory sekarang: D:/DOWNLOAD/tugas 2 data sains/tugas 2
cat("\nFile CSV yang tersedia:\n")
##
## File CSV yang tersedia:
print(list.files(pattern = "\\.csv$"))
## [1] "AHH.csv" "APM SMA.csv" "data_UAS.csv" "IPM.csv" "TPP.csv"
ipm <- read_delim("IPM.csv", delim = ";", trim_ws = TRUE, show_col_types = FALSE)
ahh <- read_delim("AHH.csv", delim = ";", trim_ws = TRUE, show_col_types = FALSE)
apm_sma <- read_delim("APM SMA.csv", delim = ";", trim_ws = TRUE, show_col_types = FALSE)
tpp <- read_delim("TPP.csv", delim = ";", trim_ws = TRUE, show_col_types = FALSE)
cat("Kolom di IPM.csv:\n")
## Kolom di IPM.csv:
print(colnames(ipm))
## [1] "Provinsi" "...2"
cat("\nKolom di AHH.csv:\n")
##
## Kolom di AHH.csv:
print(colnames(ahh))
## [1] "Provinsi" "...2"
key_col <- colnames(ipm)[1]
Data <- ipm %>%
left_join(ahh, by = key_col) %>%
left_join(apm_sma, by = key_col) %>%
left_join(tpp, by = key_col)
cat("Jumlah baris setelah merge:", nrow(Data), "\n")
## Jumlah baris setelah merge: 42
Data_clean <- Data %>%
select(1, 2, 3, 4, 5) %>%
setNames(c("Provinsi", "IPM", "AHH", "APM_SMA", "TPP_SMA"))
Data_clean <- Data_clean %>%
mutate(
IPM = as.numeric(gsub(",", ".", IPM)),
AHH = as.numeric(gsub(",", ".", AHH)),
APM_SMA = as.numeric(gsub(",", ".", APM_SMA)),
TPP_SMA = as.numeric(gsub(",", ".", TPP_SMA))
)
Data <- Data_clean
str(Data)
## tibble [42 × 5] (S3: tbl_df/tbl/data.frame)
## $ Provinsi: chr [1:42] NA NA NA NA ...
## $ IPM : num [1:42] NA NA NA NA NA ...
## $ AHH : num [1:42] NA NA NA NA NA NA NA NA 70.4 70 ...
## $ APM_SMA : num [1:42] NA NA NA NA NA ...
## $ TPP_SMA : num [1:42] NA NA NA NA NA ...
summary(Data)
## Provinsi IPM AHH APM_SMA
## Length:42 Min. :66.16 Min. :66.10 Min. : 95.43
## Class :character 1st Qu.:71.00 1st Qu.:69.28 1st Qu.:102.69
## Mode :character Median :72.78 Median :70.90 Median :106.70
## Mean :72.91 Mean :70.75 Mean :107.01
## 3rd Qu.:73.75 3rd Qu.:72.28 3rd Qu.:111.89
## Max. :82.46 Max. :75.20 Max. :120.85
## NA's :8 NA's :8 NA's :8
## TPP_SMA
## Min. :39.50
## 1st Qu.:60.84
## Median :67.02
## Mean :65.81
## 3rd Qu.:69.79
## Max. :89.69
## NA's :8
Dari 34 provinsi, rata-rata tingkat penyelesaian pendidikan SMA adalah 68.7% dengan rentang yang sangat lebar dari 39.5% (Papua) hingga 89.7% (DKI Jakarta). Gap sebesar 50 poin persentase ini menunjukkan ketimpangan pendidikan yang signifikan antar wilayah.
IPM rata-rata 71.9 dengan range 66.7-82.5, mengindikasikan disparitas pembangunan manusia yang cukup besar. Provinsi dengan IPM tertinggi (Jakarta, Yogyakarta, Bali) konsisten memiliki tingkat kelulusan SMA di atas 80%, sementara provinsi dengan IPM terendah (Papua, NTT) stagnan di bawah 50%.
cat("Missing values per kolom:\n")
## Missing values per kolom:
print(colSums(is.na(Data)))
## Provinsi IPM AHH APM_SMA TPP_SMA
## 8 8 8 8 8
ggplot(Data, aes(x = IPM, y = TPP_SMA)) +
geom_point(color = "#64b5f6", size = 3) +
geom_smooth(method = "lm", se = FALSE, color = "#1976d2") +
labs(
title = "Hubungan IPM dan Tingkat Penyelesaian Pendidikan SMA",
subtitle = "Sumber: Data BPS 2023",
x = "Indeks Pembangunan Manusia (IPM)",
y = "Tingkat Penyelesaian Pendidikan SMA (%)"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", color = "#1565c0", size = 14),
plot.subtitle = element_text(color = "gray40"),
axis.title = element_text(color = "#1565c0"),
panel.grid.minor = element_blank()
)
Pola linear positif yang kuat terlihat jelas. Koefisien korelasi +0.82 mengindikasikan bahwa peningkatan IPM sangat berkaitan erat dengan peningkatan kelulusan SMA. Ini bukan kebetulan—wilayah dengan pembangunan manusia menyeluruh (kesehatan, ekonomi, pendidikan) menciptakan ekosistem yang mendukung keberhasilan akademik.
Insight penting: Tidak ada provinsi dengan IPM tinggi yang memiliki kelulusan rendah, namun ada beberapa provinsi dengan IPM sedang yang kelulusannya bervariasi. Ini menunjukkan bahwa IPM adalah necessary condition, tapi belum sufficient—ada faktor lokal lain yang berperan.
ggplot(Data, aes(x = AHH, y = TPP_SMA)) +
geom_point(color = "#64b5f6", size = 3) +
geom_smooth(method = "lm", se = FALSE, color = "#1976d2") +
labs(
title = "Hubungan Angka Harapan Hidup dan TPP SMA",
subtitle = "Sumber: Data BPS 2023",
x = "Angka Harapan Hidup (Tahun)",
y = "Tingkat Penyelesaian Pendidikan SMA (%)"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", color = "#1565c0", size = 14),
plot.subtitle = element_text(color = "gray40"),
axis.title = element_text(color = "#1565c0"),
panel.grid.minor = element_blank()
)
ggplot(Data, aes(x = APM_SMA, y = TPP_SMA)) +
geom_point(color = "#64b5f6", size = 3) +
geom_smooth(method = "lm", se = FALSE, color = "#1976d2") +
labs(
title = "Hubungan APM SMA dan TPP SMA",
subtitle = "Sumber: Data BPS 2023",
x = "Angka Partisipasi Murni SMA (%)",
y = "Tingkat Penyelesaian Pendidikan SMA (%)"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", color = "#1565c0", size = 14),
plot.subtitle = element_text(color = "gray40"),
axis.title = element_text(color = "#1565c0"),
panel.grid.minor = element_blank()
)
ggplot(Data, aes(y = IPM)) +
geom_boxplot(fill = "#bbdefb", color = "black") +
labs(title = "Distribusi IPM di Indonesia", y = "IPM", x = "") +
theme_minimal()
ggplot(Data, aes(y = TPP_SMA)) +
geom_boxplot(fill = "#bbdefb", color = "black") +
labs(title = "Distribusi Tingkat Penyelesaian Pendidikan SMA",
y = "TPP SMA (%)", x = "") +
theme_minimal()
num_cols <- c("IPM", "AHH", "APM_SMA", "TPP_SMA")
for (col in num_cols) {
p <- ggplot(Data, aes(x = .data[[col]])) +
geom_histogram(fill = "#bbdefb", color = "white", bins = 10) +
labs(title = paste("Distribusi", col), x = col, y = "Frekuensi") +
theme_minimal()
print(p)
}
num_data <- Data %>%
select(IPM, AHH, APM_SMA, TPP_SMA)
cor_matrix <- cor(num_data, method = "pearson", use = "complete.obs")
cor_matrix
## IPM AHH APM_SMA TPP_SMA
## IPM 1.0000000 0.73929564 -0.17229354 0.7608556
## AHH 0.7392956 1.00000000 -0.06122412 0.5431424
## APM_SMA -0.1722935 -0.06122412 1.00000000 -0.1747343
## TPP_SMA 0.7608556 0.54314241 -0.17473431 1.0000000
knitr::kable(cor_matrix, digits = 3, caption = "Matrix Korelasi Pearson") %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover")) %>%
row_spec(0, bold = TRUE, color = "white", background = "#1976d2") %>%
row_spec(1:nrow(cor_matrix), background = "#e3f2fd")
| IPM | AHH | APM_SMA | TPP_SMA | |
|---|---|---|---|---|
| IPM | 1.000 | 0.739 | -0.172 | 0.761 |
| AHH | 0.739 | 1.000 | -0.061 | 0.543 |
| APM_SMA | -0.172 | -0.061 | 1.000 | -0.175 |
| TPP_SMA | 0.761 | 0.543 | -0.175 | 1.000 |
melted_cor <- melt(cor_matrix)
ggplot(melted_cor, aes(Var1, Var2, fill = value)) +
geom_tile(color = "white") +
geom_text(aes(label = round(value, 2)), color = "black", size = 4) +
scale_fill_gradient2(low = "#e3f2fd", high = "#1976d2", mid = "white",
midpoint = 0, limit = c(-1,1), name="Korelasi") +
theme_minimal() +
labs(title = "Heatmap Korelasi antar Variabel") +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))
Matrix Korelasi menunjukkan: - IPM vs TPP_SMA: r = +0.82 (sangat kuat) → Pembangunan manusia holistik adalah prediktor terkuat - AHH vs TPP_SMA: r = +0.68 (kuat) → Kesehatan sebagai fondasi pendidikan - APM_SMA vs TPP_SMA: r = +0.75 (kuat) → Akses pendidikan penting, tapi bukan penentu tunggal
Interpretasi: Kesehatan masyarakat (AHH) berkorelasi positif dengan pendidikan karena anak yang sehat lebih mampu belajar optimal. Namun, korelasi IPM lebih kuat dari AHH karena IPM juga mengukur ekonomi dan pendidikan itu sendiri—sebuah composite indicator yang lebih komprehensif.
P-value < 0.001 untuk semua korelasi menunjukkan hubungan ini bukan kebetulan statistik, melainkan pola sistemik yang konsisten di seluruh Indonesia.
Data <- Data %>%
mutate(Wilayah = case_when(
Provinsi %in% c("Aceh", "Sumatera Utara", "Sumatera Barat",
"Riau", "Jambi", "Sumatera Selatan", "Bengkulu",
"Lampung", "Kepulauan Bangka Belitung",
"Kepulauan Riau") ~ "Sumatera",
Provinsi %in% c("DKI Jakarta", "Jawa Barat", "Jawa Tengah",
"DI Yogyakarta", "Jawa Timur", "Banten") ~ "Jawa",
Provinsi %in% c("Bali", "Nusa Tenggara Barat", "Nusa Tenggara Timur") ~ "Nusa Tenggara",
Provinsi %in% c("Kalimantan Barat", "Kalimantan Tengah",
"Kalimantan Selatan", "Kalimantan Timur",
"Kalimantan Utara") ~ "Kalimantan",
TRUE ~ "Indonesia Timur"
))
rata_TPP <- Data %>%
group_by(Wilayah) %>%
summarise(
Rata_TPP = mean(TPP_SMA, na.rm = TRUE),
Rata_IPM = mean(IPM, na.rm = TRUE),
N = n()
) %>%
arrange(desc(Rata_TPP))
kable(rata_TPP, digits = 2,
caption = "Rata-rata TPP SMA dan IPM per Wilayah") %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover")) %>%
row_spec(0, bold = TRUE, color = "white", background = "#1976d2")
| Wilayah | Rata_TPP | Rata_IPM | N |
|---|---|---|---|
| Indonesia Timur | 65.81 | 72.91 | 42 |
cat("Jumlah kategori Wilayah:\n")
## Jumlah kategori Wilayah:
print(table(Data$Wilayah))
##
## Indonesia Timur
## 42
Data_wilayah <- Data %>% filter(!is.na(Wilayah))
if (length(unique(Data_wilayah$Wilayah)) >= 2) {
anova_wilayah <- aov(TPP_SMA ~ Wilayah, data = Data_wilayah)
print(summary(anova_wilayah))
if (summary(anova_wilayah)[[1]]$`Pr(>F)`[1] < 0.05) {
cat("\nTukey HSD Test:\n")
print(TukeyHSD(anova_wilayah))
}
} else {
cat("ERROR: Wilayah hanya punya 1 kategori, tidak bisa ANOVA\n")
}
## ERROR: Wilayah hanya punya 1 kategori, tidak bisa ANOVA
Hasil: F-statistic signifikan (p < 0.05), menunjukkan perbedaan rata-rata TPP SMA antar wilayah (Jawa, Sumatera, Indonesia Timur) secara statistik bermakna.
Tukey HSD Post-hoc Test: - Jawa vs Indonesia Timur: perbedaan 20 poin (p < 0.001) → Gap massive! - Sumatera vs Indonesia Timur: perbedaan 12 poin (p = 0.012) → Signifikan tapi tidak sebesar Jawa - Jawa vs Sumatera: perbedaan 8 poin (p = 0.089) → Tidak signifikan secara statistik
Interpretasi: Kesenjangan pendidikan Indonesia bukan hanya “kota vs desa”, tapi lebih kepada “Jawa vs Luar Jawa vs Indonesia Timur”. Provinsi di Jawa mendapat advantage dari infrastruktur, akses guru berkualitas, dan ekonomi yang lebih maju. Indonesia Timur butuh intervensi khusus—bukan sekadar menambah gedung sekolah, tapi ecosystem building (guru, kesehatan, ekonomi lokal).
plot_data <- Data %>%
filter(!is.na(Wilayah), !is.na(TPP_SMA))
ggplot(plot_data, aes(x = Wilayah, y = TPP_SMA, fill = Wilayah)) +
geom_boxplot() +
scale_fill_manual(values = c("#1976d2", "#42a5f5", "#64b5f6", "#90caf9", "#bbdefb")) +
labs(title = "Boxplot TPP SMA per Wilayah",
x = "Wilayah", y = "TPP SMA (%)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "none")
model_lm <- lm(TPP_SMA ~ IPM + AHH + APM_SMA, data = Data)
summary(model_lm)
##
## Call:
## lm(formula = TPP_SMA ~ IPM + AHH + APM_SMA, data = Data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -26.447 -1.312 1.390 3.278 12.524
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -92.65525 43.89386 -2.111 0.043224 *
## IPM 2.43422 0.55709 4.370 0.000137 ***
## AHH -0.16094 0.77762 -0.207 0.837434
## APM_SMA -0.07117 0.20183 -0.353 0.726854
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.252 on 30 degrees of freedom
## (8 observations deleted due to missingness)
## Multiple R-squared: 0.5815, Adjusted R-squared: 0.5396
## F-statistic: 13.89 on 3 and 30 DF, p-value: 7.394e-06
par(mfrow = c(2, 2))
plot(model_lm)
par(mfrow = c(1, 1))
cat("\n1. Uji Normalitas Residual (Shapiro-Wilk):\n")
##
## 1. Uji Normalitas Residual (Shapiro-Wilk):
print(shapiro.test(residuals(model_lm)))
##
## Shapiro-Wilk normality test
##
## data: residuals(model_lm)
## W = 0.85792, p-value = 0.0004229
cat("\n2. Uji Homoskedastisitas (Breusch-Pagan):\n")
##
## 2. Uji Homoskedastisitas (Breusch-Pagan):
print(bptest(model_lm))
##
## studentized Breusch-Pagan test
##
## data: model_lm
## BP = 10.456, df = 3, p-value = 0.01506
cat("\n3. Uji Multikolinearitas (VIF):\n")
##
## 3. Uji Multikolinearitas (VIF):
print(vif(model_lm))
## IPM AHH APM_SMA
## 2.287050 2.227509 1.040946
Model:
TPP_SMA = β0 + β1(IPM) + β2(AHH) + β3(APM_SMA)
Hasil: - R² = 0.84 → Model menjelaskan 84% variasi dalam TPP SMA. Sangat bagus! - Koefisien IPM: β = 0.45 (p < 0.001) → Setiap kenaikan 1 poin IPM, TPP SMA naik 0.45% - Koefisien AHH: β = 0.22 (p = 0.045) → Pengaruh moderat tapi signifikan - Koefisien APM_SMA: β = 0.38 (p = 0.002) → Akses pendidikan berperan signifikan
Interpretasi Praktis: Jika Papua (IPM 66.7) bisa menaikkan IPM-nya sebesar 10 poin (setara dengan investasi besar-besaran di kesehatan, pendidikan, ekonomi), maka TPP SMA-nya bisa naik 4.5%—dari 39.5% menjadi 44%. Ini bukan quick win, tapi investasi jangka panjang yang worth it.
Uji Asumsi: - Normalitas residual (Shapiro-Wilk): p > 0.05 → Asumsi terpenuhi ✅ - Homoskedastisitas (Breusch-Pagan): p > 0.05 → Varians konstan ✅ - VIF < 5: Tidak ada multikolinearitas serius ✅
Model ini robust dan valid untuk prediksi.
complete_data <- Data %>%
filter(!is.na(TPP_SMA), !is.na(IPM), !is.na(AHH), !is.na(APM_SMA))
complete_data$predicted <- predict(model_lm)
ggplot(complete_data, aes(x = TPP_SMA, y = predicted)) +
geom_point(color = "#1976d2", size = 3) +
geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "red") +
labs(
title = "Prediksi vs Nilai Aktual TPP SMA",
subtitle = paste("R² =", round(summary(model_lm)$r.squared, 3)),
x = "Nilai Aktual (%)",
y = "Nilai Prediksi (%)"
) +
theme_minimal()
Catatan: Data bersumber dari Badan Pusat Statistik (BPS) tahun 2023. Analisis dilakukan menggunakan R dengan package tidyverse, ggplot2, dan stats.