Pendahuluan

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

Pengertian

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.

Kapan Digunakan?

  • Skala data: Ordinal atau interval/rasio yang tidak berdistribusi normal
  • Jumlah kelompok: ≥2 kelompok independen
  • Asumsi:
    • Sampel acak dan independen
    • Variabel dependen bersifat kontinu atau ordinal
    • Distribusi bentuk sama antar kelompok (variansi tidak perlu sama)

Statistik Uji

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\): Statistik uji Kruskal-Wallis
  • \(N\): Total jumlah observasi dari semua kelompok
  • \(k\): Jumlah kelompok yang dibandingkan
  • \(R_i\): Jumlah rank dari kelompok ke-\(i\)
  • \(n_i\): Jumlah observasi dalam kelompok ke-\(i\)
  • \(\sum\): Operator penjumlahan dari kelompok pertama (\(i=1\)) hingga kelompok ke-\(k\)

Interpretasi Hasil

\(H\) hitung dibandingkan dengan nilai kritis \(\chi^2\) (chi-square) dengan \(df = k-1\)

  • \(p < \alpha\): Tolak \(H_0\) (minimal ada dua kelompok berbeda)
  • \(p \geq \alpha\): Gagal tolak \(H_0\) (tidak ada perbedaan signifikan)

Post-Hoc Analysis

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:

  • Mengidentifikasi pasangan kelompok mana yang berbeda secara signifikan
  • Mengontrol Type I Error akibat multiple comparisons
  • Memberikan informasi lebih detail tentang pola perbedaan antar kelompok

Uji Dunn

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:

  • \(z\): Statistik uji Dunn (mengikuti distribusi normal standar)
  • \(R_i, R_j\): Rata-rata rank dari kelompok ke-\(i\) dan ke-\(j\)
  • \(N\): Total jumlah observasi dari semua kelompok
  • \(n_i, n_j\): Jumlah observasi dalam kelompok ke-\(i\) dan ke-\(j\)

Analisis Data

Muat Library

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)

Import Dataset

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 Deskriptif

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.

Uji Asumsi Normalitas

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

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.

Visualisasi Data

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.

Uji Dunn (Uji Lanjutan)

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.

Kesimpulan

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.