Identitas Praktikum

Komponen Keterangan
Nama Nadi Nabilla
Mata Kuliah Data Mining
Topik Data Preprocessing
Perangkat Lunak R dan RStudio
Project project_preprocessing_nadi nabilla

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

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

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

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

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)

Dataset tersebut selanjutnya dapat digunakan untuk proses analisis atau pemodelan.

Kesimpulan

Berdasarkan praktikum yang telah dilakukan, proses preprocessing merupakan tahap penting sebelum data digunakan untuk analisis.

Pada praktikum ini dilakukan pemeriksaan struktur data, identifikasi nilai yang hilang, pemeriksaan duplikasi, penyeragaman data kategorik, pemeriksaan outlier, transformasi data, serta penggabungan data pelanggan dan transaksi.

Setelah proses preprocessing selesai, diperoleh dataset yang lebih terstruktur dan siap digunakan untuk tahap analisis selanjutnya.

Daftar Pustaka

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