# 1. LOAD PACKAGES
library(readxl)
## Warning: package 'readxl' was built under R version 4.5.3
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(car)
## Loading required package: carData
# 2. LOAD DATA
data <- read_excel('D:\\Documents\\Semester 3\\Komputasi Statistika\\Project\\project.xlsx')
df <- data.frame(
  UMR = data$`UMR Kota Semarang (Rupiah)`,
  Pengeluaran = data$`Rata rata Pengeluaran per kapita sebulan (Rupiah)`,
  Bekerja = data$`Jumlah yang bekerja (Jiwa)`,
  Pengangguran = data$`Pengangguran (%)`
)
df
##      UMR Pengeluaran Bekerja Pengangguran
## 1  1.051       1.070   0.802         6.02
## 2  1.200       1.058   0.820         7.76
## 3  1.410       1.297   0.836         5.77
## 4  1.610       1.362   0.899         4.63
## 5  1.740       1.432   0.872         6.61
## 6  1.900       1.771   0.907         5.21
## 7  2.050       1.648   0.925         4.50
## 8  2.220       1.770   0.936         9.57
## 9  2.300       1.929   0.944         9.54
## 10 2.310       1.973   0.873         7.60
# 3. STATISTIK DESKRIPTIF

cat("\n=== STATISTIK DESKRIPTIF ===\n")
## 
## === STATISTIK DESKRIPTIF ===
# Statistik deskriptif umum
print(summary(df))
##       UMR         Pengeluaran       Bekerja        Pengangguran  
##  Min.   :1.051   Min.   :1.058   Min.   :0.8020   Min.   :4.500  
##  1st Qu.:1.460   1st Qu.:1.313   1st Qu.:0.8450   1st Qu.:5.350  
##  Median :1.820   Median :1.540   Median :0.8860   Median :6.315  
##  Mean   :1.779   Mean   :1.531   Mean   :0.8814   Mean   :6.721  
##  3rd Qu.:2.178   3rd Qu.:1.771   3rd Qu.:0.9205   3rd Qu.:7.720  
##  Max.   :2.310   Max.   :1.973   Max.   :0.9440   Max.   :9.570
# Statistik deskriptif lengkap
statistik <- data.frame(
  Variabel = names(df),
  Mean = sapply(df, mean),
  Median = sapply(df, median),
  Minimum = sapply(df, min),
  Maksimum = sapply(df, max),
  Standar_Deviasi = sapply(df, sd),
  Varians = sapply(df, var)
)

print(statistik)
##                  Variabel   Mean Median Minimum Maksimum Standar_Deviasi
## UMR                   UMR 1.7791  1.820   1.051    2.310      0.45551350
## Pengeluaran   Pengeluaran 1.5310  1.540   1.058    1.973      0.33525214
## Bekerja           Bekerja 0.8814  0.886   0.802    0.944      0.04950915
## Pengangguran Pengangguran 6.7210  6.315   4.500    9.570      1.85328807
##                  Varians
## UMR          0.207492544
## Pengeluaran  0.112394000
## Bekerja      0.002451156
## Pengangguran 3.434676667
# 4. REGRESI LINEAR BERGANDA (OLS)
model <- lm(UMR ~ Pengeluaran + Bekerja + Pengangguran, data = df)

cat("=== MODEL REGRESI LINEAR BERGANDA ===\n")
## === MODEL REGRESI LINEAR BERGANDA ===
# Tampilkan persamaan
cat("Persamaan Regresi:\n")
## Persamaan Regresi:
cat("UMR = ", round(coef(model)[1], 2), " + ", 
    round(coef(model)[2], 6), "*Pengeluaran + ",
    round(coef(model)[3], 6), "*Bekerja + ",
    round(coef(model)[4], 2), "*Pengangguran\n\n")
