BELAJAR DATA SCIENCE MENYENANGKAN


Data Preparation di R

Import Data dari File CSV

df_customer <- read.csv("D:/lab/datasets/raw/df_customer.csv")
head(df_customer, 10)
##     X ID_Pelanggan Jenis_Kelamin Tempat_Tinggal Penghasilan Total_Belanja
## 1   1      ID00031     Laki-laki           Desa     2227350       2563031
## 2   2      ID00079     Perempuan           Kota     9047608       8369550
## 3   3      ID00051     Perempuan           Kota     9735540       8053033
## 4   4      ID00014     Laki-laki           Kota    13510126       9799876
## 5   5      ID00067     Perempuan           Desa     7773498       6982081
## 6   6      ID00042     Laki-laki           Desa     6666740       4782002
## 7   7      ID00050     Perempuan           Desa     5658721       4286283
## 8   8      ID00043     Laki-laki           Desa     7637656       4779797
## 9   9      ID00014     Perempuan           Desa     6776730       6315967
## 10 10      ID00025     Laki-laki           Kota    10412102       5106141

Pertanyaan Contoh:

1. Berapa Jumlah Total Transaksi dalam Data ini?

nrow(df_customer)
## [1] 300

2. Berapa Jumlah Pelanggan yang Unik Pada Dataset Ini?

unique(df_customer$ID_Pelanggan)
##  [1] "ID00031" "ID00079" "ID00051" "ID00014" "ID00067" "ID00042" "ID00050"
##  [8] "ID00043" "ID00025" "ID00090" "ID00091" "ID00069" "ID00057" "ID00092"
## [15] "ID00009" "ID00093" "ID00099" "ID00072" "ID00026" "ID00007" "ID00083"
## [22] "ID00036" "ID00078" "ID00081" "ID00076" "ID00015" "ID00032" "ID00041"
## [29] "ID00074" "ID00023" "ID00027" "ID00060" "ID00053" "ID00096" "ID00038"
## [36] "ID00089" "ID00034" "ID00063" "ID00013" "ID00082" "ID00097" "ID00021"
## [43] "ID00047" "ID00095" "ID00016" "ID00094" "ID00006" "ID00086" "ID00039"
## [50] "ID00004" "ID00052" "ID00022" "ID00087" "ID00035" "ID00040" "ID00030"
## [57] "ID00012" "ID00064" "ID00071" "ID00085" "ID00037" "ID00008" "ID00098"
## [64] "ID00084" "ID00046" "ID00017" "ID00062" "ID00054" "ID00024" "ID00005"
## [71] "ID00070" "ID00055" "ID00075" "ID00048" "ID00077" "ID00056" "ID00068"
## [78] "ID00001" "ID00088" "ID00020" "ID00049" "ID00059" "ID00011" "ID00066"
## [85] "ID00044" "ID00045" "ID00033" "ID00010" "ID00058" "ID00061" "ID00029"
## [92] "ID00073" "ID00018" "ID00002"
# Jumlah data unik logika dasar 1
length(unique(df_customer$ID_Pelanggan))
## [1] 94
# Jumlah data unik logika dasar 2
length(table(df_customer$ID_Pelanggan))
## [1] 94
# Jumlah data unik logika dplyr
n_distinct(df_customer$ID_Pelanggan)
## [1] 94

3. Siapa Pelanggan yang Paling Loyal?

# Mengurutkan data frekuensi alur logika dasar
sort(table(df_customer$ID_Pelanggan), decreasing = TRUE)[1:3]
## 
## ID00007 ID00025 ID00089 
##       9       7       7
# Mengurutkan data frekuensi alur logika dplyr
df_customer %>%
  count(ID_Pelanggan, sort = TRUE) %>%
  slice_head(n = 3)
##   ID_Pelanggan n
## 1      ID00007 9
## 2      ID00025 7
## 3      ID00089 7
# Mengurutkan data frekuensi alur logika data_table
as.data.table(df_customer)[, .N, by = ID_Pelanggan][order(-N)][1:3]
##    ID_Pelanggan     N
##          <char> <int>
## 1:      ID00007     9
## 2:      ID00025     7
## 3:      ID00093     7

4. Berapa Rata - Rata Penghasilan Bulanan dari Setiap Gender?

