Dalam dunia pemasaran dan penjualan, pemahaman terhadap performa berbagai jenis produk merupakan kunci untuk merumuskan strategi bisnis yang efektif. Perusahaan perlu mengetahui apakah terdapat perbedaan signifikan dalam tingkat penjualan antar jenis produk agar dapat mengalokasikan sumber daya secara optimal dan menargetkan pasar dengan lebih tepat. Penelitian ini dilakukan untuk menganalisis perbedaan penjualan antar jenis produk menggunakan metode statistik non-parametrik, yaitu uji Kruskal-Wallis. Metode ini dipilih karena mampu menguji perbedaan antar tiga kelompok atau lebih tanpa mengharuskan data berdistribusi normal, yang seringkali menjadi kendala dalam analisis penjualan yang bersifat heterogen. Dataset yang digunakan dalam analisis ini mencakup variabel-variabel penting seperti jenis produk, ukuran pasar, dan wilayah pemasaran, dengan fokus utama pada nilai penjualan masing-masing produk. Produk-produk yang dianalisis meliputi kopi, espresso, teh herbal, dan teh, yang merupakan kategori utama dalam industri minuman siap saji. Melalui analisis ini, diharapkan dapat diketahui apakah perbedaan penjualan antar jenis produk tersebut bersifat signifikan secara statistik, sehingga dapat menjadi dasar dalam pengambilan keputusan pemasaran dan pengembangan produk.
Uji Kruskal-Wallis adalah metode statistik non-parametrik untuk menguji apakah terdapat perbedaan signifikan antara median dua atau lebih kelompok independen. Uji ini merupakan alternatif dari ANOVA satu-arah ketika asumsi normalitas tidak terpenuhi.
Statistik uji Kruskal-Wallis (\(H\)) dihitung dengan:
\[H = \frac{12}{N(N+1)} \sum_{i=1}^k \frac{R_i^2}{n_i} - 3(N+1)\]
Keterangan:
\(H\) hitung dibandingkan dengan nilai kritis \(\chi^2\) (chi-square) dengan \(df = k-1\)
Post-hoc analysis dilakukan setelah uji Kruskal-Wallis menunjukkan hasil signifikan (\(p\) < 0.05). Uji yang dapat dilakukan adalah uji Dunn atau Conover-Iman. Tujuan dari Post-hoc analysis adalah sebagai berikut:
Uji Dunn adalah metode post-hoc non-parametrik yang digunakan setelah Uji Kruskal-Wallis menunjukkan hasil signifikan (\(p < 0.05\)). Uji ini membantu mengidentifikasi pasangan kelompok mana yang berbeda secara signifikan ketika kita memiliki lebih dari dua kelompok independen yang tidak memenuhi asumsi distribusi normal (data non-parametrik).
Dengan statistik uji:
\[z = \frac{R_i - R_j}{\sqrt{\frac{N(N+1)}{12} \left( \frac{1}{n_i} + \frac{1}{n_j} \right)}}\]
Keterangan:
Sebelum melakukan analisis, hal pertama yang harus dilakukan adalah memuat library yang diperlukan. Tanpa library yang sesuai, sintaks tidak akan berjalan karena package yang diperlukan belum termuat ke dalam R.
library(readxl)
library(ggplot2)
library(dunn.test)
library(ggpubr)
library(knitr)
library(dplyr)
library(bslib)
library(kableExtra)
library(car)
Langkah selanjutnya adalah mengimport dataset. Setelah diimport, kolom Product Type harus dirubah menjadi faktor agar dapat digunakan untuk uji Kruskal-Wallis.
# Import Dataset
coffee_data <- read_excel("C:/Users/adiit/Downloads/data cm/datacm.xlsx")
names(coffee_data) <- make.names(names(coffee_data))
coffee_data$Product.Type <- as.factor(coffee_data$Product.Type)
# Menampilkan Tabel
kable(head(coffee_data,10), format = "html") %>%
kable_styling(
bootstrap_options = c("striped", "hover"),
full_width = FALSE,
position = "center"
) %>%
column_spec(1:6, width = "100px", extra_css = "text-align: right") %>%
row_spec(0, background = "#B17547", color = "white", bold = TRUE) %>%
row_spec(1:10, background = "#FED8B1")
| Area.Code | Date | Market | Market.Size | Product.Type | Sales |
|---|---|---|---|---|---|
| 719 | 2012-01-01 | Central | Major Market | Coffee | 219 |
| 970 | 2012-01-01 | Central | Major Market | Coffee | 190 |
| 970 | 2012-01-01 | Central | Major Market | Coffee | 234 |
| 303 | 2012-01-01 | Central | Major Market | Tea | 100 |
| 303 | 2012-01-01 | Central | Major Market | Espresso | 134 |
| 720 | 2012-01-01 | Central | Major Market | Espresso | 180 |
| 970 | 2012-01-01 | Central | Major Market | Herbal Tea | 341 |
| 719 | 2012-01-01 | Central | Major Market | Herbal Tea | 150 |
| 970 | 2012-01-01 | Central | Major Market | Herbal Tea | 140 |
| 719 | 2012-01-01 | Central | Major Market | Tea | 130 |
Tabel di atas hanya menampilkan 10 observasi awal, total observasi dari dataset ini sekitar 4.248 observasi.
Analisis statistik deskriptif adalah teknik statistik yang berfungsi memberi gambaran terhadap data yang diperoleh dari sampel tanpa dilakukan analisis lanjut untuk menarik kesimpulan. Berikut adalah analisis deskriptif dengan menggunakan function summary:
# Analisis Deskriptif
summary(coffee_data)
## 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.Type Sales
## Length:4248 Coffee :1056 Min. : 17
## Class :character Espresso :1176 1st Qu.:100
## Mode :character Herbal Tea:1056 Median :138
## Tea : 960 Mean :193
## 3rd Qu.:230
## Max. :912
Berdasarkan analisis deskriptif di atas, data penjualan terdiri dari 4.248 observasi yang tersebar di empat wilayah pasar dengan distribusi yang relatif seimbang. Penjualan tertinggi mencapai 912 unit, sementara penjualan terendah hanya 17 unit. Nilai penjualan memiliki median sebesar 138 dan rata-rata sebesar 193, yang menunjukkan adanya distribusi yang sedikit condong ke kanan (right-skewed). Produk dengan jumlah transaksi terbanyak adalah Espresso (1.176), diikuti oleh Kopi dan Teh Herbal, sedangkan Teh memiliki jumlah transaksi paling sedikit (960). Data ini mencerminkan adanya variasi penjualan antar jenis produk serta potensi ketimpangan distribusi penjualan yang perlu dianalisis lebih lanjut.
Sebelum masuk ke uji Kruskal-Wallis, ada baiknya kita mengecek terlebih dahulu apakah data sales dari masing-masing produk tidak berdistribusi normal. Uji normalitas dapat dilakukan dengan uji Shapiro-Wilk.
# Uji Normalitas
coffee_data %>%
group_by(Product.Type) %>%
summarise(p_value_shapiro = shapiro.test(Sales)$p.value)
## # A tibble: 4 × 2
## Product.Type p_value_shapiro
## <fct> <dbl>
## 1 Coffee 7.56e-38
## 2 Espresso 9.22e-36
## 3 Herbal Tea 1.01e-33
## 4 Tea 5.27e-33
Karena \(p\) jauh di bawah 0,05, maka dapat disimpulkan bahwa data tidak berdistribusi normal.
# QQ Plot dengan interval kepercayaan
qqnorm(coffee_data$Sales[coffee_data$Product.Type == "Coffee"],
main = "QQ Plot Coffee",
ylab = "Sales")
qqline(coffee_data$Sales[coffee_data$Product.Type == "Coffee"], col = "red")
qqnorm(coffee_data$Sales[coffee_data$Product.Type == "Espresso"],
main = "QQ Plot Espresso",
ylab = "Sales")
qqline(coffee_data$Sales[coffee_data$Product.Type == "Espresso"], col = "red")
qqnorm(coffee_data$Sales[coffee_data$Product.Type == "Herbal Tea"],
main = "QQ Plot Herbal Tea",
ylab = "Sales")
qqline(coffee_data$Sales[coffee_data$Product.Type == "Herbal Tea"], col = "red")
qqnorm(coffee_data$Sales[coffee_data$Product.Type == "Tea"],
main = "QQ Plot Tea",
ylab = "Sales")
qqline(coffee_data$Sales[coffee_data$Product.Type == "Tea"], col = "red")
Q-Q plot menunjukkan bahwa banyak titik data menyimpang dari garis diagonal (garis normal), terutama pada bagian ujung (ekor) distribusi. Hal ini menunjukkan bahwa distribusi data tiap produk tidak mengikuti distribusi normal, dengan adanya kemungkinan skewness dan outlier pada data.
Uji Kruskal-Wallis dilakukan dengan menggunakan function kruskal.test dari package stats bawaan dari R. Hasilnya sebagai berikut:
# Uji Kruskal-Wallis
kw_sales_product <- kruskal.test(Sales ~ Product.Type, data = coffee_data)
print(kw_sales_product)
##
## Kruskal-Wallis rank sum test
##
## data: Sales by Product.Type
## Kruskal-Wallis chi-squared = 41.245, df = 3, p-value = 5.802e-09
Dari output dapat kita simpulkan bahwa \(H_0\) ditolak (\(p\)<0,05). Artinya, terdapat perbedaan yang signifikan dalam penjualan antar produk. Uji lanjutan diperlukan untuk mengidentifikasi pasangan produk mana yang berbeda secara signifikan.
Dengan bantuan package ggplot2 serta ggpubr, visualisasi dalam bentuk boxplot dan barplot dapat dilakukan. Tujuan dari boxplot untuk melihat bagaimana distribusi penjualan antar produk, sedangkan barplot akan digunakan untuk melihat total sales dari tiap produk.
# Visualisasi dengan Boxplot
ggplot(coffee_data, aes(x = Product.Type, y = Sales, fill = Product.Type)) +
geom_boxplot() +
labs(title = "Sales Distribution by Product Type",
subtitle = paste("Kruskal-Wallis p =", signif(kw_sales_product$p.value, 3)),
x = "Product Type", y = "Sales") +
theme_minimal()
Selanjutnya menghitung total sales dan mean sales dari masing masing produk.
# Menghitung Total Sales per Produk
total_sales <- coffee_data %>%
group_by(Product.Type) %>%
summarise(Total.Sales = sum(Sales, na.rm = TRUE))
# Menghitung Mean Sales per Produk
mean_sales <- coffee_data %>%
group_by(Product.Type) %>%
summarise(Mean.Sales = mean(Sales, na.rm = TRUE))
# Menampilkan Tabel Total Sales
kable(total_sales, format = "html") %>%
kable_styling(
bootstrap_options = c("striped", "hover"),
full_width = FALSE,
position = "center"
) %>%
column_spec(1:2, width = "100px", extra_css = "text-align: right;") %>%
row_spec(0, background = "#B17547", color = "white", bold = TRUE) %>%
row_spec(1:4, background = "#FED8B1")
| Product.Type | Total.Sales |
|---|---|
| Coffee | 216828 |
| Espresso | 222996 |
| Herbal Tea | 207214 |
| Tea | 172773 |
# Menampilkan Tabel Mean Sales
kable(mean_sales, format = "html") %>%
kable_styling(
bootstrap_options = c("striped", "hover"),
full_width = FALSE,
position = "center"
) %>%
column_spec(1:2, width = "100px", extra_css = "text-align: right;") %>%
row_spec(0, background = "#B17547", color = "white", bold = TRUE) %>%
row_spec(1:4, background = "#FED8B1")
| Product.Type | Mean.Sales |
|---|---|
| Coffee | 205.3295 |
| Espresso | 189.6224 |
| Herbal Tea | 196.2254 |
| Tea | 179.9719 |
# Visualisasi dengan Barplot
ggplot(coffee_data, aes(x = reorder(Product.Type,Sales,order=is.ordered(Sales),decreasing=TRUE), y = Sales, fill = Product.Type)) +
geom_col() +
scale_fill_manual(values = c(
"Coffee" = "#493628",
"Espresso" = "#AB886D",
"Herbal Tea" = "#D6C0B3",
"Tea" = "#E4E0E1"
)) +
labs(
title = "Total Sales per Produk",
x = "Product Type",
y = "Total Sales"
) +
theme_minimal()+
theme(
plot.title = element_text(hjust = 0.5) # Ini untuk judul agar di tengah
)
Berdasarkan visualisasi di atas, dapat disimpulkan bahwa:
1. Kopi
Median tertinggi: per transaksi, penjualan Coffee lebih besar.
Total penjualan kedua tertinggi: meskipun nilainya besar per transaksi, frekuensinya sedikit lebih rendah dari Espresso.
Interpretasi: produk bernilai tinggi yang laku cukup banyak — produk unggulan dengan kontribusi besar secara unit dan nilai.
2. Espresso
Median-nya lebih rendah dari Coffee dan Herbal Tea, namun relatif sama dengan Teh.
Total sales tertinggi: karena jumlah transaksi sangat tinggi.
Interpretasi: produk yang sangat laku, meskipun tiap transaksi tidak sebesar Coffee. Cocok untuk strategi volume tinggi.
3. Teh Herbal
Median lebih tinggi dari Espresso, tapi total sales lebih rendah.
Interpretasi: tiap transaksi bernilai cukup besar, tapi volume penjualannya tidak setinggi Espresso atau Coffee. Bisa dioptimalkan dengan meningkatkan frekuensi pembelian.
4. Teh
Median dan total penjualan paling rendah.
Interpretasi: produk ini menghasilkan nilai per transaksi dan volume penjualan yang kecil. Perlu strategi promosi atau peningkatan daya tarik.
Karena pada uji Kruskal-Wallis \(H_0\) ditolak, maka akan dilanjutkan uji lanjutan untuk mengetahui produk mana yang berbeda signifikan. Dengan menggunakan function dunn.test, maka akan didapat hasilnya sebagai berikut:
# Uji Dunn
if(kw_sales_product$p.value < 0.05) {
dunn.test(coffee_data$Sales, coffee_data$Product.Type, method = "bonferroni")
}
## Kruskal-Wallis rank sum test
##
## data: x and group
## Kruskal-Wallis chi-squared = 41.2451, df = 3, p-value = 0
##
##
## Comparison of x by group
## (Bonferroni)
## Col Mean-|
## Row Mean | Coffee Espresso Herbal T
## ---------+---------------------------------
## Espresso | 3.770266
## | 0.0005*
## |
## Herbal T | 0.153268 -3.612931
## | 1.0000 0.0009*
## |
## Tea | 5.251156 1.708878 5.101581
## | 0.0000* 0.2624 0.0000*
##
## alpha = 0.05
## Reject Ho if p <= alpha/2
Berdasarkan hasil uji Dunn di atas, dapat disimpulkan bahwa:
1. Kopi dengan Espresso
\(p-value\) = 0,0005.
Artinya, Kopi dengan Espresso berbeda secara signifikan.
Berdasarkan nilai z nya, Kopi lebih tinggi dari Espresso.
2. Kopi dengan Teh Herbal
\(p-value\) = 1,0000.
Artinya, Kopi dan Teh Herbal tidak berbeda signifikan (distribusinya sama).
Berdasarkan nilai z nya, Kopi sedikit lebih tinggi dari Teh Herbal.
3. Kopi dengan Teh
\(p-value\) = 0,0000.
Artinya, Kopi dan Teh berbeda signifikan.
Berdasarkan nilai z nya, Kopi lebih tinggi dari Teh.
4. Espresso dengan Teh Herbal
\(p-value\) = 0,0009.
Artinya, Espresso dan Teh Herbal berbeda signifikan.
Berdasarkan nilai z nya, Teh Herbal lebih tinggi dari Espresso.
5. Espresso dengan Teh
\(p-value\) = 0,2624.
Artinya, Espresso dan Teh tidak berbeda signifikan (distribusinya sama).
Berdasarkan nilai z nya, Espresso sedikit lebih tinggi dari Teh.
6. Teh Herbal dengan Teh
\(p-value\) = 0,0000.
Artinya, Teh Herbal dengan Teh berbeda signifikan.
Berdasarkan nilai z nya, Teh Herbal lebih tinggi dari Teh.
Setelah keempat produk dianalisis dengan menggunakan statistik deskriptif, uji Kruskal-Wallis dan uji Dunn, dapat diambil kesimpulan bahwa:
Espresso memiliki frekuensi transaksi dan total sales terbanyak, tetapi rata-rata salesnya tidak begitu baik. Artinya, Espresso sangat cocok untuk strategi volume tinggi.
Kopi memiliki rata-rata sales tertinggi dengan total sales hampir mendekati Espresso. Hal ini berarti Kopi sangat cocok untuk dijadikan produk unggulan karena frekuensi transaksi yang cukup banyak dengan penjualan per tranksaksi relatif tinggi.
Teh Herbal memiliki rata-rata sales tertinggi kedua dan total sales yang hampir mendekati Kopi. Artinya tiap transaksi bernilai cukup besar, tapi volume penjualannya tidak setinggi Espresso atau Coffee. Bisa dioptimalkan dengan meningkatkan frekuensi pembelian misalnya memanfaatkan tren gaya hidup sehat untuk mempromosikan Teh Herbal.
Teh memiliki frekuensi transaksi, rata-rata sales, dan total sales terendah. Artinya produk Teh merupakan produk terburuk sehingga perlu dipromosikan lebih atau ditambah varian tertentu agar konsumen lebih tertarik untuk membeli Teh.