Dalam mengeksplorasi data, seringkali dijumpai beberapa titik amatan yang berada jauh dari pola data pada umumnya yang mungkin berpengaruh besar terhadap proses analisis data. Titik-titik data tersebut dinamakan pencilan / nilai ekstrim (outliers). Pencilan yang terdapat pada satu variabel dinamakan pencilan univariat atau univariate outliers
Keberadaan outliers dapat menganggu proses analisis data, contohnya dalam analisis statistika despkriptif, kita menghitung rata-rata (mean) sebagai salah satu ukuran pemusatan data. Namun, data yang memiliki outliers menunjukkan nilai mean yang berbeda dengan data yang bebas dari outliers. Perbedaan tersebut akan dibuktikan dalam artikel ini
Berikut tampilan dataset yang digunakan :
head(data)
## # A tibble: 6 × 7
## KAB KEC NAMAKAB NAMAKEC FOOD NONFOOD EXP_CAP
## <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl>
## 1 3201 3201210 BOGOR CIBINONG 2567143. 3508083. 3037613.
## 2 3201 3201210 BOGOR CIBINONG 4748571. 5113667. 2465560.
## 3 3201 3201210 BOGOR CIBINONG 2942571. 2372667. 1328810.
## 4 3201 3201210 BOGOR CIBINONG 3276857. 2105833. 1345673.
## 5 3201 3201210 BOGOR CIBINONG 7669286. 9742667. 4352988.
## 6 3201 3201210 BOGOR CIBINONG 7800000 30810500 7722100
Untuk menentukan variabel yang akan dideteksi outliers nya, dilakukan eksplorasi terlebih dahulu untuk melihat tipe data tiap variabel karena deteksi outliers hanya dapat digunakan untuk data dengan tipe numerik
Dalam hal ini, gunakan fungsi str() dan summary()
str(data)
## tibble [1,792 × 7] (S3: tbl_df/tbl/data.frame)
## $ KAB : Factor w/ 2 levels "3201","3271": 1 1 1 1 1 1 1 1 1 1 ...
## $ KEC : Factor w/ 46 levels "3201010","3201020",..: 27 27 27 27 27 27 27 27 27 27 ...
## $ NAMAKAB: Factor w/ 2 levels "BOGOR","KOTA BOGOR": 1 1 1 1 1 1 1 1 1 1 ...
## $ NAMAKEC: Factor w/ 46 levels "BABAKAN MADANG",..: 12 12 12 12 12 12 12 12 12 12 ...
## $ FOOD : num [1:1792] 2567143 4748571 2942571 3276857 7669286 ...
## $ NONFOOD: num [1:1792] 3508083 5113667 2372667 2105833 9742667 ...
## $ EXP_CAP: num [1:1792] 3037613 2465560 1328810 1345673 4352988 ...
summary(data)
## KAB KEC NAMAKAB NAMAKEC
## 3201:1083 3271050: 168 BOGOR :1251 BOGOR BARAT : 168
## 3271: 709 3271060: 150 KOTA BOGOR: 541 TANAH SEREAL : 150
## 3271030: 141 BOGOR UTARA : 141
## 3271010: 121 BOGOR SELATAN: 121
## 3201210: 80 CIBINONG : 80
## 3271040: 65 BOGOR TENGAH : 65
## (Other):1067 (Other) :1067
## FOOD NONFOOD EXP_CAP
## Min. : 165000 Min. : 121417 Min. : 205979
## 1st Qu.: 1443429 1st Qu.: 903062 1st Qu.: 689770
## Median : 2115000 Median : 1537983 Median : 1088493
## Mean : 2423754 Mean : 2879427 Mean : 1542898
## 3rd Qu.: 3051343 3rd Qu.: 3057979 3rd Qu.: 1879501
## Max. :13519286 Max. :101995583 Max. :24947884
##
Berdasarkan output di atas, diperoleh bahwa variabel numerik dalam data hanya berjumlah 3 yakni variabel FOOD, NONFOOD, dan EXP_CAP. Dari ketiga variabel tersebut, dibuat boxplot untuk melihat variabel apa saja yang memiliki outliers untuk selanjutnya dapat ditangani dengan metode Inter Quartile Range
par(mfrow=c(1,3))
boxplot(data$FOOD)
boxplot(data$NONFOOD)
boxplot(data$EXP_CAP)
Berdasarkan boxplot di atas, terlihat ada titik-titik amatan yang tersebar di atas boxplot, hal ini berarti ketiga variabel tersebut sama-sama memiliki masalah pencilan (outliers )atas.
Misal dipilih variabel EXP_CAP untuk penanganan outliers kali ini, maka perlu didefinisikan terlebih dahulu nama objek yang mewakili variabel EXP_CAP pada data, yaitu periksa. Selanjutnya kita akan mencari ukuran statistik pada variabel EXP_CAP yang masih mengandung outliers
periksa = data$EXP_CAP
summary(periksa)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 205979 689770 1088493 1542898 1879501 24947884
Metode yang akan dibahas pada artikel kali ini adalah metode Inter Quartile Range. Metode ini mendeteksi outliers sebagai amatan yang berada di luar range atau batasan tertentu. Seperti batasan-batasan lainnya, IQR memiliki batas bawah dan batas atas sebagai kriteria dalam mengidentifikasi data yang termasuk outliers atau yang bukan
Metode IQR mendefinisikan batas atas sebagai \[U_L = (Q3+1.5*IQR)\]
Sedangkan untuk batas bawah \[L_L = (Q1-1.5*IQR)\]
Titik-titik data yang lebih besar dari Upper Limit maupun yang lebih kecil dari Lower Limit disebut sebagai outliers sehingga perlu dihilangkan untuk menghindari bias pada analisis statistik yang hendak dilakukan
batas_atas = quantile(periksa, probs = 0.75) + 1.5*IQR(periksa)
periksa[periksa > batas_atas]
## [1] 4352988 7722100 11710060 5934661 3884798 3938218 4327257 7978774
## [9] 3737095 24947884 5135315 11400060 11870183 21589491 6303785 9836848
## [17] 17064083 6633800 4892542 5746850 5362292 5019825 3726586 9787624
## [25] 3831167 4543083 5648750 6210099 4058740 6172740 4651018 4491821
## [33] 4352409 4055429 3970722 3889881 4224321 4705771 5050774 6627865
## [41] 7066798 5596057 5307897 4629383 3963020 5631190 6256467 4523550
## [49] 5798420 4592236 5960758 4368306 4309675 5662202 4705512 11796310
## [57] 4075857 7834690 3977667 3808365 3960647 4337607 3852290 5999658
## [65] 4768452 8453277 7669817 5198788 6672062 12923797 12467024 4118643
## [73] 5034786 5282202 5605449 5212288 5994524 5357869 4661640 4840223
## [81] 9443333 4478250 5964505 5259911 4867536 14195446 10042262 5208929
## [89] 5488905 5225655 4072843 6372340 4359423 6561643 4076631
periksa1 = periksa[periksa<batas_atas]
Setelah dilakukan deteksi terhadap pencilan (outliers) atas ditemukan 95 data dalam variabel EXP_CAP yang merupakan outliers. Karena keberadaannya dapat menganggu, akan kita hilangkan outliers tersebut dengan hanya menampilkan data yang lebih kecil dari Upper Limit.
Selanjutnya, dilakukan deteksi terhadap pencilan (outliers) bawah dengan syntax berikut :
batas_bawah = quantile(periksa1, probs = 0.25) - 1.5*IQR(periksa1)
periksa1[periksa1 < batas_bawah]
## numeric(0)
periksa_tanpa_outlier = periksa1[periksa1>batas_bawah]
Hasil di atas menunjukkan bahwa variabel EXP_CAP tidak memiliki pencilan (outliers) bawah. Hal ini sejalan dengan apa yang telah kita lihat pada boxplot bahwa tidak ada nilai-nilai ekstrim yang berada di bawah boxplot
Setelah menghilangkan outliers, kita dapat menyimpan variabel EXP_CAP yang sudah bebas dari outliers sebagai periksa_tanpa_outliers. Setelah itu dapat dibuat ringkasan statistik dengan fungsi summary() juga boxplot-nya untuk memeriksa apakah outliers benar-benar sudah tidak ada
summary(periksa_tanpa_outlier)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 205979 661944 1009853 1219650 1663550 3162131
boxplot(periksa_tanpa_outlier)
Berdasarkan boxplot di atas, telihat bahwa hasil pembersihan outliers dengan metode IQR ini telah menghilangkan titik-titik amatan yang sebelumnya terdapat di atas boxplot. Kini, boxplot dari nilai-nilai amatan pada variabel EXP_CAP telah bebas dari outliers
Setelah data dibersihkan dari outliers, tentunya kita ingin mengetahui seberapa besar pengaruh outliers dalam menghitung ukuran statistik pada data yang masih memiliki masih terdapat outliers dengan data tanpa outliers dengan data tanpa outliers
Untuk membandingkan ringkasan statistik dari kedua data tersebut, kita bisa membuat tabel dataframe sederhana yang terdiri atas nama-nama ukuran statistik yang digunakan dan ringkasan statistik dari kedua data yang telah diperoleh dengan fungsi summary()
dengan_outliers <- as.vector(summary(periksa))
tanpa_outliers <- as.vector(summary(periksa_tanpa_outlier))
ukuran_stat <- c('min','Q1','Median','Mean','Q3','Max')
compare <- data.frame(ukuran_stat, dengan_outliers, tanpa_outliers)
compare
## ukuran_stat dengan_outliers tanpa_outliers
## 1 min 205978.6 205978.6
## 2 Q1 689769.9 661944.4
## 3 Median 1088492.9 1009853.2
## 4 Mean 1542897.9 1219650.2
## 5 Q3 1879501.0 1663550.0
## 6 Max 24947883.9 3162131.0
Dari tabel di atas terlihat jelas bahwa keberadaan outliers mempengaruhi perbedaan nilai ukuran statistik dari data yang sebenarnya bersih dari outliers. Bahkan nilai mean menunjukkan perbedaan yang sangat menonjol yang mana jika hal ini tidak diperhatikan, terdapat kemungkinan adanya bias dalam pengambilan keputusan. Selain mean, nilai maksimum juga menunjukkan perbedaan yang sangat ekstrim, hal ini tidak terlalu mengejutkan karena data yang ditangani kali ini hanya memiliki pencilan (outliers) atas maka untuk nilai minimum tidak ditemukan adanya perbedaan