# Mencari nilai rata - rata penghasilan dengan logika dasar
aggregate(Penghasilan ~ Jenis_Kelamin, data = df_customer, mean)
##   Jenis_Kelamin Penghasilan
## 1     Laki-laki     8880902
## 2     Perempuan     8505199
# Mencari nilai rata - rata penghasilan dengan logika dplyr
result1_1 <- df_customer %>%
  group_by(Jenis_Kelamin) %>%
  summarise(Rata_Rata_Penghasilan = mean(Penghasilan, na.rm = TRUE))
head(result1_1)
## # A tibble: 2 × 2
##   Jenis_Kelamin Rata_Rata_Penghasilan
##   <chr>                         <dbl>
## 1 Laki-laki                  8880902.
## 2 Perempuan                  8505199.
# Mencari nilai rata - rata penghasilan dengan logika data_table
result1_2 <- as.data.table(df_customer)[, .(Rata_Rata_Penghasilan = mean(Penghasilan, na.rm = TRUE)), by = Jenis_Kelamin]
head(result1_2)
##    Jenis_Kelamin Rata_Rata_Penghasilan
##           <char>                 <num>
## 1:     Laki-laki               8880902
## 2:     Perempuan               8505199

5. Rata-Rata Nilai Belanja dari Masing-Masing Gender

# Rata-rata total belanja dengan logika dasar
aggregate(Total_Belanja ~ Jenis_Kelamin, data = df_customer, mean)
##   Jenis_Kelamin Total_Belanja
## 1     Laki-laki       6034728
## 2     Perempuan       7114786
# Rata-rata total belanja dengan logika dplyr
result2_1 <- df_customer %>%
  group_by(Jenis_Kelamin) %>%
  summarise(Total_Belanja = mean(Total_Belanja, na.rm = TRUE))
result2_1
## # A tibble: 2 × 2
##   Jenis_Kelamin Total_Belanja
##   <chr>                 <dbl>
## 1 Laki-laki          6034728.
## 2 Perempuan          7114786.
# Rata-rata total belanja dengan logika data_table
result2_2 <- as.data.table(df_customer)[, .(Total_Belanja = mean(Total_Belanja, na.rm = TRUE)), by = Jenis_Kelamin]
result2_2
##    Jenis_Kelamin Total_Belanja
##           <char>         <num>
## 1:     Laki-laki       6034728
## 2:     Perempuan       7114786

6. Tren Rata-rata Pendapatan Berdasarkan Lokasi

# Rata-rata penghasilan terhadap tempat tinggal dengan logika dasar 1
aggregate(Penghasilan ~ Tempat_Tinggal, data = df_customer, mean)
##   Tempat_Tinggal Penghasilan
## 1           Desa     6249122
## 2           Kota     9878685
# Rata-rata penghasilan terhadap tempat tinggal dengan logika dasar 2
tapply(df_customer$Penghasilan, df_customer$Tempat_Tinggal, mean, na.rm = TRUE)
##    Desa    Kota 
## 6249122 9878685
# Rata-rata penghasilan terhadap tempat tinggal dengan logika dplyr
df_customer %>%
  group_by(Tempat_Tinggal) %>%
  summarise(Rata_Rata_Penghasilan = mean(Penghasilan, na.rm = TRUE))
## # A tibble: 2 × 2
##   Tempat_Tinggal Rata_Rata_Penghasilan
##   <chr>                          <dbl>
## 1 Desa                        6249122.
## 2 Kota                        9878685.
# Rata-rata penghasilan terhadap tempat tinggal dengan logika data_table
as.data.table(df_customer)[, .(Rata_Rata_Penghasilan = mean(Penghasilan, na.rm = TRUE)), by = Tempat_Tinggal]
##    Tempat_Tinggal Rata_Rata_Penghasilan
##            <char>                 <num>
## 1:           Desa               6249122
## 2:           Kota               9878685

7. Distribusi Rata-rata Pengeluaran Total Pelanggan Ditinjau dari Wilayahnya

