Missing observations in the variables in the data set, in other words missing data, come at the beginning of the problems faced by data scientists or academicians and field workers dealing with data analysis. Although there are many methods among the missing data assignment methods in the literature, some of the prominent methods are as follows:
Apart from these mentioned methods, machine learning algorithms or methods can also be used to assign missing data. Some of them can be summarized as follows:
In this study, missing data assignment methods will be discussed and the methods to be applied will be decision trees, KNN and RF machine learning methods. In the study, the data set will be produced synthetically. In other words, it will be hypothetical. Now we can move on to the application steps in order.
Veri bilimcilerin ya da veri analizleriyle uğraşan akademi ve saha çalışanların karşılaştığı problemlerin başında veri setindeki değişkenlerde eksik gözlemlerle diğer bir deyişle missing data gelmektedir. Literatürde eksik veri atama yöntemleri arasında bir çok yöntem bulunmakla birlikte öne çıkan yöntemlerden bazıları şöyledir:
Bahsedilen bu yöntemlerin dışında eksik veri atama yöntemlerinden makine öğrenme algoritmalarından ya da yöntemlerinden de yararlanabilmektedir. Bunlardan bazıları ise şöyle özetlenebilir:
Sayılan bu yöntemleri artırmak mümkündür. Bu çalışma kapsamında eksik veri atama yöntemleri olarak üzerinde uygulama yapılacak yöntemler ise karar ağaçları, KNN ve RF makine öğrenme yöntemleri olacaktır. Çalışmada örnek uygulama yapılacak veri seti sentetik olarak üretilecektir. Diğer bir deyişle hipotetik olacaktır. Şimdi sırasıyla uygulama adımlarına geçebiliriz.
R programlama dilinin kullanıldığı bu çalışmada eksik veri atamaları için ağırlıklı olarak mice ve VIM kütüphaneleri kullanılmıştır.
library<-c("crosstalk","dplyr","tibble","tidyr","ggplot2","formattable","ggthemes","readr","readxl","ggpubr", "ggstance", "stringr","explore", "lubridate","tidytext", "scales", "data.table", "pastecs", "writexl", "kableExtra", "reshape2", "GGally", "VIM","mice")
yükle<-sapply(library, require, character.only = TRUE)
#Kütüphane yüklenme durumunu gösteren tablo
tablo=suppressWarnings(yükle, classes = "warning")
isim=names(tablo)
deger=as_tibble(tablo)
data.frame(Sıra=1:length(isim), Kütüphane=isim, Durumu=deger$value) %>% mutate(Durumu=if_else(Durumu==TRUE, "Yüklendi", "Paket Kurulumu Gerekli")) %>% kbl() %>%
kable_styling(bootstrap_options = c("striped", "hover"))
Sıra | Kütüphane | Durumu |
---|---|---|
1 | crosstalk | Yüklendi |
2 | dplyr | Yüklendi |
3 | tibble | Yüklendi |
4 | tidyr | Yüklendi |
5 | ggplot2 | Yüklendi |
6 | formattable | Yüklendi |
7 | ggthemes | Yüklendi |
8 | readr | Yüklendi |
9 | readxl | Yüklendi |
10 | ggpubr | Yüklendi |
11 | ggstance | Yüklendi |
12 | stringr | Yüklendi |
13 | explore | Yüklendi |
14 | lubridate | Yüklendi |
15 | tidytext | Yüklendi |
16 | scales | Yüklendi |
17 | data.table | Yüklendi |
18 | pastecs | Yüklendi |
19 | writexl | Yüklendi |
20 | kableExtra | Yüklendi |
21 | reshape2 | Yüklendi |
22 | GGally | Yüklendi |
23 | VIM | Yüklendi |
24 | mice | Yüklendi |
Bu kısımda 4 değişkenden oluşan bir veri seti basit tekrarlı örneklem yöntemi kullanılarak üretilmiştir.
atama=c(1:10000, rep(NA, 10000))
set.seed(61)#aynı sonuçları almak için
v1=sample(atama, 1000, replace=TRUE)
v2=sample(atama, 1000, replace=TRUE)
v3=sample(atama, 1000, replace=TRUE)
v4=sample(atama, 1000, replace=TRUE)
veri<-cbind(v1, v2,v3,v4) %>% as_tibble()
veri %>%
head(20) %>%
kbl() %>%
kable_styling(bootstrap_options = c("striped", "hover"))#ilk 20 gözlem
v1 | v2 | v3 | v4 |
---|---|---|---|
1066 | 4703 | NA | 6745 |
2794 | 4877 | 6961 | NA |
NA | NA | 5195 | NA |
8980 | NA | NA | NA |
4962 | 475 | NA | 7929 |
5451 | NA | NA | NA |
NA | NA | NA | 8980 |
NA | NA | 7764 | 5097 |
NA | 9736 | 2428 | 5648 |
NA | 9363 | NA | 1057 |
7758 | 820 | 726 | 1659 |
6592 | 38 | 5296 | NA |
8060 | 184 | NA | NA |
4891 | NA | 9332 | NA |
4879 | 6856 | 2118 | NA |
NA | NA | NA | 9575 |
NA | NA | NA | 2694 |
6555 | 3404 | NA | NA |
3901 | NA | 8710 | 3917 |
9358 | NA | 8097 | 1597 |
Bu kısımda veri setine ilişkin merkezi eğilim ve yayılım ölçüleri verilmiştir.
options(scipen = 999)
stat.desc(veri, basic=TRUE, p=0.95) %>%
kable() %>%
kable_styling(bootstrap_options = c("striped", "hover"))
v1 | v2 | v3 | v4 | |
---|---|---|---|---|
nbr.val | 498.0000000 | 498.0000000 | 501.0000000 | 522.0000000 |
nbr.null | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 |
nbr.na | 502.0000000 | 502.0000000 | 499.0000000 | 478.0000000 |
min | 12.0000000 | 38.0000000 | 1.0000000 | 10.0000000 |
max | 9985.0000000 | 9960.0000000 | 9989.0000000 | 9944.0000000 |
range | 9973.0000000 | 9922.0000000 | 9988.0000000 | 9934.0000000 |
sum | 2478128.0000000 | 2504549.0000000 | 2407742.0000000 | 2566469.0000000 |
median | 4872.5000000 | 5079.5000000 | 4745.0000000 | 4898.0000000 |
mean | 4976.1606426 | 5029.2148594 | 4805.8722555 | 4916.6072797 |
SE.mean | 127.8930035 | 130.6419597 | 130.0439593 | 126.8412392 |
CI.mean.0.95 | 251.2776013 | 256.6786091 | 255.4999465 | 249.1831284 |
var | 8145596.9278644 | 8499526.1690343 | 8472627.1036487 | 8398301.3752252 |
std.dev | 2854.0492161 | 2915.3946849 | 2910.7777489 | 2897.9822938 |
coef.var | 0.5735444 | 0.5796918 | 0.6056711 | 0.5894272 |
Info! Burada veri setinde değişkene göre eksik gözlem sayısı ile ilgili değişkendeki toplam gözlem sayısı içindeki oranı verilmiştir.
veri %>% explore_all()
dt<-mice(veri, method = "cart")
##
## iter imp variable
## 1 1 v1 v2 v3 v4
## 1 2 v1 v2 v3 v4
## 1 3 v1 v2 v3 v4
## 1 4 v1 v2 v3 v4
## 1 5 v1 v2 v3 v4
## 2 1 v1 v2 v3 v4
## 2 2 v1 v2 v3 v4
## 2 3 v1 v2 v3 v4
## 2 4 v1 v2 v3 v4
## 2 5 v1 v2 v3 v4
## 3 1 v1 v2 v3 v4
## 3 2 v1 v2 v3 v4
## 3 3 v1 v2 v3 v4
## 3 4 v1 v2 v3 v4
## 3 5 v1 v2 v3 v4
## 4 1 v1 v2 v3 v4
## 4 2 v1 v2 v3 v4
## 4 3 v1 v2 v3 v4
## 4 4 v1 v2 v3 v4
## 4 5 v1 v2 v3 v4
## 5 1 v1 v2 v3 v4
## 5 2 v1 v2 v3 v4
## 5 3 v1 v2 v3 v4
## 5 4 v1 v2 v3 v4
## 5 5 v1 v2 v3 v4
kable(head(mice::complete(dt,1),20)) %>%
kable_styling(bootstrap_options = c("striped", "hover"))# Atama sonrası ilk 20 gözlem
v1 | v2 | v3 | v4 |
---|---|---|---|
1066 | 4703 | 3503 | 6745 |
2794 | 4877 | 6961 | 9634 |
7876 | 9736 | 5195 | 96 |
8980 | 4480 | 8791 | 2613 |
4962 | 475 | 7395 | 7929 |
5451 | 5640 | 3672 | 2689 |
4024 | 1206 | 5292 | 8980 |
6209 | 7395 | 7764 | 5097 |
7829 | 9736 | 2428 | 5648 |
5534 | 9363 | 196 | 1057 |
7758 | 820 | 726 | 1659 |
6592 | 38 | 5296 | 8980 |
8060 | 184 | 7034 | 2368 |
4891 | 9478 | 9332 | 7387 |
4879 | 6856 | 2118 | 883 |
2731 | 3737 | 7388 | 9575 |
6460 | 9599 | 2776 | 2694 |
6555 | 3404 | 4282 | 4687 |
3901 | 5895 | 8710 | 3917 |
9358 | 9037 | 8097 | 1597 |
Info! KNN algortiması hem sınıflandırma hem de regresyon problemlerinin çözümünde kullanılabilmektedir. Buradan bakıldığında hem kategorik hem de sürekli ve kesikli nitelikte olan değişkenlerde eksik veri gözlemlerinin atanmasında alternatif non-parametrik denetimli (supervised) yöntemlerden birisidir.
Info! Esas olarak özellik benzerliğine dayanmaktadır. KNN, bir veri noktasının komşusuna ne kadar benzediğini kontrol eder ve veri noktasını en çok benzediği sınıfa göre sınıflandırır.
eksikknn <- kNN(veri)
eksikknn[,1:4] %>%
head(20) %>%
kable() %>%
kable_styling(bootstrap_options = c("striped", "hover")) #ilk 20 gözlem
v1 | v2 | v3 | v4 |
---|---|---|---|
1066 | 4703 | 4437 | 6745 |
2794 | 4877 | 6961 | 1974 |
6324 | 2115 | 5195 | 2802 |
8980 | 3487 | 6443 | 2413 |
4962 | 475 | 9037 | 7929 |
5451 | 7332 | 1474 | 5638 |
6828 | 5071 | 3840 | 8980 |
7829 | 8593 | 7764 | 5097 |
4711 | 9736 | 2428 | 5648 |
5348 | 9363 | 3117 | 1057 |
7758 | 820 | 726 | 1659 |
6592 | 38 | 5296 | 2689 |
8060 | 184 | 6363 | 8145 |
4891 | 8661 | 9332 | 5710 |
4879 | 6856 | 2118 | 6167 |
6988 | 2044 | 8365 | 9575 |
4756 | 2465 | 3815 | 2694 |
6555 | 3404 | 9751 | 6620 |
3901 | 2139 | 8710 | 3917 |
9358 | 3880 | 8097 | 1597 |
rfdf <- mice(veri, meth = "rf", ntree = 50, seed = 61)#ntree yetiştirilecek ağaç sayısını göstermektedir.
##
## iter imp variable
## 1 1 v1 v2 v3 v4
## 1 2 v1 v2 v3 v4
## 1 3 v1 v2 v3 v4
## 1 4 v1 v2 v3 v4
## 1 5 v1 v2 v3 v4
## 2 1 v1 v2 v3 v4
## 2 2 v1 v2 v3 v4
## 2 3 v1 v2 v3 v4
## 2 4 v1 v2 v3 v4
## 2 5 v1 v2 v3 v4
## 3 1 v1 v2 v3 v4
## 3 2 v1 v2 v3 v4
## 3 3 v1 v2 v3 v4
## 3 4 v1 v2 v3 v4
## 3 5 v1 v2 v3 v4
## 4 1 v1 v2 v3 v4
## 4 2 v1 v2 v3 v4
## 4 3 v1 v2 v3 v4
## 4 4 v1 v2 v3 v4
## 4 5 v1 v2 v3 v4
## 5 1 v1 v2 v3 v4
## 5 2 v1 v2 v3 v4
## 5 3 v1 v2 v3 v4
## 5 4 v1 v2 v3 v4
## 5 5 v1 v2 v3 v4
kable(head(mice::complete(rfdf,1),20)) %>%
kable_styling(bootstrap_options = c("striped", "hover"))# Atama sonrası ilk 20 gözlem
v1 | v2 | v3 | v4 |
---|---|---|---|
1066 | 4703 | 9642 | 6745 |
2794 | 4877 | 6961 | 9661 |
188 | 9941 | 5195 | 3447 |
8980 | 3404 | 5081 | 2167 |
4962 | 475 | 8742 | 7929 |
5451 | 2539 | 761 | 3045 |
5725 | 4349 | 1558 | 8980 |
7515 | 9490 | 7764 | 5097 |
4577 | 9736 | 2428 | 5648 |
7311 | 9363 | 2619 | 1057 |
7758 | 820 | 726 | 1659 |
6592 | 38 | 5296 | 9646 |
8060 | 184 | 5124 | 8948 |
4891 | 573 | 9332 | 6024 |
4879 | 6856 | 2118 | 3166 |
6686 | 7373 | 6708 | 9575 |
4149 | 4670 | 5850 | 2694 |
6555 | 3404 | 2676 | 4762 |
3901 | 2248 | 8710 | 3917 |
9358 | 8042 | 8097 | 1597 |
Özetle, bu çalışma kapsamında eksik veri atama yöntemler olarak karar ağaçları, KNN ve RF makine öğrenme yöntemleri kullanarak veri setindeki eksik gözlemlere değerler atanmıştır.
Faydalı olması dileğiyle.
Bilimle ve teknolojiyle kalınız.
Stef van Buuren, Karin Groothuis-Oudshoorn (2011). mice: Multivariate Imputation by Chained Equations in R. Journal of Statistical Software, 45(3), 1-67. URL https://www.jstatsoft.org/v45/i03/.
Alexander Kowarik, Matthias Templ (2016). Imputation with the R Package VIM. Journal of Statistical Software, 74(7), 1-16. doi:10.18637/jss.v074.i07
Hao Zhu (2021). kableExtra: Construct Complex Table with ‘kable’ and Pipe Syntax. R package version 1.3.4. https://CRAN.R-project.org/package=kableExtra.
RStudio Cloud: https://login.rstudio.cloud/
The R Project for Statistical Computing. https://www.r-project.org/