Analisis data yang saya lakukan dengan K-Means untuk mendapatkan insight berkaitan dengan segmentasi pasar sehingga dapat dilakukan clustering untu mengetahui lokasi atau tempat mana yang mempunyai potensi yang cukup besar. Variabel yang digunakan adalah 1. total_sales untuk ukuran permintaan pasar 2. total_profit untuk keuntungan 3. total_marketing untuk intensitas promosinya 4.avg_cogs untuk biaya produksi rata-rata 5.MarketSize_num untuk skala pasar tujuannya untuk mengetahui apakah sales tinggi tapi profit rendah dan kalau promosi tinggi juga berpengaruh ke salesnya atau malah kurang efektif promosinya.Analisis k-means ini cocok untuk mengetahui segmentasi pasar dan nantinya digunakan metode decision tree sebagai metode tambahan untuk menginterpretasikan variabel penting yang membedakan setiap cluster agar mudah untuk dipahami insightnya secara bisnis.

# ======================
# LOAD LIBRARY
# ======================
library(DBI)
## Warning: package 'DBI' was built under R version 4.4.2
library(RMySQL)
## Warning: package 'RMySQL' was built under R version 4.4.2
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.4.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.4.3
## Welcome to factoextra!
## Want to learn more? See two factoextra-related books at https://www.datanovia.com/en/product/practical-guide-to-principal-component-methods-in-r/
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# ======================
# KONEKSI DATABASE
# ======================
con <- dbConnect(
  MySQL(),
  user = "root",
  password = "Jito1danHafi2",
  dbname = "coffee",
  host = "localhost"
)

mengkoneksikan dari R ke my sql untuk mengakses database agar data bisa diambil dan diolah

# ======================
# QUERY UTAMA 
# ======================
query <- "
SELECT 
    f.`Area Code` AS Area_Code,
    l.`Market Size` AS Market_Size,
    SUM(f.Sales) AS total_sales,
    SUM(f.Profit) AS total_profit,
    SUM(f.Marketing) AS total_marketing,
    AVG(f.COGS) AS avg_cogs
FROM facttable f
JOIN location l ON f.`Area Code` = l.`Area Code`
GROUP BY f.`Area Code`, l.`Market Size`
"

data <- dbGetQuery(con, query)
## Warning in dbSendQuery(conn, statement, ...): Decimal MySQL column 2 imported
## as numeric
## Warning in dbSendQuery(conn, statement, ...): Decimal MySQL column 3 imported
## as numeric
## Warning in dbSendQuery(conn, statement, ...): Decimal MySQL column 4 imported
## as numeric
## Warning in dbSendQuery(conn, statement, ...): Decimal MySQL column 5 imported
## as numeric

Query SQL digunakan untuk menggabungkan tabel transaksi dan tabel lokasi berdasarkan Area Code, kemudian dilakukan proses agregasi untuk menghitung total penjualan, total keuntungan, total biaya marketing, serta rata-rata biaya produksi pada setiap area dan kategori ukuran pasar.

# ======================
# PREPROCESSING
# ======================
data$Market_Size <- as.factor(data$Market_Size)
data$MarketSize_num <- as.numeric(data$Market_Size)

data_kmeans <- data[, c("Area_Code",
                        "total_sales",
                        "total_profit",
                        "total_marketing",
                        "avg_cogs",
                        "MarketSize_num")]

# Normalisasi (tanpa Area_Code)
data_scaled <- scale(data_kmeans[, -1])

Tahap preprocessing dilakukan dengan mengubah variabel kategorik menjadi numerik, memilih variabel yang relevan, serta melakukan normalisasi data menggunakan metode standardisasi. Normalisasi penting dilakukan karena algoritma K-Means berbasis jarak, sehingga perbedaan skala antar variabel dapat mempengaruhi hasil clustering secara signifikan seperti total_sales yang bernilai ribuan akan mendominasi nantinya.

