Impute Data Yang Hilang Menggunakan R

Dalam menganalisis suatu dataset biasanya terdapat data yang hilang dan sebagian besar orang menganggap itu hal yang tidak terlalu penting ketika data yang hilang sangatlah sedikit. Tetapi beberapa orang lainnya tidak akan meninggalkan begitu saja terhadap data yang hilang, bahkan ada yang ingin mencari dan memperbaiki data yang kosong atau hilang sebelum menganalisis suatu dataset menjadi sebuah informasi dengan cepat menggunakan nilai rata – rata.

Kali ini saya akan membagi cara untuk membantu teman – teman pembaca semua dalam memasukan nilai data yang hilang dengan nilai data yang masuk akal menggunakan paket “mice” di R. Nilai – nilai yang masuk akal ini diambil dari distribusi yang dirancang khusus untuk setiap data yang hilang. Saya akan menggunakan dataset kualitas udara yang sudah tersedia pada program R dan menghapus beberapa titik data dari dataset tersebut.

Menggunakan Data Kualitas Udara

data <- airquality
data[4:10,3] <- rep(NA,7)
data[1:5,4] <- NA

karena sampel data kualitas udara tidak ada yang hilang, untuk uji coba akan saya hilangkan untuk sementara waktu dan kita bisa melihat menggunakan summary().

data <- data[-c(5,6)]
summary(data)
       Ozone           Solar.R           Wind             Temp      
 Min.   :  1.00   Min.   :  7.0   Min.   : 1.700   Min.   :57.00  
 1st Qu.: 18.00   1st Qu.:115.8   1st Qu.: 7.400   1st Qu.:73.00  
 Median : 31.50   Median :205.0   Median : 9.700   Median :79.00  
 Mean   : 42.13   Mean   :185.9   Mean   : 9.806   Mean   :78.28  
 3rd Qu.: 63.25   3rd Qu.:258.8   3rd Qu.:11.500   3rd Qu.:85.00  
 Max.   :168.00   Max.   :334.0   Max.   :20.700   Max.   :97.00  
 NA's   :37       NA's   :7       NA's   :7        NA's   :5  

ternyata Ozon adalah variabel dengan datapoint yang paling banyak hilang. Di bawah ini kita akan menggali lebih dalam ke pola data yang hilang.

Klasifikasi dari data yang hilang

Ada dua jenis data yang hilang:

  • Missing Completely at Random (MCAR)
    Hilang sepenuhnya secara acak. Ini adalah skenario yang diinginkan jika ada data yang hilang.
  • Missing Not at Random (MNAR)
    Hilang bukan secara acak. Kehilangan tidak secara acak adalah masalah yang serius dan dalam hal ini kita harus mencari dan memeriksa data lebih lanjut serta memahami kenapa data tersebut hilang. Terlalu banyak data yang hilang dapat menjadi masalah. Biasanya ambang batas aman adalah 5% dari total untuk keseluruhan data. Jika lebih dari 5%, maka kita harus mengabaikan data yang hilang tersebut.

Oleh karena itu, kita akan memeriksa kolom dan baris dimana jumlah data yang hilang lebih dari 5% dengan fungsi sederhana.

pMissing <- function(x){sum(is.na(x))/length(x)*100}
apply(data, 2, pMissing)
apply(data, 1, pMissing)
    Ozone   Solar.R      Wind      Temp 
24.183007  4.575163  4.575163  3.267974 

  [1]  25  25  25  50 100  50  25  25  25  50  25   0   0   0   0   0   0   0   0   0   0
 [22]   0   0   0  25  25  50   0   0   0   0  25  25  25  25  25  25   0  25   0   0  25
 [43]  25   0  25  25   0   0   0   0   0  25  25  25  25  25  25  25  25  25  25   0   0
 [64]   0  25   0   0   0   0   0   0  25   0   0  25   0   0   0   0   0   0   0  25  25
 [85]   0   0   0   0   0   0   0   0   0   0   0  25  25  25   0   0   0  25  25   0   0
[106]   0  25   0   0   0   0   0   0   0  25   0   0   0  25   0   0   0   0   0   0   0
[127]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
[148]   0   0  25   0   0   0

Bisa kita lihat bahwa Ozon memiliki data yang hilang hampir 25%, oleh karena itu saya dapat mempertimbangkan untuk membuang data dari analisis atau mengumpulkan lagi data – data dari pengukuran. Variabel lain berada dibawah ambang 5% sehingga saya dapat menyimpannya untuk digunakan analisa selanjutnya. Jika teman – teman mencoba dengan data lain dan hasilnya lebih dari 50% data hilang, maka dengan berat hati saya berkata untuk membuang data tersebut.

Penggunaan paket mice untuk melihat pola data yang hilang

Paket mice menyediakan fungsi md.pattern() yang bagus untuk mendapatkan pemahaman yang lebih baik tentang pola data yang hilang.

library(mice)
md.pattern(data)
    Temp Solar.R Wind Ozone   
104    1       1    1     1  0
 34    1       1    1     0  1
  4    1       0    1     1  1
  3    1       1    0     1  1
  3    0       1    1     1  1
  1    1       0    1     0  2
  1    1       1    0     0  2
  1    1       0    0     1  2
  1    0       1    0     1  2
  1    0       0    0     0  4
       5       7    7    37 56

