Pendahuluan

Latar Belakang

Profitabilitas merupakan indikator utama keberhasilan bisnis. Bagi perusahaan Coffee Chain yang beroperasi di berbagai wilayah Amerika Serikat, memahami faktor-faktor yang paling signifikan memengaruhi profit menjadi sangat penting untuk pengambilan keputusan strategis — mulai dari pengelolaan biaya operasional, alokasi anggaran pemasaran, hingga strategi ekspansi pasar.

Dataset yang digunakan mencakup 4.248 observasi transaksi pada periode Januari 2012 hingga Desember 2013, dengan cakupan 20 negara bagian, 4 region pasar, dan 4 jenis produk utama (Coffee, Tea, Espresso, Herbal Tea).

Tujuan Analisis

Insight Utama: Variabel mana yang paling signifikan memengaruhi Profit Coffee Chain?

Analisis ini bertujuan untuk:

  1. Mengidentifikasi variabel prediktor yang secara statistik signifikan memengaruhi Profit
  2. Mengukur besaran pengaruh masing-masing variabel melalui koefisien regresi
  3. Mengevaluasi kualitas model melalui uji asumsi regresi linear berganda secara lengkap
  4. Memberikan rekomendasi bisnis berbasis bukti statistik

Persiapan Data

Memuat Library

library(readxl)
library(dplyr)
library(ggplot2)
library(corrplot)
library(car)
library(sandwich)
library(lmtest)
library(nortest)
library(gridExtra)
library(scales)
library(kableExtra)

Memuat dan Memeriksa Data

df <- read_excel("C:/Users/AXIOO/Downloads/1. Tugas SIM 2025B - Coffee Chain Datasets/1. Tugas SIM 2025B - Coffee Chain Datasets.xlsx")

# Dimensi data
cat("Jumlah observasi :", nrow(df), "\n")
## Jumlah observasi : 4248
cat("Jumlah variabel  :", ncol(df), "\n")
## Jumlah variabel  : 20
# Struktur data
glimpse(df)
## Rows: 4,248
## Columns: 20
## $ `Area Code`      <dbl> 719, 970, 970, 303, 303, 720, 970, 719, 970, 719, 303…
## $ Date             <dttm> 2012-01-01, 2012-01-01, 2012-01-01, 2012-01-01, 2012…
## $ Market           <chr> "Central", "Central", "Central", "Central", "Central"…
## $ `Market Size`    <chr> "Major Market", "Major Market", "Major Market", "Majo…
## $ Product          <chr> "Amaretto", "Colombian", "Decaf Irish Cream", "Green …
## $ `Product Line`   <chr> "Beans", "Beans", "Beans", "Leaves", "Beans", "Beans"…
## $ `Product Type`   <chr> "Coffee", "Coffee", "Coffee", "Tea", "Espresso", "Esp…
## $ State            <chr> "Colorado", "Colorado", "Colorado", "Colorado", "Colo…
## $ Type             <chr> "Regular", "Regular", "Decaf", "Regular", "Regular", …
## $ `Budget COGS`    <dbl> 90, 80, 100, 30, 60, 80, 140, 50, 50, 40, 50, 150, 10…
## $ `Budget Margin`  <dbl> 130, 110, 140, 50, 90, 130, 160, 80, 70, 70, 70, 210,…
## $ `Budget Profit`  <dbl> 100, 80, 110, 30, 70, 80, 110, 20, 40, 20, 40, 130, 1…
## $ `Budget Sales`   <dbl> 220, 190, 240, 80, 150, 210, 300, 130, 120, 110, 120,…
## $ COGS             <dbl> 89, 83, 95, 44, 54, 72, 170, 63, 60, 58, 64, 144, 95,…
## $ Inventory        <dbl> 777, 623, 821, 623, 456, 558, 1091, 435, 336, 338, 96…
## $ Margin           <dbl> 130, 107, 139, 56, 80, 108, 171, 87, 80, 72, 76, 201,…
## $ Marketing        <dbl> 24, 27, 26, 14, 15, 23, 47, 57, 19, 22, 19, 47, 30, 7…
## $ Profit           <dbl> 94, 68, 101, 30, 54, 53, 99, 0, 33, 17, 36, 111, 87, …
## $ Sales            <dbl> 219, 190, 234, 100, 134, 180, 341, 150, 140, 130, 140…
## $ `Total Expenses` <dbl> 36, 39, 38, 26, 26, 55, 72, 87, 47, 55, 40, 90, 52, 1…
# Cek missing values
cat("Missing values per kolom:\n")
## Missing values per kolom:
colSums(is.na(df))
##      Area Code           Date         Market    Market Size        Product 
##              0              0              0              0              0 
##   Product Line   Product Type          State           Type    Budget COGS 
##              0              0              0              0              0 
##  Budget Margin  Budget Profit   Budget Sales           COGS      Inventory 
##              0              0              0              0              0 
##         Margin      Marketing         Profit          Sales Total Expenses 
##              0              0              0              0              0
# Cek duplikat
cat("Jumlah baris duplikat:\n")
## Jumlah baris duplikat:
sum(duplicated(df))
## [1] 0

