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
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:
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…
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
## Wilayah pasar yang tersedia: Central East South West
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")| 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 |
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.
Sebelum melakukan ANOVA, dua asumsi utama perlu diperiksa:
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")| 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, .
## 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-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.
# 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)| 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 |
ANOVA menunjukkan hasil signifikan, uji lanjut Tukey HSD (Honestly Significant Difference) dilakukan untuk mengetahui pasangan wilayah mana yang berbeda secara signifikan.
## 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)| 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)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")| 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 |
Dari boxplot yang telah dibuat, terlihat bahwa distribusi Profit pada keempat wilayah memiliki karakteristik yang berbeda-beda. Beberapa hal yang dapat diamati:
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.
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.
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\).
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.
Perbedaan profitabilitas antar wilayah mengindikasikan bahwa faktor geografis dan karakteristik pasar lokal memainkan peran penting dalam menentukan kinerja finansial jaringan kedai kopi ini.