1. Deskripsi Data

Analisis ini menggunakan set data berjudul Commodity Prices and Weather Data in Kota Singkawang. Data ini berisi catatan bulanan harga komoditas pangan utama dan kondisi cuaca di Kota Singkawang, Kalimantan Barat, dari Januari 2016 sampai Desember 2023 (96 bulan).

Data memiliki 8 kolom:

  • Month: tanggal awal tiap bulan (penanda waktu, tidak dihitung statistiknya).
  • Cayenne Price (Rp): harga cabai rawit per bulan.
  • Red Chili Price (Rp): harga cabai merah per bulan.
  • Shallot Price (Rp): harga bawang merah per bulan.
  • Garlic Price (Rp): harga bawang putih per bulan.
  • Rainfall (mm): curah hujan per bulan dalam milimeter.
  • Number of Rainy Days: jumlah hari hujan dalam satu bulan.
  • Inflation: tingkat inflasi bulanan dalam persen. Nilai negatif berarti deflasi.

Data mentah asli bersumber dari Badan Pusat Statistik (BPS). Penulis dataset di Mendeley Data telah membersihkan, menggabungkan, dan mempublikasikan data tersebut agar siap pakai. Link sumber di bawah ini mencakup raw data dari BPS dan versi yang sudah diproses.

Sumber data: https://data.mendeley.com/datasets/79bmb9vkwk/3

Kredit penulis: Lestari, D. R., Bangun, E. A. S., Gaol, F., & Matsuo, T. (2025). Commodity Prices and Weather Data in Kota Singkawang. Mendeley Data, V3. doi: 10.17632/79bmb9vkwk.3

2. Tools yang Digunakan

Analisis dilakukan dengan bahasa pemrograman R di RStudio. Paket yang dipakai adalah readxl untuk membaca file Excel dan tidyverse untuk melihat struktur data. Laporan disusun dengan R Markdown dan dipublikasikan melalui RPubs.

3. Persiapan Data

Langkah pertama: membaca data, lalu mengecek ukuran, nilai kosong, dan ringkasan awal.

library(readxl)
library(tidyverse)

dataset <- read_excel("dataset.xlsx")
glimpse(dataset)
## Rows: 96
## Columns: 8
## $ Month                  <dttm> 2016-01-01, 2016-02-01, 2016-03-01, 2016-04-01…
## $ `Rainfall (mm)`        <dbl> 313, 170, 391, 35, 385, 219, 143, 23, 138, 207,…
## $ `Cayenne Price (Rp)`   <dbl> 36458, 41042, 54700, 55125, 49167, 50667, 51542…
## $ `Red Chili Price (Rp)` <dbl> 27500, 32083, 37500, 38333, 39333, 41208, 40750…
## $ `Shallot Price (Rp)`   <dbl> 36958, 31083, 40367, 48375, 49333, 39208, 39708…
## $ `Garlic Price  (Rp)`   <dbl> 29917, 31167, 33300, 36083, 35767, 35458, 34542…
## $ `Number of Rainy Days` <dbl> 22, 18, 13, 12, 22, 17, 10, 4, 15, 19, 26, 20, …
## $ Inflation              <dbl> 0.13, 0.39, 0.42, 0.23, 0.64, 1.28, 2.07, 2.87,…
dim(dataset)          # jumlah baris dan kolom
## [1] 96  8
colSums(is.na(dataset))  # jumlah data kosong tiap kolom
##                Month        Rainfall (mm)   Cayenne Price (Rp) 
##                    0                    0                    0 
## Red Chili Price (Rp)   Shallot Price (Rp)   Garlic Price  (Rp) 
##                    0                    0                    0 
## Number of Rainy Days            Inflation 
##                    0                    0
summary(dataset)      # ringkasan cepat semua kolom
##      Month                     Rainfall (mm)   Cayenne Price (Rp)
##  Min.   :2016-01-01 00:00:00   Min.   : 23.0   Min.   : 35125    
##  1st Qu.:2017-12-24 06:00:00   1st Qu.:137.1   1st Qu.: 52327    
##  Median :2019-12-16 12:00:00   Median :210.5   Median : 59482    
##  Mean   :2019-12-16 11:00:00   Mean   :233.8   Mean   : 60705    
##  3rd Qu.:2021-12-08 18:00:00   3rd Qu.:315.0   3rd Qu.: 64374    
##  Max.   :2023-12-01 00:00:00   Max.   :722.0   Max.   :127917    
##  Red Chili Price (Rp) Shallot Price (Rp) Garlic Price  (Rp)
##  Min.   :25933        Min.   :19458      Min.   :14200     
##  1st Qu.:41240        1st Qu.:27708      1st Qu.:22998     
##  Median :47222        Median :30620      Median :26438     
##  Mean   :49738        Mean   :31994      Mean   :27823     
##  3rd Qu.:55612        3rd Qu.:36896      3rd Qu.:33483     
##  Max.   :86667        Max.   :50286      Max.   :62400     
##  Number of Rainy Days   Inflation     
##  Min.   : 2.00        Min.   :-0.290  
##  1st Qu.:10.00        1st Qu.: 1.127  
##  Median :13.00        Median : 1.745  
##  Mean   :14.42        Mean   : 2.000  
##  3rd Qu.:19.00        3rd Qu.: 2.615  
##  Max.   :30.00        Max.   : 5.960
head(dataset)         # tampilkan 6 baris pertama saja
## # A tibble: 6 × 8
##   Month               `Rainfall (mm)` `Cayenne Price (Rp)`
##   <dttm>                        <dbl>                <dbl>
## 1 2016-01-01 00:00:00             313                36458
## 2 2016-02-01 00:00:00             170                41042
## 3 2016-03-01 00:00:00             391                54700
## 4 2016-04-01 00:00:00              35                55125
## 5 2016-05-01 00:00:00             385                49167
## 6 2016-06-01 00:00:00             219                50667
## # ℹ 5 more variables: `Red Chili Price (Rp)` <dbl>, `Shallot Price (Rp)` <dbl>,
## #   `Garlic Price  (Rp)` <dbl>, `Number of Rainy Days` <dbl>, Inflation <dbl>