Pemilihan Variabel

Tidak semua variabel dapat digunakan sebagai prediktor sehingga perlu dilakukan pemilihan variabel.

Variabel yang digunakan:

  1. Sales : Pendapatan penjualan
  2. COGS : Biaya langsung produk (Cost of Goods Sold)
  3. Marketing : Biaya pemasaran
  4. Inventory : Stok persediaan
  5. Market : Wilayah pasar (region)
  6. Market Size : Ukuran pasar
  7. Product Type : Jenis produk
  8. Type : Tipe produk (Regular / Decaf)

Variabel yang tidak digunakan:

  1. Margin : Secara konseptual merupakan turunan dari Sales & COGS, berpotensi menyebabkan multikolinearitas sempurna
  2. Total Expenses : Korelasi sangat tinggi dengan Marketing (r = 0,966), sehingga informasinya redundan
  3. Budget_ : Merupakan nilai perencanaan/target, bukan variabel operasional aktual
  4. State, Area Code : State menghasilkan 19 dummy variables; informasinya sudah terwakili oleh variabel Market (region)
df_model <- df %>%
  select(Profit, Sales, COGS, Marketing, Inventory,
         Market, `Market Size`, `Product Type`, Type) %>%
  rename(
    Market_Size  = `Market Size`,
    Product_Type = `Product Type`
  ) %>%
  mutate(
    Market       = factor(Market),
    Market_Size  = factor(Market_Size),
    Product_Type = factor(Product_Type),
    Type         = factor(Type)
  )

Statistik Deskriptif

# Variabel numerik
summary_num <- df_model %>%
  select(Profit, Sales, COGS, Marketing, Inventory) %>%
  summary()

print(summary_num)
##      Profit           Sales          COGS          Marketing     
##  Min.   :-638.0   Min.   : 17   Min.   :  0.00   Min.   :  0.00  
##  1st Qu.:  17.0   1st Qu.:100   1st Qu.: 43.00   1st Qu.: 13.00  
##  Median :  40.0   Median :138   Median : 60.00   Median : 22.00  
##  Mean   :  61.1   Mean   :193   Mean   : 84.43   Mean   : 31.19  
##  3rd Qu.:  92.0   3rd Qu.:230   3rd Qu.:100.00   3rd Qu.: 39.00  
##  Max.   : 778.0   Max.   :912   Max.   :364.00   Max.   :156.00  
##    Inventory      
##  Min.   :-3534.0  
##  1st Qu.:  432.0  
##  Median :  619.0  
##  Mean   :  749.4  
##  3rd Qu.:  910.5  
##  Max.   : 8252.0
# Distribusi variabel kategorikal
cat("\nDistribusi Market:\n");       table(df_model$Market)
## 
## Distribusi Market:
## 
## Central    East   South    West 
##    1344     888     672    1344
cat("\nDistribusi Market Size:\n");  table(df_model$Market_Size)
## 
## Distribusi Market Size:
## 
## Major Market Small Market 
##         1704         2544
cat("\nDistribusi Product Type:\n"); table(df_model$Product_Type)
## 
## Distribusi Product Type:
## 
##     Coffee   Espresso Herbal Tea        Tea 
##       1056       1176       1056        960
cat("\nDistribusi Type:\n");         table(df_model$Type)
## 
## Distribusi Type:
## 
##   Decaf Regular 
##    1848    2400