Output menunjukkan bahwa ada 104 sampel data selesai, 34 sampel data hanya melewatkan pengukuran Ozon, 4 sampel hanya melewatkan nilai Solar.R dan seterusnya.

Representasi visual yang mungkin lebih bermanfaat dapat diperoleh dengan menggunakan paket VIM sebagai berikut.

library(VIM)
aggr_plot <- aggr(data, col=c(‘navyblue’,’red’), numbers=TRUE, sortVars=TRUE, labels=names(data), cex.axis=.7, gap=3, ylab=c(“Histogram of missing data”,”Pattern”))

berdasarkan output diatas bahwa sekitar 22% data ozon hilang, sisanya terdapat kurang dari 5% data hilang untuk setiap parameternya. Pendekatan visual lainnya menggunakan data plot.

marginplot(data[c(1,2)])

Disini saya membatasi 2 variabel saja yaitu Ozon dan Solar.R. Plot kotak merah disebelah kiri menunjukkan distribusi Solar.R dengan Ozon hilang. Sedangkan plot kotak biru menunjukkan distribusi titik data yang tersisa. Jika asumsi saya tentang data MCAR benar, maka kotak merah dan biru sangat mirip.

Meng-imputeĀ data yang hilang

Fungsi mice() menangani proses imputasi.

tempData <- mice(data,m=5,maxit=50,meth=’pmm’,seed=500)
summary(tempData)
Multiply imputed data set
Call:
mice(data = data, m = 5, method = "pmm", maxit = 50, seed = 500)
Number of multiple imputations:  5
Missing cells per column:
  Ozone Solar.R    Wind    Temp 
     37       7       7       5 
Imputation methods:
  Ozone Solar.R    Wind    Temp 
  "pmm"   "pmm"   "pmm"   "pmm" 
VisitSequence:
  Ozone Solar.R    Wind    Temp 
      1       2       3       4 
PredictorMatrix:
        Ozone Solar.R Wind Temp
Ozone       0       1    1    1
Solar.R     1       0    1    1
Wind        1       1    0    1
Temp        1       1    1    0
Random generator seed value:  500

Beberapa catatan pada parameter:

  • m = 5 mengacu pada jumlah dataset yang diimputasi. Lima adalah nilai default
  • meth = ‘pmm’ mengacu pada metode imputasi. Dalam hal ini saya menggunakan pencocokan rata-rata prediktif sebagai metode imputasi. Jika teman – teman ingin menggunakan metode lain yang ada pada paket mice silahkan dilihat langsung di R ya.

Selanjutnya jika kita ingin memeriksa data yang dimasukkan, misalnya untuk variabel Ozon, kita bisa memasukkan kode berikut:

tempData$imp$Ozone
     1  2   3   4   5
5   16 16   7  47  85
10  21 19  14  14  30
25   8 14  14  32  28
26   9 18  32   1  37
...

Output menunjukkan data imputasi untuk setiap pengamatan (kiri kolom pertama) dalam setiap dataset imputasi (baris pertama di atas). Jika kita perlu memeriksa metode imputasi yang digunakan untuk masing – masing variabel, miceĀ membuat kita sangat mudah untuk melakukannya.

tempData$meth
     
  Ozone  Solar.R   Wind    Temp 
  "pmm"   "pmm"   "pmm"   "pmm"

Sekarang kita bisa mendapatkan kembali dataset yang sudah selesai ini menggunakan fungsi complete()

completedData <- complete(tempData,1)

Nilai data yang hilang telah diganti dengan nilai-nilai yang diperhitungkan dari kelima dataset. Jika kita ingin menggunakan yang lain, cukup ubah parameter kedua di fungsi complete().

Memeriksa distribusi data yang asli dengan hasil imputasi

Sekarang mari kita bandingkan distribusi data asli dengan hasil imputasi menggunakan data plot.
Pertama-tama kita dapat menggunakan scatterplot Ozon terhadap semua variabel lainnya.

xyplot(tempData,Ozone ~ Wind+Temp+Solar.R,pch=18,cex=1)

Dari gambar diatas terlihat bahwa scatterplot yang berwarna magenta (hasil imputasi) searah dengan scaterplot data observasi (data asli). Scatterplot yang hampir mirip ini memberitahu kita bahwa nilai yang diperhitungkan memang “nilai yang masuk akal”.

Plot lainnya adalah plot kerapatan:

densityplot(tempData)

Terlihat bahwa grafik yang berwarna magenta menunjukkan hasil imputasi memiliki distribusi yang sama dengan grafik yang berwarna biru (data asli).

Mungkin itu saja share kali ini. Semoga bermanfaat.

Catatan: Saya mempelajari teknik ini merujuk pada makalah yang berjudul mice: Multivariate Imputation oleh Chained Equations in R oleh Stef van Buuren. Ini adalah makalah yang hebat dan saya sangat merekomendasikan untuk membacanya jika Anda tertarik pada beberapa imputasi!

Tinggalkan Balasan

%d blogger menyukai ini: