1 Pendahuluan

1.1 Deskripsi Dataset

Dataset yang digunakan adalah Coffee Chain Datasets, yang berisi data transaksi penjualan produk kopi dan teh dari sebuah jaringan kedai kopi di Amerika Serikat. Data mencakup 4.248 observasi dengan berbagai variabel finansial dan kategorikal.

Variabel-variabel utama yang relevan dalam analisis ini adalah: Market, Market Size, Product, Product Type, Profit, Sales, Budget Profit, dan Total Expenses

1.2 Insight dan Motivasi Analisis

Dalam pengelolaan bisnis rantai kopi, pemahaman tentang seberapa besar perbedaan profitabilitas antar wilayah sangat krusial untuk pengambilan keputusan strategis — seperti alokasi anggaran pemasaran, penentuan target penjualan, maupun ekspansi pasar.

Dataset ini mencakup empat wilayah pasar utama, yaitu Central, East, South, dan West. Secara deskriptif, rata-rata profit di tiap wilayah mungkin tampak berbeda. Namun, pertanyaannya adalah:

Apakah perbedaan rata-rata Profit antar wilayah Market tersebut signifikan secara statistik, atau sekadar variasi acak?

Untuk menjawab pertanyaan ini, digunakan metode Analisis Variansi Satu Arah (One-Way ANOVA). dengan:

  1. Variabel dependen berupa Profit
  2. Variabel independen berupa Market
  3. ANOVA memungkinkan pengujian perbedaan rata-rata lebih dari dua kelompok sekaligus tanpa meningkatkan risiko Type I Error seperti yang terjadi jika menggunakan banyak uji-t terpisah.

2 Persiapan Data

2.1 Memuat Library

library(tidyverse)  # Meliputi ggplot2, dplyr, tidyr, dll.
library(knitr)      # Untuk pembuatan tabel yang rapi
library(kableExtra) # Untuk kustomisasi tabel knitr
library(car)        # Untuk uji Levene (homogenitas varians)

2.2 Membaca Data

Data dibaca dari file coffee_data.csv yang telah disiapkan sebelumnya.

# Membaca data
df <- read.csv("C:/Users/ADVAN/Downloads/1. Tugas SIM 2025B - Coffee Chain Datasets.csv", sep = ";")

# Parse kolom Date dari format lokal Indonesia"
bulan_id <- c(
  "Januari" = "01", "Februari" = "02", "Maret"    = "03",
  "April"   = "04", "Mei"      = "05", "Juni"     = "06",
  "Juli"    = "07", "Agustus"  = "08", "September"= "09",
  "Oktober" = "10", "November" = "11", "Desember" = "12"
)

parse_tanggal_id <- function(x) {
  # Hapus nama hari + koma di awal: "Minggu, Januari 01, 2012" -> "Januari 01, 2012"
  x <- sub("^[^,]+,\\s*", "", x)
  # Ganti nama bulan Indonesia ke angka
  for (nm in names(bulan_id)) {
    x <- gsub(nm, bulan_id[nm], x)
  }
  # Parse: "01 01, 2012" -> as.Date
  as.Date(trimws(x), format = "%m %d, %Y")
}

df$Date   <- parse_tanggal_id(df$Date)
df$Market <- as.factor(df$Market)

