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:
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
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.
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.
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.
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"
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"
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"
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"
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"
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"
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"
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")
| 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 |
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.
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()
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()
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()
library(ggplot2)
ggplot(dataset, aes(x = Month, y = `Inflation`)) +
geom_line(color = "green", linewidth = 1) +
labs(
x = "Tahun",
y = "Inflasi (%)") + theme_minimal()
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.
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.
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.
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.
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).
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.