Email             :
Instagram     : https://www.instagram.com/naaufald
RPubs            : https://rpubs.com/naaufaldd/
Address         : ARA Center, Matana University Tower
                         Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.



1 Studi Kasus

Sebuah perusahaan ritel ingin menganalisis pola pembelian pelanggannya untuk meningkatkan strategi pemasaran mereka. Mereka memiliki dataset yang berisi informasi tentang transaksi pembelian pelanggan selama beberapa bulan terakhir.

library(dplyr)
library(fakir)
library(ggplot2)
library(caret)
library(plotly)
library(randomForest)
generate_sales_data <- function(n) {
  data <- data.frame(
    ID_Pelanggan = 1:n,
    Usia = sample(18:70, n, replace = TRUE),
    Gender = sample(c("Pria", "Wanita"), n, replace = TRUE),
    Jumlah_Pembelian = sample(1:10, n, replace = TRUE),
    Total_Pembelian = sample(50:500, n, replace = TRUE),
    Jenis_Produk_Favorit = sample(c("Elektronik", "Pakaian", "Makanan"), n, replace = TRUE)
  )
  return(data)
}

# Menghasilkan dataset dengan 100000 baris
data <- generate_sales_data(100000)

# Menampilkan sebagian dari dataset
head(data)
##   ID_Pelanggan Usia Gender Jumlah_Pembelian Total_Pembelian
## 1            1   63 Wanita                3             110
## 2            2   70   Pria                8             461
## 3            3   69   Pria                4              89
## 4            4   54   Pria                8             411
## 5            5   26 Wanita                6             344
## 6            6   70 Wanita                5             243
##   Jenis_Produk_Favorit
## 1              Makanan
## 2              Makanan
## 3              Makanan
## 4              Makanan
## 5              Makanan
## 6              Makanan

buat analisis deskriptif

library(dplyr)
library(ggplot2)
library(plotly)

data <- generate_sales_data(100000)

# Menampilkan sebagian dari dataset
head(data)
##   ID_Pelanggan Usia Gender Jumlah_Pembelian Total_Pembelian
## 1            1   30   Pria               10             261
## 2            2   57   Pria                1             309
## 3            3   52   Pria               10             167
## 4            4   28   Pria                5             454
## 5            5   51 Wanita                1              56
## 6            6   66 Wanita                7              70
##   Jenis_Produk_Favorit
## 1           Elektronik
## 2              Makanan
## 3              Pakaian
## 4              Pakaian
## 5           Elektronik
## 6              Makanan
# Statistik Ringkasan untuk Variabel Numerik
summary(data)
##   ID_Pelanggan         Usia          Gender          Jumlah_Pembelian
##  Min.   :     1   Min.   :18.00   Length:100000      Min.   : 1.000  
##  1st Qu.: 25001   1st Qu.:31.00   Class :character   1st Qu.: 3.000  
##  Median : 50001   Median :44.00   Mode  :character   Median : 5.000  
##  Mean   : 50001   Mean   :44.03                      Mean   : 5.493  
##  3rd Qu.: 75000   3rd Qu.:57.00                      3rd Qu.: 8.000  
##  Max.   :100000   Max.   :70.00                      Max.   :10.000  
##  Total_Pembelian Jenis_Produk_Favorit
##  Min.   : 50.0   Length:100000       
##  1st Qu.:162.0   Class :character    
##  Median :274.0   Mode  :character    
##  Mean   :274.7                       
##  3rd Qu.:387.0                       
##  Max.   :500.0
# Distribusi untuk Variabel Kategorikal
table(data$Gender)
## 
##   Pria Wanita 
##  50087  49913
table(data$Jenis_Produk_Favorit)
## 
## Elektronik    Makanan    Pakaian 
##      33434      33483      33083
# Visualisasi Data
# Histogram untuk Distribusi Usia
ggplot(data, aes(x = Usia)) +
  geom_histogram(binwidth = 5, fill = "blue", color = "black") +
  labs(title = "Distribusi Usia Pelanggan", x = "Usia", y = "Frekuensi")

# Bar Plot untuk Distribusi Gender
gender_data <- data %>%
  group_by(Gender) %>%
  summarise(count = n())

plot_ly(gender_data, labels = ~Gender, values = ~count, type = 'pie') %>%
  layout(title = 'Distribusi Gender Pelanggan')
