NAMA : Arif Nuri Setiawan

NIM : M0724051


Mata Kuliah : Sistem Informasi Manajemen

Dosen Pengampu : Muhammad Bayu Nirwana, S.Si., M.Sc.


Analisis performa penjualan produk berdasarkan income

1. Deskripsi insight

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>

2. Preprocessing

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

3. Penentuan jumlah K menggunakan elbow method

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"

5. Interpretasi

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.