######### Analisis Regresi Sederhana ##########
# =========================
# 1. INPUT DATA
# =========================
iklan <- c(10,9,11,12,11,12,13,13,14,15)
penjualan <- c(44,40,42,46,48,52,54,58,56,60)

data <- data.frame(iklan, penjualan)

# Scatterplot 
# ========================= #
#  INSTALL & LOAD PACKAGE   #
# ========================= #
# install.packages("ggplot2")  # jalankan sekali saja

library(ggplot2)

ggplot(data, aes(x = iklan, y = penjualan)) +
  geom_point(size = 4, color = "#2E86C1") +
  geom_smooth(method = "lm", 
              se = TRUE, 
              color = "#E74C3C", 
              fill = "#FADBD8", 
              linewidth = 1.2) +
  labs(
    title = "Hubungan Iklan terhadap Penjualan",
    subtitle = "Regresi Linear Sederhana",
    x = "Biaya Iklan", 
    y = "Penjualan"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(face = "bold", size = 12),
    plot.subtitle = element_text(size = 10),
    axis.title = element_text(face = "bold")
  )
## `geom_smooth()` using formula = 'y ~ x'

# Interpretasi: bentuk polanya naik, turun, atau tidak beraturan 
# Dugaan ada hubungan linear antara x dan y maka bentuk polanya naik/turun, jika tidak beraturan maka diduga tidak ada hubungan linear. 

# =========================
# 2. REGRESI LINEAR SEDERHANA
# =========================

model <- lm(penjualan ~ iklan, data = data)
summary(model)
## 
## Call:
## lm(formula = penjualan ~ iklan, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.4667 -0.9500  0.5333  1.4167  4.4667 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   7.6000     6.3323   1.200 0.264397    
## iklan         3.5333     0.5223   6.765 0.000143 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.861 on 8 degrees of freedom
## Multiple R-squared:  0.8512, Adjusted R-squared:  0.8326 
## F-statistic: 45.77 on 1 and 8 DF,  p-value: 0.0001428
# model regresi: y=7.6+3.53x
# interpretasi b0: saat biaya iklan tidak ada atau nol, maka penjualan sebesar 7.6
# interpretasi b1: jika biaya iklan naik satu satuan, maka penjualan akan bertambah sebesar 3.53

# =========================
# 3. UJI ASUMSI
# =========================

#  Shapiro-Wilk (n<30)
shapiro.test(residuals(model))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(model)
## W = 0.9452, p-value = 0.6121
# Kolmogorov-Smirnov (n>=30)
ks.test(residuals(model), "pnorm", mean(residuals(model)), sd(residuals(model)))
## 
##  Exact one-sample Kolmogorov-Smirnov test
## 
## data:  residuals(model)
## D = 0.16869, p-value = 0.8951
## alternative hypothesis: two-sided
# 3.1 Uji Normalitas Residual (Shapiro-Wilk)
shapiro.test(residuals(model))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(model)
## W = 0.9452, p-value = 0.6121
# uji hipotesis: 
# H0: residual berdistribusi normal, H1: residual tidak berdistribusi normal

# 3.2 Uji Homoskedastisitas (Breusch-Pagan)

# Tujuan: Mengetahui apakah Varians residual sama pada semua tingkat X?

# install.packages("lmtest")   # jalankan sekali saja
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
bptest(model)
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 0.0023414, df = 1, p-value = 0.9614
# uji hipotesis: 
# H0: Residual homogen, H1: Residual tidak homogen

# 3.3 Uji Autokorelasi (Durbin-Watson) 

# biasanya dilakukan hanya jika data berdasarkan waktu
# Tujuan: Melihat apakah  residual pada observasi ke-i berkorelasi dengan residual observasi lain.

# install.packages("car")  # jalankan sekali saja

library(car)
## Loading required package: carData
durbinWatsonTest(model)
##  lag Autocorrelation D-W Statistic p-value
##    1       0.1780041      1.621113   0.326
##  Alternative hypothesis: rho != 0
# uji hipotesis: 
# H0: Tidak ada autokorelasi, H1: Ada autokorelasi

# =========================
# 4. VISUALISASI
# =========================
par(mfrow=c(2,2))
plot(model)

# Q-Q Residuals: Jika Residual membentuk pola linear-> normalitas terpenuhi
# Residuals vs Fitted: Jika tidak membentuk pola tertentu, diasumsikan residual homogen->tidak terjadi heterokedastistitas
# Residuals vs leverage: Tidak membentuk pola tertentu, diasumsikan tidak ada autokorelasi