# Histogram untuk Jumlah Pembelian
ggplot(data, aes(x = Jumlah_Pembelian)) +
  geom_histogram(binwidth = 1, fill = "green", color = "black") +
  labs(title = "Distribusi Jumlah Pembelian", x = "Jumlah Pembelian", y = "Frekuensi")

# Histogram untuk Total Pembelian
ggplot(data, aes(x = Total_Pembelian)) +
  geom_histogram(binwidth = 50, fill = "orange", color = "black") +
  labs(title = "Distribusi Total Pembelian", x = "Total Pembelian", y = "Frekuensi")

# Pie Chart untuk Jenis Produk Favorit
favorite_product_data <- data %>%
  group_by(Jenis_Produk_Favorit) %>%
  summarise(count = n())

plot_ly(favorite_product_data, labels = ~Jenis_Produk_Favorit, values = ~count, type = 'pie') %>%
  layout(title = 'Distribusi Jenis Produk Favorit')
#visualisasi total pembelian dengan gender
ggplot(data, aes(x = Gender, y = Total_Pembelian, fill = Gender)) +
  geom_boxplot() +
  labs(title = "Distribusi Total Pembelian per Gender", x = "Gender", y = "Total Pembelian") +
  theme_minimal()

## Klasifikasi

1.0.1 berikut pertanyaan yang harus dijawab berdasarkan data

  1. Identifikasi jenis produk yang sering dibeli oleh pelanggan berdasarkan karakteristik pembelian sebelumnya (misalnya, apakah produk tersebut adalah makanan, elektronik, atau pakaian).
  2. Bagaimana Anda akan menentukan model klasifikasi yang tepat untuk masalah ini?
  3. Berikan contoh algoritma klasifikasi yang dapat Anda gunakan dan jelaskan mengapa algoritma tersebut cocok untuk masalah ini.

1.0.1.1 identifikasi jenis produk yang sering dibeli oleh pelanggan

library(nnet)
library(randomForest)

data <- generate_sales_data(100000)

data$Gender <- as.factor(data$Gender)
data$Jenis_Produk_Favorit <- as.factor(data$Jenis_Produk_Favorit)

set.seed(123)

# Membagi data menjadi data tes dan data training
proporsi_latih <- 0.7 
indeks_latih <- sample(1:nrow(data), proporsi_latih * nrow(data))
data_latih <- data[indeks_latih, ]
data_uji <- data[-indeks_latih, ]

# Numerical features
num_vars <- c("Usia", "Jumlah_Pembelian", "Total_Pembelian")
data_latih[num_vars] <- scale(data_latih[num_vars])
data_uji[num_vars] <- scale(data_uji[num_vars])

# Random Forest modelnya
model_rf <- randomForest(Gender ~ Jenis_Produk_Favorit + Jumlah_Pembelian + Usia + Total_Pembelian, data = data_latih, ntree = 100)

# Predict on the test data
prediksi_rf <- predict(model_rf, newdata = data_uji)

# Menghitung akurasi
akurasi_rf <- mean(prediksi_rf == data_uji$Gender) * 100
cat("Akurasi klasifikasi Random Forest pada data uji adalah:", akurasi_rf, "%\n")
## Akurasi klasifikasi Random Forest pada data uji adalah: 50.12 %
# Create confusion matrix 
confusion_matrix <- table(prediksi_rf, data_uji$Jenis_Produk_Favorit)
print(confusion_matrix)
##            
## prediksi_rf Elektronik Makanan Pakaian
##      Pria         5231    5473    5229
##      Wanita       4739    4680    4648
# Analyze purchase patterns 
product_patterns <- aggregate(cbind(Jumlah_Pembelian, Total_Pembelian) ~ Jenis_Produk_Favorit + Gender, data, mean)
print(product_patterns)
##   Jenis_Produk_Favorit Gender Jumlah_Pembelian Total_Pembelian
## 1           Elektronik   Pria         5.532910        273.8277
## 2              Makanan   Pria         5.531289        274.3844
## 3              Pakaian   Pria         5.477554        275.0544
## 4           Elektronik Wanita         5.498335        274.5285
## 5              Makanan Wanita         5.471357        275.0798
## 6              Pakaian Wanita         5.512051        274.8250
# Identify frequently purchased 
frequently_purchased <- aggregate(cbind(Jumlah_Pembelian, Total_Pembelian) ~ Jenis_Produk_Favorit, data, mean)
frequently_purchased <- frequently_purchased[order(-frequently_purchased$Jumlah_Pembelian), ]
top3_frequently_purchased <- frequently_purchased[1:3, ]