glimpse(df)
## Rows: 4,248
## Columns: 20
## $ Area.Code      <int> 719, 970, 970, 303, 303, 720, 970, 719, 970, 719, 303, …
## $ Date           <date> 2012-01-01, 2012-01-01, 2012-01-01, 2012-01-01, 2012-0…
## $ Market         <fct> Central, Central, Central, Central, Central, Central, C…
## $ Market.Size    <chr> "Major Market", "Major Market", "Major Market", "Major …
## $ Product        <chr> "Amaretto", "Colombian", "Decaf Irish Cream", "Green Te…
## $ Product.Line   <chr> "Beans", "Beans", "Beans", "Leaves", "Beans", "Beans", …
## $ Product.Type   <chr> "Coffee", "Coffee", "Coffee", "Tea", "Espresso", "Espre…
## $ State          <chr> "Colorado", "Colorado", "Colorado", "Colorado", "Colora…
## $ Type           <chr> "Regular", "Regular", "Decaf", "Regular", "Regular", "D…
## $ Budget.COGS    <int> 90, 80, 100, 30, 60, 80, 140, 50, 50, 40, 50, 150, 100,…
## $ Budget.Margin  <int> 130, 110, 140, 50, 90, 130, 160, 80, 70, 70, 70, 210, 1…
## $ Budget.Profit  <int> 100, 80, 110, 30, 70, 80, 110, 20, 40, 20, 40, 130, 100…
## $ Budget.Sales   <int> 220, 190, 240, 80, 150, 210, 300, 130, 120, 110, 120, 3…
## $ COGS           <int> 89, 83, 95, 44, 54, 72, 170, 63, 60, 58, 64, 144, 95, 2…
## $ Inventory      <int> 777, 623, 821, 623, 456, 558, 1091, 435, 336, 338, 965,…
## $ Margin         <int> 130, 107, 139, 56, 80, 108, 171, 87, 80, 72, 76, 201, 1…
## $ Marketing      <int> 24, 27, 26, 14, 15, 23, 47, 57, 19, 22, 19, 47, 30, 77,…
## $ Profit         <int> 94, 68, 101, 30, 54, 53, 99, 0, 33, 17, 36, 111, 87, 20…
## $ Sales          <int> 219, 190, 234, 100, 134, 180, 341, 150, 140, 130, 140, …
## $ Total.Expenses <int> 36, 39, 38, 26, 26, 55, 72, 87, 47, 55, 40, 90, 52, 109…

2.3 Seleksi Variabel

Karena fokus analisis adalah perbedaan Profit antar Market, variabel yang relevan diambil sebagai berikut:

df_anova <- df %>%
  select(Market, Profit, Sales, Budget.Profit, Total.Expenses) %>%
  filter(!is.na(Profit), !is.na(Market))

cat("Jumlah observasi yang digunakan:", nrow(df_anova), "\n")
## Jumlah observasi yang digunakan: 4248
cat("Wilayah pasar yang tersedia:", levels(df_anova$Market), "\n")
## Wilayah pasar yang tersedia: Central East South West

3 Deskripsi dan Eksplorasi Data

3.1 Statistik Deskriptif per Wilayah

desc_table <- df_anova %>%
  group_by(Market) %>%
  summarise(
    N          = n(),
    Rata_rata  = round(mean(Profit), 2),
    Std_Dev    = round(sd(Profit), 2),
    Minimum    = min(Profit),
    Median     = median(Profit),
    Maksimum   = max(Profit),
    .groups    = "drop"
  )

kable(
  desc_table,
  caption   = "Tabel 1. Statistik Deskriptif Profit per Wilayah Pasar",
  col.names = c("Wilayah", "N", "Rata-rata", "Std. Deviasi",
                "Minimum", "Median", "Maksimum")
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "bordered"),
    full_width        = FALSE,
    position          = "center",
    font_size         = 13
  ) %>%
  row_spec(0, bold = TRUE, background = "#2c3e50", color = "white")
Tabel 1. Statistik Deskriptif Profit per Wilayah Pasar
Wilayah N Rata-rata Std. Deviasi Minimum Median Maksimum
Central 1344 69.83 73.74 -65 45.0 362
East 888 66.69 138.22 -420 39.5 778
South 672 48.33 54.30 -65 35.0 345
West 1344 55.06 113.88 -638 39.0 511

4 Visualisasi Data

4.1 Boxplot: Sebaran Profit per Wilayah Pasar

Boxplot di bawah ini menggambarkan distribusi Profit pada masing-masing wilayah pasar, termasuk nilai tengah (median), kuartil, dan potensi pencilan outlier.

ggplot(df_anova, aes(x = Market, y = Profit, fill = Market)) +
  geom_boxplot(outlier.shape = 21, outlier.size = 1.5,
               outlier.alpha = 0.5, width = 0.5, alpha = 0.85) +
  stat_summary(fun = mean, geom = "point", shape = 23,
               size = 3, fill = "white", color = "#2c3e50") +
  scale_fill_brewer(palette = "Set2") +
  scale_y_continuous(labels = scales::comma) +
  labs(
    title    = "Sebaran Profit per Wilayah Pasar",
    x        = "Wilayah Pasar (Market)",
    y        = "Profit (USD)",
    fill     = "Wilayah"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title      = element_text(face = "bold", size = 15, color = "#2c3e50"),
    plot.subtitle   = element_text(color = "#7f8c8d", size = 10),
    legend.position = "none",
    panel.grid.major.x = element_blank(),
    panel.grid.minor   = element_blank()
  )

