{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE)

Analisis dan Preprocessing Data Pelanggan

Pendahuluan

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.

1. Persiapan Data

1.1 Pemeriksaan Lingkungan Kerja

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

2. Membuat Dataset

2.1 Data Pelanggan

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

2.2 Data Transaksi

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

3. Pemeriksaan Data Awal

Pemeriksaan awal dilakukan untuk mengetahui struktur dan kondisi data sebelum dilakukan preprocessing.

3.1 Struktur Data Pelanggan

{r} str(pelanggan_raw)

3.2 Ringkasan Data Pelanggan

{r} summary(pelanggan_raw)

3.3 Dimensi Data

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

4. Pemeriksaan Missing Value

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 )

5. Pemeriksaan Data Duplikat

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),]

6. Pemeriksaan Konsistensi Data Kategorik

Pemeriksaan kategori dilakukan untuk melihat variasi penulisan pada variabel kota dan status.

6.1 Variabel Kota

{r} unique(pelanggan_raw$kota)

6.2 Variabel Status

{r} unique(pelanggan_raw$status)

Berdasarkan pemeriksaan awal, terdapat beberapa variasi penulisan yang sebenarnya merujuk pada kategori yang sama.

7. Pemeriksaan Nilai Tidak Wajar

7.1 Variabel Usia

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,]

7.2 Variabel Pendapatan

Rentang pendapatan diperiksa untuk mengetahui nilai ekstrem.

{r} range( pelanggan_raw$pendapatan, na.rm = TRUE )

8. Menyalin Data untuk Preprocessing

Data mentah tidak langsung diubah agar kondisi awal tetap tersimpan. Data kemudian disalin ke objek baru untuk proses preprocessing.

{r} pelanggan <- pelanggan_raw

9. Standardisasi Data

9.1 Menghilangkan Spasi

Spasi yang tidak diperlukan pada variabel kota dan status dihapus.

{r} pelanggan\(kota <- trimws( pelanggan\)kota )

pelanggan\(status <- trimws( pelanggan\)status )

9.2 Menyeragamkan Huruf

Penulisan kota dan status diseragamkan menjadi huruf kecil.

{r} pelanggan\(kota <- tolower( pelanggan\)kota )

pelanggan\(status <- tolower( pelanggan\)status )

10. Standardisasi Kota

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)

11. Standardisasi Status

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)

12. Menghapus Data Duplikat

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

13. Koreksi Nilai Usia

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”)]

14. Penanganan Missing Value

14.1 Missing Value pada 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

14.2 Missing Value pada Pendapatan

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

14.3 Missing Value pada Kota

Missing value pada kota diberi kategori “Tidak diketahui”.

{r} pelanggan\(kota_imputasi <- pelanggan\)kota

pelanggan\(kota_imputasi[ is.na(pelanggan\)kota_imputasi) ] <- “Tidak diketahui”

15. Deteksi Outlier

Deteksi outlier dilakukan pada variabel pendapatan menggunakan metode Interquartile Range atau IQR.

15.1 Kuartil Pertama

{r} Q1 <- quantile( pelanggan$pendapatan_imputasi, 0.25 )

Q1

15.2 Kuartil Ketiga

{r} Q3 <- quantile( pelanggan$pendapatan_imputasi, 0.75 )

Q3

15.3 Menghitung IQR

{r} IQR_pendapatan <- Q3 - Q1

IQR_pendapatan

15.4 Menentukan Batas Outlier

{r} batas_bawah <- Q1 - 1.5 * IQR_pendapatan batas_atas <- Q3 + 1.5 * IQR_pendapatan

batas_bawah batas_atas

15.5 Mengidentifikasi Outlier

{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” )]

16. Winsorization

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” )]

17. Normalisasi Min-Max

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” )]

18. Standardisasi Z-Score

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” )]

19. Decimal Scaling

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” )]

20. Integrasi Data Pelanggan dan Transaksi

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

21. Pemeriksaan Hasil Integrasi

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” )]

22. Membentuk Data Akhir

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

23. Pemeriksaan Data Akhir

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)

24. Kesimpulan

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.