Nomor 1

Input Data

# 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()

Model Regresi

Uji Multikolinieritas

# 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%.

Prediksi Regresi

# 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.

Time Series

# 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.

Prediksi dengan time series

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

kesimpulan perbandingan data

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.

Nomor 2

Input Data, summary, dan viasualisasi data setiap variabel

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

Analisis Corelasi

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

Analisis Time Series

Cek Stasioner menggunakan uji Augmented Dickey-Fuller (ADF)

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

Decomposisi Data Setiap Variabel

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

  • inflasi_mae = 0.2539572
  • suku_bunga_mae = 0.08326552
  • ihsg_mae = 166.9619
  • gdp_growth_mae = 0.0737599
  • kurs_usd_mae = 197.5302
  • pengangguran_mae = 0.09748211

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.

Analisis Regresi

uji multikolinieritas

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

Kesimpulan Model

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.

Kebijakan yang dihadapi Indonesia

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.

  1. Inflasi dan Suku Bunga:
    • Inflasi yang tinggi cenderung mendorong bank sentral untuk menaikkan suku bunga guna mengendalikan inflasi dengan mengurangi belanja konsumen dan investasi. Kenaikan suku bunga dapat mengurangi ketersediaan uang dan membuat pinjaman lebih mahal, yang kemungkinan besar akan menghambat pertumbuhan ekonomi.
    • Di sisi lain, suku bunga yang lebih rendah dapat mendorong pinjaman dan investasi, merangsang konsumsi, dan meningkatkan pertumbuhan ekonomi, tetapi juga berpotensi meningkatkan inflasi jika tidak diimbangi dengan kebijakan yang tepat.
  2. Inflasi dan IHSG:
    • Tingkat inflasi yang tinggi dapat menyebabkan ketidakpastian di pasar dan meredam sentimen investor, yang pada gilirannya dapat mempengaruhi IHSG. Investor mungkin mencari instrumen investasi yang lebih aman atau mengurangi eksposur mereka terhadap pasar saham.
    • Namun, di beberapa kasus, inflasi yang moderat dapat mencerminkan pertumbuhan ekonomi yang sehat, yang dapat mendukung kinerja IHSG.
  3. GDP Growth dan Kurs USD:
    • Pertumbuhan GDP yang kuat biasanya diiringi oleh peningkatan permintaan untuk mata uang domestik, yang dapat menguatkan kurs USD. Peningkatan permintaan akan mata uang domestik dapat mengurangi nilai tukar USD terhadap mata uang domestik, membuat ekspor lebih mahal dan impor lebih murah.
    • Namun, kekuatan USD juga dapat bergantung pada faktor-faktor global, termasuk kebijakan moneter di AS dan kondisi ekonomi global. Kenaikan tajam dalam kurs USD dapat merusak ekspor dan pertumbuhan ekonomi secara keseluruhan.
  4. Tingkat Pengangguran dan Pertumbuhan Ekonomi:
    • Tingkat pengangguran yang tinggi biasanya menandakan rendahnya aktivitas ekonomi dan bisa menjadi indikator kesehatan ekonomi yang buruk. Namun, penurunan tingkat pengangguran bisa menjadi indikasi pertumbuhan ekonomi yang lebih kuat karena meningkatnya permintaan tenaga kerja oleh perusahaan.
    • Namun, terlalu cepatnya penurunan tingkat pengangguran juga dapat menyebabkan tekanan inflasi karena meningkatnya permintaan tenaga kerja, yang pada gilirannya dapat mempengaruhi kebijakan suku bunga.

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.

Documentation

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.