Laporan ini menganalisis hubungan antara Indeks Pembangunan Manusia (IPM), Angka Harapan Hidup (AHH), dan Angka Partisipasi Murni (APM) SMA terhadap Tingkat Penyelesaian Pendidikan (TPP) SMA pada unit analisis provinsi (n = 34). Analisis mencakup EDA, korelasi, ANOVA satu arah dan regresi linear berganda. Semua kode ada di lampiran sehingga dapat direproduksi.
Sumber Data:
Data Indeks Pembangunan Manusia (IPM)
Data Angka Harapan Hidup (AHH)
Data Angka Partisipasi Murni (APM) SMA
Data Tingkat Penyelesaian Pendidikan (TPP) SMA
| Let’s Import Dataset |
# Install dan load packages yang diperlukan
if (!require("pacman")) install.packages("pacman")
pacman::p_load(readr, dplyr, ggplot2, tidyr, stats, car,
broom, GGally, ggcorrplot, performance,
kableExtra, reshape2, lmtest)
# Set warna tema biru untuk visualisasi
blue_main <- "#1976d2"
blue_soft <- "#bbdefb"
theme_set(theme_minimal(base_size = 13))
# Atur working directory ke folder tempat file CSV berada
setwd("D:/DOWNLOAD/tugas 2 data sains/tugas 2")
# Verifikasi
cat("Working directory sekarang:", getwd(), "\n")
## Working directory sekarang: D:/DOWNLOAD/tugas 2 data sains/tugas 2
cat("\nFile yang ada di folder:\n")
##
## File yang ada di folder:
print(list.files())
## [1] "AHH.csv" "APM SMA.csv" "data_UAS.csv"
## [4] "IPM.csv" "TPP.csv" "uas.html"
## [7] "uas.pds" "uas.Rmd" "uas_data_sains.Rmd"
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"
# Import data dari masing-masing 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)
# Lihat nama kolom dari setiap dataset
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"
cat("\nKolom di APM SMA.csv:\n")
##
## Kolom di APM SMA.csv:
print(colnames(apm_sma))
## [1] "Provinsi" "...2"
cat("\nKolom di TPP.csv:\n")
##
## Kolom di TPP.csv:
print(colnames(tpp))
## [1] "Provinsi" "...2"
# Preview data mentah
cat("\nPreview IPM:\n")
##
## Preview IPM:
print(head(ipm, 3))
## # A tibble: 3 × 2
## Provinsi ...2
## <chr> <chr>
## 1 <NA> IPM
## 2 ACEH 73.4
## 3 SUMATERA UTARA 73.37
cat("\nPreview AHH:\n")
##
## Preview AHH:
print(head(ahh, 3))
## # A tibble: 3 × 2
## Provinsi ...2
## <chr> <chr>
## 1 <NA> <NA>
## 2 <NA> AHH
## 3 ACEH 70.4
# Merge semua data berdasarkan kolom Provinsi
# CATATAN: Sesuaikan nama kolom 'Provinsi' jika berbeda di CSV Anda
# Ambil nama kolom pertama sebagai key (biasanya Provinsi)
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
cat("Jumlah kolom setelah merge:", ncol(Data), "\n\n")
## Jumlah kolom setelah merge: 5
print(head(Data, 3))
## # A tibble: 3 × 5
## Provinsi ...2.x ...2.y ...2.x.x ...2.y.y
## <chr> <chr> <chr> <chr> <chr>
## 1 <NA> IPM <NA> <NA> <NA>
## 2 <NA> IPM <NA> <NA> TPP
## 3 <NA> IPM <NA> APM SMA <NA>
# PENTING: Sesuaikan nama kolom di bawah dengan nama kolom ASLI di CSV Anda
# Cek dulu output di chunk sebelumnya untuk tahu nama kolom yang benar
# Contoh jika nama kolom asli adalah:
# - Provinsi (atau kolom 1)
# - IPM atau nilai_ipm
# - AHH atau harapan_hidup
# - APM_SMA atau apm
# - TPP_SMA atau tingkat_penyelesaian
# Ganti bagian ini sesuai nama kolom asli Anda:
Data_clean <- Data %>%
select(1, 2, 3, 4, 5) %>% # Pilih 5 kolom pertama
setNames(c("Provinsi", "IPM", "AHH", "APM_SMA", "TPP_SMA"))
# Konversi ke numerik (menghapus karakter non-angka jika ada)
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))
)
# Gunakan data yang sudah dibersihkan
Data <- Data_clean
# Cek hasil akhir
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
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
# Cek missing values
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()
)
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()
)
IPM vs TPP SMA: Grafik menunjukkan hubungan positif yang kuat antara IPM dengan tingkat penyelesaian pendidikan SMA. Provinsi dengan IPM tinggi (seperti DKI Jakarta, DI Yogyakarta) cenderung memiliki persentase kelulusan SMA yang lebih tinggi. Hal ini menunjukkan bahwa pembangunan manusia yang menyeluruh (pendidikan, kesehatan, ekonomi) berpengaruh signifikan terhadap keberhasilan pendidikan.
AHH vs TPP SMA: Terdapat korelasi positif antara angka harapan hidup dengan tingkat penyelesaian pendidikan SMA. Daerah dengan kondisi kesehatan yang baik (AHH tinggi) cenderung memiliki tingkat kelulusan SMA yang lebih baik. Ini mengindikasikan bahwa kesehatan masyarakat menjadi fondasi penting untuk keberhasilan pendidikan.
APM SMA vs TPP SMA: Hubungan antara akses pendidikan (APM) dengan tingkat penyelesaian cukup kuat. Semakin banyak siswa yang berpartisipasi dalam pendidikan SMA, semakin tinggi pula tingkat kelulusannya. Namun, akses saja tidak cukup - kualitas pendidikan juga perlu diperhatikan.
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 = AHH)) +
geom_boxplot(fill = "#bbdefb", color = "black") +
labs(title = "Distribusi Angka Harapan Hidup", y = "AHH (Tahun)", x = "") +
theme_minimal()
ggplot(Data, aes(y = APM_SMA)) +
geom_boxplot(fill = "#bbdefb", color = "black") +
labs(title = "Distribusi APM SMA", y = "APM SMA (%)", 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()
Hasil boxplot menunjukkan bahwa IPM dan AHH relatif merata antar provinsi dengan beberapa outlier di daerah tertinggal. APM SMA menunjukkan variasi yang cukup besar, mengindikasikan akses pendidikan yang belum merata. TPP SMA memiliki rentang yang lebar, dengan beberapa provinsi jauh di bawah rata-rata nasional. Ketimpangan paling terlihat pada variabel TPP SMA, di mana provinsi-provinsi seperti Papua dan NTT memiliki tingkat kelulusan yang jauh lebih rendah dibanding Jawa dan Bali.
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)
}
Histogram IPM: Mayoritas provinsi berada pada nilai IPM menengah (70-75), dengan distribusi yang cenderung normal.
Histogram AHH: Angka harapan hidup tersebar merata di kisaran 68-72 tahun, dengan beberapa provinsi mencapai di atas 74 tahun.
Histogram APM SMA: Distribusi cenderung merata, menunjukkan bahwa akses pendidikan SMA sudah cukup baik di sebagian besar provinsi.
Histogram TPP SMA: Terdapat variasi yang cukup besar dalam tingkat penyelesaian pendidikan, dengan beberapa provinsi masih di bawah 50%.
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))
Berdasarkan analisis korelasi, IPM dengan TPP SMA menunjukkan korelasi sangat kuat, menunjukkan bahwa pembangunan manusia menyeluruh sangat berpengaruh terhadap keberhasilan pendidikan. AHH dengan TPP SMA memiliki korelasi positif moderat, menandakan kesehatan masyarakat mendukung keberhasilan akademik. APM SMA dengan TPP SMA juga berkorelasi positif kuat, menunjukkan akses pendidikan penting namun bukan satu-satunya faktor.
Masalahnya adalah kode yang kamu kirim di atas tidak memiliki
tanda “pagar” kode (chunks) yang benar
({r} ...).
Tanpa tanda itu, R Markdown menganggap kode ggplot di
bagian bawah hanyalah tulisan biasa, sehingga grafiknya
tidak digambar.
Berikut adalah perbaikan LENGKAP (dari ANOVA sampai
paling bawah). Silakan hapus bagian bawah file kamu
(mulai dari # ANOVA Satu Arah), lalu tempel
(paste) kode ini:
# ANOVA Satu Arah
``` r
# Kelompokkan provinsi berdasarkan wilayah
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-rata TPP SMA per Wilayah
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 |
# Cek dulu apakah Wilayah punya variasi
cat("Jumlah kategori Wilayah:\n")
## Jumlah kategori Wilayah:
print(table(Data$Wilayah))
##
## Indonesia Timur
## 42
# Hapus baris yang Wilayah-nya NA
Data_wilayah <- Data %>% filter(!is.na(Wilayah))
# Pastikan minimal ada 2 kategori
if (length(unique(Data_wilayah$Wilayah)) >= 2) {
# ANOVA
anova_wilayah <- aov(TPP_SMA ~ Wilayah, data = Data_wilayah)
print(summary(anova_wilayah))
# Tukey Post-hoc Test (jika signifikan)
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
# Boxplot untuk wilayah
plot_data <- Data %>%
filter(!is.na(Wilayah), !is.na(TPP_SMA))
ggplot(plot_data, aes(x = Wilayah, y = TPP_SMA, fill = Wilayah)) +
geom_boxplot() +
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 regresi
model_lm <- lm(TPP_SMA ~ IPM + AHH + APM_SMA, data = Data)
# Ringkasan model
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
# Diagnostic plots
par(mfrow = c(2, 2))
plot(model_lm)
par(mfrow = c(1, 1))
# Uji asumsi regresi
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
# --- INI BAGIAN REGRESSION PLOT YANG HILANG TADI ---
# Filter data yang lengkap untuk prediksi
complete_data <- Data %>%
filter(!is.na(TPP_SMA), !is.na(IPM), !is.na(AHH), !is.na(APM_SMA))
# Prediksi
complete_data$predicted <- predict(model_lm)
# Visualisasi
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()
Model regresi linear berganda menunjukkan bahwa IPM memiliki pengaruh paling signifikan terhadap TPP SMA, diikuti oleh AHH dan APM SMA. Model mampu menjelaskan sebagian besar variasi dalam TPP SMA, menunjukkan bahwa ketiga variabel prediktor ini relevan dan penting untuk memprediksi keberhasilan pendidikan.
Catatan: Data bersumber dari Badan Pusat Statistik (BPS) tahun 2023. Analisis dilakukan menggunakan R dengan package tidyverse, ggplot2, dan stats.