Analisis dan Preprocessing Data Pelanggan

Pendahuluan

Data merupakan salah satu komponen penting dalam proses analisis. Namun, data yang diperoleh pada tahap awal sering kali masih memiliki berbagai permasalahan, seperti missing value, data duplikat, ketidakkonsistenan penulisan, nilai yang tidak wajar, dan outlier.

Pada analisis ini dilakukan proses preprocessing terhadap data pelanggan dan data transaksi. Tahapan yang dilakukan meliputi pemeriksaan data awal, pemeriksaan missing value, pemeriksaan duplikasi, standardisasi data, koreksi nilai yang tidak wajar, penanganan missing value, deteksi outlier, transformasi data, integrasi data pelanggan dengan data transaksi, serta visualisasi data.

1. Persiapan Data

1.1 Pemeriksaan Lingkungan Kerja

Sebelum melakukan analisis, lingkungan kerja R diperiksa terlebih dahulu untuk mengetahui lokasi folder kerja dan versi R yang digunakan.

getwd()
## [1] "C:/Users/HP/Downloads"
R.version.string
## [1] "R version 4.4.2 (2024-10-31 ucrt)"

2. Membuat Dataset

2.1 Dataset Pelanggan

Dataset pelanggan terdiri atas beberapa variabel, yaitu identitas pelanggan, nama, usia, pendapatan, kota, dan status pelanggan.

pelanggan_raw <- data.frame(
  customer_id = c("C001", "C002", "C003", "C004", "C005", "C006",
                  "C007", "C008", "C009", "C010", "C010", "C011"),
  nama = c("Ani", "Budi", "Citra", "Dodi", "Eka", "Fani",
           "Gilang", "Hana", "Indra", "Joko", "Joko", "Kiki"),
  usia = c(21, 25, 23, 150, 27, NA, 31, 29, 22, 35, 35, 28),
  pendapatan = c(4500000, NA, 5200000, 4800000, 4900000, 5100000,
                 500000000, 4700000, 4600000, 5300000, 5300000, NA),
  kota = c("Pekanbaru", " PKU", "PEKANBARU", "Dumai", "pekanbaru",
           "DUMAI", "Pekanbaru ", "Siak", "PKU", "Dumai", "Dumai", NA),
  status = c("Aktif", "aktif", "ACTIVE", "A", "Tidak Aktif", "nonaktif",
             "Aktif", "AKTIF", "A", "Tidak aktif", "Tidak aktif", "Aktif"),
  stringsAsFactors = FALSE
)

pelanggan_raw
##    customer_id   nama usia pendapatan       kota      status
## 1         C001    Ani   21    4.5e+06  Pekanbaru       Aktif
## 2         C002   Budi   25         NA        PKU       aktif
## 3         C003  Citra   23    5.2e+06  PEKANBARU      ACTIVE
## 4         C004   Dodi  150    4.8e+06      Dumai           A
## 5         C005    Eka   27    4.9e+06  pekanbaru Tidak Aktif
## 6         C006   Fani   NA    5.1e+06      DUMAI    nonaktif
## 7         C007 Gilang   31    5.0e+08 Pekanbaru        Aktif
## 8         C008   Hana   29    4.7e+06       Siak       AKTIF
## 9         C009  Indra   22    4.6e+06        PKU           A
## 10        C010   Joko   35    5.3e+06      Dumai Tidak aktif
## 11        C010   Joko   35    5.3e+06      Dumai Tidak aktif
## 12        C011   Kiki   28         NA       <NA>       Aktif

2.2 Dataset Transaksi

Dataset transaksi berisi informasi mengenai jumlah transaksi dan total pembelian yang dilakukan oleh pelanggan.

transaksi_raw <- data.frame(
  cust_id = c("C001", "C002", "C003", "C004", "C005", "C006",
              "C007", "C008", "C009", "C010", "C012"),
  jumlah_transaksi = c(5, 3, 7, 2, 6, 4, 20, 5, 3, 8, 1),
  total_purchase = c(1500000, 900000, 2700000, 600000, 2100000, 1300000,
                     25000000, 1700000, 800000, 3200000, 250000),
  stringsAsFactors = FALSE
)