# Convert the top3_frequently_purchased data frame to a string for printing
top3_frequently_purchased_str <- apply(top3_frequently_purchased, 1, function(row) {
  sprintf("Jenis Produk: %s, Jumlah Pembelian: %.2f, Total Pembelian: %.2f", row[1], as.numeric(row[2]), as.numeric(row[3]))
})

cat(top3_frequently_purchased_str, sep = "\n")
## Jenis Produk: Elektronik, Jumlah Pembelian: 5.52, Total Pembelian: 274.18
## Jenis Produk: Makanan, Jumlah Pembelian: 5.50, Total Pembelian: 274.73
## Jenis Produk: Pakaian, Jumlah Pembelian: 5.49, Total Pembelian: 274.94

ketiga produk memiliki rata-rata pembelian tertinggi, dimana produk elektronik menempatkan posisi pertama dalam produk paling sering dibeli dengan rata-rata jumlah pembelian sebanyak 5,53 dan rata-rata total pembelian sebanyak 275,60 dan dengan akurasi 50,2%. maka dari itu, perusahaan bisa fokus ke penjualan elektronik sebagai barang paling sering dibeli pertama untuk meningkatkan penjualan.

1.0.1.2 Bagaimana Anda akan menentukan model klasifikasi yang tepat untuk masalah ini?

dengan melakukan analisis deskriptif terhadap data dan mencoba beberapa percobaan menggunakan berbagai model klasifikasi yang telah diajarkan, seperti KNN, Random Forest, hingga Logic Regression. dimana apabila dari model model tadi memiliki akurasi yang paling tinggi diantara yang lain, maka kita akan menggunakan model klasifikasi tersebut.

seperti halnya di atas, kami telah mencoba model klasifikasi KNN yang menghasilkan akurasi ±33%, begitu pun dengan klasifikasi Logic Regression yang menghasilkan ±33,43%, dan akhirnya mencoba klasifikasi random forest dengan variabel dependen merupakan gender dan variabel independennya merupakan Jenis_Produk_Favorit, Jumlah_Pembelian, Usia, dan Total_Pembelian.

1.0.1.3 Berikan contoh algoritma klasifikasi yang dapat Anda gunakan dan jelaskan mengapa algoritma tersebut cocok untuk masalah ini.

algoritma klasifikasi yang dapat digunakan adalah klasifikasi KNN, Logic Regression, ataupun Random forest. Namun, dalam hal ini saya menggunakan algoritma Random Forest untuk masalah ini karena memiliki tingkat keakurasian yang lebih tinggi (sekitar 50,2%) dibandingkan dengan algoritma KNN (±33,1%) dan algoritma Logic Regression (±33,4%)

1.1 Klustering

1.1.1 berikut pertanyaan yang harus dijawab berdasarkan data

  1. Kelompokkan pelanggan ke dalam segmen yang berbeda berdasarkan pola pembelian mereka.
  2. Bagaimana Anda akan menentukan jumlah klaster yang optimal untuk dataset ini?
  3. Berikan contoh algoritma klasterisasi yang dapat Anda gunakan dan jelaskan mengapa algoritma tersebut cocok untuk masalah ini.

1.1.1.1 Kelompokkan pelanggan ke dalam segmen yang berbeda berdasarkan pola pembelian mereka.

dalam mengelompokkan pelanggan ke segmen berbeda dalam dataset, saya akan me-standarisasi fitur numerik terlebih dahulu Untuk mengukur kesamaan antara observasi dan membentuk cluster mereka menggunakan metrik jarak

# Preprocess data
# Untuk mempersiapkan data untuk clustering, Anda mungkin perlu melakukan normalisasi atau standarisasi fitur-fitur numerik

# Contoh: standarisasi fitur-fitur numerik
numerik <- data[, c("Usia", "Jumlah_Pembelian", "Total_Pembelian")]
scaled <- scale(numerik)

