Datanın mənimsədilməsi:


library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages ------------------------------ tidyverse 1.3.0 --
v ggplot2 3.3.3     v purrr   0.3.4
v tibble  3.0.6     v dplyr   1.0.4
v tidyr   1.1.2     v stringr 1.4.0
v readr   1.4.0     v forcats 0.5.1
-- Conflicts --------------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
df <- mtcars
df
NA

“mpg” və “qsec” sütunlarına müəyyən sayda NA-lərin əlavə edilməsi:


df[sample(1:nrow(df), 3), "mpg"] <- NA
df[sample(1:nrow(df), 2), "qsec"] <- NA

Əksik datalara ön baxış:


# Sütunlara görə əksik dataların yoxlanması;
colSums(is.na(df))
 mpg  cyl disp   hp drat   wt qsec   vs   am gear carb 
   3    0    0    0    0    0    2    0    0    0    0 
# İndekslərinə görə əksik dataların yoxlanması;
which(is.na(df))
[1]   8  24  27 195 215
# Əksik datalara sahib olmayan database;
df[complete.cases(df),]

# Yalnız əksik datalara sahib olan database;
df[!complete.cases(df),]
NA

Hipotez testi və normallığın yoxlanması:

H0: Əksik datalar normal paylanmışdır.

H1: Paylanmamışdır.


library(BaylorEdpsych)
library(mvnmle)

r_test <- littleMcar(df)

# P-value;
r_test$p.value

md.pattern funksiyası ilə əksik dataya baxış:


library(mice)

Attaching package: 㤼㸱mice㤼㸲

The following object is masked from 㤼㸱package:stats㤼㸲:

    filter

The following objects are masked from 㤼㸱package:base㤼㸲:

    cbind, rbind
md.pattern(df)
   cyl disp hp drat wt vs am gear carb qsec mpg  
27   1    1  1    1  1  1  1    1    1    1   1 0
3    1    1  1    1  1  1  1    1    1    1   0 1
2    1    1  1    1  1  1  1    1    1    0   1 1
     0    0  0    0  0  0  0    0    0    2   3 5

Şərh: 28 sətirdə heç bir əksik data yoxdur. 2 sətirdə sadəcə mpg deyişəni ilə bağlı, 1 sətirdə isə sadəcə qsec dəyişəni ilə bağlı əksik data var. Sadəcə 1 sətirdə həm mpg, həm də qsec deyişəni ilə bağlı əksik datalar var.

aggr funskiyası ilə əksik datanın vizuallaşdırılması:


library(VIM)
Loading required package: colorspace
Loading required package: grid
VIM is ready to use.

Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues

Attaching package: 㤼㸱VIM㤼㸲

The following object is masked from 㤼㸱package:datasets㤼㸲:

    sleep
aggr_plot <- aggr(df, col = c("navyblue", "red"), 
                  numbers = T, 
                  sortVars = T, 
                  labels = names(df), 
                  cex.axis = .7, 
                  gap = 3)

 Variables sorted by number of missings: 

Şərh: Qrafiki nəzərdən keçirəndə məlum olur ki, ən çox əksik data 0.9 nisbətində mpg dəyişəninə aiddir. Database-in 87.5%-ində əksik data yoxdur.

KNN ilə əksik dataları təxmin etmə:


library(DMwR)
Loading required package: lattice
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 

Attaching package: 㤼㸱DMwR㤼㸲

The following object is masked from 㤼㸱package:VIM㤼㸲:

    kNN
knn_data <- knnImputation(df, k = 5)
anyNA(knn_data)
[1] FALSE

Gərçək data ilə KNN-lə təxmin edilən dataların müqayisəsi:


#1. Əksik dataların indeksləri;
l <- sapply(df, function(x) which(is.na(x)))
l
$mpg
[1]  8 24 27

$cyl
integer(0)

$disp
integer(0)

$hp
integer(0)

$drat
integer(0)

$wt
integer(0)

