IMPORT LIBRARY

# 1. IMPORT / LOAD DATA
library(readr)     
## Warning: package 'readr' was built under R version 4.5.3
library(readxl)   
## Warning: package 'readxl' was built under R version 4.5.3
# 2. TRANSFORMASI / MANIPULASI DATA
library(dplyr)      
## Warning: package 'dplyr' was built under R version 4.5.3
## 
## 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(tidyr) 
library(stringr)   
library(lubridate) 
## Warning: package 'lubridate' was built under R version 4.5.3
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(forcats)    
## Warning: package 'forcats' was built under R version 4.5.3
library(purrr)  
## Warning: package 'purrr' was built under R version 4.5.3
# 3. ANALISIS STATISTIK & VISUALISASI
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.3
library(psych) 
## Warning: package 'psych' was built under R version 4.5.3
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
library(car)              
## Warning: package 'car' was built under R version 4.5.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.5.3
## 
## Attaching package: 'car'
## The following object is masked from 'package:psych':
## 
##     logit
## The following object is masked from 'package:purrr':
## 
##     some
## The following object is masked from 'package:dplyr':
## 
##     recode
library(stats)                
library(Hmisc)                  
## Warning: package 'Hmisc' was built under R version 4.5.3
## 
## Attaching package: 'Hmisc'
## The following object is masked from 'package:psych':
## 
##     describe
## The following objects are masked from 'package:dplyr':
## 
##     src, summarize
## The following objects are masked from 'package:base':
## 
##     format.pval, units
library(corrplot) 
## Warning: package 'corrplot' was built under R version 4.5.3
## corrplot 0.95 loaded

MEMBANGKITKAN DATA/MEMBUAT DATA DUMMY

VARIABEL DEPENDENT

VARIABEL INDEPENDENT

set.seed(42)
n <- 200   # jumlah responden, ubah sesuai kebutuhan
 
##  X1: Modal (juta rupiah) ---
X1_Modal <- round(rgamma(n, shape = 3, scale = 15) + 5, 1)
X1_Modal <- pmin(pmax(X1_Modal, 5), 250)
 
##  X2: Lama Usaha (tahun) ---
X2_LamaUsaha <- round(rgamma(n, shape = 2, scale = 2.5) + 0.5, 1)
X2_LamaUsaha <- pmin(pmax(X2_LamaUsaha, 0.5), 25)
 
##  X3: Jam Kerja Toko (jam/hari)
X3_JamKerja <- sample(4:16, n, replace = TRUE)
 
## X4: Tenaga Kerja (orang)
X4_TenagaKerja <- sample(1:10, n, replace = TRUE)
 
## X5: Penggunaan Media Sosial Promosi (jam/minggu)
X5_Medsos <- round(rgamma(n, shape = 2, scale = 4), 1)
X5_Medsos <- pmin(pmax(X5_Medsos, 0), 35)
 
##  X6: Kemitraan (unit) ---
X6_Kemitraan <- rpois(n, lambda = 1.2)
X6_Kemitraan <- pmin(pmax(X6_Kemitraan, 0), 5)
 
##  Y: Pendapatan UMKM (juta rupiah) ---
## Dibentuk sebagai fungsi linear dari X1-X6 + noise acak
Y_Pendapatan <- 2.5 * X1_Modal +
                3.0 * X2_LamaUsaha +
                1.2 * X3_JamKerja +
                4.5 * X4_TenagaKerja +
                1.8 * X5_Medsos +
                6.0 * X6_Kemitraan +
                rnorm(n, mean = 0, sd = 20) +
                10
Y_Pendapatan <- round(pmax(Y_Pendapatan, 5), 1)
 
## --- Gabungkan menjadi data frame ---
ID_Responden <- sprintf("R%03d", 1:n)
 