transaksi_raw
##    cust_id jumlah_transaksi total_purchase
## 1     C001                5        1.5e+06
## 2     C002                3        9.0e+05
## 3     C003                7        2.7e+06
## 4     C004                2        6.0e+05
## 5     C005                6        2.1e+06
## 6     C006                4        1.3e+06
## 7     C007               20        2.5e+07
## 8     C008                5        1.7e+06
## 9     C009                3        8.0e+05
## 10    C010                8        3.2e+06
## 11    C012                1        2.5e+05

3. Pemeriksaan Data Awal

3.1 Struktur Data

Pemeriksaan struktur dilakukan untuk mengetahui jumlah variabel serta tipe data pada masing-masing variabel.

str(pelanggan_raw)
## 'data.frame':    12 obs. of  6 variables:
##  $ customer_id: chr  "C001" "C002" "C003" "C004" ...
##  $ nama       : chr  "Ani" "Budi" "Citra" "Dodi" ...
##  $ usia       : num  21 25 23 150 27 NA 31 29 22 35 ...
##  $ pendapatan : num  4.5e+06 NA 5.2e+06 4.8e+06 4.9e+06 5.1e+06 5.0e+08 4.7e+06 4.6e+06 5.3e+06 ...
##  $ kota       : chr  "Pekanbaru" " PKU" "PEKANBARU" "Dumai" ...
##  $ status     : chr  "Aktif" "aktif" "ACTIVE" "A" ...

3.2 Ringkasan Data

Ringkasan statistik digunakan untuk memperoleh gambaran awal mengenai data numerik yang tersedia.

summary(pelanggan_raw)
##  customer_id            nama                usia          pendapatan       
##  Length:12          Length:12          Min.   : 21.00   Min.   :  4500000  
##  Class :character   Class :character   1st Qu.: 24.00   1st Qu.:  4725000  
##  Mode  :character   Mode  :character   Median : 28.00   Median :  5000000  
##                                        Mean   : 38.73   Mean   : 54440000  
##                                        3rd Qu.: 33.00   3rd Qu.:  5275000  
##                                        Max.   :150.00   Max.   :500000000  
##                                        NA's   :1        NA's   :2          
##      kota              status         
##  Length:12          Length:12         
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
## 

3.3 Ukuran Dataset

Jumlah baris dan kolom pada dataset diperiksa menggunakan fungsi nrow() dan ncol().

nrow(pelanggan_raw)
## [1] 12
ncol(pelanggan_raw)
## [1] 6

4. Pemeriksaan Missing Value

Missing value merupakan kondisi ketika suatu data tidak memiliki nilai. Pemeriksaan dilakukan untuk mengetahui jumlah data kosong pada setiap variabel.

colSums(is.na(pelanggan_raw))
## customer_id        nama        usia  pendapatan        kota      status 
##           0           0           1           2           1           0

Persentase missing value juga dihitung agar dapat diketahui proporsi data yang kosong pada setiap variabel.

round(
  colMeans(is.na(pelanggan_raw)) * 100,
  2
)
## customer_id        nama        usia  pendapatan        kota      status 
##        0.00        0.00        8.33       16.67        8.33        0.00

5. Pemeriksaan Data Duplikat

Data duplikat dapat menyebabkan informasi yang sama dihitung lebih dari satu kali. Oleh karena itu, dilakukan pemeriksaan terhadap customer_id.

sum(duplicated(pelanggan_raw$customer_id))
## [1] 1

Data pelanggan yang memiliki customer_id duplikat ditampilkan sebagai berikut.

pelanggan_raw[
  duplicated(pelanggan_raw$customer_id) |
  duplicated(pelanggan_raw$customer_id, fromLast = TRUE),
]
##    customer_id nama usia pendapatan  kota      status
## 10        C010 Joko   35    5300000 Dumai Tidak aktif
## 11        C010 Joko   35    5300000 Dumai Tidak aktif

Penjelasan:

Hasil pemeriksaan menunjukkan adanya customer_id yang muncul lebih dari satu kali. Data tersebut merupakan duplikasi karena identitas pelanggan yang sama tercatat lebih dari sekali. Oleh karena itu, data duplikat perlu dihapus pada tahap preprocessing.

6. Pemeriksaan Konsistensi Data

