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

Podobne dokumenty