Dataset yang digunakan adalah Coffee Chain Dataset yang memuat data transaksi penjualan produk kopi dari berbagai pasar (market) di Amerika Serikat pada periode 2012–2013. Dataset ini mencakup berbagai informasi, mulai dari jenis produk, kategori produk, wilayah penjualan, hingga data finansial seperti profit, penjualan, dan biaya operasional.
Topik yang diangkat: Apakah terdapat perbedaan rata-rata profit yang signifikan antar kategori produk (Coffee, Espresso, Tea, dan Herbal Tea)?
Untuk menjawab pertanyaan tersebut, dilakukan analisis menggunakan metode One-Way ANOVA (Analysis of Variance) dengan uji post-hoc Tukey HSD, serta didahului oleh eksplorasi data visual dan uji asumsi normalitas dan homogenitas varians.
library(readxl)
df <- read_excel("D:\\PINDAH\\UNS\\MATA KULIAH\\Semester 4\\SIM\\Tugas 1\\1. Tugas SIM 2025B - Coffee Chain Datasets.xlsx", sheet = "data")
head(df)
## # A tibble: 6 × 20
## `Area Code` Date Market `Market Size` Product `Product Line`
## <dbl> <dttm> <chr> <chr> <chr> <chr>
## 1 719 2012-01-01 00:00:00 Central Major Market Amaretto Beans
## 2 970 2012-01-01 00:00:00 Central Major Market Colombian Beans
## 3 970 2012-01-01 00:00:00 Central Major Market Decaf Ir… Beans
## 4 303 2012-01-01 00:00:00 Central Major Market Green Tea Leaves
## 5 303 2012-01-01 00:00:00 Central Major Market Caffe Mo… Beans
## 6 720 2012-01-01 00:00:00 Central Major Market Decaf Es… Beans
## # ℹ 14 more variables: `Product Type` <chr>, State <chr>, Type <chr>,
## # `Budget COGS` <dbl>, `Budget Margin` <dbl>, `Budget Profit` <dbl>,
## # `Budget Sales` <dbl>, COGS <dbl>, Inventory <dbl>, Margin <dbl>,
## # Marketing <dbl>, Profit <dbl>, Sales <dbl>, `Total Expenses` <dbl>
Dataset berhasil diimpor dari file Excel dengan sheet bernama
data. Tampilan enam baris pertama di atas memberikan
gambaran awal mengenai struktur dan isi dataset, yang mencakup variabel
kategorik (seperti Market, Product,
Product Type) maupun variabel numerik (seperti
Profit, Sales, COGS).
library(dplyr)
# Struktur data
str(df)
## tibble [4,248 × 20] (S3: tbl_df/tbl/data.frame)
## $ Area Code : num [1:4248] 719 970 970 303 303 720 970 719 970 719 ...
## $ Date : POSIXct[1:4248], format: "2012-01-01" "2012-01-01" ...
## $ Market : chr [1:4248] "Central" "Central" "Central" "Central" ...
## $ Market Size : chr [1:4248] "Major Market" "Major Market" "Major Market" "Major Market" ...
## $ Product : chr [1:4248] "Amaretto" "Colombian" "Decaf Irish Cream" "Green Tea" ...
## $ Product Line : chr [1:4248] "Beans" "Beans" "Beans" "Leaves" ...
## $ Product Type : chr [1:4248] "Coffee" "Coffee" "Coffee" "Tea" ...
## $ State : chr [1:4248] "Colorado" "Colorado" "Colorado" "Colorado" ...
## $ Type : chr [1:4248] "Regular" "Regular" "Decaf" "Regular" ...
## $ Budget COGS : num [1:4248] 90 80 100 30 60 80 140 50 50 40 ...
## $ Budget Margin : num [1:4248] 130 110 140 50 90 130 160 80 70 70 ...
## $ Budget Profit : num [1:4248] 100 80 110 30 70 80 110 20 40 20 ...
## $ Budget Sales : num [1:4248] 220 190 240 80 150 210 300 130 120 110 ...
## $ COGS : num [1:4248] 89 83 95 44 54 72 170 63 60 58 ...
## $ Inventory : num [1:4248] 777 623 821 623 456 ...
## $ Margin : num [1:4248] 130 107 139 56 80 108 171 87 80 72 ...
## $ Marketing : num [1:4248] 24 27 26 14 15 23 47 57 19 22 ...
## $ Profit : num [1:4248] 94 68 101 30 54 53 99 0 33 17 ...
## $ Sales : num [1:4248] 219 190 234 100 134 180 341 150 140 130 ...
## $ Total Expenses: num [1:4248] 36 39 38 26 26 55 72 87 47 55 ...
# Dimensi data
dim(df)
## [1] 4248 20
# Nama kolom
colnames(df)
## [1] "Area Code" "Date" "Market" "Market Size"
## [5] "Product" "Product Line" "Product Type" "State"
## [9] "Type" "Budget COGS" "Budget Margin" "Budget Profit"
## [13] "Budget Sales" "COGS" "Inventory" "Margin"
## [17] "Marketing" "Profit" "Sales" "Total Expenses"
# Ringkasan statistik
summary(df)
## Area Code Date Market
## Min. :203.0 Min. :2012-01-01 00:00:00 Length:4248
## 1st Qu.:417.0 1st Qu.:2012-06-23 12:00:00 Class :character
## Median :573.0 Median :2012-12-16 12:00:00 Mode :character
## Mean :582.3 Mean :2012-12-15 22:00:00
## 3rd Qu.:772.0 3rd Qu.:2013-06-08 12:00:00
## Max. :985.0 Max. :2013-12-01 00:00:00
## Market Size Product Product Line Product Type
## Length:4248 Length:4248 Length:4248 Length:4248
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## State Type Budget COGS Budget Margin
## Length:4248 Length:4248 Min. : 0.00 Min. :-210.0
## Class :character Class :character 1st Qu.: 30.00 1st Qu.: 50.0
## Mode :character Mode :character Median : 50.00 Median : 70.0
## Mean : 74.83 Mean : 100.8
## 3rd Qu.: 90.00 3rd Qu.: 130.0
## Max. :450.00 Max. : 690.0
## Budget Profit Budget Sales COGS Inventory
## Min. :-320.00 Min. : 0.0 Min. : 0.00 Min. :-3534.0
## 1st Qu.: 20.00 1st Qu.: 80.0 1st Qu.: 43.00 1st Qu.: 432.0
## Median : 40.00 Median : 130.0 Median : 60.00 Median : 619.0
## Mean : 60.91 Mean : 175.6 Mean : 84.43 Mean : 749.4
## 3rd Qu.: 80.00 3rd Qu.: 210.0 3rd Qu.:100.00 3rd Qu.: 910.5
## Max. : 560.00 Max. :1140.0 Max. :364.00 Max. : 8252.0
## Margin Marketing Profit Sales
## Min. :-302.00 Min. : 0.00 Min. :-638.0 Min. : 17
## 1st Qu.: 52.75 1st Qu.: 13.00 1st Qu.: 17.0 1st Qu.:100
## Median : 76.00 Median : 22.00 Median : 40.0 Median :138
## Mean : 104.29 Mean : 31.19 Mean : 61.1 Mean :193
## 3rd Qu.: 132.00 3rd Qu.: 39.00 3rd Qu.: 92.0 3rd Qu.:230
## Max. : 613.00 Max. :156.00 Max. : 778.0 Max. :912
## Total Expenses
## Min. : 10.00
## 1st Qu.: 33.00
## Median : 46.00
## Mean : 54.06
## 3rd Qu.: 65.00
## Max. :190.00
# Cek missing values
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
Dataset terdiri dari 4.248 baris dan 20
kolom. Terdapat 9 variabel kategorik (bertipe
character) dan 11 variabel numerik. Variabel target
analisis ini adalah Profit, yang memiliki rentang nilai
dari −638 hingga 778 dengan rata-rata 61,1 dan median 40 —
mengindikasikan distribusi yang sedikit condong ke kanan (right-skewed).
Nilai profit negatif menunjukkan adanya produk yang merugi pada periode
tertentu.
Hasil pemeriksaan missing values menunjukkan bahwa tidak ada nilai yang hilang pada seluruh kolom (semua bernilai 0). Dengan demikian, tidak diperlukan penanganan khusus untuk data yang hilang.
# Agregasi: rata-rata profit per produk per market
df_agg <- df %>%
select(Profit, Product, `Product Type`, Market) %>%
rename(
profit = Profit,
product = Product,
product_type = `Product Type`,
market = Market
) %>%
group_by(product, product_type, market) %>%
summarise(avg_profit = mean(profit, na.rm = TRUE), .groups = "drop")
# Pastikan product_type bertipe factor
df_agg$product_type <- as.factor(df_agg$product_type)
# Cek hasil
str(df_agg)
## tibble [42 × 4] (S3: tbl_df/tbl/data.frame)
## $ product : chr [1:42] "Amaretto" "Amaretto" "Amaretto" "Caffe Latte" ...
## $ product_type: Factor w/ 4 levels "Coffee","Espresso",..: 1 1 1 2 2 2 2 2 2 3 ...
## $ market : chr [1:42] "Central" "East" "West" "South" ...
## $ avg_profit : num [1:42] 53.2 42.1 -17 40.3 62.5 ...
summary(df_agg)
## product product_type market avg_profit
## Length:42 Coffee :11 Length:42 Min. :-59.27
## Class :character Espresso :11 Class :character 1st Qu.: 35.50
## Mode :character Herbal Tea:11 Mode :character Median : 60.82
## Tea : 9 Mean : 60.61
## 3rd Qu.: 90.21
## Max. :227.13
levels(df_agg$product_type)
## [1] "Coffee" "Espresso" "Herbal Tea" "Tea"
# Cek jumlah observasi per grup
df_agg %>% count(product_type)
## # A tibble: 4 × 2
## product_type n
## <fct> <int>
## 1 Coffee 11
## 2 Espresso 11
## 3 Herbal Tea 11
## 4 Tea 9
Data mentah yang tadinya berbentuk data transaksi harian per produk
per pasar kemudian diagregasi menjadi rata-rata profit per
produk per pasar sebagai unit observasi. Langkah ini dilakukan
agar setiap kombinasi produk–market merepresentasikan satu data point
yang stabil, dengan market berperan sebagai unit
replikasi.
Hasil agregasi menghasilkan 42 baris dengan empat
kelompok product_type: Coffee (11 observasi), Espresso
(11), Herbal Tea (11), dan Tea (9). Rentang avg_profit
berada di antara −59,27 hingga 227,13 dengan rata-rata 60,61.
library(ggplot2)
ggplot(df_agg, aes(x = avg_profit)) +
geom_histogram(binwidth = 10, fill = "steelblue",
color = "black", alpha = 0.7) +
theme_minimal() +
labs(
title = "Distribusi Rata-rata Profit per Produk",
x = "Rata-rata Profit",
y = "Frekuensi"
)
Histogram menunjukkan bahwa sebagian besar rata-rata profit terkonsentrasi di kisaran 30 hingga 90. Terdapat ekor kanan yang memanjang dengan beberapa nilai di atas 150–200, mengindikasikan adanya produk dengan profit jauh di atas rata-rata. Beberapa nilai negatif juga terlihat di sisi kiri, yang mewakili produk yang mengalami kerugian di pasar tertentu. Secara umum, distribusi tampak cukup simetris di bagian tengah meskipun ada beberapa pencilan.
df_bar <- df_agg %>%
group_by(product_type) %>%
summarise(mean_profit = mean(avg_profit, na.rm = TRUE))
ggplot(df_bar, aes(x = reorder(product_type, -mean_profit),
y = mean_profit)) +
geom_bar(stat = "identity", fill = "orange", alpha = 0.8) +
theme_minimal() +
labs(
title = "Rata-rata Profit per Kategori Produk",
x = "Kategori Produk",
y = "Rata-rata Profit"
) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Bar chart memperlihatkan urutan rata-rata profit dari tertinggi ke terendah: Coffee (~70) > Tea (~60) > Espresso (~60) > Herbal Tea (~53). Meskipun Coffee tampak sedikit lebih unggul, perbedaan antar kategori secara visual sangat kecil — selisih antara kategori tertinggi (Coffee) dan terendah (Herbal Tea) hanya sekitar 17 poin. Hal ini mengindikasikan bahwa perbedaan antar kategori mungkin tidak signifikan secara statistik.
ggplot(df_agg, aes(x = product_type, y = avg_profit,
fill = product_type)) +
geom_boxplot(alpha = 0.7) +
theme_minimal() +
labs(
title = "Distribusi Rata-rata Profit per Kategori Produk",
x = "Kategori Produk",
y = "Rata-rata Profit"
) +
theme(legend.position = "none")
Boxplot mempertegas bahwa keempat kategori produk memiliki distribusi yang sangat tumpang tindih (overlapping). Rentang interkuartil (kotak) dari masing-masing kategori hampir sejajar satu sama lain. Beberapa outlier terlihat, terutama pada Coffee (nilai sangat tinggi ~227) dan Tea (nilai negatif ~−59). Variasi yang besar dalam masing-masing kelompok ini menjadi sinyal awal bahwa kategori produk mungkin bukan faktor pembeda yang kuat terhadap profit.
Sebelum melakukan ANOVA, dua asumsi utama perlu dipenuhi:
1. Hipotesis
2. Taraf Signifikansi
\[\alpha = 5\% = 0{,}05\]
3. Daerah Kritis
\(H_0\) ditolak jika \(p\text{-}value < 0{,}05\)
4. Statistik Uji
tapply(df_agg$avg_profit, df_agg$product_type, shapiro.test)
## $Coffee
##
## Shapiro-Wilk normality test
##
## data: X[[i]]
## W = 0.90288, p-value = 0.2004
##
##
## $Espresso
##
## Shapiro-Wilk normality test
##
## data: X[[i]]
## W = 0.90475, p-value = 0.2111
##
##
## $`Herbal Tea`
##
## Shapiro-Wilk normality test
##
## data: X[[i]]
## W = 0.95082, p-value = 0.6545
##
##
## $Tea
##
## Shapiro-Wilk normality test
##
## data: X[[i]]
## W = 0.92716, p-value = 0.4548
Hasil Uji Shapiro-Wilk per Kelompok:
| Kelompok | Statistik W | p-value | Keputusan |
|---|---|---|---|
| Coffee | 0,9029 | 0,2004 | Tidak tolak \(H_0\) — Data normal |
| Espresso | 0,9048 | 0,2111 | Tidak tolak \(H_0\) — Data normal |
| Herbal Tea | 0,9508 | 0,6545 | Tidak tolak \(H_0\) — Data normal |
| Tea | 0,9272 | 0,4548 | Tidak tolak \(H_0\) — Data normal |
5. Kesimpulan
Karena seluruh p-value > 0,05, maka gagal menolak \(H_0\). Artinya, data rata-rata profit pada setiap kategori produk berdistribusi normal. Sehingga, asumsi normalitas untuk ANOVA terpenuhi.
1. Hipotesis
2. Taraf Signifikansi
\[\alpha = 5\% = 0{,}05\]
3. Daerah Kritis
\(H_0\) ditolak jika \(p\text{-}value < 0{,}05\)
4. Statistik Uji
library(car)
leveneTest(avg_profit ~ product_type, data = df_agg)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 3 0.3537 0.7867
## 38
Hasil Uji Levene’s Test untuk Homogenitas Varians:
| F-value | p-value | Keputusan |
|---|---|---|
| 0,3537 | 0,7867 | Tidak tolak \(H_0\) — Varians Homogen |
5. Kesimpulan
Karena p-value = 0,787 > 0,05, maka gagal menolak \(H_0\). Artinya, varians rata-rata profit antar keempat kategori produk bersifat homogen.
Setekah kedua asumsi ANOVA telah terpenuhi, berikutnya analisis dapat dilanjutkan.
1. Hipotesis
2. Taraf Signifikansi
\[\alpha = 5\% = 0{,}05\]
3. Daerah Kritis
\(H_0\) ditolak jika \(p\text{-}value < 0{,}05\)
4. Statistik Uji
model_anova <- aov(avg_profit ~ product_type, data = df_agg)
summary(model_anova)
## Df Sum Sq Mean Sq F value Pr(>F)
## product_type 3 1066 355.2 0.124 0.945
## Residuals 38 108660 2859.5
Hasil ANOVA Satu Arah:
| Sumber Variasi | Df | Sum Sq | Mean Sq | F-value | p-value |
|---|---|---|---|---|---|
Antar Kelompok (product_type) |
3 | 1.066 | 355,2 | 0,124 | 0,945 |
| Dalam Kelompok (Residuals) | 38 | 108.660 | 2.859,5 |
5. Kesimpulan
Karena p-value = 0,945 > 0,05, maka gagal menolak \(H_0\). Artinya, tidak terdapat perbedaan rata-rata profit yang signifikan secara statistik antar keempat kategori produk pada taraf signifikansi 5%.
Nilai F yang sangat kecil (0,124) mengindikasikan bahwa variasi rata-rata profit antar kategori jauh lebih kecil dibandingkan variasi dalam masing-masing kategori. Artinya, perbedaan profit yang tampak pada visualisasi EDA sebelumnya tidak lebih dari variasi acak biasa.
Meskipun ANOVA tidak menunjukkan hasil yang signifikan, uji Tukey HSD tetap dilakukan sebagai konfirmasi untuk memeriksa apakah ada pasangan kategori tertentu yang berbeda secara spesifik.
1. Hipotesis (untuk setiap pasangan kelompok \(i\) dan \(j\))
2. Taraf Signifikansi
\[\alpha = 5\% = 0{,}05 \text{ (family-wise)}\]
3. Daerah Kritis
\(H_0\) ditolak jika \(p_{\text{adj}} < 0{,}05\), atau jika interval kepercayaan 95% tidak mencakup nilai 0
4. Statistik Uji
TukeyHSD(model_anova)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = avg_profit ~ product_type, data = df_agg)
##
## $product_type
## diff lwr upr p adj
## Espresso-Coffee -8.4885732 -69.74408 52.76694 0.9821277
## Herbal Tea-Coffee -13.7784722 -75.03398 47.47704 0.9300860
## Tea-Coffee -8.0550365 -72.62401 56.51394 0.9868237
## Herbal Tea-Espresso -5.2898990 -66.54541 55.96561 0.9955254
## Tea-Espresso 0.4335368 -64.13544 65.00251 0.9999979
## Tea-Herbal Tea 5.7234357 -58.84554 70.29241 0.9951667
# Visualisasi Tukey HSD
plot(TukeyHSD(model_anova), las = 1)
Hasil Uji Tukey HSD:
| Pasangan Kelompok | Selisih Mean | Batas Bawah 95% | Batas Atas 95% | p adj | Keputusan |
|---|---|---|---|---|---|
| Espresso − Coffee | −8,489 | −69,744 | 52,767 | 0,982 | Tidak tolak \(H_0\) |
| Herbal Tea − Coffee | −13,778 | −75,034 | 47,477 | 0,930 | Tidak tolak \(H_0\) |
| Tea − Coffee | −8,055 | −72,624 | 56,514 | 0,987 | Tidak tolak \(H_0\) |
| Herbal Tea − Espresso | −5,290 | −66,545 | 55,966 | 0,996 | Tidak tolak \(H_0\) |
| Tea − Espresso | 0,434 | −64,135 | 65,003 | 1,000 | Tidak tolak \(H_0\) |
| Tea − Herbal Tea | 5,723 | −58,846 | 70,292 | 0,995 | Tidak tolak \(H_0\) |
5. Kesimpulan
Seluruh p adj > 0,05 dan semua interval kepercayaan 95% mencakup nilai 0 — terlihat jelas pada visualisasi Tukey HSD di atas di mana semua garis horizontal menyilang garis putus-putus di angka 0. Artinya, tidak ada satu pun pasangan kategori produk yang menunjukkan perbedaan rata-rata profit yang signifikan secara statistik. Hasil ini konsisten dengan dan mempertegas temuan ANOVA satu arah.
ggplot(df_agg, aes(x = reorder(product_type, -avg_profit),
y = avg_profit, fill = product_type)) +
geom_boxplot(alpha = 0.7) +
stat_summary(fun = mean, geom = "point",
shape = 18, size = 3, color = "black") +
theme_minimal() +
labs(
title = "Rata-rata Profit per Kategori Produk",
subtitle = "Titik hitam menunjukkan nilai mean",
x = "Kategori Produk",
y = "Rata-rata Profit"
) +
theme(legend.position = "none")
Boxplot final menampilkan posisi nilai mean (titik hitam berbentuk berlian) di tiap kelompok. Terlihat bahwa posisi mean keempat kategori sangat berdekatan satu sama lain, dan kotak-kotak interkuartil (IQR) dari tiap kategori sangat tumpang tindih. Hal ini secara visual mempertegas temuan ANOVA dan Tukey HSD bahwa tidak ada perbedaan yang berarti antar kategori produk.
Analisis yang dilakukan terhadap data Coffee Chain Dataset menghasilkan temuan sebagai berikut:
Data Understanding: Dataset terdiri dari 4.248 baris dan 20 kolom, tanpa missing values. Variabel profit memiliki rentang yang luas, termasuk nilai negatif.
Data Preparation: Data diagregasi menjadi 42 unit observasi berupa rata-rata profit per produk per pasar, dengan empat kelompok kategori produk: Coffee, Espresso, Herbal Tea, dan Tea.
EDA: Secara visual, keempat kategori produk menunjukkan distribusi profit yang sangat serupa dan saling tumpang tindih, dengan perbedaan rata-rata yang kecil.
Uji Normalitas (Shapiro-Wilk): Seluruh p-value > 0,05 pada semua kelompok \(\rightarrow\) \(H_0\) tidak ditolak \(\rightarrow\) asumsi normalitas terpenuhi.
Uji Homogenitas Varians (Levene’s Test): p-value = 0,787 > 0,05 \(\rightarrow\) \(H_0\) tidak ditolak \(\rightarrow\) asumsi homogenitas varians terpenuhi.
ANOVA Satu Arah: F(3, 38) = 0,124, p-value = 0,945 \(\rightarrow\) \(H_0\) tidak ditolak \(\rightarrow\) tidak terdapat perbedaan rata-rata profit yang signifikan antar kategori produk pada taraf signifikansi 5%.
Tukey HSD: Seluruh pasangan perbandingan menghasilkan p adj > 0,05 \(\rightarrow\) tidak ada pasangan kategori yang secara spesifik berbeda satu sama lain.
Implikasi Bisnis: Kategori produk (Coffee, Espresso, Tea, Herbal Tea) bukan merupakan faktor penentu utama perbedaan profit. Faktor lain seperti wilayah pemasaran, strategi penetapan harga, atau efisiensi biaya operasional kemungkinan lebih berperan dalam menentukan tingkat profit suatu produk.