# masukan library yang diperlukan
library(forecast)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(ggplot2)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tibble)
library(MASS)
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
library(reshape2)
library(reshape)
##
## Attaching package: 'reshape'
## The following objects are masked from 'package:reshape2':
##
## colsplit, melt, recast
## The following object is masked from 'package:dplyr':
##
## rename
library(caret)
## Loading required package: lattice
library(Metrics)
##
## Attaching package: 'Metrics'
## The following objects are masked from 'package:caret':
##
## precision, recall
## The following object is masked from 'package:forecast':
##
## accuracy
library(forecast)
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:reshape':
##
## rename
## The following object is masked from 'package:MASS':
##
## select
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
library(corrplot)
## corrplot 0.92 loaded
library(tseries)
sales_data <- tibble::tibble(
Month = seq.Date(from = as.Date("2019-01-01"), to = as.Date("2024-05-01"), by = "1 month"),
Advertising_Expense = c(50, 75, 60, 65, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220, 225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300, 305, 310, 315, 320, 325, 330, 335, 340, 345, 350, 355, 360, 365, 370, 375, 380),
Product_Quality = c(20, 25, 22, 23, 28, 30, 32, 35, 38, 40, 42, 45, 48, 50, 55, 60, 65, 68, 70, 72, 75, 78, 80, 82, 85, 88, 90, 92, 95, 98, 100, 102, 105, 108, 110, 112, 115, 118, 120, 122, 125, 128, 130, 132, 135, 138, 140, 142, 145, 148, 150, 152, 155, 158, 160, 162, 165, 168, 170, 172, 175, 178, 180, 182, 185),
Product_Price = c(95, 112, 107,100, 110, 105, 108, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220, 225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300, 305, 310, 315, 320, 325, 330, 335, 340, 345, 350, 355, 360, 365, 370, 375, 380, 385, 390, 395, 400),
Sales_Promotion = c(15, 20, 18, 19, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142),
Online_Marketing = c(76, 77, 78, 79, 80, 85, 82, 84, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200),
Offline_Marketing = c(84,85, 87, 89, 89, 90, 95, 92, 94, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208),
Product_Sales = c(200, 220, 210, 215, 230, 240, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300, 305, 310, 315, 320, 325, 330, 335, 340, 345, 350, 355, 360, 365, 370, 375, 380, 385, 390, 395, 400, 405, 410, 415, 420, 425, 430, 435, 440, 445, 450, 455, 460, 465, 470, 475, 480, 485, 490, 495, 500, 505, 510, 515, 520, 525, 530, 535, 540)
)
head(sales_data)
## # A tibble: 6 × 8
## Month Advertising_Expense Product_Quality Product_Price Sales_Promotion
## <date> <dbl> <dbl> <dbl> <dbl>
## 1 2019-01-01 50 20 95 15
## 2 2019-02-01 75 25 112 20
## 3 2019-03-01 60 22 107 18
## 4 2019-04-01 65 23 100 19
## 5 2019-05-01 80 28 110 22
## 6 2019-06-01 85 30 105 24
## # ℹ 3 more variables: Online_Marketing <dbl>, Offline_Marketing <dbl>,
## # Product_Sales <dbl>
ggplot(sales_data, aes(x = Month, y = Product_Sales)) +
geom_line(color = "red") +
labs(title = "Penjualan Bulanan",
x = "Tanggal",
y = "Pendapatan Penjualan") +
theme_minimal()
# Membuat model regresi
model <- lm(Product_Sales ~ Advertising_Expense + Product_Quality + Product_Price + Sales_Promotion + Online_Marketing + Offline_Marketing, data = sales_data)
# Summarize the model
summary(model)
##
## Call:
## lm(formula = Product_Sales ~ Advertising_Expense + Product_Quality +
## Product_Price + Sales_Promotion + Online_Marketing + Offline_Marketing,
## data = sales_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.6031 -0.0697 -0.0051 0.0594 3.3179
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 297.58588 17.69853 16.814 < 2e-16 ***
## Advertising_Expense 0.46830 0.09830 4.764 1.31e-05 ***
## Product_Quality 0.12252 0.04597 2.665 0.009955 **
## Product_Price -0.82782 0.03965 -20.880 < 2e-16 ***
## Sales_Promotion 4.68575 0.51594 9.082 9.71e-13 ***
## Online_Marketing -0.85343 0.17905 -4.767 1.30e-05 ***
## Offline_Marketing -0.58501 0.15959 -3.666 0.000537 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.7478 on 58 degrees of freedom
## Multiple R-squared: 0.9999, Adjusted R-squared: 0.9999
## F-statistic: 1.78e+05 on 6 and 58 DF, p-value: < 2.2e-16
dari model regresi diatas didapatkan bentuk model regresi yaitu 297.58588 + 0.46830 Advertising_Expense + 0.12252 Product_Quality - 0.82782 Product_Price + 4.68575 Sales_Promotion - 0.85343 Online_Marketing - 0.58501 Offline_Marketing. Lalu dari nilai p-nya diketahui bahwa p < 0.05, maka menunjukan data tersebut berpengaruh signifikan. Lalu dari R-square menunjukan bahwa R-squared = 0.9999, yang artinya model yang dibuat bisa menjelaskan 99.99% variansi dalam data.
set.seed(123) # Untuk reproduktibilitas
train_indices <- createDataPartition(sales_data$Product_Sales, p = 0.8, list = FALSE)
train_data <- sales_data[train_indices, ]
test_data <- sales_data[-train_indices, ]
# Melihat prediksi pada data training
train_predictions <- predict(model, train_data)
# Menggabungkan hasil prediksi dengan data training
train_results <- train_data %>%
mutate(Predicted_Sales = train_predictions)
# Menampilkan beberapa baris pertama dari hasil
head(train_results)
## # A tibble: 6 × 9
## Month Advertising_Expense Product_Quality Product_Price Sales_Promotion
## <date> <dbl> <dbl> <dbl> <dbl>
## 1 2019-01-01 50 20 95 15
## 2 2019-02-01 75 25 112 20
## 3 2019-03-01 60 22 107 18
## 4 2019-04-01 65 23 100 19
## 5 2019-05-01 80 28 110 22
## 6 2019-06-01 85 30 105 24
## # ℹ 4 more variables: Online_Marketing <dbl>, Offline_Marketing <dbl>,
## # Product_Sales <dbl>, Predicted_Sales <dbl>
# Melihat prediksi pada data testing
test_predictions <- predict(model, test_data)
# Menggabungkan hasil prediksi dengan data testing
test_results <- test_data %>%
mutate(Predicted_Sales = test_predictions)
# Menampilkan beberapa baris pertama dari hasil
head(test_results)
## # A tibble: 6 × 9
## Month Advertising_Expense Product_Quality Product_Price Sales_Promotion
## <date> <dbl> <dbl> <dbl> <dbl>
## 1 2019-07-01 90 32 108 26
## 2 2019-09-01 100 38 120 30
## 3 2020-01-01 120 48 140 38
## 4 2020-09-01 160 75 180 54
## 5 2021-03-01 190 90 210 66
## 6 2021-08-01 215 102 235 76
## # ℹ 4 more variables: Online_Marketing <dbl>, Offline_Marketing <dbl>,
## # Product_Sales <dbl>, Predicted_Sales <dbl>
# Melihat prediksi pada data training
train_predictions <- predict(model, train_data)
# Menghitung MAPE untuk data training
mape_train <- mean(abs((train_data$Product_Sales - train_predictions) / train_data$Product_Sales)) * 100
mape_train
## [1] 0.1454995
# Melihat prediksi pada data testing
test_predictions <- predict(model, test_data)
# Menghitung MAPE untuk data testing
mape_test <- mean(abs((test_data$Product_Sales - test_predictions) / test_data$Product_Sales)) * 100
mape_test
## [1] 0.06014395
Dari data awal disini saya menggunakan 80% sebagai data training dan 20% sebagai data test. jadi di atas ini menjelaskan MAPE dari data training sebesar 14% dan test sebesar 6%.
# Melakukan prediksi
new_data <- data.frame(
Advertising_Expense = c(250, 300, 350), # Misalnya kita ingin memprediksi dengan biaya iklan
Product_Quality = c(80, 90, 100), # dan kualitas produk
Product_Price = c(300, 310, 320), # dengan harga produk
Sales_Promotion = c(30, 35, 40), # dengan promosi penjualan
Online_Marketing = c(150, 180, 200), # dan pemasaran online
Offline_Marketing = c(180, 200, 210) # serta pemasaran offline
)
predicted_sales <- predict(model, newdata = new_data)
predicted_sales <- predict(model, newdata = sales_data)
predicted_data <- cbind(sales_data, Predicted_Sales = predicted_sales)
ggplot(sales_data, aes(x = Month)) +
geom_line(aes(y = Product_Sales, color = "Actual Sales")) +
geom_line(aes(y = predicted_sales, color = "Predicted Sales"), linetype = "dashed") +
labs(title = "Perbandingan Sales Revenue Asli dan Prediksi",
x = "Tanggal",
y = "Penjualan Produk") +
scale_color_manual(name = "Data", values = c("Actual Sales" = "blue", "Predicted Sales" = "red")) +
theme_minimal()
Dari plot di atas menjelaskan bahwa model yang dibagun mampu dengan
baik dalam memperkirakan nilai sebenarnya berdasakan data
sales_data.
# Memuat library forecast untuk pemodelan ARIMA
sales_data$Month <- as.Date(sales_data$Month)
sales_ts <- ts(sales_data$Product_Sales, start = c(2019, 1), frequency = 12)
arima_model <- auto.arima(sales_ts)
summary(arima_model)
## Series: sales_ts
## ARIMA(2,1,2) with drift
##
## Coefficients:
## ar1 ar2 ma1 ma2 drift
## -1.3317 -0.9433 1.8308 0.8406 5.2913
## s.e. 0.1659 0.0541 0.2005 0.2023 0.2992
##
## sigma^2 = 4.932: log likelihood = -144.16
## AIC=300.32 AICc=301.79 BIC=313.27
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.0108795 2.115745 1.02334 0.02892078 0.3669924 0.01663712
## ACF1
## Training set -0.3067911
bisa dilihat dari model arima diatas, disitu memperlihatkan data training error.
forecast_arima <- forecast(arima_model, h = 12)
plot_time_series <- plot_ly(x = ~time(sales_ts), y = ~as.numeric(sales_ts), type = 'scatter', mode = 'lines', name = 'Actual') %>%
add_trace(x = time(forecast_arima$mean), y = forecast_arima$mean, mode = 'lines', name = 'Predicted (ARIMA)') %>%
layout(title = 'Perbandingan Actal dengan Prediksi - ARIMA Model',
xaxis = list(title = 'Time'),
yaxis = list(title = 'Sales Revenue'))
plot_time_series
Dari evaluasi model, saya membandingkan model dilihat dari nilai MAPE-nya. Dapat disimpulkan bahwa dari evaluasi modelnya dengan menggunakan model regresi didapapatkan niali MAPE sebesar 0.1454995 atau 14% dan dengan menggunakan model ARIMA (time series) dihasilkan MAPE sebesar 0.3669924 atau 36.6%. maka model yang lebih baik adalah model regresi.
Jadi kesimpulannya dengan menggunakan sales_data
menggunakan 2 macam model, model yang lebih baik adalah model regresi
karena nilai MAPE-nya adalah sebesar 14% yang menjelaskan tingkat
akurasi prediksinya.
library(readxl)
data <- read_xlsx("DataBPSEkonomi.xlsx")
data$Bulan <- as.Date(data$Bulan)
# Tampilkan data untuk verifikasi
print(data)
## # A tibble: 144 × 7
## Bulan Inflasi Suku_Bunga IHSG GDP_Growth KursUSD Pengangguran
## <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2010-01-01 3.72 6.5 2611. 6.22 9350 7.41
## 2 2010-02-01 3.81 6.5 2549. 6.22 9337 7.43
## 3 2010-03-01 3.43 6.5 2777. 6.22 9090 7.4
## 4 2010-04-01 3.91 6.5 2971. 6.22 9012. 7.51
## 5 2010-05-01 4.16 6.5 2797. 6.22 9175 7.28
## 6 2010-06-01 5.05 6.5 2914. 6.22 9060 7.2
## 7 2010-07-01 6.22 6.5 3069. 6.22 8940 7.14
## 8 2010-08-01 6.44 6.5 3082. 6.22 9035 7.14
## 9 2010-09-01 5.8 6.5 3501. 6.22 8925 7.11
## 10 2010-10-01 5.67 6.5 3635. 6.22 8935 7.16
## # ℹ 134 more rows
summary(data)
## Bulan Inflasi Suku_Bunga IHSG
## Min. :2010-01-01 Min. :1.320 Min. :3.500 Min. :2549
## 1st Qu.:2012-12-24 1st Qu.:3.130 1st Qu.:4.750 1st Qu.:4272
## Median :2015-12-16 Median :3.855 Median :5.750 Median :5078
## Mean :2015-12-16 Mean :4.309 Mean :5.788 Mean :5008
## 3rd Qu.:2018-12-08 3rd Qu.:5.702 3rd Qu.:6.750 3rd Qu.:5949
## Max. :2021-12-01 Max. :8.790 Max. :7.750 Max. :6606
## GDP_Growth KursUSD Pengangguran
## Min. :-2.070 Min. : 8495 Min. :4.880
## 1st Qu.: 4.978 1st Qu.: 9652 1st Qu.:5.447
## Median : 5.050 Median :13293 Median :5.920
## Mean : 4.649 Mean :12252 Mean :5.966
## 3rd Qu.: 5.678 3rd Qu.:14068 3rd Qu.:6.332
## Max. : 6.220 Max. :16300 Max. :7.510
# Membuat plot terpisah untuk setiap variabel
plot_inflasi <- ggplot(data, aes(x=Bulan, y=Inflasi)) +
geom_line() +
labs(title="Inflasi", x="Bulan", y=NULL) +
theme_minimal()
plot_suku_bunga <- ggplot(data, aes(x=Bulan, y=Suku_Bunga)) +
geom_line() +
labs(title="Suku Bunga", x="Bulan", y=NULL) +
theme_minimal()
plot_ihsg <- ggplot(data, aes(x=Bulan, y=IHSG)) +
geom_line() +
labs(title="IHSG", x="Bulan", y=NULL) +
theme_minimal()
plot_gdp_growth <- ggplot(data, aes(x=Bulan, y=GDP_Growth)) +
geom_line() +
labs(title="GDP Growth", x="Bulan", y=NULL) +
theme_minimal()
plot_kurs_usd <- ggplot(data, aes(x=Bulan, y=KursUSD)) +
geom_line() +
labs(title="Kurs USD", x="Bulan", y=NULL) +
theme_minimal()
plot_pengangguran <- ggplot(data, aes(x=Bulan, y=Pengangguran)) +
geom_line() +
labs(title="Pengangguran", x="Bulan", y=NULL) +
theme_minimal()
# Menampilkan plot
plot_inflasi
plot_suku_bunga
plot_ihsg
plot_gdp_growth
plot_kurs_usd
plot_pengangguran
# Menghitung korelasi antara variabel-variabel
correlation_matrix <- cor(data[,2:7])
# visualisasi uji corelasi
corrplot(correlation_matrix, method="color", type="upper",
addCoef.col = "black", tl.col="black", tl.srt=45)
uji Augmented Dickey-Fuller adalah uji statistik yang digunakan untuk menentukan sebuat time series menunjukan data tersebut stasioner atau non- stasioner. Dibawa ini adalah bentuk uji Augmented Dickey-Fuller yang di ujikan kepada setiap variabel. Dalam uji Augmented Dickey-Fuller :
H0 = p-value < 0.5 = Data time series bersifat non-stasioner. H1 = p-value > 0.5 = Data time series bersifat Stasioner.
variable_names <- names(data)[-1]
for (variable in variable_names) {
adf_test_result <- adf.test(data[[variable]])
print(paste("Variable:", variable))
print(adf_test_result)
}
## [1] "Variable: Inflasi"
##
## Augmented Dickey-Fuller Test
##
## data: data[[variable]]
## Dickey-Fuller = -2.8957, Lag order = 5, p-value = 0.2035
## alternative hypothesis: stationary
##
## [1] "Variable: Suku_Bunga"
##
## Augmented Dickey-Fuller Test
##
## data: data[[variable]]
## Dickey-Fuller = -2.435, Lag order = 5, p-value = 0.3953
## alternative hypothesis: stationary
##
## [1] "Variable: IHSG"
##
## Augmented Dickey-Fuller Test
##
## data: data[[variable]]
## Dickey-Fuller = -2.7825, Lag order = 5, p-value = 0.2506
## alternative hypothesis: stationary
##
## [1] "Variable: GDP_Growth"
##
## Augmented Dickey-Fuller Test
##
## data: data[[variable]]
## Dickey-Fuller = -3.1355, Lag order = 5, p-value = 0.1037
## alternative hypothesis: stationary
##
## [1] "Variable: KursUSD"
##
## Augmented Dickey-Fuller Test
##
## data: data[[variable]]
## Dickey-Fuller = -1.1394, Lag order = 5, p-value = 0.9132
## alternative hypothesis: stationary
##
## [1] "Variable: Pengangguran"
##
## Augmented Dickey-Fuller Test
##
## data: data[[variable]]
## Dickey-Fuller = -2.2382, Lag order = 5, p-value = 0.4773
## alternative hypothesis: stationary
tujuan melakukan decomposisi adalah untuk mengetahui data trend, seasonal, dan residualnya.
# Memilih beberapa variabel untuk dianalisis
selected_variables <- c("Inflasi", "Suku_Bunga", "IHSG", "GDP_Growth", "KursUSD")
# Memisahkan data menjadi beberapa subset berdasarkan variabel yang dipilih
selected_data <- data[, c("Bulan", selected_variables)]
# Mengekstrak variabel yang akan dianalisis
time_series <- ts(selected_data[, -1], start = c(2010, 1), frequency = 12) # Mengabaikan kolom pertama (tanggal)
# Dekomposisi time series untuk setiap variabel
for (i in 1:length(selected_variables)) {
decomposed <- decompose(time_series[, i])
# Plot tren, musiman, dan sisa untuk setiap variabel
plot(decomposed)
title(main = paste("Decomposition of", selected_variables[i]))
}
## Analisis Time Series Menggunakan Model Arima
# Membuat time series untuk setiap variabel
inflasi_ts <- ts(data$Inflasi, start = c(2010, 1), frequency = 12)
suku_bunga_ts <- ts(data$Suku_Bunga, start = c(2010, 1), frequency = 12)
ihsg_ts <- ts(data$IHSG, start = c(2010, 1), frequency = 12)
gdp_growth_ts <- ts(data$GDP_Growth, start = c(2010, 1), frequency = 12)
kurs_usd_ts <- ts(data$KursUSD, start = c(2010, 1), frequency = 12)
pengangguran_ts <- ts(data$Pengangguran, start = c(2010, 1), frequency = 12)
# Membuat model ARIMA untuk setiap variabel
inflasi_arima <- auto.arima(inflasi_ts)
suku_bunga_arima <- auto.arima(suku_bunga_ts)
ihsg_arima <- auto.arima(ihsg_ts)
gdp_growth_arima <- auto.arima(gdp_growth_ts)
kurs_usd_arima <- auto.arima(kurs_usd_ts)
pengangguran_arima <- auto.arima(pengangguran_ts)
# Ringkasan model
summary(inflasi_arima)
## Series: inflasi_ts
## ARIMA(0,1,1)(0,0,1)[12] with drift
##
## Coefficients:
## ma1 sma1 drift
## 0.3548 -0.7552 -0.0256
## s.e. 0.0839 0.0913 0.0159
##
## sigma^2 = 0.1739: log likelihood = -81.43
## AIC=170.86 AICc=171.15 BIC=182.71
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.01796338 0.4111229 0.2539572 -0.3580174 6.258647 0.1685218
## ACF1
## Training set -0.03651108
summary(suku_bunga_arima)
## Series: suku_bunga_ts
## ARIMA(1,1,1)
##
## Coefficients:
## ar1 ma1
## 0.7363 -0.4268
## s.e. 0.1341 0.1844
##
## sigma^2 = 0.02698: log likelihood = 56.29
## AIC=-106.58 AICc=-106.41 BIC=-97.69
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.009539998 0.1625362 0.08326552 -0.1891552 1.536469 0.09216812
## ACF1
## Training set 0.0069565
summary(ihsg_arima)
## Series: ihsg_ts
## ARIMA(0,1,0)
##
## sigma^2 = 56777: log likelihood = -985.61
## AIC=1973.22 AICc=1973.25 BIC=1976.19
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 27.5923 237.4514 166.9619 0.5247602 3.478043 0.2801256 -0.05971234
summary(gdp_growth_arima)
## Series: gdp_growth_ts
## ARIMA(0,1,0)(0,0,2)[12]
##
## Coefficients:
## sma1 sma2
## -0.7207 0.1985
## s.e. 0.0843 0.0974
##
## sigma^2 = 0.378: log likelihood = -135.51
## AIC=277.03 AICc=277.2 BIC=285.92
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.06173451 0.6083692 0.0737599 2.197593 2.899212 0.05542069
## ACF1
## Training set -0.01048393
summary(kurs_usd_arima)
## Series: kurs_usd_ts
## ARIMA(0,1,0)
##
## sigma^2 = 106390: log likelihood = -1030.51
## AIC=2063.02 AICc=2063.05 BIC=2065.98
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 34.09271 325.0405 197.5302 0.264925 1.548267 0.2693441 -0.1030007
summary(pengangguran_arima)
## Series: pengangguran_ts
## ARIMA(2,1,1)
##
## Coefficients:
## ar1 ar2 ma1
## -0.5717 0.3270 0.8108
## s.e. 0.1386 0.0799 0.1295
##
## sigma^2 = 0.0219: log likelihood = 71.66
## AIC=-135.32 AICc=-135.03 BIC=-123.47
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.007243171 0.1459332 0.09748211 -0.1269583 1.653232 0.2295333
## ACF1
## Training set -0.02170067
# Prediksi menggunakan model ARIMA
inflasi_forecast <- forecast(inflasi_arima, h = 12)
suku_bunga_forecast <- forecast(suku_bunga_arima, h = 12)
ihsg_forecast <- forecast(ihsg_arima, h = 12)
gdp_growth_forecast <- forecast(gdp_growth_arima, h = 12)
kurs_usd_forecast <- forecast(kurs_usd_arima, h = 12)
pengangguran_forecast <- forecast(pengangguran_arima, h = 12)
# Plot prediksi
plot(inflasi_forecast, main = "Prediksi Inflasi")
plot(suku_bunga_forecast, main = "Prediksi Suku Bunga")
plot(ihsg_forecast, main = "Prediksi IHSG")
plot(gdp_growth_forecast, main = "Prediksi GDP Growth")
plot(kurs_usd_forecast, main = "Prediksi Kurs USD")
plot(pengangguran_forecast, main = "Prediksi Pengangguran")
dari hasil diatas menunjukan model time series
dari hasil di atas model time series ini sangat baik untuk melakukan prediksi terhadap suku_bunga, gdp_growth, dan pengangguran. Diantara variabel yang lain hanya 3 variabel tersebut yang tingkat errornya kurang dari 10%, yang artinya tingkat prediksinya sangat akurat.
vif <- car::vif(lm(Inflasi ~ Suku_Bunga + IHSG + GDP_Growth + KursUSD + Pengangguran, data=data))
vif
## Suku_Bunga IHSG GDP_Growth KursUSD Pengangguran
## 2.008749 5.729229 2.096822 4.441607 2.580620
Dari hasil tersebut, acuan batas nilai VIF adalah 10, maka disimpulkan tidak mengandung sifat multikolinieritas pada variabel independentnya. Maka selanjutnya bisa melakukan proses analisis model regresinya.
modelin <- lm(Inflasi ~ Suku_Bunga + IHSG + GDP_Growth + KursUSD + Pengangguran, data=data)
summary(modelin)
##
## Call:
## lm(formula = Inflasi ~ Suku_Bunga + IHSG + GDP_Growth + KursUSD +
## Pengangguran, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.4448 -0.7823 -0.0974 0.7884 3.1661
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -9.759e-01 2.598e+00 -0.376 0.7078
## Suku_Bunga 1.100e+00 1.033e-01 10.645 <2e-16 ***
## IHSG 1.772e-04 2.206e-04 0.803 0.4231
## GDP_Growth 2.097e-02 6.339e-02 0.331 0.7413
## KursUSD -1.973e-04 9.048e-05 -2.180 0.0309 *
## Pengangguran 5.884e-02 2.355e-01 0.250 0.8031
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.119 on 138 degrees of freedom
## Multiple R-squared: 0.6694, Adjusted R-squared: 0.6574
## F-statistic: 55.87 on 5 and 138 DF, p-value: < 2.2e-16
pada hasil model regresinya, diketahui bahwa model tersebut baik tetapi tidak maksimal karena R-squared hanya sebesar 66.94% dan untuk variabel independentnya berpengaruh secara signifikan terhadap dependentnya hanya 2 yaitu, suku bunga dan KursUSD.
prediksi <- predict(modelin)
ggplot(data, aes(x = Bulan)) +
geom_line(aes(y = Inflasi, color = "Actual")) +
geom_line(aes(y = prediksi, color = "Predicted")) +
labs(title = "Prediksi inflasi dengan Regresi",
x = "Bulan",
y = "Inflasi") +
scale_color_manual(name = "Data",
values = c("Actual" = "blue", "Predicted" = "red")) +
theme_minimal()
berdasarkan hasil dari kedua model yang digunakan untuk melakukan prediksi kurang maksimal. Dari yang menggunakan model time series nilai MAE, MSE, dan MAPE nya masih tinggi yang mana artinya prediksi yang di lakukan tidak akurat. Sedangkan untuk model regresi dari nilai r-squarednya yaitu sebesar 66.94% yang sebenarnya sudah lumayan baik, tetapi masih belum cukup untuk membuat kita yakin dengan model yang kita rancang. Tetapi jika disuruh memilih, yang lebih baik adalah menggunakan model regresi.
Perubahan dalam indikator ekonomi seperti inflasi, suku bunga, IHSG (Indeks Harga Saham Gabungan), pertumbuhan GDP, kurs USD, dan tingkat pengangguran memiliki dampak yang kompleks dan saling terkait dalam perekonomian. Beberapa indikator yang dapat mempengaruhi pertumbuhan ekonomi di indonesia.
Dalam perekonomian yang kompleks, perubahan dalam satu indikator seringkali memiliki efek yang berantai dan kompleks pada indikator lainnya. Penting untuk memahami hubungan ini dengan cermat dan menggunakan data ekonomi yang relevan untuk menginformasikan keputusan kebijakan dan strategi bisnis.
Data yang di ambil dari Badan Pusat Statistik (BPS) yang berisi data ekonomi Indonesia dari 2010 hingga 2021 yang mana dalam dalam kasus ini lebih di fokuskan ke inflasi.