Data terdiri dari 96 baris dan 8 kolom, dan tidak ada nilai kosong di kolom mana pun.

4. Statistik Deskriptif per Variabel

Untuk tiap variabel kami hitung mean, median, modus, simpangan baku (SD), serta bulan tertinggi dan terendah. Hasil tiap baris kode muncul berurutan: mean, median, modus, SD, SD/Mean (%), bulan tertinggi, bulan terendah. Modus dihitung dengan membagi data menjadi 5 kelas berlebar sama, lalu mengambil kelas yang paling sering muncul. Kolom SD/Mean menunjukkan seberapa besar variasi data dibandingkan rata-ratanya.

4.1 Cabai Rawit

rawit <- dataset$`Cayenne Price (Rp)`

mean(rawit)
## [1] 60704.79
median(rawit)
## [1] 59482
names(which.max(table(cut(rawit, breaks = 5))))   # modus (kelas)
## [1] "(5.37e+04,7.22e+04]"
sd(rawit)
## [1] 14300.57
sd(rawit) / mean(rawit) * 100                  # SD/Mean (%)
## [1] 23.55757
dataset$Month[which.max(rawit)]              # bulan tertinggi
## [1] "2017-02-01 UTC"
dataset$Month[which.min(rawit)]              # bulan terendah
## [1] "2019-12-01 UTC"

4.2 Cabai Merah

merah <- dataset$`Red Chili Price (Rp)`

mean(merah)
## [1] 49738.45
median(merah)
## [1] 47222
names(which.max(table(cut(merah, breaks = 5))))   # modus (kelas)
## [1] "(3.81e+04,5.02e+04]"
sd(merah)
## [1] 12821.29
sd(merah) / mean(merah) * 100                  # SD/Mean (%)
## [1] 25.77743
dataset$Month[which.max(merah)]              # bulan tertinggi
## [1] "2019-10-01 UTC"
dataset$Month[which.min(merah)]              # bulan terendah
## [1] "2017-06-01 UTC"

4.3 Bawang Merah

bawang_merah <- dataset$`Shallot Price (Rp)`

mean(bawang_merah)
## [1] 31993.73
median(bawang_merah)
## [1] 30620
names(which.max(table(cut(bawang_merah, breaks = 5))))   # modus (kelas)
## [1] "(2.56e+04,3.18e+04]"
sd(bawang_merah)
## [1] 6922.853
sd(bawang_merah) / mean(bawang_merah) * 100                  # SD/Mean (%)
## [1] 21.63816
dataset$Month[which.max(bawang_merah)]              # bulan tertinggi
## [1] "2022-07-01 UTC"
dataset$Month[which.min(bawang_merah)]              # bulan terendah
## [1] "2018-10-01 UTC"

4.4 Bawang Putih

bawang_putih <- dataset$`Garlic Price  (Rp)`

mean(bawang_putih)
## [1] 27822.91
median(bawang_putih)
## [1] 26437.5
names(which.max(table(cut(bawang_putih, breaks = 5))))   # modus (kelas)
## [1] "(2.38e+04,3.35e+04]"
sd(bawang_putih)
## [1] 7271.638
sd(bawang_putih) / mean(bawang_putih) * 100                  # SD/Mean (%)
## [1] 26.13544
dataset$Month[which.max(bawang_putih)]              # bulan tertinggi
## [1] "2017-05-01 UTC"
dataset$Month[which.min(bawang_putih)]              # bulan terendah
## [1] "2020-07-01 UTC"

4.5 Curah Hujan

hujan <- dataset$`Rainfall (mm)`

mean(hujan)
## [1] 233.776
median(hujan)
## [1] 210.5
names(which.max(table(cut(hujan, breaks = 5))))   # modus (kelas)
## [1] "(163,303]"
sd(hujan)
## [1] 136.3022
sd(hujan) / mean(hujan) * 100                  # SD/Mean (%)
## [1] 58.3046
dataset$Month[which.max(hujan)]              # bulan tertinggi
## [1] "2020-07-01 UTC"
dataset$Month[which.min(hujan)]              # bulan terendah
## [1] "2016-08-01 UTC"

4.6 Hari Hujan

hari_hujan <- dataset$`Number of Rainy Days`

mean(hari_hujan)
## [1] 14.41667
median(hari_hujan)
## [1] 13
names(which.max(table(cut(hari_hujan, breaks = 5))))   # modus (kelas)
## [1] "(7.6,13.2]"
sd(hari_hujan)
## [1] 6.543243
sd(hari_hujan) / mean(hari_hujan) * 100                  # SD/Mean (%)
## [1] 45.38666
dataset$Month[which.max(hari_hujan)]              # bulan tertinggi
## [1] "2022-06-01 UTC"
dataset$Month[which.min(hari_hujan)]              # bulan terendah
## [1] "2019-08-01 UTC"

4.7 Inflasi

inflasi <- dataset$Inflation

mean(inflasi)
## [1] 2.000417
median(inflasi)
## [1] 1.745
names(which.max(table(cut(inflasi, breaks = 5))))   # modus (kelas)
## [1] "(0.96,2.21]"
sd(inflasi)
## [1] 1.33084
sd(inflasi) / mean(inflasi) * 100                  # SD/Mean (%)
## [1] 66.52813
dataset$Month[which.max(inflasi)]              # bulan tertinggi
## [1] "2022-12-01 UTC"
dataset$Month[which.min(inflasi)]              # bulan terendah
## [1] "2021-03-01 UTC"

4.8 Ringkasan Statistik Deskriptif

modus_kelas <- function(x) {
  names(which.max(table(cut(x, breaks = 5, dig.lab = 6))))
}

ringkasan <- data.frame(
  Variabel = c("Cabai Rawit", "Cabai Merah", "Bawang Merah",
               "Bawang Putih", "Curah Hujan", "Hari Hujan", "Inflasi"),
  Mean     = c(mean(rawit), mean(merah), mean(bawang_merah),
               mean(bawang_putih), mean(hujan), mean(hari_hujan), mean(inflasi)),
  Median   = c(median(rawit), median(merah), median(bawang_merah),
               median(bawang_putih), median(hujan), median(hari_hujan), median(inflasi)),
  Modus    = c(modus_kelas(rawit), modus_kelas(merah), modus_kelas(bawang_merah),
               modus_kelas(bawang_putih), modus_kelas(hujan),
               modus_kelas(hari_hujan), modus_kelas(inflasi)),
  SD       = c(sd(rawit), sd(merah), sd(bawang_merah),
               sd(bawang_putih), sd(hujan), sd(hari_hujan), sd(inflasi))
)

ringkasan$Mean   <- round(ringkasan$Mean, 1)
ringkasan$Median <- round(ringkasan$Median, 1)
ringkasan$SD     <- round(ringkasan$SD, 1)