df <- data.frame(
  ID_Responden,
  Y_Pendapatan_UMKM_JutaRp       = Y_Pendapatan,
  X1_Modal_JutaRp                = X1_Modal,
  X2_Lama_Usaha_Tahun            = X2_LamaUsaha,
  X3_Jam_Kerja_Toko_Jam          = X3_JamKerja,
  X4_Tenaga_Kerja_Orang          = X4_TenagaKerja,
  X5_Medsos_Promosi_JamPerMinggu = X5_Medsos,
  X6_Kemitraan_Unit              = X6_Kemitraan
)

head(df, 10)

CLEANING DATA

data = df
data
str(data)
## 'data.frame':    200 obs. of  8 variables:
##  $ ID_Responden                  : chr  "R001" "R002" "R003" "R004" ...
##  $ Y_Pendapatan_UMKM_JutaRp      : num  222 179 214 133 154 ...
##  $ X1_Modal_JutaRp               : num  82.1 30.3 43.6 20.9 40 ...
##  $ X2_Lama_Usaha_Tahun           : num  4.2 9.9 11.2 6 4.1 4 9.2 7.6 6.8 3.7 ...
##  $ X3_Jam_Kerja_Toko_Jam         : int  14 6 13 16 12 9 14 11 6 10 ...
##  $ X4_Tenaga_Kerja_Orang         : int  3 10 2 5 3 7 6 2 4 10 ...
##  $ X5_Medsos_Promosi_JamPerMinggu: num  1.2 6 1.5 11 3.2 12.7 4.4 11.9 7.5 15.1 ...
##  $ X6_Kemitraan_Unit             : num  2 3 3 0 1 0 1 2 0 3 ...
summary(data)
##  ID_Responden       Y_Pendapatan_UMKM_JutaRp X1_Modal_JutaRp 
##  Length:200         Min.   : 73.3            Min.   :  9.20  
##  Class :character   1st Qu.:154.1            1st Qu.: 27.70  
##  Mode  :character   Median :192.2            Median : 43.60  
##                     Mean   :202.9            Mean   : 47.92  
##                     3rd Qu.:235.8            3rd Qu.: 61.10  
##                     Max.   :542.3            Max.   :164.20  
##  X2_Lama_Usaha_Tahun X3_Jam_Kerja_Toko_Jam X4_Tenaga_Kerja_Orang
##  Min.   : 0.500      Min.   : 4.00         Min.   : 1.000       
##  1st Qu.: 2.700      1st Qu.: 7.00         1st Qu.: 3.000       
##  Median : 4.500      Median :11.00         Median : 5.000       
##  Mean   : 5.388      Mean   :10.21         Mean   : 5.465       
##  3rd Qu.: 7.300      3rd Qu.:13.00         3rd Qu.: 8.000       
##  Max.   :20.700      Max.   :16.00         Max.   :10.000       
##  X5_Medsos_Promosi_JamPerMinggu X6_Kemitraan_Unit
##  Min.   : 0.400                 Min.   :0.000    
##  1st Qu.: 3.575                 1st Qu.:0.000    
##  Median : 7.200                 Median :1.000    
##  Mean   : 7.888                 Mean   :1.245    
##  3rd Qu.:11.025                 3rd Qu.:2.000    
##  Max.   :35.000                 Max.   :5.000

UBAH DATA DARI INTERGER KE NUMERIC

data <- data |>  mutate(across(where(is.integer), as.numeric))
str(data)
## 'data.frame':    200 obs. of  8 variables:
##  $ ID_Responden                  : chr  "R001" "R002" "R003" "R004" ...
##  $ Y_Pendapatan_UMKM_JutaRp      : num  222 179 214 133 154 ...
##  $ X1_Modal_JutaRp               : num  82.1 30.3 43.6 20.9 40 ...
##  $ X2_Lama_Usaha_Tahun           : num  4.2 9.9 11.2 6 4.1 4 9.2 7.6 6.8 3.7 ...
##  $ X3_Jam_Kerja_Toko_Jam         : num  14 6 13 16 12 9 14 11 6 10 ...
##  $ X4_Tenaga_Kerja_Orang         : num  3 10 2 5 3 7 6 2 4 10 ...
##  $ X5_Medsos_Promosi_JamPerMinggu: num  1.2 6 1.5 11 3.2 12.7 4.4 11.9 7.5 15.1 ...
##  $ X6_Kemitraan_Unit             : num  2 3 3 0 1 0 1 2 0 3 ...