Pemeriksaan dilakukan pada variabel kota dan status karena terdapat beberapa variasi penulisan yang memiliki arti sama.

6.1 Variabel Kota

unique(pelanggan_raw$kota)
##  [1] "Pekanbaru"  " PKU"       "PEKANBARU"  "Dumai"      "pekanbaru" 
##  [6] "DUMAI"      "Pekanbaru " "Siak"       "PKU"        NA

Penjelasan:

Hasil pemeriksaan menunjukkan adanya ketidakkonsistenan penulisan nama kota. Contohnya, Pekanbaru ditulis sebagai Pekanbaru, PKU, PEKANBARU, pekanbaru, dan Pekanbaru . Perbedaan tersebut sebenarnya memiliki arti yang sama sehingga perlu diseragamkan.

6.2 Variabel Status

unique(pelanggan_raw$status)
## [1] "Aktif"       "aktif"       "ACTIVE"      "A"           "Tidak Aktif"
## [6] "nonaktif"    "AKTIF"       "Tidak aktif"

Penjelasan:

Variabel status juga memiliki beberapa variasi penulisan, seperti Aktif, aktif, ACTIVE, A, dan AKTIF. Sementara itu, status tidak aktif ditulis sebagai Tidak Aktif, tidak aktif, dan nonaktif. Oleh karena itu, kategori status perlu distandardisasi.

7. Visualisasi Data Awal

Visualisasi digunakan untuk membantu memahami karakteristik data sebelum dilakukan preprocessing.

7.1 Jumlah Pelanggan Berdasarkan Kota

Grafik batang berikut digunakan untuk melihat jumlah pelanggan berdasarkan kota. Grafik ini juga dapat menunjukkan adanya variasi penulisan nama kota.

jumlah_kota_awal <- table(
  pelanggan_raw$kota,
  useNA = "ifany"
)

barplot(
  jumlah_kota_awal,
  main = "Jumlah Pelanggan Berdasarkan Kota",
  xlab = "Kota",
  ylab = "Jumlah Pelanggan",
  las = 2
)

Penjelasan:

Berdasarkan grafik, terlihat bahwa terdapat beberapa kategori kota yang sebenarnya merujuk pada kota yang sama. Pekanbaru muncul dalam beberapa bentuk penulisan, seperti Pekanbaru, PKU, dan PEKANBARU. Kondisi ini menunjukkan bahwa data kota belum konsisten dan perlu dilakukan standardisasi.

7.2 Distribusi Usia Pelanggan

Histogram digunakan untuk melihat distribusi usia pelanggan. Grafik ini dapat membantu mengidentifikasi nilai usia yang terlihat tidak wajar.

hist(
  pelanggan_raw$usia,
  main = "Distribusi Usia Pelanggan",
  xlab = "Usia",
  ylab = "Frekuensi"
)

Penjelasan:

Histogram menunjukkan bahwa sebagian besar pelanggan berada pada rentang usia dewasa. Namun, terdapat nilai usia sebesar 150 tahun yang terlihat sangat ekstrem dan tidak wajar. Nilai tersebut perlu dikoreksi pada tahap preprocessing. Selain itu, terdapat missing value pada variabel usia yang juga perlu ditangani.

7.3 Distribusi Pendapatan

Histogram digunakan untuk melihat distribusi pendapatan pelanggan. Keberadaan nilai pendapatan yang sangat tinggi dapat terlihat dari bentuk distribusi grafik.

hist(
  pelanggan_raw$pendapatan,
  main = "Distribusi Pendapatan Pelanggan",
  xlab = "Pendapatan",
  ylab = "Frekuensi"
)

Penjelasan:

Berdasarkan histogram, sebagian besar pendapatan pelanggan berada pada kisaran jutaan rupiah. Namun, terdapat satu nilai pendapatan yang sangat tinggi, yaitu Rp500.000.000. Nilai tersebut jauh lebih besar dibandingkan observasi lainnya sehingga mengindikasikan adanya nilai ekstrem atau outlier.

7.4 Boxplot Pendapatan

Boxplot digunakan untuk membantu mengidentifikasi adanya nilai pencilan atau outlier pada variabel pendapatan.

boxplot(
  pelanggan_raw$pendapatan,
  main = "Boxplot Pendapatan Pelanggan",
  ylab = "Pendapatan"
)