# ======================
# ELBOW METHOD
# ======================
wss <- sapply(1:10, function(k){
  kmeans(data_scaled, centers = k, nstart = 10)$tot.withinss
})

plot(1:10, wss, type="b")

erdasarkan hasil visualisasi menggunakan metode Elbow, terlihat bahwa nilai Within Sum of Squares (WSS) mengalami penurunan yang signifikan hingga jumlah cluster sebanyak 4. Setelah titik tersebut, penurunan WSS cenderung melambat, sehingga membentuk pola siku (elbow). Oleh karena itu, jumlah cluster optimal yang dipilih dalam penelitian ini adalah sebanyak 4 cluster karena lebih kompleks dan stabil.

# ======================
# SILHOUETTE CHECK
# ======================
fviz_nbclust(data_scaled, kmeans, method = "silhouette")

Metode Elbow menunjukkan bahwa jumlah cluster optimal berada pada K = 4 berdasarkan pola penurunan WSS yang mulai melandai. Namun, metode Silhouette menunjukkan nilai optimal pada K = 5 dengan nilai rata-rata silhouette tertinggi. Oleh karena itu, terdapat perbedaan hasil antara kedua metode, sehingga pemilihan jumlah cluster berdasarkan kesederhanaan jadi saya memilih 4 karena lebih mudah diinterpretasikan.

# ======================
# KMEANS
# ======================
set.seed(123)
kmeans_model <- kmeans(data_scaled, centers = 4, nstart = 25)

data_kmeans$cluster <- kmeans_model$cluster

Proses clustering dilakukan menggunakan algoritma K-Means dengan jumlah cluster sebanyak 4 berdasarkan hasil metode Elbow dan pertimbangan interpretabilitas. Parameter nstart = 25 digunakan untuk meningkatkan kestabilan hasil dengan mencoba beberapa inisialisasi centroid. Selain itu, fungsi set.seed digunakan untuk memastikan hasil yang konsisten. Hasil clustering kemudian disimpan ke dalam dataset untuk keperluan analisis lebih lanjut.

# ======================
# SUMMARY CLUSTER
# ======================
cluster_summary <- data_kmeans %>%
  group_by(cluster) %>%
  summarise(across(where(is.numeric), mean))

print(cluster_summary)
## # A tibble: 4 × 7
##   cluster Area_Code total_sales total_profit total_marketing avg_cogs
##     <int>     <dbl>       <dbl>        <dbl>           <dbl>    <dbl>
## 1       1      620.      15271.        4725.           2420.     97.1
## 2       2      626.       4234.        1366.            714.    169. 
## 3       3      602        2354.         938.            331.     79.0
## 4       4      548.       6648.        1758.           1156.     61.7
## # ℹ 1 more variable: MarketSize_num <dbl>

-Cluster 1(High Performance) memiliki total sales tertinggi profit paling tinggi marketing juga efisien Cluster ini merupakan area dengan performa terbaik, menunjukkan pasar yang sangat potensial dengan tingkat keuntungan tinggi dan efisiensi operasional yang baik. -Cluster 2 (Moderate Market) memiliki total sales menengah profit cukup marketing lebih rendah dibanding cluster lain Cluster ini menunjukkan pasar yang stabil, namun belum optimal. Masih memiliki peluang untuk ditingkatkan melalui strategi pemasaran. -Cluster 3 (Low Performance) memiliki total sales paling rendah profit paling kecil marketing relatif kecil Cluster ini merupakan area dengan performa terendah. Kemungkinan pasar belum berkembang atau kurang mendapatkan perhatian dari sisi pemasaran. -Cluster 4 (High Cost Market) memiliki total sales cukup tinggi profit menengah biaya marketing tinggi Cluster ini memiliki potensi pasar yang baik, namun kurang efisien karena biaya marketing yang tinggi. Perlu evaluasi strategi agar lebih optimal.