CEK OUTLIER

# Cek outlier menggunakan metode IQR
num_cols <- data |> select(where(is.numeric), -matches("ID"))

outlier_summary <- sapply(num_cols, function(x) {
  Q1  <- quantile(x, 0.25, na.rm = TRUE)
  Q3  <- quantile(x, 0.75, na.rm = TRUE)
  IQR <- Q3 - Q1
  sum(x < (Q1 - 1.5 * IQR) | x > (Q3 + 1.5 * IQR), na.rm = TRUE)
})

data.frame(Variabel = names(outlier_summary), Jumlah_Outlier = outlier_summary, row.names = NULL)
# Visualisasi outlier dengan boxplot
data |>
  select(where(is.numeric), -matches("ID")) |>
  tidyr::pivot_longer(everything(), names_to = "Variabel", values_to = "Nilai") |>
  ggplot(aes(x = Variabel, y = Nilai)) +
  geom_boxplot() +
  facet_wrap(~Variabel, scales = "free") +
  theme(axis.text.x = element_blank())

# Hapus outlier menggunakan metode IQR
remove_outliers <- function(df) {
  num_vars <- names(df)[sapply(df, is.numeric)]
  num_vars <- num_vars[!grepl("ID", num_vars)]
  
  for (col in num_vars) {
    Q1  <- quantile(df[[col]], 0.25, na.rm = TRUE)
    Q3  <- quantile(df[[col]], 0.75, na.rm = TRUE)
    IQR <- Q3 - Q1
    df <- df[df[[col]] >= (Q1 - 1.5 * IQR) & df[[col]] <= (Q3 + 1.5 * IQR), ]
  }
  df
}

data_clean <- remove_outliers(data)

cat("Jumlah baris sebelum:", nrow(data), "\n")
## Jumlah baris sebelum: 200
cat("Jumlah baris setelah:", nrow(data_clean), "\n")
## Jumlah baris setelah: 186
cat("Outlier dihapus     :", nrow(data) - nrow(data_clean), "baris\n")
## Outlier dihapus     : 14 baris
# Cek ulang outlier setelah penghapusan
outlier_check <- sapply(data_clean |> select(where(is.numeric)), function(x) {
  Q1  <- quantile(x, 0.25, na.rm = TRUE)
  Q3  <- quantile(x, 0.75, na.rm = TRUE)
  IQR <- Q3 - Q1
  sum(x < (Q1 - 1.5 * IQR) | x > (Q3 + 1.5 * IQR), na.rm = TRUE)
})

data.frame(Variabel = names(outlier_check), Jumlah_Outlier = outlier_check, row.names = NULL)
# Boxplot setelah penghapusan outlier
data_clean |>
  select(where(is.numeric), -matches("ID")) |>
  tidyr::pivot_longer(everything(), names_to = "Variabel", values_to = "Nilai") |>
  ggplot(aes(x = Variabel, y = Nilai)) +
  geom_boxplot() +
  facet_wrap(~Variabel, scales = "free") +
  theme(axis.text.x = element_blank()) +
  labs(title = "Boxplot Setelah Penghapusan Outlier")

CEK MISSING VALUE

# Jumlah missing value per kolom
missing_summary <- data_clean |>
  summarise(across(everything(), ~sum(is.na(.)))) |>
  tidyr::pivot_longer(everything(), names_to = "Variabel", values_to = "Missing") |>
  mutate(Persen = round(Missing / nrow(data_clean) * 100, 2))

