Setelah menyelesaikan praktikum ini, mahasiswa diharapkan mampu:
Pada praktikum ini digunakan data pelanggan dan data transaksi dari sebuah perusahaan e-commerce fiktif.
Data pelanggan terdiri atas beberapa informasi seperti:
customer_idnamausiapendapatankotastatusSementara itu, data transaksi berisi informasi transaksi yang dilakukan oleh setiap pelanggan.
Data sengaja dibuat memiliki beberapa permasalahan seperti:
Oleh karena itu, diperlukan proses preprocessing sebelum data digunakan untuk analisis lebih lanjut.
Project digunakan agar seluruh file yang digunakan dalam praktikum tersimpan dalam satu folder.
Project yang digunakan pada praktikum ini adalah:
project_preprocessing_nadi nabilla
Direktori kerja diperiksa menggunakan fungsi
getwd().
getwd()
## [1] "C:/Users/Lenovo/Documents/project_prepocessing_nadi nabilla"
Versi R yang digunakan juga diperiksa menggunakan:
R.version.string
## [1] "R version 4.5.1 (2025-06-13 ucrt)"
Data pelanggan dibuat menggunakan fungsi
data.frame().
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
Data transaksi kemudian dibuat sebagai dataset kedua.
transaksi_raw <- data.frame(
customer_id = c(
"C001", "C002", "C003", "C004", "C005", "C006",
"C007", "C008", "C009", "C010", "C011"
),
jumlah_transaksi = c(
5, 3, 8, 2, 6, 4, 10, 3, 7, 9, 5
),
total_pembelian = c(
1500000, 900000, 3200000, 750000,
2100000, 1800000, 4500000, 1200000,
2800000, 3500000, 1900000
)
)
transaksi_raw
## customer_id jumlah_transaksi total_pembelian
## 1 C001 5 1500000
## 2 C002 3 900000
## 3 C003 8 3200000
## 4 C004 2 750000
## 5 C005 6 2100000
## 6 C006 4 1800000
## 7 C007 10 4500000
## 8 C008 3 1200000
## 9 C009 7 2800000
## 10 C010 9 3500000
## 11 C011 5 1900000
Struktur dataset diperiksa untuk mengetahui tipe setiap 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 melihat karakteristik awal variabel numerik maupun kategorik.
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 diperiksa menggunakan fungsi berikut.
dim(pelanggan_raw)
## [1] 12 6
Nilai yang hilang diperiksa pada setiap variabel.
colSums(is.na(pelanggan_raw))
## customer_id nama usia pendapatan kota status
## 0 0 1 2 1 0
Jumlah keseluruhan nilai yang hilang:
sum(is.na(pelanggan_raw))
## [1] 4
Data duplikat diperiksa menggunakan fungsi
duplicated().
duplicated(pelanggan_raw)
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
Jumlah baris yang terduplikasi:
sum(duplicated(pelanggan_raw))
## [1] 1
Data duplikat kemudian dapat diperiksa lebih lanjut.
pelanggan_raw[duplicated(pelanggan_raw), ]
## customer_id nama usia pendapatan kota status
## 11 C010 Joko 35 5300000 Dumai Tidak aktif
Nilai pada variabel kota diperiksa terlebih dahulu.
unique(pelanggan_raw$kota)
## [1] "Pekanbaru" "PKU" "PEKANBARU" "Dumai" "pekanbaru" "DUMAI"
## [7] "Siak" NA
Frekuensi setiap kategori:
table(pelanggan_raw$kota, useNA = "ifany")
##
## Dumai DUMAI pekanbaru Pekanbaru PEKANBARU PKU Siak <NA>
## 3 1 1 2 1 2 1 1
Kategori kemudian dapat diseragamkan.
pelanggan_raw$kota <- trimws(tolower(pelanggan_raw$kota))
pelanggan_raw$kota[pelanggan_raw$kota %in% c("pku", "pekanbaru")] <- "Pekanbaru"
pelanggan_raw$kota[pelanggan_raw$kota == "dumai"] <- "Dumai"
pelanggan_raw$kota[pelanggan_raw$kota == "siak"] <- "Siak"
Pemeriksaan kembali:
unique(pelanggan_raw$kota)
## [1] "Pekanbaru" "Dumai" "Siak" NA
Nilai pada variabel status diperiksa.
unique(pelanggan_raw$status)
## [1] "Aktif" "aktif" "ACTIVE" "A" "Tidak Aktif"
## [6] "nonaktif" "AKTIF" "Tidak aktif"
Kategori kemudian diseragamkan.
pelanggan_raw$status <- trimws(tolower(pelanggan_raw$status))
pelanggan_raw$status[
pelanggan_raw$status %in% c("aktif", "active", "a")
] <- "Aktif"
pelanggan_raw$status[
pelanggan_raw$status %in% c("tidak aktif", "nonaktif")
] <- "Tidak Aktif"
Pemeriksaan kembali:
table(pelanggan_raw$status, useNA = "ifany")
##
## Aktif Tidak Aktif
## 8 4
Variabel usia diperiksa menggunakan boxplot.
boxplot(
pelanggan_raw$usia,
main = "Boxplot Usia",
ylab = "Usia"
)
Dari pemeriksaan tersebut dapat diketahui apakah terdapat nilai usia yang tidak wajar.
Variabel pendapatan juga diperiksa menggunakan boxplot.
boxplot(
pelanggan_raw$pendapatan,
main = "Boxplot Pendapatan",
ylab = "Pendapatan"
)
Nilai ekstrem kemudian dievaluasi sebelum dilakukan penanganan.
Transformasi dilakukan untuk memastikan data memiliki format yang sesuai untuk analisis.
Contohnya adalah memastikan variabel numerik memiliki tipe data numerik.
pelanggan_raw$usia <- as.numeric(pelanggan_raw$usia)
pelanggan_raw$pendapatan <- as.numeric(
pelanggan_raw$pendapatan
)
Data pelanggan dan data transaksi digabungkan berdasarkan
customer_id.
data_final <- merge(
pelanggan_raw,
transaksi_raw,
by = "customer_id",
all.x = TRUE
)
Hasil penggabungan:
data_final
## customer_id nama usia pendapatan kota status jumlah_transaksi
## 1 C001 Ani 21 4.5e+06 Pekanbaru Aktif 5
## 2 C002 Budi 25 NA Pekanbaru Aktif 3
## 3 C003 Citra 23 5.2e+06 Pekanbaru Aktif 8
## 4 C004 Dodi 150 4.8e+06 Dumai Aktif 2
## 5 C005 Eka 27 4.9e+06 Pekanbaru Tidak Aktif 6
## 6 C006 Fani NA 5.1e+06 Dumai Tidak Aktif 4
## 7 C007 Gilang 31 5.0e+08 Pekanbaru Aktif 10
## 8 C008 Hana 29 4.7e+06 Siak Aktif 3
## 9 C009 Indra 22 4.6e+06 Pekanbaru Aktif 7
## 10 C010 Joko 35 5.3e+06 Dumai Tidak Aktif 9
## 11 C010 Joko 35 5.3e+06 Dumai Tidak Aktif 9
## 12 C011 Kiki 28 NA <NA> Aktif 5
## total_pembelian
## 1 1500000
## 2 900000
## 3 3200000
## 4 750000
## 5 2100000
## 6 1800000
## 7 4500000
## 8 1200000
## 9 2800000
## 10 3500000
## 11 3500000
## 12 1900000
str(data_final)
## 'data.frame': 12 obs. of 8 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" "Pekanbaru" "Pekanbaru" "Dumai" ...
## $ status : chr "Aktif" "Aktif" "Aktif" "Aktif" ...
## $ jumlah_transaksi: num 5 3 8 2 6 4 10 3 7 9 ...
## $ total_pembelian : num 1500000 900000 3200000 750000 2100000 1800000 4500000 1200000 2800000 3500000 ...
colSums(is.na(data_final))
## customer_id nama usia pendapatan
## 0 0 1 2
## kota status jumlah_transaksi total_pembelian
## 1 0 0 0
summary(data_final)
## 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 jumlah_transaksi total_pembelian
## Length:12 Length:12 Min. : 2.000 Min. : 750000
## Class :character Class :character 1st Qu.: 3.750 1st Qu.:1425000
## Mode :character Mode :character Median : 5.500 Median :2000000
## Mean : 5.917 Mean :2304167
## 3rd Qu.: 8.250 3rd Qu.:3275000
## Max. :10.000 Max. :4500000
##
dim(data_final)
## [1] 12 8
Jumlah baris dan kolom sebelum preprocessing:
dim(pelanggan_raw)
## [1] 12 6
Jumlah baris dan kolom dataset akhir:
dim(data_final)
## [1] 12 8
Perbandingan ini digunakan untuk memastikan bahwa proses preprocessing dan penggabungan data berjalan sesuai dengan tujuan.
Dataset akhir yang telah melalui proses preprocessing dapat dilihat menggunakan:
head(data_final)
## customer_id nama usia pendapatan kota status jumlah_transaksi
## 1 C001 Ani 21 4500000 Pekanbaru Aktif 5
## 2 C002 Budi 25 NA Pekanbaru Aktif 3
## 3 C003 Citra 23 5200000 Pekanbaru Aktif 8
## 4 C004 Dodi 150 4800000 Dumai Aktif 2
## 5 C005 Eka 27 4900000 Pekanbaru Tidak Aktif 6
## 6 C006 Fani NA 5100000 Dumai Tidak Aktif 4
## total_pembelian
## 1 1500000
## 2 900000
## 3 3200000
## 4 750000
## 5 2100000
## 6 1800000
Dari awal kita sudah menjalankan beberapa alur diantaranya: 1. Memahami struktur dan kualitas awal data. 2. Membersihkan kategori, duplikasi dan pelanggaran domain. 3. Menangani missing menyembunyikan ketidakpastian. 4. Mendeteksi dan mengevaluasi outlier. 5. Mentransformasikan atribut. 6. Mengintegrasikan data serta memvalidasi hasilnya.
Dari sini dapat kita ketahui bahwa preprocessing merupakan proses pengambilan keputusan. Kode R hanya menunjukkan keputusan tersebut, kualitas hasil tetap bergantung pada pemahaman data, tujuan analisis dan dokumentasi perubahan.
Han, J., Kamber, M., & Pei, J. (2012). Data Mining: Concepts and Techniques. Morgan Kaufmann.