knitr::kable(ringkasan, align = "lrrrr",
             caption = "Ringkasan Statistik Deskriptif")
Ringkasan Statistik Deskriptif
Variabel Mean Median Modus SD
Cabai Rawit 60704.8 59482.0 (53683.4,72241.8] 14300.6
Cabai Merah 49738.4 47222.0 (38079.8,50226.6] 12821.3
Bawang Merah 31993.7 30620.0 (25623.6,31789.2] 6922.9
Bawang Putih 27822.9 26437.5 (23840,33480] 7271.6
Curah Hujan 233.8 210.5 (162.8,302.6] 136.3
Hari Hujan 14.4 13.0 (7.6,13.2] 6.5
Inflasi 2.0 1.7 (0.96,2.21] 1.3

5. Plot

Kami memilih line plot untuk memvisualisasikan data harga karena format ini paling efektif menampilkan pola time-series. Garis yang menghubungkan setiap titik data memudahkan pembaca melihat tren jangka panjang, pola musiman, dan volatilitas harga secara kronologis selama periode 96 bulan. Penggabungan keempat komoditas dalam satu grafik juga memungkinkan perbandingan pergerakan harga secara langsung.

Grafik Harga Komoditas (Gabungan)

Keempat harga komoditas digabung dalam satu grafik supaya pergerakannya mudah dibandingkan.

library(ggplot2)

ggplot(dataset, aes(x = Month)) +
  geom_line(aes(y = `Cayenne Price (Rp)`, color = "Cabai Rawit"), linewidth = 1) +
  geom_line(aes(y = `Red Chili Price (Rp)`, color = "Cabai Merah"), linewidth = 1) +
  geom_line(aes(y = `Shallot Price (Rp)`, color = "Bawang Merah"), linewidth = 1) +
  geom_line(aes(y = `Garlic Price  (Rp)`, color = "Bawang Putih"), linewidth = 1) +
  scale_color_manual(values = c("Cabai Rawit" = "red",
                                "Cabai Merah" = "darkorange",
                                "Bawang Merah" = "purple",
                                "Bawang Putih" = "black")) +
  labs(
    x = "Tahun",
    y = "Harga (Rp)",
    color = "Komoditas"
  ) +
  theme_minimal()

Grafik Curah Hujan per Bulan

library(ggplot2)

ggplot(dataset, aes(x = Month, y = `Rainfall (mm)`)) +
  geom_line(color = "blue", linewidth = 1) +
  labs(
    x = "Tahun",
    y = "Curah Hujan (mm)") + theme_minimal()

Grafik Jumlah Hari Hujan

library(ggplot2)

ggplot(dataset, aes(x = Month, y = `Number of Rainy Days`)) +
  geom_line(color = "yellow", linewidth = 1) +
  labs(
    x = "Tahun",
    y = "Hari Hujan") + theme_minimal()

Grafik Inflasi (%)

library(ggplot2)

ggplot(dataset, aes(x = Month, y = `Inflation`)) +
  geom_line(color = "green", linewidth = 1) +
  labs(
    x = "Tahun",
    y = "Inflasi (%)") + theme_minimal()

6. Interpretasi

6.1 Perbandingan Harga Antar Komoditas

Tabel berikut membandingkan rata-rata harga tiap komoditas pada setiap tahun.

tahun <- format(dataset$Month, "%Y")

tabel_harga <- data.frame(
  Tahun = sort(unique(tahun)),
  rawit = round(tapply(rawit, tahun, mean)),
  merah = round(tapply(merah, tahun, mean)),
  bawang_merah = round(tapply(bawang_merah, tahun, mean)),
  bawang_putih = round(tapply(bawang_putih, tahun, mean)),
  row.names = NULL
)

knitr::kable(
  tabel_harga,
  col.names = c("Tahun", "Cabai Rawit (Rp)", "Cabai Merah (Rp)",
                "Bawang Merah (Rp)", "Bawang Putih (Rp)"),
  format.args = list(big.mark = ".", decimal.mark = ","),
  align = "c"
)
Tahun Cabai Rawit (Rp) Cabai Merah (Rp) Bawang Merah (Rp) Bawang Putih (Rp)
2016 55.136 38.369 39.790 34.518
2017 61.343 39.392 28.535 31.813
2018 56.598 63.005 25.558 21.594
2019 63.550 68.713 25.558 26.360
2020 60.445 45.756 37.075 27.000
2021 67.608 49.429 30.383 24.899
2022 61.593 46.595 36.093 24.794
2023 59.365 46.649 32.958 31.606

Dari tabel terlihat bahwa harga rata-rata cabai rawit tertinggi terjadi pada 2021 (Rp67.608) dan terendah pada 2016 (Rp55.136). Cabai merah melonjak tajam pada 2018 (Rp63.005) dan 2019 (Rp68.713), padahal pada 2017 rata-ratanya hanya Rp39.392, lalu turun kembali setelah 2019. Bawang merah dan bawang putih tertinggi pada 2016 (Rp39.790 dan Rp34.518), sedangkan terendahnya sekitar 2018 dan 2019 untuk bawang merah (Rp25.558) dan 2018 untuk bawang putih (Rp21.594). Pola ini menguatkan temuan sebelumnya: harga tiap komoditas naik dan turun pada waktu yang berbeda.

6.2 Rata-rata, Median, dan Modus

Pada ketujuh variabel, rata-rata sedikit lebih besar daripada median. Artinya ada beberapa bulan ketika nilainya melonjak tinggi dan menarik rata-rata ke atas. Kelas modus pada semua variabel juga memuat nilai mediannya, jadi titik pusat data cukup konsisten. Pada hari hujan, kelas modusnya 7,6 sampai 13,2 hari, sementara rata-ratanya 14,4 hari, yang menunjukkan adanya bulan-bulan dengan hari hujan sangat banyak.

6.3 Kestabilan Harga

Dalam rupiah, simpangan baku cabai (Rp12.821 sampai Rp14.301) sekitar dua kali lipat simpangan baku bawang (Rp6.923 sampai Rp7.272). Namun jika dibandingkan dengan harga rata-ratanya, variasi keempat komoditas berdekatan, yaitu 21,6% sampai 26,1%. Jadi harga cabai bergerak lebih lebar dalam rupiah karena tingkat harganya memang lebih tinggi, bukan karena naik turunnya jauh lebih tajam secara relatif. Bawang putih bahkan memiliki variasi relatif tertinggi (26,1%) di antara keempat komoditas.

Lonjakan harga tertinggi tiap komoditas tidak terjadi bersamaan. Cabai rawit memuncak pada Februari 2017, bawang putih pada Mei 2017, cabai merah pada Oktober 2019, dan bawang merah pada Juli 2022.

6.4 Faktor Cuaca

Curah hujan bervariasi sangat besar antar bulan. Rata-ratanya 233,8 mm per bulan, tetapi simpangan baku 136,3 mm (sekitar 58% dari rata-rata) menunjukkan perbedaan tajam antara bulan kering dan bulan basah. Curah hujan tertinggi terjadi pada Juli 2020 dan terendah pada Agustus 2016.

Singkawang rata-rata mengalami 14,4 hari hujan per bulan, atau sekitar separuh bulan. Hari hujan terbanyak tercatat pada Juni 2022 dan tersedikit pada Agustus 2019.

6.5 Inflasi

Inflasi rata-rata 2,00% dengan kelas modus 0,96% sampai 2,21%, sehingga tergolong rendah. Simpangan baku 1,33 poin persen (sekitar 66% dari rata-rata) menunjukkan laju inflasi bulanan cukup berubah-ubah. Inflasi tertinggi tercatat pada Desember 2022. Pada Maret 2021 inflasi turun ke nilai terendah, yaitu negatif (deflasi).

7. Kesimpulan

Berdasarkan data Kota Singkawang periode 2016 sampai 2023, harga cabai lebih tinggi daripada harga bawang, dan secara nominal bergerak lebih lebar. Jika dibandingkan dengan harga rata-ratanya, tingkat fluktuasi cabai dan bawang tidak jauh berbeda. Curah hujan, hari hujan, dan inflasi juga menunjukkan variasi bulanan yang besar.

Rata-rata yang sedikit di atas median pada semua variabel menunjukkan adanya bulan-bulan dengan lonjakan nilai. Karena itu, rata-rata saja tidak cukup untuk menggambarkan kondisi data. Median, modus, dan ukuran sebaran perlu dibaca bersama.