missing_summary
# Total missing value keseluruhan
cat("Total missing value:", sum(is.na(data_clean)), "\n")
## Total missing value: 0

STATISTIK DESKIRPTIF

# Statistik deskriptif semua kolom numerik
data_clean |>
  select(where(is.numeric)) |>
  tidyr::pivot_longer(everything(), names_to = "Variabel", values_to = "Nilai") |>
  group_by(Variabel) |>
  summarise(
    N        = n(),
    Mean     = round(mean(Nilai, na.rm = TRUE), 3),
    Median   = round(median(Nilai, na.rm = TRUE), 3),
    SD       = round(sd(Nilai, na.rm = TRUE), 3),
    Min      = round(min(Nilai, na.rm = TRUE), 3),
    Max      = round(max(Nilai, na.rm = TRUE), 3)
  )

VISUALISASI DATA

Y PENDAPATAN UMKM

mean_y <- mean(data_clean$Y_Pendapatan_UMKM_JutaRp, na.rm = TRUE)

ggplot(data_clean, aes(x = Y_Pendapatan_UMKM_JutaRp)) +
  geom_histogram(bins =15, fill = "steelblue", color = "white") +
  geom_vline(xintercept = mean_y, color = "red", linetype = "dashed", linewidth = 1) +
  annotate("text", x = mean_y, y = Inf,
           label = paste0("Rata-rata: ", round(mean_y, 1)),
           hjust = -0.1, vjust = 1.5, color = "red", size = 3.5) +
  labs(
    title = "Y PENDAPATAN UMKM",
    x = "Juta Rp",
    y = "Frekuensi"
  ) +
  
  theme_minimal()

X1 MODAL

mean_y <- mean(data_clean$X1_Modal_JutaRp, na.rm = TRUE)

ggplot(data_clean, aes(x = X1_Modal_JutaRp)) +
  geom_histogram(bins =15, fill = "steelblue", color = "white") +
  geom_vline(xintercept = mean_y, color = "red", linetype = "dashed", linewidth = 1) +
  annotate("text", x = mean_y, y = Inf,
           label = paste0("Rata-rata: ", round(mean_y, 1)),
           hjust = -0.1, vjust = 1.5, color = "red", size = 3.5) +
  labs(
    title = "X1 MODAL",
    x = "Juta Rp",
    y = "Frekuensi"
  ) +
  theme_minimal()

X2 LAMA USAHA

mean_x2 <- mean(data_clean$X2_Lama_Usaha_Tahun, na.rm = TRUE)

ggplot(data_clean, aes(x = X2_Lama_Usaha_Tahun)) +
  geom_histogram(bins = 20, fill = "steelblue", color = "white") +
  geom_vline(xintercept = mean_x2, color = "red", linetype = "dashed", linewidth = 1) +
  annotate("text", x = mean_x2, y = Inf,
           label = paste0("Rata-rata: ", round(mean_x2, 1), " thn"),
           hjust = -0.1, vjust = 1.5, color = "red", size = 3.5) +
  labs(
    title = "X2 Lama Usaha",
    x = "Lama Usaha (Tahun)",
    y = "Frekuensi"
  ) +
  theme_minimal()

X3 JAM KERJA

mean_y <- mean(data_clean$X3_Jam_Kerja_Toko_Jam, na.rm = TRUE)

ggplot(data_clean, aes(x = X3_Jam_Kerja_Toko_Jam)) +
  geom_histogram(bins =15, fill = "steelblue", color = "white") +
  geom_vline(xintercept = mean_y, color = "red", linetype = "dashed", linewidth = 1) +
  annotate("text", x = mean_y, y = Inf,
           label = paste0("Rata-rata: ", round(mean_y, 1)),
           hjust = -0.1, vjust = 1.5, color = "red", size = 3.5) +
  labs(
    title = "X3 JAM KERJA",
    x = "JAM KERJA",
    y = "Frekuensi"
  ) +
  theme_minimal()