$qsec
[1]  3 23

$vs
integer(0)

$am
integer(0)

$gear
integer(0)

$carb
integer(0)
#2. Real əksik datalar;
mtcars[c(l$mpg),]$mpg
[1] 24.4 13.3 26.0
mtcars[c(l$qsec),]$qsec
[1] 18.61 17.30
#3. KNN ilə təxmin edilən əksik datalar;
knn_data[c(l$mpg),]$mpg
[1] 20.75631 15.72021 24.20438
knn_data[c(l$qsec),]$qsec
[1] 18.79580 17.35616
#4. Gərçək əksik datalarla KNN-lə təxmin edilən əksik dataların ortalamaları arasında fərq;
mean(mtcars[c(l$mpg),]$mpg - knn_data[c(l$mpg),]$mpg)
[1] 1.006366
mean(mtcars[c(l$qsec),]$qsec - knn_data[c(l$qsec),]$qsec)
[1] -0.1209823

Şərh: mpg deyişəni ilə bağlı ortalama fərq 0.24, qsec dəyişəni ilə bağlı ortalama fərq isə -0.67-dir. Nəticə olaraq hər iki praqnoz [-1:1] aralığında olduğuna görə modeli uğurlu hesab edə bilərik.

Random forest-lə əksik dataları təxmin etmə:


library(missForest)
Loading required package: randomForest
randomForest 4.6-14
Type rfNews() to see new features/changes/bug fixes.

Attaching package: 㤼㸱randomForest㤼㸲

The following object is masked from 㤼㸱package:dplyr㤼㸲:

    combine

The following object is masked from 㤼㸱package:ggplot2㤼㸲:

    margin

Loading required package: foreach

Attaching package: 㤼㸱foreach㤼㸲

The following objects are masked from 㤼㸱package:purrr㤼㸲:

    accumulate, when

Loading required package: itertools
Loading required package: iterators

Attaching package: 㤼㸱missForest㤼㸲

The following object is masked from 㤼㸱package:VIM㤼㸲:

    nrmse
rf_data <- missForest(df, ntree = 7)
  missForest iteration 1 in progress...done!
  missForest iteration 2 in progress...done!
  missForest iteration 3 in progress...done!
  missForest iteration 4 in progress...done!
rf_data <- rf_data$ximp
anyNA(rf_data)
[1] FALSE

Gərçək data ilə Random Forest-lə təxmin edilən dataların müqayisəsi


#1. Əksik dataların indeksləri
l <- sapply(df, function(x) which(is.na(x)))
l
$mpg
[1]  8 24 27

$cyl
integer(0)

$disp
integer(0)

$hp
integer(0)

$drat
integer(0)

$wt
integer(0)

$qsec
[1]  3 23

$vs
integer(0)

$am
integer(0)

$gear
integer(0)

$carb
integer(0)
#2. Real əksik datalar
mtcars[c(l$mpg),]$mpg
[1] 24.4 13.3 26.0
mtcars[c(l$qsec),]$qsec
[1] 18.61 17.30
#3. KNN ilə təxmin edilən əksik datalar
rf_data[c(l$mpg),]$mpg
[1] 22.42857 15.09429 20.77143
rf_data[c(l$qsec),]$qsec
[1] 19.53286 17.01571
#4. Gərçək əksik datalarla KNN-lə təxmin edilən əksik dataların ortalamaları arasında fərq
mean(mtcars[c(l$mpg),]$mpg - rf_data[c(l$mpg),]$mpg)
[1] 1.801905
mean(mtcars[c(l$qsec),]$qsec - rf_data[c(l$qsec),]$qsec)
[1] -0.3192857

Şərh: mpg deyişəni ilə bağlı ortalama fərq 0.57, qsec dəyişəni ilə bağlı ortalama fərq isə -0.66-dir. Nəticə olaraq hər iki praqnoz [-1:1] aralığında olduğuna görə modeli uğurlu hesab edə bilərik.