# ======================
# QUERY DATA PRODUK (ALIAS JELAS)
# ======================
query_product <- "
SELECT 
    f.`Area Code` AS Area_Code,
    p.`Product Type` AS ProductType,
    SUM(f.Sales) AS total_sales_product,
    SUM(f.Profit) AS total_profit_product
FROM facttable f
JOIN product p ON f.ProductId = p.ProductId
GROUP BY f.`Area Code`, p.`Product Type`
"

data_prod <- dbGetQuery(con, query_product)
## Warning in dbSendQuery(conn, statement, ...): Decimal MySQL column 2 imported
## as numeric
## Warning in dbSendQuery(conn, statement, ...): Decimal MySQL column 3 imported
## as numeric

Query data produk digunakan untuk mengidentifikasi kinerja penjualan dan keuntungan berdasarkan jenis produk pada setiap wilayah (Area Code). Data diperoleh dengan menggabungkan tabel transaksi (facttable) dengan tabel produk, kemudian dilakukan agregasi untuk menghitung total penjualan dan total profit pada masing-masing jenis produk di setiap area.

# ======================
# SAMAKAN TIPE DATA 
# ======================
data_kmeans$Area_Code <- as.character(data_kmeans$Area_Code)
data_prod$Area_Code <- as.character(data_prod$Area_Code)

Tahap ini dilakukan untuk menyamakan tipe data pada variabel Area_Code di kedua dataset menjadi tipe karakter. Hal ini penting agar proses penggabungan (merge) data dapat dilakukan dengan benar tanpa error atau ketidaksesuaian data akibat perbedaan tipe variabel.

# ======================
# MERGE DATA 
# ======================
data_cluster <- merge(data_kmeans, data_prod, by = "Area_Code")

menggabungkan data produk dengan data k means

# ======================
# PRODUK UNGGUL PER CLUSTER
# ======================
produk_unggul <- data_cluster %>%
  group_by(cluster, ProductType) %>%
  summarise(total_sales = sum(total_sales_product), .groups = "drop") %>%
  arrange(cluster, desc(total_sales))

print(produk_unggul)
## # A tibble: 16 × 3
##    cluster ProductType total_sales
##      <int> <chr>             <dbl>
##  1       1 Tea               80778
##  2       1 Herbal Tea        80295
##  3       1 Coffee            57421
##  4       1 Espresso          56379
##  5       2 Espresso          57397
##  6       2 Coffee            52461
##  7       2 Herbal Tea        43137
##  8       2 Tea               33286
##  9       3 Espresso          49269
## 10       3 Coffee            48114
## 11       3 Herbal Tea        25288
## 12       3 Tea               23246
## 13       4 Espresso          59951
## 14       4 Coffee            58832
## 15       4 Herbal Tea        58494
## 16       4 Tea               35463

Berdasarkan hasil clustering, setiap cluster menunjukkan produk unggulan yang berbeda. Cluster 1 didominasi oleh penjualan Tea dan Herbal Tea, sedangkan cluster 2 dan 3 lebih unggul pada produk Espresso dan Coffee. Hal ini menunjukkan adanya perbedaan preferensi konsumen di tiap cluster yang dapat dimanfaatkan untuk strategi pemasaran yang lebih tepat sasaran.

# ======================
# PRODUK TERBAIK TIAP CLUSTER
# ======================
produk_top <- produk_unggul %>%
  group_by(cluster) %>%
  slice_max(total_sales, n = 1)

print(produk_top)
## # A tibble: 4 × 3
## # Groups:   cluster [4]
##   cluster ProductType total_sales
##     <int> <chr>             <dbl>
## 1       1 Tea               80778
## 2       2 Espresso          57397
## 3       3 Espresso          49269
## 4       4 Espresso          59951

Top produk terbaik didominasi oleh espresso bisa jadi untuk produk tersebut lebih dipromosikan lagi.