Visualisasi Data

Distribusi Variabel Dependen: Profit

profit_neg <- sum(df_model$Profit < 0)
pct_neg    <- round(profit_neg / nrow(df_model) * 100, 1)

p1 <- ggplot(df_model, aes(Profit)) +
  geom_histogram(bins = 40, fill = "steelblue", color = "white") +
  geom_vline(xintercept = mean(df_model$Profit),
             linetype = "dashed", color = "red", linewidth = 0.8) +
  annotate("text",
           x = mean(df_model$Profit) + 30, y = Inf, vjust = 1.5,
           label = paste0("Mean = ", round(mean(df_model$Profit), 1)),
           color = "red", size = 3.5) +
  labs(title    = "Distribusi Profit",
       subtitle = paste0(profit_neg, " observasi (", pct_neg, "%) dengan Profit negatif"),
       x = "Profit", y = "Frekuensi") +
  theme_minimal()

p1

Interpretasi: Distribusi Profit bersifat right-skewed dengan rata-rata 61.1 dan rentang -638 hingga 778. Terdapat 528 observasi (12.4%) dengan nilai profit negatif, mencerminkan kondisi bisnis nyata di mana sebagian transaksi mengalami kerugian operasional. Observasi ini dipertahankan dalam analisis untuk menghindari selection bias.

Matriks Korelasi Variabel Numerik

cor_matrix <- cor(df_model[, c("Profit","Sales","COGS","Marketing","Inventory")])

corrplot(cor_matrix,
         method      = "color",
         addCoef.col = "black",
         tl.col      = "black",
         tl.srt      = 45,
         title       = "Matriks Korelasi Variabel Numerik",
         mar         = c(0, 0, 2, 0))

Interpretasi: Sales memiliki korelasi tertinggi dengan Profit (r = 0,80), diikuti COGS (r = 0,46). Sales dan COGS sendiri berkorelasi cukup tinggi (r = 0,87), yang akan dievaluasi lebih lanjut melalui uji VIF. Nilai R² yang tinggi pada model perlu diinterpretasikan secara hati-hati karena sebagian besar dapat dijelaskan oleh hubungan mekanistik antara Sales, COGS, dan Profit — bukan semata-mata karena kekuatan prediktif model secara umum.

Profit berdasarkan Variabel Kategorikal

p_market <- ggplot(df_model, aes(Market, Profit, fill = Market)) +
  geom_boxplot(show.legend = FALSE) +
  coord_flip() +
  labs(title = "Profit per Market", x = "Market", y = "Profit") +
  theme_minimal()

p_size <- ggplot(df_model, aes(Market_Size, Profit, fill = Market_Size)) +
  geom_boxplot(show.legend = FALSE) +
  labs(title = "Profit per Market Size", x = "Market Size", y = "Profit") +
  theme_minimal()

p_prodtype <- ggplot(df_model, aes(Product_Type, Profit, fill = Product_Type)) +
  geom_boxplot(show.legend = FALSE) +
  coord_flip() +
  labs(title = "Profit per Product Type", x = "Product Type", y = "Profit") +
  theme_minimal()

p_type <- ggplot(df_model, aes(Type, Profit, fill = Type)) +
  geom_boxplot(show.legend = FALSE) +
  labs(title = "Profit per Type", x = "Type", y = "Profit") +
  theme_minimal()

gridExtra::grid.arrange(p_market, p_size, p_prodtype, p_type, ncol = 2)

Interpretasi:

  • Market: Region Central dan East memiliki median profit tertinggi; region South cenderung lebih rendah.
  • Market Size: Major Market secara konsisten menghasilkan profit lebih tinggi dibanding Small Market, dengan perbedaan median yang mencolok.
  • Product Type: Coffee memiliki median profit tertinggi secara deskriptif (univariate). Namun perlu dicatat, gambaran ini belum mengontrol variabel lain — hasil regresi multivariat pada bagian selanjutnya akan memberikan perspektif yang berbeda setelah ceteris paribus diterapkan.
  • Type: Produk Regular cenderung menghasilkan profit sedikit lebih tinggi dibanding Decaf.