# Rata-rata total belanja berdasar lokasi dengan logika dasar 1
aggregate(Total_Belanja ~ Tempat_Tinggal, data = df_customer, mean)
##   Tempat_Tinggal Total_Belanja
## 1           Desa       5022231
## 2           Kota       7520118
# Rata-rata total belanja berdasar lokasi dengan logika dasar 2
tapply(df_customer$Total_Belanja, df_customer$Tempat_Tinggal, mean)
##    Desa    Kota 
## 5022231 7520118
# Rata-rata total belanja berdasar lokasi dengan logika dasar 3
by(df_customer$Total_Belanja, df_customer$Tempat_Tinggal, mean)
## df_customer$Tempat_Tinggal: Desa
## [1] 5022231
## ------------------------------------------------------------ 
## df_customer$Tempat_Tinggal: Kota
## [1] 7520118
# Rata-rata total belanja berdasar lokasi dengan logika dplyr
df_customer %>%
  group_by(Tempat_Tinggal) %>%
  summarise(Rata_Rata_Belanja = mean(Total_Belanja, na.rm = TRUE))
## # A tibble: 2 × 2
##   Tempat_Tinggal Rata_Rata_Belanja
##   <chr>                      <dbl>
## 1 Desa                    5022231.
## 2 Kota                    7520118.
# Rata-rata total belanja berdasar lokasi dengan logika data_table
as.data.table(df_customer)[, .(Rata_Rata_Belanja = mean(Total_Belanja, na.rm = TRUE)), by = Tempat_Tinggal]
##    Tempat_Tinggal Rata_Rata_Belanja
##            <char>             <num>
## 1:           Desa           5022231
## 2:           Kota           7520118

8. Siapakah 5 Pelanggan dengan Nilai Transaksi Tertinggi?

# Mengurutkan pelanggan top 5 dengan transaksi terbesar dengan logika dasar 1
head(df_customer[order(df_customer$Total_Belanja, decreasing = TRUE), c("ID_Pelanggan", "Total_Belanja")], 5)
##     ID_Pelanggan Total_Belanja
## 76       ID00034      11626302
## 175      ID00011      11527638
## 228      ID00057      11031197
## 287      ID00093      10984825
## 33       ID00007      10846012
# Mengurutkan pelanggan top 5 dengan transaksi terbesar dengan logika dasar 2
df_customer[order(df_customer$Total_Belanja, decreasing = TRUE)[1:5], c("ID_Pelanggan", "Total_Belanja")]
##     ID_Pelanggan Total_Belanja
## 76       ID00034      11626302
## 175      ID00011      11527638
## 228      ID00057      11031197
## 287      ID00093      10984825
## 33       ID00007      10846012
# Mengurutkan pelanggan Top 5 dengan transaksi terbesar dengan logika dplyr
df_customer %>% 
  arrange(desc(Total_Belanja)) %>% 
  select(ID_Pelanggan, Total_Belanja) %>% 
  head(5)
##   ID_Pelanggan Total_Belanja
## 1      ID00034      11626302
## 2      ID00011      11527638
## 3      ID00057      11031197
## 4      ID00093      10984825
## 5      ID00007      10846012
# Mengurutkan pelanggan top 5 dengan transaksi terbesar dengan logika data_table
as.data.table(df_customer)[order(-Total_Belanja), .(ID_Pelanggan, Total_Belanja)][1:5]
##    ID_Pelanggan Total_Belanja
##          <char>         <int>
## 1:      ID00034      11626302
## 2:      ID00011      11527638
## 3:      ID00057      11031197
## 4:      ID00093      10984825
## 5:      ID00007      10846012

9. Sebaran Data Transaksi Menurut Jenis Kelamin Pengguna?

table(df_customer$Jenis_Kelamin)
## 
## Laki-laki Perempuan 
##       121       179
# 
df_customer %>% 
  count(Jenis_Kelamin)
##   Jenis_Kelamin   n
## 1     Laki-laki 121
## 2     Perempuan 179
#
df_customer$Jenis_Kelamin <- as.factor(df_customer$Jenis_Kelamin)
tabyl(df_customer, Jenis_Kelamin)
##  Jenis_Kelamin   n   percent
##      Laki-laki 121 0.4033333
##      Perempuan 179 0.5966667
# Menghitung sebaran data transaksi dengan logika data_table
as.data.table(df_customer)[, .N, by = Jenis_Kelamin]
##    Jenis_Kelamin     N
##           <fctr> <int>
## 1:     Laki-laki   121
## 2:     Perempuan   179

10. Klasifikasi Sumber Pendapatan