# Gabungkan kembali data yang telah discaling dengan fitur-fitur kategorikal
preprocessed_data <- head(cbind(data[, c("Gender", "Jenis_Produk_Favorit")], scaled))


# Print data setelah preprocessing
head(print(preprocessed_data))
##   Gender Jenis_Produk_Favorit       Usia Jumlah_Pembelian Total_Pembelian
## 1 Wanita           Elektronik  1.1740293        0.1723219    -1.685205155
## 2 Wanita              Makanan  1.2394670        0.1723219     0.087353695
## 3   Pria              Pakaian  0.5196521        0.5197170     0.002946131
## 4 Wanita           Elektronik -0.4619138        1.2145071     0.870042019
## 5 Wanita              Makanan  0.4542144        0.5197170     1.038857147
## 6 Wanita              Pakaian -0.7891024        1.5619022    -1.385941973
##   Gender Jenis_Produk_Favorit       Usia Jumlah_Pembelian Total_Pembelian
## 1 Wanita           Elektronik  1.1740293        0.1723219    -1.685205155
## 2 Wanita              Makanan  1.2394670        0.1723219     0.087353695
## 3   Pria              Pakaian  0.5196521        0.5197170     0.002946131
## 4 Wanita           Elektronik -0.4619138        1.2145071     0.870042019
## 5 Wanita              Makanan  0.4542144        0.5197170     1.038857147
## 6 Wanita              Pakaian -0.7891024        1.5619022    -1.385941973

selanjutnya, saya akan menggunakan algoritma elbow untuk mengetahui jumlah klaster yang optimal berdasarkan dataset ini.

1.1.1.2 menentukan jumlah klaster yang optimal

library(FactoMineR)
# Melakukan PCA
pca_result <- PCA(scaled, graph = FALSE)

# Plot varian eksplanasi
plot(pca_result$eig)

# Melihat varian kumulatif
cumulative_variance <- cumsum(pca_result$var$cor)
plot(cumulative_variance, xlab = "Komponen Utama", ylab = "Variansi Kumulatif", type = "b")

# Memilih jumlah komponen utama berdasarkan varian kumulatif yang diinginkan
num_components <- which.max(cumulative_variance > 90)  # Misalnya, kita ingin mempertahankan 90% varian

# Melakukan reduksi dimensi berdasarkan jumlah komponen utama yang dipilih
reduced_features <- pca_result$ind$coord[, 1:num_components]

berdasarkan algoritma elbow, jumlah klaster yang optimal untuk dataset ini adalah 5 klaster.

# Load required packages
library(cluster)
library(factoextra)

# Preprocessing data
fitur_clustering <- data[, c("Usia", "Jumlah_Pembelian", "Total_Pembelian")]

# Standarisasi data
fitur_scaled <- scale(fitur_clustering)

# Menentukan jumlah klaster
k <- 5

# Menerapkan K-Means Clustering
set.seed(123) # Untuk reproduktibilitas
kmeans_result <- kmeans(fitur_scaled, centers = k, nstart = 25)

# Visualisasi hasil klastering
fviz_cluster(kmeans_result, data = fitur_scaled, geom = "point", stand = FALSE) +
  theme_minimal() +
  labs(title = "K-Means Clustering", x = "Usia", y = "Jumlah_Pembelian")

library(dplyr)
data <- generate_sales_data(100000)

# Menampilkan sebagian dari dataset
head(data)
##   ID_Pelanggan Usia Gender Jumlah_Pembelian Total_Pembelian
## 1            1   59 Wanita                1             128
## 2            2   59 Wanita                8             153
## 3            3   55 Wanita                1             500
## 4            4   65 Wanita                2              55
## 5            5   33 Wanita                8             318
## 6            6   52 Wanita                8             316
##   Jenis_Produk_Favorit
## 1              Makanan
## 2              Makanan
## 3              Makanan
## 4           Elektronik
## 5              Makanan
## 6           Elektronik
# Preprocessing: Convert categorical data to numeric
data$Gender <- ifelse(data$Gender == "Pria", 1, 0)
data$Jenis_Produk_Favorit <- as.numeric(factor(data$Jenis_Produk_Favorit, 
                                              levels = c("Elektronik", "Pakaian", "Makanan")))

