1. Insight Utama

Insight: Apakah ada hubungan antara Sales (Penjualan) dan Profit (Keuntungan) pada data penjualan Coffee Chain? Dan bagaimana perbandingan rata-rata profit antar jenis produk?

Dataset ini berasal dari jaringan Coffee Chain yang mencatat penjualan berbagai produk (kopi, espresso, teh herbal, dan teh) di berbagai wilayah Amerika Serikat dari tahun 2012 hingga 2013. Total data yang dianalisis sebanyak 4.248 transaksi.


2. Variabel yang Digunakan

Dari tabel factTable, kita hanya menggunakan dua variabel utama:

Variabel Keterangan
Sales Nilai penjualan dalam satuan dollar
Profit Keuntungan bersih

Dari tabel Product, kita menggunakan:

Variabel Keterangan
Product Type Kategori produk: Coffee, Espresso, Herbal Tea, Tea

Kita sengaja tidak pakai semua kolom karena tujuannya hanya melihat pola Sales vs Profit dan perbedaan profit antar produk.


3. Load dan Persiapan Data

library(DBI)
library(RSQLite)
library(ggplot2)
library(dplyr)
library(MASS)
library(lmtest)
con <- DBI::dbConnect(odbc::odbc(),
                       Driver = "MySQL ODBC 8.0 ANSI Driver",
                       Server = "127.0.0.1",
                       Database = "coffee-chain",
                       UID = "root",
                       PWD = "sotoayam26",
                       Port = 3306)