Interpretasi Boxplot:

Dari boxplot di atas, terlihat bahwa setiap wilayah memiliki sebaran dan posisi median Profit yang tidak identik. Perbedaan posisi kotak antar wilayah mengindikasikan adanya variasi rata-rata profit, yang akan diuji secara formal menggunakan ANOVA.


5 Uji Asumsi ANOVA

Sebelum melakukan ANOVA, dua asumsi utama perlu diperiksa:

  1. Normalitas residual — diuji dengan Shapiro-Wilk test per kelompok.
  2. Homogenitas varians (homoscedasticity) — diuji dengan Levene’s test.

5.1 Uji Normalitas (Shapiro-Wilk)

normality_result <- df_anova %>%
  group_by(Market) %>%
  summarise(
    W_statistic = round(shapiro.test(Profit)$statistic, 4),
    p_value     = round(shapiro.test(Profit)$p.value, 4),
    Kesimpulan  = ifelse(shapiro.test(Profit)$p.value > 0.05,
                         "Normal (p > 0.05)", "Tidak Normal (p ≤ 0.05)"),
    .groups = "drop"
  )

kable(
  normality_result,
  caption   = "Tabel 2. Hasil Uji Normalitas Shapiro-Wilk per Wilayah",
  col.names = c("Wilayah", "W Statistik", "p-value", "Kesimpulan")
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "bordered"),
    full_width        = FALSE,
    position          = "center",
    font_size         = 13
  ) %>%
  row_spec(0, bold = TRUE, background = "#2c3e50", color = "white")
Tabel 2. Hasil Uji Normalitas Shapiro-Wilk per Wilayah
Wilayah W Statistik p-value Kesimpulan
Central 0.8745 0 Tidak Normal (p ≤ 0.05)
East 0.7932 0 Tidak Normal (p ≤ 0.05)
South 0.8577 0 Tidak Normal (p ≤ 0.05)
West 0.8057 0 Tidak Normal (p ≤ 0.05)

Catatan: Berdasarkan Central Limit Theorem ANOVA tetap dapat digunakan karena bersifat robust terhadap pelanggaran normalitas ringan pada sampel besar, .

5.2 Uji Homogenitas Varians (Levene’s Test)

levene_result <- leveneTest(Profit ~ Market, data = df_anova)
print(levene_result)
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value    Pr(>F)    
## group    3  38.082 < 2.2e-16 ***
##       4244                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
p_levene <- levene_result$`Pr(>F)`[1]
cat("p-value Levene's Test:", round(p_levene, 4), "\n")
## p-value Levene's Test: 0
if (p_levene > 0.05) {
  cat("Kesimpulan: Varians antar kelompok HOMOGEN (p > 0.05). Asumsi ANOVA terpenuhi.\n")
} else {
  cat("Kesimpulan: Varians antar kelompok TIDAK HOMOGEN (p ≤ 0.05).\n")
  cat("Catatan: Akan digunakan Welch's ANOVA sebagai alternatif yang robust.\n")
}
## Kesimpulan: Varians antar kelompok TIDAK HOMOGEN (p ≤ 0.05).
## Catatan: Akan digunakan Welch's ANOVA sebagai alternatif yang robust.

6 Analisis Data: One-Way ANOVA

6.1 Model ANOVA

# One-Way ANOVA
model_anova <- aov(Profit ~ Market, data = df_anova)
anova_summary <- summary(model_anova)
print(anova_summary)
##               Df   Sum Sq Mean Sq F value   Pr(>F)    
## Market         3   288811   96270   9.361 3.64e-06 ***
## Residuals   4244 43644825   10284                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova_df <- data.frame(
  Sumber_Variasi = c("Market (Antar Kelompok)", "Residuals (Dalam Kelompok)"),
  Df             = anova_summary[[1]]$Df,
  Sum_Sq         = round(anova_summary[[1]]$`Sum Sq`, 2),
  Mean_Sq        = round(anova_summary[[1]]$`Mean Sq`, 2),
  F_value        = c(round(anova_summary[[1]]$`F value`[1], 4), NA),
  p_value        = c(round(anova_summary[[1]]$`Pr(>F)`[1], 6), NA)
)

