# 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
VARIABEL DEPENDENT
VARIABEL INDEPENDENT
X1 = MODAL (JUTA RUPIAH)
X2 = LAMA USAHA (TAHUN)
X3 = JAM KERJA TOKO (JAM)
X4 = TENAGA KERJA (SATUAN ORANG)
X5 = PENGGUNAAN MEDIA SOSIAL PROMOSI (JAM/MINGGU)
X6 = KEMITRAAN (UNIT)
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)
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
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 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")
# 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 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)
)
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()
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()
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()
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()
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()
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()
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()
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
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.
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 |
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.
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.
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