Penjelasan:

Berdasarkan boxplot, terdapat nilai pendapatan yang berada jauh di atas kelompok data utama. Nilai tersebut merupakan indikasi adanya outlier. Oleh karena itu, pendapatan perlu diperiksa lebih lanjut menggunakan metode IQR dan ditangani melalui proses winsorization.

8. Proses Preprocessing

Data mentah disalin terlebih dahulu agar data asli tetap tersimpan dan dapat dibandingkan dengan data setelah preprocessing.

pelanggan <- pelanggan_raw

9. Standardisasi Data

9.1 Menghilangkan Spasi

Spasi yang tidak diperlukan pada variabel kota dan status dihilangkan menggunakan fungsi trimws().

pelanggan$kota <- trimws(pelanggan$kota)
pelanggan$status <- trimws(pelanggan$status)

9.2 Menyeragamkan Huruf

Penulisan kota dan status diubah menjadi huruf kecil untuk memudahkan proses standardisasi.

pelanggan$kota <- tolower(pelanggan$kota)
pelanggan$status <- tolower(pelanggan$status)

10. Standardisasi Kota

Beberapa kategori kota memiliki penulisan berbeda, misalnya PKU, PEKANBARU, dan pekanbaru. Kategori tersebut diseragamkan menjadi Pekanbaru.

pelanggan$kota[
  pelanggan$kota %in% c("pku", "pekanbaru")
] <- "Pekanbaru"

pelanggan$kota[
  pelanggan$kota == "dumai"
] <- "Dumai"

pelanggan$kota[
  pelanggan$kota == "siak"
] <- "Siak"

Hasil standardisasi diperiksa kembali.

unique(pelanggan$kota)
## [1] "Pekanbaru" "Dumai"     "Siak"      NA

11. Standardisasi Status

Penulisan status pelanggan juga memiliki beberapa variasi. Kategori aktif, active, dan a diseragamkan menjadi Aktif. Sementara tidak aktif dan nonaktif diseragamkan menjadi Tidak Aktif.

pelanggan$status[
  pelanggan$status %in% c("aktif", "active", "a")
] <- "Aktif"

pelanggan$status[
  pelanggan$status %in% c("tidak aktif", "nonaktif")
] <- "Tidak Aktif"

Hasil standardisasi diperiksa kembali.

unique(pelanggan$status)
## [1] "Aktif"       "Tidak Aktif"

12. Menghapus Data Duplikat

Customer_id seharusnya bersifat unik. Oleh karena itu, data duplikat dihapus dengan mempertahankan data pertama.

pelanggan <- pelanggan[
  !duplicated(pelanggan$customer_id),
]

rownames(pelanggan) <- NULL

Jumlah data setelah proses penghapusan duplikat diperiksa.

nrow(pelanggan)
## [1] 11

13. Koreksi Nilai Usia

Pada data awal terdapat usia 150 tahun yang tidak wajar. Nilai tersebut dikoreksi menjadi 50 tahun.

pelanggan$usia[
  pelanggan$customer_id == "C004"
] <- 50

Selain itu, terdapat missing value pada usia yang akan ditangani pada tahap berikutnya.

14. Penanganan Missing Value

14.1 Missing Value Usia

Median digunakan untuk mengisi missing value pada variabel usia karena median relatif tidak terpengaruh oleh nilai ekstrem.

median_usia <- median(
  pelanggan$usia,
  na.rm = TRUE
)

pelanggan$usia_imputasi <- pelanggan$usia

pelanggan$usia_imputasi[
  is.na(pelanggan$usia_imputasi)
] <- median_usia

14.2 Missing Value Pendapatan

Median pendapatan digunakan untuk mengisi missing value pada variabel pendapatan.

median_pendapatan <- median(
  pelanggan$pendapatan,
  na.rm = TRUE
)

pelanggan$pendapatan_imputasi <-
  pelanggan$pendapatan

pelanggan$pendapatan_imputasi[
  is.na(pelanggan$pendapatan_imputasi)
] <- median_pendapatan

14.3 Missing Value Kota

Missing value pada variabel kota diberikan kategori Tidak diketahui.

pelanggan$kota_imputasi <- pelanggan$kota