data_kmeans <- data_kmeans %>%
  mutate(
    log_sales = log1p(total_sales),          # TANPA SHIFT
    log_marketing = log1p(total_marketing),  # TANPA SHIFT
    
    profit_shift = total_profit - min(total_profit, na.rm = TRUE) + 1,
    log_profit = log(profit_shift)           # PAKAI SHIFT
  )

data k means ditransformasikan agar lebih bagus dari sebelumnya

fviz_nbclust(data_kmeans, kmeans, method = "silhouette")

didapatkan k=4 setelah ditransformasi perbaikan model tetap menggunakan k=4 karena penggunaan 4 cluster dianggap mampu memberikan segmentasi yang lebih rinci sehingga memudahkan dalam pengambilan strategi pemasaran dan penentuan target yang lebih spesifik, meskipun kualitas pemisahan data sedikit menurun dibandingkan hasil optimal secara statistik. Maka yang lain tetap sama dan produk yang terbaik juga sama.

# ======================
# ANALISIS TAMBAHAN
# ======================
table(data_kmeans$cluster, data$Market_Size)
##    
##     Major Market Small Market
##   1            8           10
##   2           44            0
##   3           62            0
##   4            0           32
# ======================
# VISUALISASI
# ======================
fviz_cluster(kmeans_model, data = data_scaled)

Berdasarkan visualisasi cluster, terlihat bahwa data terbagi menjadi empat kelompok yang cukup jelas dan terpisah satu sama lain. Setiap cluster membentuk area yang berbeda dengan jarak antar kelompok yang relatif jauh, menunjukkan adanya perbedaan karakteristik yang signifikan. Meskipun terdapat sedikit kedekatan antara beberapa cluster, secara umum pemisahan sudah cukup baik sehingga penggunaan 4 cluster mampu merepresentasikan variasi data secara lebih rinci.

# ======================
# VISUALISASI TAMBAHAN
# ======================

# 1. DISTRIBUSI CLUSTER
library(ggplot2)

ggplot(data_kmeans, aes(x = factor(cluster))) +
  geom_bar(fill = "steelblue") +
  labs(title = "Distribusi Cluster",
       x = "Cluster",
       y = "Jumlah Area")

Distribusi cluster area cenderung seimbang namun didominasi cluster 3

# ======================
# 2. PERBANDINGAN SALES PER CLUSTER
# ======================
ggplot(data_kmeans, aes(x = factor(cluster), y = total_sales)) +
  geom_boxplot(fill = "orange") +
  labs(title = "Distribusi Total Sales per Cluster",
       x = "Cluster",
       y = "Total Sales")

maka berdasarkan boxplot distribusi total sales, terlihat bahwa Cluster 1 memiliki nilai penjualan tertinggi dengan median paling besar serta beberapa outlier tinggi, menunjukkan performa penjualan yang sangat kuat. Cluster 4 berada di tingkat menengah ke atas dengan variasi data yang cukup lebar, menandakan potensi penjualan yang cukup baik. Cluster 2 memiliki penjualan pada tingkat menengah dengan sebaran yang relatif stabil, sedangkan Cluster 3 menunjukkan nilai penjualan terendah dengan variasi yang kecil, sehingga merupakan cluster dengan performa paling rendah.

# ======================
# 3. PROFIT vs SALES (SCATTER)
# ======================
ggplot(data_kmeans, aes(x = total_sales, y = total_profit, color = factor(cluster))) +
  geom_point(size = 3) +
  labs(title = "Sales vs Profit per Cluster",
       x = "Total Sales",
       y = "Total Profit",
       color = "Cluster")

Berdasarkan scatter plot hubungan total sales dan profit, terlihat bahwa terdapat kecenderungan hubungan positif di mana semakin tinggi penjualan maka profit juga meningkat. Cluster 1 menempati posisi tertinggi dengan sales dan profit paling besar, menunjukkan performa terbaik. Cluster 4 berada pada tingkat menengah dengan variasi profit yang cukup lebar, menandakan potensi namun kurang konsisten. Cluster 2 menunjukkan nilai menengah dengan beberapa titik profit rendah, sedangkan Cluster 3 berada pada tingkat paling rendah baik dari sisi sales maupun profit. Hal ini menunjukkan adanya perbedaan kinerja yang cukup jelas antar cluster.

