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")

1. Berapa jumlah total transaksi dalam data ini?

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.

2. Ada berapa pelanggan unik dalam dataset?

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.

3. Siapa pelanggan yang paling sering berbelanja?

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.

4. Rata-rata penghasilan pelanggan berdasarkan jenis kelamin.

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.

5. Rata-rata total belanja pelanggan berdasarkan jenis kelamin.

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.

6. Rata-rata penghasilan pelanggan berdasarkan tempat tinggal (Kota vs Desa).

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.

7. Rata-rata total belanja pelanggan berdasarkan tempat tinggal.

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.

8. Siapa 5 pelanggan dengan total belanja tertinggi?

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.

9. Distribusi jumlah transaksi berdasarkan jenis kelamin.

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.

10. Buat kategori penghasilan:

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.

Tugas

Jawablah pertanyaan di bawah ini

  1. Siapa pelanggan yang paling sering membeli dengan total belanja lebih dari 5000000
  2. Ada berapa banyak perempuan di kota yang berbelanja lebih dari 5x
  3. Siapa pelanggan yang paling sering membeli dengan penghasilan lebih dari 5000000
  4. Berjenis kelamin apa pelanggan yang tinggal di desa namun memiliki total belanja yang lebih dari 5000000
  5. Berpenghasilan berapa pelanggan yang tinggal di desa namun memiliki total belanja lebih dari 5000000

Jawaban

# 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.