{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE)
Pada praktikum ini dilakukan proses analisis dan preprocessing data pelanggan menggunakan RStudio. Preprocessing dilakukan untuk mengidentifikasi dan memperbaiki berbagai permasalahan yang terdapat pada data sebelum digunakan untuk analisis lebih lanjut.
Tahapan preprocessing yang dilakukan meliputi pemeriksaan data, penanganan missing value, standardisasi data, pemeriksaan duplikasi, koreksi data, deteksi outlier, transformasi data, serta integrasi data pelanggan dengan data transaksi.
Sebelum melakukan proses preprocessing, dilakukan pemeriksaan terhadap lingkungan kerja RStudio.
{r} getwd()
Versi R yang digunakan dalam proses analisis dapat diperiksa menggunakan kode berikut.
{r} R.version.string
Data pelanggan yang digunakan dalam praktikum terdiri dari beberapa variabel, yaitu customer_id, nama, usia, pendapatan, kota, dan status.
{r} 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
Data transaksi terdiri dari customer_id, jumlah transaksi, dan total pembelian.
{r} 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
Pemeriksaan awal dilakukan untuk mengetahui struktur dan kondisi data sebelum dilakukan preprocessing.
{r} str(pelanggan_raw)
{r} summary(pelanggan_raw)
{r} dim(pelanggan_raw)
Hasil pemeriksaan dimensi menunjukkan jumlah baris dan kolom yang terdapat dalam dataset pelanggan.
{r} nrow(pelanggan_raw)
{r} ncol(pelanggan_raw)
Missing value merupakan kondisi ketika suatu variabel tidak memiliki nilai. Pemeriksaan dilakukan untuk mengetahui jumlah missing value pada setiap variabel.
{r} colSums(is.na(pelanggan_raw))
Persentase missing value pada masing-masing variabel dihitung menggunakan kode berikut.
{r} round( colMeans(is.na(pelanggan_raw)) * 100, 2 )
Pemeriksaan duplikasi dilakukan untuk mengetahui apakah terdapat data yang memiliki nilai yang sama.
{r} sum(duplicated(pelanggan_raw))
Pemeriksaan juga dilakukan berdasarkan customer_id karena setiap pelanggan seharusnya memiliki identitas yang unik.
{r} sum(duplicated(pelanggan_raw$customer_id))
Data yang memiliki customer_id duplikat ditampilkan sebagai berikut.
{r} pelanggan_raw[ duplicated(pelanggan_raw\(customer_id) | duplicated(pelanggan_raw\)customer_id, fromLast = TRUE),]
Pemeriksaan kategori dilakukan untuk melihat variasi penulisan pada variabel kota dan status.
{r} unique(pelanggan_raw$kota)
{r} unique(pelanggan_raw$status)
Berdasarkan pemeriksaan awal, terdapat beberapa variasi penulisan yang sebenarnya merujuk pada kategori yang sama.
Nilai minimum dan maksimum usia diperiksa untuk mengetahui apakah terdapat nilai yang tidak wajar.
{r} range( pelanggan_raw$usia, na.rm = TRUE )
Data dengan usia lebih dari 100 tahun ditampilkan.
{r} pelanggan_raw[ pelanggan_raw$usia > 100,]
Rentang pendapatan diperiksa untuk mengetahui nilai ekstrem.
{r} range( pelanggan_raw$pendapatan, na.rm = TRUE )
Data mentah tidak langsung diubah agar kondisi awal tetap tersimpan. Data kemudian disalin ke objek baru untuk proses preprocessing.
{r} pelanggan <- pelanggan_raw
Spasi yang tidak diperlukan pada variabel kota dan status dihapus.
{r} pelanggan\(kota <- trimws( pelanggan\)kota )
pelanggan\(status <- trimws( pelanggan\)status )
Penulisan kota dan status diseragamkan menjadi huruf kecil.
{r} pelanggan\(kota <- tolower( pelanggan\)kota )
pelanggan\(status <- tolower( pelanggan\)status )
Variasi penulisan kota yang memiliki arti sama diseragamkan.
{r} pelanggan\(kota[ pelanggan\)kota %in% c( “pku”, “pekanbaru” ) ] <- “Pekanbaru”
pelanggan\(kota[ pelanggan\)kota == “dumai” ] <- “Dumai”
pelanggan\(kota[ pelanggan\)kota == “siak” ] <- “Siak”
Hasil standardisasi kota dapat diperiksa menggunakan:
{r} unique(pelanggan$kota)
Kategori status juga diseragamkan.
{r} pelanggan\(status[ pelanggan\)status %in% c( “aktif”, “active”, “a” ) ] <- “Aktif”
pelanggan\(status[ pelanggan\)status %in% c( “tidak aktif”, “nonaktif” ) ] <- “Tidak Aktif”
Hasil standardisasi status diperiksa kembali.
{r} unique(pelanggan$status)
Data dengan customer_id yang sama diperiksa dan duplikasi dihapus dengan mempertahankan data pertama.
{r} pelanggan <- pelanggan[ !duplicated(pelanggan$customer_id),]
rownames(pelanggan) <- NULL
Jumlah data setelah proses deduplikasi diperiksa.
{r} nrow(pelanggan)
Pemeriksaan duplikasi kembali dilakukan.
{r} sum(duplicated(pelanggan$customer_id))
Berdasarkan pemeriksaan sebelumnya, terdapat nilai usia 150 tahun yang tidak wajar. Nilai tersebut dikoreksi menjadi 50 tahun.
{r} pelanggan\(usia[ pelanggan\)customer_id == “C004” ] <- 50
Pemeriksaan kembali nilai usia.
{r} pelanggan[ , c(“customer_id”, “nama”, “usia”)]
Median digunakan sebagai dasar imputasi missing value pada variabel usia.
{r} median_usia <- median( pelanggan$usia, na.rm = TRUE )
median_usia
Kolom usia hasil imputasi dibuat.
{r} pelanggan\(usia_imputasi <- pelanggan\)usia
Missing value pada usia diganti menggunakan median.
{r} pelanggan\(usia_imputasi[ is.na(pelanggan\)usia_imputasi) ] <- median_usia
Median pendapatan dihitung terlebih dahulu.
{r} median_pendapatan <- median( pelanggan$pendapatan, na.rm = TRUE )
median_pendapatan
Kolom pendapatan hasil imputasi dibuat.
{r} pelanggan\(pendapatan_imputasi <- pelanggan\)pendapatan
Missing value pada pendapatan diganti dengan median.
{r} pelanggan\(pendapatan_imputasi[ is.na(pelanggan\)pendapatan_imputasi) ] <- median_pendapatan
Missing value pada kota diberi kategori “Tidak diketahui”.
{r} pelanggan\(kota_imputasi <- pelanggan\)kota
pelanggan\(kota_imputasi[ is.na(pelanggan\)kota_imputasi) ] <- “Tidak diketahui”
Deteksi outlier dilakukan pada variabel pendapatan menggunakan metode Interquartile Range atau IQR.
{r} Q1 <- quantile( pelanggan$pendapatan_imputasi, 0.25 )
Q1
{r} Q3 <- quantile( pelanggan$pendapatan_imputasi, 0.75 )
Q3
{r} IQR_pendapatan <- Q3 - Q1
IQR_pendapatan
{r} batas_bawah <- Q1 - 1.5 * IQR_pendapatan batas_atas <- Q3 + 1.5 * IQR_pendapatan
batas_bawah batas_atas
{r} pelanggan\(outlier_pendapatan <- pelanggan\)pendapatan_imputasi < batas_bawah | pelanggan$pendapatan_imputasi > batas_atas
Data yang teridentifikasi sebagai outlier ditampilkan.
{r} pelanggan[ pelanggan$outlier_pendapatan == TRUE, c( “customer_id”, “nama”, “pendapatan_imputasi”, “outlier_pendapatan” )]
Winsorization digunakan untuk mengurangi pengaruh nilai ekstrem tanpa menghapus observasi.
{r} pelanggan\(pendapatan_winsor <- pelanggan\)pendapatan_imputasi
Nilai di bawah batas bawah diganti dengan batas bawah.
{r} pelanggan\(pendapatan_winsor[ pelanggan\)pendapatan_winsor < batas_bawah ] <- batas_bawah
Nilai di atas batas atas diganti dengan batas atas.
{r} pelanggan\(pendapatan_winsor[ pelanggan\)pendapatan_winsor > batas_atas ] <- batas_atas
Perbandingan pendapatan sebelum dan sesudah winsorization.
{r} pelanggan[ , c( “customer_id”, “pendapatan_imputasi”, “pendapatan_winsor” )]
Normalisasi min-max digunakan untuk mengubah nilai numerik ke dalam rentang 0 sampai 1.
{r} minmax <- function(x) { ( x - min(x, na.rm = TRUE) ) / ( max(x, na.rm = TRUE) - min(x, na.rm = TRUE) ) }
Normalisasi usia.
{r} pelanggan\(usia_minmax <- minmax(pelanggan\)usia_imputasi)
Normalisasi pendapatan.
{r} pelanggan\(pendapatan_minmax <- minmax(pelanggan\)pendapatan_imputasi)
Hasil normalisasi ditampilkan.
{r} pelanggan[ , c( “customer_id”, “usia_minmax”, “pendapatan_minmax” )]
Standardisasi z-score dilakukan untuk mengubah data berdasarkan rata-rata dan standar deviasi.
{r} zscore <- function(x) { ( x - mean(x, na.rm = TRUE) ) / sd(x, na.rm = TRUE) }
Z-score pendapatan dihitung.
{r} pelanggan\(pendapatan_z <- zscore(pelanggan\)pendapatan_imputasi)
Hasil z-score ditampilkan.
{r} pelanggan[ , c( “customer_id”, “pendapatan_z” )]
Decimal scaling dilakukan dengan membagi nilai menggunakan pangkat sepuluh tertentu.
{r} decimal_scale <- function(x) { j <- ceiling( log10( max(abs(x), na.rm = TRUE) + 1 ) )
x / (10^j) }
Transformasi decimal scaling diterapkan pada pendapatan.
{r} pelanggan\(pendapatan_decimal <- decimal_scale( pelanggan\)pendapatan_imputasi )
Hasil decimal scaling.
{r} pelanggan[ , c( “customer_id”, “pendapatan_decimal” )]
Data transaksi memiliki nama kolom cust_id, sedangkan data pelanggan menggunakan customer_id. Oleh karena itu nama kolom diseragamkan sebelum dilakukan integrasi.
{r} transaksi <- transaksi_raw
names(transaksi)[ names(transaksi) == “cust_id”] <- “customer_id”
Data pelanggan dan transaksi kemudian digabungkan berdasarkan customer_id.
{r} data_terintegrasi <- merge( pelanggan, transaksi, by = “customer_id”, all.x = TRUE )
Hasil integrasi ditampilkan.
{r} data_terintegrasi
Jumlah baris hasil integrasi diperiksa.
{r} nrow(data_terintegrasi)
Missing value pada variabel transaksi diperiksa.
{r} colSums( is.na( data_terintegrasi[ , c( “jumlah_transaksi”, “total_purchase” ) ] ) )
Pelanggan yang tidak memiliki data transaksi ditampilkan.
{r} data_terintegrasi[ is.na(data_terintegrasi$jumlah_transaksi), c( “customer_id”, “nama” )]
Data akhir disusun menggunakan variabel yang telah melalui proses preprocessing.
{r} data_final <- data_terintegrasi[ , c( “customer_id”, “nama”, “usia_imputasi”, “kota_imputasi”, “status”, “pendapatan_imputasi”, “outlier_pendapatan”, “usia_minmax”, “pendapatan_minmax”, “pendapatan_z”, “pendapatan_decimal”, “jumlah_transaksi”, “total_purchase” )]
Nama variabel dirapikan.
{r} names(data_final)[ names(data_final) == “usia_imputasi”] <- “usia”
names(data_final)[ names(data_final) == “kota_imputasi”] <- “kota”
Data akhir ditampilkan.
{r} data_final
Pemeriksaan missing value dilakukan kembali setelah preprocessing.
{r} colSums(is.na(data_final))
Pemeriksaan duplikasi customer_id.
{r} sum( duplicated(data_final$customer_id) )
Struktur data akhir.
{r} str(data_final)
Ringkasan data akhir.
{r} summary(data_final)
Berdasarkan proses preprocessing yang telah dilakukan, data pelanggan telah melalui beberapa tahapan, yaitu pemeriksaan data awal, pemeriksaan missing value, pemeriksaan duplikasi, standardisasi data, koreksi nilai tidak wajar, imputasi missing value, deteksi outlier, winsorization, normalisasi min-max, standardisasi z-score, decimal scaling, serta integrasi dengan data transaksi.
Data yang telah melalui preprocessing selanjutnya dapat digunakan untuk tahap analisis atau pemodelan lebih lanjut.