Luthfi Hanan Tamimi
12 May 2025
Dataset ini menganalisis kinerja produk minuman (kopi dan teh) di pasar Amerika Serikat, mencakup Major Market dan Small Market di berbagai state di Amerika Serikat. Produk dikategorikan berdasarkan jenis produk (Amaretto, Colombian, Decaf Irish Cream, dan lain-lain), bentuk (biji/daun), dan tipe penyajian. Data mencakup metrik finansial seperti Sales, Profit, Margin, COGS, serta perbandingan aktual vs. anggaran dan manajemen inventori. Terdapat variasi kinerja yang signifikan antar produk dan lokasi, dengan pasar besar menunjukkan volume penjualan lebih tinggi dibandingkan pasar kecil.
Dataset ini sangat berharga untuk analisis lebih lanjut guna mengidentifikasi produk-produk paling menguntungkan, mengevaluasi kesenjangan antara perencanaan anggaran dan realisasi penjualan, serta memahami pengaruh faktor geografis terhadap kinerja produk.
Penelitian ini bertujuan untuk mengevaluasi dampak variabel Jenis Produk (Product Type) dan Lokasi Negara Bagian (State) terhadap tingkat profitabilitas dengan memanfaatkan dataset Coffee Chain yang merepresentasikan data operasional dan penjualan sebuah jaringan kedai kopi simulasi. Melalui penerapan metode statistik dan teknik visualisasi data, kajian ini diharapkan mampu menghasilkan rekomendasi strategis yang berbasis bukti empiris (evidence-based) untuk mendukung proses pengambilan keputusan manajerial.
#Memuat Packages yang Kita Butuhkan
library(readxl)
library(dplyr)
library(ggplot2)
library(scales)
library(DT)
library(zoo)
library(car)
library(stats)
library(knitr)
library(tidyr)
library(shiny)
library(dunn.test)
library(FSA)
Uji Shapiro-Wilk digunakan untuk menilai apakah suatu sampel berasal dari populasi yang berdistribusi normal. Cocok untuk ukuran sampel kecil hingga sedang.
Rumus dari uji Shapiro-Wilk adalah:
\[ W = \frac{ \left( \sum_{i=1}^{n} a_i x_{(i)} \right)^2 }{ \sum_{i=1}^{n} (x_i - \bar{x})^2 } \]
Keterangan:\(n\): Ukuran sampel
Jika nilai p-value < 0.05, maka data tidak berdistribusi normal.
Uji Kruskal-Wallis digunakan untuk menguji perbedaan median dari tiga atau lebih kelompok yang independen. Uji ini berbasis peringkat.
Rumus statistik uji Kruskal-Wallis:
\[ H = \frac{12}{N(N+1)} \sum_{i=1}^{k} n_i (\bar{R}_i - \bar{R})^2 \]
atau bentuk lainnya:
\[ H = \frac{12}{N(N+1)} \sum_{i=1}^{k} \frac{R_i^2}{n_i} - 3(N+1) \]
Keterangan:\(\bar{R}\): Rata-rata total peringkat \(= \frac{N+1}{2}\)
Statistik \(H\) mengikuti distribusi chi-square dengan derajat kebebasan \(df = k - 1\).
Uji Dunn digunakan sebagai uji lanjutan (post hoc) setelah Kruskal-Wallis untuk membandingkan dua kelompok secara berpasangan.
Rumus statistik Z untuk uji Dunn:
\[ Z_{ij} = \frac{ \bar{R}_i - \bar{R}_j }{ \sqrt{ \frac{N(N+1)}{12} \left( \frac{1}{n_i} + \frac{1}{n_j} \right) } } \]
Keterangan:\(N\): Total jumlah sampel
# Import data dengan path yang benar
Kopi <- read_excel("~/KULIAH SERIUS/markdown/3. CM1 - Coffee Chain Datasets.xlsx", sheet = "data")
#Buat Data Frame
DataKopi <- data.frame (
ProductType = Kopi$`Product Type`,
State = Kopi$State,
Profit = Kopi$Profit
)
DT::datatable(DataKopi)
Statistik deskriptif adalah cabang statistik yang berfokus pada pengumpulan, penyajian, dan ringkasan data untuk memberikan gambaran yang jelas dan informatif tentang karakteristik suatu dataset tanpa membuat inferensi atau generalisasi terhadap populasi. Teknik ini mencakup pengukuran tendensi pusat seperti rata-rata (mean), median, dan modus, serta pengukuran dispersi seperti rentang, varians, dan standar deviasi, yang membantu memahami distribusi dan variabilitas data.
summary(DataKopi)
## ProductType State Profit
## Length:4248 Length:4248 Min. :-638.0
## Class :character Class :character 1st Qu.: 17.0
## Mode :character Mode :character Median : 40.0
## Mean : 61.1
## 3rd Qu.: 92.0
## Max. : 778.0
Pada dataset Coffee Chain, dilakukan analisis deskriptif terhadap beberapa variabel yang dipilih, yaitu Product Type, State, dan Profit. Berdasarkan ringkasan data, variabel Product Type dan State tergolong sebagai data kategorik dengan total observasi sebanyak 4.248. Variabel ini mencerminkan jenis produk yang dipilih oleh konsumen serta wilayah negara bagian tempat transaksi bisnis dilakukan. Mengingat sifatnya yang berupa karakter, pendekatan deskriptif yang paling sesuai untuk kedua variabel ini adalah melalui tabel frekuensi atau representasi visual berbasis kategori.
Variabel Profit menjadi perhatian utama karena merupakan indikator langsung terhadap keberhasilan finansial setiap cabang. Rata-rata profit tercatat sebesar 61,1, sementara mediannya mencapai 40, yang menunjukkan bahwa mayoritas cabang memiliki keuntungan di bawah rata-rata, mengisyaratkan distribusi data yang condong ke arah kanan. Nilai profit minimum sebesar -638 mengindikasikan adanya cabang yang mengalami kerugian signifikan, sedangkan nilai maksimum sebesar 778 menunjukkan keberadaan cabang dengan kinerja sangat menguntungkan. Rentang nilai yang luas ini mencerminkan variasi kinerja yang cukup besar di antara cabang-cabang tersebut.
Berdasarkan statistik deskriptif ini, diperoleh wawasan awal yang berharga mengenai struktur dan sifat data yang digunakan dalam penelitian. Temuan ini juga menjadi fondasi penting untuk melanjutkan ke tahap analisis lebih lanjut, seperti eksplorasi hubungan antar variabel atau pengembangan model prediktif.
Plot yang ditampilkan adalah diagram batang horizontal yang menggambarkan total keuntungan (Total Profit) per jenis produk (Product Type) dalam dataset Coffee Chain, dengan sumbu y menunjukkan empat kategori produk (Coffee, Espresso, Herbal Tea, dan Tea), sedangkan sumbu x menunjukkan nilai profit dalam dolar (USD) dengan skala hingga 80.000.
ggplot(ProfitProduct, aes(y = reorder(`Product Type`, Total_Profit), x = Total_Profit, fill = Total_Profit)) +
geom_bar(stat = "identity", width = 0.7) +
geom_text(aes(label = comma(Total_Profit)), hjust = 1.2, size = 5, fontface = "bold", color = "#878787") +
labs(title = "Total Profit per Product Type",
x = "Total Profit",
y = "Product Type") +
scale_fill_gradient2(low = "white", mid = "#EFDDCF", high = "yellow") + # warna gradasi
theme_minimal(base_size = 15) +
theme(
plot.title = element_text(hjust = 0.7, face = "bold"),
axis.text.x = element_text(angle = 0, hjust = 1),
legend.position = "none" # Sembunyikan legenda jika tidak perlu
)
Sebelum menentukan uji apa yang ingin kita gunakan, kita akan mengecek apakah data yang kita gunakan adalah data normal atau tidak.
ProfitPerType <- split(Kopi$Profit, Kopi$'Product Type')
sapply(ProfitPerType, length)
## Coffee Espresso Herbal Tea Tea
## 1056 1176 1056 960
NormalType <- data.frame(
`Product Type` = names(ProfitPerType),
P_Value = sapply(ProfitPerType, function(x) shapiro.test(x)$p.value)
)
print(NormalType)
## Product.Type P_Value
## Coffee Coffee 2.986464e-36
## Espresso Espresso 8.433837e-35
## Herbal Tea Herbal Tea 6.263336e-29
## Tea Tea 1.202835e-36
Melihat plot normal data.
par(mfrow=c(2,2))
# Q-Q Plot untuk Coffee
qqnorm(ProfitPerType$Coffee, main = "Q-Q Plot: Coffee");
qqline(ProfitPerType$Coffee, col = "red")
# Q-Q Plot untuk Espresso
qqnorm(ProfitPerType$Espresso, main = "Q-Q Plot: Espresso");
qqline(ProfitPerType$Espresso, col = "red")
# Q-Q Plot untuk Tea
qqnorm(ProfitPerType$Tea, main = "Q-Q Plot: Tea");
qqline(ProfitPerType$Tea, col = "red")
# Q-Q Plot untuk Herbal Tea
qqnorm(ProfitPerType$`Herbal Tea`, main = "Q-Q Plot: Herbal Tea");
qqline(ProfitPerType$`Herbal Tea`, col = "red")
#Membuat data frame tapi karna jumlahnya tidak sama maka menggunakan stack
ProfitPerTypeLong <- stack(ProfitPerType)
colnames(ProfitPerTypeLong) <- c("Profit", "Product_Type")
kruskal.test(Profit ~ Product_Type, data = ProfitPerTypeLong)
##
## Kruskal-Wallis rank sum test
##
## data: Profit by Product_Type
## Kruskal-Wallis chi-squared = 2.4137, df = 3, p-value = 0.4911
Didapatkan hasil p-value = 0.4911, yang berarti lebih besar dari alpha,
hal itu menunjukkan bahwa tidak terdapat perbedaan yang signifikan dari
keempat Product Type.
Plot yang ditampilkan adalah diagram batang horizontal yang menggambarkan total keuntungan (Total Profit) per daerah (state) dalam dataset Coffee Chain, dengan sumbu y menunjukkan 20 kategori state, sedangkan sumbu x menunjukkan nilai profit dalam dolar (USD) dengan skala hingga 30.000.
ggplot(ProfitState, aes(y = reorder(State, Total_Profit), x = Total_Profit, fill = Total_Profit)) +
geom_bar(stat = "identity", width = 0.7) +
geom_text(aes(label = comma(Total_Profit)), hjust = 1, size = 3, fontface = "bold", color = "#878787") +
labs(title = "Total Profit per State",
x = "Total Profit",
y = "State") +
scale_fill_gradient2(low = "white", mid = "#EFDDCF", high = "yellow") + # warna gradasi
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 0, hjust = 1),
legend.position = "none" # Sembunyikan legenda jika tidak perlu
)
Sebelum menentukan uji apa yang ingin kita gunakan, kita akan mengecek apakah data yang kita gunakan adalah data normal atau tidak.
ProfitPerState <- split(Kopi$Profit, Kopi$State)
sapply(ProfitPerState, length)
## California Colorado Connecticut Florida Illinois
## 288 264 168 216 216
## Iowa Louisiana Massachusetts Missouri Nevada
## 216 168 144 216 264
## New Hampshire New Mexico New York Ohio Oklahoma
## 168 168 192 216 168
## Oregon Texas Utah Washington Wisconsin
## 264 168 288 240 216
NormalState <- data.frame(
`Product State` = names(ProfitPerState),
P_Value = sapply(ProfitPerState, function(x) shapiro.test(x)$p.value)
)
DT::datatable(NormalState)
Dari hasil diatas, dapat mendapatkan hasil bahwa data profit yang dibagi
ke State didapatkan bahwa terdapat data yang tidak normal. Oleh karena
itu, kita akan melanjutkan ujinya menggunakan uji Kruskal-Wallis.
#Membuat data frame tapi karna jumlahnya tidak sama maka menggunakan stack
ProfitPerStateLong <- stack(ProfitPerState)
colnames(ProfitPerStateLong) <- c("Profit", "State")
kruskal.test(Profit ~ State, data = ProfitPerStateLong)
##
## Kruskal-Wallis rank sum test
##
## data: Profit by State
## Kruskal-Wallis chi-squared = 950.82, df = 19, p-value < 2.2e-16
Didapatkan hasil p-value = 2.2e-16, yang berarti lebih kecil dari alpha,
hal itu menunjukkan bahwa terdapat perbedaan yang signifikan dari 20
state.
#Uji Lanjut
DunnState <- dunnTest(Profit ~ State, data = ProfitPerStateLong, method = "bonferroni")
DT::datatable(DunnState$res)
# Simpan hasil ke dalam data frame
DunnStateDF <- as.data.frame(DunnState$res)
# Filter misalnya p-value unadjusted < 0.05
Berbeda <- subset(DunnStateDF, P.unadj < 0.05)
DT::datatable(Berbeda)
Dari hasil di atas, dapat kita ketahui dari 190 perbandingan, terdapat
145 yang signifikan. Berarti dapat kita simpulkan secara kasar bahwa
mayoritas perbandingan daerah (state) berbeda secara signifikan.
Berdasarkan analisis terhadap dataset Coffee Chain, diperoleh beberapa temuan penting. Pertama, diagram batang horizontal yang menggambarkan total keuntungan (Total Profit) per jenis produk (Product Type), dapat diketahui bahwa Coffee memberikan profit terbanyak dan teh memberikan profit paling kecil. Walau seperti itu, uji kruskal wallis menunjukkan bahwa tidak terdapat perbedaan yang signifikan antar keempat kategori produk (Coffee, Espresso, Herbal Tea, dan Tea), dengan nilai p-value sebesar 0.4911 (lebih besar dari α = 0.05). Hal ini mengindikasikan bahwa jenis produk tidak memberikan pengaruh yang signifikan terhadap profit.
Selanjutnya, dari diagram batang horizontal kedua yang menggambarkan total keuntungan (Total Profit) per daerah (State) dapat diketahui bahwa California memberikan keuntungan yang paling besar dan New Mexico memberikan profit paling sedikit. Uji dunn menunjukkan bahwa terdapat perbedaan yang signifikan antar ke-20 kategori state. Dari 190 kemungkinan perbandingan antar state, ditemukan bahwa 145 perbandingan menunjukkan hasil yang signifikan. Dengan demikian, dapat disimpulkan bahwa mayoritas wilayah memiliki perbedaan profit yang signifikan satu sama lain.