Hubungan Sales vs Profit (per Product Type)

ggplot(df_model, aes(Sales, Profit)) +
  geom_point(alpha = 0.3, size = 1) +
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  facet_wrap(~Product_Type) +
  labs(title    = "Sales vs Profit per Product Type",
       subtitle = "Garis merah = regresi linear; area abu-abu = confidence interval 95%",
       x = "Sales", y = "Profit") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Interpretasi: Hubungan positif antara Sales dan Profit konsisten di semua jenis produk. Kemiringan garis (slope) terlihat paling curam pada Espresso, mengindikasikan setiap kenaikan penjualan Espresso memberikan tambahan profit yang lebih besar dibanding jenis produk lainnya.


Pemodelan Regresi Linear Berganda

Membangun Model

model <- lm(Profit ~ Sales + COGS + Marketing + Inventory +
              Market + Market_Size + Product_Type + Type,
            data = df_model)

summary(model)
## 
## Call:
## lm(formula = Profit ~ Sales + COGS + Marketing + Inventory + 
##     Market + Market_Size + Product_Type + Type, data = df_model)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -129.799  -10.393   -0.062    9.011  104.807 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             -2.467e+01  1.187e+00 -20.789  < 2e-16 ***
## Sales                    1.225e+00  5.763e-03 212.533  < 2e-16 ***
## COGS                    -1.311e+00  1.756e-02 -74.655  < 2e-16 ***
## Marketing               -1.433e+00  2.039e-02 -70.274  < 2e-16 ***
## Inventory                6.564e-03  7.824e-04   8.390  < 2e-16 ***
## MarketEast              -1.595e+00  8.896e-01  -1.793  0.07311 .  
## MarketSouth              1.959e+00  1.004e+00   1.951  0.05113 .  
## MarketWest              -8.340e-01  8.173e-01  -1.020  0.30762    
## Market_SizeSmall Market -3.359e+00  7.165e-01  -4.688 2.84e-06 ***
## Product_TypeEspresso     4.330e+00  8.656e-01   5.003 5.88e-07 ***
## Product_TypeHerbal Tea   2.773e+00  1.059e+00   2.619  0.00886 ** 
## Product_TypeTea          5.166e+00  9.808e-01   5.267 1.46e-07 ***
## TypeRegular             -1.593e+00  9.137e-01  -1.743  0.08139 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 20.19 on 4235 degrees of freedom
## Multiple R-squared:  0.9607, Adjusted R-squared:  0.9606 
## F-statistic:  8628 on 12 and 4235 DF,  p-value: < 2.2e-16

Kategori Referensi

Dalam model regresi ini, variabel kategorikal dikodekan menggunakan dummy variables dengan satu kategori sebagai referensi. Semua koefisien kategorikal diinterpretasikan relatif terhadap kategori referensi berikut:

Market : Central Market Size : Major Market Product Type : Coffee Type : Decaf


Uji Asumsi Regresi Linear

Sebelum menginterpretasikan koefisien regresi, perlu dipastikan bahwa asumsi-asumsi Classical Linear Regression Model (CLRM) terpenuhi. Lima asumsi utama yang diuji adalah: (1) Normalitas residual, (2) Homoskedastisitas, (3) Multikolinearitas, (4) Independensi residual, dan (5) Linearitas.

Uji 1 — Normalitas Residual

Plot Diagnostik

residuals_df <- data.frame(
  resid  = residuals(model),
  fitted = fitted(model)
)

p_hist <- ggplot(residuals_df, aes(x = resid)) +
  geom_histogram(aes(y = after_stat(density)),
                 bins = 40, fill = "steelblue", color = "white") +
  geom_density(color = "red", linewidth = 1) +
  stat_function(fun  = dnorm,
                args = list(mean = mean(residuals_df$resid),
                            sd   = sd(residuals_df$resid)),
                color = "orange", linewidth = 1, linetype = "dashed") +
  labs(title    = "Histogram Residual",
       subtitle = "Merah = density aktual; Oranye = kurva normal teoritis",
       x = "Residual", y = "Density") +
  theme_minimal()