df <- dbGetQuery(con, "
  SELECT 
    f.Sales,
    f.Profit,
    p.`Product Type` AS Product_Type
  FROM factTable f
  JOIN Product p
    ON f.ProductID = p.ProductID
")

4. Analisis

# EDA
str(df)
## 'data.frame':    4248 obs. of  3 variables:
##  $ Sales       : int  219 190 234 100 134 180 341 150 140 130 ...
##  $ Profit      : int  94 68 101 30 54 53 99 0 33 17 ...
##  $ Product_Type: chr  "Coffee" "Coffee" "Coffee" "Tea" ...
summary(df)
##      Sales         Profit       Product_Type      
##  Min.   : 17   Min.   :-638.0   Length:4248       
##  1st Qu.:100   1st Qu.:  17.0   Class :character  
##  Median :138   Median :  40.0   Mode  :character  
##  Mean   :193   Mean   :  61.1                     
##  3rd Qu.:230   3rd Qu.:  92.0                     
##  Max.   :912   Max.   : 778.0
head(df)
##   Sales Profit Product_Type
## 1   219     94       Coffee
## 2   190     68       Coffee
## 3   234    101       Coffee
## 4   100     30          Tea
## 5   134     54     Espresso
## 6   180     53     Espresso

Berdasarkan hasil eksplorasi data, variabel Sales memiliki nilai minimum sebesar 17 dan maksimum sebesar 912, dengan rata-rata sekitar 193. Hal ini menunjukkan adanya variasi nilai penjualan yang cukup besar. Variabel Profit memiliki nilai minimum sebesar -638 dan maksimum sebesar 778, dengan rata-rata sekitar 61,1. Nilai minimum yang negatif menunjukkan bahwa terdapat beberapa transaksi yang mengalami kerugian. Selain itu, Product Type merupakan variabel kategorik yang terdiri dari beberapa jenis produk seperti Coffee, Espresso, Herbal Tea, dan Tea.

4a. Korelasi Sales dan Profit

correlation <- cor(df$Sales, df$Profit)

cat("Nilai korelasi antara Sales dan Profit =", round(correlation, 4), "\n")
## Nilai korelasi antara Sales dan Profit = 0.7973

Nilai korelasi sebesar 0,80 menunjukkan hubungan yang kuat dan positif antara penjualan dan keuntungan. Semakin tinggi penjualan, semakin besar pula keuntungannya.


4b. Analisis Regresi

model <- lm(Profit ~ Sales, data = df)
summary(model)
## 
## Call:
## lm(formula = Profit ~ Sales, data = df)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -606.28   -9.15   11.77   28.31  466.85 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -42.456004   1.527850  -27.79   <2e-16 ***
## Sales         0.536582   0.006233   86.08   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 61.39 on 4246 degrees of freedom
## Multiple R-squared:  0.6357, Adjusted R-squared:  0.6357 
## F-statistic:  7410 on 1 and 4246 DF,  p-value: < 2.2e-16

Uji Asumsi

shapiro.test(residuals(model))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(model)
## W = 0.67128, p-value < 2.2e-16
bptest(model)
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 0.63012, df = 1, p-value = 0.4273

Hasil uji asumsi menunjukkan bahwa model regresi linear tidak sepenuhnya memenuhi asumsi normalitas dan homoskedastisitas. Oleh karena itu, digunakan regresi robust yang lebih tahan terhadap penyimpangan asumsi, sehingga hasil analisis menjadi lebih stabil.

Regresi Robust

model_robust <- rlm(Profit ~ Sales, data = df)
summary(model_robust)
## 
## Call: rlm(formula = Profit ~ Sales, data = df)
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -623.397  -18.975    1.816   15.896  490.978 
## 
## Coefficients:
##             Value    Std. Error t value 
## (Intercept) -24.0434   0.7875   -30.5317
## Sales         0.4720   0.0032   146.9217
## 
## Residual standard error: 25.76 on 4246 degrees of freedom

Model Regresi Robust: \[\hat{\text{Profit}} = -24.0434 + 0.4720 \times \text{Sales}\]

Interpretasi:
Hasil regresi robust menunjukkan bahwa sales berpengaruh positif terhadap profit. Setiap peningkatan sales sebesar $1 akan meningkatkan profit sebesar $0.4720. Hal ini menunjukkan bahwa semakin tinggi penjualan, maka profit juga meningkat. Nilai intercept sebesar -24.04 menunjukkan bahwa ketika sales bernilai nol, profit diperkirakan bernilai negatif sebesar $-24.04. Namun, kondisi ini kurang relevan karena dalam kenyataannya penjualan tidak mungkin bernilai nol.


5. Visualisasi

Scatter Plot Sales vs Profit

ggplot(df, aes(x = Sales, y = Profit)) +
  geom_point(alpha = 0.4, color = "#4E9AF1", size = 1.8) +
  
  geom_abline(
    intercept = coef(model_robust)[1],
    slope     = coef(model_robust)[2],
    color     = "#E05252",
    linewidth = 1.2
  ) +
  
  labs(
    title = "Hubungan Sales dan Profit (Robust Regression)",
    x = "Sales ($)",
    y = "Profit ($)"
  ) +
  theme_minimal()


Rata-rata Profit per Jenis Produk

product_summary <- df %>%
  group_by(Product_Type) %>%
  summarise(
    Avg_Profit = mean(Profit, na.rm = TRUE),
    Avg_Sales  = mean(Sales, na.rm = TRUE),
    N = n()
  )
ggplot(product_summary, aes(x = reorder(Product_Type, Avg_Profit), 
                             y = Avg_Profit, fill = Product_Type)) +
  geom_col(width = 0.6, show.legend = FALSE) +
  geom_text(aes(label = paste0("$", round(Avg_Profit, 1))),
            hjust = -0.15, size = 4, fontface = "bold") +
  coord_flip(ylim = c(0, 90)) +
  scale_fill_manual(values = c(
    "Coffee"     = "#6F4E37",
    "Espresso"   = "#C0773F",
    "Herbal Tea" = "#5A9E6F",
    "Tea"        = "#4A90D9"
  )) +
  labs(
    title    = "Rata-rata Profit per Jenis Produk",
    subtitle = "Coffee Chain Dataset",
    x        = NULL,
    y        = "Rata-rata Profit ($)"
  ) +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"))


6. Interpretasi Hasil

Dari analisis korelasi dan regresi:

Hubungan antara Sales dan Profit cukup kuat (r = 0,80). Model menunjukkan bahwa sebagian besar variasi profit dapat dijelaskan oleh sales, meskipun masih terdapat faktor lain di luar model. Berdasarkan regresi robust, setiap peningkatan sales sebesar $1 akan meningkatkan profit sekitar $0,47. Hal ini menunjukkan bahwa peningkatan penjualan berkontribusi langsung terhadap peningkatan keuntungan.

Dari perbandingan antar produk:

Produk Avg. Profit
Coffee $70,7 (tertinggi)
Herbal Tea $59,9
Espresso $58,4
Tea $55,2 (terendah)

Produk Coffee menghasilkan rata-rata profit tertinggi, sementara Tea paling rendah. Selisihnya tidak terlalu besar ($15,5).


7. Kesimpulan

Dari analisis dataset Coffee Chain ini, dapat disimpulkan:

  1. Sales dan Profit berkorelasi kuat (r = 0,80) strategi meningkatkan penjualan kemungkinan besar akan berdampak positif pada keuntungan.

  2. Model regresi menunjukkan bahwa setiap tambahan $1 penjualan menghasilkan sekitar $0,47 keuntungan tambahan.

  3. Produk Coffee memberi profit tertinggi dibanding kategori lain, sehingga bisa menjadi fokus strategi penjualan jika perusahaan ingin memaksimalkan keuntungan.

  4. Masih terdapat faktor lain di luar sales yang mempengaruhi profit, sehingga model dapat dikembangkan lebih lanjut.