kable(
  anova_df,
  caption   = "Tabel 3. Tabel ANOVA — Profit berdasarkan Market",
  col.names = c("Sumber Variasi", "df", "Sum of Squares", "Mean Square",
                "F-statistik", "p-value"),
  na        = ""
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "bordered"),
    full_width        = FALSE,
    position          = "center",
    font_size         = 13
  ) %>%
  row_spec(0, bold = TRUE, background = "#2c3e50", color = "white") %>%
  row_spec(1, bold = TRUE)
Tabel 3. Tabel ANOVA — Profit berdasarkan Market
Sumber Variasi df Sum of Squares Mean Square F-statistik p-value
Market (Antar Kelompok) 3 288811.4 96270.48 9.3613 4e-06
Residuals (Dalam Kelompok) 4244 43644825.0 10283.89 NA NA

6.2 Uji Lanjut: Tukey HSD (Post-Hoc Test)

ANOVA menunjukkan hasil signifikan, uji lanjut Tukey HSD (Honestly Significant Difference) dilakukan untuk mengetahui pasangan wilayah mana yang berbeda secara signifikan.

tukey_result <- TukeyHSD(model_anova)
print(tukey_result)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Profit ~ Market, data = df_anova)
## 
## $Market
##                     diff        lwr        upr     p adj
## East-Central   -3.144546 -14.415515  8.1264225 0.8903657
## South-Central -21.500000 -33.813493 -9.1865072 0.0000438
## West-Central  -14.773810 -24.827734 -4.7198847 0.0009266
## South-East    -18.355454 -31.681197 -5.0297102 0.0022850
## West-East     -11.629263 -22.900232 -0.3582944 0.0401115
## West-South      6.726190  -5.587302 19.0396833 0.4969307
tukey_df <- as.data.frame(tukey_result$Market)
tukey_df$Pasangan <- rownames(tukey_df)
tukey_df <- tukey_df %>%
  select(Pasangan, diff, lwr, upr, `p adj`) %>%
  mutate(
    across(c(diff, lwr, upr), ~round(.x, 3)),
    `p adj`    = round(`p adj`, 4),
    Signifikan = ifelse(`p adj` < 0.05, "Ya ✓", "Tidak")
  )

kable(
  tukey_df,
  caption   = "Tabel 4. Hasil Uji Post-Hoc Tukey HSD",
  col.names = c("Pasangan Wilayah", "Selisih Rata-rata",
                "Batas Bawah 95% CI", "Batas Atas 95% CI",
                "p-value (adj.)", "Berbeda Signifikan?"),
  row.names = FALSE
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "bordered"),
    full_width        = FALSE,
    position          = "center",
    font_size         = 13
  ) %>%
  row_spec(0, bold = TRUE, background = "#2c3e50", color = "white") %>%
  row_spec(which(tukey_df$Signifikan == "Ya ✓"),
           background = "#d5f5e3", bold = TRUE)
Tabel 4. Hasil Uji Post-Hoc Tukey HSD
Pasangan Wilayah Selisih Rata-rata Batas Bawah 95% CI Batas Atas 95% CI p-value (adj.) Berbeda Signifikan?
East-Central -3.145 -14.416 8.126 0.8904 Tidak
South-Central -21.500 -33.813 -9.187 0.0000 Ya ✓
West-Central -14.774 -24.828 -4.720 0.0009 Ya ✓
South-East -18.355 -31.681 -5.030 0.0023 Ya ✓
West-East -11.629 -22.900 -0.358 0.0401 Ya ✓
West-South 6.726 -5.587 19.040 0.4969 Tidak
par(mar = c(5, 8, 6, 2))
plot(tukey_result, las = 1, col = "steelblue")
mtext("Selisih Rata-rata Profit Antar Wilayah", side = 3, line = 1.8, 
      cex = 0.95)


7 Interpretasi Hasil

7.1 Ringkasan Hasil Statistik

p_val_anova <- anova_summary[[1]]$`Pr(>F)`[1]
f_stat      <- anova_summary[[1]]$`F value`[1]