p_qq <- ggplot(residuals_df, aes(sample = resid)) +
  stat_qq(alpha = 0.3, size = 1) +
  stat_qq_line(color = "red", linewidth = 1) +
  labs(title    = "Q-Q Plot Residual",
       subtitle = "Titik idealnya mengikuti garis merah",
       x = "Theoretical Quantiles", y = "Sample Quantiles") +
  theme_minimal()

gridExtra::grid.arrange(p_hist, p_qq, ncol = 2)

Uji Anderson-Darling

ad_test <- ad.test(residuals(model))
print(ad_test)
## 
##  Anderson-Darling normality test
## 
## data:  residuals(model)
## A = 80.835, p-value < 2.2e-16

Interpretasi Normalitas: Uji Anderson-Darling menghasilkan p-value < 0,05, sehingga secara formal asumsi normalitas residual ditolak. Namun pada sampel besar (n = 4.248), uji ini sangat sensitif terhadap deviasi kecil yang tidak bermakna secara praktis. Q-Q plot menunjukkan distribusi residual mendekati normal di bagian tengah, dengan deviasi hanya pada ekor (heavy tails) akibat outlier — kondisi yang lazim pada data keuangan. Asumsi normalitas tidak menjadi syarat mutlak untuk validitas koefisien; koreksi inferensi dilakukan melalui robust standard error pada tahap berikutnya.


Uji 2 — Homoskedastisitas (Kesamaan Varians Residual)

Plot Residuals vs Fitted & Scale-Location

p_rvf <- ggplot(residuals_df, aes(fitted, resid)) +
  geom_point(alpha = 0.3, size = 1) +
  geom_hline(yintercept = 0, linewidth = 0.8) +
  geom_smooth(method = "loess", se = FALSE, color = "red") +
  labs(title = "Residuals vs Fitted",
       x = "Fitted Values", y = "Residuals") +
  theme_minimal()

p_scale <- ggplot(residuals_df, aes(fitted, sqrt(abs(resid)))) +
  geom_point(alpha = 0.3, size = 1) +
  geom_smooth(method = "loess", se = FALSE, color = "red") +
  labs(title = "Scale-Location",
       x = "Fitted Values", y = expression(sqrt("|Residuals|"))) +
  theme_minimal()

gridExtra::grid.arrange(p_rvf, p_scale, ncol = 2)
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'

Uji Breusch-Pagan

bp_test <- bptest(model)
print(bp_test)
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 1113.8, df = 12, p-value < 2.2e-16

Interpretasi Homoskedastisitas: Uji Breusch-Pagan menghasilkan p-value < 0,05, mengindikasikan adanya heteroskedastisitas. varians residual tidak konstan dan cenderung membesar seiring meningkatnya nilai fitted. Kondisi ini umum terjadi pada data keuangan dengan skala nilai yang bervariasi. Keberadaan heteroskedastisitas menyebabkan standard error OLS menjadi tidak konsisten sehingga uji signifikansi standar tidak dapat diandalkan.


Uji 3 — Multikolinearitas (VIF)

vif(model)
##                   GVIF Df GVIF^(1/(2*Df))
## Sales         7.903145  1        2.811253
## COGS         14.531994  1        3.812085
## Marketing     3.162011  1        1.778205
## Inventory     2.786649  1        1.669326
## Market        1.340252  3        1.050020
## Market_Size   1.284958  1        1.133560
## Product_Type  2.285431  3        1.147699
## Type          2.137982  1        1.462184

Interpretasi Multikolinearitas: Semua variabel memiliki nilai VIF di bawah ambang batas kritis (VIF < 5 untuk prediktor numerik, GVIF yang disesuaikan untuk variabel kategorikal). Tidak ada indikasi multikolinearitas yang mengkhawatirkan. Meskipun Sales dan COGS berkorelasi tinggi secara bivariat (r = 0,87), keduanya masih memberikan kontribusi informasi yang cukup berbeda dalam model multivariat sehingga estimasi koefisien tetap stabil.