pelanggan$kota_imputasi[
  is.na(pelanggan$kota_imputasi)
] <- "Tidak diketahui"

15. Deteksi Outlier Pendapatan

Outlier pada pendapatan dideteksi menggunakan metode Interquartile Range (IQR).

Q1 <- quantile(
  pelanggan$pendapatan_imputasi,
  0.25
)

Q3 <- quantile(
  pelanggan$pendapatan_imputasi,
  0.75
)

IQR_pendapatan <- Q3 - Q1

batas_bawah <- Q1 - 1.5 * IQR_pendapatan
batas_atas <- Q3 + 1.5 * IQR_pendapatan

Data yang termasuk outlier ditandai dengan variabel baru.

pelanggan$outlier_pendapatan <-
  pelanggan$pendapatan_imputasi < batas_bawah |
  pelanggan$pendapatan_imputasi > batas_atas

Data yang teridentifikasi sebagai outlier ditampilkan.

pelanggan[
  pelanggan$outlier_pendapatan == TRUE,
  c(
    "customer_id",
    "nama",
    "pendapatan_imputasi",
    "outlier_pendapatan"
  )
]
##   customer_id   nama pendapatan_imputasi outlier_pendapatan
## 7        C007 Gilang               5e+08               TRUE

16. Boxplot Setelah Preprocessing

Boxplot digunakan kembali untuk melihat kondisi pendapatan setelah missing value ditangani.

boxplot(
  pelanggan$pendapatan_imputasi,
  main = "Boxplot Pendapatan Setelah Imputasi",
  ylab = "Pendapatan"
)

17. Winsorization

Winsorization dilakukan untuk mengurangi pengaruh nilai ekstrem tanpa menghapus observasi dari dataset.

pelanggan$pendapatan_winsor <-
  pelanggan$pendapatan_imputasi

pelanggan$pendapatan_winsor[
  pelanggan$pendapatan_winsor < batas_bawah
] <- batas_bawah

pelanggan$pendapatan_winsor[
  pelanggan$pendapatan_winsor > batas_atas
] <- batas_atas

Perbandingan pendapatan sebelum dan sesudah winsorization dapat dilihat melalui boxplot berikut.

boxplot(
  pelanggan$pendapatan_winsor,
  main = "Boxplot Pendapatan Setelah Winsorization",
  ylab = "Pendapatan"
)

18. Normalisasi Min-Max

Normalisasi min-max digunakan untuk mengubah nilai numerik ke rentang 0 sampai 1.

minmax <- function(x) {
  (
    x - min(x, na.rm = TRUE)
  ) /
  (
    max(x, na.rm = TRUE) -
    min(x, na.rm = TRUE)
  )
}

Normalisasi usia dan pendapatan dilakukan sebagai berikut.

pelanggan$usia_minmax <-
  minmax(pelanggan$usia_imputasi)

pelanggan$pendapatan_minmax <-
  minmax(pelanggan$pendapatan_imputasi)

19. Standardisasi Z-Score

Z-score digunakan untuk mengubah nilai berdasarkan rata-rata dan standar deviasi.

zscore <- function(x) {
  (
    x - mean(x, na.rm = TRUE)
  ) /
  sd(x, na.rm = TRUE)
}

pelanggan$pendapatan_z <-
  zscore(pelanggan$pendapatan_imputasi)

20. Integrasi Data Pelanggan dan Transaksi

Data transaksi menggunakan nama kolom cust_id, sedangkan data pelanggan menggunakan customer_id. Nama kolom diseragamkan sebelum proses penggabungan.

transaksi <- transaksi_raw

names(transaksi)[
  names(transaksi) == "cust_id"
] <- "customer_id"

Data pelanggan kemudian digabungkan dengan data transaksi berdasarkan customer_id.

data_terintegrasi <- merge(
  pelanggan,
  transaksi,
  by = "customer_id",
  all.x = TRUE
)

