Repositori ini untuk memperkirakan konsumsi listrik Jerman.
Berdasarkan dan terinspirasi dari:
Sumber data: SMARD
Masukkan semua file yang diunduh ke:
/example/dataset # there is already used dataset included if you pull, but you could update
Periksa file perkiraan.Rmd untuk melihat bagaimana Anda dapat menjalankan kode ini pada Versi SMARD-Data yang diperbarui.
Perpustakaan Bekas:
# Probably needed
# Load Packages
# library(fhswf)
# library(tsibbledata)
# library(broom)
# library(readr)
# library(datasets)
# library(timeDate)
# library(qlcal)
# library(corrplot)
# library(mgcv)
# library(MEFM)
# library(TTR)
packages <- c(
"devtools",
"ggplot2",
"dplyr",
"tsibble",
"fable",
"fabletools",
"feasts",
"distributional",
"lubridate",
"tidyr",
"forecast",
"zoo",
"scales",
"fable.prophet"
)
install.packages(packages)
library(devtools)
library(ggplot2)
library(dplyr)
library(tsibble)
library(fable)
library(fabletools)
library(feasts)
library(distributional)
library(lubridate)
library(tidyr)
library(forecast)
library(zoo)
library(scales)
library(fable.prophet)
Cobalah bekerja di folder contoh/ untuk memulai.
# Define datapaths
power_consum_path <- "dataset\stunde_2015_2024\Realisierter_Stromverbrauch_201501010000_202407090000_Stunde.csv"
power_consum_smard_prediction_path <- "dataset\propgnose_vom_smard\Prognostizierter_Stromverbrauch_202401010000_202407090000_Stunde.csv"
# Load Smard Prediction
power_consum_smard_prediction_loaded <- load_power_consum(path=power_consum_smard_prediction_path)
raw_smard_pred <- power_consum_smard_prediction_loaded$raw_data
cleaned_smard_pred <- power_consum_smard_prediction_loaded$cleaned_data
cleaned_smard_pred <- cleaned_smard_pred |>
mutate(.model = "SMARD")
names(cleaned_smard_pred)[names(cleaned_smard_pred) == "PowerConsum"] <- ".mean"
# Load PowerConsum Data
power_consum_loaded <- load_power_consum(path=power_consum_path)
raw_power_consum <- power_consum_loaded$raw_data
cleaned_power_consum <- power_consum_loaded$cleaned_data
# Generate more features
cleaned_power_consum$localName[is.na(cleaned_power_consum$localName)] = "Working-Day"
cleaned_power_consum$MeanLastWeek <- rollapply(cleaned_power_consum$PowerConsum, width = 24*8, FUN = function(x) mean(x[1:(24*8-25)]), align = "right", fill = NA)
cleaned_power_consum$MeanLastTwoDays <- rollapply(cleaned_power_consum$PowerConsum, width = 24*3, FUN = function(x) mean(x[1:(24*3-25)]), align = "right", fill = NA)
cleaned_power_consum$MaxLastOneDay <- rollapply(cleaned_power_consum$PowerConsum, width = 24*2, FUN = function(x) max(x[1:(24*2-25)]), align = "right", fill = NA)
cleaned_power_consum$MinLastOneDay <- rollapply(cleaned_power_consum$PowerConsum, width = 24*2, FUN = function(x) min(x[1:(24*2-25)]), align = "right", fill = NA)
Fitur berikut dihasilkan dari kumpulan data dan API Liburan:
Indeks | Nama Kolom | Keterangan |
---|---|---|
1 | TanggalDari | Untuk validasi DateIndex (serupa, tetapi mentah) |
2 | Konsumsi Daya | Konsumsi Daya dalam MW |
3 | Indeks Tanggal | Stempel waktu (yyyy-mm-dd jj:mm:ss) |
4 | Hari kerja | Mo, Di, Mi, Do, Fr, Sa, So (Hari kerja dalam bahasa Jerman) |
5 | Tanggal | Tanggal (yyyy-mm-dd) |
6 | Tahun | Tahun yyyy |
7 | Pekan | Minggu nomor 0-53 |
8 | Jam | Jam nomor 0-24 |
9 | Bulan | Bulan nomor 1-12 |
10 | Nama lokal | Nama Hari Libur untuk Stempel Waktu |
11 | Hari kerja | 1/0 Jika Hari Kerja (Werktag) maka 1 |
12 | Mo | 1/0 Jika Senin maka 1 |
13 | Di | 1/0 Jika Selasa maka 1 |
14 | Saya | 1/0 Jika Rabu maka 1 |
15 | Melakukan | 1/0 Jika Kamis maka 1 |
16 | Pdt | 1/0 Jika hari Jumat maka 1 |
17 | Sa | 1/0 Jika hari Sabtu maka 1 |
18 | Jadi | 1/0 Jika hari Minggu maka 1 (tidak diperlukan, jika digunakan Senin-Sabtu) |
19 | Hari libur | 1/0 Jika hari libur maka 1 |
20 | Hari KerjaLiburanAkhir Pekan | Jika hari libur, akhir pekan, atau hari kerja (untuk Plot adalah Char.) |
21 | Hari Libur dan Hari Kerja | 1/0 Jika Hari Libur jatuh pada Hari Kerja maka 1 |
22 | Hari Terakhir Bukan Hari Kerja | 1/0 Jika hari terakhir bukan Hari Kerja maka 1 |
23 | Hari Terakhir Bukan Hari Kerja Dan Sekarang Hari Kerja | 1/0 Jika hari terakhir bukan Hari Kerja dan sekarang Hari Kerja maka 1 |
24 | Hari BerikutnyaBukanHari KerjaDanSekarangHari Kerja | 1/0 Jika hari berikutnya bukan Hari Kerja dan sekarang adalah hari kerja maka 1 |
25 | Hari Terakhir Adalah Hari Libur Dan Bukan Akhir Pekan | 1/0 Jika hari terakhir adalah hari libur dan bukan akhir pekan maka 1 |
26 | Hari Berikutnya Adalah Hari Libur Dan Bukan Akhir Pekan | 1/0 Jika hari berikutnya adalah hari libur dan bukan akhir pekan maka 1 |
27 | Nama Liburan | mirip dengan localName (Nama hari libur) |
28 | Akhir Tahun Ini | 1/0 Jika akhir tahun (Minggu 52 atau 53) |
29 | Minggu Pertama Tahun Ini | 1/0 Jika ini awal tahun (Minggu 1) |
30 | Liburan Diperpanjang | 1/0 Liburan Tertinggal (6 Jam ke hari berikutnya) |
31 | Liburan Dihaluskan | LiburanPerpanjang + sin(2*pi(Jam)+1)/24) |
32 | BerartiMinggu Terakhir | Rata-rata Konsumsi Daya Minggu Terakhir (Shift: 24*8-25) |
33 | Berarti Dua Hari Terakhir | Rata-rata PowerConsum dalam dua hari terakhir (Shift: 24*3-25) |
34 | MaxLastOneDay | Konsumsi Daya Maks pada Hari terakhir (Shift: 24*2-25) |
35 | MinLastOneDay | Min PowerConsum pada Hari terakhir (Shift: 24*2-25) |
Dalam penelitian ini terdapat dataset konsumsi daya di Jerman dari SMARD untuk tahun 2015 - 2024.
Gambar 1 menunjukkan kumpulan data mentah dengan nilai yang hilang (merah), stempel waktu duplikat (merah tua) dan Konsumsi Daya seiring waktu (abu-abu), resolusi per jam. Dengan satu nilai yang hilang dan satu duplikat setiap tahun, pembersihan kumpulan data menjadi mudah. Secara keseluruhan, satu set yang hampir bersih. Setelah membersihkan kumpulan data, ada pengamatan yang masuk akal untuk konsumsi daya:
Ada pendekatan sederhana untuk mengisi kesenjangan dengan mengambil observasi terakhir (mungkin karena resolusinya cukup besar dan hanya ada sedikit nilai yang hilang). Nilai pertama disimpan untuk duplikat.
Gambar 1 Konsumsi daya mentah
local_name_colors <- c(
"Christi Himmelfahrt" = palette()[2],
"Erster Weihnachtstag" = palette()[2],
"Karfreitag" = palette()[2],
"Neujahr" = palette()[2],
"Ostermontag" = palette()[2],
"Pfingstmontag" = palette()[2],
"Reformationstag" = palette()[2],
"Tag der Arbeit" = palette()[2],
"Tag der Deutschen Einheit" = palette()[2],
"Zweiter Weihnachtstag" = palette()[2],
"Regulärer Tag" = palette()[1]
)
week_colors <- c(
"Mo" = palette()[1],
"Di" = palette()[1],
"Mi" = palette()[1],
"Do" = palette()[1],
"Fr" = palette()[1],
"Sa" = palette()[2],
"So" = palette()[2]
)
working_colors <- c("1" = "#2E9FDF", "0" = "#FC4E07")
whw_colors <- c(
"FeiertagnKein Wochenende" = "black",
"Kein FeiertagnKein Wochenende" = "red",
"Kein FeiertagnWochenende" = "orange",
"FeiertagnWochenende" = "blue"
)
p <- cleaned_power_consum |>
gg_tsdisplay(PowerConsum, plot_type = "partial", lag = 100)
ggsave(
"plots/power_consum_acf_pacf.png",
plot = p,
width = 5.5,
height = 3.7,
dpi = 600
)
plot_calculated_features(
cleaned_power_consum = cleaned_power_consum,
file_name = "plots/MinLastOneDay.png",
x = "MinLastOneDay",
y = "PowerConsum",
x_label = "Minimaler Stromverbrauch vom letzten Tag [MW]",
y_label = "Stromverbrauch [MW]"
)
plot_calculated_features(
cleaned_power_consum = cleaned_power_consum,
file_name = "plots/MaxLastOneDay.png",
x = "MaxLastOneDay",
y = "PowerConsum",
x_label = "Maximaler Stromverbrauch vom letzten Tag [MW]",
y_label = "Stromverbrauch [MW]"
)
plot_calculated_features(
cleaned_power_consum = cleaned_power_consum,
file_name = "plots/MeanLastWeek.png",
x = "MeanLastWeek",
y = "PowerConsum",
x_label = "Durchschnittlicher Stromverbrauch der letzten 7 Tage [MW]",
y_label = "Stromverbrauch [MW]"
)
plot_calculated_features(
cleaned_power_consum = cleaned_power_consum,
file_name = "plots/MeanLastTwoDays.png",
x = "MeanLastTwoDays",
y = "PowerConsum",
x_label = "Durchschnittlicher Stromverbrauch der letzten 2 Tage [MW]",
y_label = "Stromverbrauch [MW]"
)
plot_histogram_by_group(
cleaned_power_consum,
group_name = "WorkdayHolidayWeekend",
file_name = "plots\workday_holiday_weekend_histogram.png",
colors = whw_colors,
x="PowerConsum",
x_label = "Stromverbrauch [MW]",
y_label = "Häufigkeit",
name_0 = "Wochenende oder Feiertage",
name_1 = "Werktag"
)
plot_histogram_by_group(
cleaned_power_consum,
group_name = "WorkDay",
file_name = "plots\workday_histogram.png",
colors = working_colors,
x="PowerConsum",
x_label = "Stromverbrauch [MW]",
y_label = "Häufigkeit",
name_0 = "Wochenende oder Feiertage",
name_1 = "Werktag"
)
plot_histogram_by_group(
cleaned_power_consum,
group_name = "Holiday",
file_name = "plots\holiday_histogram.png",
colors = working_colors,
x="PowerConsum",
x_label = "Stromverbrauch [MW]",
y_label = "Häufigkeit",
name_0 = "Werktag oder Wochenende",
name_1 = "Feiertag"
)
plot_histogram_by_group(
cleaned_power_consum,
group_name = "HolidayAndWorkDay",
file_name = "plots\holiday_workday_histogram.png",
colors = working_colors,
x="PowerConsum",
x_label = "Stromverbrauch [MW]",
y_label = "Häufigkeit",
name_0 = "Wochenende oder Werktag",
name_1 = "Feiertag am Werktag"
)
plot_by_group(
cleaned_power_consum,
group_name = "HolidayName",
file_name = "plots\holiday_boxplot.png",
colors = local_name_colors,
title = "Übersicht der einzelnen Feiertage",
y="PowerConsum",
y_label="Stromverbrauch [MW]",
x_label="Jahre"
)
plot_by_group(
cleaned_power_consum,
group_name = "Weekday",
file_name = "plots\weekday_boxplot.png",
colors = week_colors,
title = "Übersicht der einzelnen Wochentage",
y = "PowerConsum",
y_label="Stromverbrauch [MW]",
x_label="Jahre"
)
plot_by_group(
cleaned_power_consum,
group_name = "WorkDay",
file_name = "plots\workday_boxplot.png",
colors = working_colors,
title = "Übersicht, ob Feiertag (FALSE) oder Werktag (TRUE)",
y = "PowerConsum",
y_label="Stromverbrauch [MW]",
x_label="Jahre"
)
plot_by_column(
df = cleaned_power_consum,
x = "Hour",
y = "PowerConsum",
x_label = "Stunden",
y_label = "Stromverbrauch [MW]",
file_name = "plots\hour_boxplot.png",
title = "Übersicht der einzelnen Stunden"
)
plot_by_column(
df = cleaned_power_consum,
x = "Month",
y = "PowerConsum",
x_label = "Monate",
y_label = "Stromverbrauch [MW]",
file_name = "plots\month_boxplot.png",
title = "Übersicht der einzelnen Monate"
)
plot_by_column(
df = cleaned_power_consum,
x = "Week",
y = "PowerConsum",
x_label = "Woche",
y_label = "Stromverbrauch [MW]",
file_name = "plots\week_boxplot.png",
title = "Übersicht der einzelnen Wochen"
)
plot_by_column(
df = cleaned_power_consum,
x = "Year",
y = "PowerConsum",
x_label = "Jahr",
y_label = "Stromverbrauch [MW]",
file_name = "plots\year_boxplot.png",
title = "Übersicht der einzelnen Jahre"
)
plot_year_month_week_day(
df=cleaned_power_consum,
date_column="DateIndex",
y="PowerConsum",
from_year=2015,
to_year=2024,
from_week=0,
to_week=53,
year_for_week=2018,
from_day=1,
to_day=30,
month_for_day=4,
year_for_day=2018,
from_month=1,
to_month=12,
year_for_month=2018,
holiday="Holiday",
day_of_week = "Weekday"
)
Bagian berikut akan membahas data lebih detail. Kami akan mulai di sini dengan representasi tahunan.
Gambar 2 merupakan representasi tahunan tahun 2015-2024. Kita dapat melihat di sini, bahwa pada awal tahun terjadi peningkatan konsumsi listrik dan pada akhir tahun terjadi penurunan (Natal, Tahun Baru). Secara keseluruhan terlihat seperti bentuk senyuman atau busur.
Gambar 2 Konsumsi listrik, setiap tahun sebagai satu aspek
Mari kita coba menggabungkan semua tahun dan membaginya menjadi beberapa minggu. Plot kotak pada Gambar 3 digabungkan sepanjang tahun. Kita bisa melihat polanya lebih detail. Awal dan akhir tahun ditandai dengan warna merah dan menunjukkan penurunan dari "bentuk senyuman" biasa. Gambar 3 Data agregat konsumsi daya mingguan
Mari kita bahas lebih detail dan lihat tahun 2018 misalnya. Gambar 4 merupakan representasi bulanan tahun 2018. Di sini kita bisa mengamati lebih detail akhir tahun. Sekitar tanggal 24 Desember terjadi penurunan konsumsi listrik. Yang juga penting di sini adalah akhir pekan dan hari libur (merah). Penurunan untuk semua akhir pekan dan semua hari libur.
Gambar 4 Konsumsi daya, setiap bulan sebagai satu aspek
Kita dapat melangkah lebih jauh dan memeriksa representasi data per jam. Gambar 5 menunjukkan diagram kotak gabungan untuk setiap jam. Terjadi juga penurunan pada malam hari (21:00-06:00) dan peningkatan pada siang hari/waktu kerja (06:00-21:00). Juga pola yang perlu dimasukkan dalam model.
Gambar 5 Data agregat konsumsi daya per jam
Mari kita bicara tentang hari kerja. Seperti yang diasumsikan pada akhir pekan, konsumsi daya menurun. "Durchschnitt" adalah maksudnya. Gambar 6 menunjukkan seluruh hari kerja (agregat) selama bertahun-tahun. Terdapat penurunan sebesar ~10.000 MW pada akhir pekan.
Gambar 6 Konsumsi daya "efek hari dalam seminggu"
Gambar 8 menunjukkan efek liburan. "Durchschnitt" adalah rata-rata konsumsi daya selama bertahun-tahun. Terdapat peningkatan konsumsi daya yang signifikan untuk "Hari Kerja" (abu-abu tua) dibandingkan dengan hari libur (merah). Kita dapat berasumsi di sini bahwa hari libur bertindak seperti akhir pekan bagi Konsumsi Listrik".
Gambar 6 Konsumsi daya "efek liburan"
Gambar 7 mewakili perilaku yang berbeda untuk hari yang berbeda. Ada 4 kategori. "Feiertag Kein Wochenende" artinya hari libur, bukan akhir pekan. "Feiertag Wochenende" artinya hari libur dan akhir pekan. "Kein Feiertag Kein Wochenende" artinya hari kerja biasa dan "Kein Feiertag Wochenende" artinya hanya akhir pekan. Kita dapat mengamati distribusi serupa untuk hari kerja yang tidak biasa seperti yang diasumsikan.
Gambar 7 Konsumsi daya "Efek Berbeda" dibandingkan
Nilai tertinggal seperti MeanLastTwoDays, MeanLastWeek, MaxLastOneDay, dan MinLastOneDay adalah fitur yang dihasilkan.
Mirip seperti yang dibahas di DOI: 10.1109/TPWRS.2011.2162082 - Peramalan Beban Jangka Pendek Berdasarkan Model Aditif Semi-Parametrik
Gambar 8-11 (warna merah bukan hari kerja) menunjukkan nilai tertinggal dibandingkan konsumsi daya aktual.
Ada sedikit korelasi untuk fitur yang dihasilkan ini.
# Check Correlation
cor <- cor(cleaned_power_consum[sapply(cleaned_power_consum, is.numeric)], method = c("pearson", "kendall", "spearman"), use = "complete.obs")
Fitur | Korelasi dengan PowerConsum |
---|---|
Liburan Dihaluskan | -0,556194 |
BerartiMinggu Terakhir | 0,389044 |
Berarti Dua Hari Terakhir | 0,201253 |
MaxLastOneDay | 0,320193 |
MinLastOneDay | 0,348583 |
Gambar 8 Konsumsi Daya - MeanLastTwoDays
Gambar 9 Konsumsi Daya - MeanLastWeek
Gambar 10 Konsumsi Daya - MaxLastOneDay
Gambar 11 Konsumsi Daya - MinLastOneDay
Ada musim yang kompleks. Untuk resolusi per jam ada musiman tahunan, mingguan, dan harian. Yang perlu dilacak oleh model. Solusinya di sini adalah seperti yang dibahas dalam Peramalan: Prinsip dan Praktek Bab 12.1 Musiman kompleks untuk menggunakan suku-suku fourier untuk mewakili dan merakit melalui cos() dan sin() musiman kompleks.
Kita bisa mengambil gambaran kecil pada plot ACF dan PACF, terdapat sedikit lonjakan yang signifikan, namun itu hanya representasi dari 96 nilai lag. Jika kita mengambil ~9000 Pengamatan yang tertunda selama setahun, maka akan terjadi musiman yang kompleks. Itu sebabnya lebih mudah menggunakan suku fourier. Itu juga tidak berfungsi dengan baik hanya dengan menemukan komponen PDQ dan pdq
ARIMA(...
stepwise=FALSE,
greedy=FALSE,
approx=FALSE)
diri. Waktu pelatihan juga meningkat secara dramatis tanpa suku fourier.
Gambar 12 Konsumsi Daya - ACF PACF Plot konsumsi daya mentah
Kombinasi fitur terbaik yang ditemukan dalam karya ini adalah:
Untuk membandingkan model kami menggunakan metrik MAE dan MAPE. SMARD adalah model "Bundesnetzagentur" dari halaman SMARD. Model Nabi juga telah dicoba, tampil solid, tetapi kurang baik.
Nilai perkiraan SMARD mencapai MAPE sebesar 3,6%. <- TIDAK DALAM STUDI INI.
Data Pelatihan:
Model terbaik yang ditemukan sejauh ini adalah perang LHM + DHR (model harmonik linier + regresi harmonik dinamis)
Idenya adalah untuk menggabungkan model linier dengan model ARIMA. Karena model ARIMA sulit menangani variabel dummy untuk Hari Libur. Jadi model ansambel membantu.
train_power_consum <- cleaned_power_consum |>
filter(year(DateIndex) > 2020 & (year(DateIndex) < 2024))
generate_models(model_name = "model/mean_naive_drift",
train_power_consum = train_power_consum)
train_power_consum_v5 <- train_power_consum |>
mutate(HolidaySmoothed = Holiday + sin(2 * pi * (as.numeric(Hour)+1) / 24))
holiday_effect_model <- lm(
PowerConsum ~
HolidaySmoothed,
data = train_power_consum_v5
)
saveRDS(holiday_effect_model, file = "ensemble_model/version_5/holiday_effect_2021_2023.rds")
train_power_consum_v5$Residuals <- residuals(holiday_effect_model)
fit <- train_power_consum_v5 |>
model(
ARIMA = ARIMA(Residuals ~
PDQ(0,0,0)
+ pdq(d=0)
+ MeanLastWeek
+ WorkDay
+ EndOfTheYear # new
+ FirstWeekOfTheYear # new
+ MeanLastTwoDays
+ MaxLastOneDay
+ MinLastOneDay
+ fourier(period = "day", K = 6)
+ fourier(period = "week", K = 7)
+ fourier(period = "year", K = 3)
)
)
saveRDS(fit, file = "ensemble_model/version_5/arima_2021_2023.rds")
Kita dapat memvisualisasikan efek dan cara kerja model. Gambar 13 menunjukkan ide di balik model ini. Pertama-tama kita sesuaikan model LHM dan hitung residunya. Latih model DHR berdasarkan residu dan jumlahkan keduanya. Ini seperti cerminan LHM dan mendorong nilainya kembali ke atas.
Untuk model LHM yang kami gunakan di sini adalah pendekatan sederhana berupa kurva sinus yang berulang setiap 24 jam dan berkurang atau bertambah pada hari libur atau hari kerja.
Dengan memperkirakan LHM pada data baru, kita dapat memperkirakan sisa data baru. Residual + LHM menggeser nilai kembali ke posisi "benar".
Gambar 13 Representasi Model LHM + DHR
ensembled_fc <- load_ensembled_models(
days_to_forecast = 40,
months_to_forecast = 6,
year_to_forecast = 2024,
starting_month = 1,
real_data = cleaned_power_consum,
smard_fc = cleaned_smard_pred,
model_path = "ensemble_model"
)
all_forecasts_ensembled <- ensembled_fc$all_forecasts
raw_fc_ensembled <- ensembled_fc$raw_forecasts
fc <- load_all_model_results(
days_to_forecast = 40,
months_to_forecast = 6,
year_to_forecast = 2024,
starting_month = 1,
smard_fc = cleaned_smard_pred,
real_data = cleaned_power_consum
)
all_forecasts <- fc$combined_forecasts
raw_fc <- fc$raw_forecasts
metric_results <- calculate_metrics(fc_data = all_forecasts, fc_data_ensembled=all_forecasts_ensembled)
# Plot best Model for single Models
name_of_best_model_for_single_model <- plot_forecast(
all_forecasts = all_forecasts,
metric_results = metric_results,
cleaned_power_consum = cleaned_power_consum,
raw_fc = raw_fc,
month_to_plot = 1,
days_to_plot = 40
)
# Plot best Model for ensembled Models
name_of_best_model_ensembled <- plot_forecast_ensembled(
all_forecasts = all_forecasts_ensembled,
metric_results = metric_results,
cleaned_power_consum = cleaned_power_consum,
month_to_plot = 1,
days_to_plot = 40
)
# Residuals Compared with SMARD
plot_compare_with_smard(
all_forecasts = all_forecasts_ensembled,
name_of_best_model = name_of_best_model_ensembled
)
# LHM DHM representation
plot_representation_of_lhm_dhm_components(path_dhm = "ensemble_model/version_5/arima_2021_2023.rds",
path_lhm = "ensemble_model/version_5/holiday_effect_2021_2023.rds",
from_month = 1,
to_month = 1,
raw_fc_ensembled = raw_fc_ensembled)
Skor MAPE yang solid 3,8% untuk versi_5 (Model LHM + DHR).
Mari kita lihat lebih dalam apakah kita hanya akan menggunakan model ARIMA (arima_14). Gambar 14 menunjukkan hasil model ini. Kita bisa melihat hari libur (oranye), Weekend (merah) dan hari biasa (biru). Terdapat outlier yang signifikan untuk hari libur, meskipun terdapat variabel dummy untuk model ARIMA, variabel tersebut tidak dapat menangkap hari libur dengan benar.
Gambar 14 Perkiraan vs Nilai Aktual ARIMA (DHR, arima_14), sebagai model tunggal
Di sisi lain Model LHM + DHR menunjukkan kinerja yang lebih baik pada hari raya. Gambar 15 mewakilinya.
Gambar 15 Prakiraan vs Nilai Aktual LHM + DHR, model ansambel
Gambar 16 menunjukkan prakiraan cuaca untuk bulan Januari 2024. Tampaknya masuk akal.
Gambar 16 Prakiraan vs Nilai Aktual LHM + DHR bulan Januari 2024
Residu model dibandingkan dengan model SMARD juga terlihat bagus. Ada beberapa lonjakan, yang mungkin signifikan dan dapat dipersiapkan dengan lebih baik melalui pemodelan. Namun secara keseluruhan hasilnya solid.
Gambar 17 Sisa LHM + DHR bulan Januari - Juli 2024
Gambar 18 Sisa LHM + DHR bulan Januari - Juli 2024
Indeks | Nama Model | RMSE | PETA | MAE | Berkumpul |
---|---|---|---|---|---|
2 | Pengamatan Nyata | 0,000 | 0,000000 | 0,000 | BENAR |
3 | SMARD | 2480.693 | 3.602140 | 1869.466 | PALSU |
4 | SMARD | 2480.693 | 3.602140 | 1869.466 | BENAR |
5 | versi_5 | 2626.807 | 3.816012 | 1937.670 | BENAR |
6 | versi_0 | 2613.258 | 3.846888 | 1946.314 | BENAR |
7 | versi_7 | 2770.359 | 4.107272 | 2076.045 | BENAR |
8 | versi_8 | 2775.441 | 4.146788 | 2091.153 | BENAR |
9 | versi_9 | 2887.179 | 4.177841 | 2100.381 | BENAR |
10 | versi_6 | 2906.242 | 4.216517 | 2142.092 | BENAR |
11 | arima_14_2021_2023.rds | 3208.735 | 4.389492 | 2207.395 | PALSU |
12 | arima_18_2021_2023.rds | 3208.735 | 4.389492 | 2207.395 | PALSU |
13 | versi_4 | 2875.929 | 4.535388 | 2255.645 | BENAR |
14 | versi_2 | 2905.990 | 4.580770 | 2279.624 | BENAR |
15 | arima_9_2021_2023.rds | 3267.160 | 4.611857 | 2302.918 | PALSU |
16 | arima_2_2021_2023.rds | 3251.390 | 4.614028 | 2301.447 | PALSU |
17 | arima_4_2021_2023.rds | 3251.390 | 4.614028 | 2301.447 | PALSU |
18 | arima_5_2021_2023.rds | 3251.390 | 4.614028 | 2301.447 | PALSU |
19 | arima_13_2021_2023.rds | 3283.745 | 4.619636 | 2307.415 | PALSU |
20 | arima_10_2021_2023.rds | 3265.913 | 4.625508 | 2314.395 | PALSU |
21 | arima_0_2021_2023.rds | 3269.009 | 4.645944 | 2317.138 | PALSU |
22 | arima_17_2021_2023.rds | 3269.009 | 4.645944 | 2317.138 | PALSU |
23 | arima_16_2021_2023.rds | 3298.902 | 4.673116 | 2334.857 | PALSU |
24 | arima_1_2021_2023.rds | 3312.429 | 4.696342 | 2340.193 | PALSU |
24 | nabi_0_2021_2023.rds | 3044.849 | 4.711527 | 2435.572 | PALSU |
25 | arima_8_2021_2023.rds | 3332.217 | 4.716612 | 2358.085 | PALSU |
26 | arima_11_2021_2023.rds | 3358.020 | 4.758970 | 2388.791 | PALSU |
27 | arima_12_2021_2023.rds | 3430.191 | 5.022772 | 2495.067 | PALSU |
28 | arima_7_2021_2023.rds | 3475.671 | 5.049287 | 2510.903 | PALSU |
29 | versi_3 | 3546.729 | 5.064654 | 2570.530 | BENAR |
30 | arima_15_2021_2023.rds | 3734.584 | 5.165147 | 2606.661 | PALSU |
31 | arima_6_2021_2023.rds | 3748.583 | 5.375326 | 2723.837 | PALSU |
32 | versi_1 | 4495.568 | 6.483477 | 3229.647 | BENAR |
33 | arima_3_2021_2023.rds | 4558.982 | 6.953247 | 3453.387 | PALSU |
34 | tslm_0_2021_2023.rds | 6760.994 | 11.189119 | 5694.949 | PALSU |
35 | mean_2021_2023.rds | 9489.303 | 16.406032 | 8101.476 | PALSU |
36 | naif_2021_2023.rds | 14699.338 | 20.797370 | 12130.587 | PALSU |
37 | drift_2021_2023.rds | 14763.692 | 20.917883 | 12200.002 | PALSU |
CATATAN:
Periksa example/ensemble_model_2022_forecast atau example/ensemble_model_2023_forecast
Kami dapat memasukkan lebih banyak faktor seperti: