NAMA : Arif Nuri Setiawan
NIM : M0724051
Mata Kuliah : Sistem Informasi Manajemen
Dosen Pengampu : Muhammad Bayu Nirwana, S.Si., M.Sc.
Pada pembahasan inini bertujuan untuk melakukan segmentasi performa produk pada Coffee Chain Datasets. Dengan mengelompokkan produk berdasarkan metrik finansial utama, manajemen dapat mengidentifikasi produk mana yang memberikan kontribusi laba terbesar dan produk mana yang memerlukan evaluasi strategi pemasaran karena performa yang kurang optimal.
#loading data
library(readxl)
## Warning: package 'readxl' was built under R version 4.5.2
data <- read_excel("D:/ARIF dari bacup ssd/kuliah statistika/Semester 4/SIM/1. Tugas SIM 2025B - Coffee Chain Datasets/1. Tugas SIM 2025B - Coffee Chain Datasets.xlsx")
head(data)
## # 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>
Langkah awal dimulai dengan membersihkan data dan melakukan agregasi. Mengingat data transaksi bersifat harian per wilayah, saya merangkumnya menjadi profil per produk agar kita bisa melihat performa head-to-head antar menu.
Standardisasi (Scaling): Karena terdapat perbedaan satuan yang kontras (Sales dalam ribuan, sedangkan Margin dalam desimal), saya melakukan scaling data. Tanpa tahap ini, variabel dengan angka besar akan “menenggelamkan” variabel penting lainnya dalam perhitungan algoritma.
#cek struktur data
print("melihat struktur data")
## [1] "melihat struktur data"
str(data)
## 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 ...
#cek missing value
print("missing value")
## [1] "missing value"
colSums(is.na(data))
## 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
#cek duplikat sata
print("duplikat data")
## [1] "duplikat data"
sum(duplicated(data))
## [1] 0
#membuat data produk
data_produk <- aggregate(cbind(Sales, Profit, Margin, Inventory) ~ Product,
data = data,
FUN = sum)
# Total
data_sum <- aggregate(cbind(Sales, Profit) ~ Product,
data = data,
FUN = sum)
# Rata-rata margin
data_margin <- aggregate(Margin ~ Product,
data = data,
FUN = mean)
# Gabungkan
data_produk <- merge(data_sum, data_margin, by = "Product")
data_produk
## Product Sales Profit Margin
## 1 Amaretto 26269 4890 67.44792
## 2 Caffe Latte 35899 11375 91.77778
## 3 Caffe Mocha 84904 17678 93.92500
## 4 Chamomile 75578 27231 110.81250
## 5 Colombian 128311 55804 160.94167
## 6 Darjeeling 73151 29053 106.93750
## 7 Decaf Espresso 78162 29502 105.78922
## 8 Decaf Irish Cream 62248 13989 81.69271
## 9 Earl Grey 66772 24164 127.72917
## 10 Green Tea 32850 -231 43.20833
## 11 Lemon 95926 29869 109.20417
## 12 Mint 35710 6154 78.28125
## 13 Regular Espresso 24031 10065 181.97222
data_scaled <- scale(data_produk[, -1])
data_scaled
## Sales Profit Margin
## [1,] -1.1838439 -1.0115459 -1.00457064
## [2,] -0.8739943 -0.5763922 -0.34659563
## [3,] 0.7027639 -0.1534510 -0.28852631
## [4,] 0.4026956 0.4875703 0.16817802
## [5,] 2.0994039 2.4048636 1.52386759
## [6,] 0.3246058 0.6098294 0.06338280
## [7,] 0.4858370 0.6399580 0.03232869
## [8,] -0.0262032 -0.4009887 -0.61933552
## [9,] 0.1193586 0.2817698 0.62567114
## [10,] -0.9720972 -1.3551730 -1.66010419
## [11,] 1.0574018 0.6645843 0.12468237
## [12,] -0.8800754 -0.9267295 -0.71159476
## [13,] -1.2558526 -0.6642952 2.09261642
## attr(,"scaled:center")
## Sales Profit Margin
## 63062.3846 19964.8462 104.5938
## attr(,"scaled:scale")
## Sales Profit Margin
## 31079.59078 14902.78054 36.97688
Untuk menentukan berapa banyak kelompok (cluster) yang paling ideal, saya menggunakan Elbow Method.
Berdasarkan plot WSS (Within-Cluster Sum of Squares) yang dihasilkan, terlihat penurunan yang sangat tajam hingga titik ke-3, kemudian mulai melandai. Oleh karena itu, saya menetapkan 3 cluster sebagai jumlah optimal untuk mengelompokkan produk ini.
wss <- numeric(10)
for (i in 1:10) {
wss[i] <- kmeans(data_scaled, centers = i)$tot.withinss
}
plot(1:10, wss, type="b", main="Elbow Method")
set.seed(123)
kmeans_result <- kmeans(data_scaled, centers = 3)
data_produk$cluster <- as.factor(kmeans_result$cluster)
library(ggplot2)
ggplot(data_produk, aes(x = Sales, y = Profit, color = cluster)) +
geom_point(size = 3) +
theme_minimal()
split(data_produk$Product, data_produk$cluster)
## $`1`
## [1] "Caffe Mocha" "Chamomile" "Colombian" "Darjeeling"
## [5] "Decaf Espresso" "Earl Grey" "Lemon"
##
## $`2`
## [1] "Regular Espresso"
##
## $`3`
## [1] "Amaretto" "Caffe Latte" "Decaf Irish Cream"
## [4] "Green Tea" "Mint"
Berdasarkan hasil analisis di atas, kita dapat membagi produk ke dalam tiga kategori utama:
Cluster 1: The Cash Cows (High Performers) Produk di kelompok ini memiliki angka penjualan dan profit yang jauh melampaui rata-rata. Ini adalah produk “bintang” yang sangat diminati pasar.
rekomendasi: Pastikan rantai pasok (supply chain) untuk produk ini jangan sampai terputus. Fokuskan kontrol kualitas agar loyalitas pelanggan terjaga.
Cluster 2: Average/Growing Products Kelompok ini berisi produk dengan performa menengah. Penjualannya cukup stabil namun kontribusi profitnya masih memiliki ruang untuk tumbuh.
rekomendasi: Lakukan promosi kreatif seperti bundling dengan produk di Cluster 1 untuk meningkatkan volume penjualannya secara signifikan.
Cluster 3: Underperformers Kelompok ini mencakup produk dengan profit dan sales terendah. Produk-produk ini berisiko menjadi dead stock jika tidak segera ditangani.
rekomendasi: Perlu dilakukan audit menu. Jika margin sebenarnya tinggi tapi penjualan rendah, mungkin masalahnya ada pada pemasaran. Namun jika keduanya rendah, manajemen bisa mempertimbangkan untuk mempensiunkan produk tersebut dan menggantinya dengan inovasi baru.