data_terintegrasi
##    customer_id   nama usia pendapatan      kota      status usia_imputasi
## 1         C001    Ani   21    4.5e+06 Pekanbaru       Aktif          21.0
## 2         C002   Budi   25         NA Pekanbaru       Aktif          25.0
## 3         C003  Citra   23    5.2e+06 Pekanbaru       Aktif          23.0
## 4         C004   Dodi   50    4.8e+06     Dumai       Aktif          50.0
## 5         C005    Eka   27    4.9e+06 Pekanbaru Tidak Aktif          27.0
## 6         C006   Fani   NA    5.1e+06     Dumai Tidak Aktif          27.5
## 7         C007 Gilang   31    5.0e+08 Pekanbaru       Aktif          31.0
## 8         C008   Hana   29    4.7e+06      Siak       Aktif          29.0
## 9         C009  Indra   22    4.6e+06 Pekanbaru       Aktif          22.0
## 10        C010   Joko   35    5.3e+06     Dumai Tidak Aktif          35.0
## 11        C011   Kiki   28         NA      <NA>       Aktif          28.0
##    pendapatan_imputasi   kota_imputasi outlier_pendapatan pendapatan_winsor
## 1              4.5e+06       Pekanbaru              FALSE           4500000
## 2              4.9e+06       Pekanbaru              FALSE           4900000
## 3              5.2e+06       Pekanbaru              FALSE           5200000
## 4              4.8e+06           Dumai              FALSE           4800000
## 5              4.9e+06       Pekanbaru              FALSE           4900000
## 6              5.1e+06           Dumai              FALSE           5100000
## 7              5.0e+08       Pekanbaru               TRUE           5750000
## 8              4.7e+06            Siak              FALSE           4700000
## 9              4.6e+06       Pekanbaru              FALSE           4600000
## 10             5.3e+06           Dumai              FALSE           5300000
## 11             4.9e+06 Tidak diketahui              FALSE           4900000
##    usia_minmax pendapatan_minmax pendapatan_z jumlah_transaksi total_purchase
## 1   0.00000000      0.0000000000   -0.3041235                5        1.5e+06
## 2   0.13793103      0.0008072654   -0.3014440                3        9.0e+05
## 3   0.06896552      0.0014127144   -0.2994343                7        2.7e+06
## 4   1.00000000      0.0006054490   -0.3021138                2        6.0e+05
## 5   0.20689655      0.0008072654   -0.3014440                6        2.1e+06
## 6   0.22413793      0.0012108981   -0.3001042                4        1.3e+06
## 7   0.34482759      1.0000000000    3.0151095               20        2.5e+07
## 8   0.27586207      0.0004036327   -0.3027837                5        1.7e+06
## 9   0.03448276      0.0002018163   -0.3034536                3        8.0e+05
## 10  0.48275862      0.0016145308   -0.2987645                8        3.2e+06
## 11  0.24137931      0.0008072654   -0.3014440               NA             NA

21. Visualisasi Data Setelah Preprocessing

21.1 Jumlah Pelanggan Berdasarkan Kota

Setelah standardisasi, kategori kota menjadi lebih konsisten. Grafik berikut menunjukkan jumlah pelanggan berdasarkan kota setelah preprocessing.

jumlah_kota <- table(
  pelanggan$kota_imputasi,
  useNA = "ifany"
)

barplot(
  jumlah_kota,
  main = "Jumlah Pelanggan Berdasarkan Kota Setelah Preprocessing",
  xlab = "Kota",
  ylab = "Jumlah Pelanggan",
  las = 2
)

21.2 Jumlah Pelanggan Berdasarkan Status

Grafik berikut menunjukkan distribusi pelanggan berdasarkan status setelah dilakukan standardisasi kategori.

jumlah_status <- table(
  pelanggan$status
)

barplot(
  jumlah_status,
  main = "Jumlah Pelanggan Berdasarkan Status",
  xlab = "Status",
  ylab = "Jumlah Pelanggan"
)

21.3 Distribusi Usia Setelah Preprocessing

Histogram berikut menunjukkan distribusi usia setelah nilai yang tidak wajar dikoreksi dan missing value ditangani.

hist(
  pelanggan$usia_imputasi,
  main = "Distribusi Usia Setelah Preprocessing",
  xlab = "Usia",
  ylab = "Frekuensi"
)

21.4 Distribusi Pendapatan Setelah Preprocessing

Histogram digunakan untuk melihat distribusi pendapatan setelah missing value ditangani.