X4 TENAGA KERJA

mean_y <- mean(data_clean$X4_Tenaga_Kerja_Orang, na.rm = TRUE)

ggplot(data_clean, aes(x = X4_Tenaga_Kerja_Orang)) +
  geom_histogram(bins =15, fill = "steelblue", color = "white") +
  geom_vline(xintercept = mean_y, color = "red", linetype = "dashed", linewidth = 1) +
  annotate("text", x = mean_y, y = Inf,
           label = paste0("Rata-rata: ", round(mean_y, 1)),
           hjust = -0.1, vjust = 1.5, color = "red", size = 3.5) +
  labs(
    title = "X4 TENAGA KERJA",
    x = "TENAGA KERJA",
    y = "Frekuensi"
  ) +
  theme_minimal()

X5 MEDSOS PROMOSI

mean_y <- mean(data_clean$X5_Medsos_Promosi_JamPerMinggu, na.rm = TRUE)

ggplot(data_clean, aes(x = X5_Medsos_Promosi_JamPerMinggu)) +
  geom_histogram(bins =15, fill = "steelblue", color = "white") +
  geom_vline(xintercept = mean_y, color = "red", linetype = "dashed", linewidth = 1) +
  annotate("text", x = mean_y, y = Inf,
           label = paste0("Rata-rata: ", round(mean_y, 1)),
           hjust = -0.1, vjust = 1.5, color = "red", size = 3.5) +
  labs(
    title = "X5 MEDSOS PROMOSI",
    x = "MEDIA SOSIAL PROMOSI",
    y = "Frekuensi"
  ) +
  theme_minimal()

X6 KEMITRAAN

mean_y <- mean(data_clean$X6_Kemitraan_Unit, na.rm = TRUE)

ggplot(data_clean, aes(x = X6_Kemitraan_Unit)) +
  geom_histogram(bins =15, fill = "steelblue", color = "white") +
  geom_vline(xintercept = mean_y, color = "red", linetype = "dashed", linewidth = 1) +
  annotate("text", x = mean_y, y = Inf,
           label = paste0("Rata-rata: ", round(mean_y, 1)),
           hjust = -0.1, vjust = 1.5, color = "red", size = 3.5) +
  labs(
    title = "X6 KEMITRAAN",
    x = "KEMITRAAN ",
    y = "Frekuensi"
  ) +
  theme_minimal()

ANALISIS REGRESI

model <- lm(Y_Pendapatan_UMKM_JutaRp ~ X1_Modal_JutaRp + X2_Lama_Usaha_Tahun +
              X3_Jam_Kerja_Toko_Jam + X4_Tenaga_Kerja_Orang +
              X5_Medsos_Promosi_JamPerMinggu + X6_Kemitraan_Unit,
            data = data_clean)

summary(model)
## 
## Call:
## lm(formula = Y_Pendapatan_UMKM_JutaRp ~ X1_Modal_JutaRp + X2_Lama_Usaha_Tahun + 
##     X3_Jam_Kerja_Toko_Jam + X4_Tenaga_Kerja_Orang + X5_Medsos_Promosi_JamPerMinggu + 
##     X6_Kemitraan_Unit, data = data_clean)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -49.751 -12.454   0.171  13.775  53.755 
## 
## Coefficients:
##                                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                    13.04156    6.43741   2.026  0.04426 *  
## X1_Modal_JutaRp                 2.44825    0.06641  36.866  < 2e-16 ***
## X2_Lama_Usaha_Tahun             3.51962    0.45692   7.703 8.75e-13 ***
## X3_Jam_Kerja_Toko_Jam           1.02598    0.36491   2.812  0.00548 ** 
## X4_Tenaga_Kerja_Orang           3.53177    0.45490   7.764 6.11e-13 ***
## X5_Medsos_Promosi_JamPerMinggu  2.08026    0.28806   7.222 1.42e-11 ***
## X6_Kemitraan_Unit               5.59234    1.25507   4.456 1.47e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 18.63 on 179 degrees of freedom
## Multiple R-squared:  0.8937, Adjusted R-squared:  0.8902 
## F-statistic: 250.9 on 6 and 179 DF,  p-value: < 2.2e-16

