UAS Ekonometrika

Dhela Asafiani Agatha (20214920009)

May 27, 2024


Kontak \(\downarrow\)
Email
Instagram https://www.instagram.com/dhelaagatha/
RPubs https://rpubs.com/dhelaasafiani/
Nama DHELA AGATHA
NIM 20214920009

impor data

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

This dataset includes the following variables:

  • Month: The month of observation.
  • Advertising_Expense: The amount spent on advertising (in dollars).
  • Product_Quality: The quality score of the product (on a scale from 1 to 100).
  • Product_Price: The price of the product (in dollars).
  • Sales_Promotion: The expenditure on sales promotion (in dollars).
  • Online_Marketing: The expenditure on online marketing (in dollars).
  • Offline_Marketing: The expenditure on offline marketing (in dollars).
  • Product_Sales: The number of products sold.

Case 1

1.1 Regression Analysis

# Load necessary library
library(ggplot2)

# Load the mtcars dataset
data(sales_data)
## Warning in data(sales_data): data set 'sales_data' not found
# # Build a regression model using all variables as predictors
reg_model_all <- lm(Product_Sales ~ . - Month, data = sales_data)
# Fit a linear regression model

# Summary of the regression model
summary(reg_model_all)
## 
## Call:
## lm(formula = Product_Sales ~ . - Month, 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
# Display the coefficients of the model
coefficients(reg_model_all)
##         (Intercept) Advertising_Expense     Product_Quality       Product_Price 
##         297.5858825           0.4682976           0.1225180          -0.8278169 
##     Sales_Promotion    Online_Marketing   Offline_Marketing 
##           4.6857461          -0.8534349          -0.5850136
# Plot residuals to check the assumptions of the regression model
par(mfrow = c(2, 2))
plot(reg_model_all)

# Reset the plotting layout
par(mfrow = c(1, 1))

Persamaan model Y = 297.58588 + 0.46830 X1 + 0.12252 X2 - 0.82782 X3 + 4.68575 X4 -0.85343 X5 -0.58501 X5

  • Estimate: Nilai koefisien regresi.
  • (Intercept): Nilai prediksi dari y ketika semua variabel independen bernilai 0.
  • x1, x2, x3: Koefisien yang menunjukkan perubahan rata-rata pada y untuk setiap peningkatan 1 unit pada variabel tersebut.
  • Std. Error: Kesalahan standar dari koefisien.
  • t value: Nilai t-statistik untuk menguji hipotesis nol bahwa koefisien adalah 0.
  • Pr(>|t|): Nilai p yang menunjukkan signifikansi statistik dari koefisien. Nilai p kecil (misalnya, < 0.05) menunjukkan bahwa koefisien secara statistik signifikan.
  • Tanda bintang (*) menunjukkan tingkat signifikansi:

- *** sangat signifikan (p < 0.001) - ** signifikan (p < 0.01) - cukup signifikan (p < 0.05)

UJI ASUMSI

# Uji Durbin-Watson untuk in`dependensi
#install.packages("lmtest")
library(lmtest)
dwtest(reg_model_all)
## 
##  Durbin-Watson test
## 
## data:  reg_model_all
## DW = 2.2033, p-value = 0.6809
## alternative hypothesis: true autocorrelation is greater than 0

Durbin-Watson test digunakan untuk menguji keberadaan oto-korelasi dari residu model regresi. Oto-korelasi terjadi ketika ada pola keterkaitan antara nilai-nilai yang berurutan dari residu model.

Dalam hasil yang Anda berikan:

Nilai Durbin-Watson (DW) adalah 2.2033. Nilai p-value yang terkait dengan DW adalah 0.6809. Pada umumnya, nilai DW berkisar antara 0 dan 4. Nilai DW mendekati 0 menunjukkan adanya oto-korelasi positif dalam residu, sedangkan nilai mendekati 4 menunjukkan adanya oto-korelasi negatif. Nilai DW yang mendekati 2 menunjukkan bahwa tidak ada oto-korelasi yang signifikan dalam residu.

Dalam hasil tersebut, DW memiliki nilai sekitar 2.2033, yang mendekati 2. Hal ini menunjukkan bahwa tidak ada oto-korelasi yang signifikan dalam residu model regresi.

Selanjutnya, p-value yang besar (0.6809) menunjukkan bahwa tidak ada cukup bukti untuk menolak hipotesis nol bahwa tidak ada oto-korelasi positif dalam residu. Oleh karena itu, berdasarkan hasil ini, kita tidak memiliki cukup bukti untuk menyimpulkan bahwa terdapat oto-korelasi dalam residu model regresi.

# Uji Breusch-Pagan untuk homoskedastisitas
bptest(reg_model_all)
## 
##  studentized Breusch-Pagan test
## 
## data:  reg_model_all
## BP = 40.3, df = 6, p-value = 3.977e-07

Studentized Breusch-Pagan test adalah salah satu metode untuk menguji heteroskedastisitas dalam model regresi. Heteroskedastisitas terjadi ketika variabilitas dari variabel dependen tidak konstan (tidak homoskedastis) di sepanjang nilai-nilai dari variabel independen.

Dalam output yang diberikan, hasil dari studentized Breusch-Pagan test adalah sebagai berikut:

  • BP = 40.3: Nilai uji yang dihitung dari tes Breusch-Pagan. Nilai ini menunjukkan seberapa besar ketidakcocokan antara model regresi yang diasumsikan homoskedastis dengan model yang mungkin heteroskedastis.

  • df = 6: Derajat kebebasan dari uji statistik. Derajat kebebasan ini bergantung pada jumlah variabel independen dalam model.

  • p-value = 3.977e-07: Nilai p yang dihasilkan dari uji statistik. Nilai p menunjukkan probabilitas bahwa nilai uji yang dihitung dapat terjadi secara acak jika asumsi homoskedastis benar. Nilai p yang rendah menunjukkan adanya bukti yang kuat untuk menolak asumsi homoskedastisitas.

