Ta članek je bil objavljen kot del Blogathon o znanosti o podatkih
Pregled
Podatki nam omogočajo analizo in napovedovanje dogodkov v prihodnosti. Vsak dan vse več podjetij sprejema tehnike podatkovne znanosti, kot so napovedovanje, združevanje v skupine itd. Čeprav se je še naprej učiti o zapletenih algoritmih ML in DL zelo zanimivo, ne smemo pozabiti obvladati bistvenega predobdelava podatkov. Eden od pomembnih delov predobdelave podatkov je obravnava manjkajočih vrednosti. To je popoln vodnik o tem, kako ravnati z različnimi vrstami manjkajočih podatkov.
vsebina
- Zakaj je pomembno obravnavati manjkajoče vrednosti?
- Razlogi za manjkajoče vrednosti
- Vrste manjkajočih vrednosti
- Preverite, ali v naboru podatkov manjkajo vrednosti
- Vizualizacija manjkajočih vrednosti
- Spuščanje vrstic z manjkajočimi vrednostmi
- Spuščanje stolpcev z manjkajočimi vrednostmi
- Imputacija za neprekinjene spremenljivke
- Imputacija s povprečjem
- Imputacija z mediano
- Predvidevanje manjkajočih vrednosti z regresijo
- Manjkajoče vrednosti v kategoričnih podatkih
- Manjkajoče vrednosti v podatkih časovnih nizov
- Manjkajoče vrednosti za izpolnitev naprej
- Manjkajoče vrednosti za zapolnitev nazaj
- Linearna interpolacija
- Algoritmi, odporni na manjkajoče vrednosti
- zaključek
Zakaj je pomembno obravnavati manjkajoče podatke?
Podatki v resničnem svetu imajo v večini primerov veliko manjkajočih podatkov. Razlogi, zakaj manjka vsaka vrednost, so lahko različni. Morda pride do izgube ali poškodovanja podatkov ali pa obstajajo tudi posebni razlogi. Manjkajoči podatki bodo zmanjšali napovedno moč vašega modela. Če uporabite algoritme z manjkajočimi podatki, bo prišlo do pristranskosti pri oceni parametrov. Ne morete biti prepričani v svoje rezultate, če ne ravnate z manjkajočimi podatki.
Razlogi za manjkajoče vrednosti
Ste se kdaj spraševali o razlogih za manjkajoče podatke v naborih podatkov?
Nekateri možni razlogi za manjkajoče podatke so:
- Ljudje ne dajejo informacij o določenih vprašanjih v anketi o zbiranju podatkov. Nekaterim na primer morda ne bo udobno deliti informacij o svoji plači, pitju in kajenju. To prebivalstvo namerno izpušča
- V nekaterih primerih se podatki zbirajo iz različnih razpoložljivih preteklih zapisov in ne neposredno. V tem primeru je korupcija podatkov veliko vprašanje. Zaradi nizkega vzdrževanja so nekateri deli podatkov poškodovani, kar povzroči manjkajoče podatke
- K manjkajočim podatkim prispevajo tudi netočnosti med postopkom zbiranja podatkov. Na primer, pri ročnem vnosu podatkov se je težko popolnoma izogniti človeškim napakam
- Neskladnosti opreme, ki vodijo do napačnih meritev, ki jih ni mogoče uporabiti.
Vrste manjkajočih vrednosti
Manjkajoči podatki se lahko pojavijo zaradi različnih razlogov. Lahko jih razvrstimo v tri glavne skupine: naključno manjkajo, naključno manjkajo, naključno ne manjkajo.
1. Popolnoma manjka naključno (MCAR)
Manjkajoči podatki ne sledijo določenemu vzorcu, so preprosto naključni. Manjkajoči ti podatki niso povezani ali neodvisni od preostalih spremenljivk. Teh vrednosti ni mogoče predvideti s preostalimi podatki spremenljivke. Na primer, med zbiranjem podatkov se določen vzorec zaradi neprevidnosti izgubi. To je idealen primer, kjer statistično analiza ne bo pristranska. Vendar ne smete domnevati prisotnosti MCAR, razen če ste zelo prepričani, saj je to redka situacija.
2. Manjka naključno (MAR)
Tukaj za razliko od MCAR manjkajo podatki med določenimi podskupinami. Ali bodo podatki prisotni/odsotni, je mogoče predvideti s pomočjo drugih funkcij. Vendar manjkajočih podatkov ne morete predvideti sami.
Na primer, razmislimo o raziskavi o času, porabljenem na internetu, ki ima razdelek o času, porabljenem na platformah, kot je Netflix, amazon prime. Opaženo je, da ga starejši (nad 45 let) manj verjetno zapolnijo kot mlajši. To je primer MAR. Tukaj parameter 'Starost' odloča, ali bodo podatki manjkali ali ne. MAR se pojavlja zelo pogosto kot MCAR.
3. Ne manjka naključno (NMAR)
To je resna in težavna situacija. Recimo, da je namen ankete meriti prekomerno uporabo/zasvojenost z družbenimi mediji. Če ljudje, ki pretirano uporabljajo družbena omrežja, ankete ne izpolnijo namerno, imamo primer NMAR. To bo najverjetneje vodilo do pristranskosti v rezultatih. Običajne metode, kot je izpad vrstic/stolpcev, pripisovanje ne bodo delovale. Za rešitev tega problema bi bilo potrebno poglobljeno poznavanje domene.
Zdaj, ko smo videli različne vrste manjkajočih podatkov, pojdimo naprej na različne načine ravnanja z njimi.
Preverite manjkajoče vrednosti
Ko imate nabor podatkov, je prvi korak preveriti, v katerih stolpcih manjkajo podatki in koliko. Uporabimo seveda najbolj znan nabor podatkov med podatki, ki se učijo o preživelem Titaniku! Preberite niz podatkov s funkcijo pandas read_csv, kot je prikazano spodaj.
train=pd.read_csv('../input/titanic/train.csv') test=pd.read_csv('../input/titanic/test.csv') print('Oblika podatkov o vadbi: ', train.shape ) print('Testiranje oblike podatkov: ', test.shape) train.head()
Vir: Slika iz Avtorjevega zvezka Kaggle
Zdaj imamo okvirje podatkov o usposabljanju in testiranju titanskih podatkov.
Kako preveriti, v katerih stolpcih manjkajo podatki in koliko?
Za to se uporablja funkcija "isnull()". Ko pokličete funkcijo vsote skupaj z isnull, je skupna vsota manjkajočih podatkov v vsakem stolpcu izhod.
missing_values = train.isnull (). sum () print (missing_values)
PassengerId 0 Preživel 0 Pclass 0 Ime 0 Spol 0 Starost 177 SibSp 0 Parch 0 Vstopnica 0 Vozovnica 0 Kabina 687 Vkrcano 2 dtype: int64
Upoštevajte, da 3 stolpci nimajo vrednosti: Starost, Kabina, Vkrcanje
Čeprav vemo, koliko vrednosti manjka v vsakem stolpcu, je bistveno vedeti njihov odstotek glede na skupne vrednosti. Izračunajmo torej to v eni vrstici kode.
mis_value_percent = 100 * train.isnull().sum() / len(vlak) print(mis_value_percent)
ID potnika 0.000000 Preživel 0.000000 Pclass 0.000000 Ime 0.000000 Spol 0.000000 Starost 19.865320 SibSp 0.000000 Parch 0.000000 Vstopnica 0.000000 Fare 0.000000 Kabina 77.104377 Vkrcano 0.224467 dtype: float64
Jasno je, da manjka 77 % stolpca 'Kabina', kar je zelo pomemben odstotek. Pri starosti manjka približno 19 % podatkov, Embarked pa le 0.2 % manjka. To je kvantitativna analiza manjkajočih podatkov, ki jih imamo. Kaj pa kvalitativno? Nadaljujte z branjem!
Vizualizacija manjkajočih vrednosti z Missingno
Ugani kaj? Imamo paket python, posebej za vizualizacijo in raziskovanje manjkajočih podatkov nabora podatkov. Paket python "Missingno". Pojdite in ga hitro namestite
pip install manjka
S tem lahko naredimo vizualizacije v obliki toplotnih zemljevidov, palic in matrik. Z analizo njihove porazdelitve lahko sklepate, v katero kategorijo spadajo MCAR, MAR ali NMAR. Prav tako lahko najdemo korelacijo stolpcev, ki vsebujejo manjkajoče, s ciljnim stolpcem
Začnite tako, da naredite palični grafikon za vrednosti, ki niso ničle, z uporabo funkcije 'bar()' knjižnice missingno. Tej funkciji ste posredovali podatkovni okvir pandas.
uvoz manjka kot msno msno.bar (vlak)
Vir: Slika iz Avtorjevega zvezka Kaggle
Nato lahko narišemo matrično vizualizacijo. To nam pomaga vedeti, kako se manjkajoči podatki porazdelijo po podatkih, torej če so lokalizirani ali enakomerno razporejeni, ali obstaja kakšen vzorec in številna takšna vprašanja.
msno.matrix(vlak)
Na matrični risbi boste videli prazne vrstice za vsak manjkajoči podatek. Upoštevajte, da ima stolpec 'Embarked' samo dva naključna manjkajoči podatka, ki ne sledita nobenemu vzorcu. Verjetno so se izgubili med pridobivanjem podatkov. Torej je to mogoče razvrstiti kot naključno pogrešano.
Stolpca za starost in kabino bi lahko bila MAR. Vendar želimo zagotoviti, da med njimi ni nobenih povezav.
Kako to narediti?
Na našo srečo paket missingno ponuja tudi funkcijo 'heatmap'. S tem lahko ugotovimo, ali obstajajo kakršne koli korelacije med manjkajočimi podatki različnih stolpcev.
msno.heatmap (vlak)
Izhod je prikazan!
Toplotni zemljevid kaže, da ni tako močne korelacije med manjkajočimi podatki v stolpcu Starost in Kabina. Torej lahko manjkajoče podatke teh stolpcev razvrstimo kot MAR ali naključno manjkajoče.
Upam, da vam je jasno, kako analizirati manjkajoče vrednosti. Nato bom prešel na razpravo o različnih načinih ravnanja s temi manjkajočimi podatki.
Spuščanje vrstic z manjkajočimi vrednostmi
To je preprosta metoda, pri kateri izpustimo vse vrstice, ki imajo manjkajoče vrednosti, ki pripadajo določenemu stolpcu. Čeprav je to enostavno, ima veliko pomanjkljivost. Morda boste na koncu izgubili velik del svojih podatkov. To bo zmanjšalo velikost vašega nabora podatkov in naredilo napovedi vašega modela pristranske. To uporabite le, če je število manjkajočih vrednosti zelo manjše.
Na primer, stolpec »Embarked« imata samo 2 manjkajoči vrednosti. Torej lahko spustimo vrstice, kjer ta stolpec manjka. Sledite spodnjemu odrezku kode.
print('Nabor podatkov pred :', len(vlak)) train.dropna(subset=['Embarked'],how='any',inplace=True) print('Nabor podatkov po :', len(vlak)) print( 'manjkajoče vrednosti :',train['Embarked'].isnull().sum())
Nabor podatkov pred : 891 Nabor podatkov po : 889 manjkajočih vrednosti : 0
Predstavljajte si, če bi storili enako za stolpec »Starost«. Izgubili bi približno 77 % svojih podatkov!
Spuščanje stolpcev
Ko ima stolpec velike manjkajoče vrednosti, nima smisla imputirati vrednosti z najmanj razpoložljivimi resničnimi podatki, ki jih imamo. Torej, če v katerem koli stolpcu manjka več kot 80 % vrednosti, lahko ta stolpec preprosto izpustite iz analize. V našem primeru 'Cabin' manjka 77 % podatkov, zato se lahko odločite, da ta stolpec opustite.
Prepričajte se, da izpuščeni stolpec ni ključnega pomena za vašo analizo. Če je tako, poskusite pridobiti več podatkov in nato pripisati manjkajoče vrednosti.
Imputacija za stalno spremenljivko
vlak ['Starost'][:10]
0 22.0 1 38.0 2 26.0 3 35.0 4 35.0 5 NaN 6 54.0 7 2.0 8 27.0 9 14.0 Ime: Starost, vrsta d: float64
train ['Age'] = train ['Age']. replace (np.NaN, train ['Age']. mean ()) train ['Age'] [: 10]
0 22.000000 1 38.000000 2 26.000000 3 35.000000 4 35.000000 5 29.699118 6 54.000000 7
Vidite lahko, da je bil 'NaN' nadomeščen z 29.699 (izračunano povprečje).
Povprečna imputacija ima določene pomanjkljivosti. Če imajo podatki zelo neenakomerno porazdelitev z veliko izstopajočimi vrednostmi, potem povprečje ne bo odražalo dejanske porazdelitve podatkov. Na povprečje močno vplivajo ekstremne vrednosti ali izstopajoči. Torej, če podatki nimajo veliko izstopajočih in sledijo skoraj normalni porazdelitvi, uporabite povprečno imputacijo
Imputacija z mediano
Manjkajoče vrednosti neprekinjenega elementa se lahko zapolni z mediano preostalih vrednosti, ki niso ničelne. Prednost mediane je, da nanjo ne vplivajo odstopanja, za razliko od povprečja. Naj ga implementiramo tukaj.
train['Age']=train['Age'].replace(np.NaN,train['Age'].median()) train['Age'][:10]
Opazite lahko, da je bila srednja vrednost (28.0) izpolnjena namesto vrednosti NaN.
Podobno lahko izvedete tudi imputiranje načina. Na splošno je imputacija z načinom priljubljena za kategorične manjkajoče vrednosti. To bom poglobljeno obravnaval v naslednjem razdelku
Predvidevanje manjkajočih vrednosti z regresijo
Namesto da bi na vseh mestih izpolnili eno samo povprečje ali mediano vrednost, kaj, če jih lahko napovemo s pomočjo drugih spremenljivk, ki jih imamo?
Ja! Funkcije z vrednostmi, ki niso ničelne, lahko uporabimo za napovedovanje manjkajočih vrednosti. Za napovedovanje manjkajočih vrednosti je mogoče zgraditi regresijski ali klasifikacijski model. Izvedimo to za stolpec »Starost« našega titanskega nabora podatkov.
Podatke lahko obdelamo za gradnjo modela. Funkcija »Starost« bo ciljna spremenljivka.
x_vlak: Vrstice nabora podatkov, ki imajo prisotno vrednost »Starost«, so filtrirane. Cilj je "starost" x_test: To je stolpec »Starost« z vrednostmi, ki niso nič
O y_vlak bo imel podatke, ki imajo manjkajoče vrednosti starosti, ki jih je treba predvideti (y_pred)
uvozi pande kot pd data=pd.read_csv('../input/titanic/train.csv') data = data[["Survived", "Pclass", "Sex", "SibSp", "Parch", "Fare "," Starost "]] data [" Sex "] = [1 if x ==" moški "else 0 for x in data [" Sex "]] test_data = data [data [" Age "]. Isnull ()] data.dropna(inplace=True) x_train = data.drop("Age", axis=1) x_test = test_data.drop("Age", axis=1) y_train = data["Age"]
Tem podatkom prilegamo linearni regresijski model. Tukaj bom uporabljal knjižnico sklearn.
iz sklearn.linear_model uvoz LinearRegression model = LinearRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test)
Zdaj imamo ničelne vrednosti stolpca Age, predvidene v y_pred.
Za vaše boljše razumevanje bom natisnil nekaj primerov testnega vnosa in predvidenega rezultata.
tiskanje (x_test [: 10])
Preživeli Pclass Sex SibSp Parch Fare 5 0 3 1 0 0 8.4583 17 1 2 1 0 0 13.0000 19 1 3 0 0 0 7.2250 26 0 3 1 0 0 7.2250 28 1 3 0 0 0 7.8792 29 0 3 1 0 0 7.8958 31 1 1 0 1 0 146.5208 32 1 3 0 0 0 7.7500 36 1 3 1 0 0 7.2292 42 0 3 1 0 0 7.8958
Tako se vhodi prenesejo v regresijski model. Poglejmo si predvidene starostne vrednosti.
natisni (y_pred[:10])
[29.07080066 30.10833306 22.44685065 29.08927347 22.43705181 29.07922599 32.43692984 22.43898701] 22.15615704 29.07922599
Hura! Dobili smo vrednote.
Manjkajoče vrednosti v kategoričnih podatkih
Do sedaj smo videli, kako ravnati z manjkajočimi številčnimi podatki. Kaj pa, če v primeru kategoričnega elementa manjkajo podatki? Na primer, funkcija »Kabina« podatkovnega niza Titanic je kategorična. Tukaj ne moremo izračunati srednje vrednosti in mediane. Tako lahko manjkajoče vrednosti zapolnimo z načinom ali najpogosteje pojavljajočim se razredom/kategorijo.
train['Cabin']=train['Cabin'].fillna(vlak['Cabin'].value_counts().index[0])
Če je odstotek manjkajočih vrednosti manjši, je ta metoda prednostna. Ne povzroča velike izgube podatkov in je statistično pomemben.
Če pa imate veliko manjkajočih vrednosti, potem ni smiselno pripisati najpogostejši razred. Namesto tega ustvarimo ločeno kategorijo za manjkajoče vrednosti, kot sta »Neznano« ali »Ni na voljo«. Število razredov se bo povečalo za enega.
Če so manjkajoče vrednosti iz stolpcev kategorij (niznih ali številskih), lahko manjkajoče vrednosti nadomestite z najpogostejšo kategorijo. Če je število manjkajočih vrednosti zelo veliko, ga lahko nadomestite z novo kategorijo.
train ['Cabin'] = train ['Cabin']. fillna ('Unknown') train ['Cabin'] [: 10]
Dobro deluje z majhnim naborom podatkov. Prav tako izniči izgubo podatkov z dodajanjem edinstvene kategorije.
Kako ravnati z manjkajočimi vrednostmi v podatkih časovnih vrst?
Nabori podatkov, kjer se informacije zbirajo skupaj s časovnimi žigi na urejen način, so označeni kot podatki časovne serije. Če v podatkih časovne serije manjkajo vrednosti, lahko očitno poskusite s katero koli od zgoraj obravnavanih metod. Vendar pa obstaja nekaj posebnih metod, ki jih je mogoče uporabiti tudi tukaj.
Za idejo bom ustvaril preprost lažni nabor podatkov.
time= pd.date_range("1/01/2021", periode=10, freq="W") df = pd.DataFrame(index=time); df ["Enote prodane"] = [5.0,4.0, np.nan, np.nan, 1.0, np.nan, 3.0,6.0, np.nan, 2.0]; natisni (df)
Preidimo na metode
Manjkajoče vrednosti za izpolnitev naprej
Vrednost naslednje vrstice bo uporabljena za zapolnitev manjkajoče vrednosti. 'ffill' pomeni 'naprej zapolni'. Izvedljivo je zelo enostavno. Preprosto morate posredovati parameter “method” kot “ffill” v funkciji fillna().
forward_filled=df.fillna(method='ffill') print(forward_filled)
Manjkajoče vrednosti za zapolnitev nazaj
Tukaj uporabimo vrednost prejšnje vrstice za zapolnitev manjkajoče vrednosti. 'bfill' pomeni polnjenje nazaj. Tukaj morate kot parameter metode posredovati 'bfill'.
backward_filled=df.fillna(method='bfill') print(backward_filled)
Upam, da boste z zgornjimi slikami opazili razliko v obeh primerih.
Linearna interpolacija
Podatki časovnih vrst imajo veliko različic. Zgornje metode imputiranja z uporabo zapolnitve in zapolnitve naprej niso najboljša možna rešitev. Linearna interpolacija na pomoč!
Tu so vrednosti napolnjene z naraščajočimi ali padajočimi vrednostmi. Gre za nekakšno tehniko imputacije, ki poskuša zarisati linearno razmerje med podatkovnimi točkami. Za izračun manjkajočih točk uporablja vrednosti, ki niso ničelne.
interpolirano = df.interpolate (limit_direction = "oba") tiskanje (interpolirano)
Primerjajte te vrednosti z zapolnitvijo nazaj in naprej in sami preverite, katera je dobra!
To je nekaj osnovnih načinov ravnanja z manjkajočimi vrednostmi v podatkih časovnih vrst
Algoritmi, odporni na manjkajoče vrednosti
Obstaja nekaj primerov, ko nič od naštetega ne deluje dobro. Vseeno morate narediti analizo. Nato se odločite za algoritme, ki podpirajo manjkajoče vrednosti. KNN (K najbližjih sosedov) je en tak algoritem. Manjkajoče vrednosti bo upošteval z večino K najbližjih vrednosti. Naključni gozd je tudi robusten za kategorične podatke z manjkajočimi vrednostmi. Številni algoritmi, ki temeljijo na drevesu odločitev, kot so XGBoost, Catboost podporni podatki z manjkajočimi vrednostmi.
zaključek
Če povzamemo, prvi korak je raziskati podatke in ugotoviti, katere spremenljivke imajo manjkajoče podatke, kolikšen je odstotek in v katero kategorijo spadajo. Po tem boste imeli strateško predstavo o tem, katere metode bi lahko poskusili. Koristni nasvet je, da poskusite Imputacijo z algoritmom K najbližjega soseda razen modela linearne regresije. Obstaja nekaj novejših metod, ki bi jih lahko poiskali z uporabo metod Datawig ali Hot-Deck Imputation, če zgornje metode ne delujejo.
Upam, da vam je bilo branje všeč.
Z mano se lahko povežete na: [e-pošta zaščitena]
Linkedin: predobdelava podatkov
- '
- 100
- 7
- 77
- 9
- pridobitev
- Prednost
- algoritem
- algoritmi
- vsi
- Amazon
- med
- Analiza
- analitika
- okoli
- članek
- BEST
- Building
- klic
- primeri
- Vzrok
- Charts
- Razvrstitev
- Koda
- Stolpec
- Podjetja
- Izračunajte
- Korupcija
- datum
- znanost o podatkih
- dan
- ponudba
- DID
- Drop
- padla
- dogodki
- Moda
- Feature
- Lastnosti
- prva
- fit
- sledi
- obrazec
- Naprej
- funkcija
- Prihodnost
- Giving
- vodi
- Ravnanje
- tukaj
- Kako
- Kako
- HTTPS
- velika
- Ideja
- slika
- Podatki
- Internet
- IT
- znanje
- velika
- vodi
- vodi
- učenje
- Knjižnica
- vrstica
- velika
- Večina
- Izdelava
- Zemljevidi
- Matrix
- merjenje
- mediji
- ML
- Model
- premikanje
- sosedi
- Netflix
- Ostalo
- Vzorec
- ljudje
- Platforme
- Popular
- moč
- napoved
- Napovedi
- predstaviti
- Python
- količinsko
- resnični svet
- Razlogi
- evidence
- zmanjša
- regresija
- REST
- Rezultati
- Znanost
- Občutek
- Serija
- Seks
- Enostavno
- Velikosti
- majhna
- So
- socialna
- družbeni mediji
- prodaja
- SOLVE
- Komercialni
- namaz
- Strateško
- podpora
- Anketa
- ciljna
- Test
- Testiranje
- Prihodnost
- čas
- usposabljanje
- us
- vrednost
- vizualizacija
- W
- Kaj je
- WHO
- delo
- deluje
- svet
- X
- let