## UMR =  -1.85  +  1.024646 *Pengeluaran +  2.1973 *Bekerja +  0.02 *Pengangguran
# Tampilkan tabel koefisien lengkap
cat("Tabel Koefisien:\n")
## Tabel Koefisien:
print(summary(model)$coefficients)
##                 Estimate Std. Error    t value     Pr(>|t|)
## (Intercept)  -1.85114000 0.80491615 -2.2997923 0.0611178623
## Pengeluaran   1.02464569 0.17134266  5.9800967 0.0009814919
## Bekerja       2.19729962 1.11386745  1.9726760 0.0959934847
## Pengangguran  0.01856979 0.01903934  0.9753381 0.3670599218
# 5. UJI NORMALITAS
cat("\n=== UJI NORMALITAS (Shapiro-Wilk) ===\n")
## 
## === UJI NORMALITAS (Shapiro-Wilk) ===
shapiro_test <- shapiro.test(residuals(model))
cat("p-value =", shapiro_test$p.value, "\n")
## p-value = 0.510042
if(shapiro_test$p.value > 0.05) {
  cat("Kesimpulan: Residual berdistribusi normal\n")
} else {
  cat("Kesimpulan: Residual TIDAK berdistribusi normal\n")
}
## Kesimpulan: Residual berdistribusi normal
# 6. UJI AUTOKORELASI
cat("\n=== UJI AUTOKORELASI (Durbin-Watson) ===\n")
## 
## === UJI AUTOKORELASI (Durbin-Watson) ===
dw_test <- durbinWatsonTest(model)
cat("Statistik Durbin-Watson =", dw_test$dw, "\n")
## Statistik Durbin-Watson = 3.010005
cat("p-value =", dw_test$p, "\n")
## p-value = 0.288
if(dw_test$p > 0.05) {
  cat("Kesimpulan: Tidak ada autokorelasi\n")
} else {
  cat("Kesimpulan: Ada autokorelasi\n")
}
## Kesimpulan: Tidak ada autokorelasi
# 7. UJI HETEROSKEDASTISITAS
cat("\n=== UJI HETEROSKEDASTISITAS (Breusch-Pagan) ===\n")
## 
## === UJI HETEROSKEDASTISITAS (Breusch-Pagan) ===
bp_test <- bptest(model)
cat("p-value =", bp_test$p.value, "\n")
## p-value = 0.2286588
if(bp_test$p.value > 0.05) {
  cat("Kesimpulan: Tidak ada heteroskedastisitas (varians konstan)\n")
} else {
  cat("Kesimpulan: Ada heteroskedastisitas (varians tidak konstan)\n")
}
## Kesimpulan: Tidak ada heteroskedastisitas (varians konstan)
# 8. UJI MULTIKOLINEARITAS
cat("\n=== UJI MULTIKOLINEARITAS (VIF & Tolerance) ===\n")
## 
## === UJI MULTIKOLINEARITAS (VIF & Tolerance) ===
# Hitung VIF
vif_values <- vif(model)

# Hitung Tolerance (1/VIF)
tolerance_values <- 1/vif_values

# Buat tabel hasil
multicoll_table <- data.frame(
  Variabel = names(vif_values),
  VIF = round(vif_values, 3),
  Tolerance = round(tolerance_values, 3)
)

print(multicoll_table)
##                  Variabel   VIF Tolerance
## Pengeluaran   Pengeluaran 3.065     0.326
## Bekerja           Bekerja 2.825     0.354
## Pengangguran Pengangguran 1.156     0.865
# 9. UJI F (SIMULTAN)
cat("\n=== UJI F (SIMULTAN) ===\n")
## 
## === UJI F (SIMULTAN) ===
anova_result <- anova(model)
print(anova_result)
## Analysis of Variance Table
## 
## Response: UMR
##              Df  Sum Sq Mean Sq  F value    Pr(>F)    
## Pengeluaran   1 1.76571 1.76571 182.2348 1.024e-05 ***
## Bekerja       1 0.03437 0.03437   3.5474    0.1086    
## Pengangguran  1 0.00922 0.00922   0.9513    0.3671    
## Residuals     6 0.05814 0.00969                       
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
cat("\nF =", round(anova_result$`F value`[1], 3), 
    ", p =", ifelse(anova_result$`Pr(>F)`[1] < 0.001, 
                    ".000", 
                    round(anova_result$`Pr(>F)`[1], 3)))
## 
## F = 182.235 , p = .000
if(anova_result$`Pr(>F)`[1] < 0.05) {
  cat(" → Signifikan\n")
} else {
  cat(" → Tidak signifikan\n")
}
##  → Signifikan
# 10. UJI T (PARSIAL)
cat("\n=== UJI T (PARSIAL) ===\n")
## 
## === UJI T (PARSIAL) ===
coef_summary <- summary(model)$coefficients
cat("Signifikansi masing-masing variabel:\n")
## Signifikansi masing-masing variabel:
for(i in 2:nrow(coef_summary)) {
  cat(rownames(coef_summary)[i], ": ")
  cat("t =", round(coef_summary[i, 3], 3), ", ")
  cat("p =", coef_summary[i, 4])
  if(coef_summary[i, 4] < 0.05) {
    cat(" → SIGNIFIKAN\n")
  } else {
    cat(" → TIDAK SIGNIFIKAN\n")
  }
}
## Pengeluaran : t = 5.98 , p = 0.0009814919 → SIGNIFIKAN
## Bekerja : t = 1.973 , p = 0.09599348 → TIDAK SIGNIFIKAN
## Pengangguran : t = 0.975 , p = 0.3670599 → TIDAK SIGNIFIKAN
# 11. KOEFISIEN DETERMINASI
cat("\n=== KOEFISIEN DETERMINASI ===\n")
## 
## === KOEFISIEN DETERMINASI ===
cat("R-squared =", round(summary(model)$r.squared, 4), "\n")
## R-squared = 0.9689
cat("Adjusted R-squared =", round(summary(model)$adj.r.squared, 4), "\n")
## Adjusted R-squared = 0.9533
cat("Interpretasi: Variabel independen menjelaskan", 
    round(summary(model)$r.squared * 100, 1), 
    "% variasi dalam UMR\n")