Uji 4 — Independensi Residual (Durbin-Watson)

dw_test <- dwtest(model)
print(dw_test)
## 
##  Durbin-Watson test
## 
## data:  model
## DW = 1.708, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0

Interpretasi Autokorelasi: Uji Durbin-Watson menghasilkan p-value < 0,05, namun karena data tidak dimodelkan sebagai deret waktu terstruktur, indikasi autokorelasi ini kemungkinan berasal dari urutan data, bukan dependensi temporal yang bermakna. Oleh karena itu, hasil ini diinterpretasikan secara hati-hati.


Koreksi Inferensi: Newey-West HAC Standard Error

Untuk memastikan inferensi yang robust, digunakan Newey-West HAC standard error yang mampu mengakomodasi heteroskedastisitas dan potensi autokorelasi secara bersama-sama.

nw_se <- NeweyWest(model)

nw_test <- coeftest(model, vcov = nw_se)
print(nw_test)
## 
## t test of coefficients:
## 
##                            Estimate  Std. Error  t value  Pr(>|t|)    
## (Intercept)             -24.6741438   1.8875321 -13.0722 < 2.2e-16 ***
## Sales                     1.2248225   0.0236115  51.8740 < 2.2e-16 ***
## COGS                     -1.3111150   0.0462109 -28.3724 < 2.2e-16 ***
## Marketing                -1.4326742   0.0275009 -52.0956 < 2.2e-16 ***
## Inventory                 0.0065642   0.0021513   3.0514  0.002292 ** 
## MarketEast               -1.5946559   1.9287348  -0.8268  0.408403    
## MarketSouth               1.9588549   1.7879750   1.0956  0.273329    
## MarketWest               -0.8339772   1.8308497  -0.4555  0.648763    
## Market_SizeSmall Market  -3.3588751   0.7846388  -4.2808 1.904e-05 ***
## Product_TypeEspresso      4.3302030   0.9493310   4.5613 5.227e-06 ***
## Product_TypeHerbal Tea    2.7727213   1.0132802   2.7364  0.006238 ** 
## Product_TypeTea           5.1657770   0.9820121   5.2604 1.508e-07 ***
## TypeRegular              -1.5925795   0.5063549  -3.1452  0.001671 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Catatan metodologis: Semua kesimpulan signifikansi variabel pada bagian Interpretasi mengacu pada hasil Newey-West HAC di atas, bukan pada output OLS standar maupun HC1.


Uji 5 — Linearitas

ggplot(residuals_df, aes(fitted, resid)) +
  geom_point(alpha = 0.3, size = 1) +
  geom_hline(yintercept = 0, color = "black", linewidth = 0.8) +
  geom_smooth(method = "loess", se = FALSE, color = "red", linewidth = 1) +
  labs(title    = "Uji Linearitas: Residuals vs Fitted",
       subtitle = "Garis merah idealnya mendatar di sekitar nol",
       x = "Fitted Values", y = "Residuals") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Interpretasi Linearitas: Garis loess (merah) relatif mendatar di sekitar nol tanpa pola kurvilinear yang sistematis, sehingga asumsi linearitas terpenuhi secara memadai. Penyebaran yang melebar pada nilai fitted yang lebih tinggi merupakan cerminan dari heteroskedastisitas yang telah terdeteksi sebelumnya.


                     |

Interpretasi Hasil Model

Goodness of Fit

Berdasarkan hasil model regresi, R² = 0.9607 dan Adjusted R² = 0.9606, artinya model mampu menjelaskan sekitar 96.1% variasi Profit. F-test signifikan (p < 0,001), artinya model secara keseluruhan valid secara statistik.