ringkasan <- data.frame(
  Komponen = c("Metode Analisis", "Variabel Dependen",
               "Variabel Independen", "Jumlah Kelompok",
               "F-statistik", "p-value ANOVA",
               "Keputusan (α = 0.05)", "Kesimpulan"),
  Hasil = c(
    "One-Way ANOVA",
    "Profit (USD)",
    "Market (Wilayah Pasar)",
    "4 (Central, East, South, West)",
    round(f_stat, 4),
    ifelse(p_val_anova < 0.001, "< 0.001", round(p_val_anova, 4)),
    ifelse(p_val_anova < 0.05, "Tolak H₀", "Gagal Tolak H₀"),
    ifelse(p_val_anova < 0.05,
           "Terdapat perbedaan rata-rata Profit yang signifikan antar wilayah",
           "Tidak terdapat perbedaan rata-rata Profit yang signifikan antar wilayah")
  )
)

kable(ringkasan,
      caption   = "Tabel 5. Ringkasan Hasil Uji ANOVA",
      col.names = c("Komponen", "Hasil")) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "bordered"),
    full_width        = FALSE,
    position          = "center",
    font_size         = 13
  ) %>%
  row_spec(0, bold = TRUE, background = "#2c3e50", color = "white") %>%
  row_spec(7:8, bold = TRUE, background = "#d6eaf8")
Tabel 5. Ringkasan Hasil Uji ANOVA
Komponen Hasil
Metode Analisis One-Way ANOVA
Variabel Dependen Profit (USD)
Variabel Independen Market (Wilayah Pasar)
Jumlah Kelompok 4 (Central, East, South, West)
F-statistik 9.3613
p-value ANOVA < 0.001
Keputusan (α = 0.05) Tolak H₀
Kesimpulan Terdapat perbedaan rata-rata Profit yang signifikan antar wilayah

7.2 Interpretasi Naratif

7.2.1 Visualisasi Boxplot

Dari boxplot yang telah dibuat, terlihat bahwa distribusi Profit pada keempat wilayah memiliki karakteristik yang berbeda-beda. Beberapa hal yang dapat diamati:

  • Terdapat pencilan (outlier) di beberapa wilayah, yang menunjukkan adanya transaksi dengan nilai profit yang jauh di atas maupun di bawah rata-rata.
  • Wilayah dengan kotak yang lebih lebar memiliki variabilitas profit yang lebih tinggi, artinya kinerja penjualannya lebih tidak konsisten.

7.2.2 Uji Asumsi

  • Normalitas: Dengan ukuran sampel yang besar (\(n > 1000\) per kelompok), asumsi normalitas menjadi kurang kritis berdasarkan Central Limit Theorem. ANOVA tetap valid digunakan.
  • Homogenitas Varians: Hasil Levene’s Test tidak homogen, hasil ANOVA tetap dapat dijadikan rujukan dengan catatan interpretasi yang lebih hati-hati,juga digunakan Welch’s ANOVA sebagai alternatif.

7.2.3 Hasil ANOVA

Berdasarkan tabel ANOVA, nilai F-statistik yang besar dengan p-value yang sangat kecil (< 0,05) menunjukkan bahwa:

Terdapat perbedaan rata-rata Profit yang signifikan secara statistik di antara keempat wilayah pasar (Central, East, South, West) pada tingkat kepercayaan 95%.

Artinya, wilayah tempat sebuah produk dijual berpengaruh nyata terhadap besarnya profit yang dihasilkan, bukan sekadar variasi acak.

7.2.4 Hasil Uji Post-Hoc (Tukey HSD)

Uji Tukey HSD memperinci pasangan wilayah mana yang berkontribusi pada perbedaan tersebut. Pasangan wilayah yang memiliki p-value adjusted < 0,05 menunjukkan perbedaan rata-rata profit yang signifikan secara statistik di antara keduanya. Informasi ini sangat berguna bagi manajemen untuk mengidentifikasi wilayah-wilayah yang perlu mendapat perhatian khusus dalam strategi bisnis.


8 Kesimpulan dan Rekomendasi

8.1 Kesimpulan

  1. Berdasarkan hasil One-Way ANOVA, ditemukan bahwa terdapat perbedaan rata-rata Profit yang signifikan secara statistik di antara keempat wilayah pasar (Central, East, South, West) pada \(\alpha = 0.05\).

  2. Hasil Uji Post-Hoc Tukey HSD menunjukkan pasangan wilayah spesifik yang memiliki perbedaan rata-rata profit yang signifikan, membantu manajemen dalam mengidentifikasi sumber perbedaan tersebut.

  3. Perbedaan profitabilitas antar wilayah mengindikasikan bahwa faktor geografis dan karakteristik pasar lokal memainkan peran penting dalam menentukan kinerja finansial jaringan kedai kopi ini.