UJI NORMALITAS

shapiro.test(residuals(model))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(model)
## W = 0.99326, p-value = 0.5523

INTEPRETASI

Hasil uji Shapiro-Wilk menunjukkan:

W = 0.99326 — nilai W mendekati 1, artinya distribusi residual sangat mendekati distribusi normal. p-value = 0.5523 — jauh di atas α = 0.05. Interpretasi: Tidak ada cukup bukti untuk menolak H₀ (residual berdistribusi normal). Dengan kata lain, asumsi normalitas residual terpenuhi.

UJI MULTIKOLINEARITAS

vif(model)
##                X1_Modal_JutaRp            X2_Lama_Usaha_Tahun 
##                       1.032767                       1.054106 
##          X3_Jam_Kerja_Toko_Jam          X4_Tenaga_Kerja_Orang 
##                       1.027357                       1.034120 
## X5_Medsos_Promosi_JamPerMinggu              X6_Kemitraan_Unit 
##                       1.025311                       1.046705

INTEPRETASI

Variabel VIF Keterangan
X1 Modal 1.033 Aman
X2 Lama Usaha 1.054 Aman
X3 Jam Kerja 1.027 Aman
X4 Tenaga Kerja 1.034 Aman
X5 Medsos 1.025 Aman
X6 Kemitraan 1.047 Aman

UJI HETEROSKADISITAS

library(lmtest)
## Warning: package 'lmtest' was built under R version 4.5.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.5.3
## 
## 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 = 5.9366, df = 6, p-value = 0.4303

INTEPRETASI

Hasil uji Breusch-Pagan menunjukkan:

BP = 5.9366, df = 6 p-value = 0.4303 — jauh di atas α = 0.05 Interpretasi: Tidak ada cukup bukti untuk menolak H₀ (bahwa varians residual konstan). Artinya, asumsi homoskedastisitas terpenuhi, tidak terdapat heteroskedastisitas dalam model.

UJI AUTOKORELASI

durbinWatsonTest(model)
##  lag Autocorrelation D-W Statistic p-value
##    1      -0.1098564      2.185773   0.192
##  Alternative hypothesis: rho != 0

INTEPRETASI

Hasil uji Durbin-Watson menunjukkan:

D-W = 2.1858 — mendekati angka 2 (nilai ideal = tidak ada autokorelasi) Lag-1 Autocorrelation = -0.1099 — sangat kecil, mendekati nol p-value = 0.192 — di atas α = 0.05 Interpretasi: Tidak ada cukup bukti untuk menolak H₀ (tidak terdapat autokorelasi). Asumsi non-autokorelasi terpenuhi, residual antar observasi bersifat independen satu sama lain.

REGRESI LINEAR BERGANDA

summary(model)
## 
## Call:
## lm(formula = Y_Pendapatan_UMKM_JutaRp ~ X1_Modal_JutaRp + X2_Lama_Usaha_Tahun + 
##     X3_Jam_Kerja_Toko_Jam + X4_Tenaga_Kerja_Orang + X5_Medsos_Promosi_JamPerMinggu + 
##     X6_Kemitraan_Unit, data = data_clean)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -49.751 -12.454   0.171  13.775  53.755 
## 
## Coefficients:
##                                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                    13.04156    6.43741   2.026  0.04426 *  
## X1_Modal_JutaRp                 2.44825    0.06641  36.866  < 2e-16 ***
## X2_Lama_Usaha_Tahun             3.51962    0.45692   7.703 8.75e-13 ***
## X3_Jam_Kerja_Toko_Jam           1.02598    0.36491   2.812  0.00548 ** 
## X4_Tenaga_Kerja_Orang           3.53177    0.45490   7.764 6.11e-13 ***
## X5_Medsos_Promosi_JamPerMinggu  2.08026    0.28806   7.222 1.42e-11 ***
## X6_Kemitraan_Unit               5.59234    1.25507   4.456 1.47e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 18.63 on 179 degrees of freedom
## Multiple R-squared:  0.8937, Adjusted R-squared:  0.8902 
## F-statistic: 250.9 on 6 and 179 DF,  p-value: < 2.2e-16