Variabel Numerik

  • Sales (β = 1.2248, p < 0,001 ***): Setiap kenaikan 1 unit Sales meningkatkan Profit sebesar ≈ 1.2248 unit. Sales adalah prediktor numerik paling dominan dengan pengaruh positif terbesar.

  • COGS (β = -1.3111, p < 0,001 ***): Setiap kenaikan 1 unit COGS menurunkan Profit sebesar ≈ 1.3111 unit. Hubungan negatif ini sesuai ekspektasi teoritis — biaya produksi langsung yang lebih tinggi menekan profitabilitas secara langsung.

  • Marketing (β = -1.4327, p < 0,001 ***): Setiap kenaikan 1 unit biaya Marketing menurunkan Profit sebesar ≈ 1.4327 unit. Koefisien negatif pada Marketing mengindikasikan bahwa peningkatan biaya pemasaran tidak diikuti peningkatan profit dalam jangka pendek.

  • Inventory (β = 0.0066, p = 0,002 **): Meskipun koefisiennya sangat kecil, pengaruh Inventory terhadap Profit terbukti signifikan.


Variabel Kategorikal

  • Market Size - Small Market (β = -3.3589, p < 0,001 ***): Transaksi di Small Market menghasilkan profit lebih rendah sekitar 3.3589 unit dibanding Major Market (referensi).

  • Market - East, South, West (tidak signifikan): Setelah koreksi Newey-West, tidak ada satu pun region yang menunjukkan perbedaan profit signifikan dibanding Central (referensi). East (β ≈ −1,59, p = 0,41), South (β ≈ 1,96, p = 0,27), dan West (β ≈ −0,83, p = 0,65) semuanya tidak signifikan. Artinya, perbedaan antar region yang tampak pada visualisasi deskriptif tidak terbukti secara statistik setelah mengontrol variabel lain.

  • Product Type - Espresso, Tea, Herbal Tea (signifikan): Dibandingkan Coffee (referensi), ketiga jenis produk lainnya menghasilkan profit inkremental yang lebih tinggi dan signifikan setelah mengontrol faktor lain:

    • Espresso: β ≈ +4,33 (p < 0,001 ***)
    • Tea: β ≈ +5,17 (p < 0,001 ***) — selisih terbesar
    • Herbal Tea: β ≈ +2,77 (p = 0,006 **)

    Hasil ini berbeda dari gambaran boxplot deskriptif yang menunjukkan Coffee memiliki median profit tertinggi secara univariate. Perbedaan ini wajar: regresi multivariat mengontrol variabel lain (Sales, COGS, Market, dsb.), sehingga koefisien mencerminkan pengaruh ceteris paribus dari jenis produk — bukan perbandingan rata-rata mentah.

  • Type - Regular (β = -1.5926, p = 0,002 **): Produk Regular menghasilkan profit lebih rendah sekitar 1.5926 unit dibanding Decaf (referensi), dan perbedaan ini signifikan secara statistik setelah koreksi Newey-West.


Kesimpulan

Analisis regresi linear berganda terhadap data Coffee Chain dengan koreksi Newey-West HAC standard error menghasilkan beberapa kesimpulan penting:

  1. Model cukup kuat: Adjusted R² sebesar 96.1% menunjukkan kemampuan prediktif yang tinggi. Namun nilai ini perlu dibaca dengan konteks bahwa sebagian besar variansi dijelaskan oleh hubungan mekanistik Sales–COGS–Profit, bukan semata-mata oleh keragaman prediktor lainnya.

  2. Empat faktor numerik semuanya signifikan setelah koreksi HAC:

    • Sales (β ≈ +1,22): peningkatan penjualan adalah pendorong profit utama
    • COGS (β ≈ −1,31): efisiensi biaya produksi adalah kunci pengendalian profit
    • Marketing (β ≈ −1,43): biaya pemasaran menekan profit jangka pendek
    • Inventory (β ≈ +0,007): signifikan kecil namun positif — ketersediaan stok sedikit mendukung profit
  3. Uji asumsi mendeteksi dua pelanggaran heteroskedastisitas dan autokorelasi, yang telah dikoreksi secara simultan menggunakan Newey-West HAC. Beberapa variabel yang tampak signifikan di bawah OLS standar (misalnya perbedaan antar region Market) terbukti tidak signifikan setelah koreksi HAC, menunjukkan adanya bias estimasi pada pendekatan naif.

  4. Market region tidak terbukti signifikan, namun Market Size terbukti signifikan: Small Market secara struktural menghasilkan profit lebih rendah ≈ 3,36 unit dibanding Major Market.