# ======================
# 4. PRODUK TERLARIS PER CLUSTER
# ======================
ggplot(produk_unggul, aes(x = ProductType, y = total_sales, fill = factor(cluster))) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Penjualan Produk per Cluster",
       x = "Product Type",
       y = "Total Sales",
       fill = "Cluster") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Berdasarkan grafik penjualan produk per cluster, terlihat bahwa Cluster 1 memiliki total penjualan tertinggi terutama pada produk Herbal Tea dan Tea, sedangkan Cluster 4 juga menunjukkan penjualan yang relatif tinggi dan stabil pada hampir semua produk. Cluster 2 berada pada tingkat penjualan menengah dengan kecenderungan lebih kuat pada produk Coffee dan Espresso, sementara Cluster 3 merupakan cluster dengan penjualan terendah pada seluruh jenis produk. Hal ini menunjukkan adanya perbedaan pola preferensi produk antar cluster yang dapat digunakan sebagai dasar strategi pemasaran yang lebih tepat sasaran.

# ======================
# 5. HEATMAP RATA-RATA CLUSTER
# ======================
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.4.3
cluster_mean <- data_kmeans %>%
  group_by(cluster) %>%
  summarise(across(where(is.numeric), mean))

cluster_melt <- melt(cluster_mean, id.vars = "cluster")

ggplot(cluster_melt, aes(x = variable, y = factor(cluster), fill = value)) +
  geom_tile() +
  labs(title = "Heatmap Karakteristik Cluster",
       x = "Variabel",
       y = "Cluster") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Berdasarkan heatmap karakteristik cluster, terlihat bahwa Cluster 1 memiliki nilai paling tinggi pada variabel total_sales dan juga cukup menonjol pada profit_shift, sehingga dapat dikategorikan sebagai cluster dengan kontribusi penjualan dan potensi keuntungan terbesar. Cluster 2 dan Cluster 4 berada pada tingkat menengah dengan nilai yang relatif stabil pada sebagian besar variabel, sedangkan Cluster 3 menunjukkan nilai paling rendah hampir di semua indikator, sehingga merupakan cluster dengan performa penjualan dan profit yang paling kecil. Secara keseluruhan, hasil ini menunjukkan adanya perbedaan karakteristik yang jelas antar cluster yang dapat digunakan sebagai dasar segmentasi dan strategi pemasaran.

Metode kedua menggunakan decision tree agar dapat lebih mudah mengintrepretasikan hasil dari k-means

# ======================
# LOAD LIBRARY
# ======================
library(rpart)
## Warning: package 'rpart' was built under R version 4.4.3
library(rpart.plot)
## Warning: package 'rpart.plot' was built under R version 4.4.3
library(caret)
## Warning: package 'caret' was built under R version 4.4.3
## Loading required package: lattice
library(dplyr)
data_kmeans <- data_kmeans %>%
  mutate(
    profit_margin = total_profit / total_sales,
    marketing_efficiency = total_sales / total_marketing,
    cost_ratio = avg_cogs / total_sales
  )

Dilakukan transformasi data dengan menambahkan tiga variabel turunan, yaitu profit_margin (rasio keuntungan terhadap penjualan), marketing_efficiency (efektivitas pemasaran dalam menghasilkan penjualan), dan cost_ratio (proporsi biaya terhadap penjualan). Variabel-variabel ini digunakan untuk memperkaya analisis kinerja dan mendukung proses segmentasi yang lebih informatif.

