Email          : naufal.fadhlullah@student.matanauniversity.ac.id
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.
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.
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
## 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
##
## Pria Wanita
## 50087 49913
##
## 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
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.
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.
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%)
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.
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")## 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
dengan menggunakan algoritma elbow, yaitu mencari titik dimana penurunan inersia mulai menurun secara signifikan atau menyerupai siku.
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.
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.
harus memahami bagaimana menginterpretasikan klaster yang dihasilkan sehingga hasil klastering dan klasifikasi memungkinkan untuk digunakan dalam pemasaran dan pengembangan produk.
banyak tantangan yang mungkin akan dihadapi, contohnya:
cara mengatasinya yaitu:
melakukan teknik pengolahan data seperti menggabungkan data yang relevan.
menggunakan teknik reduksi dimensi
bertanya atau membangun komunikasi kepada yang lebih expert di bidangnya.