# Klasifikasi data menggunakan logika dasar
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
# Klasifikasi data menggunakan dplyr
df_customer <- df_customer %>%
  mutate(Kategori_Penghasilan = case_when(
    Penghasilan <= 5000000  ~ "Rendah",
    Penghasilan <= 10000000 ~ "Menengah",
    TRUE                    ~ "Tinggi"
  ))
df_customer %>% 
  count(Kategori_Penghasilan)
##   Kategori_Penghasilan   n
## 1             Menengah 175
## 2               Rendah  27
## 3               Tinggi  98
# Klasifikasi data menggunakan data_table
setDT(df_customer)
df_customer[, Kategori_Penghasilan := fcase(
  Penghasilan <= 5000000,  "Rendah",
  Penghasilan <= 10000000, "Menengah",
  default = "Tinggi"
)]
df_customer[, .N, by = Kategori_Penghasilan]
##    Kategori_Penghasilan     N
##                  <char> <int>
## 1:               Rendah    27
## 2:             Menengah   175
## 3:               Tinggi    98

Latihan Soal

1. Siapa pelanggan yang paling sering membeli dengan total belanja lebih dari 5000000?

# Memfilter transaksi yang nilai belanjanya di atas 5.000.000 ke dalam objek baru
data_belanja_5jt <- df_customer[df_customer$Total_Belanja > 5000000, ]
# Menghitung frekuensi transaksi per ID Pelanggan dari data yang sudah difilter
frek_pelanggan_1 <- table(data_belanja_5jt$ID_Pelanggan)
# Mengurutkan frekuensi dari yang terbanyak keterkecil dan mengambil posisi teratas (peringkat 1)
sort(frek_pelanggan_1, decreasing = TRUE)[1-5]
## 
## ID00007 ID00025 ID00026 ID00053 ID00079 ID00084 ID00090 ID00093 ID00006 ID00009 
##       7       7       6       5       5       5       5       5       4       4 
## ID00016 ID00023 ID00024 ID00031 ID00032 ID00036 ID00057 ID00063 ID00067 ID00074 
##       4       4       4       4       4       4       4       4       4       4 
## ID00087 ID00091 ID00002 ID00013 ID00014 ID00030 ID00035 ID00037 ID00039 ID00040 
##       4       4       3       3       3       3       3       3       3       3 
## ID00042 ID00045 ID00046 ID00052 ID00055 ID00060 ID00069 ID00071 ID00072 ID00082 
##       3       3       3       3       3       3       3       3       3       3 
## ID00085 ID00094 ID00004 ID00008 ID00010 ID00017 ID00021 ID00022 ID00033 ID00034 
##       3       3       2       2       2       2       2       2       2       2 
## ID00038 ID00041 ID00048 ID00049 ID00050 ID00051 ID00054 ID00058 ID00066 ID00075 
##       2       2       2       2       2       2       2       2       2       2 
## ID00076 ID00083 ID00086 ID00092 ID00096 ID00097 ID00001 ID00005 ID00011 ID00012 
##       2       2       2       2       2       2       1       1       1       1 
## ID00015 ID00018 ID00027 ID00029 ID00043 ID00044 ID00047 ID00056 ID00059 ID00061 
##       1       1       1       1       1       1       1       1       1       1 
## ID00064 ID00070 ID00073 ID00077 ID00078 ID00088 ID00095 ID00098 ID00099 
##       1       1       1       1       1       1       1       1       1

2. Ada berapa banyak perempuan di kota yang berbelanja lebih dari 5x?

# Memfilter data untuk perempuan/wanita yang berdomisili di Kota
data_cewek_kota <- df_customer[df_customer$Jenis_Kelamin %in% c("Perempuan", "Wanita") & df_customer$Tempat_Tinggal == "Kota", ]
# Menghitung jumlah kali transaksi yang dilakukan oleh masing-masing ID Pelanggan
frek_cewek_kota <- table(data_cewek_kota$ID_Pelanggan)
# Menyaring hanya pelanggan yang frekuensi transaksinya lebih dari 5 kali
pelanggan_lebih_5x <- frek_cewek_kota[frek_cewek_kota > 5]
# Menghitung total banyaknya individu/pelanggan unik yang memenuhi kriteria tersebut
length(pelanggan_lebih_5x)
## [1] 0

3. Siapa pelanggan yang paling sering membeli dengan penghasilan lebih dari 5000000?