## Interpretasi: Variabel independen menjelaskan 96.9 % variasi dalam UMR
# 12. VISUALISASI
# VISUALISASI (4 Plot Diagnostik)
par(mfrow = c(2, 2))
plot(model, main = "Diagnostic Plots")

library(readxl)
library(ggplot2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:car':
## 
##     recode
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Load data
grafik <- read_excel('D:\\Documents\\Semester 3\\Komputasi Statistika\\Project\\project.xlsx', sheet = "data asli")
gf <- data.frame(
  Tahun = grafik$Tahun,
  UMR = grafik$`UMR Kota Semarang (Rupiah)`/ 1000000,
  Pengeluaran = grafik$`Rata rata Pengeluaran per kapita sebulan (Rupiah)`/ 1000000,
  Bekerja = grafik$`Jumlah yang bekerja (Jiwa)`/1000000,
  Pengangguran = grafik$`Pengangguran (%)`
)
gf
##    Tahun      UMR Pengeluaran  Bekerja Pengangguran
## 1   2013 1.051000    1.070470 0.802747         6.02
## 2   2014 1.208200    1.058225 0.820317         7.76
## 3   2015 1.419000    1.297895 0.836837         5.77
## 4   2016 1.610000    1.362348 0.899796         4.63
## 5   2017 1.745000    1.432800 0.872827         6.61
## 6   2018 1.900000    1.771154 0.907937         5.21
## 7   2019 2.055000    1.648489 0.925963         4.50
## 8   2020 2.229880    1.770967 0.936076         9.57
## 9   2021 2.302798    1.929166 0.994091         9.54
## 10  2022 2.311254    1.973168 0.873358         7.60
# Histogram UMR
p1<-ggplot(gf, aes(x = UMR)) +
  geom_histogram(binwidth = 0.2, fill = "chartreuse1", color = "white", alpha = 0.8) +
  geom_vline(aes(xintercept = mean(UMR)), color = "red", linetype = "dashed", size = 1) +
  annotate("text", x = mean(gf$UMR) + 0.1, y = 2, 
           label = paste("Rata-rata:", round(mean(gf$UMR), 2), "jt"), 
           color = "red", hjust = 0) +
  labs(
    title = "Distribusi UMR Kota Semarang (2013-2022)",
    subtitle = "Data dalam Juta Rupiah",
    x = "UMR (Juta Rupiah)",
    y = "Frekuensi"
  ) +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
p1

# Histogram UMR
p1<-ggplot(gf, aes(x = UMR)) +
  geom_histogram(binwidth = 0.2, fill = "chartreuse1", color = "white", alpha = 0.8) +
  geom_vline(aes(xintercept = mean(UMR)), color = "red", linetype = "dashed", size = 1) +
  annotate("text", x = mean(gf$UMR) + 0.1, y = 2, 
           label = paste("Rata-rata:", round(mean(gf$UMR), 2), "jt"), 
           color = "red", hjust = 0) +
  labs(
    title = "Distribusi UMR Kota Semarang (2013-2022)",
    subtitle = "Data dalam Juta Rupiah",
    x = "UMR (Juta Rupiah)",
    y = "Frekuensi"
  ) +
  theme_minimal()
# Simpan sebagai JPG
ggsave("histogram_umr_semarang.jpg", 
       plot = p1,
       width = 10, height = 6, dpi = 300)    
# Diagram garis UMR
p2<-ggplot(gf, aes(x = Tahun, y = UMR)) +
  geom_line(color = "blue", size = 1.5) +
  geom_point(size = 3, color = "blue") +
  geom_text(aes(label = paste(round(UMR, 1), "jt")), vjust = -1, size = 3.5) +
  geom_smooth(method = "lm", se = FALSE, color = "red", linetype = "dashed", alpha = 0.5) +
  scale_x_continuous(breaks = seq(2013, 2022, 1)) +
  labs(
    title = "Perkembangan UMR Kota Semarang (2013-2022)",
    subtitle = "Tren Kenaikan Upah Minimum Regional",
    x = "Tahun",
    y = "UMR (Juta Rupiah)"
  ) +
  theme_minimal()
p2
## `geom_smooth()` using formula = 'y ~ x'

# Diagram garis UMR
p2<-ggplot(gf, aes(x = Tahun, y = UMR)) +
  geom_line(color = "blue", size = 1.5) +
  geom_point(size = 3, color = "blue") +
  geom_text(aes(label = paste(round(UMR, 1), "jt")), vjust = -1, size = 3.5) +
  geom_smooth(method = "lm", se = FALSE, color = "red", linetype = "dashed", alpha = 0.5) +
  scale_x_continuous(breaks = seq(2013, 2022, 1)) +
  labs(
    title = "Perkembangan UMR Kota Semarang (2013-2022)",
    subtitle = "Tren Kenaikan Upah Minimum Regional",
    x = "Tahun",
    y = "UMR (Juta Rupiah)"
  ) +
  theme_minimal()
# Simpan sebagai JPG
ggsave("grafik_umr_semarang.jpg", 
       plot = p2,
       width = 10, height = 6, dpi = 300)
## `geom_smooth()` using formula = 'y ~ x'