library(tidyr)
## Warning: package 'tidyr' was built under R version 4.4.3
set.seed(123)
# Jumlah transaksi (boleh ada id customer berulang)
n <- 300
# Buat ID pelanggan (100 orang, tapi ada yang belanja berkali-kali)
id_unik <- sprintf("ID%05d", 1:100) # ID00001 - ID00100
id_pelanggan <- sample(id_unik, n, replace = TRUE)
# Jenis kelamin (Perempuan lebih sering belanja → probabilitas lebih besar)
jenis_kelamin <- sample(c("Perempuan", "Laki-laki"),
n, replace = TRUE, prob = c(0.6, 0.4))
# Tempat tinggal (desa vs kota, kota lebih sering belanja)
tempat_tinggal <- sample(c("Kota", "Desa"),
n, replace = TRUE, prob = c(0.65, 0.35))
# Penghasilan (lebih tinggi di kota, lebih rendah di desa)
penghasilan <- ifelse(tempat_tinggal == "Kota",
round(rnorm(n, mean = 10000000, sd = 2500000)), # kota
round(rnorm(n, mean = 6000000, sd = 2000000))) # desa
# Total belanja (sebanding dengan penghasilan, ditambah faktor loyalitas & gender)
total_belanja <- round(
penghasilan * runif(n, 0.2, 0.5) + # proporsi penghasilan
ifelse(jenis_kelamin == "Perempuan", runif(n, 1000000, 3000000), runif(n, 500000, 1500000)) +
ifelse(tempat_tinggal == "Kota", runif(n, 1000000, 4000000), runif(n, 500000, 2000000))
)
# Buat data frame
df_customer <- data.frame(
ID_Pelanggan = id_pelanggan,
Jenis_Kelamin = jenis_kelamin,
Tempat_Tinggal = tempat_tinggal,
Penghasilan = penghasilan,
Total_Belanja = total_belanja
)
# Lihat 10 baris pertama
head(df_customer, 10)
## ID_Pelanggan Jenis_Kelamin Tempat_Tinggal Penghasilan Total_Belanja
## 1 ID00031 Laki-laki Desa 2227350 2563031
## 2 ID00079 Perempuan Kota 9047608 8369550
## 3 ID00051 Perempuan Kota 9735540 8053033
## 4 ID00014 Laki-laki Kota 13510126 9799876
## 5 ID00067 Perempuan Desa 7773498 6982081
## 6 ID00042 Laki-laki Desa 6666740 4782002
## 7 ID00050 Perempuan Desa 5658721 4286283
## 8 ID00043 Laki-laki Desa 7637656 4779797
## 9 ID00014 Perempuan Desa 6776730 6315967
## 10 ID00025 Laki-laki Kota 10412102 5106141
library(writexl)
## Warning: package 'writexl' was built under R version 4.4.3
write.csv(df_customer, "df_customer.csv")
write_xlsx(df_customer, "df_customerr.xlsx")
nrow(df_customer)
## [1] 300
Fungsi nrow()
digunakan untuk menghitung jumlah baris
dalam dataset. Setiap baris merepresentasikan satu transaksi yang
dilakukan pelanggan. Dengan demikian, hasil perintah ini menunjukkan
total transaksi yang terekam.
length(unique(df_customer$ID_Pelanggan))
## [1] 94
Fungsi unique()
mengekstrak nilai unik dari kolom ID
pelanggan, kemudian length() menghitung jumlahnya. Hasil ini menunjukkan
banyaknya pelanggan berbeda yang berpartisipasi dalam transaksi.
sort(table(df_customer$ID_Pelanggan), decreasing = TRUE)[1:3]
##
## ID00007 ID00025 ID00089
## 9 7 7
table()
menghitung frekuensi kemunculan setiap ID
pelanggan. Selanjutnya sort() mengurutkan dari yang paling tinggi.
Pelanggan dengan frekuensi belanja tertinggi dapat diidentifikasi
sebagai pelanggan loyal.
aggregate(Penghasilan ~ Jenis_Kelamin, data = df_customer, mean)
## Jenis_Kelamin Penghasilan
## 1 Laki-laki 8880902
## 2 Perempuan 8505199
Fungsi aggregate()
menghitung nilai rata-rata
penghasilan dengan mengelompokkan data berdasarkan jenis kelamin.
Analisis ini penting untuk mengetahui apakah terdapat perbedaan
rata-rata penghasilan antara pelanggan laki-laki dan perempuan, yang
dapat berimplikasi pada strategi segmentasi pasar.
aggregate(Total_Belanja ~ Jenis_Kelamin, data = df_customer, mean)
## Jenis_Kelamin Total_Belanja
## 1 Laki-laki 6034728
## 2 Perempuan 7114786
Mirip dengan poin sebelumnya, namun fokus pada kolom
Total_Belanja
. Hasil analisis menunjukkan pola konsumsi
pelanggan laki-laki dan perempuan.
aggregate(Penghasilan ~ Tempat_Tinggal, data = df_customer, mean)
## Tempat_Tinggal Penghasilan
## 1 Desa 6249122
## 2 Kota 9878685
Analisis ini membandingkan rata-rata penghasilan pelanggan yang tinggal di kota dan desa. Umumnya, pelanggan di kota diharapkan memiliki penghasilan lebih tinggi. Hasil ini memberikan validasi terhadap hipotesis tersebut serta dapat digunakan dalam penentuan harga dan produk yang sesuai untuk masing-masing wilayah.
aggregate(Total_Belanja ~ Tempat_Tinggal, data = df_customer, mean)
## Tempat_Tinggal Total_Belanja
## 1 Desa 5022231
## 2 Kota 7520118
Menghitung rata-rata belanja tahunan pelanggan di kota dan desa. Apabila pelanggan di kota memiliki rata-rata belanja yang lebih tinggi, hal ini menunjukkan adanya potensi pasar yang lebih besar di wilayah perkotaan. Informasi ini dapat digunakan untuk alokasi sumber daya pemasaran.
df_customer[order(-df_customer$Total_Belanja), c("ID_Pelanggan", "Total_Belanja")] |> head(5)
## ID_Pelanggan Total_Belanja
## 76 ID00034 11626302
## 175 ID00011 11527638
## 228 ID00057 11031197
## 287 ID00093 10984825
## 33 ID00007 10846012
order()
digunakan untuk mengurutkan data berdasarkan
nilai belanja dari yang terbesar. Lima pelanggan dengan nilai belanja
tertinggi dapat diidentifikasi sebagai top spender. Kelompok ini
merupakan segmen yang sangat penting untuk dipertahankan melalui layanan
premium atau personalisasi.
table(df_customer$Jenis_Kelamin)
##
## Laki-laki Perempuan
## 121 179
Hasil table()
menunjukkan jumlah transaksi yang
dilakukan oleh pelanggan perempuan dan laki-laki. Analisis ini
memperlihatkan partisipasi relatif dari masing-masing kelompok.
df_customer$Kategori_Penghasilan <- cut(df_customer$Penghasilan,
breaks = c(-Inf, 5000000, 10000000, Inf),
labels = c("Rendah", "Menengah", "Tinggi"))
table(df_customer$Kategori_Penghasilan)
##
## Rendah Menengah Tinggi
## 27 175 98
Fungsi cut()
digunakan untuk mengelompokkan variabel
kontinu menjadi kategori. Dengan membagi penghasilan menjadi tiga
kategori, analisis segmen pelanggan menjadi lebih mudah dilakukan.
Misalnya, pelanggan berpenghasilan rendah dapat disasar dengan promosi
harga murah, sementara pelanggan berpenghasilan tinggi dapat ditawarkan
produk premium.
Jawablah pertanyaan di bawah ini
# Load data
df_customer <- read.csv("df_customer.csv")
# 1. Pelanggan yang paling sering membeli dengan total belanja > 5.000.000
q1 <- df_customer[df_customer$Total_Belanja > 5000000,]
q1 <- sort(table(q1$ID_Pelanggan), decreasing = TRUE)
head(q1)
##
## ID00007 ID00025 ID00026 ID00089 ID00053 ID00079
## 7 7 6 6 5 5
Hasil ini mengidentifikasi pelanggan yang paling sering melakukan pembelian dengan nilai total belanja per transaksi lebih dari Rp5.000.000. Informasi ini penting untuk menentukan pelanggan premium yang berpotensi menjadi target program loyalitas eksklusif.
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
# 1. Pelanggan yang paling sering membeli dengan total belanja > 5.000.000
q11 <- df_customer %>%
filter(Total_Belanja > 5000000) %>%
count(ID_Pelanggan, sort = TRUE) %>%
slice_head(n=6)
q11
## ID_Pelanggan n
## 1 ID00007 7
## 2 ID00025 7
## 3 ID00026 6
## 4 ID00089 6
## 5 ID00053 5
## 6 ID00079 5
# 2. Ada berapa banyak perempuan di kota yang berbelanja lebih dari 5x
q2 <- subset(df_customer, Jenis_Kelamin == "Perempuan" & Tempat_Tinggal == "Kota")
q2_count <- table(q2$ID_Pelanggan)
q2_count <- data.frame(q2_count)
q2_count
## Var1 Freq
## 1 ID00001 1
## 2 ID00002 3
## 3 ID00004 2
## 4 ID00005 1
## 5 ID00006 2
## 6 ID00007 5
## 7 ID00009 1
## 8 ID00010 1
## 9 ID00011 1
## 10 ID00012 1
## 11 ID00013 1
## 12 ID00016 1
## 13 ID00017 1
## 14 ID00021 1
## 15 ID00023 3
## 16 ID00024 3
## 17 ID00025 4
## 18 ID00026 4
## 19 ID00030 2
## 20 ID00031 2
## 21 ID00032 3
## 22 ID00034 1
## 23 ID00035 1
## 24 ID00036 3
## 25 ID00037 3
## 26 ID00038 1
## 27 ID00039 2
## 28 ID00040 2
## 29 ID00041 1
## 30 ID00042 2
## 31 ID00043 1
## 32 ID00044 1
## 33 ID00045 3
## 34 ID00046 3
## 35 ID00048 1
## 36 ID00050 2
## 37 ID00051 2
## 38 ID00053 4
## 39 ID00054 2
## 40 ID00056 1
## 41 ID00057 2
## 42 ID00058 1
## 43 ID00060 2
## 44 ID00063 3
## 45 ID00066 1
## 46 ID00067 1
## 47 ID00069 2
## 48 ID00070 1
## 49 ID00071 2
## 50 ID00072 1
## 51 ID00074 1
## 52 ID00075 1
## 53 ID00076 2
## 54 ID00079 2
## 55 ID00082 1
## 56 ID00083 1
## 57 ID00084 1
## 58 ID00085 3
## 59 ID00086 1
## 60 ID00087 3
## 61 ID00089 1
## 62 ID00090 2
## 63 ID00091 2
## 64 ID00092 1
## 65 ID00093 1
## 66 ID00096 1
## 67 ID00099 1
# 2. Ada berapa banyak perempuan di kota yang berbelanja lebih dari 5x
q22 <- df_customer %>%
filter(Jenis_Kelamin == "Perempuan", Tempat_Tinggal == "Kota") %>%
count(ID_Pelanggan) %>%
filter(n > 5) %>%
summarise(jumlah = n())
q22
## jumlah
## 1 0
Jumlah ini menggambarkan pelanggan perempuan di kota yang memiliki frekuensi belanja tinggi. Temuan ini sejalan dengan pola umum bahwa pelanggan perempuan cenderung lebih sering berbelanja, terutama di perkotaan, sehingga segmen ini sangat potensial untuk strategi pemasaran berulang (repeat marketing).
# 3. Pelanggan yang paling sering membeli dengan penghasilan > 5.000.000
q3 <- df_customer[df_customer$Penghasilan > 5000000, ]
q3 <- sort(table(q3$ID_Pelanggan), decreasing = TRUE)
head(q3, 1)
##
## ID00007
## 9
# 3. Pelanggan yang paling sering membeli dengan penghasilan > 5.000.000
q33 <- df_customer %>%
filter(Penghasilan > 5000000) %>%
count(ID_Pelanggan, sort = TRUE) %>%
slice_head(n = 1)
q33
## ID_Pelanggan n
## 1 ID00007 9
Identifikasi ini menampilkan pelanggan dengan penghasilan tinggi yang paling aktif melakukan pembelian. Fakta ini memperkuat asumsi bahwa daya beli meningkat seiring dengan penghasilan, sehingga pelanggan dengan profil serupa bisa menjadi fokus strategi premium sales.
# 4. Berjenis kelamin apa pelanggan yang tinggal di desa dengan total belanja > 5.000.000
q4 <- subset(df_customer, Tempat_Tinggal == "Desa" & Total_Belanja > 5000000)
table(q4$Jenis_Kelamin)
##
## Laki-laki Perempuan
## 10 37
# 4. Berjenis kelamin apa pelanggan yang tinggal di desa dengan total belanja > 5.000.000
q44 <- df_customer %>%
filter(Tempat_Tinggal == "Desa", Total_Belanja > 5000000) %>%
count(Jenis_Kelamin)
q44
## Jenis_Kelamin n
## 1 Laki-laki 10
## 2 Perempuan 37
Output ini memperlihatkan jenis kelamin pelanggan desa yang tetap memiliki daya beli tinggi (> Rp5.000.000). Hasil ini penting karena menunjukkan bahwa meskipun tinggal di desa, ada segmen pelanggan dengan potensi premium, sehingga perlu pendekatan distribusi produk yang lebih inklusif.
# 5. Berpenghasilan berapa pelanggan yang tinggal di desa namun memiliki total belanja > 5.000.000
q5 <- subset(df_customer, Tempat_Tinggal == "Desa" & Total_Belanja > 5000000)
head(q5[, c("ID_Pelanggan", "Penghasilan")], 5)
## ID_Pelanggan Penghasilan
## 5 ID00067 7773498
## 9 ID00014 6776730
## 43 ID00027 8108645
## 46 ID00089 9032981
## 47 ID00034 5616450
# 5. Berpenghasilan berapa pelanggan yang tinggal di desa namun memiliki total belanja > 5.000.000
q55 <- df_customer %>%
filter(Tempat_Tinggal == "Desa", Total_Belanja > 5000000) %>%
select(ID_Pelanggan, Penghasilan) %>%
head(5)
q55
## ID_Pelanggan Penghasilan
## 1 ID00067 7773498
## 2 ID00014 6776730
## 3 ID00027 8108645
## 4 ID00089 9032981
## 5 ID00034 5616450
Data ini menjawab berapa besar penghasilan pelanggan desa yang sanggup berbelanja di atas Rp5.000.000. Analisis ini memperlihatkan bahwa segmen pedesaan bukan homogen; ada kelompok dengan penghasilan menengah hingga tinggi yang patut menjadi target program penetrasi pasar non-perkotaan.