# mendefinisikan segmen 
data <- data %>%
  mutate(Cluster = case_when(
    Usia >= 30 & Usia <= 40 & Gender == 1 & Jumlah_Pembelian == 5 & Total_Pembelian == 300 ~ 1, #Laki-Laki = 1 dan Perempuan = 0
    Usia >= 40 & Usia <= 50 & Gender == 0 & Jumlah_Pembelian == 3 & Total_Pembelian == 200 ~ 2,
    Usia >= 20 & Usia <= 30 & Gender == 1 & Jumlah_Pembelian == 7 & Total_Pembelian == 400 ~ 3,
    Usia >= 50 & Usia <= 60 & Gender == 1 & Jumlah_Pembelian == 2 & Total_Pembelian == 100 ~ 4,
    Usia >= 25 & Usia <= 35 & Gender == 1 & Jumlah_Pembelian == 6 & Total_Pembelian == 350 ~ 5,
    TRUE ~ 0 
  ))

# Display beberapa row
head(data)
##   ID_Pelanggan Usia Gender Jumlah_Pembelian Total_Pembelian
## 1            1   59      0                1             128
## 2            2   59      0                8             153
## 3            3   55      0                1             500
## 4            4   65      0                2              55
## 5            5   33      0                8             318
## 6            6   52      0                8             316
##   Jenis_Produk_Favorit Cluster
## 1                    3       0
## 2                    3       0
## 3                    3       0
## 4                    1       0
## 5                    3       0
## 6                    1       0

1.1.2 Bagaimana Anda akan menentukan jumlah klaster yang optimal untuk dataset ini?

dengan menggunakan algoritma elbow, yaitu mencari titik dimana penurunan inersia mulai menurun secara signifikan atau menyerupai siku.

1.1.3 Berikan contoh algoritma klasterisasi yang dapat Anda gunakan dan jelaskan mengapa algoritma tersebut cocok untuk masalah ini.

dapat menggunakan banyak algortima, seperti Hierarchial, Gap statistic, Silhoutte, K-means, elbow, dan lain lain. Pada dataset ini, saya menggunakan algoritma K-means dan elbow dalam menentukan jumlah klastering optimal karena hal algoritma lain menghasilkan data sebesar 37gb dimana hal tersebut beberapa kali diinformasikan oleh R bahwa tidak bisa dilakukan run karena size data yang begitu besar.

2 Analisis lanjutan

2.1 Bagaimana Anda akan mengevaluasi kinerja model klasifikasi dan klasterisasi Anda?

dengan memperhatikan metrik akurasi, presisi, serta metrik lainnya yang dapat memberi pengetahuan atau menginformasikan mengenai kinerja model klasifikasi dan klastering dalam mengategorikan data secara benar dan tepat.

##Apa langkah-langkah selanjutnya yang dapat diambil oleh perusahaan untuk memanfaatkan hasil analisis ini dalam meningkatkan strategi pemasaran mereka

berdasarkan klasifikasi, produk yang sering dibeli berdasarkan gender adalah penjualan elektronik dengan rata-rata pembelian dan rata-rata total pembelian tertinggi. hal ini bisa menjadi strategi pemasaran selanjutnya bahwa perusahaan bisa lebih menekankan penjualan elektronik yang menjadi produk terlaris.

3 Implementasi

3.1 Bagaimana Anda akan mengimplementasikan hasil analisis ini dalam lingkungan bisnis nyata?

harus memahami bagaimana menginterpretasikan klaster yang dihasilkan sehingga hasil klastering dan klasifikasi memungkinkan untuk digunakan dalam pemasaran dan pengembangan produk.

3.2 Apa tantangan yang mungkin Anda hadapi dalam mengimplementasikan solusi ini, dan bagaimana Anda akan mengatasinya?

banyak tantangan yang mungkin akan dihadapi, contohnya:

  1. data yang ga lengkap sehingga mengurangi keakurat-an hasil
  2. ukuran data yang besar (seperti dataset ini, di beberapa algoritma tidak mau running karena ukuran data yang akan dihasilkan cukup besar),
  3. sulit dalam membaca hasil analisis.

cara mengatasinya yaitu:

  1. data tidak lengkap:

melakukan teknik pengolahan data seperti menggabungkan data yang relevan.

  1. ukuran data yang besar:

menggunakan teknik reduksi dimensi

  1. sulit membaca hasil analisis:

bertanya atau membangun komunikasi kepada yang lebih expert di bidangnya.