INTEPRETASI

Variabel Koefisien p-value
(Intercept) 13.042 0.04426
X1 Modal (Juta Rp) 2.448 0,0000000000000002
X2 Lama Usaha (Tahun) 3.520 0.000000000000875
X3 Jam Kerja (Jam) 1.026 0.00548
X4 Tenaga Kerja (Orang) 3.532 0.611
X5 Medsos Promosi (Jam/Minggu) 2.080 0.0000000000142
X6 Kemitraan (Unit) 5.59** 0.0000147

Semua variabel signifikan pada α = 0.05. Interpretasi masing-masing koefisien (dengan variabel lain konstan):

  • X1: Setiap penambahan modal 1 juta Rp, pendapatan UMKM meningkat rata-rata Rp 2.448 juta

  • X2: Setiap tambah 1 tahun lama usaha, pendapatan meningkat rata-rata Rp 3.520 juta

  • X3: Setiap tambah 1 jam kerja toko per hari, pendapatan meningkat rata-rata Rp 1.026 juta

  • X4: Setiap tambah 1 tenaga kerja, pendapatan meningkat rata-rata Rp 3.532 juta

  • X5: Setiap tambah 1 jam promosi medsos per minggu, pendapatan meningkat rata-rata Rp 2.080 juta

  • X6: Setiap tambah 1 unit kemitraan, pendapatan meningkat rata-rata Rp 5.592 juta — pengaruh terbesar di antara semua variabel

Kebaikan Model (Goodness of Fit)

  • R² = 0.8937 → Model mampu menjelaskan 89.37% variasi pendapatan UMKM. Ini tergolong sangat baik.

  • Adjusted R² = 0.8902 → Setelah koreksi jumlah prediktor, daya jelasnya tetap tinggi (89.02%)

  • Uji F: p-value < 2.2e-16 → Model secara keseluruhan signifikan; minimal ada satu variabel bebas yang berpengaruh nyata terhadap pendapatan UMKM

Kesimpulan: Model regresi ini layak dan andal — seluruh asumsi klasik terpenuhi, semua prediktor signifikan, dan model mampu menjelaskan hampir 90% variasi pendapatan UMKM.

Berikut persamaan model regresi lengkapnya:

Y=13.042+2.448X1​+3.520X2​+1.026X3​+3.532X4​+2.080X5​+5.592X6

Atau secara lengkap dengan nama variabel:

Simbol Variabel
Y Pendapatan UMKM (Juta Rp)
X1 Modal (Juta Rp)
X2 Lama Usaha (Tahun)
X3 Jam Kerja Toko (Jam)
X4 Tenaga Kerja (Orang)
X5 Promosi Media Sosial (Jam/Minggu)
X6 Kemitraan (Unit)
# VISUALISASI REGRSI LINEAR BERGANDA

