{"id":16972,"date":"2017-08-31T13:50:18","date_gmt":"2017-08-31T12:50:18","guid":{"rendered":"https:\/\/thingsolver.com\/blog\/handling-missing-data\/"},"modified":"2024-11-29T17:26:41","modified_gmt":"2024-11-29T16:26:41","slug":"rukovanje-nedostajucim-podacima","status":"publish","type":"post","link":"https:\/\/thingsolver.com\/sr\/blog\/rukovanje-nedostajucim-podacima\/","title":{"rendered":"Rukovanje nedostajuc\u0301im podacima"},"content":{"rendered":"<p>Zdravo svima. Iako sam planirao da moj sledec\u0301i post bude o detekciji anomalija i njihovom tretmanu, suo\u010dio sam se sa drugom vrstom problema koji je brzo prerastao u ogroman problem koji uti\u010de na modeliranje i ta\u010dnost rezultata i nisam mogao da odolim da \u0161to pre podelim svoje iskustvo. U ovom postu c\u0301u govoriti o problemu rukovanja nedostaju\u0107im podacima.<\/p>\n<p>Nedostatak podataka predstavlja svakodnevni problem za analiti\u010dara. Navikli smo se na njega i naj\u010de\u0161c\u0301e ga samo tretiramo nekim standardnim tehnikama i nastavljamo sa analizom. To je ono \u0161to sam radio dok nisam shvatio da to ne daje zadovoljavajuc\u0301e rezultate.<\/p>\n<p>Svi smo nau\u010deni da je najlak\u0161i na\u010din za rukovanje nedostajuc\u0301im vrednostima da ih ispustimo, naravno, ako ih nema previ\u0161e. Ako postoji zna\u010dajan broj nedostajuc\u0301ih vrednosti, neke druge opcije uklju\u010duju popunjavanje odre\u0111enim vrednostima. Najzahtevniji deo ovde je odlu\u010divanje kako treba popuniti te nedostaju\u0107e vrednosti podacima.<\/p>\n<p>Pre dono\u0161enja ove odluke, va\u017eno je znati da postoje tri vrste nedostajanja podataka i nije \u0161teta ako jo\u0161 niste \u010duli za to \u2013 moram priznati da sam to nedavno saznao.<\/p>\n<p>Moguc\u0301i tipovi podataka koji nedostaju su:<\/p>\n<ol>\n<li>Potpuno nasumi\u010dno nedostajanje (MCAR) \u2013 pojava nedostajuc\u0301ih vrednosti za promenljivu nije povezana sa nedostajuc\u0301om vredno\u0161c\u0301u, vrednostima drugih promenljivih ili \u0161ablonom nedostajanja drugih promenljivih (sistematski nedostaci, ograni\u010denja resursa, ograni\u010denje re\u017eima);<\/li>\n<li>Nasumi\u010dno nedostajanje (MAR) \u2013 pojavljivanje nedostajuc\u0301ih vrednosti za promenljivu je nasumi\u010dno, zavisno od vrednosti ili nedostatka vidljivih varijabli (odgovori sadr\u017eani u anketi, pogre\u0161ne mere, itd.);<\/li>\n<li>Nenasumi\u010dno nedostajanje (MNAR) \u2013 pojava nedostajuc\u0301ih vrednosti je sistematski povezana sa nepoznatim ili neizmerenim kovarijantnim faktorima (ne znamo kako se to de\u0161ava i stoga ne mo\u017eemo ni na koji na\u010din da ga modeliramo).<\/li>\n<\/ol>\n<p>Najva\u017enija stvar koju treba primetiti je da se trec\u0301a vrsta nedostajanja ne mo\u017ee re\u0161iti. Dobre vesti su &#8211; druge dve mogu. Dakle, ako je tip nedostatka MCAR ili MAR, ali podaci nisu modelirani, ceo proces bi rezultirao niskom efikasno\u0161c\u0301u, a u drugom slu\u010daju \u2013 pristrasno\u0161c\u0301u. Zaklju\u010dak je \u2013 trebalo bi to nekako modelirati i doc\u0301i c\u0301emo do toga. Ali prvo, hajde da navedemo tehnike tretmana.<\/p>\n<ol>\n<li>Ispu\u0161tanje instanci sa nedostajuc\u0301im vrednostima \u2013 kao \u0161to je gore pomenuto bi rezultiralo problemom niske efikasnosti, a mo\u017eda \u010dak i pristrasnosti u slu\u010daju MAR. Ali pogledajmo primer u nastavku. Ova tehnika bi izbrisala obe instance, \u0161to c\u0301e biti veliki gubitak informacija ako postoji mnogo instanci poput one sa ID=1.<\/li>\n<\/ol>\n<table width=\"624\">\n<tbody>\n<tr>\n<td width=\"80\">ID<\/td>\n<td width=\"154\">x<\/td>\n<td width=\"154\">y<\/td>\n<td width=\"174\">z<\/td>\n<td width=\"62\">w<\/td>\n<\/tr>\n<tr>\n<td width=\"80\">1<\/td>\n<td width=\"154\">2,50<\/td>\n<td width=\"154\">0,18<\/td>\n<td width=\"174\">10,50<\/td>\n<td width=\"62\">\u2013<\/td>\n<\/tr>\n<tr>\n<td width=\"80\">2<\/td>\n<td width=\"154\">\u2013<\/td>\n<td width=\"154\">\u2013<\/td>\n<td width=\"174\">\u2013<\/td>\n<td width=\"62\">\u2013<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol start=\"2\">\n<li>\nSrednja imputacija \u2013 za svaku promenljivu se izra\u010dunava srednja vrednost posmatranih vrednosti i njome se popunjavaju nedostajuc\u0301e vrednosti za tu promenljivu. U primeru ispod, popunili bismo nedostajuc\u0301u vrednost za promenljivu <em>w<\/em> vrednosti 37, kada bi zapravo trebalo da bude 49. Ako se radi o starosti, razlika je zna\u010dajna, a u praksi bi bilo jo\u0161 gore.<\/li>\n<\/ol>\n<table width=\"624\">\n<tbody>\n<tr>\n<td width=\"74\">ID<\/td>\n<td width=\"144\">x<\/td>\n<td width=\"144\">y<\/td>\n<td width=\"180\">z<\/td>\n<td width=\"81\">w<\/td>\n<\/tr>\n<tr>\n<td width=\"74\">1<\/td>\n<td width=\"144\">2,50<\/td>\n<td width=\"144\">0,18<\/td>\n<td width=\"180\">10,50<\/td>\n<td width=\"81\">55<\/td>\n<\/tr>\n<tr>\n<td width=\"74\">2<\/td>\n<td width=\"144\">2,70<\/td>\n<td width=\"144\">0,23<\/td>\n<td width=\"180\">11,75<\/td>\n<td width=\"81\">\u2013<\/td>\n<\/tr>\n<tr>\n<td width=\"74\">\u2026<\/td>\n<td width=\"144\">\u2026<\/td>\n<td width=\"144\">\u2026<\/td>\n<td width=\"180\">\u2026<\/td>\n<td width=\"81\">\u2026<\/td>\n<\/tr>\n<tr>\n<td width=\"74\">3<\/td>\n<td width=\"144\">1,50<\/td>\n<td width=\"144\">0,12<\/td>\n<td width=\"180\">12,80<\/td>\n<td width=\"81\">19<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol start=\"3\">\n<li>Imputacija zasnovana na regresiji \u2013 u ovom slu\u010daju se pretpostavlja da se, na primer, <em>w<\/em> mo\u017ee izra\u010dunati kao linearna kombinacija drugih promenljivih za datu instancu, a to je sjajno ako postoji primetna korelacija izme\u0111u varijabli Dakle, za gornji primer mo\u017ee se primetiti da kada su <em>x<\/em> i <em>y<\/em> vec\u0301i, vrednost <em>w<\/em> je vec\u0301a, a kada su ni\u017ei, vrednost <em>w<\/em> je tako\u0111e niska. Analogno, primetno je da postoji negativna korelacija izme\u0111u <em>y<\/em> i <em>w<\/em>. Dakle, ovde bi izra\u010dunata vrednost od 48 bila pogodnija.<\/li>\n<li>Interpolacija podataka \u2013 koristi se uglavnom u vremenskim serijama, kada se nedostajuc\u0301a vrednost mo\u017ee popuniti vredno\u0161c\u0301u iz prethodnog vremenskog perioda, ili prosekom dve susedne vrednosti vremenskog perioda.<\/li>\n<li>Vi\u0161estruka imputacija \u2013 u ovom slu\u010daju, imputacija se vr\u0161i vi\u0161e puta, za svaku promenljivu koja nedostaje, primenom nezavisnih i zavisnih varijabli. Jedan od naj\u010de\u0161c\u0301e kori\u0161c\u0301enih algoritama sa ovakvom logikom je MICE algoritam, o \u010demu c\u0301emo govoriti u nastavku.<\/li>\n<\/ol>\n<h4>Vi\u0161estruka imputacija pomoc\u0301u lan\u010danih jedna\u010dina, poznatih kao MICE<\/h4>\n<p>MICE algoritam se koristi kada se suo\u010dava sa problemom MAR nedostaju\u0107ih podataka \u2013 podaci koji nedostaju nasumi\u010dno, ali zavise od vidljivih varijabli. Obi\u010dno se sastoji od ovih koraka:<\/p>\n<ol>\n<li>Imputacija srednje vrednosti \u2013 svaka vrednost koja nedostaje za odre\u0111enu promenljivu se zamenjuje srednjom vredno\u0161c\u0301u za tu promenljivu;<\/li>\n<li>U ovom koraku se bira jedna promenljiva i njene popunjene nedostajuc\u0301e vrednosti se vrac\u0301aju na nultu vrednost;<\/li>\n<li>Regresivni model se pokrec\u0301e za posmatrane vrednosti promenljive iz koraka 2. U ovom regresivnom modelu, promenljiva iz drugog koraka se koristi kao zavisna, dok se (neke ili sve) druge promenljive koriste kao nezavisne;<\/li>\n<li>Vrednosti koje nedostaju za promenljivu iz koraka 2 se zatim zamenjuju regresiranim vrednostima dobijenim primenom obu\u010denog modela;<\/li>\n<li>Koraci 2-4 se zatim primenjuju za svaku promenljivu u skupu podataka. Iteracija kroz svaku od ovih promenljivih \u010dini jedan ciklus. Na kraju jednog ciklusa, sve vrednosti koje nedostaju su zamenjene predvi\u0111anjima iz regresija koje odra\u017eavaju odnose uo\u010dene u podacima;<\/li>\n<li>Koraci 2-4 se ponavljaju tokom nekoliko ciklusa, obi\u010dno deset. O\u010dekuje se da c\u0301e se koeficijenti regresije konvergirati do n-tog ciklusa, a rezultat je kompletan skup podataka.<\/li>\n<\/ol>\n<p>Laka logika, i \u0161to je jo\u0161 va\u017enije, do\u0161ao sam do tako lepe implementacije koja dodatno olak\u0161ava kori\u0161c\u0301enje ovog algoritma. Biblioteka se naziva <em>fancyimpute<\/em>, a samu biblioteku i dokumente mo\u017eete na\u0107i <a href=\"https:\/\/pypi.python.org\/pypi\/fancyimpute\" target=\"_blank\" rel=\"noopener\">ovde<\/a>. Kao i obi\u010dno, nec\u0301u vas mnogo gnjaviti sa kodom, mo\u017eete ga pronac\u0301i na linku, i to je zaista svega dva reda koda.<\/p>\n<p>Testirao sam ovu biblioteku na dva na\u010dina. Prvo sam je pokrenuo za objekat \u010dije su karakteristike bile u potpunosti ispunjene. Nasumi\u010dno sam postavio neke vrednosti na nulu, a zatim pokrenuo model. Nakon ovoga, izra\u010dunao sam RMSE izme\u0111u imputiranih i stvarnih vrednosti, i RMSE je bio prili\u010dno zadovoljavajuc\u0301i.<\/p>\n<p>Moj skup podataka za testiranje je izgledao ovako.<\/p>\n<p style=\"text-align: justify;\"><img decoding=\"async\" class=\"alignnone size-full wp-image-11655\" src=\"https:\/\/thingsolver.com\/wp-content\/uploads\/missing-data-3.png\" alt=\"\" width=\"1714\" height=\"970\" title=\"\" srcset=\"https:\/\/thingsolver.com\/wp-content\/uploads\/missing-data-3.png 1714w, https:\/\/thingsolver.com\/wp-content\/uploads\/missing-data-3-768x435.png 768w, https:\/\/thingsolver.com\/wp-content\/uploads\/missing-data-3-1536x869.png 1536w\" sizes=\"(max-width: 1714px) 100vw, 1714px\" \/><\/p>\n<p style=\"text-align: justify;\">Evo koda<\/p>\n<pre class=\"prettyprint\"># import the library\r\nfrom fancyimpute import  MICE\r\n\r\n# convert dataframe to matrix, to make it workable with\r\nX_incomplete_matrix = X_incomplete.as_matrix()\r\n\r\n# call the function to impute the values\r\nX_filled_mice = MICE(min_value=0).complete(X_incomplete_matrix)\r\n\r\n# make a dataframe out of results\r\nX_complete_with_mice = pd.DataFrame(X_filled_mice, columns = X_complete.columns)<\/pre>\n<p>Bilo je lako uporediti rezultate sa X_complete, koji je sadr\u017eao stvarne vrednosti. U nastavku mo\u017eete videti valjanost uklapanja.<\/p>\n<p style=\"text-align: justify;\"><img decoding=\"async\" class=\"alignnone size-large wp-image-11654\" src=\"https:\/\/thingsolver.com\/wp-content\/uploads\/missing-data-4-1601x1024.png\" alt=\"\" width=\"640\" height=\"409\" title=\"\" srcset=\"https:\/\/thingsolver.com\/wp-content\/uploads\/missing-data-4-1601x1024.png 1601w, https:\/\/thingsolver.com\/wp-content\/uploads\/missing-data-4-768x491.png 768w, https:\/\/thingsolver.com\/wp-content\/uploads\/missing-data-4-1536x983.png 1536w, https:\/\/thingsolver.com\/wp-content\/uploads\/missing-data-4.png 1710w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>Naravno, RMSE zavisi od broja nedostajuc\u0301ih vrednosti, \u0161to je vi\u0161e nedostajuc\u0301ih vrednosti \u2013 vec\u0301a je gre\u0161ka. Zato smo izveli jednu dodatnu funkciju za svaku instancu koja bi nam pomogla da radimo sa skupom podataka, tuma\u010dimo rezultate i donosimo odluke, \u0161to se naziva \u201epouzdanost\u201c. Pouzdanost jednaka 100 zna\u010di da instanca ima vrednosti za sve karakteristike, i ona se smanjuje kako se broj vrednosti koje nedostaju povec\u0301ava.<\/p>\n<p>Drugi na\u010din validacije uklju\u010divao je konsultacije sa stru\u010dnjakom za domen i njegovu re\u010d odobrenja. Zaklju\u010dili smo da su nedostajuc\u0301e vrednosti prili\u010dno precizno imputirane, tako da mo\u017eemo normalno da nastavimo sa analizom.<\/p>\n<p>U buduc\u0301nosti c\u0301u vi\u0161e istra\u017eivati druge metode rukovanja nedostajuc\u0301im vrednostima i ovde c\u0301u podeliti svoja iskustva. Bio bih srec\u0301an da \u010dujem da je neko probao i ovaj, ili bilo koji drugi algoritam implementiran u gore pomenutoj biblioteci. Naravno, ako imate bilo kakvih pitanja, molim vas, ne ustru\u010davajte se da komentari\u0161ete ispod, potrudic\u0301u se da odgovorim jasno i \u0161to je pre moguc\u0301e.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zdravo svima. Iako sam planirao da moj sledec\u0301i post bude o detekciji anomalija i njihovom tretmanu, suo\u010dio sam se sa drugom vrstom problema koji je brzo prerastao u ogroman problem koji uti\u010de na modeliranje i ta\u010dnost rezultata i nisam mogao &#8230; <\/p>\n<p class=\"read-more\"><a class=\"btn small\" href=\"https:\/\/thingsolver.com\/sr\/blog\/rukovanje-nedostajucim-podacima\/\">Pro\u010ditaj vi\u0161e<\/a><\/p>\n","protected":false},"author":3,"featured_media":15608,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[189],"tags":[266,267,268,269],"acf":[],"_links":{"self":[{"href":"https:\/\/thingsolver.com\/sr\/wp-json\/wp\/v2\/posts\/16972"}],"collection":[{"href":"https:\/\/thingsolver.com\/sr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thingsolver.com\/sr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thingsolver.com\/sr\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/thingsolver.com\/sr\/wp-json\/wp\/v2\/comments?post=16972"}],"version-history":[{"count":3,"href":"https:\/\/thingsolver.com\/sr\/wp-json\/wp\/v2\/posts\/16972\/revisions"}],"predecessor-version":[{"id":16975,"href":"https:\/\/thingsolver.com\/sr\/wp-json\/wp\/v2\/posts\/16972\/revisions\/16975"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thingsolver.com\/sr\/wp-json\/wp\/v2\/media\/15608"}],"wp:attachment":[{"href":"https:\/\/thingsolver.com\/sr\/wp-json\/wp\/v2\/media?parent=16972"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thingsolver.com\/sr\/wp-json\/wp\/v2\/categories?post=16972"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thingsolver.com\/sr\/wp-json\/wp\/v2\/tags?post=16972"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}