Uvod v ravnanje z manjkajočimi vrednostmi od konca do konca

Izvorno vozlišče: 1121996

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

  1. Zakaj je pomembno obravnavati manjkajoče vrednosti?
  2. Razlogi za manjkajoče vrednosti
  3. Vrste manjkajočih vrednosti
  4. Preverite, ali v naboru podatkov manjkajo vrednosti
  5. Vizualizacija manjkajočih vrednosti
  6. Spuščanje vrstic z manjkajočimi vrednostmi
  7. Spuščanje stolpcev z manjkajočimi vrednostmi
  8. Imputacija za neprekinjene spremenljivke
    1. Imputacija s povprečjem
    2. Imputacija z mediano
  9. Predvidevanje manjkajočih vrednosti z regresijo
  10. Manjkajoče vrednosti v kategoričnih podatkih
  11. Manjkajoče vrednosti v podatkih časovnih nizov
    1. Manjkajoče vrednosti za izpolnitev naprej
    2. Manjkajoče vrednosti za zapolnitev nazaj
    3. Linearna interpolacija
  12. Algoritmi, odporni na manjkajoče vrednosti
  13. 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()

Manjkajoči podatki o vrednostih

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)

pogrešam | manjkajoče vrednostiVir: 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)
vrstica z vzorci

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 | manjkajoča vrednost

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]

pripis s povprečjem

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]

KABINA VRSTA | napolni na

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)

prodane enote

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)

naprej napolnjena

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)

zadnji del napolnjen

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)

Linearna interpolacija manjkajočih vrednosti

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

Mediji, prikazani v tem članku, niso v lasti Analytics Vidhya in se uporabljajo po presoji avtorja.

Vir: https://www.analyticsvidhya.com/blog/2021/10/end-to-end-introduction-to-handling-missing-values/

Časovni žig:

Več od Analitika Vidhya