model
## 
## Call:
## lm(formula = Y_Pendapatan_UMKM_JutaRp ~ X1_Modal_JutaRp + X2_Lama_Usaha_Tahun + 
##     X3_Jam_Kerja_Toko_Jam + X4_Tenaga_Kerja_Orang + X5_Medsos_Promosi_JamPerMinggu + 
##     X6_Kemitraan_Unit, data = data_clean)
## 
## Coefficients:
##                    (Intercept)                 X1_Modal_JutaRp  
##                         13.042                           2.448  
##            X2_Lama_Usaha_Tahun           X3_Jam_Kerja_Toko_Jam  
##                          3.520                           1.026  
##          X4_Tenaga_Kerja_Orang  X5_Medsos_Promosi_JamPerMinggu  
##                          3.532                           2.080  
##              X6_Kemitraan_Unit  
##                          5.592
library(broom)
## Warning: package 'broom' was built under R version 4.5.3
library(dplyr)
library(patchwork)
## Warning: package 'patchwork' was built under R version 4.5.3
tidy_model <- tidy(model, conf.int = TRUE)
augmented  <- augment(model)

label_map <- c(
  "X1_Modal_JutaRp"                = "Modal (X1)",
  "X2_Lama_Usaha_Tahun"            = "Lama Usaha (X2)",
  "X3_Jam_Kerja_Toko_Jam"          = "Jam Kerja (X3)",
  "X4_Tenaga_Kerja_Orang"          = "Tenaga Kerja (X4)",
  "X5_Medsos_Promosi_JamPerMinggu" = "Promosi Medsos (X5)",
  "X6_Kemitraan_Unit"              = "Kemitraan (X6)"
)

p1 <- ggplot(augmented, aes(x = .fitted, y = Y_Pendapatan_UMKM_JutaRp)) +
  geom_point(alpha = 0.5, size = 1.5) +
  geom_abline(slope = 1, intercept = 0, color = "firebrick", linewidth = 0.8, linetype = "dashed") +
  labs(title = "Aktual vs. Nilai Prediksi", x = "Nilai Prediksi (Ŷ)", y = "Nilai Aktual (Y)") +
  theme_minimal(base_size = 11)

coef_plot_data <- tidy_model |>
  filter(term != "(Intercept)") |>
  mutate(label = label_map[term])

p2 <- ggplot(coef_plot_data, aes(x = estimate, y = reorder(label, estimate))) +
  geom_vline(xintercept = 0, linetype = "dashed", color = "grey50") +
  geom_errorbarh(aes(xmin = conf.low, xmax = conf.high), height = 0.2, color = "steelblue") +
  geom_point(size = 3, color = "steelblue") +
  labs(title = "Koefisien Regresi & 95% CI", x = "Estimasi Koefisien", y = NULL) +
  theme_minimal(base_size = 11)
## Warning: `geom_errorbarh()` was deprecated in ggplot2 4.0.0.
## ℹ Please use the `orientation` argument of `geom_errorbar()` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
p3 <- ggplot(augmented, aes(x = .fitted, y = .resid)) +
  geom_point(alpha = 0.5, size = 1.5) +
  geom_hline(yintercept = 0, color = "firebrick", linewidth = 0.8, linetype = "dashed") +
  labs(title = "Residual vs. Nilai Prediksi", x = "Nilai Prediksi (Ŷ)", y = "Residual") +
  theme_minimal(base_size = 11)

p4 <- ggplot(augmented, aes(x = .resid)) +
  geom_histogram(bins = 25, fill = "steelblue", color = "white", alpha = 0.8) +
  labs(title = "Distribusi Residual", x = "Residual", y = "Frekuensi") +
  theme_minimal(base_size = 11)

(p1 | p2) / (p3 | p4) +
  plot_annotation(
    title = "Visualisasi Model Regresi Linear Berganda",
    subtitle = "Y = Pendapatan UMKM ~ X1 + X2 + X3 + X4 + X5 + X6",
    theme = theme(
      plot.title    = element_text(face = "bold", size = 14),
      plot.subtitle = element_text(size = 10, color = "grey40")
    )
  )
## `height` was translated to `width`.

# eskport data ke file csv

write.csv(data_clean, "data_clean.csv", row.names = FALSE)
cat("Saved:", nrow(data_clean), "rows,", ncol(data_clean), "columns")
## Saved: 186 rows, 8 columns