Dokumen ini merupakan analisis data sosial ekonomi Provinsi Jawa Timur tahun 2021–2023, mencakup variabel harga beras, harga cabai merah, curah hujan, dan inflasi di berbagai kota/kabupaten. Analisis ini merupakan bagian dari tugas ETS Business Intelligence Semester Genap 2024/2025.
# Install & Load Libraries
if (!require("readxl")) install.packages("readxl", repos="https://cloud.r-project.org")
if (!require("dplyr")) install.packages("dplyr", repos="https://cloud.r-project.org")
if (!require("ggplot2")) install.packages("ggplot2", repos="https://cloud.r-project.org")
if (!require("tidyr")) install.packages("tidyr", repos="https://cloud.r-project.org")
if (!require("lubridate")) install.packages("lubridate", repos="https://cloud.r-project.org")
if (!require("scales")) install.packages("scales", repos="https://cloud.r-project.org")
library(readxl)
library(dplyr)
library(ggplot2)
library(tidyr)
library(lubridate)
library(scales)
# Load Data
df <- read_excel("Data_Sosial_Ekonomi_Jatim_2021_2023.xlsx")
colnames(df) <- c("Tahun", "Bulan", "Kota", "Harga_Beras", "Harga_Cabai", "Curah_Hujan", "Inflasi")
# Buat kolom tanggal
bulan_urut <- c("January","February","March","April","May","June",
"July","August","September","October","November","December")
df$Bulan <- factor(df$Bulan, levels = bulan_urut)
df$Tanggal <- as.Date(paste(df$Tahun, match(df$Bulan, bulan_urut), "01", sep="-"))
glimpse(df)
## Rows: 360
## Columns: 8
## $ Tahun <dbl> 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021…
## $ Bulan <fct> January, February, March, April, May, June, July, August, …
## $ Kota <chr> "Surabaya", "Surabaya", "Surabaya", "Surabaya", "Surabaya"…
## $ Harga_Beras <dbl> 9835, 10561, 9954, 10471, 10455, 9981, 10243, 9852, 10470,…
## $ Harga_Cabai <dbl> 70344, 66055, 28795, 38820, 37771, 62924, 38782, 41320, 43…
## $ Curah_Hujan <dbl> 229, 376, 229, 141, 181, 57, 27, 13, 71, 170, 457, 317, 38…
## $ Inflasi <dbl> 2.39, 4.46, 2.83, 3.10, 4.18, 3.42, 4.24, 2.01, 4.42, 3.40…
## $ Tanggal <date> 2021-01-01, 2021-02-01, 2021-03-01, 2021-04-01, 2021-05-0…
Langkah pertama adalah menghitung statistik deskriptif (rata-rata, standar deviasi, minimum, dan maksimum) harga beras dan cabai merah untuk setiap kota/kabupaten.
stat_beras <- df %>%
group_by(Kota) %>%
summarise(
`Rata-rata Beras` = round(mean(Harga_Beras, na.rm = TRUE), 2),
`Std Dev Beras` = round(sd(Harga_Beras, na.rm = TRUE), 2),
`Min Beras` = min(Harga_Beras, na.rm = TRUE),
`Max Beras` = max(Harga_Beras, na.rm = TRUE)
)
stat_cabai <- df %>%
group_by(Kota) %>%
summarise(
`Rata-rata Cabai` = round(mean(Harga_Cabai, na.rm = TRUE), 2),
`Std Dev Cabai` = round(sd(Harga_Cabai, na.rm = TRUE), 2),
`Min Cabai` = min(Harga_Cabai, na.rm = TRUE),
`Max Cabai` = max(Harga_Cabai, na.rm = TRUE)
)
stat_gabung <- left_join(stat_beras, stat_cabai, by = "Kota")
knitr::kable(stat_gabung, caption = "Statistik Deskriptif Harga Beras dan Cabai per Kota (2021-2023)")
| Kota | Rata-rata Beras | Std Dev Beras | Min Beras | Max Beras | Rata-rata Cabai | Std Dev Cabai | Min Cabai | Max Cabai |
|---|---|---|---|---|---|---|---|---|
| Banyuwangi | 11402.17 | 1024.20 | 9648 | 13028 | 48493.83 | 16731.01 | 27407 | 79098 |
| Jember | 11480.69 | 1113.37 | 9699 | 13085 | 46177.11 | 16752.61 | 26247 | 76911 |
| Kediri | 11512.92 | 1125.30 | 9784 | 13330 | 45781.47 | 15006.23 | 29004 | 80916 |
| Madiun | 11384.28 | 897.45 | 9880 | 13104 | 47484.19 | 16624.80 | 25307 | 81426 |
| Malang | 11456.56 | 987.84 | 9853 | 12848 | 48102.47 | 15272.43 | 30184 | 80027 |
| Mojokerto | 11527.69 | 1068.31 | 9961 | 13183 | 46975.97 | 14656.14 | 25349 | 79413 |
| Pasuruan | 11484.72 | 1020.84 | 9928 | 13281 | 46833.17 | 15626.39 | 25639 | 80080 |
| Probolinggo | 11422.86 | 1030.64 | 9654 | 13085 | 47332.14 | 16799.64 | 28227 | 77197 |
| Surabaya | 11420.97 | 1034.22 | 9835 | 13305 | 47634.81 | 14581.84 | 28795 | 81260 |
| Tuban | 11465.28 | 1074.15 | 9723 | 13291 | 45754.44 | 16139.40 | 25510 | 79195 |
Interpretasi: Harga beras relatif stabil antar kota dengan rata-rata berkisar Rp 11.000-13.000/kg. Sebaliknya, harga cabai merah sangat bervariasi dengan standar deviasi tinggi, mencerminkan komoditas yang sangat sensitif terhadap musim dan pasokan.
ggplot(df, aes(x = reorder(Kota, Harga_Cabai, median), y = Harga_Cabai, fill = Kota)) +
geom_boxplot(outlier.colour = "red", outlier.shape = 8, outlier.size = 2) +
scale_y_continuous(labels = label_comma()) +
labs(
title = "Distribusi Harga Cabai Merah per Kota/Kabupaten (2021-2023)",
subtitle = "Provinsi Jawa Timur",
x = "Kota/Kabupaten",
y = "Harga Cabai Merah (Rp/kg)",
caption = "Titik merah: outlier ekstrem"
) +
theme_minimal(base_size = 12) +
theme(
legend.position = "none",
axis.text.x = element_text(angle = 30, hjust = 1),
plot.title = element_text(face = "bold"),
panel.grid.major = element_line(color = "grey90")
)
Kota dengan jumlah outlier terbanyak diidentifikasi menggunakan metode IQR (Interquartile Range).
ekstrem <- df %>%
group_by(Kota) %>%
summarise(
Q1 = quantile(Harga_Cabai, 0.25),
Q3 = quantile(Harga_Cabai, 0.75),
IQR = Q3 - Q1,
Batas_Atas = Q3 + 1.5 * IQR,
Max = max(Harga_Cabai),
Outlier_Count = sum(Harga_Cabai > Q3 + 1.5 * IQR | Harga_Cabai < Q1 - 1.5 * IQR)
) %>%
arrange(desc(Outlier_Count))
knitr::kable(ekstrem, caption = "Jumlah Outlier Harga Cabai per Kota")
| Kota | Q1 | Q3 | IQR | Batas_Atas | Max | Outlier_Count |
|---|---|---|---|---|---|---|
| Banyuwangi | 34880.75 | 65867.75 | 30987.00 | 112348.25 | 79098 | 0 |
| Jember | 32957.25 | 60035.25 | 27078.00 | 100652.25 | 76911 | 0 |
| Kediri | 32028.25 | 56823.50 | 24795.25 | 94016.38 | 80916 | 0 |
| Madiun | 37514.50 | 57031.50 | 19517.00 | 86307.00 | 81426 | 0 |
| Malang | 36366.00 | 61805.50 | 25439.50 | 99964.75 | 80027 | 0 |
| Mojokerto | 36617.25 | 58250.00 | 21632.75 | 90699.12 | 79413 | 0 |
| Pasuruan | 32496.50 | 61060.25 | 28563.75 | 103905.88 | 80080 | 0 |
| Probolinggo | 34441.50 | 66001.75 | 31560.25 | 113342.12 | 77197 | 0 |
| Surabaya | 37314.00 | 58845.00 | 21531.00 | 91141.50 | 81260 | 0 |
| Tuban | 33063.50 | 56556.00 | 23492.50 | 91794.75 | 79195 | 0 |
Interpretasi: Kota dengan outlier terbanyak cenderung mengalami harga cabai yang ekstrem. Fluktuasi ini biasanya terjadi pada musim kemarau panjang atau akibat bencana alam yang mengganggu distribusi komoditas.
Pada bagian ini dipilih dua kota representatif: Surabaya (kota terbesar) dan Banyuwangi (ujung timur Jawa Timur) untuk analisis deret waktu.
kota_pilih <- c("Surabaya", "Banyuwangi")
df_ts <- df %>% filter(Kota %in% kota_pilih)
ggplot(df_ts, aes(x = Tanggal, y = Harga_Beras, color = Kota, group = Kota)) +
geom_line(linewidth = 1) +
geom_point(size = 1.5) +
scale_y_continuous(labels = label_comma()) +
scale_x_date(date_breaks = "3 months", date_labels = "%b %Y") +
labs(
title = "Time Series Harga Beras - Surabaya & Banyuwangi (2021-2023)",
x = "Bulan",
y = "Harga Beras (Rp/kg)",
color = "Kota",
caption = "Sumber: Data Sosial Ekonomi Jawa Timur 2021-2023"
) +
theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(face = "bold"),
legend.position = "top"
)
ggplot(df_ts, aes(x = Tanggal, y = Harga_Cabai, color = Kota, group = Kota)) +
geom_line(linewidth = 1) +
geom_point(size = 1.5) +
scale_y_continuous(labels = label_comma()) +
scale_x_date(date_breaks = "3 months", date_labels = "%b %Y") +
labs(
title = "Time Series Harga Cabai Merah - Surabaya & Banyuwangi (2021-2023)",
x = "Bulan",
y = "Harga Cabai Merah (Rp/kg)",
color = "Kota",
caption = "Sumber: Data Sosial Ekonomi Jawa Timur 2021-2023"
) +
theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(face = "bold"),
legend.position = "top"
)
df_flukt_mark <- df_ts %>%
arrange(Kota, Tanggal) %>%
group_by(Kota) %>%
mutate(
Perubahan_Pct = (Harga_Cabai - lag(Harga_Cabai)) / lag(Harga_Cabai) * 100,
Fluktuasi = abs(Perubahan_Pct) > 20
)
# Tabel bulan dengan fluktuasi tajam
fluktuasi_tabel <- df_flukt_mark %>%
filter(Fluktuasi == TRUE) %>%
select(Kota, Tahun, Bulan, Harga_Cabai, Perubahan_Pct) %>%
mutate(Perubahan_Pct = round(Perubahan_Pct, 2)) %>%
arrange(desc(abs(Perubahan_Pct)))
knitr::kable(fluktuasi_tabel, caption = "Bulan dengan Fluktuasi Harga Cabai > 20%")
| Kota | Tahun | Bulan | Harga_Cabai | Perubahan_Pct |
|---|---|---|---|---|
| Banyuwangi | 2021 | December | 77856 | 133.28 |
| Banyuwangi | 2023 | December | 69818 | 132.42 |
| Banyuwangi | 2021 | June | 58325 | 103.34 |
| Banyuwangi | 2022 | December | 78782 | 87.46 |
| Surabaya | 2023 | June | 68610 | 71.07 |
| Surabaya | 2021 | June | 62924 | 66.59 |
| Surabaya | 2023 | December | 76131 | 65.90 |
| Banyuwangi | 2023 | May | 48348 | 60.95 |
| Surabaya | 2021 | March | 28795 | -56.41 |
| Surabaya | 2021 | December | 60168 | 54.10 |
| Banyuwangi | 2022 | June | 67046 | 53.90 |
| Banyuwangi | 2023 | July | 34040 | -53.84 |
| Banyuwangi | 2023 | June | 73747 | 52.53 |
| Surabaya | 2023 | November | 45891 | 50.66 |
| Surabaya | 2023 | July | 34429 | -49.82 |
| Surabaya | 2023 | January | 81260 | 48.82 |
| Banyuwangi | 2021 | March | 41862 | -47.08 |
| Surabaya | 2022 | June | 56641 | 46.53 |
| Surabaya | 2022 | March | 37809 | -42.65 |
| Banyuwangi | 2021 | July | 34319 | -41.16 |
| Banyuwangi | 2022 | July | 39583 | -40.96 |
| Surabaya | 2021 | July | 38782 | -38.37 |
| Banyuwangi | 2023 | April | 30039 | -35.43 |
| Surabaya | 2023 | April | 31114 | -35.20 |
| Banyuwangi | 2023 | November | 30039 | -35.14 |
| Surabaya | 2023 | October | 30459 | -34.83 |
| Surabaya | 2021 | April | 38820 | 34.82 |
| Banyuwangi | 2021 | September | 27407 | -33.93 |
| Surabaya | 2022 | July | 37906 | -33.08 |
| Banyuwangi | 2022 | March | 40281 | -32.73 |
| Surabaya | 2023 | March | 48013 | -32.10 |
| Surabaya | 2022 | November | 46941 | 31.35 |
| Surabaya | 2023 | August | 44784 | 30.08 |
| Banyuwangi | 2023 | September | 40223 | 29.75 |
| Banyuwangi | 2023 | March | 46521 | -28.95 |
| Surabaya | 2023 | May | 40107 | 28.90 |
| Banyuwangi | 2021 | October | 35068 | 27.95 |
| Banyuwangi | 2021 | May | 28684 | -27.45 |
| Banyuwangi | 2022 | October | 41355 | 25.48 |
| Banyuwangi | 2022 | May | 43565 | 23.85 |
| Banyuwangi | 2021 | August | 41483 | 20.87 |
ggplot(df_flukt_mark, aes(x = Tanggal, y = Harga_Cabai, color = Kota, group = Kota)) +
geom_line(linewidth = 1) +
geom_point(
data = filter(df_flukt_mark, Fluktuasi),
aes(x = Tanggal, y = Harga_Cabai),
color = "red", size = 4, shape = 17
) +
scale_y_continuous(labels = label_comma()) +
scale_x_date(date_breaks = "3 months", date_labels = "%b %Y") +
labs(
title = "Fluktuasi Tajam Harga Cabai Merah (segitiga merah = perubahan >20%)",
subtitle = "Surabaya & Banyuwangi, 2021-2023",
x = "Bulan",
y = "Harga Cabai (Rp/kg)",
color = "Kota"
) +
theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(face = "bold"),
legend.position = "top"
)
Interpretasi: Lonjakan tajam harga cabai umumnya terjadi pada pertengahan tahun (Juni-Agustus) yang merupakan musim kemarau, menyebabkan gagal panen dan kekurangan pasokan. Penurunan tajam terjadi setelah musim hujan dimulai (Oktober-Desember).
musiman <- df_ts %>%
group_by(Kota, Bulan) %>%
summarise(
Rata_Beras = mean(Harga_Beras),
Rata_Cabai = mean(Harga_Cabai),
.groups = "drop"
)
ggplot(musiman, aes(x = Bulan, y = Rata_Cabai, color = Kota, group = Kota)) +
geom_line(linewidth = 1.2) +
geom_point(size = 2.5) +
scale_y_continuous(labels = label_comma()) +
labs(
title = "Pola Musiman Rata-rata Harga Cabai Merah (2021-2023)",
subtitle = "Rata-rata 3 tahun per bulan - Surabaya & Banyuwangi",
x = "Bulan",
y = "Rata-rata Harga Cabai (Rp/kg)",
color = "Kota"
) +
theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(face = "bold"),
legend.position = "top"
)
Interpretasi: Terdapat pola musiman tahunan yang jelas pada harga cabai merah. Harga cenderung tinggi pada bulan Juni-September (musim kemarau) dan rendah pada November-Februari (musim hujan, panen raya). Harga beras lebih stabil sepanjang tahun dengan fluktuasi musiman yang kecil.
Pada bagian ini dianalisis hubungan antara harga cabai merah dengan dua variabel prediktor: inflasi dan curah hujan.
ggplot(df, aes(x = Inflasi, y = Harga_Cabai, color = Kota)) +
geom_point(alpha = 0.6, size = 2) +
geom_smooth(aes(group = Kota), method = "lm", se = FALSE, linewidth = 0.8) +
scale_y_continuous(labels = label_comma()) +
facet_wrap(~Kota, ncol = 5) +
labs(
title = "Scatter Plot - Inflasi vs Harga Cabai Merah per Kota",
subtitle = "Garis regresi linear per kota (2021-2023)",
x = "Tingkat Inflasi (%)",
y = "Harga Cabai Merah (Rp/kg)"
) +
theme_minimal(base_size = 10) +
theme(
legend.position = "none",
plot.title = element_text(face = "bold"),
strip.text = element_text(face = "bold")
)
ggplot(df, aes(x = Curah_Hujan, y = Harga_Cabai, color = Kota)) +
geom_point(alpha = 0.6, size = 2) +
geom_smooth(aes(group = Kota), method = "lm", se = FALSE, linewidth = 0.8) +
scale_y_continuous(labels = label_comma()) +
facet_wrap(~Kota, ncol = 5) +
labs(
title = "Scatter Plot - Curah Hujan vs Harga Cabai Merah per Kota",
subtitle = "Garis regresi linear per kota (2021-2023)",
x = "Curah Hujan (mm/bulan)",
y = "Harga Cabai Merah (Rp/kg)"
) +
theme_minimal(base_size = 10) +
theme(
legend.position = "none",
plot.title = element_text(face = "bold"),
strip.text = element_text(face = "bold")
)
kor_per_kota <- df %>%
group_by(Kota) %>%
summarise(
Kor_Inflasi_Cabai = round(cor(Inflasi, Harga_Cabai, use = "complete.obs"), 3),
Kor_Hujan_Cabai = round(cor(Curah_Hujan, Harga_Cabai, use = "complete.obs"), 3)
)
knitr::kable(kor_per_kota, caption = "Korelasi Inflasi dan Curah Hujan terhadap Harga Cabai per Kota")
| Kota | Kor_Inflasi_Cabai | Kor_Hujan_Cabai |
|---|---|---|
| Banyuwangi | 0.052 | 0.453 |
| Jember | 0.242 | 0.105 |
| Kediri | -0.220 | 0.303 |
| Madiun | -0.109 | 0.332 |
| Malang | -0.105 | 0.334 |
| Mojokerto | -0.062 | 0.463 |
| Pasuruan | 0.045 | 0.328 |
| Probolinggo | -0.116 | 0.455 |
| Surabaya | -0.254 | 0.395 |
| Tuban | 0.137 | 0.266 |
# Uji korelasi keseluruhan (semua kota)
cor_test_inflasi <- cor.test(df$Inflasi, df$Harga_Cabai)
cor_test_hujan <- cor.test(df$Curah_Hujan, df$Harga_Cabai)
hasil_kor <- data.frame(
Variabel = c("Inflasi vs Harga Cabai", "Curah Hujan vs Harga Cabai"),
Korelasi_r = round(c(cor_test_inflasi$estimate, cor_test_hujan$estimate), 3),
P_Value = round(c(cor_test_inflasi$p.value, cor_test_hujan$p.value), 4),
Signifikan = c(
ifelse(cor_test_inflasi$p.value < 0.05, "Ya (p<0.05)", "Tidak"),
ifelse(cor_test_hujan$p.value < 0.05, "Ya (p<0.05)", "Tidak")
)
)
knitr::kable(hasil_kor, caption = "Uji Korelasi Keseluruhan (Semua Kota, 2021-2023)")
| Variabel | Korelasi_r | P_Value | Signifikan |
|---|---|---|---|
| Inflasi vs Harga Cabai | -0.033 | 0.5317 | Tidak |
| Curah Hujan vs Harga Cabai | 0.344 | 0.0000 | Ya (p<0.05) |
Interpretasi:
- Inflasi menunjukkan korelasi lemah dan tidak signifikan terhadap harga cabai (r = -0.033, p > 0.05). Inflasi dipengaruhi banyak faktor lain di luar harga cabai.
- Curah Hujan berkorelasi positif dan signifikan terhadap harga cabai (r = 0.344, p < 0.001). Curah hujan berlebih justru dapat merusak panen cabai sehingga harga naik.
- Kesimpulan: Curah hujan berpengaruh signifikan terhadap harga cabai merah, sedangkan inflasi tidak menunjukkan pengaruh yang signifikan secara statistik.