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.
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)"
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
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
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" ...
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
##
##
##
##
Jumlah baris dan kolom pada dataset diperiksa menggunakan fungsi
nrow() dan ncol().
nrow(pelanggan_raw)
## [1] 12
ncol(pelanggan_raw)
## [1] 6
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
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.
Pemeriksaan dilakukan pada variabel kota dan status karena terdapat beberapa variasi penulisan yang memiliki arti sama.
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.
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.
Visualisasi digunakan untuk membantu memahami karakteristik data sebelum dilakukan preprocessing.
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.
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.
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.
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.
Data mentah disalin terlebih dahulu agar data asli tetap tersimpan dan dapat dibandingkan dengan data setelah preprocessing.
pelanggan <- pelanggan_raw
Spasi yang tidak diperlukan pada variabel kota dan status dihilangkan
menggunakan fungsi trimws().
pelanggan$kota <- trimws(pelanggan$kota)
pelanggan$status <- trimws(pelanggan$status)
Penulisan kota dan status diubah menjadi huruf kecil untuk memudahkan proses standardisasi.
pelanggan$kota <- tolower(pelanggan$kota)
pelanggan$status <- tolower(pelanggan$status)
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
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"
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
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.
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
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
Missing value pada variabel kota diberikan kategori
Tidak diketahui.
pelanggan$kota_imputasi <- pelanggan$kota
pelanggan$kota_imputasi[
is.na(pelanggan$kota_imputasi)
] <- "Tidak diketahui"
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
Boxplot digunakan kembali untuk melihat kondisi pendapatan setelah missing value ditangani.
boxplot(
pelanggan$pendapatan_imputasi,
main = "Boxplot Pendapatan Setelah Imputasi",
ylab = "Pendapatan"
)
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"
)
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)
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)
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
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
)
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"
)
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"
)
Histogram digunakan untuk melihat distribusi pendapatan setelah missing value ditangani.
hist(
pelanggan$pendapatan_imputasi,
main = "Distribusi Pendapatan Setelah Preprocessing",
xlab = "Pendapatan",
ylab = "Frekuensi"
)
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
)
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
Setelah seluruh proses preprocessing selesai, dilakukan pemeriksaan akhir untuk memastikan kualitas data.
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
sum(
duplicated(data_final$customer_id)
)
## [1] 0
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 ...
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
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.