hist(
  pelanggan$pendapatan_imputasi,
  main = "Distribusi Pendapatan Setelah Preprocessing",
  xlab = "Pendapatan",
  ylab = "Frekuensi"
)

21.5 Hubungan Usia dan Pendapatan

Scatter plot digunakan untuk melihat hubungan antara usia dan pendapatan pelanggan.

plot(
  pelanggan$usia_imputasi,
  pelanggan$pendapatan_imputasi,
  main = "Hubungan Usia dan Pendapatan",
  xlab = "Usia",
  ylab = "Pendapatan",
  pch = 19
)

22. Membentuk Data Akhir

Data akhir disusun menggunakan variabel yang telah melalui proses preprocessing.

data_final <- data_terintegrasi[
  ,
  c(
    "customer_id",
    "nama",
    "usia_imputasi",
    "kota_imputasi",
    "status",
    "pendapatan_imputasi",
    "outlier_pendapatan",
    "usia_minmax",
    "pendapatan_minmax",
    "pendapatan_z",
    "jumlah_transaksi",
    "total_purchase"
  )
]

names(data_final)[
  names(data_final) == "usia_imputasi"
] <- "usia"

names(data_final)[
  names(data_final) == "kota_imputasi"
] <- "kota"

Data akhir ditampilkan.

data_final
##    customer_id   nama usia            kota      status pendapatan_imputasi
## 1         C001    Ani 21.0       Pekanbaru       Aktif             4.5e+06
## 2         C002   Budi 25.0       Pekanbaru       Aktif             4.9e+06
## 3         C003  Citra 23.0       Pekanbaru       Aktif             5.2e+06
## 4         C004   Dodi 50.0           Dumai       Aktif             4.8e+06
## 5         C005    Eka 27.0       Pekanbaru Tidak Aktif             4.9e+06
## 6         C006   Fani 27.5           Dumai Tidak Aktif             5.1e+06
## 7         C007 Gilang 31.0       Pekanbaru       Aktif             5.0e+08
## 8         C008   Hana 29.0            Siak       Aktif             4.7e+06
## 9         C009  Indra 22.0       Pekanbaru       Aktif             4.6e+06
## 10        C010   Joko 35.0           Dumai Tidak Aktif             5.3e+06
## 11        C011   Kiki 28.0 Tidak diketahui       Aktif             4.9e+06
##    outlier_pendapatan usia_minmax pendapatan_minmax pendapatan_z
## 1               FALSE  0.00000000      0.0000000000   -0.3041235
## 2               FALSE  0.13793103      0.0008072654   -0.3014440
## 3               FALSE  0.06896552      0.0014127144   -0.2994343
## 4               FALSE  1.00000000      0.0006054490   -0.3021138
## 5               FALSE  0.20689655      0.0008072654   -0.3014440
## 6               FALSE  0.22413793      0.0012108981   -0.3001042
## 7                TRUE  0.34482759      1.0000000000    3.0151095
## 8               FALSE  0.27586207      0.0004036327   -0.3027837
## 9               FALSE  0.03448276      0.0002018163   -0.3034536
## 10              FALSE  0.48275862      0.0016145308   -0.2987645
## 11              FALSE  0.24137931      0.0008072654   -0.3014440
##    jumlah_transaksi total_purchase
## 1                 5        1.5e+06
## 2                 3        9.0e+05
## 3                 7        2.7e+06
## 4                 2        6.0e+05
## 5                 6        2.1e+06
## 6                 4        1.3e+06
## 7                20        2.5e+07
## 8                 5        1.7e+06
## 9                 3        8.0e+05
## 10                8        3.2e+06
## 11               NA             NA

23. Pemeriksaan Data Akhir

Setelah seluruh proses preprocessing selesai, dilakukan pemeriksaan akhir untuk memastikan kualitas data.

23.1 Pemeriksaan Missing Value

colSums(is.na(data_final))
##         customer_id                nama                usia                kota 
##                   0                   0                   0                   0 
##              status pendapatan_imputasi  outlier_pendapatan         usia_minmax 
##                   0                   0                   0                   0 
##   pendapatan_minmax        pendapatan_z    jumlah_transaksi      total_purchase 
##                   0                   0                   1                   1

23.2 Pemeriksaan Duplikasi

sum(
  duplicated(data_final$customer_id)
)
## [1] 0

