Eksplorasi Data Sosial Ekonomi Jawa Timur 2021–2023

Latar Belakang

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…

Soal 1 – Eksplorasi Data

1a. Statistik Deskriptif per Kota

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)")
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.


1b. Boxplot Distribusi Harga Cabai Merah per Kota

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")
  )


1c. Identifikasi Kota dengan Harga Cabai Ekstrem

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")
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.


Soal 2 – Visualisasi Time Series

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)

2a. Time Series Harga Beras dan Cabai Merah

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"
  )


2b. Identifikasi Fluktuasi Tajam Harga Cabai (>20% per Bulan)

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%")
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).


2c. Analisis Pola Musiman

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.


Soal 3 – Analisis Hubungan Antar Variabel

Pada bagian ini dianalisis hubungan antara harga cabai merah dengan dua variabel prediktor: inflasi dan curah hujan.

3a. Scatter Plot: Inflasi dan Curah Hujan vs Harga Cabai

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")
  )


3b. Korelasi dan Uji Signifikansi

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")
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)")
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.