LS0tDQp0aXRsZTogIk1pc3NpbmcgZGF0YSAoTkEpIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyBEYXRhbsSxbiBtyZluaW1zyZlkaWxtyZlzaToNCg0KYGBge3J9DQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KZGYgPC0gbXRjYXJzDQpkZg0KDQpgYGANCg0KIyAibXBnIiB2yZkgInFzZWMiIHPDvHR1bmxhcsSxbmEgbcO8yZl5ecmZbiBzYXlkYSBOQS1syZlyaW4gyZlsYXbJmSBlZGlsbcmZc2k6DQoNCmBgYHtyfQ0KDQpkZltzYW1wbGUoMTpucm93KGRmKSwgMyksICJtcGciXSA8LSBOQQ0KZGZbc2FtcGxlKDE6bnJvdyhkZiksIDIpLCAicXNlYyJdIDwtIE5BDQoNCmBgYA0KDQojIMaPa3NpayBkYXRhbGFyYSDDtm4gYmF4xLHFnzoNCg0KYGBge3J9DQoNCiMgU8O8dHVubGFyYSBnw7ZyyZkgyZlrc2lrIGRhdGFsYXLEsW4geW94bGFubWFzxLE7DQpjb2xTdW1zKGlzLm5hKGRmKSkNCg0KIyDEsG5kZWtzbMmZcmluyZkgZ8O2csmZIMmZa3NpayBkYXRhbGFyxLFuIHlveGxhbm1hc8SxOw0Kd2hpY2goaXMubmEoZGYpKQ0KDQojIMaPa3NpayBkYXRhbGFyYSBzYWhpYiBvbG1heWFuIGRhdGFiYXNlOw0KZGZbY29tcGxldGUuY2FzZXMoZGYpLF0NCg0KIyBZYWxuxLF6IMmZa3NpayBkYXRhbGFyYSBzYWhpYiBvbGFuIGRhdGFiYXNlOw0KZGZbIWNvbXBsZXRlLmNhc2VzKGRmKSxdDQoNCmBgYA0KDQojIEhpcG90ZXogdGVzdGkgdsmZIG5vcm1hbGzEscSfxLFuIHlveGxhbm1hc8SxOg0KDQojIyMgSDA6IMaPa3NpayBkYXRhbGFyIG5vcm1hbCBwYXlsYW5txLHFn2TEsXIuDQojIyMgSDE6IFBheWxhbm1hbcSxxZ9kxLFyLg0KDQpgYGB7cn0NCg0KbGlicmFyeShCYXlsb3JFZHBzeWNoKQ0KbGlicmFyeShtdm5tbGUpDQoNCnJfdGVzdCA8LSBsaXR0bGVNY2FyKGRmKQ0KDQojIFAtdmFsdWU7DQpyX3Rlc3QkcC52YWx1ZQ0KDQpgYGANCg0KIyBtZC5wYXR0ZXJuIGZ1bmtzaXlhc8SxIGlsyZkgyZlrc2lrIGRhdGF5YSBiYXjEscWfOg0KDQpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9VFJVRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQoNCmxpYnJhcnkobWljZSkNCm1kLnBhdHRlcm4oZGYpDQoNCmBgYA0KDQojIyMgxZ7JmXJoOiAyOCBzyZl0aXJkyZkgaGXDpyBiaXIgyZlrc2lrIGRhdGEgeW94ZHVyLiAyIHPJmXRpcmTJmSBzYWTJmWPJmSBtcGcgZGV5acWfyZluaSBpbMmZIGJhxJ9sxLEsIDEgc8mZdGlyZMmZIGlzyZkgc2FkyZljyZkgcXNlYyBkyZl5acWfyZluaSBpbMmZIGJhxJ9sxLEgyZlrc2lrIGRhdGEgdmFyLiBTYWTJmWPJmSAxIHPJmXRpcmTJmSBoyZltIG1wZywgaMmZbSBkyZkgcXNlYyBkZXlpxZ/JmW5pIGlsyZkgYmHEn2zEsSDJmWtzaWsgZGF0YWxhciB2YXIuDQoNCiMgYWdnciBmdW5za2l5YXPEsSBpbMmZIMmZa3NpayBkYXRhbsSxbiB2aXp1YWxsYcWfZMSxcsSxbG1hc8SxOg0KDQpgYGB7cn0NCg0KbGlicmFyeShWSU0pDQphZ2dyX3Bsb3QgPC0gYWdncihkZiwgY29sID0gYygibmF2eWJsdWUiLCAicmVkIiksIA0KICAgICAgICAgICAgICAgICAgbnVtYmVycyA9IFQsIA0KICAgICAgICAgICAgICAgICAgc29ydFZhcnMgPSBULCANCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IG5hbWVzKGRmKSwgDQogICAgICAgICAgICAgICAgICBjZXguYXhpcyA9IC43LCANCiAgICAgICAgICAgICAgICAgIGdhcCA9IDMpDQoNCmBgYA0KDQojIyMgxZ7JmXJoOiBRcmFmaWtpIG7JmXrJmXJkyZluIGtlw6dpcsmZbmTJmSBtyZlsdW0gb2x1ciBraSwgyZluIMOnb3ggyZlrc2lrIGRhdGEgMC45IG5pc2LJmXRpbmTJmSBtcGcgZMmZeWnFn8mZbmluyZkgYWlkZGlyLiBEYXRhYmFzZS1pbiA4Ny41JS1pbmTJmSDJmWtzaWsgZGF0YSB5b3hkdXIuDQoNCiMgS05OIGlsyZkgyZlrc2lrIGRhdGFsYXLEsSB0yZl4bWluIGV0bcmZOg0KDQpgYGB7cn0NCg0KbGlicmFyeShETXdSKQ0KDQprbm5fZGF0YSA8LSBrbm5JbXB1dGF0aW9uKGRmLCBrID0gNSkNCmFueU5BKGtubl9kYXRhKQ0KDQpgYGANCg0KIyBHyZlyw6fJmWsgZGF0YSBpbMmZIEtOTi1syZkgdMmZeG1pbiBlZGlsyZluIGRhdGFsYXLEsW4gbcO8cWF5aXPJmXNpOg0KDQpgYGB7cn0NCg0KIzEuIMaPa3NpayBkYXRhbGFyxLFuIGluZGVrc2zJmXJpOw0KbCA8LSBzYXBwbHkoZGYsIGZ1bmN0aW9uKHgpIHdoaWNoKGlzLm5hKHgpKSkNCmwNCg0KIzIuIFJlYWwgyZlrc2lrIGRhdGFsYXI7DQptdGNhcnNbYyhsJG1wZyksXSRtcGcNCm10Y2Fyc1tjKGwkcXNlYyksXSRxc2VjDQoNCiMzLiBLTk4gaWzJmSB0yZl4bWluIGVkaWzJmW4gyZlrc2lrIGRhdGFsYXI7DQprbm5fZGF0YVtjKGwkbXBnKSxdJG1wZw0Ka25uX2RhdGFbYyhsJHFzZWMpLF0kcXNlYw0KDQojNC4gR8mZcsOnyZlrIMmZa3NpayBkYXRhbGFybGEgS05OLWzJmSB0yZl4bWluIGVkaWzJmW4gyZlrc2lrIGRhdGFsYXLEsW4gb3J0YWxhbWFsYXLEsSBhcmFzxLFuZGEgZsmZcnE7DQptZWFuKG10Y2Fyc1tjKGwkbXBnKSxdJG1wZyAtIGtubl9kYXRhW2MobCRtcGcpLF0kbXBnKQ0KbWVhbihtdGNhcnNbYyhsJHFzZWMpLF0kcXNlYyAtIGtubl9kYXRhW2MobCRxc2VjKSxdJHFzZWMpDQoNCmBgYA0KDQojIyMgxZ7JmXJoOiBtcGcgZGV5acWfyZluaSBpbMmZIGJhxJ9sxLEgb3J0YWxhbWEgZsmZcnEgMC4yNCwgcXNlYyBkyZl5acWfyZluaSBpbMmZIGJhxJ9sxLEgb3J0YWxhbWEgZsmZcnEgaXPJmSAtMC42Ny1kaXIuIE7JmXRpY8mZIG9sYXJhcSBoyZlyIGlraSBwcmFxbm96IFstMToxXSBhcmFsxLHEn8SxbmRhIG9sZHXEn3VuYSBnw7ZyyZkgbW9kZWxpIHXEn3VybHUgaGVzYWIgZWTJmSBiaWzJmXJpay4NCg0KIyBSYW5kb20gZm9yZXN0LWzJmSDJmWtzaWsgZGF0YWxhcsSxIHTJmXhtaW4gZXRtyZk6DQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KG1pc3NGb3Jlc3QpDQoNCnJmX2RhdGEgPC0gbWlzc0ZvcmVzdChkZiwgbnRyZWUgPSA3KQ0KcmZfZGF0YSA8LSByZl9kYXRhJHhpbXANCmFueU5BKHJmX2RhdGEpDQoNCmBgYA0KDQojIEfJmXLDp8mZayBkYXRhIGlsyZkgUmFuZG9tIEZvcmVzdC1syZkgdMmZeG1pbiBlZGlsyZluIGRhdGFsYXLEsW4gbcO8cWF5aXPJmXNpDQoNCmBgYHtyfQ0KDQojMS4gxo9rc2lrIGRhdGFsYXLEsW4gaW5kZWtzbMmZcmkNCmwgPC0gc2FwcGx5KGRmLCBmdW5jdGlvbih4KSB3aGljaChpcy5uYSh4KSkpDQpsDQoNCiMyLiBSZWFsIMmZa3NpayBkYXRhbGFyDQptdGNhcnNbYyhsJG1wZyksXSRtcGcNCm10Y2Fyc1tjKGwkcXNlYyksXSRxc2VjDQoNCiMzLiBLTk4gaWzJmSB0yZl4bWluIGVkaWzJmW4gyZlrc2lrIGRhdGFsYXINCnJmX2RhdGFbYyhsJG1wZyksXSRtcGcNCnJmX2RhdGFbYyhsJHFzZWMpLF0kcXNlYw0KDQojNC4gR8mZcsOnyZlrIMmZa3NpayBkYXRhbGFybGEgS05OLWzJmSB0yZl4bWluIGVkaWzJmW4gyZlrc2lrIGRhdGFsYXLEsW4gb3J0YWxhbWFsYXLEsSBhcmFzxLFuZGEgZsmZcnENCm1lYW4obXRjYXJzW2MobCRtcGcpLF0kbXBnIC0gcmZfZGF0YVtjKGwkbXBnKSxdJG1wZykNCm1lYW4obXRjYXJzW2MobCRxc2VjKSxdJHFzZWMgLSByZl9kYXRhW2MobCRxc2VjKSxdJHFzZWMpDQoNCmBgYA0KDQojIyMgxZ7JmXJoOiBtcGcgZGV5acWfyZluaSBpbMmZIGJhxJ9sxLEgb3J0YWxhbWEgZsmZcnEgMC41NywgcXNlYyBkyZl5acWfyZluaSBpbMmZIGJhxJ9sxLEgb3J0YWxhbWEgZsmZcnEgaXPJmSAtMC42Ni1kaXIuIE7JmXRpY8mZIG9sYXJhcSBoyZlyIGlraSBwcmFxbm96IFstMToxXSBhcmFsxLHEn8SxbmRhIG9sZHXEn3VuYSBnw7ZyyZkgbW9kZWxpIHXEn3VybHUgaGVzYWIgZWTJmSBiaWzJmXJpay4NCg==