Capaian Praktikum

Setelah menyelesaikan praktikum ini, mahasiswa diharapkan mampu:

  1. memahami kondisi data sebelum dilakukan preprocessing;
  2. mengidentifikasi masalah kualitas data;
  3. melakukan pemeriksaan struktur dan karakteristik data;
  4. menangani nilai yang hilang (missing values);
  5. menangani data duplikat;
  6. mengidentifikasi dan menangani outlier;
  7. melakukan transformasi data;
  8. menggabungkan beberapa sumber data; dan
  9. menghasilkan dataset akhir yang siap digunakan untuk analisis.

Skenario Praktikum

Pada praktikum ini digunakan data pelanggan dan data transaksi dari sebuah perusahaan e-commerce fiktif.

Data pelanggan terdiri atas beberapa informasi seperti:

Sementara 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.

Persiapan RStudio

Membuat Project

Project digunakan agar seluruh file yang digunakan dalam praktikum tersimpan dalam satu folder.

Project yang digunakan pada praktikum ini adalah:

project_preprocessing_nadi nabilla

Memeriksa Lingkungan Kerja

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

Membangun Dataset

Data Pelanggan

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

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

Memahami Kondisi Data

Melihat Struktur Data

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" ...

Melihat Ringkasan Data

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

Melihat Ukuran Data

Jumlah baris dan kolom diperiksa menggunakan fungsi berikut.

dim(pelanggan_raw)
## [1] 12  6

Memeriksa Missing Values

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

Menangani Data Duplikat

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

Menangani Ketidakkonsistenan Data Kategorik

Variabel Kota

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

Variabel Status

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

Menangani Outlier

Outlier pada Variabel Usia

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.

Outlier pada Pendapatan

Variabel pendapatan juga diperiksa menggunakan boxplot.

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

Nilai ekstrem kemudian dievaluasi sebelum dilakukan penanganan.

Transformasi Data

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
)

Menggabungkan Data Pelanggan dan Transaksi

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

Evaluasi Dataset Akhir

Melihat Struktur Dataset Akhir

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

Memeriksa Missing Values

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

Melihat Ringkasan Dataset

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

Melihat Dimensi Dataset

dim(data_final)
## [1] 12  8

Membandingkan Kondisi Sebelum dan Sesudah

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

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

Kesimpulan

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.

Daftar Pustaka

Han, J., Kamber, M., & Pei, J. (2012). Data Mining: Concepts and Techniques. Morgan Kaufmann.