Ukuran pasar (market size) merupakan salah satu dimensi penting dalam pengelolaan bisnis ritel. Perusahaan yang beroperasi di berbagai skala pasar perlu memahami apakah perbedaan ukuran pasar tersebut secara nyata berkontribusi terhadap perbedaan performa bisnis, khususnya dari sisi penjualan (Sales) dan keuntungan (Profit).
Dataset yang digunakan adalah Coffee Chain Datasets, yang mencatat data transaksi penjualan berbagai produk minuman di berbagai wilayah Amerika Serikat pada periode Januari hingga Juni 2012. Dataset ini membagi wilayah pemasaran ke dalam dua kategori, yaitu Major Market dan Small Market.
Analysis of Variance (ANOVA) satu arah adalah metode statistik untuk menguji apakah terdapat perbedaan rata-rata yang signifikan di antara dua atau lebih kelompok independen. ANOVA bekerja dengan membandingkan variansi antar kelompok terhadap variansi dalam kelompok. Apabila variansi antar kelompok jauh lebih besar, maka perbedaan rata-rata antar kelompok kemungkinan bukan terjadi secara kebetulan.
ANOVA mensyaratkan tiga asumsi utama:
Apabila asumsi tidak terpenuhi, digunakan pendekatan alternatif:
Taraf signifikansi yang digunakan pada seluruh pengujian adalah α = 0,05.
library(readxl)
library(ggplot2)
library(dplyr)
library(car)
df <- read_excel("D:\\angelaamasayu\\Sistem Informasi Manajemen\\1. Tugas SIM 2025B - Coffee Chain Datasets.xlsx", sheet = "data")
colnames(df) <- gsub(" ", "_", colnames(df))
df$Market_Size <- as.factor(df$Market_Size)
df$Date <- as.Date(df$Date)
head(df[, c("Date", "Market", "Market_Size", "Product_Type", "Sales", "Profit")])
## # A tibble: 6 × 6
## Date Market Market_Size Product_Type Sales Profit
## <date> <chr> <fct> <chr> <dbl> <dbl>
## 1 2012-01-01 Central Major Market Coffee 219 94
## 2 2012-01-01 Central Major Market Coffee 190 68
## 3 2012-01-01 Central Major Market Coffee 234 101
## 4 2012-01-01 Central Major Market Tea 100 30
## 5 2012-01-01 Central Major Market Espresso 134 54
## 6 2012-01-01 Central Major Market Espresso 180 53
cat("Dimensi dataset:", nrow(df), "baris x", ncol(df), "kolom\n\n")
## Dimensi dataset: 4248 baris x 20 kolom
cat("Jumlah observasi per Market Size:\n")
## Jumlah observasi per Market Size:
print(table(df$Market_Size))
##
## Major Market Small Market
## 1704 2544
cat("\nMissing values pada variabel analisis:\n")
##
## Missing values pada variabel analisis:
print(colSums(is.na(df[, c("Market_Size", "Sales", "Profit")])))
## Market_Size Sales Profit
## 0 0 0
Dataset terdiri dari 4248 observasi dengan dua kategori Market Size: Major Market (n = 1704) dan Small Market (n = 2544). Tidak ditemukan missing values pada variabel yang digunakan.
desc_major_sales <- df %>% filter(Market_Size == "Major Market") %>% pull(Sales)
desc_small_sales <- df %>% filter(Market_Size == "Small Market") %>% pull(Sales)
desc_major_profit <- df %>% filter(Market_Size == "Major Market") %>% pull(Profit)
desc_small_profit <- df %>% filter(Market_Size == "Small Market") %>% pull(Profit)
cat("=== Statistik Deskriptif: Sales ===\n")
## === Statistik Deskriptif: Sales ===
cat("Major Market — Mean:", round(mean(desc_major_sales), 2),
"| SD:", round(sd(desc_major_sales), 2),
"| Median:", round(median(desc_major_sales), 2), "\n")
## Major Market — Mean: 249.5 | SD: 174.51 | Median: 199
cat("Small Market — Mean:", round(mean(desc_small_sales), 2),
"| SD:", round(sd(desc_small_sales), 2),
"| Median:", round(median(desc_small_sales), 2), "\n\n")
## Small Market — Mean: 155.14 | SD: 119.07 | Median: 122
cat("=== Statistik Deskriptif: Profit ===\n")
## === Statistik Deskriptif: Profit ===
cat("Major Market — Mean:", round(mean(desc_major_profit), 2),
"| SD:", round(sd(desc_major_profit), 2),
"| Median:", round(median(desc_major_profit), 2), "\n")
## Major Market — Mean: 91.39 | SD: 124.28 | Median: 73
cat("Small Market — Mean:", round(mean(desc_small_profit), 2),
"| SD:", round(sd(desc_small_profit), 2),
"| Median:", round(median(desc_small_profit), 2), "\n")
## Small Market — Mean: 40.8 | SD: 76.85 | Median: 31
Kelompok Major Market memiliki rata-rata Sales (M = 249.5; SD = 174.51) yang lebih tinggi dibandingkan Small Market (M = 155.14; SD = 119.07). Pola serupa terlihat pada Profit, di mana Major Market (M = 91.39; SD = 124.28) menunjukkan keuntungan rata-rata yang lebih besar daripada Small Market (M = 40.8; SD = 76.85).
df_mean <- df %>%
group_by(Market_Size) %>%
summarise(
Mean_Sales = mean(Sales),
Mean_Profit = mean(Profit)
)
# Bar chart Sales
p1 <- ggplot(df_mean, aes(x = Market_Size, y = Mean_Sales, fill = Market_Size)) +
geom_bar(stat = "identity", width = 0.5) +
geom_text(aes(label = round(Mean_Sales, 1)), vjust = -0.5, size = 4) +
scale_fill_manual(values = c("Major Market" = "#4E79A7", "Small Market" = "#F28E2B")) +
labs(
title = "Rata-rata Sales per Market Size",
x = "Market Size",
y = "Rata-rata Sales",
caption = "Sumber: Coffee Chain Datasets (2012)"
) +
theme_minimal(base_size = 13) +
theme(legend.position = "none",
plot.title = element_text(face = "bold"))
# Bar chart Profit
p2 <- ggplot(df_mean, aes(x = Market_Size, y = Mean_Profit, fill = Market_Size)) +
geom_bar(stat = "identity", width = 0.5) +
geom_text(aes(label = round(Mean_Profit, 1)), vjust = -0.5, size = 4) +
scale_fill_manual(values = c("Major Market" = "#59A14F", "Small Market" = "#E15759")) +
labs(
title = "Rata-rata Profit per Market Size",
x = "Market Size",
y = "Rata-rata Profit",
caption = "Sumber: Coffee Chain Datasets (2012)"
) +
theme_minimal(base_size = 13) +
theme(legend.position = "none",
plot.title = element_text(face = "bold"))
gridExtra::grid.arrange(p1, p2, ncol = 2)
Gambar 1. Rata-rata Sales dan Profit per Market Size
# Histogram Sales
h1 <- ggplot(df, aes(x = Sales, fill = Market_Size)) +
geom_histogram(bins = 30, alpha = 0.7, position = "identity", color = "white") +
scale_fill_manual(values = c("Major Market" = "#4E79A7", "Small Market" = "#F28E2B")) +
labs(
title = "Distribusi Sales per Market Size",
x = "Sales",
y = "Frekuensi",
fill = "Market Size",
caption = "Sumber: Coffee Chain Datasets (2012)"
) +
theme_minimal(base_size = 13) +
theme(plot.title = element_text(face = "bold"))
# Histogram Profit
h2 <- ggplot(df, aes(x = Profit, fill = Market_Size)) +
geom_histogram(bins = 30, alpha = 0.7, position = "identity", color = "white") +
scale_fill_manual(values = c("Major Market" = "#59A14F", "Small Market" = "#E15759")) +
labs(
title = "Distribusi Profit per Market Size",
x = "Profit",
y = "Frekuensi",
fill = "Market Size",
caption = "Sumber: Coffee Chain Datasets (2012)"
) +
theme_minimal(base_size = 13) +
theme(plot.title = element_text(face = "bold"))
gridExtra::grid.arrange(h1, h2, ncol = 2)
Gambar 2. Histogram Distribusi Sales dan Profit per Market Size
ggplot(df, aes(x = Sales, y = Profit, color = Market_Size)) +
geom_point(alpha = 0.4, size = 1.8) +
geom_smooth(method = "lm", se = TRUE, linewidth = 1) +
scale_color_manual(values = c("Major Market" = "#4E79A7", "Small Market" = "#F28E2B")) +
labs(
title = "Hubungan Sales dan Profit berdasarkan Market Size",
subtitle = "Garis menunjukkan tren regresi linear per kelompok",
x = "Sales",
y = "Profit",
color = "Market Size",
caption = "Sumber: Coffee Chain Datasets (2012)"
) +
theme_minimal(base_size = 13) +
theme(plot.title = element_text(face = "bold"),
plot.subtitle = element_text(color = "gray50", size = 10))
Gambar 3. Scatter Plot Sales vs Profit berdasarkan Market Size
Dari histogram terlihat bahwa distribusi Sales dan Profit pada Major Market memiliki sebaran yang lebih lebar dan menjulur ke kanan dibandingkan Small Market. Bar chart mengonfirmasi bahwa rata-rata Sales maupun Profit pada Major Market lebih tinggi. Scatter plot menunjukkan hubungan positif antara Sales dan Profit di kedua kelompok, dengan tren yang lebih curam pada Major Market, mengindikasikan bahwa peningkatan penjualan menghasilkan keuntungan yang lebih besar secara proporsional pada pasar besar.
Sebelum melakukan uji ANOVA, perlu dipastikan bahwa data pada masing-masing kelompok berdistribusi normal. Uji Shapiro-Wilk digunakan untuk menguji asumsi ini dengan hipotesis sebagai berikut:
Hipotesis (Sales):
Hipotesis (Profit):
Taraf signifikansi: α = 0,05. H₀ ditolak apabila p-value < 0,05.
cat("=== Uji Shapiro-Wilk: Sales — Major Market ===\n")
## === Uji Shapiro-Wilk: Sales — Major Market ===
sw_sales_major <- shapiro.test(df$Sales[df$Market_Size == "Major Market"])
print(sw_sales_major)
##
## Shapiro-Wilk normality test
##
## data: df$Sales[df$Market_Size == "Major Market"]
## W = 0.84196, p-value < 2.2e-16
cat("\n=== Uji Shapiro-Wilk: Sales — Small Market ===\n")
##
## === Uji Shapiro-Wilk: Sales — Small Market ===
sw_sales_small <- shapiro.test(df$Sales[df$Market_Size == "Small Market"])
print(sw_sales_small)
##
## Shapiro-Wilk normality test
##
## data: df$Sales[df$Market_Size == "Small Market"]
## W = 0.75389, p-value < 2.2e-16
cat("\n=== Uji Shapiro-Wilk: Profit — Major Market ===\n")
##
## === Uji Shapiro-Wilk: Profit — Major Market ===
sw_profit_major <- shapiro.test(df$Profit[df$Market_Size == "Major Market"])
print(sw_profit_major)
##
## Shapiro-Wilk normality test
##
## data: df$Profit[df$Market_Size == "Major Market"]
## W = 0.89157, p-value < 2.2e-16
cat("\n=== Uji Shapiro-Wilk: Profit — Small Market ===\n")
##
## === Uji Shapiro-Wilk: Profit — Small Market ===
sw_profit_small <- shapiro.test(df$Profit[df$Market_Size == "Small Market"])
print(sw_profit_small)
##
## Shapiro-Wilk normality test
##
## data: df$Profit[df$Market_Size == "Small Market"]
## W = 0.68676, p-value < 2.2e-16
Hasil uji Shapiro-Wilk menunjukkan bahwa p-value untuk Sales pada Major Market = 0 dan Small Market = 0, sedangkan untuk Profit pada Major Market = 0 dan Small Market = 0. Seluruh p-value < 0,05 sehingga H₀ ditolak — data tidak memenuhi asumsi normalitas. Dengan ukuran sampel yang besar (n_Major = 1704; n_Small = 2544), ANOVA tetap robust berdasarkan prinsip Central Limit Theorem. Uji Kruskal-Wallis dijalankan sebagai konfirmasi non-parametrik.
Selanjutnya diuji apakah varians antar kelompok bersifat homogen menggunakan Levene’s Test, dengan hipotesis sebagai berikut:
Hipotesis (Sales):
Hipotesis (Profit):
Taraf signifikansi: α = 0,05. H₀ ditolak apabila p-value < 0,05.
cat("=== Levene's Test: Sales ~ Market_Size ===\n")
## === Levene's Test: Sales ~ Market_Size ===
lev_sales <- leveneTest(Sales ~ Market_Size, data = df)
print(lev_sales)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 1 197.23 < 2.2e-16 ***
## 4246
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
cat("\n=== Levene's Test: Profit ~ Market_Size ===\n")
##
## === Levene's Test: Profit ~ Market_Size ===
lev_profit <- leveneTest(Profit ~ Market_Size, data = df)
print(lev_profit)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 1 288.2 < 2.2e-16 ***
## 4246
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Hasil Levene’s Test menunjukkan p-value untuk Sales = 0 dan untuk Profit = 0. Keduanya < 0,05 sehingga H₀ ditolak — asumsi homogenitas varians tidak terpenuhi. Oleh karena itu, Welch ANOVA digunakan sebagai pendekatan utama yang robust terhadap heterogenitas varians.
Sebelum Welch ANOVA, terlebih dahulu dijalankan One-Way ANOVA klasik sebagai pembanding. Hipotesis yang diuji adalah:
Hipotesis (Sales):
Hipotesis (Profit):
Taraf signifikansi: α = 0,05.
cat("=== One-Way ANOVA: Sales ~ Market_Size ===\n")
## === One-Way ANOVA: Sales ~ Market_Size ===
anova_sales <- aov(Sales ~ Market_Size, data = df)
summary(anova_sales)
## Df Sum Sq Mean Sq F value Pr(>F)
## Market_Size 1 9085787 9085787 438.8 <2e-16 ***
## Residuals 4246 87920884 20707
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
cat("\n=== One-Way ANOVA: Profit ~ Market_Size ===\n")
##
## === One-Way ANOVA: Profit ~ Market_Size ===
anova_profit <- aov(Profit ~ Market_Size, data = df)
summary(anova_profit)
## Df Sum Sq Mean Sq F value Pr(>F)
## Market_Size 1 2611722 2611722 268.4 <2e-16 ***
## Residuals 4246 41321915 9732
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Karena asumsi homogenitas varians tidak terpenuhi, Welch ANOVA digunakan sebagai pendekatan utama. Hipotesis yang diuji sama dengan One-Way ANOVA klasik di atas.
cat("=== Welch ANOVA: Sales ~ Market_Size ===\n")
## === Welch ANOVA: Sales ~ Market_Size ===
welch_sales <- oneway.test(Sales ~ Market_Size, data = df, var.equal = FALSE)
print(welch_sales)
##
## One-way analysis of means (not assuming equal variances)
##
## data: Sales and Market_Size
## F = 379.75, num df = 1.0, denom df = 2751.5, p-value < 2.2e-16
cat("\n=== Welch ANOVA: Profit ~ Market_Size ===\n")
##
## === Welch ANOVA: Profit ~ Market_Size ===
welch_profit <- oneway.test(Profit ~ Market_Size, data = df, var.equal = FALSE)
print(welch_profit)
##
## One-way analysis of means (not assuming equal variances)
##
## data: Profit and Market_Size
## F = 224.79, num df = 1.0, denom df = 2574.1, p-value < 2.2e-16
Sebagai konfirmasi non-parametrik (karena asumsi normalitas tidak terpenuhi), dijalankan pula uji Kruskal-Wallis dengan hipotesis sebagai berikut:
Hipotesis (Sales):
Hipotesis (Profit):
Taraf signifikansi: α = 0,05.
cat("=== Kruskal-Wallis: Sales ~ Market_Size ===\n")
## === Kruskal-Wallis: Sales ~ Market_Size ===
kw_sales <- kruskal.test(Sales ~ Market_Size, data = df)
print(kw_sales)
##
## Kruskal-Wallis rank sum test
##
## data: Sales by Market_Size
## Kruskal-Wallis chi-squared = 500.84, df = 1, p-value < 2.2e-16
cat("\n=== Kruskal-Wallis: Profit ~ Market_Size ===\n")
##
## === Kruskal-Wallis: Profit ~ Market_Size ===
kw_profit <- kruskal.test(Profit ~ Market_Size, data = df)
print(kw_profit)
##
## Kruskal-Wallis rank sum test
##
## data: Profit by Market_Size
## Kruskal-Wallis chi-squared = 424.94, df = 1, p-value < 2.2e-16
Berdasarkan hasil seluruh pengujian yang telah dilakukan, berikut ringkasan temuan untuk masing-masing variabel:
Variabel Sales:
Variabel Profit:
Konsistensi hasil antara One-Way ANOVA, Welch ANOVA, dan Kruskal-Wallis memperkuat keyakinan bahwa perbedaan yang ditemukan bukan merupakan artefak dari pelanggaran asumsi.