Dzisiaj o tym, jak radzić sobie z brakującymi danymi. Zacznijmy od krótkiego cytatu.
„Życie jest jak pudełko czekoladek, nigdy nie wiesz, na co trafisz…”.
Forrest Gump
Jak jest z danymi?
Podobnie, choć jest niemal pewne, że prędzej czy później trafisz na brakujące dane. I choć nie me idealnego sposobu by ten brak czymś zastąpić to są metody, które pozwalają sobie z tym problemem radzić.
Zadasz sobie być może filozoficzne pytanie: „Po co zaprzątać sobie głowę brakującymi danymi?”
Praktyczny powód jest taki, że większość algorytmów nie działa poprawnie, jeżeli nie mamy kompletu danych. Wyjątkami od tej reguły są najnowsze biblioteki XGBoost, CatBoost i LighgtGBM.
Jakie więc mamy możliwości w zakresie radzenia sobie z brakiem danych? Praktycznie są 3 sposoby:
- braki usunąć,
- zrobić imputację (czyli zamienić brakujące dane na coś innego),
- oznaczyć miejsca gdzie danych brakuje a następnie zrobić imputację.
Jesteśmy dalej w klimacie Forresta Gumpa, pokażę więc 3 strategie, na przykładowym zbiorze o krewetkach.

Jeśli ktoś kojarzy Bubba, kolega Forresta z wojska lubił krewetki i wiedział o nich wszystko.
Forrest co nieco tej wiedzy zachował i postanowił zbierać informację na ich temat. Zostając poławiaczem krewetek, dorobił się zbioru danych, który wyglądał mniej więcej tak, jak poniżej.

Źródło: Opracowanie własne.
Da się zauważyć pewne braki (NaN) i warto coś z nimi zrobić jeśli ten zbiór miałby do czegoś posłużyć.
Spis Treści
Usuwanie Braków
Usuwanie brakujących danych intuicyjnie wydaje się mało optymalnym rozwiązaniem. Przy okazji usuwania braków, usuwamy część informacji, co sprowadza nas do dwóch wniosków:
- brak informacji może być informacją samą w sobie,
- w realnym świecie często musimy podejmować decyzję na podstawie niepełnej informacji.
No dobrze, ale jak w praktyce wygląda proste usunięcie braków?
Za pomocą funkcji dropna()
pozbywamy się wierszy gdzie jest NaN
.

Zamiast usuwać wiersze możemy usunąć kolumny z brakującymi danymi za pomocą dropna(axis=1)
.

Skrajny przykład, tego, jak sporo możemy stracić. Na tym etapie praca zakończona, bo nie ma już nad czym pracować.
Imputacja Wartości w Miejsce Braków
Imputacja też nie wydaje się do końca optymalna. Stosując nawet wyszukane metody wprowadzania danych, których nie znamy znowu:
- tracimy informację o tym, że nie mamy wszystkich danych,
- jeżeli stworzymy model do wprowadzania, wartości to dalej nie dodajemy żadnej realnej informacji. Staramy się odkryć wzór i powielić go dla danego atrybutu.
Jak więc podchodzimy do imputacji?
Zazwyczaj wprowadza się wartości, które można wyliczyć dla danego atrybutu typu: średnia, mediana, wartość minimalna, wartość maksymalna, najczęściej występująca wartość. Czasami wprowadza się 0 lub jakąś stałą wartość. Można skorzystać też z innych bardziej wyszukanych metod opisanych tutaj.
Przykład imputacja danych dla wszystkich braków (braki uzupełnimy 0).

Oznaczenie Braków i Imputacja
Ostatnia strategia polega na przyjęciu założenia, że brak danych jest także informacją, którą należałoby przekazać algorytmowi.
W tym celu należy stworzyć osobną kolumnę, która jest oznaczeniem miejsca, gdzie brakuje danych.
A co robimy z brakami?
Robimy imputację za pomocą metody, która wydaje nam się optymalna dla danego problemu.
Jak zatem wyglądałby scenariusz pracy z danymi dla tej strategi?
Dla kategorii, czyli kolumny Gatunek
tworzymy po prostu nową kategorię np. brak
. Tutaj nie trzeba już tworzyć osobnej kolumny informującej o brakujących danych.

Teraz braki w kolumnach numerycznych. Na bazie istniejących kolumn z brakami tworzymy nowe, które tam, gdzie mają 1.

Teraz imputacja brakujących danych, czyli to, co już znamy.

W ten sposób zachowaliśmy wszystkie dane łącznie, z informacją gdzie brakuje pierwotnych danych. Teraz dane są gotowe na następne etapy.
Podsumowanie
Poznałeś 3 strategie radzenia sobie z brakami:
- usuwanie,
- imputacja,
- oznaczenie braków w nowych kolumnach i imputacja.
Jeśli nie chcemy tracić informacji ze zbioru najbardziej optymalnym rozwiązaniem jest oznaczanie braków i imputacja.