23.3 Struktur Data Akhir

str(data_final)
## 'data.frame':    11 obs. of  12 variables:
##  $ customer_id        : chr  "C001" "C002" "C003" "C004" ...
##  $ nama               : chr  "Ani" "Budi" "Citra" "Dodi" ...
##  $ usia               : num  21 25 23 50 27 27.5 31 29 22 35 ...
##  $ kota               : chr  "Pekanbaru" "Pekanbaru" "Pekanbaru" "Dumai" ...
##  $ status             : chr  "Aktif" "Aktif" "Aktif" "Aktif" ...
##  $ pendapatan_imputasi: num  4.5e+06 4.9e+06 5.2e+06 4.8e+06 4.9e+06 5.1e+06 5.0e+08 4.7e+06 4.6e+06 5.3e+06 ...
##  $ outlier_pendapatan : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
##  $ usia_minmax        : num  0 0.138 0.069 1 0.207 ...
##  $ pendapatan_minmax  : num  0 0.000807 0.001413 0.000605 0.000807 ...
##  $ pendapatan_z       : num  -0.304 -0.301 -0.299 -0.302 -0.301 ...
##  $ jumlah_transaksi   : num  5 3 7 2 6 4 20 5 3 8 ...
##  $ total_purchase     : num  1.5e+06 9.0e+05 2.7e+06 6.0e+05 2.1e+06 1.3e+06 2.5e+07 1.7e+06 8.0e+05 3.2e+06 ...

23.4 Ringkasan Data Akhir

summary(data_final)
##  customer_id            nama                usia           kota          
##  Length:11          Length:11          Min.   :21.00   Length:11         
##  Class :character   Class :character   1st Qu.:24.00   Class :character  
##  Mode  :character   Mode  :character   Median :27.50   Mode  :character  
##                                        Mean   :28.95                     
##                                        3rd Qu.:30.00                     
##                                        Max.   :50.00                     
##                                                                          
##     status          pendapatan_imputasi outlier_pendapatan  usia_minmax    
##  Length:11          Min.   :4.50e+06    Mode :logical      Min.   :0.0000  
##  Class :character   1st Qu.:4.75e+06    FALSE:10           1st Qu.:0.1034  
##  Mode  :character   Median :4.90e+06    TRUE :1            Median :0.2241  
##                     Mean   :4.99e+07                       Mean   :0.2743  
##                     3rd Qu.:5.15e+06                       3rd Qu.:0.3103  
##                     Max.   :5.00e+08                       Max.   :1.0000  
##                                                                            
##  pendapatan_minmax    pendapatan_z     jumlah_transaksi total_purchase    
##  Min.   :0.0000000   Min.   :-0.3041   Min.   : 2.00    Min.   :  600000  
##  1st Qu.:0.0005045   1st Qu.:-0.3024   1st Qu.: 3.25    1st Qu.: 1000000  
##  Median :0.0008073   Median :-0.3014   Median : 5.00    Median : 1600000  
##  Mean   :0.0916246   Mean   : 0.0000   Mean   : 6.30    Mean   : 3980000  
##  3rd Qu.:0.0013118   3rd Qu.:-0.2998   3rd Qu.: 6.75    3rd Qu.: 2550000  
##  Max.   :1.0000000   Max.   : 3.0151   Max.   :20.00    Max.   :25000000  
##                                        NA's   :1        NA's   :1

24. Kesimpulan

Berdasarkan proses analisis dan preprocessing yang telah dilakukan, data pelanggan memiliki beberapa permasalahan pada kondisi awal, yaitu missing value, data duplikat, ketidakkonsistenan penulisan kategori, nilai usia yang tidak wajar, serta nilai pendapatan yang terindikasi sebagai outlier.

Permasalahan tersebut ditangani melalui beberapa tahapan, yaitu standardisasi data, penghapusan duplikasi, koreksi nilai yang tidak wajar, imputasi missing value, deteksi outlier, winsorization, normalisasi, standardisasi, serta integrasi dengan data transaksi.

Visualisasi juga digunakan untuk membantu melihat kondisi data sebelum dan sesudah preprocessing. Dengan demikian, data akhir menjadi lebih terstruktur dan dapat digunakan untuk tahap analisis selanjutnya.