#Menyiapkan data
data_dt <- data_kmeans %>%
  select(
    cluster,
    total_sales,
    total_profit,
    total_marketing,
    avg_cogs,
    MarketSize_num,
    profit_margin,
    marketing_efficiency,
    cost_ratio
  )

data_dt$cluster <- as.factor(data_dt$cluster)

Data diseleksi pada variabel penting dan cluster diubah menjadi faktor untuk mendukung analisis klasifikasi decision tree.

#split data
set.seed(123)
trainIndex <- createDataPartition(data_dt$cluster, p = 0.7, list = FALSE)

train_data <- data_dt[trainIndex, ]
test_data  <- data_dt[-trainIndex, ]
dt_model <- rpart(
  cluster ~ .,
  data = train_data,
  method = "class",
  control = rpart.control(cp = 0.01)
)
rpart.plot(dt_model, type = 2, extra = 104, fallen.leaves = TRUE)

Hasil decision tree menunjukkan bahwa variabel avg_cogs menjadi faktor utama dalam membedakan segmen pasar, diikuti oleh ukuran pasar dan total penjualan. Area dengan biaya tinggi cenderung berada pada cluster dengan performa moderat, sedangkan kombinasi antara ukuran pasar yang besar dan penjualan tinggi menghasilkan cluster dengan potensi tinggi. Temuan ini mengindikasikan bahwa efisiensi biaya dan pemilihan pasar yang tepat merupakan kunci dalam meningkatkan performa bisnis.

Permasalahan pada coffee dan solusi: - Dominasi Cluster 3 menunjukkan bahwa sebagian besar area masih berada pada tahap pasar yang belum berkembang, ditandai dengan rendahnya penjualan dan aktivitas pemasaran. Oleh karena itu, strategi yang disarankan bukan berfokus pada mendorong pertumbuhan penjualan pada area low performance melalui peningkatan aktivitas pemasaran dan ekspansi pasar - Mengoptimalkan area potensial (Cluster 4) dengan meningkatkan efisiensi biaya agar profit dapat maksimal - Mempertahankan dan memperluas strategi pada Cluster 1 sebagai benchmark performa terbaik. Kesimpulan Analisis: Berdasarkan hasil analisis menggunakan metode K-Means pada dataset coffee, didapatkan empat segmentasi pasar yang memiliki karakteristik berbeda, yaitu High Performance, Moderate Market, Low Performance, dan High Cost Market. Segmentasi ini menunjukkan bahwa kinerja setiap area sangat dipengaruhi oleh kombinasi antara tingkat penjualan, profitabilitas, intensitas pemasaran, biaya produksi, serta ukuran pasar.

Hasil analisis menunjukkan bahwa Cluster 1 merupakan area dengan performa terbaik karena memiliki penjualan dan profit tinggi serta efisiensi operasional yang baik sehingga menjadi kontributor utama bisnis. Sebaliknya, Cluster 3 mendominasi jumlah area namun memiliki performa terendah, yang ditandai dengan rendahnya penjualan, profit, dan aktivitas pemasaran. Hal ini mengindikasikan bahwa sebagian besar pasar masih berada pada tahap belum berkembang (underperforming market).

Dari sisi produk, ditemukan bahwa produk Espresso dan Coffee mendominasi sebagian besar cluster, sementara Tea dan Herbal Tea unggul pada cluster dengan performa tinggi. Hal ini menunjukkan adanya perbedaan preferensi konsumen yang dapat dimanfaatkan untuk strategi pemasaran yang lebih spesifik di tiap segmen pasar.

Analisis menggunakan Decision Tree memperkuat hasil K-Means dengan menunjukkan bahwa faktor utama yang mempengaruhi segmentasi adalah biaya produksi (avg_cogs), diikuti oleh ukuran pasar dan total penjualan. Area dengan biaya tinggi cenderung memiliki performa yang kurang optimal, sedangkan area dengan ukuran pasar besar dan penjualan tinggi memiliki potensi untuk menjadi segmen unggulan.