# Memfilter baris data yang pelanggannya memiliki penghasilan di atas 5.000.000
data_gaji_5jt <- df_customer[df_customer$Penghasilan > 5000000, ]
# Menghitung berapa kali setiap pelanggan melakukan pembelian pada data hasil filter
frek_pelanggan_gaji <- table(data_gaji_5jt$ID_Pelanggan)
# Mengurutkan data transaksi terbanyak dan menampilkan pelanggan urutan pertama
sort(frek_pelanggan_gaji, decreasing = TRUE)[1:5]
## 
## ID00007 ID00025 ID00093 ID00026 ID00089 
##       9       7       7       6       6

4. Berjenis kelamin apa pelanggan yang tinggal di desa namun memiliki total belanja yang lebih dari 5000000?

# Memfilter data dengan dua syarat sekaligus (tinggal di Desa DAN belanja > 5.000.000)
data_desa_belanja_5jt <- df_customer[df_customer$Tempat_Tinggal == "Desa" &  df_customer$Total_Belanja > 5000000, ]
# Melihat sebaran frekuensi jumlah transaksinya menurut jenis kelamin
table(data_desa_belanja_5jt$Jenis_Kelamin)
## 
## Laki-laki Perempuan 
##        10        37

5. Berpenghasilan berapa pelanggan yang tinggal di desa namun memiliki total belanja lebih dari 5000000?

# Menyaring data transaksi pelanggan di Desa yang total belanjanya lebih dari 5.000.000
data_desa_belanja_5jt <- df_customer[df_customer$Tempat_Tinggal == "Desa" & df_customer$Total_Belanja > 5000000, ]
# Menampilkan ID Pelanggan beserta nominal penghasilannya tanpa duplikasi baris
unique(data_desa_belanja_5jt[, c("ID_Pelanggan", "Penghasilan")],)
##     ID_Pelanggan Penghasilan
##           <char>       <int>
##  1:      ID00067     7773498
##  2:      ID00014     6776730
##  3:      ID00027     8108645
##  4:      ID00089     9032981
##  5:      ID00034     5616450
##  6:      ID00013     4481204
##  7:      ID00091     6128487
##  8:      ID00038     5947963
##  9:      ID00041     9231091
## 10:      ID00047     5940612
## 11:      ID00095     8032910
## 12:      ID00031     7822419
## 13:      ID00022     9331982
## 14:      ID00096     7082568
## 15:      ID00074     9657061
## 16:      ID00094     7651846
## 17:      ID00016     5575699
## 18:      ID00055     8635642
## 19:      ID00075     5809025
## 20:      ID00090     6005712
## 21:      ID00098     4849165
## 22:      ID00048     4626369
## 23:      ID00088     5455465
## 24:      ID00067     6467267
## 25:      ID00049     3157783
## 26:      ID00055     6093467
## 27:      ID00008     6193172
## 28:      ID00072     9024791
## 29:      ID00058     9310352
## 30:      ID00026     8141032
## 31:      ID00052     6499451
## 32:      ID00026    10832415
## 33:      ID00090    11664452
## 34:      ID00073     6455085
## 35:      ID00014     6571179
## 36:      ID00006     9498495
## 37:      ID00091     5671820
## 38:      ID00094     3726214
## 39:      ID00031     6533837
## 40:      ID00093     6856664
## 41:      ID00057     7212261
## 42:      ID00089     6928182
## 43:      ID00066     3373098
## 44:      ID00008     6940985
## 45:      ID00063     6915574
## 46:      ID00097     7028460
## 47:      ID00013     9810087
##     ID_Pelanggan Penghasilan
##           <char>       <int>
head(data_desa_belanja_5jt,5)
##        X ID_Pelanggan Jenis_Kelamin Tempat_Tinggal Penghasilan Total_Belanja
##    <int>       <char>        <fctr>         <char>       <int>         <int>
## 1:     5      ID00067     Perempuan           Desa     7773498       6982081
## 2:     9      ID00014     Perempuan           Desa     6776730       6315967
## 3:    43      ID00027     Perempuan           Desa     8108645       6901502
## 4:    46      ID00089     Laki-laki           Desa     9032981       5776859
## 5:    47      ID00034     Perempuan           Desa     5616450       7064321
##    Kategori_Penghasilan
##                  <char>
## 1:             Menengah
## 2:             Menengah
## 3:             Menengah
## 4:             Menengah
## 5:             Menengah

Thanks for all