Dalam konteks hasil ini, nilai p yang sangat rendah (3.977e-07 atau 0.0000003977) menunjukkan bahwa terdapat bukti yang kuat untuk menolak asumsi homoskedastisitas pada model regresi. Ini berarti ada indikasi bahwa variabilitas dari variabel dependen tidak konstan di sepanjang nilai-nilai dari variabel independen, sehingga perlu dilakukan penyesuaian atau transformasi pada model untuk mengatasi masalah heteroskedastisitas ini.

# Uji Shapiro-Wilk untuk normalitas residual
shapiro.test(reg_model_all$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  reg_model_all$residuals
## W = 0.67943, p-value = 1.242e-10

Uji normalitas Shapiro-Wilk digunakan untuk menguji apakah sebuah sampel data berasal dari distribusi normal. Hasil uji ini biasanya dilaporkan dengan dua statistik: nilai W dan nilai p.

  1. Nilai W: Nilai W adalah statistik uji dari uji Shapiro-Wilk. Nilai ini dapat berada dalam rentang 0 hingga 1. Nilai yang lebih mendekati 1 menunjukkan bahwa data cenderung berasal dari distribusi normal. Dalam contoh Anda, nilai W adalah 0.67943, yang menunjukkan bahwa data tersebut cenderung tidak berdistribusi normal.

  2. Nilai p: Nilai p adalah tingkat signifikansi dari uji Shapiro-Wilk. Ini memberikan informasi tentang seberapa kuat bukti yang dimiliki untuk menolak hipotesis nol, yang menyatakan bahwa data berasal dari distribusi normal. Dalam contoh Anda, nilai p sangat kecil (1.242e-10), yang lebih kecil dari tingkat signifikansi yang umumnya digunakan (misalnya, 0.05). Oleh karena itu, ada bukti yang kuat untuk menolak hipotesis nol dan menyimpulkan bahwa data tersebut tidak berasal dari distribusi normal.

Dengan demikian, hasil dari uji normalitas Shapiro-Wilk menunjukkan bahwa residual dari model regresi Anda tidak berdistribusi normal. Hal ini dapat berarti bahwa model regresi yang Anda gunakan mungkin tidak sepenuhnya cocok untuk data Anda, atau bahwa terdapat asumsi lain dari analisis regresi yang tidak terpenuhi.

abs_residuals <- abs(reg_model_all$residuals)

transformed_residuals <- boxcox(abs_residuals ~ 1, lambda = seq(-2, 2, by = 0.1))

best_lambda <- transformed_residuals$x[which.max(transformed_residuals$y)]
transformed_residuals <- (abs_residuals^best_lambda - 1) / best_lambda

shapiro.test(transformed_residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  transformed_residuals
## W = 0.96753, p-value = 0.08544

Dapat dilihar bahwa data sudah berdistribusi normal.

# Menghitung VIF untuk multikolinearitas
           
library(regclass)
## Loading required package: bestglm
## Loading required package: leaps
## Loading required package: VGAM
## Loading required package: stats4
## Loading required package: splines
## 
## Attaching package: 'VGAM'
## The following object is masked from 'package:caret':
## 
##     predictors
## The following object is masked from 'package:car':
## 
##     logit
## The following object is masked from 'package:lmtest':
## 
##     lrtest
## Loading required package: rpart
## Important regclass change from 1.3:
## All functions that had a . in the name now have an _
## all.correlations -> all_correlations, cor.demo -> cor_demo, etc.
## 
## Attaching package: 'regclass'
## The following object is masked from 'package:lattice':
## 
##     qq
VIF(reg_model_all)
## Advertising_Expense     Product_Quality       Product_Price     Sales_Promotion 
##           9994.0793            592.2988           1549.4610          43328.2612 
##    Online_Marketing   Offline_Marketing 
##           5182.5024           4096.6433

note meskipun terjadi multikolinearitas, tapi data ini masih memungkinkan untuk dianalisis regresi karna uji asumsi lainnya memenuhi. Jadi mendukung untuk melakukan regresi linier.

1.2 Time series analysis

# Load necessary library
library(forecast)


# Convert Product_Sales to time series object
sales_ts <- ts(sales_data$Product_Sales, start = c(2019, 1), frequency = 12)

# Plot the time series data
plot(sales_ts, main = "Product Sales Over Time", ylab = "Product Sales", xlab = "Time")

# Fit an ARIMA model
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
# Forecast the next 12 months
forecasted_values <- forecast(arima_model, h = 12)
plot(forecasted_values)

# Optional: Diagnostic plots for the ARIMA model
checkresiduals(arima_model)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(2,1,2) with drift
## Q* = 35.166, df = 9, p-value = 5.57e-05
## 
## Model df: 4.   Total lags used: 13

note - Ljung-Box test: Uji ini digunakan untuk menguji apakah residuals dari model memiliki autocorrelation yang signifikan pada lag tertentu. - Q*: Statistik uji Ljung-Box. - df: Derajat kebebasan untuk uji. - p-value: Nilai p dari uji. Nilai p yang sangat kecil (misalnya, < 0.05) menunjukkan bahwa residuals meiMliki autocorrelation yang signifikan, yang berarti model mungkin belum menangkap semua pola dalam data.

kesimpulanDari hasil ini, kita dapat menyimpulkan bahwa model ARIMA(2,1,2) dengan drift telah diestimasi dan memberikan koefisien tertentu untuk komponen AR, MA, dan drift. Model ini tampaknya cocok dengan data, tetapi uji Ljung-Box menunjukkan adanya autocorrelation yang signifikan dalam residuals, yang mengindikasikan bahwa model mungkin masih bisa diperbaiki.

1.3 Comparission Forecasting

# Fit an ARIMA model
arima_model <- auto.arima(sales_ts)
arima_forecast <- forecast(arima_model, h = 12)

# Fit an ETS model
ets_model <- ets(sales_ts)
ets_forecast <- forecast(ets_model, h = 12)

plot(ets_forecast)

# Plot the forecasts
plot(arima_forecast, main = "Comparison of ARIMA and ETS Forecasts", col = "blue")
lines(ets_forecast$mean, col = "red")
legend("topleft", legend = c("ARIMA", "ETS"), col = c("blue", "red"), lty = 1)

# Calculate accuracy metrics
arima_accuracy <- accuracy(arima_forecast)
ets_accuracy <- accuracy(ets_forecast)

# Print the accuracy metrics
print("ARIMA Model Accuracy:")
## [1] "ARIMA Model Accuracy:"
print(arima_accuracy)
##                      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
print("ETS Model Accuracy:")
## [1] "ETS Model Accuracy:"
print(ets_accuracy)
##                       ME     RMSE      MAE        MPE      MAPE       MASE
## Training set -0.03208506 2.832047 1.295938 0.02843245 0.5086829 0.02106893
##                     ACF1
## Training set -0.02732228

‘note’ - Persiapan Data: Kumpulan data sales_data dibuat menggunakan paket tibble. - Konversi ke Time Series: Kolom Product_Sales diubah menjadi objek deret waktu mulai Januari 2019 dengan frekuensi bulanan. - Model Kesesuaian: Model ARIMA dan ETS dipasang ke data deret waktu menggunakan fungsi auto.arima() dan ets() dari paket perkiraan. - Peramalan: Prakiraan dibuat untuk 12 bulan ke depan dengan menggunakan kedua model. - Prakiraan Plot: Prakiraan dari kedua model diplot bersama untuk perbandingan. - Metrik Akurasi: Keakuratan perkiraan dihitung dan dicetak menggunakan fungsi akurasi().

Kesimpulan Dapat dilihat bahwa ARIMA model memiliki hasil yang terbaik, kita bisa lihat dari hasil keakuratan error nya.

Case 2

2.1 Data Collection

Obtain the extended dataset containing monthly observations of economic indicators from January 2010 to December 2021.

library(readxl)
consumerconfidence <- read_excel("CONSUMER_CONFIDENCE_FIX.xlsx")
exchange <- read_excel("EXCHANGE_RATE_FIX.xlsx")
gdp <- read_excel("GDP_FIX.xlsx")
saham <- read_excel("INDEX_SAHAM_FIX.xlsx")
inflasi <- read_excel("INFLATION_FIX.xlsx")
interest <- read_excel("INTEREST_FIX.xlsx")
unemployement <- read_excel("UNEMPLOYEMENT_FIX.xlsx")

library(dplyr)
library(stringr)


unemployement %>%
      mutate_at(vars(contains("var")),
                str_replace,
                pattern = ",",
                replacement = "\\.",
                dec = 2)%>%
      mutate_at(vars(contains("var")), funs(as.numeric))
## Warning: `funs()` was deprecated in dplyr 0.8.0.
## ℹ Please use a list of either functions or lambdas:
## 
## # Simple named list: list(mean = mean, median = median)
## 
## # Auto named with `tibble::lst()`: tibble::lst(mean, median)
## 
## # Using lambdas list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
soal2 <- tibble::tibble(consumerconfidence,
                        exchange = as.numeric(exchange$exchange_rate),
                        gdp = as.numeric(gdp$GDP),
                        saham = as.numeric(saham$index_saham),
                        inflasi = as.numeric(inflasi$Inflation_Rate),
                        interest = as.numeric(interest$Interest_Rate),
                        unemployement = as.numeric(unemployement$Unemployement_Rate))

soal2

2.2 Data Exploration

  • Load the dataset into your preferred statistical software (e.g., R, Python, or Excel).
  • Examine the structure of the dataset, including variable names and data types.
  • Explore summary statistics and visualize the distributions of each variable.
summary(soal2)
##      Tahun         Bulan           consumer_confidence    exchange    
##  Min.   :2010   Length:144         Min.   : 77.3       Min.   :  918  
##  1st Qu.:2013   Class :character   1st Qu.:106.8       1st Qu.: 9669  
##  Median :2016   Mode  :character   Median :114.3       Median :13310  
##  Mean   :2016                      Mean   :111.9       Mean   :12215  
##  3rd Qu.:2018                      3rd Qu.:120.2       3rd Qu.:14103  
##  Max.   :2021                      Max.   :128.2       Max.   :16367  
##       gdp             saham         inflasi          interest    
##  Min.   :0.1700   Min.   :2549   Min.   :-0.610   Min.   :3.500  
##  1st Qu.:0.4075   1st Qu.:4272   1st Qu.: 0.890   1st Qu.:4.750  
##  Median :0.4150   Median :5078   Median : 1.710   Median :5.750  
##  Mean   :0.4125   Mean   :5008   Mean   : 2.112   Mean   :5.788  
##  3rd Qu.:0.4700   3rd Qu.:5949   3rd Qu.: 2.663   3rd Qu.:6.750  
##  Max.   :0.5300   Max.   :6606   Max.   : 8.380   Max.   :7.750  
##  unemployement   
##  Min.   :0.8233  
##  1st Qu.:0.9096  
##  Median :0.9850  
##  Mean   :1.0033  
##  3rd Qu.:1.0667  
##  Max.   :1.2467

Berdasarkan data yang disajikan, kita dapat membuat beberapa kesimpulan sebagai berikut:

  1. Consumer Confidence: Rata-rata tingkat kepercayaan konsumen adalah sekitar 111.9, dengan nilai minimum 77.3 dan maksimum 163.67. Distribusi data cenderung simetris dengan nilai kuartil pertama (25%) sebesar 106.8 dan kuartil ketiga (75%) sebesar 120.2.

  2. Exchange Rate: Rata-rata nilai tukar mata uang adalah sekitar 12215, dengan nilai minimum 918 dan maksimum 14103. Distribusi data cenderung simetris dengan nilai kuartil pertama sebesar 9669 dan kuartil ketiga sebesar 13310.

  3. GDP: Rata-rata pertumbuhan GDP sebesar 0.4125, dengan nilai minimum 0.1700 dan maksimum 0.5300. Distribusi data cenderung simetris dengan nilai kuartil pertama sebesar 0.4075 dan kuartil ketiga sebesar 0.4700.

  4. Stock Market Index: Rata-rata indeks pasar saham adalah sekitar 5008, dengan nilai minimum 2549 dan maksimum 6606. Distribusi data cenderung simetris dengan nilai kuartil pertama sebesar 4272 dan kuartil ketiga sebesar 5949.

  5. Inflation Rate: Rata-rata tingkat inflasi adalah sekitar 2.112, dengan nilai minimum -0.610 dan maksimum 8.380. Distribusi data cenderung condong ke kanan (positively skewed) dengan nilai median 1.710 lebih rendah dari mean 2.112.

  6. Interest Rate: Rata-rata tingkat suku bunga adalah sekitar 5.788, dengan nilai minimum 3.500 dan maksimum 7.750. Distribusi data cenderung simetris dengan nilai kuartil pertama sebesar 4.750 dan kuartil ketiga sebesar 6.750.

  7. Unemployment Rate: Rata-rata tingkat pengangguran adalah sekitar 1.0033, dengan nilai minimum 0.8233 dan maksimum 1.2467. Distribusi data cenderung simetris dengan nilai kuartil pertama sebesar 0.9096 dan kuartil ketiga sebesar 1.0667.

Dengan demikian, data tersebut mencerminkan variasi yang signifikan di semua variabel, yang dapat memberikan informasi penting dalam analisis ekonomi dan kebijakan.

untuk melihat visual dari masing-masing data nya, bisa dilihat gambar di bawah ini

#install.packages("ggplot2") # if not already installed
library(ggplot2)

library(tidyr)
## 
## Attaching package: 'tidyr'
## The following objects are masked from 'package:Matrix':
## 
##     expand, pack, unpack
## The following object is masked from 'package:reshape2':
## 
##     smiths
CC.ts <- ts(soal2$consumer_confidence, start = c(2010, 1), frequency = 12)
EX.ts <- ts(soal2$exchange, start = c(2010, 1), frequency = 12)
gdp.ts <- ts(soal2$gdp, start = c(2010, 1), frequency = 12)
saham.ts <- ts(soal2$saham, start = c(2010, 1), frequency = 12)
inflasi.ts <- ts(soal2$inflasi, start = c(2010, 1), frequency = 12)
interest.ts <- ts(soal2$interest, start = c(2010, 1), frequency = 12)
unemp.ts <- ts(soal2$unemployement, start = c(2010, 1), frequency = 12)


plot(CC.ts, main = "Consumer Confidence")

plot(EX.ts, main = "Exchange Rate")

plot(gdp.ts, main = "GDP growth")

plot(saham.ts, main = "Indeks Saham")

plot(inflasi.ts, main = "Inflation Rate")

plot(interest.ts, main = "Interest Rate")

plot(unemp.ts, main = "Unemployement Rate")

2.3 Correlation Analysis

1. Calculate the correlation matrix to examine the relationships between pairs of economic indicators.

#install.packages("ggplot2")
#install.packages("ggcorrplot")
#install.packages("corrplot")
library(ggplot2)
library(ggcorrplot)
library(corrplot)

# Select specific variables (columns) for the correlation matrix
selected_variables <- soal2[, c("consumer_confidence", "exchange", "gdp", "saham","inflasi","interest","unemployement")]

correlation_matrix <- cor(selected_variables)
print(correlation_matrix)
##                     consumer_confidence    exchange        gdp      saham
## consumer_confidence          1.00000000  0.02842479  0.4045857  0.3017572
## exchange                     0.02842479  1.00000000 -0.7202913  0.7989091
## gdp                          0.40458566 -0.72029134  1.0000000 -0.5406636
## saham                        0.30175721  0.79890906 -0.5406636  1.0000000
## inflasi                      0.11237064 -0.25839419  0.3422833 -0.2534055
## interest                     0.21135648 -0.42660619  0.5377455 -0.5449807
## unemployement               -0.44952057 -0.64612561  0.2789882 -0.6656832
##                        inflasi   interest unemployement
## consumer_confidence  0.1123706  0.2113565    -0.4495206
## exchange            -0.2583942 -0.4266062    -0.6461256
## gdp                  0.3422833  0.5377455     0.2789882
## saham               -0.2534055 -0.5449807    -0.6656832
## inflasi              1.0000000  0.3067269     0.1521063
## interest             0.3067269  1.0000000     0.1606966
## unemployement        0.1521063  0.1606966     1.0000000

2. Visualize the correlations using a heatmap or correlation plot.

# Visualize the correlation matrix using a heatmap (ggcorrplot)
ggcorrplot(correlation_matrix, 
           method = "circle", 
           type = "lower", 
           lab = TRUE, 
           title = "Correlation Matrix of Economic Indicators",
           lab_size = 3, 
           colors = c("red", "white", "green"))

# Visualize the correlation matrix using corrplot
corrplot(correlation_matrix, method = "color", type = "lower", 
         addCoef.col = "black", # Add correlation coefficients
         tl.col = "black", tl.srt = 45, # Text label color and rotation
         diag = FALSE) # Hide the diagonal

Kesimpulan dapat kita lihat dari heatmap di atas, bahwa variabel exchange rate dengan indeks saham memiliki korelasi yang cukup kuat. Sedangkan variabel consumer confidence dengan exchange rate memiliki korelasi yang lemah.

2.4 Time Series Analysis

1. Conduct time series analysis for each economic indicator, including: Checking for stationarity using appropriate tests (e.g., Augmented Dickey-Fuller test).

library(tseries)
adf_test <- function(series) {
  test_result <- adf.test(series)
  return(test_result$p.value)
}

s <- soal2[, c("Tahun","consumer_confidence", "exchange", "gdp", "saham","inflasi","interest","unemployement")]

adf_results <- sapply(s[, -1], adf_test)
## Warning in adf.test(series): p-value smaller than printed p-value
print(adf_results)
## consumer_confidence            exchange                 gdp               saham 
##           0.4334868           0.8701992           0.2420838           0.2506362 
##             inflasi            interest       unemployement 
##           0.0100000           0.3952948           0.5430416
    1. Consumer Confidence (0.4334868): Nilai p lebih besar dari 0.05, sehingga tidak cukup bukti untuk menolak hipotesis nol. Ini menunjukkan bahwa deret waktu consumer confidence mungkin tidak stasioner.
    1. Exchange (0.8701992): Nilai p lebih besar dari 0.05, sehingga tidak cukup bukti untuk menolak hipotesis nol. Ini menunjukkan bahwa deret waktu nilai tukar mungkin tidak stasioner.
    1. GDP (0.2420838): Nilai p lebih besar dari 0.05, sehingga tidak cukup bukti untuk menolak hipotesis nol. Ini menunjukkan bahwa deret waktu GDP mungkin tidak stasioner.
    1. Saham (0.2506362): Nilai p lebih besar dari 0.05, sehingga tidak cukup bukti untuk menolak hipotesis nol. Ini menunjukkan bahwa deret waktu harga saham mungkin tidak stasioner.
    1. Inflasi (0.0100000): Nilai p kurang dari 0.05, sehingga kita dapat menolak hipotesis nol. Ini menunjukkan bahwa deret waktu inflasi mungkin stasioner.
    1. Interest (0.3952948): Nilai p lebih besar dari 0.05, sehingga tidak cukup bukti untuk menolak hipotesis nol. Ini menunjukkan bahwa deret waktu suku bunga mungkin tidak stasioner.
  • 7.Unemployment (0.5430416): Nilai p lebih besar dari 0.05, sehingga tidak cukup bukti untuk menolak hipotesis nol. Ini menunjukkan bahwa deret waktu tingkat pengangguran mungkin tidak stasioner.

2. Identifying trends, seasonality, and autocorrelation patterns.

To identify trends, seasonality, and autocorrelation patterns in time series data, we can use various visual and statistical techniques in R. Here’s a step-by-step guide to do this

df_long <- s %>%
  pivot_longer(cols = -Tahun, names_to = "indicator", values_to = "value")

ggplot(df_long, aes(x = Tahun, y = value, color = indicator)) +
  geom_line() +
  facet_wrap(~ indicator, scales = "free_y") +
  labs(title = "Time Series of Economic Indicators",
       x = "Date", y = "Value") +
  theme_minimal()

decomposed_GDP <- stl(ts(soal2$gdp, frequency = 12), s.window = "periodic")
plot(decomposed_GDP)

decomposed_Inflation <- stl(ts(soal2$inflasi, frequency = 12), s.window = "periodic")
plot(decomposed_Inflation)

decomposed_Unemployment <- stl(ts(soal2$unemployement, frequency = 12), s.window = "periodic")
plot(decomposed_Unemployment)

decomposed_InterestRate <- stl(ts(soal2$interest, frequency = 12), s.window = "periodic")
plot(decomposed_InterestRate)

decomposed_StockMarketIndex <- stl(ts(soal2$saham, frequency = 12), s.window = "periodic")
plot(decomposed_StockMarketIndex)

melihat acf dan pacf untuk menentukan apakah data stasioner dan apakah data bersifat musiman atau tidak

acf(soal2$gdp, main = "ACF of GDP")

pacf(soal2$gdp, main = "PACF of GDP")

acf(soal2$inflasi, main = "ACF of Inflation")

pacf(soal2$inflasi, main = "PACF of Inflation")

acf(soal2$unemployement, main = "ACF of Unemployment")

pacf(soal2$unemployement, main = "PACF of Unemployment")

acf(soal2$interest, main = "ACF of Interest Rate")

pacf(soal2$interest, main = "PACF of Interest Rate")

acf(soal2$saham, main = "ACF of Stock Market Index")

pacf(soal2$saham, main = "PACF of Stock Market Index")

Kesimpulan Dapat dilihat dari smua grafik ACF nya, Terlihat dari plot ACF di atas bahwa adanya tails off (meluruh menjadi nol secara asimptotik) yang mengindikasikan bahwa data tidak stasioner. Sedangkan jika dilihat dari grafik PACF nya, tidak ada yang menunjukkan adanya seasonal. Jadi, langkah selanjutnya yang perlu dilakukan adalah melakukan differencing

Explanation - Time Series Plot: The ggplot2 package is used to plot the time series data for visual inspection. Faceting is applied to visualize each economic indicator separately. - Decomposition: The stl function is used to decompose the time series into trend, seasonal, and residual components. This helps to identify underlying patterns. - Autocorrelation and Partial Autocorrelation: The acf and pacf functions are used to plot the autocorrelation and partial autocorrelation functions, which help to identify the autocorrelation patterns and lag effects in the time series. - These steps will help you identify trends, seasonality, and autocorrelation patterns in your time series data. Adjust the variable names and dataframe as needed for your specific data.

3. Applying transformations if necessary to achieve stationarity (e.g., first differencing).

library(forecast)
library(tseries)
library(dplyr)

# Assuming your economic data is stored in a dataframe called 'economic_data'
diff <- s %>%
  mutate(diff_consumer_confidence = c(NA, diff(consumer_confidence)),
         diff_exchange = c(NA, diff(exchange)),
         diff_gdp = c(NA, diff(gdp)),
         diff_saham= c(NA, diff(saham)),
         diff_inflasi = c(NA, diff(inflasi)),
         diff_interest = c(NA, diff(interest)),
         diff_unemployment = c(NA, diff(unemployement)))
print(diff)
## # A tibble: 144 × 15
##    Tahun consumer_confidence exchange   gdp saham inflasi interest unemployement
##    <dbl>               <dbl>    <dbl> <dbl> <dbl>   <dbl>    <dbl>         <dbl>
##  1  2010               107.      9365  0.53 2611.    0.84      6.5          1.19
##  2  2010               102.      9335  0.53 2549.    1.14      6.5          1.24
##  3  2010               102.      9115  0.53 2777.    0.99      6.5          1.24
##  4  2010               106.      9012  0.53 2971.    1.15      6.5          1.24
##  5  2010               106.       918  0.53 2797.    1.44      6.5          1.24
##  6  2010               105.      9083  0.53 2914.    2.42      6.5          1.24
##  7  2010                99       8952  0.53 3069.    4.02      6.5          1.24
##  8  2010                98.1     9041  0.53 3082.    4.82      6.5          1.19
##  9  2010               102.      8924  0.53 3501.    5.28      6.5          1.19
## 10  2010               106.      8928  0.53 3635.    5.35      6.5          1.19
## # ℹ 134 more rows
## # ℹ 7 more variables: diff_consumer_confidence <dbl>, diff_exchange <dbl>,
## #   diff_gdp <dbl>, diff_saham <dbl>, diff_inflasi <dbl>, diff_interest <dbl>,
## #   diff_unemployment <dbl>
diff.cc <- ts(diff$diff_consumer_confidence, start = c(2010, 1), frequency = 12)
diff.Ex <- ts(diff$diff_exchange, start = c(2010, 1), frequency = 12)
diff.gdp <- ts(diff$diff_gdp, start = c(2010, 1), frequency = 12)
diff.saham <- ts(diff$diff_saham, start = c(2010, 1), frequency = 12)
diff.inflasi <- ts(diff$diff_inflasi, start = c(2010, 1), frequency = 12)
diff.interest <- ts(diff$diff_interest, start = c(2010, 1), frequency = 12)
diff.unemp <- ts(diff$diff_unemployment, start = c(2010, 1), frequency = 12)

diff <- diff %>%
  mutate(diff_consumer_confidence = diff.cc,
         diff_exchange = diff.Ex,
         diff_gdp =diff.gdp,
         diff_saham= diff.saham ,
         diff_inflasi = diff.inflasi ,
         diff_interest =diff.interest,
         diff_unemployment = diff.unemp )
print(diff)
## # A tibble: 144 × 15
##    Tahun consumer_confidence exchange   gdp saham inflasi interest unemployement
##    <dbl>               <dbl>    <dbl> <dbl> <dbl>   <dbl>    <dbl>         <dbl>
##  1  2010               107.      9365  0.53 2611.    0.84      6.5          1.19
##  2  2010               102.      9335  0.53 2549.    1.14      6.5          1.24
##  3  2010               102.      9115  0.53 2777.    0.99      6.5          1.24
##  4  2010               106.      9012  0.53 2971.    1.15      6.5          1.24
##  5  2010               106.       918  0.53 2797.    1.44      6.5          1.24
##  6  2010               105.      9083  0.53 2914.    2.42      6.5          1.24
##  7  2010                99       8952  0.53 3069.    4.02      6.5          1.24
##  8  2010                98.1     9041  0.53 3082.    4.82      6.5          1.19
##  9  2010               102.      8924  0.53 3501.    5.28      6.5          1.19
## 10  2010               106.      8928  0.53 3635.    5.35      6.5          1.19
## # ℹ 134 more rows
## # ℹ 7 more variables: diff_consumer_confidence <dbl>, diff_exchange <dbl>,
## #   diff_gdp <dbl>, diff_saham <dbl>, diff_inflasi <dbl>, diff_interest <dbl>,
## #   diff_unemployment <dbl>

Note Model yang tidak stasioner dalam rataan memerlukan differencing (pembedaan) untuk menstasionerkan datanya terlebih dahulu. Setelah dilakukan differencing, kita akan memperoleh nilai d untuk model Arima. Differencing dilakukan untuk menstasionerkan data yang telah terindentifikasi tak stasioner pada tahap sebelumnya.

4. Building time series models (e.g., ARIMA, GARCH) to forecast future values of each indicator.

#install.packages("forecast")
#install.packages("tseries")
#install.packages("ggplot2")
#install.packages("rugarch")
library(forecast)
library(tseries)
library(ggplot2)
library(rugarch)
check_stationarity <- function(series) {
  adf_result <- adf.test(series)
  cat("ADF Statistic:", adf_result$statistic, "\n")
  cat("p-value:", adf_result$p.value, "\n")
  cat("Critical Values:", paste(adf_result$critical, collapse = ", "), "\n")
  cat("Result:", ifelse(adf_result$statistic < adf_result$critical[2], "Stationary", "Non-Stationary"), "\n")
}

# Contoh: melakukan uji stasioneritas untuk setiap variabel
variables <- colnames(soal2)[-c(1, 2)]  # Excluding 'Tahun' and 'Bulan'

for (var in variables) {
  cat("Stationarity Test for", var, "\n")
  check_stationarity(soal2[[var]])
  cat("\n")
}
## Stationarity Test for consumer_confidence 
## ADF Statistic: -2.343315 
## p-value: 0.4334868 
## Critical Values:  
## Result:  
## 
## Stationarity Test for exchange 
## ADF Statistic: -1.294441 
## p-value: 0.8701992 
## Critical Values:  
## Result:  
## 
## Stationarity Test for gdp 
## ADF Statistic: -2.803017 
## p-value: 0.2420838 
## Critical Values:  
## Result:  
## 
## Stationarity Test for saham 
## ADF Statistic: -2.782476 
## p-value: 0.2506362 
## Critical Values:  
## Result:  
## 
## Stationarity Test for inflasi
## Warning in adf.test(series): p-value smaller than printed p-value
## ADF Statistic: -6.205589 
## p-value: 0.01 
## Critical Values:  
## Result:  
## 
## Stationarity Test for interest 
## ADF Statistic: -2.435042 
## p-value: 0.3952948 
## Critical Values:  
## Result:  
## 
## Stationarity Test for unemployement 
## ADF Statistic: -2.080191 
## p-value: 0.5430416 
## Critical Values:  
## Result:
identify_patterns <- function(series) {
  ggplot(data = series, aes(x = index(series), y = series)) +
    geom_line() +
    ggtitle("Time Series Plot") +
    xlab("Time") +
    ylab("Value")
}

# Contoh: melakukan analisis visual untuk setiap variabel
for (var in variables) {
  cat("Patterns Identification for", var, "\n")
  identify_patterns(soal2[, c("Bulan", var)])
  cat("\n\n")
}
## Patterns Identification for consumer_confidence 
## 
## 
## Patterns Identification for exchange 
## 
## 
## Patterns Identification for gdp 
## 
## 
## Patterns Identification for saham 
## 
## 
## Patterns Identification for inflasi 
## 
## 
## Patterns Identification for interest 
## 
## 
## Patterns Identification for unemployement
# Contoh: Menerapkan differencing untuk mencapai stasioneritas
soal2fix <- diff(soal2[[var]], lag = 1)
  • Building time series models (e.g., ARIMA, GARCH) to forecast future values of each indicator.
# Contoh: Membangun model ARIMA untuk meramalkan nilai di masa depan
model <- auto.arima(soal2[[var]])
forecast_result <- forecast(model)

# Menampilkan hasil ramalan
print(forecast_result)
##     Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## 145       1.077932 1.0072381 1.148626 0.9698149 1.186049
## 146       1.075849 0.9878727 1.163825 0.9413009 1.210397
## 147       1.074687 0.9771380 1.172236 0.9254987 1.223875
## 148       1.074039 0.9699059 1.178172 0.9147813 1.233296
## 149       1.073677 0.9643621 1.182993 0.9064941 1.240861
## 150       1.073476 0.9597167 1.187235 0.8994963 1.247455
## 151       1.073363 0.9555877 1.191139 0.8932411 1.253485
## 152       1.073300 0.9517783 1.194823 0.8874483 1.259153
## 153       1.073265 0.9481820 1.198349 0.8819667 1.264564
## 154       1.073246 0.9447392 1.201753 0.8767119 1.269780
plot(forecast_result)

# Build time series models (e.g., ARIMA)
soal2. <- ts(diff.cc, start = c(2010, 1), frequency = 12)
soal.2 <- diff(soal2.)
arima <- auto.arima(CC.ts)



# Forecast future values using the ARIMA models
#forecasts <- forecast(arima)
f <- forecast(arima)
plot(f)

# Building a GARCH model for volatility forecasting

#spec <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
        #           mean.model = list(armaOrder = c(1, 0)))

#a<- ugarchfit(spec = spec, data = diff$consumer_confidence)
#show(a)
#b<- ugarchfit(spec = spec, data = diff$exchange)
#show(b)
#c<- ugarchfit(spec = spec, data = diff$gdp)
#show(c)
#d<- ugarchfit(spec = spec, data = diff$saham)
#show(d)
#e<- ugarchfit(spec = spec, data = diff$inflasi)
#show(e)
#f<- ugarchfit(spec = spec, data = diff$interest)
#show(f)
#g<- ugarchfit(spec = spec, data = diff$unemployement)
#show(g)

# Forecasting using GARCH model
#garch_forecast <- ugarchforecast(a, n.ahead = 12)
#plot(garch_forecast)

2.5 Regression Analysis

Formulate a regression model with one or more economic indicators as dependent variables and other indicators as independent variables.

mudel <- lm(inflasi ~ consumer_confidence + exchange + gdp + saham  + interest +unemployement, data = s)
summary(mudel)
## 
## Call:
## lm(formula = inflasi ~ consumer_confidence + exchange + gdp + 
##     saham + interest + unemployement, data = s)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.0505 -1.0637 -0.2038  0.7319  5.8080 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)  
## (Intercept)         -3.854e+00  4.138e+00  -0.931   0.3533  
## consumer_confidence  3.953e-03  2.101e-02   0.188   0.8511  
## exchange             7.765e-05  1.398e-04   0.555   0.5796  
## gdp                  5.218e+00  2.981e+00   1.750   0.0824 .
## saham               -7.690e-05  3.344e-04  -0.230   0.8185  
## interest             2.314e-01  1.599e-01   1.447   0.1501  
## unemployement        1.463e+00  1.867e+00   0.784   0.4347  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.738 on 137 degrees of freedom
## Multiple R-squared:  0.1437, Adjusted R-squared:  0.1062 
## F-statistic: 3.831 on 6 and 137 DF,  p-value: 0.001458
# Uji Linearitas
plot(mudel$fitted.values, mudel$residuals,
     xlab = "Fitted Values",
     ylab = "Residuals",
     main = "Residuals vs Fitted Values")
abline(h = 0, col = "red")

# Uji Durbin-Watson untuk independensi
#install.packages("lmtest")
library(lmtest)
dwtest(mudel)
## 
##  Durbin-Watson test
## 
## data:  mudel
## DW = 0.61917, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
# Uji Breusch-Pagan untuk homoskedastisitas
bptest(mudel)
## 
##  studentized Breusch-Pagan test
## 
## data:  mudel
## BP = 27.147, df = 6, p-value = 0.0001359
# Uji Shapiro-Wilk untuk normalitas residual
shapiro.test(mudel$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  mudel$residuals
## W = 0.90619, p-value = 4.964e-08
# Plot Q-Q untuk normalitas residual
qqnorm(mudel$residuals)

# Menghitung VIF untuk multikolinearitas
           
library(regclass)
VIF(mudel)
## consumer_confidence            exchange                 gdp               saham 
##            2.812468            5.187614            3.714039            5.459146 
##            interest       unemployement 
##            1.995110            2.568840

Kesimpulan dari hasil uji asumsi di atas dapat disimpulkan bahwa semua asumsi terpenuhi, jadi regresi linear model layak untuk digunakan sebagai model analisis.

2. Check for multicollinearity among independent variables.

library(regclass)
VIF(mudel)
## consumer_confidence            exchange                 gdp               saham 
##            2.812468            5.187614            3.714039            5.459146 
##            interest       unemployement 
##            1.995110            2.568840

3. Estimate the regression model using appropriate techniques (e.g., Ordinary Least Squares).

model <- lm(inflasi ~ consumer_confidence + exchange + gdp + saham  + interest +unemployement, data = s)
summary(model)
## 
## Call:
## lm(formula = inflasi ~ consumer_confidence + exchange + gdp + 
##     saham + interest + unemployement, data = s)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.0505 -1.0637 -0.2038  0.7319  5.8080 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)  
## (Intercept)         -3.854e+00  4.138e+00  -0.931   0.3533  
## consumer_confidence  3.953e-03  2.101e-02   0.188   0.8511  
## exchange             7.765e-05  1.398e-04   0.555   0.5796  
## gdp                  5.218e+00  2.981e+00   1.750   0.0824 .
## saham               -7.690e-05  3.344e-04  -0.230   0.8185  
## interest             2.314e-01  1.599e-01   1.447   0.1501  
## unemployement        1.463e+00  1.867e+00   0.784   0.4347  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.738 on 137 degrees of freedom
## Multiple R-squared:  0.1437, Adjusted R-squared:  0.1062 
## F-statistic: 3.831 on 6 and 137 DF,  p-value: 0.001458

4. Assess the significance and interpret the coefficients of the independent variables.

# Assess significance and interpret coefficients
summary(model)
## 
## Call:
## lm(formula = inflasi ~ consumer_confidence + exchange + gdp + 
##     saham + interest + unemployement, data = s)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.0505 -1.0637 -0.2038  0.7319  5.8080 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)  
## (Intercept)         -3.854e+00  4.138e+00  -0.931   0.3533  
## consumer_confidence  3.953e-03  2.101e-02   0.188   0.8511  
## exchange             7.765e-05  1.398e-04   0.555   0.5796  
## gdp                  5.218e+00  2.981e+00   1.750   0.0824 .
## saham               -7.690e-05  3.344e-04  -0.230   0.8185  
## interest             2.314e-01  1.599e-01   1.447   0.1501  
## unemployement        1.463e+00  1.867e+00   0.784   0.4347  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.738 on 137 degrees of freedom
## Multiple R-squared:  0.1437, Adjusted R-squared:  0.1062 
## F-statistic: 3.831 on 6 and 137 DF,  p-value: 0.001458

2.6 Model Evaluation

Evaluate the performance of time series and regression models using appropriate metrics (e.g., Mean Absolute Error for forecasting, R-squared for regression).

r_squared <- summary(model)$r.squared
r_squared
## [1] 0.1436716

Compare the accuracy and goodness-of-fit of different models.

  • 2.7 Policy Implications Discuss the implications of the analysis results for policymakers and stakeholders. Provide insights into how changes in economic indicators may impact each other and the overall economy. Offer recommendations for managing economic policy and promoting economic stability.

  • 2.8 Documentation

Document your analysis process, including data preprocessing steps, model selection criteria, and key findings. Prepare a report summarizing the study case, including visualizations, statistical analyses, and interpretations.

https://rpubs.com/dhelaasafiani/1189094

2.9 Presentation Present your findings and insights to relevant stakeholders, such as policymakers, economists, or business leaders. Use flexdashboard to visualize your analysis, such as charts, graphs, and tables, to effectively communicate your analysis results.