Przygotowanie danych w środowisku R (PDF Available)
Transkrypt
Przygotowanie danych w środowisku R (PDF Available)
Przygotowanie danych w środowisku R Agnieszka Nowak-Brzezińska 3 maja 2011 Wprowadzenie Poprawność dokonanej analizy danych zależeć będzie przede wszystkim od tego jaka była jakość danych podlegających takiej analizie. Okazuje się, że bardzo często w rzeczywistych systemach (o dużych zbiorach danych wejściowych) zachodzi zjawisko tzw. niepoprawnych danych. Przez dane niepoprawne rozumieć będziemy dane niekompletne, błędne (zaszumione), dane niespójne. Czasami zdarza się także, że dane muszą ulec pewnym procedurom konwersji nim będą poddane analizie. Konwersja ta będzie miała za cel przekształcić te dane do postaci, jaka jest wymagana przez konkretną stosowaną metodę analizy, a która po prostu nie zmieni znaczenia danych a jedynie sprawi, że będzie je można bez obaw porównywać, agregować, wyliczać dla nich wszelkie potrzebne miary ich opisu. Tylko jakościowe dane pozwolą przecież wyprowadzić jakościowo poprawną nową wiedzę, będącą najczęściej rezultatem przeprowadzonych analiz. Wśród standardowych procedur przygotowania danych wymienia się: normalizację, standaryzację oraz wspomnianą wcześniej dyskretyzację. Treścią niniejszego rozdziału będą zatem podstawowe metody realizowane w ramach zadania przygotowania danych do analizy. Należą do nich więc kolejno: • Czyszczenie danych - gromadzone dane bardzo często zawierają szum informacyjny, w postaci niepoprawnych, brakujących czy nieistotnych informacji. Takie dane niepotrzebnie zwiększają objętość przetwarzanej informacji i niekorzystnie wpływają na otrzymywane wyniki. Dlatego istotne jest odpowiednie przefiltrowanie danych, tak by dalszej obróbce podlegały tylko przydatne informacje. • Integracja danych - bardzo często istnieją różnorodne źródła danych, które trzeba scalić w jeden zbiór. Związane to jest z różnymi modelami baz danych (relacyjny, obiektowy, hierarchiczny, sieciowy, itp.) lub ich reprezentacją. • Selekcja danych - tylko istotne dane pozyskuje się z bazy danych do zadań analitycznych. Ponieważ bardzo często analiza ma opierać się tylko na kilku wyspecyfikowanych czynnikach, toteż nie ma sensu poddawać przetwarzaniu wszystkich informacji zawartych w źródłowej bazie danych. 1 • Transformacja danych - dane w tej fazie muszą ulec transformacji lub konsolidacji w formy aprobowane dla dalszej eksploracji (np. sprowadzenie do postaci tabeli). Jest to podyktowane pewnymi ograniczeniami związanymi z systemami uczącymi, jak format wejściowy lub wydajność. • Eksploracja danych - najistotniejszym procesem całej operacji pozyskiwania wiedzy jest właśnie ta faza. Specjalnie zaprojektowane algorytmy przetwarzają dane, tak by w konsekwencji otrzymać użyteczną dla człowieka wiedzę. • Ocena wiedzy - faza ta jest używana do identyfikacji interesujących wzorców reprezentujących wiedzę. Ponieważ produktem wcześniejszego etapu może być ogromny zbiór różnych ogólnych opisów, to należy wybrać spośród nich tylko te, które najbardziej odpowiadają naszym założeniom. • Reprezentacja wiedzy - na tym etapie wykorzystuje się rozmaite techniki wizualizacji i reprezentacji informacji w celu przedstawienia odkrytej wiedzy użytkownikowi. Najlepsze opisy zbioru poddanego procesowi eksploracji wiedzy trzeba w sposób zrozumiały i łatwy do dalszej analizy (najlepiej w postaci graficznej) przedstawić użytkownikom [6]. Oczywistym jest zatem, że bez odpowiednich procedur przygotowania danych przed analizą nie możemy być do końca pewni rezultatów takiej analizy. Czasami wręcz wybrana metoda analizy wymusza niejako zastosowanie pewnych procedur przygotowania danych, np. chcąc zastosować pewne metryki pomiaru podobieństwa czy odległości między danymi, wektory opisujące te dane powinny zostać znormalizowane tak, aby po pierwsze dwa porównywane obiekty były wektorami tej samej długości, a po drugie, by każda z cech opisujących taki obiekt, została znormalizowana do jednego zakresu wartości. W rzeczywistych systemach o dużych zbiorach danych wejściowych najczęściej zachodzi zjawisko tzw. niepoprawnych danych. Wśród standardowych procedur przygotowania danych wymienia się: normalizację oraz dyskretyzację. 1 Problem niekompletności danych Zjawisko niekompletności wiąże się z brakującymi danymi. Dane takie są możliwe do uzupełnienia. Niekompletność taka może być chwilowa – nie jest dostępna dana w momencie jej wstawiania. Niekompletność może też wynikać z niedokładności urządzeń czy metod i wówczas dane takie są do oszacowania. Największy problem jest wówczas, gdy dane są niedostępne. Oznacza to bowiem, że dane takie nie są możliwe do uzupełnienia. Może ono przybierać różne formy: • Niepewność – gdy nie wiemy czy dane są poprawne, • Niedokładność – np. gdy mamy dane w postaci przedziałów: 100-200, dane opisowe : dość ciepło, • Niekompletność – nie znamy wartości atrybutu, 2 • Niespójność – np. jednemu obiektowi są przypisane różne wartości, • Ignorancja – gdy mamy brak wiedzy. 1.1 Postępowanie z niekompletnością danych Możemy zastosować jedną z kilku metod: 1. Usuwanie niekompletności danych, 2. Pomijanie obiektów zawierających braki danych, 3. W bazach transakcyjnych pomijanie brakującego atrybutu, 4. Zastępowanie brakujących wartości: • Użycie stałej – np. nowej nie występującej w zbiorze wartości danego atrybutu • Użycie mody, mediany, wartości średniej dla wartości danego atrybutu • Użycie metod eksploracji danych – np. k-najbliższych sąsiadów gdzie porównujemy obiekt z brakującą wartością z obiektami sąsiednimi i na ich podstawie odtwarzamy brakujący atrybut. Oczywiście można też użyć tzw. metod statystycznych. Zaliczamy do nich takie metody jak: procedury oparte na kompletnych rekordach – gdy mało braków, metody ważące – polegające na ustawianiu wag rekordów by zminimalizować odchylenia związane z brakami, a także metody oparte o uzupełnianie danych: za pomocą średnich, mediany, regresji czy chociażby badaniu korelacji. Są także procedury oparte o modele prawdopodobieństw, gdzie definiuje się model kompletnych danych i zależności są wyliczane na podstawie rozkładu prawdopodobieństw. 2 Metody normalizacji danych Normalizacja danych to skalowanie pierwotnych danych (np. danych wejściowych) do małego, specyficznego przedziału, np. do przedziału [−1, 1] lub [0, 1], czyli przedziałów najbardziej przydatnych podczas rozważania zagadnień związanych z sieciami neuronowymi czy eksploracją danych. Korzyści z normalizacji danych są widoczne także w narzędziach, które teoretycznie nie wymagają normalizacji. Na przykład efektywność algorytmu najbliższego sąsiada (ang. k-nearest neighbor (knn), omówionego dokładnie w pracy) korzystającego z metryki euklidesowej zależy od poprawnego przeskalowania danych wejściowych. W tym przypadku warto znormalizować te dane. Jeśli tego nie zrobimy to dane o dużych wartościach mogą zatrzeć te o wartościach małych i tym samym zniekształcić metrykę. Niektóre rodzaje normalizacji mogą także okazać się potrzebne w celu uniknięcia problemów numerycznych takich jak (np.) utrata precyzyjności danych przy działaniach na liczbach zmiennoprzecinkowych. Normalizację danych 3 można przeprowadzić przy pomocy kilku prostych metod: normalizacji min − max, normalizacji Z-score (lub Zero-Mean) czy chociażby normalizacja poprzez skalowanie decymalne. Normalizację danych można przeprowadzić przy pomocy kilku prostych metod: 2.1 Normalizacja metodą Min-Max Ta metoda przeprowadza liniową transformację pierwotnych danych najczęściej do przedziału [0, 1] według wzoru: V′ = V − min ∗ (new max − new min) + new min max − min gdzie [min, max] jest oryginalnym przedziałem, w którym mieszczą się dane wejściowe, natomiast [new min, new max] jest nowym przedziałem danych. Atutem tej metody jest to, że zachowuje ona prawidłowe relacje pomiędzy wartościami. Nie wprowadza ona żadnych potencjalnych odchyleń od wartości. Wadą metody jest to, że możemy napotkać błędy, jeśli dane wejściowe przekroczą zadany pierwotnie przedział [mix, max]. 2.2 Normalizacja metodą Z-score (ang. Zero-mean Nazwa metody wywodzi się z jej własności, zgodnie z którą po normalizacji wartość średnia powinna wynosić 0. Normalizacja danych polega na transformacji danych wg wzoru: value − x v′ = , std dev gdzie v to wartość przed normalizacją, x to wartość będąca średnią dla całego normalizowanego zbioru, zaś std dev to odchylenie standardowe. 3 Dyskretyzacja Dyskretyzacja jest procesem w którym wartości dla atrybutów ciągłych są zastępowane wartością dyskretną, odpowiadającą pewnemu przedziałowi ciągłych wartości oryginalnego atrybutu. Przedziały te są uporządkowane, co sprawia, że w wyniku dyskretyzacji otrzymujemy zamiast atrybutu ciągłego atrybut porządkowy o skończonej liczbie wartości. Najczęściej stosowana jest jedna z dwóch metod dyskretyzacji wg równiej szerokości bądź równej częstości. Pierwsza nakazuje podzielić dziedzinę na n równych przedziałów, i następnie przyporządkować im wartość dyskretną. Druga - wg równej częstości - dzieli dziedzinę atrybutu na n przedziałów, w taki sposób, aby każdy z nich zawierał dokładnie taką samą ustaloną liczbę przedziałów, wówczas wartości dyskretne będą rozkładały się równomiernie. Na koniec należy wspomnieć o metodzie dyskretyzacji z wykorzystaniem wiedzy eksperta, która stanowi swoiste rozszerzenie metody dyskretyzacji wg równej szerokości. Tutaj dzielenie dziedziny wartości atrybutu wykonywane jest przez eksperta znającego dziedzinę przetwarzanych 4 danych. Kierując się swoją wiedzą i doświadczeniem ekspert jest w stanie poprawnie określić parametry dyskretyzacji [2]. Dyskretyzacja wartości atrybutów jest ważnym elementem w algorytmach budowy drzew decyzyjnych tj. ID3 jak i C4.5. Proces ten przeprowadzany jest na danych wejściowych, polega na zamianie ciągłych wartości atrybutów na odpowiadające im wartości dyskretne. Wartość dyskretna jest generowana z przedziału wartości ciągłych, które poddajemy dyskretyzacji. Wynikiem dyskretyzacji jest zatem atrybut posiadający skończony zbiór wartości. Istnieje wiele różnych metod dyskretyzacji wśród nich możemy wyróżnić: • metody prymitywne i zaawansowane - metody prymitywne w przeciwieństwie do metod zaawansowanych nie biorą pod uwagę rozkładu wartości atrybutów i rozkładu klas decyzyjnych, z góry dzielą zakres wartości atrybutu na pewną liczbę przedziałów, zaawansowane natomiast dopasowują sposób dyskretyzacji do przetwarzanego zbioru wartości atrybutów, • globalne i lokalne - metody globalne działają tylko na jednym wybranym atrybucie, wartości dyskretne tworzone są wyłącznie na podstawie wartości ciągłych tego atrybutu, metody lokalne uwzględniają pozostałe atrybuty na przykład w tworzeniu podzbiorów wartości atrybutów - wówczas wartości jednego atrybutu zależą od pozostałych, następnie na podstawie takich podzbiorów powstają wartości dyskretne, • metody z nadzorem i bez nadzoru - w przypadku dyskretyzacji metodą z nadzorem - inaczej niż w przypadku metod bez nadzoru - znane są klasy decyzyjne atrybutów, dzięki temu podczas tworzenia zbioru atrybutów dyskretnych, możliwe jest lepszy dobór przedziałów dzięki czemu nowe atrybuty dyskretne będą lepiej reprezentowały końcowe klasy decyzyjne, • metody wstępujące i zstępujące - ostatni podział metod jest wprowadzany po to, by pokazać realizację procesu dyskretyzacji na dwa różne sposoby, za pomocą techniki wstępującej oraz zstępującej, w algorytmie zstępującym wybieramy kolejne wartości progowe dzieląc w ten sposób dziedzinę atrybutu na przedziały, natomiast w przypadku algorytmu wstępującego dzielimy dziedzinę atrybutu na przedziały - w każdym przedziale znajduje się jedna wartość atrybutu, następnie odpowiednie przedziały są łączone w większe. W ramach przedstawionego podziału możemy wyróżnić kilka metod, które są wykorzystywane w różnych algorytmach, często nawet bardzo skomplikowanych po to, aby przygotować dane wejściowe: • dyskretyzacja naiwna - jest to najprostsza z prezentowanych metod sprowadza się do zastąpienia rzeczywistej wartości danych wartością całkowitą. Metoda ta nie uwzględnia specyfiki danych, których wartość jest dyskretyzowana, ponieważ dla dwóch bliskich sobie wartości rzeczywistych tego samego atrybutu, możemy otrzymać bardzo oddalone od siebie wartości naturalne. Innymi słowy możemy otrzymać różne wartości dyskretne dla danych należących do tej samej grupy wartości ciągłych, ponieważ algorytm nie 5 grupuje ich przed dyskretyzacją. Kolejną wadą metody jest utrata informacji pierwotnych - nie wiemy jaka wartość rzeczywista kryje się pod wartością ciągłą, taka informacja jest przydatna w momencie dodawania nowych wartości rzeczywistych z jednoczesną ich dyskretyzacją. W najgorszym przypadku może mieć miejsce sytuacja, w której jedna wartość rzeczywista została przekształcona na dwie różne wartości dyskretne. Problem ten łatwo rozwiązać poprzez zapisywanie dwójek (wartość rzeczywista, wartość dyskretna), jednak do tego potrzebna jest dodatkowa pamięć komputera. • dyskretyzacja według równej szerokości (ang. equal width intervals) znana także pod nazwą ang. binning - dzieląca dziedzinę na k równych przedziałów, a następnie przyporządkowująca im wartości dyskretne. W tej metodzie dokonywane jest grupowanie pierwotnych wartości atrybutów, dlatego jedna wartość dyskretna odpowiada całej grupie wartości rzeczywistych. Wartość dyskretną możemy obliczyć ze wzoru: range = minV alue − maxV alue S[a] gdzie: – range - oznacza wartość dyskretną, – a - oznacza atrybut, – S[a] - wektor określający liczbę przedziałów wartości atrybutu a, – minV alue, maxV alue - odpowiednio minimalną i maksymalną wartość atrybutu. Wówczas wartości odpowiednich przedziałów będą następujące: minV alue + range, minV alue + 2 ∗ range, . . . , minV alue + (N − 1) ∗ range Metody ustalenia wartości S[a] mogą być następujące: – formuła Sturges’a: k = log2 (n + 1), gdzie n to liczba obserwacji. −1 – formuła Friedman-Diaconis’a: W = 2 ∗ IQR ∗ n 3 , gdzie alue IQR = Q3 − Q1, wtedy k = maxV alue−minV . W – formuła Scott’sa: W = 3.5∗s∗n alue wtedy k = maxV alue−minV . n −1 3 gdzie s to odchylenie standardowe, • dyskretyzacja według równej częstości (ang. equal frequency intervals) zadaniem tej metody jest dzielenie dziedziny atrybutu na n przedziałów w taki sposób, aby każdy z nich zawierał dokładnie taką samą ustaloną liczbę przykładów - wówczas wartości dyskretne będą rozkładały się równomiernie. Identycznie jak w metodzie opisywanej powyżej ma miejsce odwzorowanie 6 w odpowiedniej wartości dyskretnej całego przedziału wartości rzeczywistych. Również podobnie jak w metodzie dyskretyzacji według równej szerokości dodanie nowych wartości nie stanowi problemu, proces ten wymaga uprzedniego utworzenia przedziałów - na podstawie przeprowadzonego procesu dyskretyzacji - dla których zapiszemy relewantne wartości dyskretne, jednocześnie dodanie nowej wartości zaburzy stworzony równomierny rozkład wartości atrybutu. • dyskretyzacja z wykorzystaniem wiedzy eksperta - metoda ta stanowi swoiste rozszerzenie metody dyskretyzacji według równej szerokości. Dzielenie dziedziny wartości atrybutu wykonywane jest przez eksperta znającego dziedzinę przetwarzanych danych. Kierując się swoją wiedzą i doświadczeniem ekspert jest w stanie poprawnie określić parametry dyskretyzacji. Tak utworzona struktura dziedziny wartości atrybutu dużo lepiej będzie opowiadała prawdziwemu charakterowi danych, niż struktura dziedziny uzyskana w jeden ze sposobów przytaczanych powyżej. Dodatkowo należy zwrócić uwagę na to, że przedziały których autorem jest ekspert powinny być logicznie poprawne - powinny zawierać wszystkie dopuszczalne wartości atrybutów, a także powinny być rozłączne. Jeśli natomiast chodzi o dodawanie nowych wartości, wykonywane jest w ten sam sposób jak w przypadku metody dyskretyzacji względem równej szerokości. 3.1 Efekty dyskretyzacji Dzięki dyskretyzacji można redukować rozmiar danych co ma zastosowanie w teorii zbiorów przybliżonych, a także poprawia się dokładność klasyfikacji danych. Dyskretyzacja wg równej długości przedziałów cechuje się małą odpornością na odchylenia w danych i łatwością jej zastosowania w praktyce. Metoda dyskretyzacji wg równej częstości z kolei dostarcza dobrego skalowania danych. Należy pamiętać, że to od odpowiedniego przygotowania danych do analizy, a więc często i od tego czy dokonano dyskretyzacji czy nie, zależy skuteczność dokonanych analiz danych. Czasami wręcz niektóre metody analizy danych wymagają dyskretyzacji danych ciągłych do danych nominalnych. 4 Przygotowanie danych do analizy w środowisku R Wszystkie omówione metody przygotowania danych do analizy możliwe są do wykorzystania w praktyce w środowisku R dzięki pakietowi dprep który należy ściągnąć ze strony http://math.uprm.edu/~edgar/dprep. Nie jest on już domyślnie instalowany ze środowiskiem R. Po ściągnięciu odpowiedniej wersji (.zip) należy w menu środowiska R wybrać opcję Packages i dalej opcję Install package(s) from local zip files... 7 Pakiet pozwala na realizację takich podstawowych metod przygotowania danych do analizy (ang. preprocessing danych) jak: normalizacja danych, radzenie sobie z wartościami pustymi, wykrywanie odchyleń w danych, selekcja cech, wizualizacja danych oraz dyskretyzacja. 4.1 Wykrywanie odchyleń w danych w środowisku R W środowisku R, a konkretnie pakiecie dprep, który analizujemy, istnieje kilka funkcji do wykrywania odchyleń w danych. Jedną z nich jest funkcja outbox która nie tylko wyszukuje numer obserwacji będącej odchyleniem od reszty danych i jej przynależność do klasy decyzyjnej ale i przedstawia całość obserwacji w formie wykresów typu boxplot dla każdej zmiennej z zaznaczeniem odchyleń jako punkty (kółeczka) występujące poza zakresem minimalnej i maksymalnej wartości w zbiorze zaznaczanych jak wiadomo na wykresach typu skrzynkowego. A więc efektem wywołania następującego kodu: > data(my.iris) > outbox(my.iris,nclass=3) będzie 107 1 2 3 4 5 6 7 8 oraz rysunek 1. V1 V2 V3 V4 Rysunek 1: Wykres skrzynkowy z zaznaczonymi brakami w danych Z kolei funkcja robout pozwala znaleźć w zbiorze danych odchylenia najczęściej występujące i przedstawia je nie tylko w formie raportu ale i graficznie na wykresie (rysunek 2). Wystarczy wywołać kod: > robout(my.iris,1,"mcd") 8 a efekt jest następujący: Top outliers by frequency 24 44 9 9 Top outliers by outlyngness measure 44 24 6.58779 5.99156 $outme 44 6.5877899 34 3.5373205 17 2.7198437 36 2.1079701 20 1.6547213 48 1.3940909 40 0.6123756 24 5.9915604 27 3.4704872 21 2.6612319 7 2.0920014 41 1.5520601 49 1.3860193 8 0.4750094 42 5.7701786 15 3.4696800 22 2.6108507 9 1.8845730 12 1.5411821 18 1.2740189 33 4.9935212 25 3.4614118 43 2.5607100 2 1.7911000 5 1.5338109 4 1.2537157 23 4.8004126 6 3.2761108 26 2.4699776 13 1.7488149 31 1.5114720 29 1.0500972 45 4.3582832 16 3.2146089 47 2.4073970 38 1.6597160 11 1.4848888 28 0.8365701 32 4.2422644 19 3.1245381 37 2.3594460 35 1.6597160 3 1.4694152 1 0.8247772 14 4.0030499 46 2.7705337 39 2.1292181 10 1.6597160 30 1.4259544 50 0.6194753 5 24 42 33 23 4 45 32 14 2 3 3427 1 Mahalabobis distance( mcd ) 6 44 0 10 20 30 40 50 Index Rysunek 2: Wykres skrzynkowy z zaznaczonymi brakami w danych Trzecią funkcją do wyznaczenia odchyleń w danych będzie funkcja lofactor która znajduje lokalne odchylenia w macierzy danych z k najbliższymi sąsiadami. LOF jest miarą odchylenia obliczanego dla każdej obserwacji. To użytkownik ostatecznie decyduje o tym, czy daną obserwację uznać za odchylenie czy nie. Do obliczenia wartości LOF używamy gęstości sąsiedztwa analizowanej obserwacji. Drugi argument funkcji lofactor zawiera liczbę k oznaczającą ilu najbliższych sąsiadów ma być użytych do obliczenia gęstości. Efektem wywołania kodu: > iris.lof=lofactor(my.iris,10) > show(iris.lof) 9 będzie następujący wykaz obliczeń wartości LOF dla każdej obserwacji w zbiorze biorąc pod uwagę 10 jej najbliższych sąsiadów: [1] [8] [15] [22] [29] [36] [43] [50] [57] [64] [71] [78] [85] [92] [99] [106] [113] [120] [127] [134] [141] [148] 4.2 0.9581969 0.9792416 1.4203019 1.0027929 0.9829436 1.0564275 1.1730778 0.9939653 1.0140522 1.0121464 1.1841296 1.1074529 1.1398076 0.9742740 1.5277244 1.1366996 0.9768335 1.1947831 0.9792505 1.0353371 0.9971380 0.9973641 1.0047463 1.2324309 1.5892208 1.7035839 0.9838170 1.1502635 1.2870963 1.0843155 1.5075267 1.1343224 1.0420283 0.9926024 1.1254503 0.9687127 0.9578426 1.9451016 1.0681264 0.9864902 0.9746749 1.2060393 1.0462935 1.1140898 1.0027536 0.9738517 1.1543555 1.2197431 0.9929783 0.9738517 1.2636391 0.9848446 0.9828140 1.0104820 1.1178445 1.1875462 1.0352909 1.4341384 1.1410092 1.1523481 1.1385437 1.0617244 0.9696601 1.1450440 1.0244256 1.0013805 1.0108901 1.0419488 0.9690014 1.3848270 1.1049354 1.1858956 0.9867999 1.0836548 1.1278327 1.0374934 1.0086051 1.0718922 1.2213143 0.9770089 1.0244256 1.1697578 1.0034204 1.1936765 1.2117282 1.0553401 0.9949366 0.9802501 1.0347723 1.2522592 1.0318232 1.1943079 0.9543201 1.0979794 1.0528158 1.4583470 0.9597265 0.9717681 1.0944867 0.9712212 0.9740332 1.0682760 1.2761094 0.9769029 0.9722070 1.1421662 0.9872755 1.0293931 1.1033172 0.9867999 1.0635534 1.0182545 1.3142690 0.9551352 0.9970427 0.9650941 0.9975040 1.3384609 0.9916255 0.9747153 1.0045347 0.9829745 1.0126736 1.0139641 1.2640817 0.9910330 1.2609661 1.0035224 1.0128562 1.1322305 1.4676587 1.1409043 0.9948480 0.9738517 2.1566984 1.0158291 1.0135954 1.1861766 1.0303722 1.0338548 1.2246989 1.0211672 0.9868132 0.9947341 0.9893727 1.2613618 1.1495225 0.9651712 0.9867387 0.9978787 Postępowanie z danymi niekompletnymi w środowisku R Rozważymy tylko dwie metody radzenia sobie z niekompletnością w danych. Najpopularniejszą metodą jest zastępowanie braków w danych wartością średnią z pozostałych wartości danej zmiennej (z pozostałych obserwacji w rozważanym zbiorze danych) bądź wartością najczęściej występującą w zbiorze obserwacji. Pierwszy sposób dedykowany jest dla danych ilościowych zaś drugi - jakościowych. Tę metodę można zastosować w praktyce w środowisku R za pomocą pakietu dprep i kilku różnych funkcji: ce.impute, ce.knn.imp czy ce.mimp. Uwaga: Zbiory danych, dla których możemy zastosować metody wykrywania niekompletności w danych i potem dla których możemy tę niekompletność usuwać niestety muszą być zapisane w pakiecie /verb+dprep+ w folderze data jest plik o nazwie filelist w którym zapisane są zbiory danych, które można analizować. Wtedy wystarczy odwołać się do wybranego zbioru funkcją data() w której jako argument podajemy nazwę zbioru danych (w naszym przypadku skorzystamy ze zbioru o nazwie hepatitis). Jest to zbiór 155 obserwacji opisanych 19 atrybutami warunkowymi i jednym atrybutem decyzyjnym. Wartości brakujące zaznaczone są symbolem „?”. Usuwanie niekompletności w danych za pomocą funkcji ce.impute > daneMean<-ce.impute(hepatitis,"mean",1:19) Summary of imputations using substitution of mean (mode for nominal features): Row Column Class Imput.value [1,] 1 19 2 66.571429 [2,] 2 19 2 66.571429 10 [3,] [4,] [5,] [6,] [7,] ... [163,] [164,] [165,] [166,] [167,] 3 4 5 5 7 19 4 16 19 15 2 2 2 2 1 66.571429 1.540984 101.313725 66.571429 2.543333 149 150 151 152 153 19 19 16 19 19 2 2 1 2 2 66.571429 66.571429 122.375000 66.571429 66.571429 Total number of imputations per class: Class 1 : 45 Class 2 : 122 Total number of imputations: 167 Jak widać w kolumnie Imput.value zostaje wstawiana wartość średnia. Na koniec widzimy statystyki ile wartości było brakujących i jak się one rozkładały na poszczególne klasy decyzyjne. Usuwanie niekompletności w danych za pomocą funkcji ce.mimp Funkcja ce.mimp wykrywa braki w danych w ramach klasy, zastępuje te braki wartością średniej bądź mediany (w zależności od wyboru użytkownika). Jeśli brakuje danej nominalnej wówczas wstawiana jest moda (wartość najczęściej występująca w ramach cechy, której wartości brakuje przy analizowanej obserwacji). > daneMedian <-ce.mimp(hepatitis,"median",1:19) Summary of imputations using substitution of for nominal features): Row Column Class Imput.value [1,] 1 19 2 66.00 [2,] 2 19 2 66.00 [3,] 3 19 2 66.00 [4,] 4 4 2 2.00 [5,] 5 16 2 85.00 [6,] 5 19 2 66.00 [7,] 7 15 1 1.95 [8,] 7 16 1 113.50 [9,] 7 17 1 66.00 [10,] 7 18 1 3.30 ... [164,] 150 19 2 66.00 [165,] 151 16 1 113.50 [166,] 152 19 2 66.00 [167,] 153 19 2 66.00 Total number of imputations per class: Class 1 : 45 11 median (mode Class 2 : 122 Total number of imputations: 167 Jak łatwo zauważyć funkcja ta działa dokładnie tak samo jak funkcja ce.impute. Tutaj widzimy jej efekt gdy jako metodę usuwania niekompletności użyjemy wartości mediany. Usuwanie niekompletności w danych za pomocą funkcji ce.knn.imp Metoda ta wykorzystuje do zastępowania braków w danych wartość średnia występująca w k najbliższych sąsiadach danej obserwacji w której brakuje wartości określonej cechy. Oczywiście jeśli brakuje wartości nominalnej będzie brana pod uwagę wartość dominująca w zbiorze obserwacji zaliczonych do k najbliższych sąsiadów danej obserwacji. Funkcja jako ostatni argument (k1 w poniższym przykładzie) zawiera liczbę sąsiadów, których rozważamy. Jak można się łatwo domyśleć, funkcja ta będzie więc mocno zależna od podanej wartości dla tego parametru. Jeśli podamy zbyt małą liczbę może się zdarzyć, że jakość takiego postępowania będzie bardzo niska. Przypadek taki wystąpi jeśli np wśród 10 najbliższych sąsiadów będzie dwóch z wartością yes i osiem z wartością no ale ponieważ użyjemy 3 najbliższych sąsiadów i akurat dla analizowanej obserwacji trzema najbliższymi sąsiadami będą te 2 z wartością yes (która jest tak naprawdę mniej liczna) i 1 z wartością no. Problem z właściwym wyborem wartości dla parametru k jest dość istotną wadą metody knn. > hepa.knnimp=ce.knn.imp(hepatitis,natr=c(1,3:14),k1=10) > show(hepa.knnimp) V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 7 1 51 1 1 2 1 2 1 2 2 1 1 2 2 2.15 105.0 31 1 39 1 1 1 1 1 2 2 1 2 2 2 2 2.30 280.0 32 1 62 1 1 2 1 1 2 2 2 2 2 2 2 1.00 130.6 36 1 37 1 2 2 1 2 2 2 2 2 1 2 2 0.60 67.0 68 1 57 1 2 2 1 1 1 2 2 2 1 1 2 4.10 112.6 72 1 34 1 1 2 1 1 2 1 1 2 1 2 2 2.80 127.0 77 1 58 1 2 2 1 2 2 1 1 1 1 2 2 2.00 167.0 87 2 44 1 1 2 1 1 2 2 2 1 2 2 1 0.90 135.0 88 2 30 1 2 2 1 1 1 2 1 2 1 1 1 2.50 165.0 .... 150 2 36 1 2 2 2 2 2 2 2 2 2 2 2 0.60 120.0 152 2 44 1 2 2 1 2 2 2 1 2 2 2 2 0.90 126.0 153 2 61 1 1 2 1 1 2 1 1 2 1 2 2 0.80 75.0 154 2 53 2 1 2 1 2 2 2 2 1 1 2 1 1.50 81.0 ... ... ... ... ... ... ... ... ... ... ... ... ... ... Jest też druga funkcja: ec.knnimp > data(hepatitis) > x.knnimp=ec.knnimp(hepatitis,k=10) > show(x.knnimp) V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 12 V15 ... 1 2 3 4 ... 150 151 152 153 154 155 1 1 1 1 30 50 78 31 2 1 1 1 1.0 1.0 2.0 1.5 2 2 2 1 2.0 1.0 1.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 1.0 1.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 1.00 0.90 0.70 0.70 ... ... ... ... 2 2 2 2 2 2 36 46 44 61 53 43 1 1 1 1 2 1 2.0 2.0 2.0 1.0 1.0 2.0 2 2 2 2 2 2 2.0 1.0 1.0 1.0 1.0 1.0 2.0 1.0 2.0 1.0 2.0 2.0 2.0 1.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 1.0 2.0 2.0 2.0 2.0 1.0 1.0 2.0 2.0 2.0 2.0 2.0 2.0 1.0 1.0 2.0 1.0 2.0 1.0 1.0 1.0 2.0 1.0 2.0 2.0 2.0 1.0 2.0 1.0 2.0 2.0 1.0 2.0 0.60 7.60 0.90 0.80 1.50 1.20 ... ... ... ... ... ... Jak można wyczytać w dokumentacji pakietu dprep funkcja ta tak naprawdę wywołuje funkcję ce.knn.imp. Różnica polega na tym, że tutaj nie jest brana pod uwagę przynależność do klasy. Wizualizacja braków w danych Niezwykle użyteczna może być funkcja imagmiss pozwalające wizualizować braki w zbiorze danych. Wywołując dla zbioru hepatitis tę funkcję potrzebujemy nie tylko raport wyglądający następująco: > imagmiss(hepatitis) Report on missing values for : Number of missing values overall: 167 Percent of missing values overall: 5.670628 Features with missing values (percent): V4 V6 V7 V8 V9 V10 ... 0.6451613 0.6451613 0.6451613 0.6451613 6.4516129 7.0967742 ... Percent of features with missing values: 78.94737 Number of instances with missing values: 75 Percent of instances with missing values: 48.3871 ale i obraz braków w danych, który możemy zapisać w dowolnym formacie. 4.3 Dyskretyzacja danych w środowisku R Dyskretyzacja metodą równego podziału: disc.ew Metoda disc.ew realizuje dyskretyzację metodą podziałów równej długości (ang. equal width). > dane<-read.table("c:\\daneDisc.txt",header=TRUE, row.names=1) > summary(dane) V1 V2 V3 V4 Min. :4.600 Min. :2.300 Min. :1.40 Min. :0.2000 1st Qu.:5.050 1st Qu.:3.050 1st Qu.:1.45 1st Qu.:0.2000 Median :5.300 Median :3.200 Median :1.90 Median :0.4000 13 Mean :5.655 3rd Qu.:6.450 Max. :7.000 V5 Min. :1.000 1st Qu.:1.000 Median :1.000 Mean :1.455 3rd Qu.:2.000 Max. :2.000 Mean :3.218 3rd Qu.:3.500 Max. :3.800 Mean :2.90 3rd Qu.:4.55 Max. :4.90 Mean :0.7909 3rd Qu.:1.4500 Max. :1.5000 Dla zmiennej V 1 mamy n = 11, M ax = 7, M in = 4.6, zaś σ = 0.875. Wtedy zgodnie z formułą Scott’a dla generowania równych przedziałów danych (zastosowanie przy budowie histogramów) otrzymujemy: M ax − M in 3.5 × σ × 1 n(− 3 ) = 7 − 4.6 2.4 = 1.742 = 3.5 ∗ 0.875 ∗ 11−13 1.377 A więc wartość będzie zaokrąglona do wartości 2 (max). Efekt możemy sprawdzić wywołując komendę > noweDane <- disc.ew(dane, 1:4) dla naszego modelu z danymi wcześniej wczytanymi. > library(dprep) > noweDane <- disc.ew(dane, 1:4) > summary(noweDane) V1 V2 Min. :1.000 Min. :1.000 1st Qu.:1.000 1st Qu.:2.000 Median :1.000 Median :2.000 Mean :1.364 Mean :2.182 3rd Qu.:2.000 3rd Qu.:2.500 Max. :2.000 Max. :3.000 V5 Min. :1.000 1st Qu.:1.000 Median :1.000 Mean :1.455 3rd Qu.:2.000 Max. :2.000 V3 Min. :1.000 1st Qu.:1.000 Median :1.000 Mean :1.455 3rd Qu.:2.000 Max. :2.000 V4 Min. :1.000 1st Qu.:1.000 Median :1.000 Mean :1.455 3rd Qu.:2.000 Max. :2.000 Dyskretyzacja metodą minimalnej długości opisu (MDL) Służy do tego metoda disc.mentr w ramach pakietu dprep. Aby ją wywołać wystarczy użyć komendy: > daneMDL <- disc.mentr(dane,1:5) a efekt będzie następujący: The The The The number of partitions for var 1 cut points are: [1] 5.2 number of partitions for var 2 cut points are: [1] 0 14 is : 2 is : 1 The The The The number of partitions for var 3 cut points are: [1] 1.75 number of partitions for var 4 cut points are: [1] 0.35 is : 2 is : 2 dzięki czemu dowiadujemy się, że dla odpowiednich zmiennych ze zbioru dane otrzymujemy inne liczby podziałów oraz inne punkty cięcia. Wtedy wywołując komendę summary(dameMDL) otrzymujemy wgląd w faktycznie przeprowadzoną dyskretyzację danych tą metodą: > summary(daneMDL) V1 V2 Min. :1.000 Min. :1 1st Qu.:1.000 1st Qu.:1 Median :2.000 Median :1 Mean :1.545 Mean :1 3rd Qu.:2.000 3rd Qu.:1 Max. :2.000 Max. :1 V5 Min. :1.000 1st Qu.:1.000 Median :1.000 Mean :1.455 3rd Qu.:2.000 Max. :2.000 V3 Min. :1.000 1st Qu.:1.000 Median :2.000 Mean :1.545 3rd Qu.:2.000 Max. :2.000 V4 Min. :1.000 1st Qu.:1.000 Median :2.000 Mean :1.545 3rd Qu.:2.000 Max. :2.000 Dyskretyzacja metodą przedziałów o równej częstości Ta metoda z kolei możliwa jest do użycia stosując funkcję disc.ef. Funkcja ta ma 3 parametry przy wywołaniu: źródło danych, indeksy kolumn które mają podlegać dyskretyzacji, oraz trzecim parametrem jest k określające liczbę przedziałów, które chcemy utworzyć. Efekt: > daneEF <- disc.ef(dane,1:5,3) > summary(daneEF) V1 V2 V3 Min. :1.000 Min. :1.000 Min. :1.000 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000 Median :2.000 Median :2.000 Median :2.000 Mean :1.909 Mean :1.909 Mean :1.909 3rd Qu.:2.500 3rd Qu.:2.500 3rd Qu.:2.500 Max. :3.000 Max. :3.000 Max. :3.000 V5 Min. :1.000 1st Qu.:1.000 Median :1.000 Mean :1.455 15 V4 Min. :1.000 1st Qu.:1.000 Median :2.000 Mean :1.909 3rd Qu.:2.500 Max. :3.000 3rd Qu.:2.000 Max. :2.000 4.4 Normalizacja danych w środowisku R Należy wykorzystać funkcję mmnorm pakietu dprep która pozwala sprowadzić dane do zakresu określonego przez 2 parametry: minval oraz maxval będące argumentami przy wywołaniu tej funkcji. A więc, jeśli chcemy znormalizować dane do przedziału [0, 1] należy wywołać komendę: > daneMinMax1<-mmnorm(dane,minval=0,maxval=1) Aby zobaczyć tego efekt wystarczy potem wywołać komendę > show(daneMinMax1) V1 V2 45 0.20833333 1.0000000 46 0.08333333 0.4666667 47 0.20833333 1.0000000 48 0.00000000 0.6000000 49 0.29166667 0.9333333 50 0.16666667 0.6666667 51 1.00000000 0.6000000 52 0.75000000 0.6000000 53 0.95833333 0.5333333 54 0.37500000 0.0000000 55 0.79166667 0.3333333 V3 0.14285714 0.00000000 0.05714286 0.00000000 0.02857143 0.00000000 0.94285714 0.88571429 1.00000000 0.74285714 0.91428571 V4 V5 0.15384615 1 0.07692308 1 0.00000000 1 0.00000000 1 0.00000000 1 0.00000000 1 0.92307692 2 1.00000000 2 1.00000000 2 0.84615385 2 1.00000000 2 By zobaczyć rozkład wartości w znormalizowanym zbiorze wystarczy użyć komendy summary(). Jeśli więc chcemy dane znormalizować do przedziału np [1,1] wystarczy zmienić wartości parametrów: minval oraz maxval odpowiednio na wartości −1 i 1 i efekt będzie następujący: > daneMinMax1<-mmnorm(dane,minval=-1,maxval=1) > summary(daneMinMax1) V1 V2 V3 Min. :-1.0000 Min. :-1.000e+00 Min. :-1.0000 1st Qu.:-0.6250 1st Qu.: 3.331e-16 1st Qu.:-0.9714 Median :-0.4167 Median : 2.000e-01 Median :-0.7143 Mean :-0.1212 Mean : 2.242e-01 Mean :-0.1429 3rd Qu.: 0.5417 3rd Qu.: 6.000e-01 3rd Qu.: 0.8000 Max. : 1.0000 Max. : 1.000e+00 Max. : 1.0000 V4 V5 Min. :-1.00000 Min. :1.000 1st Qu.:-1.00000 1st Qu.:1.000 Median :-0.69231 Median :1.000 Mean :-0.09091 Mean :1.455 3rd Qu.: 0.92308 3rd Qu.:2.000 Max. : 1.00000 Max. :2.000 > show(daneMinMax1) V1 V2 V3 V4 V5 45 -0.5833333 1.00000000 -0.7142857 -0.6923077 1 16 46 47 48 49 50 51 52 53 54 55 -0.8333333 -0.06666667 -1.0000000 -0.8461538 -0.5833333 1.00000000 -0.8857143 -1.0000000 -1.0000000 0.20000000 -1.0000000 -1.0000000 -0.4166667 0.86666667 -0.9428571 -1.0000000 -0.6666667 0.33333333 -1.0000000 -1.0000000 1.0000000 0.20000000 0.8857143 0.8461538 0.5000000 0.20000000 0.7714286 1.0000000 0.9166667 0.06666667 1.0000000 1.0000000 -0.2500000 -1.00000000 0.4857143 0.6923077 0.5833333 -0.33333333 0.8285714 1.0000000 1 1 1 1 1 2 2 2 2 2 Normalizacja metodą Z − score Do realizacji tej metody w środowisku R służy funkcja znorm w pakiecie dprep. Wysatarczy wywołać komendę znorm(dane) by w efekcie uzyskać dane znormalizowane do takiej formy: > daneZscore<-znorm(dane) > show(daneZscore) V1 V2 1 -0.6333105 1.30216933 2 -0.9759211 -0.48831350 3 -0.6333105 1.30216933 4 -1.2043282 -0.04069279 5 -0.4049034 1.07835898 6 -0.7475140 0.18311756 7 1.5365566 -0.04069279 8 0.8513354 -0.04069279 9 1.4223531 -0.26450315 10 -0.1764964 -2.05498598 11 0.9655390 -0.93593421 V3 -0.6286946 -0.9430419 -0.8173030 -0.9430419 -0.8801725 -0.9430419 1.1316503 1.0059114 1.2573892 0.6915641 1.0687808 V4 V5 -0.6236339 1 -0.7831682 1 -0.9427024 1 -0.9427024 1 -0.9427024 1 -0.9427024 1 0.9717087 2 1.1312429 2 1.1312429 2 0.8121744 2 1.1312429 2 Normalizacja metodą skalowania dziesiętnego (ang. decimal scalling ) Służy do tego metoda decscale() tego samego pakietu dprep. Jej efektem jest normalizacja danych do przedziału [-1,1]. Znajduje taką wartość k, że wartość bezwględna z maksymalnej wartości cech podzielona przez 10k jest mniejsze bądź równe 1. > daneDS<-decscale(dane) > show(daneDS) V1 V2 V3 V4 V5 1 0.51 0.38 0.19 0.04 1 2 0.48 0.30 0.14 0.03 1 3 0.51 0.38 0.16 0.02 1 4 0.46 0.32 0.14 0.02 1 5 0.53 0.37 0.15 0.02 1 6 0.50 0.33 0.14 0.02 1 7 0.70 0.32 0.47 0.14 2 8 0.64 0.32 0.45 0.15 2 9 0.69 0.31 0.49 0.15 2 10 0.55 0.23 0.40 0.13 2 11 0.65 0.28 0.46 0.15 2 17 Literatura [1] Breiman L., Classification and Regression Trees. Chapman & Hall, New York, 1984. [2] Cichosz P., Systemy uczące się, WNT, Warszawa, 2000. [3] Ćwik J., Mielniczuk J., Statystyczne systemy uczące się. Ćwiczenia w oparciu o pakiet R. Oficyna Wydawnicza Politechniki Warszawskiej, Warszawa, 2009. [4] Koronacki J., Ćwik J., Statystyczne systemy uczące się. EXIT. Warszawa, 2008. [5] Koronacki J., Mielniczuk J., Statystyka dla studentów kierunków technicznych i przyrodniczych. WNT, Warszawa, 2006. [6] Larose D.T., Metody i modele eksploracji danych. PWN, Warszawa, 2008. [7] Quinlan J., Induction of Decision Trees. Machine Learning, 1: 81–106, 1986. [8] Smith L.I.,A tutorial on Principal Components Analysis, http://kybele.psych.cornell.edu/~edelman/ Psych-465-Spring-2003/PCA-tutorial.pdf, 2002. [9] Walesiak M., Gatnar E. (redakorzy), Statystyczna analiza danych z wykorzystaniem programu R, PWN, Warszawa, 2009. 18