You are on page 1of 298

Tytuł oryginału: Practical Statistics for Data Scientists: 50+ Essential Concepts Using R and Python, 2nd Edition

Tłumaczenie: Krzysztof Sawka, Marta Danch-Wierzchowska

ISBN: 978-83-283-7428-7

© 2021 Helion SA
Authorized Polish translation of the English edition of Practical Statistics for Data Scientists, 2E
ISBN 9781492072942 © 2020 Peter Bruce, Andrew Bruce, and Peter Gedeck
This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls
all rights to publish and sell the same.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording or by any information storage retrieval system,
without permission from the Publisher.

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej


publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną,
fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje
naruszenie praw autorskich niniejszej publikacji.

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi


ich właścicieli.

Autor oraz Helion SA dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne
i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym
ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Helion SA nie ponoszą również
żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce.

Helion SA
ul. Kościuszki 1c, 44-100 Gliwice
tel. 32 231 22 19, 32 230 98 63
e-mail: helion@helion.pl
WWW: http://helion.pl (księgarnia internetowa, katalog książek)

Drogi Czytelniku!
Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres
http://helion.pl/user/opinie/stpra2_ebook
Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

 Poleć książkę na Facebook.com  Księgarnia internetowa


 Kup w wersji papierowej  Lubię to! » Nasza społeczność
 Oceń książkę

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Peter Bruce i Andrew Bruce chcieliby zadedykować tę książkę swym rodzicom
Victorowi G. i Nancy C. Bruce’om, którzy rozwijali w nich pasję do matematyki i nauki,
oraz swym mentorom Johnowi W. Tukeyowi i Julianowi Simonowi, a także swemu
wieloletniemu przyjacielowi Geoffowi Watsonowi, którym zawdzięczają karierę w statystyce.
Peter Gedeck chciałby zadedykować tę książkę Timowi Clarkowi i Christianowi Kramerowi
w podzięce za zaangażowanie w kwestie naukowe i przyjaźń.

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk
Spis treści

Przedmowa ......................................................................................................................... 13
1. Badania eksploracyjne .............................................................................................. 17
Elementy danych uporządkowanych 18
Dla pogłębienia wiedzy 20
Dane stabelaryzowane 20
Ramki danych i indeksy 22
Niestabelaryzowane struktury danych 22
Dla pogłębienia wiedzy 23
Miary położenia 23
Średnia 24
Mediana i estymatory odporne 26
Przykład: miara położenia dla wielkości populacji i wskaźnika morderstw 27
Dla pogłębienia wiedzy 28
Miary rozproszenia 28
Odchylenie standardowe i powiązane estymatory 30
Estymatory oparte na percentylach 32
Przykład: szacowanie zmienności dla populacji Stanów Zjednoczonych 33
Dla pogłębienia wiedzy 34
Badanie rozkładu danych 34
Percentyle i boxploty 34
Tablica częstości i histogramy 36
Szacowanie i wykresy gęstości rozkładu 38
Dla pogłębienia wiedzy 40
Badanie danych binarnych i skategoryzowanych 40
Moda 42
Wartość oczekiwana 42
Prawdopodobieństwo 43
Dla pogłębienia wiedzy 43

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Korelacja 43
Wykres punktowy 46
Dla pogłębienia wiedzy 48
Badanie dwóch lub więcej zmiennych 48
Wykres przedziałów heksagonalnych i wykres konturowy
(przedstawianie danych numerycznych względem danych numerycznych) 48
Dwie zmienne skategoryzowane 51
Dane kategoryzowane i numeryczne 52
Wizualizacja wielu zmiennych 53
Dla pogłębienia wiedzy 56
Podsumowanie 56

2. Rozkłady danych i prób .............................................................................................. 57


Losowy dobór i obciążenie próby 58
Obciążenie 60
Dobór losowy 61
Rozmiar a jakość: kiedy rozmiar ma znaczenie? 61
Średnia z próby a średnia z populacji 62
Dla pogłębienia wiedzy 63
Błąd doboru 63
Regresja do średniej 64
Dla pogłębienia wiedzy 66
Rozkład próbkowania dla statystyki 66
Centralne twierdzenie graniczne 69
Błąd standardowy 69
Dla pogłębienia wiedzy 70
Próby bootstrapowe 70
Ponowne próbkowanie a próby bootstrapowe 73
Dla pogłębienia wiedzy 73
Przedziały ufności 74
Dla pogłębienia wiedzy 76
Rozkład normalny 76
Standaryzowany rozkład normalny i wykres K-K 78
Rozkłady z długimi ogonami 79
Dla pogłębienia wiedzy 81
Rozkład t-Studenta 81
Dla pogłębienia wiedzy 83
Rozkład binarny 83
Dla pogłębienia wiedzy 85

6 | Spis treści

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rozkład chi-kwadrat 85
Dla pogłębienia wiedzy 86
Rozkład F 86
Dla pogłębienia wiedzy 87
Rozkład Poissona i jego pochodne 87
Rozkład Poissona 88
Rozkład wykładniczy 88
Szacowanie współczynnika porażki 89
Rozkład Weibulla 89
Dla pogłębienia wiedzy 90
Podsumowanie 90

3. Eksperymenty statystyczne i testowanie istotności .................................................... 91


Test A/B 91
Po co Ci grupa kontrolna? 94
Dlaczego tylko A/B? Dlaczego nie C, D itd.? 94
Dla pogłębienia wiedzy 95
Testowanie hipotezy 96
Hipoteza zerowa 97
Hipoteza alternatywna 97
Test jednostronny i test dwustronny 97
Dla pogłębienia wiedzy 98
Testy randomizacyjne 98
Test permutacyjny 99
Przykład: licznik odwiedzin strony 100
Zupełny test permutacyjny i bootstrap 103
Test permutacyjny: podstawa w data science 104
Dla pogłębienia wiedzy 104
Istotność statystyczna i p-wartość 104
p-wartość 106
Alfa 108
Błędy pierwszego i drugiego rodzaju 109
Data science i p-wartość 109
Dla pogłębienia wiedzy 110
Test t 110
Dla pogłębienia wiedzy 112
Testowanie wielokrotne 112
Dla pogłębienia wiedzy 115
Stopnie swobody 115
Dla pogłębienia wiedzy 116

Spis treści | 7

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


ANOVA 116
Statystyka F 119
Dwustronna ANOVA 121
Dla pogłębienia wiedzy 121
Test chi-kwadrat 121
Test chi-kwadrat: podejście randomizacyjne 122
Test chi-kwadrat: teoria 124
Dokładny test Fishera 125
Znaczenie testu chi-kwadrat w data science 127
Dla pogłębienia wiedzy 128
Algorytm Wielorękiego Bandyty 128
Dla pogłębienia wiedzy 131
Moc i rozmiar próby 131
Rozmiar próby 132
Dla pogłębienia wiedzy 134
Podsumowanie 134

4. Regresja i predykcja ................................................................................................ 135


Prosta regresja liniowa 135
Równanie regresji 135
Dopasowanie wartości i rezydua 139
Metoda najmniejszych kwadratów 139
Predykcja a objaśnienie (profilowanie) 141
Dla pogłębienia wiedzy 141
Regresja wieloraka 142
Przykład: wartość domów w King County 143
Ocena modelu 144
Kroswalidacja 146
Dobór modelu i regresja krokowa 147
Regresja ważona 150
Dla pogłębienia wiedzy 151
Predykcja z wykorzystaniem regresji 151
Niebezpieczeństwa związane z ekstrapolacją 151
Przedziały ufności i predykcji 152
Zmienne skategoryzowane w regresji 153
Zmienne fikcyjne 154
Zmienne skategoryzowane na wielu poziomach 156
Uporządkowane zmienne skategoryzowane 158
Interpretacja równania regresji 159
Predyktory skorelowane 160
Współliniowość 161

8 | Spis treści

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Zmienne zakłócające 161
Interakcje i efekty główne 163
Diagnostyka regresji 164
Wartości odstające 165
Obserwacje wpływowe 167
Heteroskedastyczność, anormalność i błędy skorelowane 170
Wykresy częściowych rezyduów i nieliniowość 172
Regresja wielomianowa i regresja sklejana 174
Wielomian 175
Funkcja sklejana 176
Uogólnione modele addytywne 178
Dla pogłębienia wiedzy 180
Podsumowanie 180

5. Klasyfikacja .............................................................................................................181
Naiwny klasyfikator bayesowski 182
Dlaczego klasyfikator bayesowski jest niepraktyczny? 183
Naiwne rozwiązanie 183
Numeryczne zmienne objaśniające 186
Dla pogłębienia wiedzy 186
Analiza dyskryminacyjna 186
Macierz kowariancji 187
Liniowy dyskryminator Fishera 188
Prosty przykład 188
Dla pogłębienia wiedzy 191
Regresja logistyczna 192
Funkcja odpowiedzi logistycznej i logit 192
Regresja logistyczna i GLM 194
Uogólnione modele liniowe 195
Wartości prognozowane na podstawie regresji logistycznej 195
Interpretacja współczynników i iloraz szans 196
Regresja liniowa i regresja logistyczna: podobieństwa i różnice 197
Ocena modelu 198
Dla pogłębienia wiedzy 201
Ewaluacja modeli klasyfikacji 202
Macierz błędów 203
Problem mało licznych klas 204
Precyzja, czułość i swoistość 205
Krzywa ROC 206
Pole pod wykresem krzywej ROC 208

Spis treści | 9

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Lift 209
Dla pogłębienia wiedzy 210
Strategie dla niezbilansowanych danych 210
Undersampling 211
Oversampling i zwiększenie/obniżenie wag 212
Generowanie danych 213
Klasyfikacja oparta na kosztach 214
Badanie prognozy 214
Dla pogłębienia wiedzy 216
Podsumowanie 216

6. Statystyczne uczenie maszynowe ............................................................................ 217


K-najbliższych sąsiadów 218
Przykład: przewidywanie opóźnienia w spłacie pożyczki 219
Metryki odległości 221
Kodowanie 1 z n 222
Standaryzacja (normalizacja, z-wartość) 223
Dobór K 225
KNN w doborze cech 226
Drzewa decyzyjne 228
Prosty przykład 229
Algorytm rekursywnego podziału 231
Pomiar homogeniczności lub zanieczyszczenia 232
Zatrzymanie wzrostu drzewa 234
Prognoza ciągłych wartości 235
Jak są wykorzystywane drzewa 235
Dla pogłębienia wiedzy 236
Bagging i lasy losowe 236
Bagging 238
Las losowy 238
Istotność zmiennej 242
Hiperparametry 244
Boosting 245
Algorytm wzmacniania 247
XGBoost 247
Regularyzacja: unikanie nadmiernego dopasowania 249
Hiperparametry i kroswalidacja 253
Podsumowanie 256

10 | Spis treści

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


7. Uczenie nienadzorowane .........................................................................................257
Analiza głównych składowych 258
Prosty przykład 259
Obliczanie głównych składowych 261
Interpretacja głównych składowych 261
Analiza odpowiedniości 264
Dla pogłębienia wiedzy 266
Metoda K-średnich (centroidów) 266
Prosty przykład 267
Algorytm K-średnich 269
Interpretacja klastrów 270
Dobór liczby klastrów 272
Klasteryzacja hierarchiczna 274
Prosty przykład 274
Dendrogram 275
Algorytm aglomeracyjny 276
Miary podobieństwa 277
Klasteryzacja oparta na modelu 278
Wielowymiarowy rozkład normalny 278
Mieszaniny rozkładów normalnych 280
Dobór liczby klastrów 282
Dla pogłębienia wiedzy 284
Skalowanie i zmienne skategoryzowane 284
Skalowanie zmiennych 285
Zmienne dominujące 287
Zmienne skategoryzowane i odległość Gowera 288
Problem z klasteryzacją danych mieszanych 290
Podsumowanie 291

Bibliografia ........................................................................................................................293

Spis treści | 11

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


12 | Spis treści

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Przedmowa

Książka, którą oddajemy w Twoje ręce, przeznaczona jest dla specjalistów data science zaznajomio-
nych z językami programowania R i/lub Python, a także mających doświadczenie w dziedzinie sta-
tystyki (być może niewielkie lub zdobyte dawno temu). Dwóch autorów przeszło do świata data
science ze świata statystyki i doceniają wkład, jaki statystyka może wnieść w data science. Jedno-
cześnie jesteśmy świadomi ograniczeń tradycyjnych instrukcji statystycznych: statystyka jako dys-
cyplina ma już półtora wieku, a większość podręczników do statystyki jest uaktualniana w tempie
liniowca oceanicznego i z jego bezwładnością. Wszystkie omówione w niniejszej książce metody
(historyczne lub metodologiczne) są w jakiś sposób związane z dyscypliną statystyki. Nie zajmu-
jemy się tu metodami wywodzącymi się głównie z informatyki, takimi jak sieci neuronowe.
Kiedy tworzyliśmy tę książkę, przyświecały nam dwa cele:
• Przedstawienie, w formie łatwo przyswajalnej i lekkiej do przetrawienia, kluczowych zagad-
nień ze świata statystyki, które są istotne w data science.
• Wyjaśnienie, które koncepcje są ważne i przydatne z perspektywy data science, a które mniej
istotne i dlaczego.

Konwencja zastosowana w tej książce


W książce zastosowano następującą konwencję typograficzną:
Kursywa
Używana do wyróżnienia pojęć, linków, adresów e-mail, nazw i rozszerzeń plików.
Pogrubienie
Wskazuje na nowe pojęcia.
Czcionka o stałej szerokości
Wykorzystywana do zapisu listingów kodu, zamieszczonych również w skrypcie jako oddzielne
fragmenty.
Wyróżnia także elementy kodu, tj. zmienne, nazwy funkcji i bibliotek, bazy i typy danych,
zmienne środowiskowe, wyrażenia i słowa kluczowe zamieszczone w tekście.

13

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Stała szerokość z kursywą
Wskazuje na elementy, które powinny być podmienione wartościami dostarczonymi przez
użytkownika.

Kluczowe pojęcia
Data science jest połączeniem wielu dyscyplin, w tym statystyki, nauki o komputerach, technologii in-
formacyjnej i specyfiki branżowej. W efekcie można tę samą koncepcję opisać za pomocą kilku róż-
nych terminów. Kluczowe pojęcia i ich synonimy są przedstawione w książce w takich ramkach jak ta.

Oznacza wskazówkę bądź sugestię dla czytelnika.

Oznacza ogólną uwagę.

Oznacza ostrzeżenie.

Wykorzystanie przykładów kodu


We wszystkich przykładach najpierw prezentujemy listingi w R, a następnie w Pythonie. Aby unik-
nąć niepotrzebnych powtórzeń, zazwyczaj prezentujemy wyłącznie wyniki i wykresy uzyskane
za pomocą kodu R. Pomijamy także kod służący do wczytywania pakietów i zestawów danych.
Oryginalne materiały dodatkowe (przykłady kodów, ćwiczenia itd.) można pobrać ze strony:
https://github.com/gedeck/practical-statistics-for-data-scientists. Spolonizowane materiały można
pobrać ze strony wydawnictwa Helion: https://ftp.helion.pl/przyklady/stpra2.zip.
Ta książka ma Ci pomóc w Twojej pracy. Możesz używać kodu z tej książki w swoich programach
i swojej dokumentacji. Nie musisz kontaktować się w tym celu z autorami, pod warunkiem że nie
kopiujesz znacznej części kodu. Na przykład napisanie programu, który używa kilku kawałków
kodu z tej książki, nie wymaga pozwolenia. Sprzedawanie materiałów dodatkowych do książek wy-
danych przez O’Reilly wymaga pozwolenia. Odpowiadanie na pytania poprzez cytowanie tej książki
i przytaczanie jej kodów nie wymaga pozwolenia. Wykorzystywanie znacznej części przykładowego
kodu z tej książki w dokumentacji Twojego produktu wymaga pozwolenia.
Będziemy wdzięczni za podawanie przypisów do naszej publikacji, choć tego nie wymagamy. Przypis
z reguły zawiera dane o autorze, wydawcy i ISBN, np. Peter Bruce, Andrew Bruce i Peter Gedeck,
Statystyka praktyczna w data science. 50 kluczowych zagadnień w językach R i Python, Helion,
Gliwice 2021, Copyright 2020 Peter Bruce, Andrew Bruce i Peter Gedeck, ISBN: 978-83-283-7427-0.

14 | Przedmowa

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Podziękowania
Autorzy pragną podziękować wszystkim osobom, które pomogły w stworzeniu tej książki.
Gerhard Pilcher, CEO firmy Elder Research, zajmującej się data mining, przeczytał wstępny szkic
tej książki i przekazał nam szczegółowe i pomocne uwagi oraz komentarze z nią związane. Podob-
nie Anya McGuirk i Wei Xiao, statystycy z firmy SAS, oraz Jay Hilfiger, autor piszący dla wydaw-
nictwa O’Reilly, udzielili nam pomocnych wskazówek na wstępnym etapie powstawania książki.
Toshiaki Kurokawa, tłumacz odpowiedzialny za przekład pierwszego wydania na język japoński,
przekazał nam mnóstwo uwag i opinii w trakcie tłumaczenia. Aaron Schumacher i Walter Pacz-
kowski zweryfikowali drugie wydanie książki i podzielili się z nami mnóstwem przydatnych i cen-
nych sugestii, za które jesteśmy dozgonnie wdzięczni. Jest oczywiste, że za wszelkie błędy odpowia-
damy osobiście.
Dzięki Shannon Cutt z wydawnictwa O’Reilly przeszliśmy proces publikacji w dobrym nastroju
oraz z odpowiednią dozą motywacji, a dzięki Kristen Brown gładko przeszliśmy proces produkcji.
Rachel Monaghan i Eliahu Sussman cierpliwie i dokładnie poprawiały i wygładzały nasz tekst,
a Ellen Troutman-Zaig przygotowała indeks. Nicole Tache zajęła się wydaniem drugim i nie dość,
że płynnie przeprowadziła nas przez cały proces wydawniczy, to jeszcze zasugerowała wiele drob-
nych poprawek znacznie poprawiających czytelność dla szerokiego grona odbiorców. Chcieliby-
śmy również podziękować Marie Beaugureau, która zainicjowała nasz projekt w wydawnictwie
O’Reilly, jak również Benowi Bengfortowi, autorowi piszącemu dla O’Reilly i instruktorowi Stati-
stics.com, który przedstawił nas osobom decyzyjnym w wydawnictwie.
Zarówno my, jak i ta książka zyskaliśmy wiele na licznych rozmowach, które Peter prowadził przez
wiele lat z Galit Shmueli, współautorką innych naszych książek.
Na koniec chcielibyśmy szczególnie podziękować Elizabeth Bruce i Deborah Donnell, których cier-
pliwość i wsparcie uczyniły nasze starania skutecznymi.

Podziękowania | 15

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


16 | Przedmowa

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


ROZDZIAŁ 1.
Badania eksploracyjne

Pierwszy rozdział skupia się na tym, co zawsze jest pierwszym krokiem w dowolnym projekcie data
science: przejrzeniu zebranych danych.
Badania eksploracyjne (EDA, ang. exploratory data analysis) są względnie nowym zagadnieniem
w statystyce. Klasyczna statystyka skupia się niemal wyłącznie na wnioskach, czasami skompliko-
wanych zestawach procedur umożliwiających wyciąganie wniosków o ogromnych populacjach na
podstawie niewielkich prób. W 1962 r. John W. Tukey (https://en.wikipedia.org/wiki/John_Tukey)
(rysunek 1.1) w swoim przełomowym artykule The Future of Data Analysis (Przyszłość analizy
danych) [Tukey 1962] wezwał do reformy statystyki. Zaproponował nową dyscyplinę, o nazwie
analiza danych (ang. data analysis), której jednym z elementów byłoby wnioskowanie statystyczne
(wprowadził terminy bit, skrót od cyfr binarnych, i software). Oryginalne tezy Tukeya są zaskaku-
jąco trwałe i tworzą częściową podstawę data science. Zakres działań badań eksploracyjnych został
ustanowiony w klasycznym już dziele Tukeya Exploratory Data Analysis [Tukey 1977]. Tukey za-
prezentował proste wykresy (np. pudełkowe czy punktowe), które wraz ze statystykami podsumo-
wującymi (średnią, medianą, kwantylami itp.) pomagają zobrazować własności zestawu danych.

Rysunek 1.1. John Tukey, wybitny naukowiec, którego idee, rozwinięte ponad 50 lat temu, utworzyły podstawy
data science

17

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Wraz z ułatwieniem dostępu do mocy obliczeniowej i oprogramowania dedykowanego analizie
danych badania eksploracyjne wyszły poza ich oryginalne założenia. Głównym motorem napędo-
wym były gwałtowny rozwój nowych technologii, łatwy dostęp do większej liczby dużych zbiorów
danych i zwiększenie możliwości wykorzystania analizy ilościowej w różnych dyscyplinach nauko-
wych. David Donoho, profesor statystyki na Uniwersytecie Stanforda i były student Tukeya, jest
autorem świetnego artykułu bazującego na jego prezentacji z warsztatów zorganizowanych z okazji
setnej rocznicy urodzin Tukeya, które odbyły się na Uniwersytecie Princeton w New Jersey
[Donoho 2015]. Donoho prześledził w swojej pracy początki data science, aż do pionierskiej pracy
Tukeya dotyczącej analizy danych.

Elementy danych uporządkowanych


Dane mogą pochodzić z różnych źródeł; mogą to być pomiary z czujników, wydarzeń, tekstu, ob-
razów, filmów. Internet rzeczy (IoT, ang. Internet of Things) wyrzuca potoki informacji. Więk-
szość tych danych jest nieuporządkowana: obrazy są zbiorem pikseli, a każdy piksel zawiera infor-
macje o kanałach RGB (ang. R(ed) — czerwony, G(reen) — zielony, B(lue) — niebieski). Tekst jest
sekwencją słów i znaków, zazwyczaj uporządkowanych w rozdziały, podrozdziały itd. Z kolei
clickstreams są sekwencjami przechodzenia przez kolejne elementy aplikacji lub podstrony strony
internetowej. Tak naprawdę największym wyzwaniem data science jest przekształcenie wciąż spły-
wającego natłoku danych w użyteczne informacje. Aby zagadnienia statystyczne poruszane w tej
książce mogły zostać zastosowane w praktyce, nieuporządkowane dane muszą być przekształcone
na uporządkowane. Jedną z najczęściej występujących form danych uporządkowanych jest tabela
zawierająca rzędy i kolumny — tak jakby dane pochodziły z relacyjnej bazy danych lub były zbie-
rane w celach badawczych.
Istnieją dwa podstawowe typy danych uporządkowanych: numeryczne i skategoryzowane. Dane
numeryczne występują w dwóch formach: ciągłej, np. prędkość wiatru, czas trwania, lub dyskretnej,
np. częstość występowania jakiegoś zjawiska. Dane skategoryzowane (ang. categorical data) przyj-
mują jedynie określone zbiory wartości, np. typy ekranów telewizorów (plazmowy, LCD, LED itp.)
lub nazwy stanów (Alabama, Alaska itd.). Dane binarne (ang. binary data) są ważnym, szcze-
gólnym przypadkiem danych skategoryzowanych, w którym występują jedynie dwie wartości, tj.
0/1 lub prawda/fałsz. Innym użytecznym rodzajem danych skategoryzowanych są dane porządkowe
(ang. ordinal data), w których kategorie są uporządkowane; przykładem jest ocenianie na podstawie
ocen (1, 2, 3, 4 lub 5).
Dlaczego w ogóle przejmujemy się nazewnictwem typów danych? Okazuje się, że w przypadku
analizy danych i modelowania predykcyjnego typy danych są istotne dla określenia sposobu
ich wizualizacji, analizy i doboru modelu statystycznego. W świecie data science oprogramowa-
nie, jak R lub Python, wykorzystuje te typy do poprawy wydajności obliczeń. Co ważniejsze,
określenie typu danych dla zmiennej warunkuje sposób, w jaki oprogramowanie będzie przetwa-
rzać tę zmienną.

18 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące typów danych
Numeryczne
Dane wyrażane w skali numerycznej.

Ciągłe
Dane, które mogą przyjmować dowolną wartość z przedziału (Synonimy: przedziałowe,
numeryczne, float)

Dyskretne
Dane, które mogą przyjmować jedynie wartości całkowite, np. liczność (Synonimy: zli-
czenia, integer)

Skategoryzowane
Dane, które mogą przyjmować jedynie wartości z konkretnego zbioru, reprezentującego moż-
liwe kategorie (Synonimy: czynniki, enum, nominalne, polichotomiczne)

Binarne
Szczególny przypadek danych skategoryzowanych z dwoma wartościami np. 0/1, prawda/fałsz
(Synonimy: dychotomiczne, logiczne, wskaźnikowe, boolean)

Porządkowe
Dane skategoryzowane według wprowadzonego porządku (Synonim: czynniki upo-
rządkowane)

Inżynierowie oprogramowania i programiści baz danych mogą się zastanawiać, do czego anality-
kom potrzebne są pojęcia danych skategoryzowanych i porządkowych. Bądź co bądź kategorie są
w zasadzie zbiorem wartości tekstowych (lub numerycznych), a podstawowe bazy danych automa-
tycznie przenoszą wewnętrzne typy. Jednakże świadomość różnic pomiędzy danymi skategoryzo-
wanymi a zwykłym tekstem daje pewne korzyści:
• Dzięki wiedzy o tym, że dane są skategoryzowane, można sugerować oprogramowaniu, jak
powinny się zachować procedury statystyczne, np. tworząc wykres lub dopasowując model.
W szczególności dane porządkowe mogą być reprezentowane jako ordered.factor w R
i zachowywać specyficzny dla użytkownika porządek w wykresach, tabelach i modelach.
W Pythonie moduł scikit-learn obsługuje dane porządkowe za pomocą klasy sklearn.
´preprocessing.OrdinalEncoder).
• Przechowywanie i indeksowanie może być zoptymalizowane (jak w relacyjnych bazach
danych).
• Wartości, jakie może przyjmować zmienna kategoryzowana, są zdefiniowane w oprogramo-
waniu (np. enum).

Elementy danych uporządkowanych | 19

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Trzecia z wymienionych korzyści może prowadzić do niezamierzonych lub niespodziewanych za-
chowań: domyślnym zachowaniem funkcji importowania danych w R (np. read.csv) jest automa-
tyczna konwersja kolumn zawierających tekst do typu factor. Sprawia to, że jedynymi dopuszczal-
nymi wartościami dla tych kolumn będą te oryginalnie występujące w danych, a próba przypisania
innych wartości tekstowych spowoduje pojawienie się ostrzeżenia i wartości NA (brakującej warto-
ści). W Pythonie pakiet pandas nie realizuje automatycznie takiego przekształcenia. Można jednak
jawnie wyznaczyć kolumnę skategoryzowaną wewnątrz funkcji read_csv.

Główne zasady
• Dane są zazwyczaj klasyfikowane przez oprogramowanie ze względu na typ.

• Typy danych można podzielić na numeryczne (ciągłe, dyskretne) i skategoryzowane (binarne,


porządkowe).
• Określenie typu danych w oprogramowaniu jest sygnałem dla niego, w jaki sposób dane mają
być przetwarzane.

Dla pogłębienia wiedzy


• Dokumentacja pakietu pandas (https://pandas.pydata.org/docs/user_guide/dsintro.html#dsintro)
opisuje różne typy danych i sposób ich wykorzystywania w Pythonie.
• Typy danych nie są jednoznaczne, ich definicje mogą się dublować, a nazewnictwo w jednym
oprogramowaniu może się różnić od tego użytego w innym. Strona objaśniająca typy użyte
w R to: http://www.r-tutor.com/r-introduction/basic-data-types.
• Bazy danych są bardziej dokładne w klasyfikacji typów danych, biorą pod uwagę poziom
dokładności, stałą lub zmienną długość pola i wiele innych czynników; patrz podręcznik
W3Schools dla SQL-a: https://www.w3schools.com/sql/sql_datatypes.asp.

Dane stabelaryzowane
Typowym przykładem analizy w data science są dane stabelaryzowane (ang. rectangular data),
takie jak arkusz kalkulacyjny lub tabela bazy danych.
Dane stabelaryzowane to w gruncie rzeczy dwuwymiarowa macierz, w której wiersze reprezentują
rekordy (przypadki), a kolumny określają cechy (zmienne); w R i Pythonie występuje szczególny
format, zwany ramką danych (ang. data frame). Dane nie zawsze od razu wstępują w tej formie:
dane nieuporządkowane (np. tekst) muszą być przetworzone w taki sposób, by reprezentowały
zestaw cech danych stabelaryzowanych (patrz podrozdział „Elementy danych uporządkowanych”
we wcześniejszej części tego rozdziału). Do zastosowań w większości typów analiz i modelowania
dane z relacyjnych baz danych muszą przyjąć formę jednej tabeli.

20 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące typów danych
Ramka danych
Dane stabelaryzowane (jak arkusz kalkulacyjny) są podstawową strukturą w statystyce i mode-
lach uczenia maszynowego.

Cecha
Kolumna w tabeli jest najczęściej nazywana cechą.
Synonimy
atrybut, wejście, predyktor, zmienna

Wynik
Wiele projektów w data science służy do przewidzenia wyniku — zazwyczaj w postaci
tak/nie (w tabeli 1.1 mamy np. „aukcja była konkurencyjna lub nie”). Cechy są czasem wyko-
rzystywane do przewidzenia wyniku w badaniach eksperymentalnych.
Synonimy
zmienna zależna, odpowiedź, cel, wyjście

Rekord
Wiersz w tabeli jest najczęściej nazywany rekordem.
Synonimy
przypadek, przykład, instancja, obserwacja, wzorzec, próbka

Tabela.1.1. Typowy przykład ramki danych

Wskaźnik Czas Dzień Cena Cena


Kategoria Waluta Konkurencyjny?
sprzedaży trwania zakończenia zamknięcia otwarcia
Muzyka/film/gra USD 3249 5 Pon. 0,01 0,01 0
Muzyka/film/gra USD 3249 5 Pon. 0,01 0,01 0
Automotive USD 3115 7 Wt. 0,01 0,01 0
Automotive USD 3115 7 Wt. 0,01 0,01 0
Automotive USD 3115 7 Wt. 0,01 0,01 0
Automotive USD 3115 7 Wt. 0,01 0,01 0
Automotive USD 3115 7 Wt. 0,01 0,01 1
Automotive USD 3115 7 Wt. 0,01 0,01 1

W tabeli 1.1 zamieszczono zestaw danych pomiarowych lub częstości (np. czas trwania i cena) oraz
danych skategoryzowanych (np. kategoria, waluta). Jak już wspomniano wcześniej, szczególną
formą zmiennej skategoryzowanej jest zmienna binarna (tak/nie, 0/1), przedstawiona w kolumnie
po prawej stronie tabeli 1.1 — jest to zmienna wskaźnikowa pokazująca, czy aukcja była konkuren-
cyjna (brało w niej udział wielu uczestników), czy nie. Ta zmienna wskaźnikowa okazuje się być
także zmienną wynikową (ang. outcome variable) w przypadku, gdy zadaniem modelu jest prze-
widywanie, czy aukcja była konkurencyjna.

Dane stabelaryzowane | 21

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Ramki danych i indeksy
Tradycyjne tabele baz danych mają jedną lub więcej kolumn zaprojektowanych jako indeks, będący
zasadniczo numerem rzędu. Może to znacznie poprawić wydajność niektórych zapytań bazodano-
wych. W języku Python z biblioteką pandas podstawową formą danych stabelaryzowanych jest
obiekt typu DataFrame. Dla danych typu DataFrame tworzony jest automatycznie domyślny indeks
typu integer, bazujący na kolejności wierszy. W pandas możliwa jest również poprawa wydajności
niektórych operacji poprzez ustawienie indeksu wielopoziomowego (hierarchicznego).
W języku R podstawowym typem danych stabelaryzowanych jest obiekt typu data.frame. Obiekty
typu data.frame mają również wprowadzony indeks typu integer, bazujący na kolejności wierszy.
Podstawowy typ data.frame nie wspiera indeksów zdefiniowanych przez użytkownika lub indek-
sów wielopoziomowych, jednak istnieje możliwość stworzenia własnego klucza poprzez atrybut
row.names. Do pozbycia się tej niedogodności szeroko stosowane są dwa nowe pakiety: data.table
i dplyr. Oba wspierają indeksowanie wielopoziomowe i umożliwiają znaczne przyspieszenie pracy
z danymi typu data.frame.

Różnice w terminologii
Terminologia związana z danymi stabelaryzowanymi może być myląca. Statystycy
i specjaliści data science używają różnych nazw dla tych samych zagadnień. Dla sta-
tystyka zmienna predykcyjna jest wykorzystywana w modelu do określenia odpo-
wiedzi albo zmiennej zależnej. Dla specjalisty data science cechy są wykorzystywane
do określenia celu. Szczególnie mylące jest pojęcie próby: specjaliści nauk kompu-
terowych użyją go do określenia pojedynczego wiersza, a statystycy do określenia
zbioru wierszy.

Niestabelaryzowane struktury danych


Oprócz danych stabelaryzowanych istnieją jeszcze inne struktury danych, opisane poniżej.
Serie czasowe zawierają dane pomiarowe dla jednej zmiennej. Stanowi to podstawowy materiał dla
statystycznych metod prognostycznych, jest również kluczowym komponentem danych tworzo-
nych przez sprzęt — Internet rzeczy.
Przestrzenne dane strukturalne, które są wykorzystywane do mapowania i lokalizacji, są bardziej
złożone i zróżnicowane niż dane stabelaryzowane. W reprezentacji obiektowej głównymi elemen-
tami danych są obiekt (ang. object) (np. dom) i jego współrzędne przestrzenne. Widok typu field
(ang. field) dla odmiany skupia się na niewielkich jednostkach przestrzeni i wartości odpowiednich
wskaźników (np. poziomie jasności pikseli).
Grafowe (lub sieciowe) struktury danych są wykorzystywane do reprezentacji zależności fizycz-
nych, socjologicznych i abstrakcyjnych. Przykładowo graf sieci społecznej, takiej jak Facebook czy
LinkedIn, może reprezentować powiązania pomiędzy osobami w sieci. Centra dystrybucji połą-
czone drogami mogą być przykładem sieci fizycznej. Struktura grafu jest użyteczna w przypadku
szczególnego typu zadań, jak optymalizacja sieci i zalecenia systemowe.

22 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Każdy z tych typów danych ma swoją dedykowaną metodologię w data science. W tej książce sku-
piono się na danych stabelaryzowanych, stanowiących fundament modelowania predykcyjnego.

Grafy w statystyce
W naukach komputerowych i technologii informacyjnej pojęcie grafu odnosi się
typowo do przedstawienia powiązań pomiędzy bytami albo podstawowymi struktu-
rami danych. W statystyce pojęcie grafu jest używane w odniesieniu do grupy wy-
kresów i wizualizacji, a nie tylko do połączeń pomiędzy bytami. Samo pojęcie grafu
odnosi się jedynie do wizualizacji, a nie do struktury danych.

Główne zasady
• Podstawowe struktury danych w data science są macierzami, w których wiersze są rekordami,
a kolumny zmiennymi (cechami).
• Terminologia może być myląca; istnieje wiele synonimów, które przeszły do data science
z różnych dyscyplin (ze statystyki, z nauki o komputerach i technologii informacyjnej).

Dla pogłębienia wiedzy


• Dokumentacja dotycząca data frame w R: https://stat.ethz.ch/R-manual/R-devel/library/base/
html/data.frame.html.
• Dokumentacja dotycząca data frame w Pythonie: https://pandas.pydata.org/pandas-docs/stable/
user_guide/dsintro.html.

Miary położenia
Na zmienne zawierające dane pomiarowe lub liczności mogą się składać setki wartości. Podstawo-
wym zadaniem w badaniach eksploracyjnych jest określenie „typowych wartości” dla każdej z cech
(zmiennej): oszacowanie, gdzie zlokalizowana jest większość wartości analizowanych danych
(tj. tendencji centralnej).

Kluczowe pojęcia dotyczące miar położenia


Średnia
Suma wszystkich wartości podzielona przez liczbę tych wartości.

Średnia ważona
Suma wszystkich wartości wymnożonych przez wagi, podzielona przez sumę tych wag.

Mediana
Wartość, dla której jedna połowa danych jest od niej większa, a druga połowa od niej mniejsza.
Synonim
50. percentyl

Miary położenia | 23

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Percentyl
Wartość określająca odsetek P danych, które są od niej mniejsze.
Synonim
kwantyl

Mediana ważona
Wartość, dla której połowa sumy wag należy do próbek większych niż ta wartość, a druga
połowa sumy wag należy do próbek mniejszych niż ta wartość.

Średnia ucinana
Średnia ze zbioru powstałego po odrzuceniu stałej liczby wartości skrajnych.
Synonim
Średnia trymowana, średnia obcięta

Odporność
Brak wrażliwości na wartości skrajne.

Wartość odstająca
Wartość, która znacznie się różni od większości wartości występujących w danych.
Synonim
wartość ekstremalna

Na pierwszy rzut oka podsumowanie danych wydaje się trywialne: trzeba po prostu policzyć średnią
(ang. mean) z danych. Tak naprawdę średnia wydaje się najłatwiejsza do obliczenia i wygodna w uży-
ciu, jednakże nie zawsze jest najlepszym określeniem miary położenia. Z tego powodu statystycy
stworzyli i rozpropagowali kilka wskaźników alternatywnych.

Miary i estymatory
Statystycy często stosują pojęcie estymatora/oszacowania (ang. estimates) w odnie-
sieniu do wartości obliczanych z dostępnych danych, by zaznaczyć różnicę pomiędzy
tym, co sugerują dane, a teoretycznie właściwym stanem rzeczy. Specjaliści data science
i analitycy biznesowi najczęściej używają do tego pojęcia miary (ang. metric). Róż-
nice w nazewnictwie odzwierciedlają różnice w podejściu statystyki i podejściu data
science: obliczanie niepewności jest sercem statystyki, podczas gdy data science kon-
centruje się na biznesie i celach organizacyjnych. Dlatego właśnie statystycy estymują,
a specjaliści data science mierzą.

Średnia
Najbardziej podstawowym estymatorem położenia jest średnia. Średnia jest sumą wszystkich
wartości podzieloną przez liczbę tych wartości. Rozważmy następujący zbiór wartości: {3 5 1 2}.
Średnia z nich to (3+5+1+2)/4 = 11/4 = 2,75. Możesz się spotkać z symbolem x¯,

24 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


reprezentującym średnią z próby badanej populacji. Wzór na obliczenie średniej ze zbioru n war-
tości x1, x2, …, xn jest wyrażony jako:

∑ 𝑥
Ś𝑟𝑒𝑑𝑛𝑖𝑎 𝑥̄
𝑛

N (lub n) odnosi się do całkowitej liczby przypadków lub obserwacji. W statystyce N


odnosi się do populacji, a n do próby z populacji. W data science to rozróżnienie jest
mniej istotne, dlatego możesz się spotkać z obiema wersjami.

Wariacją średniej jest średnia ucinana (ang. trimmed mean), którą obliczysz, odrzucając stałą liczbę
wartości z każdego końca danych posortowanych, a następnie obliczając średnią z tego, co po-
zostało. Przyjmując posortowane wartości jako x(1), x(2), …, x(n), gdzie x(1) jest najmniejszą wartością,
a x(n) największą, oraz p jako liczbę najmniejszych i największych pomijanych wartości, wzór na
obliczenie średniej ucinanej można przedstawić jako:

∑ 𝑥
Ś𝑟𝑒𝑑𝑛𝑖𝑎 𝑢𝑐𝑖𝑛𝑎𝑛𝑎 𝑥̄
𝑛 − 2𝑝

Średnia ucinana eliminuje wpływ wartości skrajnych. Przykładowo w międzynarodowych zawodach


w skokach do wody najwyższa i najniższa z ocen pięciu sędziów jest usuwana, a ocena końcowa jest
średnią z pozostałych trzech (https://en.wikipedia.org/wiki/Diving_(sport)#Scoring_the_dive). Unie-
możliwia to pojedynczemu sędziemu manipulację wynikami, np. na korzyść reprezentanta wła-
snego kraju. Średnia ucinana jest szeroko wykorzystywana, w wielu przypadkach chętniej niż kla-
syczna średnia (patrz punkt „Mediana i estymatory odporne” w dalszej części tego rozdziału).
Innym typem średniej jest średnia ważona (ang. weighted mean), którą obliczysz, mnożąc każdą
wartość w danych xi przez odpowiednią wagę wi i dzieląc sumę tych iloczynów przez sumę wag.
Wzór na średnią ważoną jest wyrażony jako:

∑ 𝑤 𝑥
Ś𝑟𝑒𝑑𝑛𝑖𝑎 𝑤𝑎ż𝑜𝑛𝑎 𝑥̄
∑ 𝑤

Można wyróżnić dwa główne powody użycia średniej ważonej:


• Niektóre wartości są z natury bardziej zmienne niż inne, w takim przypadku wysoce zmienne
obserwacje otrzymują mniejsze wagi. Przykładowo jeśli liczymy średnie dla wielu czujników
i jeden z nich jest mniej dokładny, możemy obniżyć wpływ danych z tego czujnika na wynik
końcowy.
• Zbierane dane nie reprezentują równomiernie różnych grup, które chcemy mierzyć. Przykła-
dowo poprzez sposób, w jaki przeprowadzono eksperyment w sieci, możemy nie uzyskać zbioru
danych odzwierciedlającego wszystkie grupy użytkowników w bazie. Aby to skorygować, więk-
sze wagi przypisujemy wartościom z grup, które są niedoreprezentowane.

Miary położenia | 25

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Mediana i estymatory odporne
Mediana (ang. median) jest wartością środkową na posortowanej liście danych. Jeśli danych jest
parzysta liczba, wartość środkowa nie jest zawarta w zbiorze danych, ale jest średnią z dwóch war-
tości, które dzielą posortowany zbiór na dolną i górną połowę. W porównaniu do średniej, która
wykorzystuje wszystkie obserwacje, mediana zależy od wartości w centrum zbioru danych. Może
się to wydawać wadą, jednak średnia jest zdecydowanie bardziej wrażliwa i dla wielu przypadków
mediana okazuje się zdecydowanie lepszą miarą położenia. Załóżmy, że chcemy sprawdzić typowe
przychody gospodarstw domowych zlokalizowanych wokół jeziora Waszyngton w Seattle. Wyko-
rzystując średnią do porównania obszarów Mediny i Windermere, uzyskamy różne wyniki, ponie-
waż Bill Gates mieszka w Medinie. Jeśli użyjemy mediany, nie będzie miało znaczenia, jak bogaty
jest Bill Gates — wartość środkowa pozostanie taka sama.
Z tego samego powodu zamiast średniej ważonej można wykorzystać medianę ważoną (ang.
weighted median). Jak w przypadku mediany, sortujemy dane, tym razem jednak każda wartość
ma przypisaną wagę. Zamiast szukać wartości środkowej, mediana ważona dzieli posortowany ciąg
danych na dwie części, z których każda ma taką samą sumę wag. Podobnie jak mediana, mediana
ważona jest odporna na wartości odstające.

Wartości odstające
Mediana jest nazywana odpornym (ang. robust) estymatorem położenia; określenie „odporny”
wzięło się od tego, że na ten estymator nie mają wpływu wartości odstające (przypadki skrajne)
(ang. outliers, extreme cases), które mogą zniekształcić wynik. Wartość odstająca jest bardzo odległa
od innych w zbiorze danych. Dokładna definicja wartości odstającej jest w pewien sposób subiek-
tywna, jednakże istnieją pewne konwencje, wykorzystywane w zestawieniach i wykresach danych
(patrz punkt „Percentyle i boxploty” w dalszej części tego rozdziału). To, że wartość jest odstająca,
nie oznacza od razu, że jest nieistotna lub błędna (jak w przykładzie z Billem Gatesem). Często
wartość odstająca jest jednak wynikiem błędów, np. łączenia danych o różnych jednostkach (me-
trów i kilometrów) lub niepoprawnego odczytu z czujnika. Kiedy wartość odstająca jest wynikiem
zastosowania błędnych danych, średnia będzie kiepskim estymatorem położenia, podczas gdy me-
diana wciąż będzie wiarygodna. W każdym przypadku wartości odstające powinny być zidentyfi-
kowane i najczęściej warto poddać je dalszej analizie.

Detekcja anomalii
W przeciwieństwie do typowej analizy danych, w której wartości odstające czasami
stanowią użyteczną informację, a czasami utrapienie, detekcja anomalii dotyczy tylko
wartości odstających; znaczna większość danych służy w tym przypadku głównie do
zdefiniowania „normalności”, wobec której anomalie są określane.

Mediana nie jest jedynym odpornym estymatorem położenia. W rzeczywistości średnia ucinana jest
szeroko stosowana do unikania wpływu wartości odstających. Przykładowo odcięcie dolnych i gór-
nych 10% danych (typowy wybór) zapewni ochronę dla wszystkich przypadków poza niewielkimi
zbiorami danych. Średnia ucinana może być traktowana jako kompromis pomiędzy medianą a średnią:
jest odporna na wartości skrajne, ale wykorzystuje więcej danych do oszacowania położenia.

26 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Inne odporne miary położenia
Statystycy rozwinęli wiele innych estymatorów położenia. Głównym celem było
stworzenie estymatora bardziej odpornego niż średnia, ale również bardziej czułego,
tj. lepiej wychwytującego niewielkie różnice położenia pomiędzy zbiorami danych.
Metody te są potencjalnie użyteczne dla niewielkich zbiorów danych, jednakże nie do-
starczają wartości dodanej dla dużych lub nawet umiarkowanie dużych zbiorów danych.

Przykład: miara położenia dla wielkości populacji i wskaźnika morderstw


Tabela 1.2 przedstawia kilka pierwszych kolumn zbioru danych zawierającego wartości liczebności
populacji i wskaźnika morderstw (w liczbie morderstw na 100 000 mieszkańców na rok) dla każ-
dego stanu USA (spis ludności z 2010 r.).

Tabela 1.2. Kilka kolumn z data.frame zawierającego liczebność populacji i wskaźnik morderstw
dla poszczególnych stanów

State Population Murder.Rate Abbreviation


1 Alabama 4 779 736 5,7 AL.
2 Alaska 710 231 5,6 AK
3 Arizona 6 392 017 4,7 AZ
4 Arkansas 2 915 918 5,6 AR
5 California 37 253 956 4,4 CA
6 Colorado 5 029 196 2,8 CO
7 Connecticut 3 574 097 2,4 CT
8 Delaware 897 934 5,8 DE

Policz średnią, ucinaną średnią i medianę dla populacji, wykorzystując R.


> state <- read.csv('state.csv')
> mean(state[['Population']])
[1] 6162876
> mean(state[['Population']], trim=0.1)
[1] 4783697
> median(state[['Population']])
[1] 4436370

Do obliczenia średniej i mediany w Pythonie możemy użyć metod ramki danych z pakietu pandas.
Średnią ucinaną obliczymy za pomocą funkcji trim_mean z modułu scipy.stats:
state = pd.read_csv('state.csv')
state['Population'].mean()
trim_mean(state['Population'], 0.1)
state['Population'].median()

Średnia jest większa niż średnia ucinana, która z kolei jest większa od mediany.

Miary położenia | 27

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Dzieje się tak dlatego, że średnia ucinana wyklucza pięć największych i pięć najmniejszych sta-
nów (trim=0.1 wyłącza 10% z każdej strony). Jeśli chcemy obliczyć średni wskaźnik morderstw
w kraju, musimy użyć średniej ważonej lub mediany ważonej z uwagi na różną liczność populacji
w poszczególnych stanach. Ponieważ podstawowy R nie ma funkcji liczącej medianę ważoną,
musimy doinstalować pakiet, np. matrixStats:
> weighted.mean(state[['Murder.Rate']], w=state[['Population']])
[1] 4.445834
> library('matrixStats')
> weightedMedian(state[['Murder.Rate']], w=state[['Population']])
[1] 4.4

Średnią ważoną możemy obliczyć za pomocą pakietu NumPy. Do obliczenia mediany ważonej mo-
żemy posłużyć się wyspecjalizowanym pakietem wquantiles (https://pypi.org/project/wquantiles/):
np.average(state['Murder.Rate'], weights=state['Population'])
wquantiles.median(state['Murder.Rate'], weights=state['Population'])

W tym przypadku średnia ważona i mediana ważona są niemal identyczne.

Główne zasady
• Średnia jest podstawową miarą położenia, może być jednak wrażliwa na wartości skrajne
(odstające).
• Inne miary (mediana, średnia ucinana) są mniej wrażliwe na wartości odstające oraz nie-
typowe rozkłady, a zatem wykazują się większą odpornością.

Dla pogłębienia wiedzy


• Artykuł Wikipedii poświęcony tendencji centralnej (https://en.wikipedia.org/wiki/Central_
tendency) opisuje dokładnie różne miary położenia.
• Wciąż jest też czytana książka Exploratory Data Analysis (wyd. Pearson) Johna Tukeya
z 1977 r.

Miary rozproszenia
Położenie jest tylko jednym z czynników służących do opisania zmiennej. Drugim jest zmienność
(ang. variability), określana również jako rozproszenie (ang. dispersion), sprawdzająca, czy dane
są ciasno zgrupowane, czy rozproszone. W samym sercu statystyki leży rozproszenie: jego pomiar,
redukcja, rozróżnienie zmienności losowej i faktycznej, identyfikacja różnych źródeł faktycznej
zmienności i podejmowanie decyzji po jej identyfikacji.

28 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące miar rozproszenia
Odchylenie
Różnica pomiędzy wartością obserwowaną a szacowanym położeniem.
Synonimy
błąd, rezyduum, reszta

Wariancja
Suma kwadratów odchylenia od średniej podzielonych przez n–1, gdzie n jest liczbą wartości
w danych.
Synonim
błąd średniokwadratowy

Odchylenie standardowe
Pierwiastek kwadratowy z wariancji.

Średnie odchylenie bezwzględne


Średnia z wartości bezwzględnych odchyleń zbioru danych od średniej.
Synonimy
norma l1, norma Manhattan

Mediana odchylenia bezwzględnego od mediany


Mediana z wartości bezwzględnych odchyleń zbioru danych od mediany.

Zakres
Różnica pomiędzy najmniejszą a największą wartością w zbiorze danych.

Statystyka porządkowa
Miary oparte na wartościach dla danych posortowanych rosnąco.
Synonim
ranking

Percentyl
Taka wartość, że P procent wartości jest takie samo jak ona bądź mniejsze od niej i (100-P)
procent jest takie samo jak ona bądź większe od niej.
Synonim
kwantyl

Przedział międzykwartylowy
Różnica pomiędzy 75. a 25. percentylem.
Synonim
IQR (ang. interquartile range)

Miary rozproszenia | 29

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Jako że istnieje wiele sposobów pomiaru położenia (średnia, mediana itd.), istnieje również wiele
sposobów na zmierzenie rozproszenia.

Odchylenie standardowe i powiązane estymatory


Najczęściej stosowane oszacowanie zmienności jest oparte na różnicach lub odchyleniach
(ang. deviations) pomiędzy oszacowaniem położenia a obserwowanymi danymi. Dla zbioru da-
nych {1, 4, 1} średnia wynosi 3, a mediana 4. Odchylenia od średniej są następującymi różnicami:
1–3 = –2, 4–3 = 1, 4–3 = 1. Te różnice mówią nam o tym, jak bardzo dane rozrzucone są wokół
wartości centralnej.
Jednym ze sposobów na zmierzenie zmienności jest oszacowanie wartości typowej. Uśrednianie
samych odchyleń nie powie zbyt wiele — odchylenia ujemne będą znosić te dodatnie. W rzeczywi-
stości suma odchyleń od średniej dla powyższego przykładu wynosi zero. Zamiast tego w prosty
sposób możemy policzyć średnią z wartości bezwzględnych odchyleń od średniej. Wartości bez-
względne odchyleń wynosić będą {2, 1, 1}, a ich średnia wynosi (2+1+1)/3 = 1,33. Obliczona wartość
opisuje średnie odchylenie bezwzględne (ang. mean absolute deviation), które w ogólnym przy-
padku obliczane jest z następującego wzoru:

∑ |𝑥 − 𝑥̄ |
Ś𝑟𝑒𝑑𝑛𝑖𝑒 𝑜𝑑𝑐ℎ𝑦𝑙𝑒𝑛𝑖𝑒 𝑏𝑒𝑧𝑤𝑧𝑔𝑙ę𝑑𝑛𝑒 =
𝑛

gdzie x¯ jest średnią z próby.

Najbardziej znanymi estymatorami zmienności są wariancja (ang. variance) i odchylenie standar-


dowe (ang. standard deviation), które są oparte na kwadratach odchyleń. Wariancja jest średnią
z kwadratów odchyleń, a odchylenie standardowe jest pierwiastkiem kwadratowym z wariancji.

∑ (𝑥 − 𝑥̄ )
𝑊𝑎𝑟𝑖𝑎𝑛𝑐𝑗𝑎 = 𝑠 =
𝑛−1

𝑂𝑑𝑐ℎ𝑦𝑙𝑒𝑛𝑖𝑒 𝑠𝑡𝑎𝑛𝑑𝑎𝑟𝑑𝑜𝑤𝑒 = 𝑠 = 𝑊𝑎𝑟𝑖𝑎𝑛𝑐𝑗𝑎

Odchylenie standardowe jest znacznie prostsze w interpretacji niż wariancja, ponieważ jest przed-
stawione w tej samej skali co dane oryginalne. W pierwszej chwili zdziwienie budzi fakt, że mimo
iż wzór na odchylenie standardowe jest bardziej skomplikowany i mniej intuicyjny niż wzór na
średnie odchylenie bezwzględne, to jednak odchylenie standardowe jest częściej stosowane w sta-
tystyce niż średnie odchylenie bezwzględne. W statystyce dominuje pogląd, że z punktu widzenia
pewnych niuansów matematycznych praca z kwadratami wartości jest zdecydowanie wygodniejsza
niż praca z wartościami bezwzględnymi, zwłaszcza w modelach statystycznych.

30 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Stopnie swobody i n czy n–1?
W podręcznikach do statystyki jakaś część zawsze poświęcona jest rozważaniom o tym, dlaczego
w mianowniku wzoru na wariancję występuje n–1 zamiast n, co bezpośrednio prowadzi do omó-
wienia pojęcia stopni swobody (ang. degrees of freedom). To rozróżnienie nie jest istotne w przy-
padku, gdy n jest wystarczająco duże, by różnica pomiędzy dzieleniem przez n a dzieleniem przez
n–1 była odczuwalna. Gdybyś jednak był zainteresowany, zapoznaj się z wyjaśnieniem zamieszczo-
nym poniżej. Załóżmy, że chcesz stworzyć estymatory dla populacji, bazując na próbie.
Jeśli użyjesz intuicyjnego mianownika n we wzorze na wariancję, nie doszacujesz prawdziwej
wartości wariancji i odchylenia standardowego w populacji. Mamy tu do czynienia z estymato-
rem obciążonym (ang. biased estimate). Jeśli podzielisz przez n–1 zamiast przez n, wariancja sta-
nie się estymatorem nieobciążonym (ang. unbiased estimate).
Żeby w pełni wyjaśnić, dlaczego użycie n prowadzi do obciążenia estymatora, należy wprowadzić
pojęcie stopni swobody, które biorą pod uwagę liczbę ograniczeń podczas obliczania estymatora.
W naszym przykładzie istnieje n–1 stopni swobody, ponieważ istnieje jedno ograniczenie: odchy-
lenie standardowe zależy od obliczonej średniej z próby. W większości przypadków specjaliści
data science nie muszą się przejmować stopniami swobody.

Żadna z przytoczonych powyżej miar, tj. wariancja, odchylenie standardowe czy średnie odchylenie
bezwzględne, nie jest odporna na wartości skrajne (patrz punkt „Mediana i estymatory odporne”
we wcześniejszej części tego rozdziału). Wariancja i odchylenie standardowe są szczególnie wraż-
liwe na wartości odstające, ponieważ bazują na różnicy podniesionej do kwadratu.
Odpornym estymatorem rozproszenia jest mediana odchylenia bezwzględnego od mediany
(MAD, ang. median absolute deviation from the median):

𝑀𝑒𝑑𝑖𝑎𝑛𝑎 𝑜𝑑𝑐ℎ𝑦𝑙𝑒𝑛𝑖𝑎 𝑏𝑒𝑧𝑤𝑧𝑔𝑙ę𝑑𝑛𝑒𝑔𝑜 = 𝑀𝑒𝑑𝑖𝑎𝑛𝑎(|𝑥 − 𝑚|, |𝑥 − 𝑚|, . . . , |𝑥 − 𝑚|)

gdzie m jest medianą. Podobnie jak mediana, mediana odchylenia bezwzględnego nie jest zależna
od wartości ekstremalnych. Możliwe jest również obliczenie ucinanego odchylenia standardowego
w taki sposób, w jaki oblicza się średnią ucinaną (patrz punkt „Średnia” we wcześniejszej części
tego rozdziału).

Wariancja, odchylenie standardowe, średnie odchylenie bezwzględne i mediana od-


chylenia bezwzględnego od mediany nie są równoważne, nawet w przypadku, gdy
dane pochodzą z rozkładu normalnego. Odchylenie standardowe jest zawsze większe
od średniego odchylenia bezwzględnego, które z kolei jest większe od mediany
odchylenia bezwzględnego. W przypadku rozkładu normalnego mediana odchyle-
nia bezwzględnego jest czasami mnożona przez stały współczynnik skalujący, żeby
można było ją porównać z odchyleniem standardowym. Powszechnie stosowany
współczynnik 1,4826 oznacza, że 50% rozkładu normalnego mieści się w zakresie
±MAD (zob. np. https://en.wikipedia.org/wiki/Median_absolute_deviation#Relation_
to_standard_deviation).

Miary rozproszenia | 31

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Estymatory oparte na percentylach
Kolejnym podejściem do szacowania rozproszenia jest przyjrzenie się rozrzutowi danych posorto-
wanych. Statystyki bazujące na posortowanych danych są określane mianem statystyk uporząd-
kowanych (ang. order statistics). Najbardziej podstawową z nich jest zakres (ang. range), czyli róż-
nica pomiędzy największą a najmniejszą wartością. Znajomość wartości minimalnej i wartości
maksymalnej jest przydatna i pomaga w określeniu wartości odstających, jednak jest bardzo wraż-
liwa na te wartości i niezbyt pomocna w ogólnym określaniu rozrzutu danych.
By uniknąć wrażliwości na wartości odstające, możemy popatrzeć na zakres danych po odrzuceniu
wartości z obu końców. Formalnie taki typ estymatora oparty jest na różnicach pomiędzy percen-
tylami (ang. percentiles). W zbiorze danych P-ty percentyl jest taką wartością, że co najmniej
P procent wartości jest takie samo jak ona bądź od niej mniejsze, a co najmniej (100–P) procent war-
tości jest takie samo jak ona lub od niej większe. Przykładowo żeby znaleźć 80. percentyl, najpierw
powinieneś posortować dane. Następnie, począwszy od wartości najmniejszej, przejdź po kolei
80 procent wartości, aż do największej z nich. Zauważ, że mediana jest niczym innym jak 50. percen-
tylem. Percentyl jest w zasadzie tym samym co kwantyl (ang. quantile), jednakże kwantyle okre-
ślane są przez ułamki (stąd kwantyl rzędu 0,8 będzie tym samym co 80. percentyl).
Popularną miarą rozproszenia jest różnica pomiędzy 25. percentylem i 75. percentylem, nazywana
przedziałem międzykwartylowym (ang. interquartile range). Prosty przykład to: {3, 1, 5, 3, 6, 7, 2,
9}. Po posortowaniu otrzymujemy: {1, 2, 3, 3, 5, 6, 7, 9}. Ponieważ 25. percentyl to 2,5, a 75. to 6,5,
przedział międzykwartylowy wynosi 6,5–2,5 = 4. Oprogramowanie może zaproponować inne po-
dejście, stąd też inne odpowiedzi (patrz kolejna wskazówka); zazwyczaj te różnice są mniejsze.
Dla bardzo dużych zbiorów danych wyliczenie dokładnej wartości percentyla może być obliczeniowo
bardzo wymagające, ponieważ zmusza do posortowania wszystkich danych. Metody uczenia maszyno-
wego i oprogramowanie statystyczne wykorzystują specjalne algorytmy [Zhang Wang 2007], żeby osza-
cować percentyle. Dzięki temu mogą być one obliczane bardzo szybko, z gwarancją zadanej dokładności.

Percentyle: dokładna definicja


Jeśli mamy parzystą liczbę danych (n jest parzyste), to — zgodnie z poprzednią definicją
— percentyl nie jest jednoznacznie określony. W rzeczywistości może on być dowolną
wartością pomiędzy uporządkowanymi statystykami x(j) i x(j+1), gdzie j spełnia równanie:

𝑗 𝑗 1
100 ⋅ 𝑃 100 ⋅
𝑛 𝑛
Formalnie percentyl jest średnią ważoną:

𝑃𝑒𝑟𝑐𝑒𝑛𝑡𝑦𝑙(𝑃) = (1 − 𝑤)𝑥( ) 𝑤𝑥( )

dla wag w z przedziału 0 i 1. Oprogramowanie statystyczne wykorzystuje nieco inne


podejście przy wyborze w. Funkcja w R quantile podaje dziewięć różnych sposobów
na wyliczenie kwantylu. Z wyjątkiem małych zbiorów danych, nie musisz się przej-
mować sposobem oszacowania percentyli. W czasie pisania niniejszego wydania
klasa numpy.quantile ze środowiska Python obsługuje tylko jedno rozwiązanie:
interpolację liniową.

32 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Przykład: szacowanie zmienności dla populacji Stanów Zjednoczonych
Tabela 1.3 (powtórzenie tabeli 1.2 zamieszczono dla ułatwienia) ukazuje kilka początkowych wierszy
ze zbioru danych zawierającego liczebność populacji i współczynnik morderstw dla każdego stanu.

Tabela 1.3. Kilka kolumn z data.frame zawierającego liczebność populacji i wskaźniki morderstw
dla poszczególnych stanów

State Population Murder.Rate Abbreviation


1 Alabama 4 779 736 5,7 AL.
2 Alaska 710 231 5,6 AK
3 Arizona 6 392 017 4,7 AZ
4 Arkansas 2 915 918 5,6 AR
5 California 37 253 956 4,4 CA
6 Colorado 5 029 196 2,8 CO
7 Connecticut 3 574 097 2,4 CT
8 Delaware 897 934 5,8 DE

Wykorzystując wbudowaną funkcję R dla odchylenia standardowego, IQR i mediany odchylenia bez-
względnego dla mediany, możemy obliczyć estymatory rozproszenia dla populacji poszczególnych stanów:
> sd(state[['Population']])
[1] 6848235
> IQR(state[['Population']])
[1] 4847308
> mad(state[['Population']])
[1] 3849870

Ramka danych pandas zawiera metody umożliwiające obliczanie odchylenia standardowego


i kwantyli. Dzięki kwantylom możemy z łatwością określić IQR. W przypadku odpornej mediany
odchylenia bezwzględnego dla mediany używamy funkcji robust.scale.mad z pakietu statsmodel:
state['Population'].std()
state['Population'].quantile(0.75) - state['Population'].quantile(0.25)
robust.scale.mad(state['Population'])

Odchylenie standardowe jest niemal dwukrotnie większe od mediany odchylenia bezwzględnego


(w R wyniki są domyślnie skalowane, tak by mediana odchylenia bezwzględnego mogła być po-
równana ze średnią). Nie jest to zaskoczeniem, zważywszy na to, że odchylenie standardowe jest
wrażliwe na wartości odstające.

Główne zasady
• Wariancja i odchylenie standardowe są najpowszechniej wykorzystywanymi statystykami
rozproszenia.
• I wariancja, i odchylenie standardowe są wrażliwe na wartości odstające.

• Bardziej odporne metryki to średnie odchylenie bezwzględne i mediana odchylenia bez-


względnego z mediany i percentyle (kwantyle).

Miary rozproszenia | 33

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Dla pogłębienia wiedzy
• Poświęcona statystyce strona Davida Lane’a zawiera sekcję dotyczącą percentyli: http://
onlinestatbook.com/2/introduction/percentiles.html.
• Post Kevina Davenporta na R-Bloggers o odchyleniu od mediany i jej własnościach: https://
www.r-bloggers.com/2013/08/absolute-deviation-around-the-median/.

Badanie rozkładu danych


Każdy z omówionych tu estymatorów podsumowuje dane w postaci jednej liczby opisującej ich
położenie albo rozproszenie. Użyteczne jest również zbadanie, jak wygląda ogólny rozkład danych.

Kluczowe pojęcia dotyczące badania rozkładu danych


Boxplot
Wykres zaproponowany przez Tukeya jako szybka metoda wizualizacji rozkładu danych.
Synonim
wykres pudełkowy

Tabela liczności
Zestawienie częstości wystąpienia danych numerycznych rozdzielonych na interwały.

Histogram
Wykres tabeli częstości obrazujący interwały na osi x, a liczność (lub proporcje) na osi y.
Wykresy kolumnowe z wyglądu bardzo przypominają histogramy, nie należy jednak ich ze
sobą mylić. Różnice pomiędzy nimi zostały opisane w podrozdziale „Badanie danych binar-
nych i skategoryzowanych”.

Wykres gęstości
Wygładzona wersja histogramu, zazwyczaj bazująca na jądrowym estymatorze gęstości.

Percentyle i boxploty
W punkcie „Estymatory oparte na percentylach” we wcześniejszej części tego rozdziału badaliśmy,
jak percentyle mogą być wykorzystane do określenia rozrzutu danych. Percentyle są także warto-
ściowym narzędziem do podsumowania całego rozkładu. Powszechnie używa się kwartyli (25., 50.
i 75. percentyla) i decyli (10., 20., …, 90. percentyla). Percentyle są szczególnie przydatnym wskaź-
nikiem opisującym ogony rozkładu (końce zakresu) (ang. tails, outer range). Amerykańska kultura
popularna stworzyła pojęcie one-percenters, które odnosi się do ludzi na szczycie — powyżej 99.
percentyla — zamożności.

34 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Tabela 1.4 przedstawia wybrane percentyle wskaźnika morderstw dla poszczególnych stanów.
Korzystając z języka R, można ją stworzyć za pomocą funkcji quantile:
> quantile(state[['Murder.Rate']], p=c(.05, .25, .5, .75, .95))
5% 25% 50% 75% 95%
1.600 2.425 4.000 5.550 6.510

Tabela 1.4. Percentyle wskaźnika morderstw dla poszczególnych stanów

5% 25% 50% 75% 95%


1,60 2,42 4,00 5,55 6,51

W Pythonie tę samą operację można wykonać za pomocą metody quantile dostępnej w ramce
danych pandas:
state['Murder.Rate'].quantile([0.05, 0.25, 0.5, 0.75, 0.95])

Mediana wynosi 4 morderstwa na 100 000 osób, jednakże mamy tu do czynienia ze sporym roz-
proszeniem: 5. percentyl wynosi jedynie 1,6, a 95. — 6,51.
Boxploty (wykresy pudełkowe) (ang. boxplots), zaproponowane przez Tukeya [Tukey 1977],
oparte są na percentylach i umożliwiają wizualizację rozkładu danych w szybki sposób. Rysunek 1.2
przedstawia stworzony w R boxplot dla populacji według stanów:
> boxplot(state[['Population']]/1000000, ylab='Populacja (w milionach)')
ax.set_ylabel('Populacja (w milionach)')

Rysunek 1.2. Boxplot dla populacji stanów

Moduł pandas zawiera wiele podstawowych wykresów przeznaczonych dla ramek danych; wśród
nich znajdziemy także wykresy pudełkowe:
ax = (state['Population']/1_000_000).plot.box()

Badanie rozkładu danych | 35

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Z tego wykresu można od razu odczytać, że mediana populacji stanu wynosi mniej więcej pięć
milionów, połowa stanów mieści się w zakresie od ok. 2 do ok. 7 milionów, a także że występują
elementy odstające o dużych wartościach. Górna i dolna krawędź pudełka reprezentują, odpowied-
nio, 75. i 25. percentyl. Mediana jest przedstawiona jako poprzeczna linia wewnątrz pudełka. Linie
wychodzące w górę i w dół poza pudełko, określane jako wąsy (ang. whiskers), wskazują zakres
większości danych. Istnieje wiele wariacji na temat boxplotu; dla przykładu możesz przejrzeć do-
kumentację funkcji R boxplot [R base 2015]. Domyślnie funkcja R rozciąga wąsy do najdalszych
punktów poza pudełkiem, z pominięciem tych, które przekraczają IQR 1,5 raza Ta sama imple-
mentacja jest wykorzystywana w pakiecie Matplotlib; inne oprogramowanie może działać zgodnie
z innymi zasadami.
Każdy element poza zakresem wąsów jest przedstawiany za pomocą punktu lub kółka (w ten spo-
sób często są symbolizowane wartości odstające).

Tablica częstości i histogramy


Tablica częstości zmiennej dzieli jej zakres na równoodległe przedziały i określa, jak wiele war-
tości znajduje się w każdym z nich. Tabela 1.5 przedstawia tablicę częstości dla populacji stanów
stworzoną w R:
breaks <- seq(from=min(state[['Population']]),
to=max(state[['Population']]), length=11)
pop_freq <- cut(state[['Population']], breaks=breaks,
right=TRUE, include.lowest=TRUE)
table(pop_freq)

Tabela 1.5. Tablica częstości populacji według stanów

BinNumber BinRange Count States


1. 563 626 – 4 232 658 24 WY,VT,ND,AK,SD,DE,MT,RI,NH,ME,HI,ID,NE,WV,NM,NV,UT,KS,AR,MS,IA,CT,OK,OR
2. 4 232 659 – 7 901 691 14 KY,LA,SC,AL,CO,MN,WI,MD,MO,TN,AZ,IN,MA,WA
3. 7 901 692 – 11 570 724 6 VA,NJ,NC,GA,MI,OH
4. 11 570 725 – 15 239 757 2 PA,IL
5. 15 239 758 – 18 908 790 1 FL
6. 18 908 791 – 22 577 823 1 NY
7. 22 577 824 – 26,246,856 1 TX
8. 26 246 857 – 29 915 889 0
9. 29 915 890 – 33 584 922 0
10. 33 584 923 – 37 253 956 1 CA

Funkcja pandas.cut tworzy szereg odwzorowujący wartość na segmenty. Dzięki metodzie value_counts
otrzymujemy tabelę częstości:
binnedPopulation = pd.cut(state['Population'], 10)
binnedPopulation.value_counts()

36 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Najmniej licznym ze stanów jest Wyoming, gdzie zamieszkuje 563 626 osób, a najbardziej licznym ze
stanów jest Kalifornia, gdzie mieszka 37 253 956 osób, co daje nam przedział 37 253 956 – 563 626 =
= 36 690 330. Tę wartość musimy podzielić na równe przedziały, niech będzie ich 10, w wyniku
czego otrzymujemy przedziały o zakresie 3 669 033. Pierwszy przedział będzie się rozciągał pomię-
dzy 563 626 a 4 232 658. Dla kontrastu najwyższy przedział ma zakres od 33 584 923 do 37 253 956
i zawiera jedynie jeden stan: Kalifornię. Dwa przedziały umieszczone nad nim są puste; zmiana
następuje w kolejnym, gdzie znajduje się Teksas. Niezwykle ważne jest pozostawienie tych pustych
przedziałów. To, że nie ma w nich żadnych wartości, jest również istotną informacją. Praktyczne
może być również eksperymentowanie z różną liczbą przedziałów, co zmieni obejmowane przez
nie zakresy. Jeśli będą zbyt duże, istotne cechy rozkładu mogą zostać rozmyte. Jeśli będą zbyt małe,
wynik będzie zbyt poszatkowany i stracimy szerszy obraz całości.

Zarówno tablice częstości, jak i percentyle podsumowują dane poprzez tworzenie prze-
działów. W ogólnym przypadku kwartyle i decyle będą miały równe liczby wartości
w każdym przedziale (przedziały równoliczne), ale zakresy poszczególnych przedzia-
łów będą się od siebie różniły. Natomiast tablica częstości będzie zawierać różne liczby
wartości w przedziałach o tym samym zakresie (jednakowego rozmiaru), a rozmiary
przedziałów będą takie same.

Histogram jest metodą wizualizacji tablicy częstości; przedziały znajdują się na osi x, a liczność
danych jest na osi y. Na przykład na rysunku 1.3 przedział mający środek w punkcie 10 milionów
(1e+07) mieści się w przybliżonym zakresie od 8 milionów do 12 milionów i uwzględnia sześć
stanów. Żeby stworzyć histogram odpowiadający tabeli 1.5 w R, należy wykorzystać funkcję hist
z argumentem breaks:
hist(state[['Population']], breaks=breaks)

Rysunek 1.3. Histogram populacji według stanów

Badanie rozkładu danych | 37

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Moduł pandas obsługuje histogramy ramek danych za pomocą metody DataFrame.plot.hist.
Argument bins definiuje liczbę przedziałów. Różne metody zwracają obiekt osi, dzięki któremu
można dalej uszczegóławiać wizualizację za pomocą pakietu Matplotlib:
ax = (state['Population'] / 1_000_000).plot.hist(figsize=(4, 4))
ax.set_xlabel('Populacja (w milionach)')

Wynik działania w postaci histogramu przedstawiono na rysunku 1.3.


• Puste przedziały włączamy do wykresu.
• Przedziały mają jednakową szerokość.
• Liczbę przedziałów (jest to równoznaczne z rozmiarem przedziałów) dobiera użytkownik.
• Kolejne słupki wykresu przylegają do siebie — nie ma pustych przestrzeni, chyba że istnieją
puste przedziały.
W ogólnym przypadku histogramy rysowane są według następujących zasad:

Momenty statystyczne
W teorii statystyki położenie i rozproszenie są określane jako pierwszy i drugi moment
centralny (ang. moments) rozkładu, a trzeci i czwarty moment centralny to skośność
(ang. skewness) i kurtoza (ang. kurtosis). Skośność określa, czy dane są skośne do
mniejszej lub większej wartości, a kurtoza wskazuje na obecność skrajnych wartości
w danych. W ogólnym przypadku zamiast miar do obliczania skośności i kurtozy
wykorzystuje się wizualne przedstawienia rozkładów do ich określenia, tak jak po-
kazano na rysunkach 1.2 i 1.3.

Szacowanie i wykresy gęstości rozkładu


Bezpośrednio powiązany z histogramem jest wykres gęstości rozkładu, który przedstawia rozkład
wartości danych jako linię ciągłą. Wykres gęstości można potraktować jako wygładzony histogram,
mimo że jest on wyliczany bezpośrednio z danych, poprzez estymator jądrowy gęstości (ang.
kernal density estimate) (krótki opis tego procesu znajdziesz w [Duong 2001]). Rysunek 1.4 przed-
stawia gęstość rozkładu złożoną z histogramem. W R możesz obliczyć gęstość rozkładu, wykorzy-
stując funkcję density:
hist(state[['Murder.Rate']], freq=FALSE)
lines(density(state[['Murder.Rate']]), lwd=3, col='blue')

Moduł pandas zawiera metodę density służącą do tworzenia wykresu gęstości rozkładu. Argument
bw_method określa stopień wygładzenia krzywej gęstości:
ax = state['Murder.Rate'].plot.hist(density=True, xlim=[0,12], bins=range(1,12))
state['Murder.Rate'].plot.density(ax=ax)
ax.set_xlabel('Wskaźnik morderstw (na 100 000 osób)')

Funkcje wykresów często przyjmują dodatkowy argument osi (ax), dzięki któremu wykres jest
dodawany do tego samego grafu.

38 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 1.4. Gęstość rozkładu wskaźnika morderstw dla poszczególnych stanów

Podstawową różnicą w stosunku do rysunku 1.3 jest skala na osi y: wykres gęstości wykorzystuje
proporcje, nie liczności jak histogram (określasz to w R za pomocą argumentu freq=FALSE). Należy
zauważyć, że całkowita powierzchnia pod krzywą gęstości wynosi 1, a zamiast liczby przedziałów
obliczana jest tu powierzchnia pod krzywą pomiędzy dwoma dowolnymi punktami na osi x, co jest
równoznaczne proporcji rozkładów znajdujących się pomiędzy tymi dwoma punktami.

Szacowanie gęstości rozkładu


Szacowanie gęstości to temat szeroki, o długiej historii w literaturze statystycznej.
Ponad 20 dostępnych pakietów R zawiera funkcję do szacowania gęstości rozkładu.
W swoim artykule z 2011 r. H. Deng i H. Wickham przedstawiają wszechstronny
przegląd pakietów R, ze szczególnym uwzględnieniem ASH i KernSmooth. Metody
oszacowywania gęstości w modułach pandas i scikit-learn również cechują się do-
brymi implementacjami. Jednak w wielu sytuacjach w przypadku data science nie
ma potrzeby roztrząsania niuansów różnych metod szacowania gęstości rozkładu;
wystarczające są funkcje podstawowe.

Główne zasady
• Histogram częstości przedstawia częstość występowania na osi y, a wartości zmiennych na
osi x, co w prosty sposób pozwala zobrazować rozkład danych.
• Tablica liczności jest stabelaryzowaną wersją częstości występowania, jaką przedstawia histogram.

• Boxplot — z górną i dolną wartością na, odpowiednio, 75. i 25. percentylu — także łatwo
wizualizuje rozkład danych; najczęściej rysuje się boxploty jeden obok drugiego, by móc po-
równywać rozkłady.
• Wykres gęstości jest wygładzoną wersją histogramu i wymaga funkcji do oszacowania krzy-
wej na podstawie danych (oczywiście istnieje wiele metod szacowania).

Badanie rozkładu danych | 39

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Dla pogłębienia wiedzy
• Wykładowca z SUNY Oswego udostępnił przewodnik, który krok po kroku opisuje, w jaki
sposób tworzyć boxploty, dostępny pod adresem: http://www.oswego.edu/~srp/stats/bp_con.htm.
• Szacowanie gęstości w R jest przedstawione w artykule Henry’ego Denga i Hadleya Whickhama,
dostępnym pod adresem: http://vita.had.co.nz/papers/density-estimation.pdf.
• R-Bloggers opublikowali praktyczny post o histogramach w R (https://www.r-bloggers.com/
2012/12/basics-of-histograms/), zawierający również elementy personalizacji, takie jak binning
(podziały).
• R-Bloggers opracowali również podobny artykuł o boxplotach, dostępny pod adresem: https://
www.r-bloggers.com/2013/06/box-plot-with-r-tutorial/.
• Matthew Conlen opublikował interaktywną prezentację (https://mathisonian.github.io/kde/)
ukazującą wpływ doboru różnych jąder i szerokości na jądrowe oszacowanie gęstości.

Badanie danych binarnych i skategoryzowanych


Dla danych skategoryzowanych prosty odsetek lub procent opowiada historię danych.

Kluczowe pojęcia dotyczące badania danych skategoryzowanych


Moda
Wartość występująca najczęściej w zbiorze danych.

Wartość oczekiwana
Jeśli kategorie można przypisać do wartości numerycznych, będzie to średnia wartość ba-
zująca na prawdopodobieństwie wystąpienia danej kategorii.

Wykres słupkowy
Częstość lub odsetek dla każdej kategorii przedstawione w postaci słupków.

Wykres kołowy
Częstość lub odsetek dla każdej kategorii przedstawione jako wycinek koła.

Stworzenie opisu dla zmiennej binarnej lub skategoryzowanej z kilkoma kategoriami jest całkiem
proste: trzeba znaleźć odsetek jedynek albo najważniejszej kategorii. Tabela 1.6 przedstawia przy-
kładowy procent opóźnionych lotów na lotnisku Fort Worth w Dallas od 2010 r. w zależności od
przyczyny opóźnienia. Opóźnienia są podzielone według następujących kategorii: z winy przewoź-
nika (Carrier), z winy systemu kontroli lotów (ATC), przez pogodę (Weather), ze względów bez-
pieczeństwa (Security), przez opóźniony przylot (Inbound).

Tabela 1.6. Procent opóźnień na lotnisku Fort Worth w Dallas ze względu na ich przyczynę

Carrier ATC Weather Security Inbound


23,02 30,40 4,03 0,12 42,43

40 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Wykresy słupkowe są powszechną metodą przedstawiania pojedynczych danych skategoryzowa-
nych, często można je znaleźć w prasie popularnej. Kategorie są wypisane na osi x, a częstość wy-
stępowania lub odsetki na osi y. Rysunek 1.5 przedstawia dane dla opóźnień lotów na lotnisku Fort
Worth w Dallas (DFW) dla jednego roku w zależności od przyczyny; można go stworzyć za pomocą
funkcji R barplot:
barplot(as.matrix(dfw) / 6, cex.axis=0.8, cex.names=0.7,
xlab='Powód opóźnienia', ylab='Liczba')

Rysunek 1.5. Wykres słupkowy dla opóźnień na lotnisku DFW ze względu na przyczynę

Moduł pandas także pozwala wyświetlać ramki danych za pomocą wykresów słupkowych:
ax = dfw.transpose().plot.bar(figsize=(4, 4), legend=False)
ax.set_xlabel('Powód opóźnienia')
ax.set_ylabel('Liczba')

Zwróć uwagę na to, że wykres słupkowy przypomina histogram; w wykresie słupkowym na osi x
przedstawione są poszczególne kategorie, a w histogramie oś x reprezentuje wartości nume-
ryczne jednej zmiennej. W histogramie słupki wykresu najczęściej przylegają do siebie; przerwa
sugeruje wartości, które nie występują w danych. Na wykresie słupkowym natomiast słupki są
od siebie oddzielone.
Wykres kołowy jest alternatywą dla wykresu słupkowego, jednakże statystycy i eksperci w dziedzi-
nie wizualizacji danych unikają go, gdyż wizualnie jest trudniejszy w interpretacji [Few 2007].

Badanie danych binarnych i skategoryzowanych | 41

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Dane numeryczne jako dane skategoryzowane
W punkcie „Tablica częstości i histogramy” we wcześniejszej części tego rozdziału
prezentowane były tablice częstości oparte na przedziałach danych, co wprost nadaje
danym numerycznym cechę uporządkowania. W tym sensie histogram i wykres
słupkowy są podobne, jedynie kategorie na osi x wykresu słupkowego nie są upo-
rządkowane. Zamiana danych numerycznych na dane kategoryzowane jest ważnym
i szeroko stosowanym aspektem w analizie danych, ułatwiającym zmniejszenie zło-
żoności (rozmiaru) danych. Pomaga to w wykrywaniu zależności pomiędzy cechami,
zwłaszcza na początkowym etapie analizy.

Moda
Moda jest wartością — lub, w przypadkach łączonych, wartościami — która pojawia się najczęściej
w danych. Modą w przykładzie dotyczącym opóźnień lotów z lotniska Fort Worth w Dallas jest
„przylot”. Modą dla większości regionów Stanów Zjednoczonych w przypadku wyznania będzie
„chrześcijanin”. Moda jest prostą statystyką opisową dla danych kategoryzowanych i nie jest uży-
wana dla danych numerycznych.

Wartość oczekiwana
Specjalnym typem danych skategoryzowanych są dane, w których przypadku kategorie reprezen-
tują dyskretne wartości na jednej skali lub mogą być do nich przypisane. Załóżmy, że handlowiec
proponuje dwa typy usług dla nowej technologii w chmurze: jeden za 300 $/miesiąc, a drugi
za 50 $/miesiąc. Oferuje on również darmowe webinarium wprowadzające. Firma obliczyła, że 5%
uczestników webinarium wybrało ofertę za 300 $, 15% za 50 $, a 80% nie skorzystało z żadnej oferty.
Powyższe dane mogą być opisane jako cel finansowy z pojedynczą „wartością oczekiwaną”, przed-
stawioną w postaci średniej ważonej; wagami są w tym przypadku prawdopodobieństwa.
Wartość oczekiwaną możesz obliczyć następująco:
1. Przemnóż wszystkie wyniki przez prawdopodobieństwa ich występowania.
2. Zsumuj otrzymane wartości.
W przykładzie dotyczącym usług w chmurze wartość oczekiwana dla uczestnika webinarium wy-
nosi 22,5 $/miesiąc, co obliczamy następująco:

𝑊𝑂 = (0,05)(300) (0,15)(50) (0,80)(0) = 22,5

Wartość oczekiwana jest w rzeczywistości formą średniej ważonej: oddaje idee przyszłych oczeki-
wań i wag dotyczących prawdopodobieństwa, zazwyczaj bazuje na subiektywnej ocenie. Wartość
oczekiwana jest podstawowym pojęciem w wycenie biznesowej i budżetowaniu — chodzi o wartość
oczekiwaną z pięciu lat dla zysków z nowej inwestycji lub oczekiwane oszczędności z nowego opro-
gramowania do zarządzania w klinice.

42 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Prawdopodobieństwo
Wspomnieliśmy powyżej o prawdopodobieństwie (ang. probability) wystąpienia wartości. Więk-
szość ludzi rozumie pojęcie prawdopodobieństwa intuicyjnie i spotyka się z nim często podczas
oglądania prognozy pogody (możliwość wystąpienia opadów) lub wydarzeń sportowych (prawdo-
podobieństwo zwycięstwa). W sporcie i grach częściej stosuje się pojęcie szans (ang. odds), które
można z łatwością przekształcić w prawdopodobieństwo (jeżeli szanse zespołu na zwycięstwo wy-
noszą dwa do jednego, prawdopodobieństwo wygranej jest równe 2/(2+1) = 2/3. Co ciekawe, próby
zdefiniowania prawdopodobieństwa stanowią źródło ożywionej i głębokiej dyskusji filozoficznej.
Na szczęście nie potrzebujemy tutaj formalnej definicji matematycznej ani filozoficznej. W naszym
przypadku prawdopodobieństwo wystąpienia jakiegoś zdarzenia zdefiniujemy jako odsetek przy-
padków, w jakich to zdarzenie wystąpi, przy założeniu, że dana sytuacja będzie powtarzana niezli-
czoną liczbę razy. Najczęściej taki konstrukt jest czysto abstrakcyjny, ale pozwala dobrze zrozumieć
pojęcie prawdopodobieństwa.

Główne zasady
• Dane skategoryzowane są zazwyczaj opisywane za pomocą procentów i mogą być przedsta-
wiane na wykresach słupkowych.
• Kategorie mogą reprezentować odrębne podmioty (jabłka i pomarańcze, mężczyzn i kobiety),
poziomy zmiennej czynnikowej (niski, średni, wysoki) lub dane numeryczne, które można
zaklasyfikować do przedziałów.
• Wartość oczekiwana jest sumą wartości pomnożonych przez ich prawdopodobieństwo
wystąpienia; najczęściej sumuje się poziomy zmiennej czynnikowej.

Dla pogłębienia wiedzy


Kurs statystyki nie jest pełny bez rozdziału o metodach manipulacji wykresem w celu wprowadze-
nia czytelnika w błąd (https://en.wikipedia.org/wiki/Misleading_graph); często dotyczy to wykresów
słupkowych i kołowych.

Korelacja
Badania eksploracyjne danych w wielu przypadkach (czy to w data science, czy w nauce) wyma-
gają sprawdzenia korelacji pomiędzy zmiennymi predykcyjnymi, jak również między zmien-
nymi predykcyjnymi a zmienną decyzyjną. Można powiedzieć, że zmienne X i Y (każda z nich
zawiera zmierzone dane) są pozytywnie skorelowane, jeśli wysokie wartości X odpowiadają
wysokim wartościom Y, a niskie wartości X odpowiadają niskim wartościom Y. Jeśli wysokie
wartości X odpowiadają niskim wartościom Y i odwrotnie, to mówimy, że zmienne są negatyw-
nie skorelowane.

Korelacja | 43

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące korelacji
Współczynnik korelacji
Metryka, która mierzy, do jakiego stopnia zmienne numeryczne są ze sobą powiązane
(zmienia się od –1 do +1).

Macierz korelacji
Tabela, w której zmienne powtarzają się w wierszach i kolumnach, a wartości w komórkach
odpowiadają korelacji pomiędzy nimi.

Wykres punktowy
Wykres, w którym na osi x przedstawione są wartości jednej zmiennej, a na osi y wartości
drugiej zmiennej.

Rozważmy przypadek dwóch zmiennych idealnie skorelowanych:


v1: {1, 2, 3}
v2: {4, 5, 6}

Wektor sumy iloczynów wynosi 1·4+2·5+3·6 = 32. Spróbuj przemieszać jeden z nich i policzyć od
nowa — wektor sumy iloczynów nigdy nie będzie większy niż 32. Obliczona suma iloczynów może
być wykorzystana jako metryka; oznacza to, że obserwowana suma 32 może być porównywana do
wielu innych losowo przemieszanych wyników (w rzeczywistości idea ta nawiązuje do szacowania
opartego na testach randomizacyjnych; patrz punkt „Test permutacyjny” w rozdziale 3.). Jednak
wartości obliczone za pomocą tej metryki nie są zbyt znaczące, poza odniesieniem do rozkładu
randomizowanego.
Bardziej użyteczny jest wariant standaryzowany: współczynnik korelacji (ang. correlation coefficient),
który odpowiada oszacowaniu korelacji pomiędzy dwoma zmiennymi, przedstawionymi w tej sa-
mej skali. Aby obliczyć współczynnik korelacji Pearsona (ang. Pearson’s correlation coefficient),
należy pomnożyć odchylenia od średniej dla zmiennej 1, pomnożyć przez odchylenia od średniej
dla zmiennej 2, a następnie podzielić przez iloczyn odchyleń standardowych:

∑ (𝑥 − 𝑥̄ )(𝑦 − 𝑦̄ )
𝑟=
(𝑛 − 1)𝑠 𝑠

Zwróć uwagę na to, że dzielimy przez n–1 zamiast przez n (patrz ramka „Stopnie swobody i n czy
n–1” we wcześniejszej części tego rozdziału). Współczynnik korelacji zawsze przyjmuje wartości od
+1 (idealna dodatnia korelacja) do –1 (idealna negatywna korelacja); 0 wskazuje na brak korelacji.
Zmienne mogą być powiązane również w sposób nieliniowy; w takim przypadku współczynnik
korelacji może nie być przydatną metryką. Związek pomiędzy wysokością podatków a ich ściągal-
nością może być tego przykładem: wysokość podatków rośnie od 0, ściągalność również. Jednakże
kiedy wysokość podatków osiąga wysoki poziom, zbliżając się do 100%, rośnie liczba osób uchyla-
jących się od ich płacenia, dlatego dochód z podatków w zasadzie maleje.

44 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Tabela 1.7, nazywana macierzą korelacji (ang. correlation matrix), przedstawia korelacje pomiędzy
dziennymi zwrotami dla akcji telekomunikacyjnych od lipca 2012 r. do czerwca 2015 r. Z tabeli
możesz odczytać, że Verizon (VZ) i ATT (T) mają największą korelację z pozostałymi akcjami.
Level Three (LVLT), które jest przedsiębiorstwem zajmującym się infrastrukturą, ma najniższą ko-
relację w stosunku do pozostałych. Zauważ, że na przekątnej macierzy wartości wynoszą 1 (kore-
lacja akcji z samą sobą), a wartości w macierzy nad i pod przekątną powtarzają się.

Tabela 1.7. Korelacja pomiędzy zwrotami z akcji telekomunikacyjnych

T CTL FTR VZ LVLT


T 1,000 0,455 0,359 0,681 0,082
CLT 0,455 1,000 0,435 0,448 0,096
FTR 0,359 0,435 1,000 0,349 0,111
VZ 0,681 0,448 0,349 1,000 0,096
LVLT 0,082 0,096 0,111 0,096 1,000

Tabela korelacji, taka jak tabela 1.7, jest najczęściej przedstawiana w postaci wykresu, by można
było zwizualizować zależności pomiędzy wieloma zmiennymi. Rysunek 1.6 przedstawia korelację
pomiędzy dziennymi zwrotami dla głównych funduszy ETF (ang. exchange-traded fund). W R można
w prosty sposób stworzyć taki wykres za pomocą funkcji corrplot:
etfs <- sp500_px[row.names(sp500_px) > '2012-07-01',
sp500_sym[sp500_sym$sector == 'etf', 'symbol']]
library(corrplot)
corrplot(cor(etfs), method='ellipse')

Rysunek 1.6. Korelacja pomiędzy zwrotami funduszy ETF

Korelacja | 45

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Jest możliwe utworzenie takiego samego wykresu w Pythonie, ale żaden ze standardowych pakie-
tów nie zawiera odpowiedniej implementacji. Jednakże większość z nich obsługuje wizualizację
macierzy korelacji za pomocą map cieplnych. W poniższym listingu wykorzystamy w tym celu pa-
kiet seaborn.heatmap. W materiałach dodatkowych umieściliśmy kod Pythona generujący bardziej
zaawansowaną wizualizację:
etfs = sp500_px.loc[sp500_px.index > '2012-07-01',
sp500_sym[sp500_sym['sector'] == 'etf']['symbol']]
sns.heatmap(etfs.corr(), vmin=-1, vmax=1,
cmap=sns.diverging_palette(20, 220, as_cmap=True))

Wyniki ETF dla S&P 500 (SPY) i dla Dow Jones Index (DIA) mają wysoką korelację. Podobnie
QQQ i XLK, złożone głownie ze spółek technologicznych, są pozytywnie skorelowane. Defensywne
ETF-y, takie, które śledzą np. ceny złota (GLD), ceny ropy naftowej (USO) czy zmienność rynku
(VXX), zdają się słabo lub negatywnie skorelowane z pozostałymi wskaźnikami. Orientacja elipsy
wskazuje, czy dwie zmienne są skorelowane dodatnio (elipsa skierowana w prawo i do góry), czy
ujemnie (elipsa skierowana w lewo i do góry). Odcień i grubość elipsy wskazują na siłę powiązania:
cieńsza i ciemniejsza elipsa odpowiada silniejszym relacjom.
Podobnie jak średnia i odchylenie standardowe, współczynnik korelacji jest wrażliwy na dane od-
stające. Pakiety oprogramowania oferują wydajne alternatywy dla klasycznego współczynnika ko-
relacji, np. dostępny w R pakiet robust (https://cran.r-project.org/web/packages/robust/robust.pdf)
wykorzystuje funkcję covRob do obliczania odpornego oszacowania korelacji. Metody dostępne w module
sklearn.covariance (https://scikit-learn.org/stable/modules/classes.html#module-sklearn.covariance)
pakietu scikit-learn implementują różne możliwe rozwiązania.

Inne oszacowania korelacji


Statystycy wiele lat temu zaproponowali inne współczynniki korelacji, takie jak rho
Spearmana (Spearman’s rho) czy tau Kendalla (Kendall’s tau). Te współczynniki
korelacji bazują na szeregach danych. Ponieważ obliczane są na podstawie rankin-
gów, a nie wartości, oszacowania te są odporne na wartości odstające i pewne typy
nieliniowości. W data science wystarczą współczynnik korelacji Pearsona i jego al-
ternatywne, wydajniejsze wersje. Odnoszenie się do rankingów oszacowań jest sto-
sowane w przypadku mniejszych zbiorów danych i specyficznych testów hipotez.

Wykres punktowy
Standardowym sposobem wizualizacji związku pomiędzy dwoma mierzonymi zmiennymi jest wy-
kres punktowy (ang. scatterplot). Oś x reprezentuje jedną zmienną, a oś y drugą; każdy punkt wy-
kresu jest wierszem. Rysunek 1.7 przedstawia wykres korelacji pomiędzy dziennymi zwrotami dla
firm ATT i Verizon. Można go stworzyć za pomocą komendy w R:
plot(telecom$T, telecom$VZ, xlab='ATT (T)', ylab='Verizon (VZ)')

Taki sam wykres można wygenerować w Pythonie za pomocą metody scatter z modułu pandas:
ax = telecom.plot.scatter(x='T', y='VZ', figsize=(4, 4), marker='$\u25EF$')
ax.set_xlabel('ATT (T)')
ax.set_ylabel('Verizon (VZ)')
ax.axhline(0, color='grey', lw=1)
ax.axvline(0, color='grey', lw=1)

46 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 1.7. Wykres punktowy korelacji pomiędzy zwrotami dla ATT (T) i Verizon (VZ)

Zwroty mają pozytywne powiązanie: gdy dane są zgrupowane w pobliżu środka układu współrzęd-
nych, przez większość dni wartości obu akcji rosły lub malały wspólnie (ćwiartki pierwsza i trzecia).
Było tylko kilka dni, kiedy wartości jednej akcji znacząco malały, a drugiej rosły i odwrotnie
(ćwiartki druga i czwarta).
Wykres widoczny na rysunku 1.7 zawiera jedynie 754 punkty danych, ale jest oczywiste, że rozpo-
znawanie szczegółów w środku wykresu jest niemal niemożliwe. W dalszej części rozdziału poka-
żemy, że dodawanie przezroczystości do punktów danych lub stosowanie przedziałów heksagonal-
nych i wykresów gęstości ułatwia wykrywanie ukrytych struktur danych.

Główne zasady
• Współczynnik korelacji mierzy stopień, w jakim dwie zmienne (np. wzrost i waga człowieka)
są powiązane ze sobą.
• Kiedy wraz z wysoką wartością v1 występuje wysoka wartość v2, wtedy v1 i v2 są powiązane
dodatnio.
• Kiedy wraz z wysoką wartością v1 występuje niska wartość v2, wtedy v1 i v2 są powiązane
ujemnie.
• Współczynnik korelacji jest standardową metryką, która zawsze przyjmuje wartości z za-
kresu –1 (idealna negatywna korelacja) do +1 (idealna pozytywna korelacja).
• Współczynnik korelacji o wartości 0 wskazuje na brak korelacji, ale musisz być świadomy,
że losowe zbiory danych mogą przez przypadek dawać pozytywny bądź negatywny współ-
czynnik korelacji.

Korelacja | 47

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Dla pogłębienia wiedzy
Bardzo dobre omówienie zagadnienia korelacji znajdziesz w: David Freedman, Robert Pisani,
Roger Purves, Statistics, 4th ed., W.W. Norton, 2007.

Badanie dwóch lub więcej zmiennych


Znane nam już estymatory, takie jak średnia czy wariancja, biorą pod uwagę tylko jedną zmienną
naraz [jest to analiza jednoczynnikowa (ang. univariate analysis)]. Analiza korelacji (patrz pod-
rozdział „Korelacja” we wcześniejszej części tego rozdziału) jest ważną metodą, która porównuje
dwie zmienne [jest to analiza dwuczynnikowa (ang. bivariate analysis)]. W tej części zajmiemy się
dodatkowymi oszacowaniami i wykresami dla więcej niż dwóch zmiennych [czyli analizą wielo-
czynnikową (ang. multivariate analysis)].

Kluczowe pojęcia dotyczące badania dwóch lub więcej zmiennych


Tablica kontyngencji
Zestawienie liczności dla dwóch lub więcej zmiennych skategoryzowanych.

Wykres hexagon binning


Wykres dwóch zmiennych numerycznych z wynikami przedstawionymi w postaci sze-
ściokątów.

Wykres konturowy
Wykres przedstawiający gęstość dwóch zmiennych numerycznych podobnie jak mapy to-
pograficzne.

Wykres skrzypcowy
Wykres podobny do boxplotu, ale przedstawiający szacowaną gęstość.

Podobnie jak analiza jednoczynnikowa, analiza wieloczynnikowa obejmuje zarówno obliczanie


statystyk opisowych, jak i wizualizację wyników. Odpowiedni rodzaj analizy dwuczynnikowej lub
wieloczynnikowej zależy od rodzaju danych: numerycznych lub skategoryzowanych.

Wykres przedziałów heksagonalnych i wykres konturowy


(przedstawianie danych numerycznych względem danych numerycznych)
Wykresy punktowe są dobre, gdy musisz przedstawić względnie niewielki zbiór danych. Wykres
zwrotu z akcji z rysunku 1.7 zawierał około 750 punktów. Dla każdego zbioru danych z setkami
tysięcy lub milionami wpisów wykres punktowy byłby zbyt gęsty, dlatego potrzebujemy innego
sposobu na wizualizację tych zależności. Dla zobrazowania problemu rozważmy zbiór danych
kc_tax, który zawiera szacowany podatek dla domów mieszkalnych w King County w stanie Wa-
szyngton. Żeby móc się skupić na najważniejszej części danych, pozbędziemy się bardzo drogich,
bardzo małych lub bardzo dużych posiadłości; wykorzystamy do tego funkcję subset:

48 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


kc_tax0 <- subset(kc_tax, TaxAssessedValue < 750000 &
SqFtTotLiving > 100 &
SqFtTotLiving < 3500)
nrow(kc_tax0)
432693

W module pandas filtrujemy zestaw danych następująco:


kc_tax0 = kc_tax.loc[(kc_tax.TaxAssessedValue < 750000) &
(kc_tax.SqFtTotLiving > 100) &
(kc_tax.SqFtTotLiving < 3500), :]
kc_tax0.shape
(432693, 3)

Rysunek 1.8 jest wykresem przedziałów heksagonalnych (ang. hexagonal binning, hexbin) dla
zależności pomiędzy rozmiarem końcowym a obliczoną wartością podatku dla domów w King
County. Zamiast wykreślać punkty, które stworzyłyby jednolitą ciemną plamę, pogrupowaliśmy
wpisy w sześcienne komórki i narysowaliśmy je w taki sposób, żeby kolor odpowiadał liczbie ele-
mentów w danej komórce. Na tym wykresie dodatnia korelacja pomiędzy wielkością a naliczonym
podatkiem jest oczywista. Interesującą cechą jest ślad dodatkowych pasm powyżej pasma głównego
(czarnego) znajdującego się u spodu, które wskazuje na domy o podobnej powierzchni, jak w głów-
nym paśmie, ale z przypisanym większym podatkiem.

Rysunek 1.8. Wykres typu hexagon binning dla zależności wartości podatku od powierzchni domu

Badanie dwóch lub więcej zmiennych | 49

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 1.8 został wygenerowany przez potężny pakiet R ggplot2, stworzony przez Hadleya Wickhama
[ggplot2]. ggplot2 jest jedną z nowych bibliotek stworzonych do zaawansowanej, wizualnej analizy
danych (patrz punkt „Wizualizacja wielu zmiennych” w dalszej części tego rozdziału).
ggplot(kc_tax0, (aes(x=SqFtTotLiving, y=TaxAssessedValue))) +
stat_binhex(color='white') +
theme_bw() +
scale_fill_gradient(low='white', high='black') +
labs(x='Powierzchnia domu', y='Wartość podatku')

W Pythonie wykresy typu hexbin są dostępne w metodzie hexbin ramki danych pandas:
ax = kc_tax0.plot.hexbin(x='SqFtTotLiving', y='TaxAssessedValue',
gridsize=30, sharex=False, figsize=(5, 4))
ax.set_xlabel('Powierzchnia domu')
ax.set_ylabel('Wartość podatku')

Rysunek 1.9 wykorzystuje kontury nałożone na wykres punktowy, by zobrazować związki pomię-
dzy dwoma zmiennymi numerycznymi. Kontury są zasadniczo mapą topograficzną dwóch zmien-
nych; każdy kontur zawiera konkretne zagęszczenie punktów rosnących w kierunku „szczytu”.
Przedstawiony wykres obrazuje podobny przykład jak rysunek 1.8: widoczny jest drugi wierzchołek
„na północ” od głównego szczytu. Ten wykres stworzono za pomocą funkcji geom_density2d, rów-
nież z biblioteki ggplot2.
ggplot(kc_tax0, aes(SqFtTotLiving, TaxAssessedValue)) +
theme_bw() +
geom_point(alpha=0.1) +
geom_density2d(color='white') +
labs(x='Powierzchnia domu', y='Wartość podatku')

Funkcja kdeplot z pakietu seaborn w Pythonie tworzy wykres konturowy:


ax = sns.kdeplot(kc_tax0.SqFtTotLiving, kc_tax0.TaxAssessedValue, ax=ax)
ax.set_xlabel('Powierzchnia domu')
ax.set_ylabel('Wartość podatku')

Rysunek 1.9. Wykres konturowy dla zależności wartości podatku od powierzchni domu

50 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Istnieją również inne rodzaje wykresów wykorzystywane do obrazowania zależności pomiędzy
dwoma zmiennymi numerycznymi, np. heatmapy (ang. heat maps). Heatmapy, wykresy hexagon
binning i konturowe obrazują gęstość w dwóch wymiarach. Dzięki temu są naturalnymi analogami
do histogramów i wykresów gęstości.

Dwie zmienne skategoryzowane


Prostym sposobem na opisanie dwóch zmiennych skategoryzowanych jest tablica kontyngencji —
tablica liczności według kategorii. Tabela 1.8 przedstawia tablicę kontyngencji pomiędzy notami
kredytów osobistych a uzyskanym wynikiem. Dane są udostępnione przez firmę Lending Club,
lidera na rynku bezpośrednich usług kredytowych. Skala zaczyna się od A (wysoki) do G (niski).
Wynikami mogą być: spłacony, trwający, opóźniony, oddalony (nie jest spodziewana spłata zadłu-
żenia). Tabela przedstawia liczności i wartości procentowe. Wysoko notowane pożyczki mają nie-
wielki odsetek opóźnionych spłat lub oddaleń w porównaniu do pożyczek niżej ocenionych.

Tabela 1.8. Tablica kontyngencji dla noty pożyczki i jej statusu

Grade Charged Off Current Fully Paid Late Total


A 1562 50 051 20 408 469 72 490
0,022 0,69 0,282 0,006 0,161
B 5302 93 852 31 160 2056 132 370
0,04 0,709 0,235 0,016 0,294
C 6023 88 928 23 147 2777 120 875
0,05 0,736 0,191 0,023 0,268
D 5007 53 281 13 681 2308 74 277
0,067 0,717 0,184 0,031 0,165
E 2842 24 639 5949 1374 34 804
0,082 0,708 0,171 0,039 0,077
F 1526 8444 2328 606 12 904
0,118 0,654 0,18 0,047 0,029
G 409 1990 643 199 3241
0,126 0,614 0,198 0,061 0,007
Suma 22 671 321 185 97 316 9789 450 961

Tabele kontyngencji mogą przechowywać tylko zliczenia albo mogą zawierać także wartości pro-
centowe dla każdej kolumny oraz wartość sumaryczną. Tabela przestawna w Excelu jest najpraw-
dopodobniej najpopularniejszym narzędziem do tworzenia tablicy kontyngencji. W R funkcja
CrossTable z pakietu descr tworzy tablice kontyngencji, a do stworzenia tabeli 1.8 wykorzystano
następującą funkcję:
library(descr)
x_tab <- CrossTable(lc_loans$grade, lc_loans$status,
prop.c=FALSE, prop.chisq=FALSE, prop.t=FALSE)

Badanie dwóch lub więcej zmiennych | 51

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Metoda pivot_table tworzy tabelę przestawną w Pythonie. Za pomocą argumentu aggfunc uzy-
skujemy zliczenia. Obliczanie wartości procentowych okazuje się nieco bardziej skomplikowane:
crosstab = lc_loans.pivot_table(index='grade', columns='status',
aggfunc=lambda x: len(x), margins=True)

df = crosstab.loc['A':'G',:].copy()
df.loc[:,'Charged Off':'Late'] = df.loc[:,'Charged Off':'Late'].div(df['All'],
axis=0)
df['All'] = df['All'] / sum(df['All'])
perc_crosstab = df

Argument margins dodaje sumy kolumn i rzędów.


Tworzymy kopię tabeli przestawnej.
Dzielimy rzędy przez sumę rzędów.
Dzielimy kolumnę 'All' przez jej sumę.

Dane kategoryzowane i numeryczne


Zestaw boxplotów (patrz punkt „Percentyle i boxploty” we wcześniejszej części tego rozdziału) jest
prostą metodą porównywania rozkładów danych numerycznych pogrupowanych według zmien-
nej kategorycznej. Możemy chcieć porównać odsetek opóźnionych lotów w zależności od przewoź-
nika. Rysunek 1.10 przedstawia odsetek lotów opóźnionych z winy przewoźnika na miesiąc.
boxplot(pct_carrier_delay ~ airline, data=airline_stats, ylim=c(0,50))

Metoda boxplot z modułu pandas przyjmuje argument by rozdzielający zestaw danych na grupy,
a następnie tworzy poszczególne wykresy pudełkowe:
ax = airline_stats.boxplot(by='airline', column='pct_carrier_delay')
ax.set_xlabel('')
ax.set_ylabel('Procent opóźnionych lotów')
plt.suptitle('')

Alaska wydaje się mieć najmniejsze problemy z opóźnieniami, a American ma ich najwięcej: dolny
kwartyl dla firmy American jest wyżej niż górny dla firmy Alaska.
Wykres skrzypcowy (ang. violin plot) wprowadzony w 1998 r. przez Hintzego i Nelsona jest roz-
szerzoną wersją boxplotu i obrazuje szacowanie gęstości wraz z gęstością na osi y. Gęstość jest od-
bita i odwrócona, a kształt wynikowy tworzy obraz przypominający skrzypce. Zaletą wykresu skrzyp-
cowego jest ukazywanie niuansów w różnicach rozkładów, które nie są zauważalne w boxplotach.
Jednocześnie boxplot przedstawia wartości odstające w sposób bardziej przejrzysty. W pakiecie
ggplot2 jest funkcja geom_violin, przy pomocy której można stworzyć wykres skrzypcowy:
ggplot(data=airline_stats, aes(airline, pct_carrier_delay)) +
ylim(0, 50) +
geom_violin() +
labs(x='', y='Procent opóźnionych lotów')

52 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 1.10. Boxplot dla odsetka lotów opóźnionych z winy przewoźnika

Wykresy skrzypcowe są dostępne poprzez metodę violinplot z pakietu seaborn:


ax = sns.violinplot(airline_stats.airline, airline_stats.pct_carrier_delay,
inner='quartile', color='white')
ax.set_xlabel('')
ax.set_ylabel('Procent opóźnionych lotów')
Odpowiadający temu fragmentowi wykres został przedstawiony na rysunku 1.11. Wykres skrzyp-
cowy pokazuje koncentrację wokół zera dla Alaski i w mniejszym zakresie dla Delty. Takie zjawisko
nie jest oczywiste w boxplocie. Możesz połączyć wykres skrzypcowy z boxplotem, używając
geom_boxplot w wykresie (wynik będzie bardziej przejrzysty, jeśli wykorzystasz kolory).

Wizualizacja wielu zmiennych


Wykresy wykorzystywane do porównywania dwóch zmiennych — wykres punktowy, hexagon bin-
ning i boxploty — mogą być z łatwością rozszerzone na więcej zmiennych dzięki pojęciu warun-
kowania (ang. conditioning). Przykładem może być rysunek 1.8, na którym przedstawiono związek
pomiędzy powierzchnią domów a opodatkowaniem. Natomiast na rysunku 1.12 uwzględniono
wpływ lokalizacji poprzez przedstawienie danych z uwzględnieniem kodu pocztowego. W tym
przypadku rysunek jest bardziej przejrzysty: opodatkowanie jest dla niektórych kodów (98105,
98126) znacznie wyższe niż dla innych (98108,98188). Ta różnica powoduje tworzenie klastrów
obserwowanych na rysunku 1.8.

Badanie dwóch lub więcej zmiennych | 53

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 1.11. Wykres skrzypcowy dla odsetka lotów opóźnionych z winy przewoźnika

Rysunek 1.12 stworzyliśmy, wykorzystując pakiet ggplot2 i ideę aspektów (ang. facets) lub warun-
kowania zmiennej (w tym przypadku jest to kod pocztowy):
ggplot(subset(kc_tax0, ZipCode %in% c(98188, 98105, 98108, 98126)),
aes(x=SqFtTotLiving, y=TaxAssessedValue)) +
stat_binhex(color='white') +
theme_bw() +
scale_fill_gradient(low='white', high='blue') +
labs(x='Powierzchnia domu', y='Wartość podatku') +
facet_wrap('ZipCode')

Za pomocą funkcji facet_wrap i facet_grid z pakietu ggplot określamy warunkowanie zmiennej.


Wizualizacje większości pakietów Pythona bazują na możliwościach pakietu Matplotlib. Teore-
tycznie jest możliwe tworzenie wykresów aspektowych za pomocą pakietu Matplotlib, ale kod
może być bardzo skomplikowany. Na szczęście prostsze, alternatywne rozwiązanie jest dostępne
poprzez pakiet seaborn:
zip_codes = [98188, 98105, 98108, 98126]
kc_tax_zip = kc_tax0.loc[kc_tax0.ZipCode.isin(zip_codes),:]
kc_tax_zip

def hexbin(x, y, color, **kwargs):


cmap = sns.light_palette(color, as_cmap=True)
plt.hexbin(x, y, gridsize=25, cmap=cmap, **kwargs)

g = sns.FacetGrid(kc_tax_zip, col='ZipCode', col_wrap=2)


g.map(hexbin, 'SqFtTotLiving', 'TaxAssessedValue',
extent=[0, 3500, 0, 700000])
g.set_axis_labels('Powierzchnia domu', 'Wartość podatku')
g.set_titles('Kod pocztowy {col_name:.0f}')

54 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 1.12. Wartość podatku a powierzchnia domu w zależności od kodu pocztowego

Argumenty col i row służą do określania warunkowania zmiennych. W przypadku pojedynczej


zmiennej można umieszczać wiele wykresów aspektowych na jednym rysunku za pomocą
kombinacji argumentów col i col_wrap.
Metoda map wywołuje funkcję hexbin wraz z podzbiorami pierwotnego zestawu danych dla
różnych kodów pocztowych. Argument extent definiuje granice osi x i y.
Koncepcja warunkowania zmiennej w systemie graficznym została zapoczątkowana w Trellis
graphics i rozwinięta przez Ricka Beckera, Billa Clevelanda i wiele innych osób z Bell Labs [Trellis
Graphics]. Pomysł ten rozprzestrzenił się w postaci dodatków do tworzenia wykresów, takich jak
pakiety R lattice [lattice] i ggplot2 lub moduły Pythona seaborn [seaborn] i Bokeh [bokeh]. Wa-
runkowanie zmiennych jest także zintegrowane z platformami Business Intelligence, takimi jak
Tableau i Spotfire. Wraz z nastaniem ery superszybkich komputerów współczesne platformy do
wizualizacji osiągnęły znacznie więcej, niż przewidywano na początku badań eksploracyjnych.
Mimo to kluczowe założenia i narzędzia wymyślone pół wieku temu (np. proste wykresy pudeł-
kowe) nadal stanowią podstawy tych systemów.

Badanie dwóch lub więcej zmiennych | 55

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Główne zasady
• Wykresy hexagon binning i konturowe są pomocnymi narzędziami, które umożliwiają gra-
ficzne badanie dwóch zmiennych numerycznych naraz bez przytłaczania ogromną ilością
danych.
• Tablica kontyngencji jest typowym narzędziem do badania liczności dwóch zmiennych ska-
tegoryzowanych.
• Boxploty i wykresy skrzypcowe umożliwiają zobrazowanie zmiennych numerycznych wzglę-
dem zmiennych skategoryzowanych.

Dla pogłębienia wiedzy


• Bardzo dobre omówienie grammar for graphics (gramatyki dla grafiki, w ggplot — „gg”) to:
Benjamin Baumer, Daniel Kaplan i Nicholas Horton, Modern Data Science with R, Chapman
& Hall/CRC Press, 2017.
• Bardzo dobra dokumentacja to: Hadley Wickham, ggplot2: Elegant Graphics for Data Analysis,
Springer, 2009.
• Internetowy przewodnik po ggplot2 autorstwa Josefa Fruehwalda znajduje się pod adresem:
http://www.ling.upenn.edu/~joseff/avml2012/.

Podsumowanie
Eksploracyjna analiza danych (EDA, ang. exploratory data analysis), zapoczątkowana przez Johna
Tukeya, stworzyła podstawy, które stały się początkami data science. EDA zakłada, że w każdym
projekcie opartym na danych pierwszy i najważniejszy krok to przyjrzenie się danym. Opisując
i wizualizując dane, możesz zyskać wartościowe informacje i zrozumieć projekt.
Niniejszy rozdział omawia wiele rozmaitych zagadnień, począwszy od prostych metryk położenia
i rozproszenia, skończywszy na graficznym przedstawieniu zależności pomiędzy wieloma zmien-
nymi, jak pokazano na rysunku 1.12. Społeczność wolnego oprogramowania stworzyła zróżnico-
wany zestaw narzędzi i technik. W połączeniu z możliwościami języków R i Python dało to ogromny
potencjał w zakresie badania i analizowania danych. Badania eksploracyjne powinny być podstawą
każdego dowolnego projektu data science.

56 | Rozdział 1. Badania eksploracyjne

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


ROZDZIAŁ 2.
Rozkłady danych i prób

Pokutuje przekonanie, że wraz z nastaniem ery big data przestała istnieć potrzeba tworzenia prób.
W rzeczywistości mnożenie się danych różnej jakości i istotności wzmacnia potrzebę tworzenia
prób jako narzędzi do efektywnej pracy z różnorodnymi danymi i minimalizowania tendencyjno-
ści. Próbkowanie jest także wykorzystywane w różnego rodzaju testach (np. porównywanie wpływu
konstrukcji stron internetowych na liczbę odwiedzin).
Rysunek 2.1 przedstawia schemat obrazujący podstawowe pojęcia opisywane w tym rozdziale: roz-
kłady danych i prób. Lewa strona reprezentuje populację. W statystyce przyjmuje się, że stanowi
ona bazowy, ale nieznany rozkład. Jedyna dostępna informacja to próba (ang. sample) danych i jej
rozkład empiryczny, przedstawiony po prawej stronie. Żeby przejść od strony lewej do prawej, wy-
konuje się procedurę próbkowania (ang. sampling) (przedstawioną w postaci strzałki). Tradycyjna
statystyka bardzo skupia się na lewej stronie, wykorzystując teorie oparte na silnych założeniach dla
populacji. Współczesna statystyka poszła bardziej w prawą stronę, gdzie te założenia nie są niezbędne.

Rysunek 2.1. Populacja a próba

57

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W ogólnym przypadku specjalista data science nie musi się przejmować teoretyczną naturą lewej
strony, zamiast tego powinien się skupić na samej procedurze próbkowania i dostępnych danych.
Istnieje jednak kilka ważnych wyjątków. Czasami dane są generowanie z procesu fizycznego, który
może być zamodelowany. Najprostszym przykładem jest rzut monetą: reprezentuje on rozkład
dwumianowy. Dowolna sytuacja dwumianowa w rzeczywistości (kupił — nie kupił, oszust — ucz-
ciwy, kliknął — nie kliknął) może być efektywnie modelowana za pomocą rzutu monetą. (Oczywi-
ście ze zmodyfikowanym prawdopodobieństwem wystąpienia reszki). W tym przypadku otrzymu-
jemy dodatkowe informacje, wykorzystując zrozumienie praw, jakim podlega populacja.

Losowy dobór i obciążenie próby


Próba (ang. sample) jest podzbiorem danych z większego zbioru; statystycy nazywają ten większy
zbiór populacją (ang. population). Populacja w statystyce nie jest tym samym, czym jest w biologii
— jest to duży, zdefiniowany (ale czasem teoretyczny lub istniejący jedynie w wyobraźni) zbiór
danych.
Losowy dobór próby (ang. random sampling) jest procesem, w którym każdy dostępny członek
badanej populacji ma jednakowe szanse na bycie wylosowanym. Próba otrzymana w ten sposób
jest nazywana prostą próbą losową (ang. simple random sample). Próbkowanie może następować
ze zwracaniem (ang. with replacement), czyli obserwacje są zwracane do populacji po każdym lo-
sowaniu i mogą być wylosowane ponownie. Istnieje także losowanie bez zwracania (ang. without
replacement), w którym wylosowane obserwacje nie są już dostępne w kolejnych losowaniach.
Podczas szacowania lub tworzenia modeli bazujących na próbach jakość danych jest zazwyczaj
istotniejsza niż ich ilość. Jakość danych w data science dotyczy ich kompletności, spójności ich
formatu oraz czystości i dokładności ich poszczególnych elementów. Statystyka dodaje również
pojęcie reprezentatywności (ang. representativeness).

Kluczowe pojęcia dotyczące doboru próby


Próba
Podzbiór większego zbioru danych.

Populacja
Zbiór danych lub jego idea.

N (n)
Wielkość populacji (próby).

Losowy dobór próby


Wybieranie losowych elementów do próby.

Losowanie warstwowe (warstwowy dobór próby)


Podział populacji na warstwy i losowy dobór elementów z każdej warstwy.

58 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Warstwa
Jednorodna podgrupa populacji cechująca się takimi samymi własnościami.

Prosta próba losowa


Próba uzyskiwana przez losowy dobór bez podziału populacji.

Obciążenie
Błąd systematyczny.

Obciążenie próby
Próba, która nie odzwierciedla populacji.

Klasycznym już przykładem wpływu doboru próby na wyniki jest sondaż przeprowadzony w 1936 r.
na zlecenie „Literary Digest”, który prognozował zwycięstwo Alfa Landona nad Franklinem
Rooseveltem. „Literary Digest” był najważniejszym periodykiem tamtych czasów; jego dziennika-
rze przepytali wszystkich prenumerujących go czytelników i dodatkowo grupę losowo wybranych
osób, w sumie około 10 milionów ludzi; na podstawie zebranych informacji zasugerowali wygraną
Landona. Równolegle George Gallup, założyciel Gallup Poll, przeprowadził sondaż na grupie jedy-
nie 2 tysięcy osób i przewidział zwycięstwo Roosevelta. Różnica między oboma sondażami polegała
na doborze ankietowanych.
„Literary Digest” postawił na liczbę przepytywanych osób, nie przywiązując wagi do metody ich
doboru, co ostatecznie spowodowało, że ankietowani stanowili grupę o stosunkowo wysokim sta-
tusie socjoekonomicznym (prenumeratorzy czasopisma plus osoby z list handlowych, posiadające
różne dobra luksusowe, takie jak telefon lub automobil). Efektem tego było obciążenie próby (ang.
sample bias); próba była w pewien znaczący i nielosowy sposób odmienna od populacji, którą miała
reprezentować. Określenie nielosowy (ang. nonrandom) jest tutaj bardzo ważne — w zasadzie
żadna próba, włącznie z próbą losową, nie będzie idealnie reprezentować populacji. Obciążenie
próby występuje, gdy różnice są znaczące i oczekuje się, że kolejne losowanie prób przyniesie
podobny efekt jak pierwsze.

Samodobierające się obciążenie próby


Recenzje restauracji, hoteli, kawiarni itp., które możesz znaleźć w social mediach, np.
w serwisie Yelp, są podatne na obciążenia, ponieważ zamieszczający je tam ludzie nie
są losowo wybierani; co więcej, sami wychodzą oni z inicjatywą pisania. Prowadzi to
do samodobierającego się obciążenia — osoby zmotywowane do pisania recenzji to
najczęściej te, które mają złe doświadczenia związane z marką, są z nią powiązane
lub po prostu mają inny charakter niż ludzie niepiszący recenzji. Zwróć uwagę na to,
że próby samodobierające się mogą odbiegać od faktycznego stanu rzeczy, jednak
mogą być bardziej wiarygodne w prostym porównywaniu jednej marki z drugą; jest
szansa, że dla obu pojawi się podobne samodobierające się obciążenie.

Losowy dobór i obciążenie próby | 59

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Obciążenie
Obciążenie statystyczne odnosi się do pomiarów lub próbkowania, które są systematyczne i po-
wstają podczas samego procesu mierzenia lub próbkowania. Należy wyraźnie odróżnić błędy po-
wstałe w wyniku przypadku losowego od błędów wynikających z obciążenia. Rozważmy proces
fizyczny strzelania z broni do celu. Nie za każdym razem trafia się w środek, czasem nawet nie trafia
się wcale. Nieobciążony proces prowadzi do błędu, ale nadal jest losowy i nie sugeruje żadnego
kierunku (patrz rysunek 2.2). Wyniki przedstawione na rysunku 2.3 ukazują proces obciążony —
wciąż jest obecny błąd losowy w kierunku x i y, ale dodatkowo występuje obciążenie. Strzały kiero-
wane są w prawy górny kwadrant.

Rysunek 2.2. Wykres punktowy strzałów z broni do celu

Rysunek 2.3. Wykres punktowy strzałów z broni z obciążonym celem

Obciążenie może przybierać różne formy, może być widoczne lub niezauważalne. Gdy wynik fak-
tycznie sugeruje obciążenie (np. w stosunku do punktu odniesienia albo faktycznych wartości), jest
to najczęściej sygnał, że model statystyczny lub model uczenia maszynowego został błędnie zapro-
jektowany bądź jakaś ważna zmienna została pominięta.

60 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Dobór losowy
Żeby uniknąć obciążenia próby, które doprowadziło „Literary Digest” do błędnego wytypowania
zwycięstwa Landona nad Rooseveltem, George Gallup (przedstawiony na rysunku 2.4) wybrał zde-
cydowanie bardziej naukową metodę pozyskiwania próby, odzwierciedlającą elektorat w Stanach
Zjednoczonych. W tej chwili istnieje wiele sposobów na osiągnięcie reprezentatywności, ale sed-
nem każdego z nich jest losowy dobór próby (ang. random sampling).

Rysunek 2.4. George Gallup zyskał sławę dzięki porażce big data „Literary Digest”

Losowy dobór próby nie zawsze jest prosty. Kluczowe jest prawidłowe zdefiniowanie dostępnej
populacji. Załóżmy, że chcemy wygenerować reprezentatywny profil klientów i musimy przepro-
wadzić pilotażowe badania ankietowe. Grupa docelowa musi być reprezentatywna, a uzyskanie
tego jest pracochłonne.
Najpierw trzeba zdefiniować, kim jest klient. Możemy wybrać dane wszystkich klientów z wartością
zakupów > 0. Czy uwzględniliśmy wszystkich byłych klientów? Czy uwzględniliśmy zwroty?
Wewnętrzne zakupy testowe? Dystrybutorów? Klientów będących jednocześnie pośrednikami?
Następnie musimy określić procedurę próbkowania. Może to być: „Wybierz losowo 100 klientów.”
Kiedy musimy próbkować z potoku danych (np. transakcje klientów w czasie rzeczywistym lub
odwiedzających strony), uwzględnienie czasu może się okazać istotne (np. odwiedzający stronę
o 10 rano w dzień roboczy może się różnić od odwiedzającego ją o 10 wieczorem w weekend).
W losowaniu warstwowym (ang. stratified sampling) populacja jest podzielona na warstwy (ang.
strata), a próbę losujemy z każdej warstwy. W sondażach politycznych najczęściej wydzielane są
tendencje wśród białych, Afroamerykanów i Latynosów. Prosta próba losowa z całej populacji
zawierałaby zbyt mało Afroamerykanów i Latynosów, więc żeby można było uzyskać równoważne
rozmiary prób, te warstwy mogą być wzmocnione w losowaniu warstwowym.

Rozmiar a jakość: kiedy rozmiar ma znaczenie?


W epoce big data czasem zaskakuje to, że mniej oznacza lepiej. Czas poświęcony na losowanie prób
i włożony w to wysiłek nie tylko redukują obciążenie, ale również umożliwiają skupienie uwagi
na badaniu danych i ich jakości. Brakujące dane i wartości odstające też mogą zawierać uży-
teczne informacje. Wyśledzenie w milionach rekordów brakujących danych czy ocenienie danych

Losowy dobór i obciążenie próby | 61

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


odstających może się okazać niemożliwe, ale te same działania w kilku tysiącach rekordów stają
się wykonalne. Rysowanie danych i ręczne śledzenie zostanie zahamowane, jeśli będzie zbyt
wiele punktów.
Kiedy duża ilość danych jest potrzebna?
Klasyczny scenariusz, w którym big data są wartościowe, dotyczy sytuacji, gdy są one nie tylko
objętościowo duże, ale również rzadkie. Rozważmy przypadek zapytań otrzymywanych przez Goo-
gle — kolumny są słowami kluczowymi, wiersze poszczególnymi przypadkami zapytań, a komórka
może przyjmować wartość 0 lub 1, w zależności od tego, czy zapytanie zawiera dany termin, czy
nie. Celem jest określenie najlepszej strony docelowej na podstawie przesłanego zapytania. W ję-
zyku angielskim istnieje ponad 150 tysięcy słów, a Google przetwarza ponad 1 bilion zapytań
w roku. Skutkuje to otrzymaniem ogromnej macierzy, w której znacząca większość wpisów to „0”.
Prawdziwy problem z kategorii big data polega na tym, że dla większości zapytań mogą być zwra-
cane efektywne wyniki wyszukiwania tylko wtedy, gdy zgromadzona została nieprawdopodobna
ilość danych. Im więcej danych zostało zgromadzonych, tym lepsze wyniki. W przypadku popu-
larnych słów kluczowych nie jest to duży problem — dla garstki bardzo popularnych tematów
modnych w danym czasie odpowiednie dane mogą być znalezione dość szybko. Prawdziwa wartość
współczesnych metod przeszukiwania sieci leży w możliwości przedstawienia szczegółowych i uży-
tecznych wyników dla niezliczonej liczby zapytań, włączając w to te pojawiające się raz na milion.
Rozważmy frazę: Ricky Ricardo and Little Red Riding Hood (Ricky Ricardo i Czerwony Kapturek).
W początkowej fazie rozwoju internetu takie zapytanie prawdopodobnie zwróciłoby wyniki doty-
czące Ricky’ego Ricarda, lidera zespołu z telewizyjnego show I Love Lucy, w którym występował,
oraz bajkę dla dzieci Czerwony Kapturek. Każdy z tych elementów miałby osobno mnóstwo trafień
wyszukiwania, ale łącznie ta liczba okazałaby się bardzo mała. Obecnie, bilion zapytań później, takie
zapytanie zwróci odcinek I Love Lucy, w którym Ricky z przejęciem opowiada historię Czerwonego
Kapturka swojemu małemu synkowi, w zabawny sposób łącząc angielski i hiszpański.
Należy zapamiętać, że faktyczna liczba trafnych rekordów — w których pojawia się dokładnie dane
zapytanie lub coś bardzo podobnego (wraz z informacją o linku ostatecznie wybranym przez użyt-
kownika) — może być niewielkim odsetkiem tych zawierających poszukiwane frazy. Jednakże
wiele bilionów punktów danych jest niezbędnych, jeśli chcemy uzyskać te trafne wyniki (i losowy
dobór próby niewiele tu pomoże); patrz również podrozdział „Rozkłady z długimi ogonami” w dal-
szej części tego rozdziału.

Średnia z próby a średnia z populacji


Symbol 𝑥̄ jest wykorzystywany do przedstawiania średniej z próby dla populacji, podczas gdy μ
reprezentuje średnią z populacji. Po co to rozróżnienie? Informacje o obserwowanej próbie i infor-
macje o dużej populacji są często wyciągane z mniejszych prób. Statystycy lubią rozróżniać
poszczególne terminy również symbolami.

62 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Główne zasady
• Nawet w epoce big data próby losowe pozostają ważnym elementem w układance zwanej
data science.
• Obciążenie pojawia się, gdy mierzone lub obserwowane dane są systematycznie błędne, po-
nieważ nie są reprezentatywne dla całej populacji.
• Jakość danych jest najczęściej ważniejsza niż ich ilość, a losowy dobór próby może zmniej-
szyć obciążenie i ułatwić podniesienie ich jakości małym kosztem.

Dla pogłębienia wiedzy


• Dobre omówienie procedur próbkowania można znaleźć w rozdziale „Sampling Methods for
Online Surveys” w książce The SAGE Handbook of Online Research Methods, 2nd ed., Ronalda
Frickera, redagowanej przez Nigela G. Fieldinga, Raymonda M. Lee i Granta Blanka (SAGE
Publications, 2016). Rozdział ten zawiera omówienie modyfikacji doboru losowego, który jest
często używany ze względów praktycznych (takich jak koszty lub wykonalność).
• Historię klapy sondażu przeprowadzonego przez „Literary Digest” można znaleźć na stronie
Capital Century: http://www.capitalcentury.com/1935.html.

Błąd doboru
Parafrazując Yogiego Berrę1: można powiedzieć, że jeśli nie wiesz, czego szukasz, powinieneś szu-
kać dostatecznie mocno, a w końcu to znajdziesz.
Błąd doboru odnosi się do praktyki selektywnego wyboru danych — świadomego lub nieświado-
mego — w sposób prowadzący do błędnych lub krótkotrwałych wniosków.

Kluczowe pojęcia dotyczące błędu doboru


Błąd doboru
Obciążenie wynikające ze sposobu wybierania obserwacji.

Tropienie danych
Intensywne poszukiwanie czegoś interesującego w danych.

Efekt rozległych poszukiwań


Obciążone lub niedające się powtórzyć wyniki z wielokrotnego modelowania danych lub mo-
delowania z ogromną liczbą zmiennych predykcyjnych.

1
Amerykański baseballista, żyjący w latach 1925 – 2015; uważa się, że Miś Yogi, postać z filmów rysunkowych,
otrzymał swoje imię właśnie na jego cześć — przyp. tłum.

Błąd doboru | 63

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Jeśli stworzymy hipotezę i przeprowadzimy dobrze zaprojektowany eksperyment, żeby ją potwier-
dzić, możemy zaufać wyciągniętym na jej podstawie wnioskom. Nie zdarza się to jednak często.
Nieraz przyglądamy się danym i próbujemy znaleźć jakiś wzorzec. Ale czy ten wzorzec istnieje na-
prawdę? A może jest jedynie efektem tropienia danych (ang. data snooping), czyli szczegółowego
przeszukiwania danych tak długo, aż pojawi się coś interesującego? Statystycy maja takie powie-
dzenie: „Jeśli będziesz torturować dane wystarczająco długo, prędzej czy później zaczną zeznawać”.
Różnica pomiędzy zjawiskiem testowania hipotezy na podstawie przeprowadzanego eksperymentu
a odkryciem czegoś podczas studiowania dostępnych danych może być objaśniona za pomocą na-
stępującego przykładu.
Wyobraź sobie, że ktoś powie Ci, iż potrafi rzucić monetą tak, żeby reszka wypadła 10 razy z rzędu.
Postanawiasz to sprawdzić (to jest Twój eksperyment) i ta osoba faktycznie wyrzuca reszkę 10 razy
z rzędu. Uznajesz, że faktycznie osoba ta ma szczególny talent — prawdopodobieństwo wyrzucenia
reszki 10 razy z rzędu wynosi 1 do 1000.
Teraz wyobraź sobie, że komentator na stadionie sportowym prosi 20 000 osób, by każda rzuciła
monetą 10 razy i jeśli wyrzuci 10 reszek z rzędu, zgłosiła to bileterowi. Prawdopodobieństwo tego,
że ktokolwiek na stadionie osiągnie taki wynik, jest bardzo duże (wynosi więcej niż 99%; 1 minus
prawdopodobieństwo tego, że nikt go nie osiągnie). Wybieranie po fakcie osoby (lub osób), która
wyrzuciła 10 reszek z rzędu na stadionie, nie wskazuje na to, że ma ona jakiś specjalny talent —
w tym przypadku to raczej szczęście.
Ponieważ twierdzi się, że ciągła kontrola danych jest sprawą kluczową w data science, błąd doboru
jest czymś, czym należy się przejmować. Formą błędu doboru szczególnie dotyczącą specjalistów
data science jest coś, co John Elder (założyciel Elder Research, szanowany konsultant w zakresie
data mining) nazwał efektem rozległych poszukiwań (ang. vast search effect). Jeśli będziesz wielo-
krotnie testował różne modele i zadawał różne pytania dla dużego zbioru danych, jest niemal
pewne, że znajdziesz coś interesującego. Pytanie brzmi, czy to, co znalazłeś, faktycznie jest czymś
interesującym, czy jest to tylko przypadkowa wartość odstająca.
Możemy się przed tym zabezpieczyć, wykorzystując zbiór testowy (czasem więcej niż jeden), wzglę-
dem którego będziemy walidować otrzymane wyniki. Elder usprawiedliwił również wykorzystanie
czegoś, co nazwał żonglowaniem celem (ang. target shuffling) (w zasadzie jest to test permutacyjny),
do testowania dopasowania wytypowanych powiązań, które sugeruje model data mining.
Typowymi formami błędu doboru w statystyce, poza efektem rozległych poszukiwań, są: nielosowy
dobór próby (patrz ramka „Samodobierające się obciążenie próby” wcześniej w tym rozdziale),
wybieranie danych, wybieranie przedziałów czasowych, które podkreślają konkretny efekt staty-
styczny, i zatrzymywanie eksperymentu, gdy wyniki wyglądają „interesująco”.

Regresja do średniej
Regresja do średniej (ang. regression to the mean) dotyczy zjawiska następujących po siebie po-
miarów zadanej zmiennej: skrajne wartości zdają się podążać za tymi centralnymi. Przywiązywanie
dużej wagi do tych skrajnych wartości może prowadzić do utworzenia błędu doboru.

64 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Fanom sportu znane jest zjawisko rookie of the year, sophomore slump2. Wśród sportowców, którzy
rozpoczęli karierę w danym sezonie (the rookie class) zawsze znajdzie się jeden lepszy od wszystkich
pozostałych. Zazwyczaj jednak ten rookie of the year nie jest już tak dobry w następnym roku. Dlaczego?
W niemal wszystkich liczących się dyscyplinach sportu, a przynajmniej w tych, w których gra się
piłką lub krążkiem, istnieją dwa elementy mające wpływ na ogólną wydajność sportowca:
• umiejętności,
• szczęście.
Regresja do średniej jest konsekwencją szczególnej formy błędu doboru. Kiedy wybieramy rookie
z najlepszym wynikiem, jego umiejętności i szczęście też mają swoje znaczenie. W kolejnym sezo-
nie umiejętności sportowca co prawda nie znikają, ale szczęście często już tak, w związku z czym
wyniki się pogarszają — następuje regresja. Zjawisko to zostało po raz pierwszy opisane w 1886 r.
przez Francisa Galtona, który zaprezentował je w połączeniu z uwarunkowaniami genetycznymi
— dzieci bardzo wysokich mężczyzn zazwyczaj nie są tak wysokie jak ich ojcowie (patrz rysunek 2.5).

Rysunek 2.5. Wyniki badań Galtona, które pomogły zidentyfikować zjawisko regresji do średniej
(rysunek z oryginalnej publikacji Galtona)

Regresja do średniej znaczy „cofnięcie”, w odróżnieniu od metody modelowania sta-


tystycznego — regresji liniowej — szacującej związek pomiędzy zmienną predyk-
cyjną a zmienną decyzyjną.

2
Syndrom drugiego roku u sportowców — przyp. tłum.

Błąd doboru | 65

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Główne zasady
• Określenie hipotezy, a następnie zbieranie danych z zachowaniem zasad losowości i doboru
losowego pozwala uniknąć obciążenia.
• Wszystkie inne formy analizy danych zwiększają ryzyko obciążenia wynikającego z doboru
danych lub z procesu analitycznego (kilkakrotne modelowanie w data mining, tropienie da-
nych w badaniach i wybieranie interesujących zdarzeń po fakcie).

Dla pogłębienia wiedzy


• Bardzo dobre omówienie różnych typów obciążenia, które mogą wystąpić w badaniach, włącznie
z błędem doboru, można znaleźć w artykule Christophera J. Pannucciego i Edwina G. Wilkinsa
Identifying and Avoiding Bias in Research, zamieszczonego w (co zaskakujące nie w publikacji
statystycznej) czasopiśmie „Plastic and Reconstructive Surgery” (sierpień 2010).
• Interesujące omówienie błędów doboru na przykładzie schematów rynku obrotu akcjami z per-
spektywy maklera można znaleźć w artykule Michaela Harrisa Fooled by Randomness Through
Selection Bias, zamieszczonego pod adresem: https://www.priceactionlab.com/Blog/2012/06/
fooled-by-randomness-through-selection-bias/.

Rozkład próbkowania dla statystyki


Pojęcie rozkładu próbkowania (ang. sampling distribution) dla statystyki odnosi się do rozkładu
dla pewnych statystyk obliczonych dla wielu prób z tej samej populacji. Wiele klasycznych statystyk
skupia się na wnioskowaniu z (małych) prób dla (bardzo dużych) populacji.

Kluczowe pojęcia dotyczące rozkładu próbkowania


Statystyka dla próby
Metryka obliczana dla próby na podstawie danych zebranych z większej populacji.

Rozkład danych
Rozkład częstości występowania poszczególnych wartości w zbiorze danych.

Rozkład próbkowania
Rozkład częstości występowania statystyki z próby wśród wielu prób.

Centralne twierdzenie graniczne


Skłonność rozkładu prób do przyjmowania kształtu rozkładu normalnego wraz ze wzrostem
rozmiaru próby.

Błąd standardowy
Zmienność (odchylenie standardowe) statystyki z próby wśród wielu prób (nie należy mylić
z odchyleniem standardowym, które samo w sobie odnosi się do zmienności poszczególnych
wartości danych).

66 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Zazwyczaj próba jest losowana w celu zmierzenia czegoś [za pomocą statystyki dla próby (ang.
sample statistic)] lub zamodelowania czegoś (przy pomocy statystyki bądź modelu uczenia maszy-
nowego). Nasz estymator lub model może być błędny, ponieważ jest oparty na próbie; możemy
uzyskać inne wyniki, jeśli wybierzemy inną próbę. W związku z tym interesuje nas, jak bardzo te
wyniki mogą się różnić — kluczowa kwestia dotyczy zmienności prób (ang. sampling variability).
Jeśli mamy wiele danych, możemy wybierać dodatkowe próby i bezpośrednio obserwować rozkład
statystyk. Zazwyczaj jednak tworzymy nasz estymator lub model, wykorzystując możliwie najwię-
cej łatwo dostępnych danych, gdy losowanie dodatkowych prób z populacji nie jest możliwe.

Ważne jest rozróżnienie pomiędzy rozkładem pojedynczych punktów danych, zna-


nym jako rozkład zmiennej (ang. data distribution), a rozkładem statystyk dla próby,
nazywanym rozkładem próbkowania (ang. sampling distribution).

Rozkład próbkowania statystyk, podobnie jak średnia, zazwyczaj przybiera bardziej regularny niż
rozkład samej zmiennej kształt, przypominający dzwon. Im większa próba, na której bazuje staty-
styka, tym bardziej się to sprawdza. Podobnie im większa próba, tym węższy rozkład próbkowania.
Można to zilustrować, wykorzystując roczne dochody ubiegających się o pożyczkę w Lending Club
(opis danych znajdziesz w punkcie „Przykład: przewidywanie opóźnienia w spłacie pożyczki”
w rozdziale 6.). Wybierzmy trzy próby z tych danych: próbę zawierającą 1000 wartości, próbę za-
wierającą 1000 średnich z 5 wartości i próbę zawierającą 1000 średnich z 20 wartości. Rysunek 2.6
przedstawia histogramy dla wszystkich trzech prób.

Rysunek 2.6. Histogram rocznych dochodów 1000 osób ubiegających się o pożyczkę (górny), 1000 średnich dla
n = 5 ubiegających się (środkowy) i 1000 średnich dla n = 20 (dolny)

Rozkład próbkowania dla statystyki | 67

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Histogram pojedynczych wartości jest szeroki, rozciągnięty i asymetryczny, z przewagą wartości
wyższych niż należałoby się tego spodziewać w danych z dochodów. Histogramy średnich z 5 i 20
wartości są bardziej spójne i zbliżone kształtem do dzwonu. Poniżej zamieszczono kod R do wyge-
nerowania tych histogramów z wykorzystaniem pakietu ggplot2.
> library(ggplot2)
# stwórz prostą próbę losową
> samp_data <- data.frame(income=sample(loans_income, 1000),
type='data_dist')
# stwórz próbę ze średnich z 5 wartości
> samp_mean_05 <- data.frame(
income = tapply(sample(loans_income, 1000*5),
rep(1:1000, rep(5, 1000)), FUN=mean),
type = 'mean_of_5')
# stwórz próbę ze średnich z 20 wartości
> samp_mean_20 <- data.frame(
income = tapply(sample(loans_income, 1000*20),
rep(1:1000, rep(20, 1000)), FUN=mean),
type = 'mean_of_20')
# połącz data.frames i zmień typ na factor
> income <- rbind(samp_data, samp_mean_05, samp_mean_20)
> income$type = factor(income$type,
levels=c('data_dist', 'mean_of_5', 'mean_of_20'),
labels=c('Dane', 'Średnia z 5', 'Średnia z 20'))
# narysuj histogram
> ggplot(income, aes(x=income)) +
geom_histogram(bins=40) +
facet_grid(type ~ .)

W Pythonie możemy wyświetlić takie trzy histogramy za pomocą klasy FacetGrid z modułu seaborn:
import pandas as pd
import seaborn as sns
sample_data = pd.DataFrame({
'dochód': loans_income.sample(1000),
'typ': 'Dane',
})

sample_mean_05 = pd.DataFrame({
'dochód': [loans_income.sample(5).mean() for _ in range(1000)],
'typ': 'Średnia z 5',
})

sample_mean_20 = pd.DataFrame({
'dochód': [loans_income.sample(20).mean() for _ in range(1000)],
'typ': 'Średnia z 20',
})
results = pd.concat([sample_data, sample_mean_05, sample_mean_20])
g = sns.FacetGrid(results, col='typ', col_wrap=1,
height=2, aspect=2)
g.map(plt.hist, 'dochód', range=[0, 200000], bins=40)
g.set_axis_labels('Dochód', 'Liczba')
g.set_titles('{col_name}')

68 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Centralne twierdzenie graniczne
Opisane wcześniej zjawisko nazywane jest centralnym twierdzeniem granicznym (ang. central
limit theorem). Mówi ono, że średnie obliczane dla wielu prób będą przypominać znany już dzwo-
nowaty kształt rozkładu normalnego (patrz podrozdział „Rozkład normalny” w dalszej części tego
rozdziału), nawet jeśli populacja źródłowa nie ma rozkładu normalnego, a kiedy dostarczane będą
odpowiednio duże próby, różnica w stosunku do rozkładu normalnego nie będzie zbyt wielka.
Centralne twierdzenie graniczne dopuszcza wykorzystanie do wnioskowania o rozkładzie prób
wzorów przybliżających rozkład normalny, np. rozkład t, przedziały ufności i testy hipotezy.
Centralnemu twierdzeniu granicznemu poświęca się wiele uwagi w przypadku tradycyjnych testów
statystycznych, ponieważ stanowi ono podstawę maszynerii testowania hipotez i wyznaczania
przedziałów ufności; opis tych metod zajmuje właściwie połowę tego podręcznika. Specjaliści data
science powinni być świadomi tej roli, ponieważ jednak formalne testy hipotez i przedziały ufności
odgrywają niewielką rolę w data science, a próby bootstrapowe (zob. podrozdział „Próby bootstra-
powe” w dalszej części rozdziału) są dostępne dla każdego przypadku, centralne twierdzenie gra-
niczne nie jest aż tak istotne w praktyce data science.

Błąd standardowy
Błąd standardowy (SE, ang. standard error) jest pojedynczą metryką, która opisuje zmienność
w rozkładzie próbkowania statystyk. Błąd standardowy może być szacowany przy wykorzystaniu
statystyk bazujących na odchyleniu standardowym s z wartości próby i rozmiaru próby n:
𝑠
𝐵łą𝑑 𝑠𝑡𝑎𝑛𝑑𝑎𝑟𝑑𝑜𝑤𝑦 = 𝑆𝐸 =
√𝑛
Wraz ze wzrostem rozmiaru próby błąd standardowy maleje, zgodnie z tym, co obserwowaliśmy
na rysunku 2.6. Związek pomiędzy błędem standardowym a rozmiarem próby jest czasami okre-
ślany jako reguła pierwiastka kwadratowego z n: żeby można było zmniejszyć błąd standardowy
dwukrotnie, rozmiar próby musi wzrosnąć czterokrotnie.
Prawdziwości wzoru na błąd standardowy dowodzi się, korzystając z centralnego twierdzenia gra-
nicznego. Tak naprawdę nie musisz polegać na centralnym twierdzeniu granicznym, by zrozumieć
błąd standardowy. Rozważmy następujące podejście do pomiaru błędu:
1. Zebranie zestawu całkiem nowych prób z populacji.
2. Policzenie statystyki (np. średniej) dla każdej nowej próby.
3. Obliczenie odchylenia standardowego dla statystyki obliczonej w kroku 2. i wykorzystanie jej
jako oszacowania błędu standardowego.
W praktyce nie zbiera się nowych prób do oszacowania błędu standardowego (ze statystycznego
punktu widzenia jest to rozrzutność). Na szczęście okazuje się, że nie jest konieczne pozyskiwanie
nowych prób; zamiast tego możesz wykorzystać próby bootstrapowe. We współczesnej statystyce
bootstrap stał się standardem do szacowania błędu standardowego. Może być wykorzystany do
niemalże każdej statystyki i nie opiera się na centralnym twierdzeniu granicznym czy innym zało-
żonym rozkładzie.

Rozkład próbkowania dla statystyki | 69

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Odchylenie standardowe a błąd standardowy
Nie należy mylić odchylenia standardowego (które mierzy zmienność poszczegól-
nych punktów danych) z błędem standardowym (który mierzy zmienność metryki
dla próby).

Główne zasady
• Częstość rozkładu statystyki dla próby pokazuje, w jaki sposób metryka będzie się zmieniać
w zależności od próby.
• Rozkład próbkowania może być oszacowany za pomocą prób bootstrapowych lub za po-
mocą wzorów, które bazują na centralnym twierdzeniu granicznym.
• Kluczową metryką, która opisuje zmienność statystyki dla próby, jest błąd standardowy.

Dla pogłębienia wiedzy


• Praktyczne symulacje umożliwiające wybranie statystyk dla próby, rozmiaru próby i liczby ite-
racji, a także zobrazowanie całości histogramem znajdziesz w źródłach internetowych autor-
stwa Davida Lane’a: http://onlinestatbook.com/stat_sim/sampling_dist/.

Próby bootstrapowe
Jedną z prostszych i bardziej efektywnych metod szacowania statystyk dla rozkładu próbkowego
lub parametrów modelu jest losowanie dodatkowych prób ze zwracaniem z próby, którą już mamy,
i przeliczanie statystyk lub modelu dla każdej nowej próby. Taka procedura nazywana jest boot-
strapem (ang. bootstrap) i niekoniecznie wymaga tego, żeby dane lub statystyki próby pochodziły
z rozkładu normalnego.

Kluczowe pojęcia dotyczące prób bootstrapowych


Próba bootstrapowa
Próba wylosowana ze zwracaniem z otrzymanego zbioru danych.

Ponowne próbkowanie
Proces powtórzonego losowania prób z obserwowanych danych; zawiera zarówno procedury
bootstrapu, jak i permutacji (mieszania).

Koncepcję bootstrapu można przedstawić jako powtórzenie tysiące lub miliony razy oryginalnej
próby w taki sposób, że otrzymujemy większą, hipotetyczną populację, która opisuje nam całą wie-
dzę, jaką mamy o oryginalnej próbie. Następnie możesz losować próby z hipotetycznej populacji
na potrzeby szacowania rozkładu próbkowego (zob. rysunek 2.7).

70 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 2.7. Idea bootstrapu

W praktyce nie jest konieczne faktyczne zwielokrotnianie próby wiele razy. Po prostu zwracamy
każdą obserwację po losowaniu; nazywamy to próbą ze zwracaniem. W ten sposób możemy efek-
tywnie tworzyć nieskończone populacje, w których prawdopodobieństwo wylosowania konkret-
nego elementu pozostaje niezmienione w każdym losowaniu. Algorytm tworzenia prób bootstra-
powych o średniej dla próby o rozmiarze n jest następujący:
1. Wylosuj wartość z próby, zapisz ją i zwróć do puli.
2. Powtórz n razy.
3. Zapisz średnią z n wylosowanych wartości.
4. Powtórz kroki 1. – 3. R razy.
5. Wykorzystaj R wyników, by:
a. Obliczylić ich odchylenie standardowe (to oszacuje błąd standardowy dla średniej).
b. Stworzyć histogram albo boxplot.
c. Znaleźć przedziały ufności.
Liczbę iteracji bootstrapu R przyjmuje się arbitralnie. Im więcej iteracji wykonasz, tym bardziej
dokładne będzie oszacowanie błędu standardowego lub przedziałów ufności. Wynikiem wykona-
nia tej procedury jest zestaw bootstrapowy statystyk dla próby lub parametrów modelu, których
zmienność możesz sprawdzić.
Pakiet R boot łączy powyższe kroki w jedną funkcję. Przykładowo możemy ją zastosować do stwo-
rzenia prób bootstrapowych dla dochodów osób starających się o pożyczkę:
> library(boot)
> stat_fun <- function(x, idx) median(x[idx])
> boot_obj <- boot(loans_income, R=1000, statistic=stat_fun)

Funkcja stat_fun oblicza medianę dla zadanej specyfikacji próby poprzez indeks idx. Wynik jest
następujący:
Bootstrap Statistics :
original bias std. error
t1* 62000 -70.5595 209.1515

Próby bootstrapowe | 71

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Oryginalne oszacowanie mediany wynosi 62 000 $. Rozkład bootstrapu wskazuje na to, że oszaco-
wanie ma obciążenie (bias) na poziomie –70 $ i odchylenie standardowe (standard error) w wy-
sokości 209 $. Wyniki będą różnić się nieznacznie w poszczególnych przebiegach algorytmu.
W głównych pakietach Pythona nie znajdziemy implementacji techniki bootstrapowej. Możemy ją
zaimplementować za pomocą metody resample z pakietu scikit-learn:
results = []
for nrepeat in range(1000):
sample = resample(loans_income)
results.append(sample.median())
results = pd.Series(results)
print('Statystyki bootstrapowe:')
print(f'Pierwotne: {loans_income.median()}')
print(f'Obciążenie: {results.mean() - loans_income.median()}')
print(f'Błąd standardowy: {results.std()}')

Bootstrap może być wykorzystany do danych wielowymiarowych — w ich przypadku wiersze są


poszczególnymi próbami (patrz rysunek 2.8). Model może być przeliczony dla danych bootstrapo-
wych np. do oszacowania stabilności (zmienności) parametrów modelu albo do poprawy mocy
predykcyjnej. Dla klasyfikacji i drzew regresji (również nazywanych drzewami decyzyjnymi) two-
rzenie wielu drzew na próbach bootstrapowych, a następnie uśrednianie otrzymanych wyników
(a w przypadku klasyfikacji przeważająca liczba głosów) zasadniczo daje lepsze rezultaty niż użycie
pojedynczego drzewa. Proces ten nosi nazwę „bagging” (pochodzącą od Bootstrap aggregating;
patrz podrozdział „Bagging i lasy losowe” w rozdziale 6.).

Rysunek 2.8. Wielowymiarowe próby bootstrapowe

Wielokrotne tworzenie prób bootstrapowych w założeniu jest całkiem proste. Julian Simon, eko-
nomista i demograf, opublikował w 1969 r. tekst Basic Research Methods in Social Science (Random
House), kompendium przykładów tworzenia prób, w którym zawarł również omówienie boot-
strapu. Jednakże obliczeniowo jest to proces wymagający i nie był on możliwy do wykonania, za-
nim nie rozpowszechniły się komputery o wystarczająco dużej mocy obliczeniowej. Technika zy-
skała swoją nazwę i pojawiła się wraz z publikacją kilku artykułów i książki Bradleya Efrona,
statystyka z Uniwersytetu Stanforda, na przełomie lat 70. i 80. ubiegłego wieku. Stała się szczególnie

72 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


popularna wśród badaczy, którzy wykorzystywali statystykę, ale nie byli statystykami, i często sto-
sowano ją tam, gdzie matematyczne oszacowania metryk lub modeli nie były łatwo dostępne. Roz-
kład próbkowania średniej jest bardzo dobrze opisany (począwszy od 1908 r.), a rozkłady prób-
kowe wielu innych metryk już nie. Bootstrap może być używany do określania rozmiaru próby;
można eksperymentować z różnymi wartościami n, by sprawdzić, jak wpływa ono na rozkład.
Bootstrap został przyjęty bardzo sceptycznie, gdy został przedstawiony po raz pierwszy; zdawał się
bowiem tworzyć coś z niczego, a jego przeznaczenie było dla wielu zupełnie niejasne.

Bootstrap nie rekompensuje małego rozmiaru próby; nie tworzy nowych danych ani
nie uzupełnia braków w istniejącym zbiorze. Informuje jedynie o tym, jak się będzie
zachowywać wiele dodatkowych próbek, kiedy wylosujemy je z populacji podobnej
do próby oryginalnej.

Ponowne próbkowanie a próby bootstrapowe


Jak już wspomniano, czasami pojęcie ponownego próbkowania (ang. resampling) jest używane jako
synonim prób bootstrapowych (ang. bootstrapping). Częściej jednak pojęcie ponownego próbko-
wania zawiera także pojęcie procedur permutacji (patrz punkt „Test permutacyjny” w rozdziale 3.),
w których wiele prób jest łączonych i ponowne dzielenie może się odbywać bez zwracania. W każdym
przypadku pojęcie bootstrapu wskazuje próbkowanie ze zwracaniem z obserwowanego zbioru danych.

Główne zasady
• Bootstrap (próbkowanie ze zwracaniem ze zbioru danych) jest silnym narzędziem do
oceny zmienności statystyki próby.
• Bootstrap może być stosowany w podobny sposób w różnorodnych okolicznościach bez
intensywnego studiowania przybliżeń matematycznych dla rozkładów próbkowania.
• Bootstrap pozwala również oszacować rozkład próbkowania dla statystyki, gdy nie stwo-
rzono żadnego przybliżenia matematycznego.
• Stosowane w modelach predykcyjnych kumulowanie wielokrotne wyników dla prób bootstra-
powych (bagging) przewyższa użycie pojedynczego modelu.

Dla pogłębienia wiedzy


• An Introduction to the Bootstrap Bradleya Efrona i Roberta Tibshiraniego (Chapman & Hall,
1993) to wciąż czytana pierwsza książka o bootstrapie.
• Retrospektywa o bootstrapie ze „Statistical Science” z roku 2003 (vol. 18, no. 2) omawia (poza
innymi pracami z książki A Short Prehistory of the Bootstrap Petera Halla ) pierwszą publikację
o bootstrapie — napisał ją w 1969 r. Julian Simon.
• Zajrzyj też do An Introduction to Statistical Learning Garetha Jamesa, Danieli Witten, Trevora
Hastiego i Roberta Tibshiraniego (2013), żeby znaleźć rozdział o bootstrapie, a w szczególności
o baggingu.

Próby bootstrapowe | 73

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Przedziały ufności
Tablice częstości, histogramy, boxploty i błędy standardowe umożliwiają zrozumienie potencjal-
nych błędów w szacowaniu próby. Przedziały ufności są kolejnym takim wskaźnikiem.

Kluczowe pojęcia dotyczące przedziałów ufności


Poziom ufności
Procent dla przedziału ufności, skonstruowany w ten sam sposób z tej samej populacji.
Oczekujemy, że interesująca nas statystyka będzie się w nim zawierać.

Końce przedziału
Górny i dolny punkt krańcowy przedziału ufności.

Ludzie mają wrodzoną niechęć do niepewności; zbyt rzadko (zwłaszcza eksperci) mówią: „Nie wiem”.
Analitycy i menedżerowie uznają niepewność, niemniej jednak za bardzo ufają oszacowaniu, zwłasz-
cza gdy jest przedstawione w postaci jednej wartości (oszacowanie punktowe, ang. point estimate).
Zaprezentowanie oszacowania nie w postaci pojedynczej wartości, tylko jako przedziału jest jedną
z metod przeciwdziałania tej tendencji. Przedziały ufności robią to na podstawie ugruntowanych
zasad próbkowania statystycznego.
Przedziały ufności zawsze pojawiają się w parze z poziomem pokrycia, wyrażonym jako (wysoki)
procent, np. 90% lub 95%. Jednym ze sposobów myślenia o 90-procentowym przedziale ufności
jest myślenie o nim jak o przedziale, który zawiera w sobie środkowe 90% bootstrapowego rozkładu
próbkowego dla statystyki z próby (patrz podrozdział „Próby bootstrapowe” we wcześniejszej
części tego rozdziału). Bardziej ogólnie mówiąc, x-procentowy przedział ufności wokół estymatora
próby powinien zawierać podobny estymator próby średnio x% razy (gdy przeprowadzana jest po-
dobna procedura próbkowania).
Przyjmując zadany rozmiar próby n i interesującą nas statystykę testową, uzyskamy następujący
algorytm tworzenia przedziałów ufności dla bootstrapu:
1. Wylosuj próbę o rozmiarze n ze zwracaniem z danych.
2. Zapisz statystykę wyliczoną dla wylosowanej próby.
3. Powtórz kroki 1. i 2. wiele (R) razy.
4. Dla x-procentowego przedziału ufności odetnij [(100–x)/2]% z każdego końca rozkładu dla R
obliczonych wyników.
5. Punkty odcięcia są końcami x-procentowego przedziału ufności dla bootstrapu.
Rysunek 2.9 przedstawia 90-procentowy przedział ufności dla średniej z rocznych dochodów osób
wnioskujących o pożyczki; bazą były próby po 20, dla których średnia wyniosła 62 231 $.

74 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 2.9. Bootstrapowy przedział ufności dla średniej z rocznych dochodów osób wnioskujących o pożyczki,
opracowany na bazie prób po 20

Bootstrap jest ogólnym narzędziem, które może być użyte do generowania przedziałów ufności dla
większości statystyk i parametrów modelu. Podręczniki do statystyki i oprogramowanie, zakorze-
nione w przeszło półwiecznej tradycji analizy statystycznej bez komputerów, będą również opisy-
wać przedziały ufności oparte na ogólnych wzorach, w szczególności na rozkładzie t (patrz pod-
rozdział „Rozkład t-Studenta” w dalszej części tego rozdziału).

Oczywiście tym, co nas najbardziej interesuje w przypadku, gdy mamy wyniki dla
próby, jest pytanie: jakie jest prawdopodobieństwo tego, że faktyczna wartość leży
wewnątrz konkretnego przedziału ufności? To nie jest pytanie, na które odpowiadają
przedziały ufności, ale sposób, w jaki większość osób ostatecznie interpretuje odpo-
wiedź na nie.
Pytanie probabilistyczne powiązane z przedziałem ufności zaczyna się od wyrażenia:
„Dla zadanej procedury i populacji jakie jest prawdopodobieństwo, że…”. Zaczęcie
od drugiej strony: „Dla zadanego wyniku jakie jest prawdopodobieństwo, że…
(jakieś twierdzenie o populacji jest prawdziwe)?” wymaga bardziej złożonych obli-
czeń i lepszej znajomości teorii.

Procent powiązany z przedziałem ufności jest określany mianem poziomu ufności (ang. level of
confidence). Im wyższy poziom ufności, tym szerszy przedział. Również im mniejsza jest próba,
tym szerszy jest przedział (tj. większa niepewność). Podsumowując: im więcej pewności chcesz
mieć i im mniej masz danych, tym szerszy przedział ufności musisz przyjąć, by zyskać dostateczną
pewność, że prawdziwa wartość jest wewnątrz.

Dla specjalisty data science przedział ufności jest narzędziem, którego można uży-
wać do określania, jak zmienne mogą być wyniki z próby. Specjaliści data science nie
wykorzystają tej informacji do publikacji artykułu lub wysłania wyników do agencji
nadzorującej (badacz — i owszem), ale — najprawdopodobniej — do określenia po-
tencjalnych błędów w oszacowaniu i — prawdopodobnie — do sprawdzenia, czy jest
potrzebna większa próba.

Przedziały ufności | 75

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Główne zasady
• Przedziały ufności są typowym sposobem na przedstawienie oszacowania w postaci przedziału.
• Im więcej masz danych, tym mniej zmienny będzie estymator próby.
• Im niższy poziom ufności możesz przyjąć, tym węższy będzie przedział ufności.
• Próby bootstrapowe są efektywną metodą tworzenia przedziałów ufności.

Dla pogłębienia wiedzy


• Przykłady zastosowania bootstrapu w przedziałach ufności znajdziesz w Introductory Statistics
and Analytics: A Resampling Perspective Petera Bruce’a (Wiley, 2014) lub Statistics: Unlocking the
Power of Data, 2nd ed., Robina Locka i czterech innych członków rodziny Locków (Wiley, 2016).
• Inżynierowie, którzy muszą zrozumieć precyzję wykonywanych pomiarów, wykorzystują
przedziały ufności w większości dyscyplin naukowych. Modern Engineering Statistics Thomasa
Ryana (Wiley, 2007) opisuje przedziały ufności, a także narzędzie, które jest równie użyteczne
jak one, ale zwykle poświęca się mu mniej uwagi: przedziały predykcyjne (przedziały wokół
pojedynczej wartości jako przeciwieństwo średniej lub innej statystyki opisowej).

Rozkład normalny
Rozkład normalny w kształcie dzwonu jest fundamentem tradycyjnej statystyki3. Fakt, że statystyki
z próby zazwyczaj przyjmują kształt rozkładu normalnego, sprawił, że jest to potężne narzędzie do
rozwoju metod matematycznych przybliżających ten rozkład.

Kluczowe pojęcia dotyczące rozkładu normalnego


Błąd
Różnica pomiędzy punktem w danych a przewidywaną lub uśrednioną wartością.
Standaryzowany
Po odjęciu średniej i podzieleniu przez odchylenie standardowe.
Z-wynik
Wynik standaryzacji pojedynczego punktu w danych.
Standardowy normalny
Rozkład normalny ze średnią = 0 i odchyleniem standardowym = 1.
Wykres K-K
Wykres do obrazowania, jak zbliżone są rozkłady prób do określonego rozkładu, np. rozkładu
normalnego.

3
Krzywa dzwonu jest ważna, ale prawdopodobnie przeceniana. George W. Cobb, statystyk w Mount Holyoke College,
w swoim wystąpieniu dotyczącym filozofii uczenia wstępnej statystyki, wygłoszonym w listopadzie 2015 r. i opu-
blikowanym w „The American Statistician”, zauważył, że „kursy statystyki, które umieszczają rozkład normalny
w swoim centrum, straciły na znaczeniu”.

76 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W rozkładzie normalnym (rysunek 2.10) 69% danych leży w odległości jednego odchylenia stan-
dardowego od średniej, a 95% wartości leży w odległości dwóch odchyleń standardowych od średniej.

Rysunek 2.10. Krzywa normalna

Powszechnie mylnie przyjmuje się, że rozkład normalny wziął swoją nazwę od da-
nych, które w większości przypadków przyjmują rozkład normalny — co jest natu-
ralne. Większość danych wykorzystywanych w typowych projektach badawczych —
tak naprawdę większość nieprzetworzonych danych — nie pochodzi z rozkładu nor-
malnego (patrz podrozdział „Rozkłady z długimi ogonami” w dalszej części tego roz-
działu). Użyteczność rozkładu normalnego wywodzi się z tego, że większość statystyk
w rozkładach próbkowania przyjmuje rozkład normalny. Nawet wtedy założenia
o normalności są ostatecznością, wykorzystywaną, gdy empiryczne rozkłady praw-
dopodobieństwa lub rozkłady prób bootstrapowych są nieosiągalne.

Rozkład normalny nazywany jest również rozkładem Gaussa, od nazwiska Carla


Friedricha Gaussa, wybitnego niemieckiego matematyka żyjącego na przełomie XIX
i XX wieku. Inna nazwa tego układu, używana wcześniej, to rozkład błędu. Staty-
stycznie rzecz ujmując, błąd jest różnicą pomiędzy faktyczną wartością a statystycz-
nym estymatorem, jak średnia z próby. Dla przykładu odchylenie standardowe
(patrz podrozdział „Miary rozproszenia” w rozdziale 1.) jest oparte na błędzie po-
między średnią a danymi. Gauss rozwinął rozkład normalny na podstawie swoich
badań nad błędami pomiarów astronomicznych, które okazują się pochodzić z roz-
kładu normalnego.

Rozkład normalny | 77

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Standaryzowany rozkład normalny i wykres K-K
Standaryzowany rozkład normalny (ang. standard normal) jest jednym z tych rozkładów, w któ-
rych jednostki na osi x są wyrażone jako różnica odchylenia standardowego od średniej. By przy-
równać dane do standaryzowanego rozkładu normalnego, musisz odjąć średnią, a następnie podzielić
całość przez odchylenie standardowe; taka operacja jest nazywana normalizacją (ang. normalization)
lub standaryzacją (ang. standardization) [patrz punkt „Standaryzacja (normalizacja, z-wynik)
w rozdziale 6.]. Zauważ, że standaryzacja w tym znaczeniu nie ma żadnego związku ze standaryza-
cją rekordów bazy danych (konwersja do wspólnego formatu). Transformowane dane są nazywane
z-wartością (ang. z-score), a rozkład normalny jest czasami określany jako rozkład z (ang. z-distribution).
Wykres K-K jest używany do zobrazowania, jak blisko określonego rozkładu (w tym przypadku
rozkładu normalnego) znajduje się próba. Wykres K-K porządkuje z-wartości od najmniejszej do
największej i rysuje każdą z-wartość na osi y; wartości na osi x odpowiadają kwantylom rozkładu
normalnego dla podanego zakresu wartości. Ponieważ dane są normalizowane, jednostki odpowia-
dają odległości mierzonej w odchyleniach standardowych od średniej. Jeśli punkty mniej więcej
układają się w przekątną, to możemy przyjąć, że badany rozkład jest zbliżony do normalnego.
Rysunek 2.11 przedstawia wykres K-K dla próby 100 wartości wygenerowanych losowo z rozkładu
normalnego; zgodnie z przewidywaniami punkty układają się w linię. Ten rysunek można wyge-
nerować za pomocą funkcji qqnorm z R:
> norm_samp <- rnorm(100)
> qqnorm(norm_samp)
> abline(a=0, b=1, col='grey')

Rysunek 2.11. Wykres K-K dla próby 100 wartości wylosowanych ze standardowego rozkładu normalnego

78 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W Pythonie możemy stworzyć wykres K-K za pomocą metody scipy.stats.probplot:
fig, ax = plt.subplots(figsize=(4, 4))
norm_sample = stats.norm.rvs(size=100)
stats.probplot(norm_sample, plot=ax)

Rozkłady z długimi ogonami


Pomijając historyczną istotność rozkładu normalnego w statystyce, w przeciwieństwie do tego, co
sugeruje nazwa, dane zasadniczo nie pochodzą z rozkładu normalnego.

Kluczowe pojęcia dotyczące rozkładów z długimi ogonami


Ogon
Długa, wąska grupa w rozkładzie częstości, w której z niewielką częstością pojawiają się
względnie skrajne wartości.
Skośność
Kiedy jeden ogon rozkładu jest dłuższy niż drugi.

Mimo że rozkład normalny jest często odpowiedni i wygodny w odniesieniu do rozkładu błędów
i statystyk z próby, zazwyczaj nie charakteryzuje rozkładu nieprzetworzonych danych. Czasami
rozkład jest bardzo skośny (ang. skew) (asymetryczny), tak jak w danych z dochodów, lub dys-
kretny, jak w przypadku danych dwumianowych. Zarówno symetryczne, jak i asymetryczne roz-
kłady mogą mieć długie ogony (ang. long tail). Ogony rozkładu odpowiadają wartościom skrajnym
(małym i dużym). Długie ogony i metody obrony przed nimi są szeroko rozpowszechnione. Nas-
sim Taleb zaproponował teorię czarnego łabędzia, która przewiduje wystąpienie anomalii, takich
jak krach na giełdzie, zdecydowanie skuteczniej niż rozkład normalny.
Dobrym przykładem ilustrującym skłonność do długich ogonów na podstawie danych pochodzą-
cych z giełdy jest rysunek 2.12, przedstawiający wykres K-K dla dziennych zwrotów z akcji firmy
Netflix (NFLX). Wygenerowano go w R w następujący sposób:
> nflx <- sp500_px[,'NFLX']
> nflx <- diff(log(nflx[nflx>0]))
> qqnorm(nflx)
> abline(a=0, b=1, col='grey')

W Pythonie kod wygląda następująco:


nflx = sp500_px.NFLX
nflx = np.diff(np.log(nflx[nflx>0]))
fig, ax = plt.subplots(figsize=(4, 4))
stats.probplot(nflx, plot=ax)

Inaczej niż na rysunku 2.11 tu punkty są znacznie niżej niż prosta dla niskich wartości i znacznie
powyżej niej dla wysokich wartości, co sugeruje, że rozkład danych nie jest normalny. Oznacza to,
że mamy do czynienia z wartościami bardziej skrajnymi, niż można by się spodziewać w rozkładzie
normalnym. Rysunek 2.12 obrazuje również inne popularne zjawisko: punkty są zbliżone do pro-
stej w zakresie jednego odchylenia standardowego od średniej. Tukey opisywał to zjawisko jako
dane „normalne w środku zakresu”, ale ze zdecydowanie dłuższymi ogonami [Tukey 1987].

Rozkłady z długimi ogonami | 79

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 2.12. Wykres K-K dla zwrotów Netfliksa (NFLX)

O dopasowaniu rozkładu statystycznego do obserwowanych danych zostało napi-


sane wiele w literaturze statystycznej. Wystrzegaj się podejścia skupiającego się za
bardzo na danych; jest to raczej sztuka niż nauka. Dane na pierwszy rzut oka są
zmienne i zazwyczaj spójne — w więcej niż jednym kształcie łączą kilka typów roz-
kładów. W typowym przypadku domena i wiedza statystyczna są potrzebne do okre-
ślenia, jaki typ rozkładu jest odpowiedni dla modelu w konkretnym przypadku.
Na przykład możemy mieć dane o poziomach ruchu w internecie z serwerów
w 5-sekundowych odstępach czasowych. Dobrze jest wiedzieć, że najlepszym rozkła-
dem do modelowania wydarzeń w czasie jest rozkład Poissona (patrz podrozdział
„Rozkład Poissona” w dalszej części tego rozdziału).

Główne zasady
• Większość danych nie pochodzi z rozkładu normalnego.

• Założenie o rozkładzie normalnym może prowadzić do niedocenienia znaczenia wydarzeń


ekstremalnych („czarnych łabędzi”).

80 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Dla pogłębienia wiedzy
• Nassim Nicholas Taleb, The Black Swan, 2nd ed., Random House, 2010.
• K. Krishnamoorthy, Handbook of Statistical Distributions with Applications, 2nd ed., Chapman
& Hall/CRC Press, 2016.

Rozkład t-Studenta
Rozkład t (ang. t-distribution) ma kształt rozkładu normalnego, ale odrobinę grubszy i dłuższy
w ogonach. Jest on szeroko wykorzystywany do przedstawiania rozkładu statystyki z próby. Rozkład
średnich z próby jest typowo w kształcie rozkładu t, istnieje również cała rodzina rozkładów t, które
różnią się w zależności od rozmiaru próby. Im większa jest próba, tym bardziej rozkład t przypo-
mina normalny.

Kluczowe pojęcia dotyczące rozkładów t


n
Rozmiar próby.

Stopnie swobody
Parametr, który umożliwia dopasowanie rozkładu t do różnych rozmiarów próby, statystyk
i liczby grup.

Rozkład t jest zazwyczaj nazywany rozkładem t-Studenta, ponieważ w publikacji z 1908 r. zamiesz-
czonej w czasopiśmie „Biometrika”, której autorem był W.S. Gosset, został zaprezentowany pod
nazwą „Student”. Browar Guinness, w którym pracował Gosset, nie chciał, żeby konkurencja do-
wiedziała się, że wykorzystuje on metody statystyczne, dlatego Gosset nie użył nazwy browaru
w swoim artykule.
Gosset chciał odpowiedzieć na pytanie: jaki jest rozkład próbkowania średnich z próby wylosowa-
nych z większej populacji? Zaczął od eksperymentu — losował próby po 4 ze zbioru 3000 pomiarów
wzrostu i długości środkowego palca lewej ręki przestępców. (Badania były prowadzone w erze
eugeniki, kiedy to interesowano się danymi kryminalistów i odkrywano korelacje pomiędzy skłon-
nościami przestępczymi a cechami fizycznymi i psychicznymi ludzi). Narysował standaryzowane
wyniki (z-wyniki) na osi x, a częstości na osi y. Niezależnie wyznaczył funkcję, dzisiaj znaną jako
funkcja t-Studenta, i dopasował ją do wyników próby, rysując wyniki (patrz rysunek 2.13).
W celu oszacowania przedziałów ufności, w świetle zmienności próby, wiele różnych statystyk
może być porównanych po standaryzacji do rozkładu t. Rozważmy próbę o rozmiarze n, dla której
musi być policzona średnia 𝑥̄ . Jeśli s jest odchyleniem standardowym, 90-procentowy przedział
ufności wokół średniej z próby jest określony wzorem:
𝑠
𝑥̄ ± 𝑡 (0,05) ⋅
√𝑛

Rozkład t-Studenta | 81

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 2.13. Wyniki eksperymentu Gosseta i dopasowana krzywa t (przedruk z artykułu z czasopisma
„Biometrika” z 1908 r.)

gdzie tn-1(0,05) jest wartością statystyki t dla (n–1) stopni swobody (patrz podrozdział „Stopnie
swobody” w rozdziale 3.); „odcina” to 5% rozkładu t z każdego końca. Rozkład t był wykorzysty-
wany jako referencja dla rozkładu średnich z próby, różnic pomiędzy dwoma średnimi, parame-
trów regresji i innych statystyk.
Gdyby w 1908 r. dostępne były komputery o wystarczającej mocy obliczeniowej, z całą pewnością
statystycy od samego początku polegaliby bardziej na złożonych obliczeniowo metodach losowych.
Brak komputerów spowodował, że statystycy zwrócili się w stronę matematyki i funkcji, takich jak
rozkład t, by móc oszacować rozkład próby. Szybsze komputery umożliwiły praktyczne ekspery-
menty losowe dopiero w latach 80. ubiegłego wieku; do tego czasu wykorzystanie rozkładu t i innych
podobnych rozkładów było na stałe ujęte w podręcznikach i oprogramowaniu.
Skuteczność odzwierciedlania przez rozkład t zachowania statystyk z próby uzależniona jest od
warunku, że rozkład tej statystyki dla próby musi być rozkładem normalnym. Okazuje się, że sta-
tystyki z próby zazwyczaj mają rozkład normalny, nawet jeśli kryjąca się pod spodem populacja nie
ma (jest to fakt, który doprowadził do szerokiego stosowania rozkładu t). W ten sposób wracamy
do zjawiska znanego jako centralne twierdzenie graniczne — patrz punkt „Centralne twierdzenie
graniczne” we wcześniejszej części tego rozdziału).

Co specjaliści data science muszą wiedzieć o rozkładzie t i centralnym twierdzeniu


granicznym? Tylko kilka rzeczy. Rozkład t jest wykorzystywany we wnioskowaniu
klasycznej statystyki, ale nie jest już tak istotny w data science. Rozumienie oraz ilo-
ściowe określenie niepewności i zmienności jest ważne w data science, ale empiryczne
próby bootstrapowe potrafią przynieść odpowiedź na większość pytań o błąd próby.
Jednakże specjaliści data science rutynowo napotykają statystyki t jako wyjście z opro-
gramowania statystycznego i procedur statystycznych w R; dla przykładu zaznajo-
mienie się z ich zastosowaniem może się okazać pomocne w teście A/B i regresji.

82 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Główne zasady
• Rozkład t jest tak naprawdę rodziną rozkładów przypominających rozkłady normalne, ale
z grubszymi ogonami.
• Rozkład t jest szeroko stosowany jako odniesienie bazowe dla rozkładu dla średnich
z próby, różnic pomiędzy średnimi z dwóch prób, parametrów regresji i wielu innych
parametrów.

Dla pogłębienia wiedzy


• Oryginalny artykuł W. S. Gosseta z czasopisma „Biometrika” z 1908 r. znajdziesz jako PDF
na stronie: http://seismo.berkeley.edu/~kirchner/eps_120/Odds_n_ends/Students_original_
paper.pdf.
• Opis standardowego wykorzystania rozkładu t można znaleźć w materiałach Davida Lane’a
zamieszczonych pod adresem: http://onlinestatbook.com/2/estimation/t_distribution.html.

Rozkład binarny
Wyniki tak/nie (binarne) są sercem analityki, od kiedy stały się kluczem do podejmowania decyzji
lub innych procesów: kupić/nie kupić, kliknąć/nie kliknąć, przeżyć/nie przeżyć itd. Sednem roz-
kładu dwumianowego jest idea zbioru prób niezależnych (ang. trials), z których każda ma dwa
możliwe wyniki o zdefiniowanym prawdopodobieństwie wystąpienia.
Dla przykładu rzut monetą 10 razy jest eksperymentem dwumianowym dla 10 prób niezależnych,
a każda z nich ma dwa możliwe wyniki (orzeł albo reszka) — patrz rysunek 2.14. Takie wyniki
tak/nie, 1/0 są nazywane binarnymi (ang. binary), a prawdopodobieństwo ich wystąpienia nie musi
wynosić dokładnie 50/50. Można użyć dowolnych prawdopodobieństw, które sumują się do 1,0.
Zwyczajowo w statystyce w przypadku wyniku „1” mówi się o sukcesie; powszechną praktyką jest
przypisywanie do „1” wyniku rzadszego. Użycie pojęcia sukcesu nie oznacza, że ten wynik jest po-
żądany czy przynosi korzyści, wskazuje jedynie na to, że jest to wynik, który nas interesuje. Dla
przykładu opóźnienie w spłacie kredytu czy nieuczciwe transakcje są względnie rzadkimi zjawi-
skami, które chcielibyśmy przewidzieć, więc określamy je jako „1” lub „sukces”.

Rysunek 2.14. Rewers pięciocentówki

Rozkład binarny | 83

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące rozkładu binarnego
Próba niezależna
Zdarzenie z dyskretnym wynikiem (np. rzut monetą).

Sukces
Wynik pozytywny próby niezależnej.
Synonim
„1” (jako przeciwieństwo „0”)

Binarny
Mający dwa wyniki.
Synonimy
tak/nie, 0/1, dwumianowy

Binarna próba niezależna


Zdarzenie z dwoma wynikami.
Synonim
próby Bernoulliego

Rozkład binarny
Rozkład liczby sukcesów w x próbach niezależnych.
Synonim
rozkład Bernoulliego, rozkład dwumianowy

Rozkład dwumianowy jest rozkładem częstości dla liczby sukcesów (x) w zadanej liczbie niezależ-
nych prób (n) z określonym prawdopodobieństwem (p) dla każdej próby. W istocie jest to rodzina
rozkładów sparametryzowana przez wartości n oraz p. Rozkład dwumianowy może odpowiedzieć
na pytanie typu:
jeśli prawdopodobieństwo zwrotu (sprzedaży) z kliknięcia wynosi 0,02, jakie jest prawdopodobień-
stwo zaobserwowania 0 sprzedaży w 200 kliknięciach?

Funkcja R dbinom oblicza prawdopodobieństwo dwumianowe. Na przykład:


dbinom(x=2, size=5, p=0.1)

zwróci nam prawdopodobieństwo 0,0729 dla obserwowanych dokładnie x = 2 sukcesów w size = 5


próbach niezależnych, gdzie prawdopodobieństwo sukcesu w każdej próbie wynosi p = 0,1. W po-
wyższym przykładzie wyznaczamy wartości x = 0, size = 200 i p = 0,02. Dla takich argumentów
funkcja dbinom zwraca prawdopodobieństwo równe 0,0176.
Zazwyczaj jesteśmy zainteresowani określeniem prawdopodobieństwa x bądź mniejszej liczby suk-
cesów w n próbach niezależnych. W takim przypadku wykorzystujemy funkcję pbinom:
> pbinom(2, 5, 0.1)

84 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Taka funkcja zwróci nam wartość 0,9914, prawdopodobieństwo zaobserwowania dwóch lub mniej-
szej liczby sukcesów w pięciu próbach niezależnych, gdzie prawdopodobieństwo pojedynczego
sukcesu wynosi 0,1.
Moduł scipy.stats zawiera implementacje wielu różnych rozkładów statystycznych. W przy-
padku rozkładu binarnego wykorzystujemy funkcje stats.binom.pmf i stats.binom.cdf:
stats.binom.pmf(2, n=5, p=0.1)
stats.binom.cdf(2, n=5, p=0.1)

Średnia rozkładu dwumianowego wynosi n×p; możesz również myśleć o tym jak o oczekiwanej
liczbie sukcesów w n powtórzeniach dla prawdopodobieństwa sukcesu = p.
Wariancja wynosi n×p(1–p). Dla dostatecznie dużej liczby prób niezależnych (w szczególności gdy
p jest zbliżone do 0,5) rozkład dwumianowy jest praktycznie nieodróżnialny od rozkładu normal-
nego. W rzeczywistości obliczanie prawdopodobieństwa dwumianowego dla dużych rozmiarów
prób jest wymagające obliczeniowo i większość procedur statystycznych wykorzystuje do jego osza-
cowania rozkład normalny ze średnią i z wariancją.

Główne zasady
• Wyniki dwumianowe są ważne z punktu widzenia modelowania, ponieważ reprezentują
m.in. fundamentalne decyzje (kupić/nie kupić, kliknąć/nie kliknąć, przeżyć/nie przeżyć itd.).
• Dwumianowe niezależne próby są eksperymentem z dwoma możliwymi wynikami: jeden
z prawdopodobieństwem p, a drugi z prawdopodobieństwem 1–p.
• Dla dużego n i znanego p, niezbyt bliskiego 0 lub 1, rozkład dwumianowy może być przybli-
żonym rozkładem normalnym.

Dla pogłębienia wiedzy


• Poczytaj o quincunx (https://www.mathsisfun.com/data/binomial-distribution.html), urządze-
niu podobnym do automatu flipper, ilustrującym rozkład dwumianowy.
• Rozkład dwumianowy jest podstawą wstępu do statystyki i każdy podręcznik do statystyki bę-
dzie zawierał jeden albo dwa rozdziały na jego temat.

Rozkład chi-kwadrat
Ważną koncepcją w statystyce jest odstępstwo od oczekiwania (ang. departure from expectation),
zwłaszcza w kontekście zliczeń kategorii. Oczekiwanie definiujemy luźno jako „nic niezwykłego
bądź godnego uwagi w danych” (np. brak korelacji pomiędzy zmiennymi lub przewidywalnego
wzorca). Pojęcie to nazywamy także hipotezą zerową (ang. null hypothesis) lub modelem zerowym
(ang. null model) (zob. punkt „Hipoteza zerowa” w rozdziale 3.). Możesz na przykład sprawdzić,
czy jakaś zmienna (np. zmienna rzędowa reprezentująca płeć) jest niezależna od innej (np. zmien-
nej kolumnowej reprezentującej awans zawodowy) i dysponujesz zliczeniem wartości numerycz-
nych z każdej komórki tabeli. Rozkład chi-kwadrat jest statystyką mierzącą stopień, w jakim wyniki

Rozkład chi-kwadrat | 85

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


odstają od oczekiwania zerowego niezależności. Jest to różnica pomiędzy wartościami zaobserwo-
wanymi i oczekiwanymi podzielona przez pierwiastek kwadratowy wartości oczekiwanej, podnie-
siona do kwadratu, a następnie zsumowana po wszystkich kategoriach. Proces ten standaryzuje
statystykę, dzięki czemu można ją porównać z rozkładem referencyjnym. Bardziej ogólnie staty-
styka chi-kwadrat stanowi miarę stopnia, w jakim zbiór obserwowanych wartości „pasuje” do okre-
ślonego rozkładu (test „dobroci dopasowania”). Przydaje się ona do określania, czy różne mecha-
nizmy naprawcze („test A/B/C…”) różnią się w skutkach od pozostałych.
Rozkład chi-kwadrat stanowi rozkład tej statystyki przy założeniu powtarzanych zrandomizowa-
nych losowań z modelu zerowego; szczegółowy algorytm, a także wzór chi-kwadrat dla tablicy da-
nych znajdziesz w podrozdziale „Test chi-kwadrat” w rozdziale 3. Mała wartość chi-kwadrat dla
zbioru zliczeń świadczy o tym, że są w dużej mierze zgodne z oczekiwanym rozkładem. Z kolei
duża wartość chi-kwadrat mówi nam o dużej rozbieżności wyników od wartości oczekiwanych.
Istnieją różne rozkłady chi-kwadrat powiązane z poszczególnymi stopniami swobody (np. liczbą
obserwacji; zob. podrozdział „Stopnie swobody” w rozdziale 3.).

Główne zasady
• Rozkład chi-kwadrat wiąże się najczęściej ze zliczeniami podmiotów lub elementów two-
rzących kategorie.
• Statystyka chi-kwadrat mierzy stopień odejścia od wyników przewidywanych w modelu
zerowym.

Dla pogłębienia wiedzy


• Obecność rozkładu chi-kwadrat we współczesnej statystyce zawdzięczamy znakomitemu sta-
tystykowi Karlowi Pearsonowi, a także narodzinom działu testowania hipotez; więcej informa-
cji na ten temat znajdziesz w książce The Lady Tasting Tea: How Statistics Revolutionized
Science in the Twentieth Century Davida Salsburga (W.H. Freeman, 2001).
• Więcej szczegółów znajdziesz w podrozdziale „Test chi-kwadrat” w rozdziale 3.

Rozkład F
Powszechnie stosowaną procedurą w eksperymentach naukowych jest testowanie różnych roz-
wiązań na poszczególnych grupach, na przykład różnych nawozów na oddzielnych obszarach pola
uprawnego. Przypomina to test A/B/C wspomniany podczas omawiania rozkładu chi-kwadrat
(zob. podrozdział „Rozkład chi-kwadrat”), w tym przypadku jednak mamy do czynienia z mierzo-
nymi wartościami ciągłymi, a nie zliczeniami. W takiej sytuacji interesuje nas, w jakim stopniu
różnice pomiędzy średnimi z grup są większe w porównaniu z wartościami uzyskiwanymi w wa-
runkach normalnych, losowych zmian. Mierzymy to za pomocą statystyki F, którą definiujemy
jako stosunek zmienności pomiędzy średnimi grupy do zmienności wewnątrz każdej grupy (tzw.
zmienności resztowej). Porównanie to nazywamy analizą wariancji (ang. analysis of variance; zob.
podrozdział „ANOVA” w rozdziale 3.). Rozkład statystyki F stanowi rozkład częstości wszystkich

86 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


wartości, które byłyby wygenerowane przez losowo permutujące dane, gdzie średnie wszystkich
grup są równe (czyli model zerowy). Istnieją różne rozkłady F powiązane z poszczególnymi stop-
niami swobody (np. liczbami grup; zob. podrozdział „Stopnie swobody” w rozdziale 3.). Mechanizm
obliczania statystyki F został omówiony we wspomnianym podrozdziale „ANOVA”. Statystyka F
jest również wykorzystywana w regresji liniowej do porównywania zróżnicowania wprowadzanego
przez model regresji z całkowitym zróżnicowaniem danych. Statystyki F są automatycznie obli-
czane przez R i Pythona w ramach zadań regresji i ANOVA.

Główne zasady
• Rozkład F jest używany w eksperymentach i modelach liniowych wykorzystujących dane po-
miarowe.
• Statystyka F porównuje zróżnicowanie wynikające z interesujących nas czynników z ogól-
nym zróżnicowaniem.

Dla pogłębienia wiedzy


Książka Introduction to Design and Analysis of Experiments George’a Cobba (Wiley, 2008) zawiera
doskonały opis i analizę składowych wariancji, pomagające zrozumieć technikę ANOVA i staty-
stykę F.

Rozkład Poissona i jego pochodne


Wiele procesów powoduje wydarzenia losowo, ale na zadanym całkowitym poziomie — osoby od-
wiedzające stronę lub samochody przyjeżdżające na parking płatny (wydarzenia rozciągnięte
w czasie); niedoskonałości na metrze kwadratowym materiału czy literówki na 100 linii kodu
(wydarzenia rozciągnięte w przestrzeni).

Kluczowe pojęcia dotyczące rozkładu Poissona i jego pochodnych


Lambda
Wskaźnik częstości (na jednostkę czasu lub przestrzeni) występowania zdarzenia.

Rozkład Poissona
Rozkład częstości liczby wydarzeń w próbie w jednostce czasu lub przestrzeni.

Rozkład wykładniczy
Rozkład częstości dla czasu, jaki upływa pomiędzy jednym wydarzeniem a drugim.

Rozkład Weibulla
Uogólniona wersja rozkładu wykładniczego, w którym dopuszcza się zmienny wskaźnik
wystąpienia zdarzenia w czasie.

Rozkład Poissona i jego pochodne | 87

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rozkład Poissona
Na podstawie wcześniej uzyskanych danych zbiorczych (np. liczby zachorowań na grypę w skali
roku) możemy oszacować średnią liczbę wystąpień zdarzenia w jednostce czasu lub przestrzeni
(np. zachorowań dziennych lub na jednostkę demograficzną). Możemy również chcieć poznać róż-
nicę pomiędzy poszczególnymi jednostkami czasu lub przestrzeni. Rozkład Poissona pokazuje roz-
kład wystąpień zdarzeń w jednostce przestrzeni lub czasu, kiedy badamy wiele takich jednostek.
Praktycznym działaniem jest doprecyzowywanie pytań, np.: „Jak dużej liczby danych potrzebuję,
żeby zyskać 95% pewności co do pełnego przeanalizowania ruchu w sieci, który otrzymuję z ser-
wera w przedziałach 5-sekundowych?”.
Kluczowym parametrem w rozkładzie Poissona jest λ (lambda). Określa ona średnią liczbę zdarzeń
występujących w określonym przedziale czasu lub przestrzeni. Wariancja dla rozkładu Poissona
również wynosi λ.
Powszechną praktyką jest wygenerowanie losowych wartości z rozkładu Poissona jako części sy-
mulacji. Funkcja rpois z R generuje wartości, wykorzystując jedynie dwa argumenty — ilość liczb
do wylosowania oraz lambdę:
> rpois(100, lambda=2)

W Pythonie odpowiednikiem jest funkcja stats.poisson.rvs z pakietu scipy:


stats.poisson.rvs(2, size=100)

Powyższy kod wygeneruje 100 wartości losowych z rozkładu Poissona z λ = 2. Przykładowo jeśli
dział obsługi klienta otrzymuje średnio dwa połączenia telefoniczne w ciągu minuty, powyższy kod
zasymuluje 100 minut, dla których wygeneruje liczbę połączeń telefonicznych, jakie dział otrzyma
w każdej minucie.

Rozkład wykładniczy
Wykorzystując ten sam parametr λ, którego używaliśmy w rozkładzie Poissona, możemy również
zamodelować rozkład dla przedziałów czasowych pomiędzy tymi zdarzeniami: czas pomiędzy od-
wiedzinami strony lub pomiędzy przyjazdami kolejnych samochodów na parking płatny. Jest on
również wykorzystywany w inżynierii, np. do modelowania czasu do wystąpienia kolejnej awarii,
oraz w zarządzaniu procesami do modelowania, np. czasu poświęcanego na rozmowę serwisową.
Kod R generujący losowe wartości z rozkładu wykładniczego wykorzystuje dwa argumenty: n, czyli
liczbę wartości do wygenerowania, i rate (liczbę zdarzeń występujących w danym okresie), np.:
rexp(n=100, rate=0.2)

W funkcji stats.expon.rvs kolejność argumentów jest odwrotna:


stats.expon.rvs(0.2, size=100)

Powyższy kod wygeneruje 100 losowych wartości z rozkładu wykładniczego; średnia liczba zdarzeń
w danym okresie wynosi 0,2. Możesz wykorzystać te wyniki do zasymulowania 100 przedziałów
w minutach pomiędzy kolejnymi połączeniami telefonicznymi związanym z serwisem; średni wskaź-
nik wynosi tu 0,2 rozmowy na minutę.

88 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowym elementem w dowolnych badaniach symulacyjnych, zarówno dla rozkładu Poissona,
jak i dla rozkładu wykładniczego, jest wskaźnik λ, który pozostaje stały w rozważanym okresie.
W ogólnym przypadku nie ma to większego sensu; dla przykładu ruch na drogach lub w sieci zmie-
nia się w zależności od pory dnia czy dnia tygodnia. Jednakże odcinki czasu czy obszary przestrzeni
mogą niekiedy być podzielone na fragmenty, które są dostatecznie jednorodne, by analiza lub sy-
mulacja w tych fragmentach miała sens.

Szacowanie współczynnika porażki


W wielu zastosowaniach wskaźnik częstości zdarzenia λ może być również szacowany na podsta-
wie zebranych danych. Jednakże dla zdarzeń rzadkich nie zawsze jest to możliwe. Awarie silników
samolotowych są (na szczęście) dla konkretnych modeli silników na tyle rzadkimi wydarzeniami,
że prawdopodobnie jest zbyt mało danych, na podstawie których można by oszacować odcinki
czasu pomiędzy awariami. Bez jakichkolwiek danych nie ma podstaw do oszacowania wskaźnika
częstości wystąpienia zdarzenia. Możemy jednak przyjąć, że jeśli przez 20 godzin nie nastąpiło zda-
rzenie, to możemy być niemal pewni, że wskaźnik częstości nie jest określany jako liczba wystąpień
na godzinę. Poprzez symulacje i bezpośrednie wyliczenia możesz ocenić różne hipotetyczne wskaź-
niki częstości wystąpienia zdarzenia i oszacować wartości progowe, poniżej których te wskaźniki
najprawdopodobniej nie spadną. Jeśli masz częściowe dane, ale jest ich zbyt mało, by można było
przeprowadzić precyzyjne wiarygodne oszacowanie wskaźnika, możesz zastosować test zgodności
dopasowania (patrz podrozdział „Test chi-kwadrat” w rozdziale 3.) do różnych wskaźników w celu
ocenienia, jak dobrze są one dopasowane do zebranych danych.

Rozkład Weibulla
W wielu przypadkach wskaźnik częstości wystąpienia zdarzenia nie jest stały w czasie. Jeśli okres,
w którym wskaźnik się zmienia, jest dużo dłuższy niż typowy przedział pomiędzy kolejnymi zda-
rzeniami, nie ma problemu; po prostu dzielisz analizę na fragmenty, dla których wskaźnik jest
względnie stały. Jeśli jednak wskaźnik wystąpienia zmienia się w czasie wewnątrz przedziałów, roz-
kład wykładniczy (lub Poissona) nie będzie pomocny. Dokładnie tak jest w przypadku awarii me-
chanicznych — ryzyko awarii rośnie w czasie. Rozkład Weibulla (ang. Weibull distribution) jest
rozszerzeniem rozkładu wykładniczego, w którym dopuszcza się zmiany wskaźnika wystąpienia
określone przez parametr kształtu (ang. shape parameter) β. Jeśli β > 1, prawdopodobieństwo wy-
stąpienia zdarzenia rośnie w czasie; jeśli β < 1, prawdopodobieństwo maleje. Ponieważ rozkład
Weibulla jest wykorzystywany w analizie czasu do awarii zamiast wskaźnika częstości wystąpienia,
drugi parametr jest wyrażony jako charakterystyka przeżycia, a nie jako liczba zdarzeń na przedział.
Symbol go opisujący, η, to grecka litera eta. Jest on również nazywany parametrem skali (ang. scale).
W przypadku rozkładu Weibulla przeprowadzenie oszacowania wymaga określenia dwóch para-
metrów: β i η. Do modelowania danych i szacowania parametrów najlepszego dopasowania roz-
kładu Weibulla wykorzystuje się oprogramowanie.

Rozkład Poissona i jego pochodne | 89

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kod R do wygenerowania losowych wartości pochodzących z rozkładu Weibulla wymaga trzech
argumentów: n (liczby wartości do wygenerowania), shape i scale. Następujący kod wygeneruje
100 losowych wartości (czasów przeżycia) z rozkładu Weibulla dla kształtu 1,5 i charakterystyki
przeżycia 5000:
rweibull(100,1.5,5000)

W Pythonie to samo osiągamy za pomocą funkcji stats.weibull_min.rvs:


stats.weibull_min.rvs(1.5, scale=5000, size=100)

Główne zasady
• Dla wydarzeń, które występują ze stałą częstością, liczba zdarzeń w jednostce czasu lub
przestrzeni może być modelowana jako rozkład Poissona.
• Możesz zamodelować również czas lub odległość pomiędzy kolejnymi zdarzeniami za po-
mocą rozkładu wykładniczego.
• Zmieniający się wskaźnik wystąpienia zdarzenia w czasie (np. rosnące prawdopodobieństwo
awarii) może być modelowany rozkładem Weibulla.

Dla pogłębienia wiedzy


• Książka Modern Engineering Statistics Thomasa Ryana (Wiley, 2007) zawiera rozdział poświę-
cony rozkładom prawdopodobieństwa wykorzystywanym w zastosowaniach inżynieryjnych.
• O tym, jak wykorzystuje się rozkład Weibulla w zastosowaniach inżynieryjnych, przeczytasz tu:
https://support.sas.com/resources/papers/proceedings-archive/SUGI88/Sugi-13-43%20Kay%20Price.pdf
i tu: http://www.ipedr.com/vol75/29_ICQM2014-051.pdf.

Podsumowanie
W epoce big data podstawy próbkowania losowego pozostają ważne, gdy niezbędne jest dokładne
oszacowanie. Dobór losowy danych może zmniejszyć obciążenie i poprawić jakość zbioru danych
w stosunku do wyników, jakie uzyskalibyśmy jedynie przy pomocy łatwo dostępnych danych. Zna-
jomość różnych rozkładów generowanych danych i prób umożliwia określenie ilościowe poten-
cjalnych błędów w oszacowaniu, które mogą pochodzić z losowego zróżnicowania. Jednocześnie
próby bootstrapowe (próbkowanie ze zwracaniem z zebranego zbioru danych) są atrakcyjną i uni-
wersalną metodą do określania możliwych błędów w estymatorach próby.

90 | Rozdział 2. Rozkłady danych i prób

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


ROZDZIAŁ 3.
Eksperymenty statystyczne
i testowanie istotności

Projektowanie eksperymentów stanowi podstawę analizy statystycznej w niemalże każdej dziedzinie


badań. Celem analizy jest zaprojektowanie eksperymentu w taki sposób, by możliwe było potwier-
dzenie lub odrzucenie postawionej hipotezy. Specjaliści data science często zmuszeni są do ciągłego
eksperymentowania, w szczególności dotyczy to interfejsu użytkownika i sprzedaży produktów.
Ten rozdział przedstawia tradycyjne metody projektowania eksperymentów oraz podstawowe wy-
zwania dotyczące data science. Zaprezentowano tu również niektóre z często cytowanych idei zwią-
zanych z wnioskowaniem statystycznym oraz ukazano ich znaczenie (lub brak znaczenia) w data science.
Wszędzie tam, gdzie jest mowa o istotności statystycznej, test t czy p-wartość są typowymi poję-
ciami pojawiającymi się w kontekście klasycznej „ścieżki” wnioskowania statystycznego (patrz ry-
sunek 3.1). Ścieżka ta zaczyna się od postawienia hipotezy („Lek A jest skuteczniejszy niż standar-
dowo stosowany lek” albo „Cena A jest korzystniejsza niż obecna cena B”). Eksperyment (np. test
A/B) jest projektowany pod kątem testowania hipotezy. Na podstawie zebranych danych chcemy
rozwiązać postawiony w niej problem. Zbierane dane są poddawane analizie, a następnie wycią-
gane są wnioski. Pojęcie wniosku, w kontekście wyników eksperymentu, odnosi się do ograniczo-
nego zbioru danych, na podstawie którego wyciągnięte wnioski uogólniamy na całą populację.

Rysunek 3.1. Klasyczna ścieżka wnioskowania statystycznego

Test A/B
Test A/B jest przykładem eksperymentu polegającego na decydowaniu o tym, który z dwóch elemen-
tów, np. dwóch terapii, produktów, sposobów postępowania itp., jest lepszy. Zazwyczaj, w przypadku
terapii, jedną z nich jest standardowo stosowana terapia lub brak terapii. Grupa pacjentów traktowana
zgodnie z obecnymi standardami lub pozostawiona sama sobie jest nazywana grupą kontrolną. Typową
hipotezą będzie rozstrzygnięcie, czy nowa terapia jest lepsza od tej zastosowanej w grupie kontrolnej.

91

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące testowania A/B
Procedura
Podejście, za pomocą którego testujemy obiekt (lek, cenę, nagłówek na stronie internetowej).

Grupa testowa
Grupa obiektów poddana testowaniu.

Grupa kontrolna
Grupa obiektów, która jest traktowana zgodnie ze standardowymi procedurami lub pozosta-
wiona sama sobie.

Randomizacja
Proces losowego przypisywania obiektów do grupy testowej lub kontrolnej.

Obiekt
Podmiot (odwiedzający stronę internetową, pacjenci itp.), który jest poddawany testowaniu.

Statystyka testowa
Miara, przy pomocy której sprawdzamy efekt testowania.

Testy A/B są powszechne w projektowaniu stron internetowych oraz w marketingu ze względu na


łatwość interpretacji wyników. Przykłady testów A/B:
• który z dwóch nawozów pozytywnie wpływa kiełkowanie nasion;
• która z terapii efektywniej zwalcza raka;
• która z cen przyniesie większy zysk;
• który z nagłówków spowoduje więcej wejść na stronę (rysunek 3.2);
• która z reklam wygeneruje zwrot inwestycji.
W prawidłowo zaprojektowanym teście A/B obiekt może być przypisany do jednej z dwóch pro-
cedur. Obiekt może być osobą, ziarnem rośliny, odwiedzającym stronę internetową; kluczowe jest
to, żeby obiekt mógł być poddany procedurze. W idealnym przypadku obiekty są randomizowane
(przypisywane losowo do grup). Dzięki temu masz pewność, że każda różnica pomiędzy grupami
wynika z jednego z dwóch czynników:
• zastosowania różnych procedur;
• przypadku (losowe przypisywanie do grup może spowodować koncentrację lepiej zachowują-
cych się obiektów w jednej z dwóch grup).
Musisz także zwrócić uwagę na statystykę testową lub inną miarę, której używasz do porównania
obu grup. Prawdopodobnie najpopularniejszą miarą w data science jest zmienna binarna: kliknął
— nie kliknął, kupił — nie kupił, oszust — nie oszust itd. Uzyskane w takim eksperymencie wyniki
możemy podsumować w tabeli 2×2. Tabela 3.1 jest tabelą 2×2 dla testu cen (dokładniejszy opis tych
wyników znajdziesz w podrozdziale „Istotność statystyczna i p-wartość”).

92 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 3.2. Marketingowcy stale testują różne układy stron

Tabela 3.1. Tabela 2×2 przedstawiająca wyniki eksperymentu w branży e-commerce

Wynik Cena A Cena B


Sprzedaż 200 182
Bez sprzedaży 23 539 22 406

Jeśli miara jest zmienną ciągłą (taką jak kwota zakupów, zysk itp.) albo liczbą całkowitą (np. dni
spędzone w szpitalu, odwiedzone strony), wynik może być przedstawiony w inny sposób. Jeśli nie
jesteśmy zainteresowani zwrotem, ale dochodami pochodzącymi z każdego wyświetlenia strony,
wynik dla cen z tabeli 3.1 może być przedstawiony jako typowe wyjście z oprogramowania:
Dochód/odwiedzenie strony z ceną A: średnia = 3,87; odchylenie standardowe = 51,10
Dochód/odwiedzenie strony z ceną B: średnia = 4,11; odchylenie standardowe = 62,98

To, że oprogramowanie statystyczne — również R i Python — generuje wyjście do-


myślne, wcale nie znaczy, że to wyjście będzie istotne lub użyteczne. Możesz zauwa-
żyć, że przedstawione wartości odchylenia standardowego nie niosą za sobą żadnej
informacji; na pierwszy rzut oka sugerują, że liczne wartości mogą być negatywne,
podczas gdy wartości negatywne w tym przypadku są niemożliwe. Ten zbiór danych
składa się z niewielkiej liczby wysokich wartości (zwrot z odwiedzonych stron) oraz
ogromnej liczby zer (odwiedzenie strony bez zwrotu). Niezwykle trudno podsumo-
wać tak zróżnicowany zbiór za pomocą jednej wartości; w tym przypadku średnie
odchylenie bezwzględne dla średniej (7,68 dla A i 8,15 dla B) wydaje się lepszym po-
dejściem niż odchylenie standardowe.

Test A/B | 93

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Po co Ci grupa kontrolna?
Dlaczego by nie zrezygnować z grupy kontrolnej i nie zastosować badanej procedury jedynie w od-
niesieniu do jednej grupy, a następnie nie porównać wyniku do wyników poprzednich doświadczeń?
Bez grupy kontrolnej nie ma pewności, że „wszystko inne jest takie samo” oraz że powstałe różnice
są wynikiem nowej procedury (a nie przypadku). Kiedy masz grupę kontrolną, obiekty wewnątrz niej
są traktowane tak samo (oczywiście poza zastosowaniem testowanej procedury) jak w grupie testowej.
Jeśli porównasz wyniki eksperymentu do ogólnego „punktu odniesienia” lub poprzednich doświad-
czeń, możesz stwierdzić, że warunki eksperymentów różnić się nie tylko testowaną procedurą.

Próby ślepe
Próba ślepa jest metodą prowadzenia eksperymentu w taki sposób, że obiekt nie wie,
czy jest poddawany procedurze A, czy procedurze B. Świadomość stosowania kon-
kretnej procedury może wpłynąć na wynik eksperymentu. Z podwójnie ślepą próbą
mamy do czynienia, gdy badacze i asystenci (np. lekarze i pielęgniarki w badaniach
medycznych) także nie wiedzą, który obiekt jest poddawany danej procedurze. Próby
ślepe nie są możliwe w przypadku, kiedy testowana procedura jest jednoznaczna, np.
w testach terapii kognitywnych, przeprowadzanych przez komputer lub psychologa.

Testy A/B w data science używane są zazwyczaj w kontekście witryn internetowych. Testowana
procedura może być projektem strony internetowej, ceną produktu, sformułowaniem nagłówka
czy innym elementem. Niektóre testy wymagają mimo wszystko zachowania reguł randomizacji.
Zazwyczaj obiektem w eksperymencie jest odwiedzający stronę internetową, wynikiem, który
chcemy mierzyć, jest liczba kliknięć, wartość zakupów, czas przeglądania strony, liczba odwiedzo-
nych stron, sprawdzenie, czy konkretna strona jest odwiedzana, itd. W typowym teście A/B musisz
się zdecydować na jedną miarę. Można mierzyć i testować różne zachowania, ale jeśli eksperyment
ma odpowiedzieć na pytanie, czy procedura A jest lepsza od B, to na początek trzeba przyjąć jedną
miarę lub statystykę testową do zweryfikowania odpowiedzi. Dobieranie statystyki testowej
po wykonaniu eksperymentu podważa bezstronność badań.

Dlaczego tylko A/B? Dlaczego nie C, D itd.?


Testy A/B są popularne w marketingu i świecie e-commerce, jednak nie są jedynym typem ekspe-
rymentów statystycznych. W eksperymencie możemy dołączyć dodatkową procedurę, możemy
wielokrotnie zbierać pomiary pochodzące z jednego obiektu. Procedury testowania leków, w których
przypadku przedmiot badań (lek) jest dostępny w ograniczonej ilości, a badania są drogie i długo-
trwałe, eksperyment projektowany jest czasami tak, aby możliwe było ewentualne przerwanie go
na wybranym etapie i wyciągnięcie wniosków wcześniej, niż to było planowane.
Tradycyjne projektowanie eksperymentów statystycznych skupia się na odpowiedzi na stałe pyta-
nie o skuteczność konkretnej procedury. Specjaliści data science są mniej zainteresowani odpowie-
dzią na pytanie: „Czy różnica pomiędzy ceną A i B jest istotna statystycznie?” niż na pytanie: „Która
z wielu proponowanych cen jest najlepsza?”.
Do znalezienia odpowiedzi wykorzystywany jest stosunkowo nowy algorytm o nazwie Wieloręki
Bandyta (patrz podrozdział „Algorytm Wielorękiego Bandyty” w dalszej części tego rozdziału).

94 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Uzyskiwanie pozwolenia na badania
W badaniach naukowych traktujących ludzi jako obiekty badawcze niezbędne jest
uzyskanie zgody każdego członka grupy badanej, jak również uzyskanie od odpo-
wiedniej komisji bioetycznej zezwolenia na badania. W przypadku badań bizne-
sowych rzadko kiedy uczestnik jest informowany o tym, że jest obiektem badań.
W większości przypadków (takich jak eksperymenty cenowe, eksperymenty doty-
czące tego, który nagłówek przyciąga większą uwagę lub która reklama przynosi więk-
sze zyski) takie praktyki są powszechnie akceptowane. Jednakże w 2014 r. 1 Facebook
przekroczył granice akceptacji swoim eksperymentem polegającym na testowaniu
nacechowania emocjonalnego informacji wyświetlanych użytkownikowi w portalu.
Facebook używał analizy słów do dzielenia postów na pozytywne i negatywne, a na-
stępnie modyfikował stosunek postów pozytywnych do negatywnych w postach pro-
ponowanych użytkownikowi w profilu. Losowym uczestnikom eksperymentu wy-
świetlano więcej pozytywnych informacji w proponowanych treściach, podczas gdy
u innych wybranych uczestników dominowały treści negatywne. Facebook odkrył,
że osoby, którym dostarczano pozytywnych treści, częściej same publikowały infor-
macje o takim nacechowaniu i odwrotnie. Waga problemu była niewielka, jednak
Facebook spotkał się z szeroką krytyką za przeprowadzanie eksperymentów bez wie-
dzy użytkowników. Spekulowano, że Facebook mógł pogorszyć stan użytkowników
z depresją, jeśli trafili oni do „negatywnej” grupy testowej.

Główne zasady
• Obiekty są przypisane do dwóch (lub większej liczby) grup testowych. Grupy w toku ekspe-
rymentu są pod każdym względem traktowane jednakowo, z wyjątkiem procedury, która jest
poddawana testowaniu.
• W idealnym przypadku obiekty są przypisywane do grup losowo.

Dla pogłębienia wiedzy


• Porównanie dwóch grup (test A/B) jest podstawą tradycyjnej statystyki. Dowolny kurs wpro-
wadzający do statystyki będzie stanowił wystarczające omówienie głównych zasad projektowa-
nia eksperymentów i wyciągania wniosków. Omówienie testu A/B w kontekście data science
i testów randomizacyjnych znajdziesz w Introductory Statistics and Analytics: A Resampling
Perspective Petera Bruce’a (Wiley, 2014).
• Podczas testów przeprowadzanych w internecie aspekt logistyczny może być równie dużym
wyzwaniem jak statystyczny. Dobrym miejscem do tego, by zacząć, jest strona Google Optimize,
zakładka Experiment: https://support.google.com/optimize/topic/6197696?hl=en.
• Unikaj przypadkowych rad znalezionych w internecie, np. „Poczekaj, aż osiągniesz 1000 od-
wiedzeń strony, i upewnij się, że test jest prowadzony przez tydzień”. Takie ogólne zasady nie
zawsze są wiarygodne statystycznie w konkretnych przypadkach (patrz podrozdział „Moc
i rozmiar próby” w dalszej części tego rozdziału).

1
Tak naprawdę eksperyment prowadzony był przez tydzień w styczniu 2012 r., a wyniki zostały opublikowane
w marcowym wydaniu „Proceedings of National Academy of Sciences” z 2014 r.

Test A/B | 95

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Testowanie hipotezy
Testy hipotez, zwane również testami istotności, są wszechobecne w tradycyjnej analizie staty-
stycznej publikowanych badań. Ich celem jest pomoc w stwierdzeniu, czy losowość może być od-
powiedzialna za obserwowany efekt.

Kluczowe pojęcia dotyczące testowania hipotezy


Hipoteza zerowa
Hipoteza poddawana weryfikacji.
Hipoteza alternatywna
Hipoteza przeciwna do zerowej (którą masz nadzieję udowodnić).
Test jednostronny
Test hipotezy, który sprawdza jedną nierówność.

Test dwustronny
Test hipotezy, który sprawdza dwie nierówności, w dwóch kierunkach.

Test A/B (patrz podrozdział „Test A/B” we wcześniejszej części tego rozdziału) jest zazwyczaj kon-
struowany pod kątem jakiejś hipotezy. Przykładowo hipotezę może stanowić stwierdzenie, że cena
B przyniesie większe zyski niż cena A. Dlaczego potrzebujemy hipotezy? Dlaczego po prostu nie
popatrzymy na wyniki eksperymentu i nie zastosujemy procedury, która okazała się lepsza?
Odpowiedź leży w ludzkiej tendencji do niedoceniania możliwości naturalnych losowych zacho-
wań. Jednym z takich przykładów jest niepowodzenie w przewidywaniu wydarzeń ekstremalnych,
zwanych również czarnymi łabędziami (patrz podrozdział „Rozkłady z długimi ogonami” w roz-
dziale 2.). Kolejnym przykładem jest tendencja do błędnego interpretowania wydarzeń przypad-
kowych jako istotnych wzorców. Hipotezy statystyczne zostały stworzone po to, by chroniły nau-
kowców przed pomyłkami spowodowanymi przez wydarzenia losowe.

Źle interpretowana losowość


Możesz zaobserwować ludzką tendencję do niedoceniania losowości w następującym eksperymen-
cie. Poproś kilku przyjaciół o wymyślenie wyników dla serii 50 losowych rzutów monetą: niech spiszą
oni wyniki jako serię losowych orłów i reszek. Następnie poproś ich, by faktycznie rzucili 50 razy
monetą i zapisali wyniki. Nie jest trudno stwierdzić, które wyniki są rzeczywiste, a które wymyślone:
prawdziwe wyniki będą zawierały dłuższe ciągi orłów lub reszek. W zbiorze 50 prawdziwych rzu-
tów monetą nie jest niczym nadzwyczajnym pięć czy sześć orłów lub reszek z rzędu. Jednakże
kiedy większość z nas wymyśla losową serię rzutów monetą i zapisuje już trzy lub cztery orły nastę-
pujące po sobie, mówimy, że by seria wyglądała na losową, trzeba zmienić orły na reszki.
Odwrotna sytuacja dotycząca takiej losowości polega na tym, że gdy w rzeczywistym świecie wi-
dzimy sześć orłów z rzędu (np. jeden nagłówek uzyskuje o 10% większy zwrot od drugiego), jeste-
śmy skłonni stwierdzić, że to faktyczny trend, a nie zwykły przypadek.

96 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W prawidłowo zaprojektowanym teście A/B zbierasz dane o procedurach A i B w taki sposób, by
dowolna z obserwowanych różnic pomiędzy nimi wynikała z jednego z dwóch czynników:
• losowości przypisywania obiektów;
• faktycznej różnicy pomiędzy A i B.
Test hipotezy statystycznej jest dalszą analizą testu A/B lub innego losowego eksperymentu, dzięki
któremu ustala się, czy losowość jest uzasadnioną przyczyną obserwowanej różnicy pomiędzy A i B.

Hipoteza zerowa
Testy hipotez wykorzystują następującą logikę: „Biorąc pod uwagę ludzką tendencję do reakcji na
nietypowe, ale mimo wszystko losowe zachowania i interpretację ich jako coś znaczącego, w na-
szym eksperymencie wymagamy dowodu na potwierdzenie tego, że różnica pomiędzy grupami
faktycznie jest większa, niż mógłby to spowodować zwykły przypadek”. Konsekwencją tego są pod-
stawowe założenia, że procedury są równorzędne i jakiekolwiek różnice pomiędzy grupami wyni-
kają z losowości. To podstawowe założenie jest nazywane hipotezą zerową. Mamy nadzieję, że tam,
gdzie jest to możliwe, hipoteza zerowa okaże się fałszywa i pokaże, że wyniki dla grup A i B różnią
się bardziej, niż wynikałoby to z przypadku.
Jedną z możliwości przetestowania hipotezy zerowej są permutacyjne testy randomizacyjne, w któ-
rych mieszamy razem wyniki z grup A i B, a następnie wielokrotnie rozdzielamy dane na mniejsze
grupy i obserwujemy, jak często otrzymamy różnicę tak znaczną jak ta obserwowana w oryginal-
nym eksperymencie. Łączne, potasowane wyniki z grup A i B, a także procedura dolosowania z nich
sprawiają, że hipotezy zerowe dla grupy A i grupy B są równoważne i wymienne; jest to tzw. model
zerowy (patrz podrozdział „Testy randomizacyjne” w dalszej części tego rozdziału).

Hipoteza alternatywna
Testy hipotez z założenia są oparte nie tylko na hipotezie zerowej, ale również na dopełniającej
hipotezie alternatywnej. Poniżej zamieszczono kilka przykładów takich par:
• h. zerowa = brak różnic pomiędzy średnimi w grupie A i grupie B, h. alternatywna = A jest
różne od B (może być większe lub mniejsze);
• h. zerowa = A ≤ B, h. alternatywna = A > B;
• h. zerowa = B nie jest większe niż X% od A”, h. alternatywna = B jest o X% większe niż A.
Podsumowując, można stwierdzić, że hipotezy zerowa i alternatywna muszą zawierać w sobie
wszystkie możliwości. Natura hipotezy zerowej determinuje strukturę hipotezy alternatywnej.

Test jednostronny i test dwustronny


Zazwyczaj w teście A/B testujesz nową opcję (np. B), porównując ją z dotychczas stosowaną, stan-
dardową opcją (A). Zakładasz, że trzymasz się opcji standardowej tak długo, aż nowa opcja okaże
się niepodważalnie lepsza. W takim przypadku chcesz, by test hipotezy zabezpieczył Cię przed fał-
szywymi wnioskami, wynikającymi z losowości sprzyjającej B. Fałszywe wnioski sprzyjające A nie
są istotne, ponieważ i tak będziesz uważał A za lepszą opcję tak długo, aż udowodnisz wyższość B.

Testowanie hipotezy | 97

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Innymi słowy, interesuje Cię kierunkowa hipoteza alternatywna (B jest lepsze od A). W takim
przypadku używasz testu jednostronnego (z jednym ogonem). To znaczy, że wyniki dla skrajnych
przypadków są znaczące tylko w jednym kierunku dla p-wartości.
Jeśli chcesz się zabezpieczyć przed losowością pojawiającą się z obu stron, alternatywna hipoteza
musi być dwustronna (A jest różne od B, może być większe lub mniejsze). W takim przypadku
stosujesz hipotezę dwustronną (z dwoma ogonami). To oznacza, że skrajna losowość wpływa na
p-wartość z obu stron.
Test hipotezy jednostronnej często pasuje do sposobu podejmowania decyzji na podstawie testu A/B,
kiedy to należy wybrać jedną z dwóch opcji. Jedna z nich jest zazwyczaj opisana jako „domyślna”,
tak długo, aż zostanie udowodnione, że ta druga jest lepsza. Jednak oprogramowanie, również R
i moduł scipy w Pythonie, zazwyczaj proponuje test dwustronny jako opcję domyślną. Jest on bar-
dziej konserwatywny, przez co częściej stosowany przez naukowców, którzy nie chcą wywoływać
dyskusji. Zagadnienie „testy jednostronne vs. dwustronne” jest skomplikowane, ale niezbyt istotne
w data science, gdzie precyzyjne obliczenie p-wartości nie jest tak bardzo ważne.

Główne zasady
• Hipoteza zerowa jest konstruktem logicznym uosabiającym pojęcie, że nic nadzwyczajnego
się nie stało, a jakikolwiek obserwowany efekt wynika z losowości.
• Test hipotezy przyjmuje poprawność hipotezy zerowej, tworzy „model zerowy” (model
prawdopodobieństwa) i sprawdza, czy efekt, który obserwujesz, jest uzasadnionym wyni-
kiem stworzonego modelu.

Dla pogłębienia wiedzy


• Książka Matematyka niepewności. Jak przypadki wpływają na nasz los Leonarda Mlodinowa
(Prószyński i S-ka, 2009) to wart przeczytania przegląd sposobów, w jakie losowość rządzi na-
szym życiem.
• Statistics, 4th ed. Davida Freedmana, Roberta Pisaniego i Rogera Purvesa (W.W. Norton, 2007)
to klasyczny podręcznik do statystyki, który wspaniale, nie przytłaczając matematyką, tłuma-
czy większość tematów, w tym testowanie hipotez.
• Introductory Statistics and Analytics: A Resampling Perspective Petera Bruce’a (Wiley, 2014) to
rozwinięcie koncepcji testowania hipotez przy użyciu testów randomizacyjnych.

Testy randomizacyjne
Testy randomizacyjne w statystyce oznaczają wielokrotne próbkowanie z obserwowanych danych
w celu oceny losowości zmienności w obliczanej statystyce. Testy mogą być również użyte do sza-
cowania i poprawiania dokładności niektórych modeli uczenia maszynowego (np. predykcja z mo-
deli drzew decyzyjnych budowanych na bazie zbioru danych z wielokrotnego bootstrapu może być
uśredniana w procesie tzw. baggingu; patrz podrozdział „Bagging i lasy losowe” w rozdziale 6.).

98 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Istnieją dwa główne typy testów randomizacyjnych: bootstrap i testy permutacyjne. Metoda bo-
otstrapu jest wykorzystywana do szacowania wiarygodności rozkładu; szerzej omówiono to w roz-
dziale 2., w podrozdziale „Próby bootstrapowe”. Testy permutacyjne są wykorzystywane do testo-
wania hipotez, które z założenia zawierają dwie lub więcej grup; zostaną one szerzej omówione
później w tym rozdziale.

Kluczowe pojęcia dotyczące testów randomizacyjnych


Test permutacyjny
Procedura łączenia dwóch (lub większej liczby) grup w jedną i losowego (lub zupełne) przy-
dzielania ich do prób w teście.

Test randomizacyjny
Losowanie dodatkowych prób (ang. resamples) z obserwowanego zestawu danych.

Ze zwracaniem lub bez zwracania


Założenie w próbkowaniu, czy dany element wraca do puli i może być wykorzystany w kolej-
nym wyborze elementów do testu, czy nie.

Test permutacyjny
Do permutacji wykorzystywane są dwie próby (lub większa ich liczba); zazwyczaj są to grupy testu
A/B lub innego testu hipotezy. Permutować znaczy zmieniać kolejność elementów w zbiorze da-
nych. Pierwszym krokiem w permutacyjnym teście hipotezy jest połączenie wyników uzyskanych
w grupach A i B (oraz, jeśli istnieją, C, D itd.). Ta część stanowi logiczne uosobienie hipotezy zerowej,
że procedury, które są poddawane testowi, nie są możliwe do rozróżnienia. Następnie testujemy
hipotezę zerową na losowo utworzonych grupach z połączonego zbioru i sprawdzamy, jak bardzo
nowe grupy różnią się od siebie. W przypadku permutacji powinieneś postępować następująco:
1. Połącz wyniki uzyskane dla różnych grup w jeden zestaw.
2. Przemieszaj powstały zbiór danych, a następnie losowo określ (bez zwracania) nową grupę
o takim samym rozmiarze co pierwotna grupa A (jest jasne, że będzie zawierać niektóre dane
z pozostałych grup).
3. Z pozostałych danych losowo stwórz (bez zwracania) nową grupę o takim samym rozmiarze
co pierwotna grupa B.
4. Powtórz to samo dla grup C, D itd. Dysponujesz teraz jednym zestawem dodatkowych prób
odzwierciedlającym rozmiar pierwotnych prób.
5. Powtórz obliczenia, które wykonywałeś na danych oryginalnych (np. różnice w proporcjach po-
między grupami), dla nowo stworzonych grup i zapisz je; właśnie wykonałeś jedną iterację testu.
6. Powtórz poprzednie kroki N razy, by otrzymać rozkład permutacji dla statystyki testowej.

Testy randomizacyjne | 99

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Teraz wróć do obserwowanych różnic w grupach i porównaj je z różnicami uzyskanymi w teście per-
mutacji. Jeśli różnice w grupach oryginalnych nie różnią się od tych uzyskanych w teście, to niestety
nic nie udowodniliśmy — obserwowane różnice zakresów dla grup mogą być efektem przypadku.
Jednak jeśli obserwowane różnice znacząco odstają od rozkładu uzyskanego testem permutacji, to mo-
żemy stwierdzić, że nie jest to efekt przypadku. Technicznie rzecz ujmując, różnica jest istotna staty-
stycznie (patrz podrozdział „Istotność statystyczna i p-wartość” w dalszej części tego rozdziału).

Przykład: licznik odwiedzin strony


Przedsiębiorstwo sprzedające usługi o względnie wysokiej wartości chce przetestować, która z dwóch
wersji jego strony internetowej bardziej zachęci klientów do zakupów. Z powodu wysokich warto-
ści kontraktów zakupy te są nieregularne, a cykl sprzedaży usługi długi; zbyt wiele czasu zajęłoby
zgromadzenie odpowiedniej ilości danych potrzebnych do zweryfikowania, która strona sprawdza
się lepiej. Przedsiębiorstwo zdecydowało się na pomiary przy pomocy aproksymanty, wykorzystu-
jąc jedną z podstron szczegółowo opisującą oferowane usługi.

Aproksymanta (zmienna proxy) jest stosowana jako zamiennik dla faktycznej zmien-
nej, której pomiarem jesteśmy zainteresowani, ale której pomiar jest niemożliwy,
zbyt drogi lub zbyt czasochłonny. Przykładowo w badaniach klimatycznych pomiar
zawartości tlenu w rdzeniach lodowca pobranych ze starych warstw służy jako aprok-
symanta temperatury. Korzystnie jest mieć chociaż część danych zmiennej faktycznej,
tak by móc oszacować siłę jej powiązania z aproksymantą.

Jedną z potencjalnych aproksymant dla naszego przedsiębiorstwa może być liczba kliknięć w kon-
kretną stronę docelową. Lepszą aproksymantą jest jednak ilość czasu, jaki użytkownicy spędzają na
stronie. Uzasadnione jest stwierdzenie, że prezentacja usług (strona w internecie), która zatrzymuje
na dłużej, będzie skutkować większą sprzedażą. Dlatego naszą metryką będzie porównanie śred-
nich czasów trwania sesji na stronach A i B.
Ponieważ strona, dla której będziemy mierzyć częstość odwiedzin, jest wewnętrzną zakładką o spe-
cjalnym przeznaczeniu, liczba odwiedzających ją nie jest powalająca. Warto również zauważyć, że
Google Analytics, którego używamy do pomiarów czasu sesji, nie rejestruje czasu trwania ostatniej
sesji użytkownika. Zamiast usuwać te dane z danych, Google Analytics zapisuje je z czasem zero.
W związku z tym nasze dane wymagają dodatkowego przetworzenia — usunięcia sesji z zerowymi
czasami. Wynikiem naszego eksperymentu jest 36 sesji dla obu wersji strony, 21 sesji dla wersji A
i 15 dla B. Wykorzystując funkcję ggplot, możemy porównać wizualnie czasy trwania sesji poprzez
narysowanie odpowiednich boxplotów obok siebie.
ggplot(session_times, aes(x=Page, y=Time)) +
geom_boxplot()

Polecenie boxplot z modułu pandas wykorzystuje argument by do stworzenia wykresu:


ax = session_times.boxplot(by='Page', column='Time')
ax.set_xlabel('')
ax.set_ylabel('Czas (w sekundach)')
plt.suptitle('')

100 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Boxplot przedstawiony na rysunku 3.3 wskazuje na to, że strona B nie generuje dłuższych sesji niż
strona A. Średnie dla obu grup można policzyć w następujący sposób:
mean_a <- mean(session_times[session_times['Page'] == 'Page A', 'Time'])
mean_b <- mean(session_times[session_times['Page'] == 'Page B', 'Time'])
mean_b - mean_a
[1] 35.66667

Rysunek 3.3. Czasy sesji dla stron A i B

W Pythonie najpierw filtrujemy ramkę danych pandas pod względem stron, a następnie określamy
średnią kolumny Time:
mean_a = session_times[session_times.Page == 'Page A'].Time.mean()
mean_b = session_times[session_times.Page == 'Page B'].Time.mean()
mean_b - mean_a

Strona B ma czas trwania sesji dłuższy od czasu trwania sesji na stronie A średnio o 35,67 s. Pytanie
brzmi, czy różnica przedziałów wynika z losowości, czy faktycznie jest istotna statystycznie. Jed-
nym z możliwych sposobów weryfikacji tego jest obliczenie testu permutacji — połączenia wszyst-
kich czasów sesji razem, wymieszania i ponownego rozdzielenia na grupy zawierające, odpowied-
nio, 21 wyników (liczność nA = 21 dla strony A) i 15 wyników (liczność nB = 15 dla strony B).

Testy randomizacyjne | 101

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Do przeprowadzenia testu permutacji potrzebujemy funkcji, która losowo przypisze 36 czasów
trwania sesji do grup o licznościach, odpowiednio, 21 (strona A) i 15 (strona B). W R funkcja ta
wygląda następująco:
perm_fun <- function(x, nA, nB)
{
n <- nA + nB
idx_b <- sample(1:n, nB)
idx_a <- setdiff(1:n, idx_b)
mean_diff <- mean(x[idx_b]) - mean(x[idx_a])
return(mean_diff)
}

Test permutacyjny w wydaniu pythonowym prezentuje się następująco:


def perm_fun(x, nA, nB):
n = nA + nB
idx_B = set(random.sample(range(n), nB))
idx_A = set(range(n)) - idx_B
return x.loc[idx_B].mean() - x.loc[idx_A].mean()

Przedstawiona funkcja losuje (bez zwracania) nB odczytów i przypisuje je do grupy B, pozostałe nA


odczytów jest przypisywane do grupy A. Funkcja zwraca różnicę pomiędzy średnimi w grupach.
Wywołując funkcję N=1000 razy i określając nA = 21 i nB = 15, otrzymujemy rozkład różnic w czasach
trwania sesji; różnice te mogą być przedstawione w postaci histogramu. W R dokonujemy tego za
pomocą funkcji hist:
perm_diffs <- rep(0, 1000)
for (i in 1:1000) {
perm_diffs[i] = perm_fun(session_times[, 'Time'], 21, 15)
}
hist(perm_diffs, xlab='Różnice w czasach trwania sesji (w sekundach)')
abline(v=mean_b - mean_a)

W Pythonie możemy stworzyć podobny wykres za pomocą pakietu matplotlib:


perm_diffs = [perm_fun(session_times.Time, nA, nB) for _ in range(1000)]

fig, ax = plt.subplots(figsize=(5, 5))


ax.hist(perm_diffs, bins=11, rwidth=0.9)
ax.axvline(x = mean_b - mean_a, color='black', lw=2)
ax.text(50, 190, 'Zaobserwowana\nróżnica', bbox={'facecolor':'white'})
ax.set_xlabel('Różnice w czasach trwania sesji (w sekundach)')
ax.set_ylabel('Częstość')

Histogram przestawiony na rysunku 3.4 pokazuje, że średnie różnice w losowych permutacjach


przekraczają w wielu przypadkach obserwowaną różnicę w czasach trwania sesji (pionowa linia).
Dla naszych wyników dzieje się to w 12,6% przypadków:
mean(perm_diffs > (mean_b - mean_a))
---
0.126

W symulacji są wykorzystywane liczby losowe, dlatego wynik ten będzie za każdym razem nieco
inny. Na przykład w Pythonie otrzymujemy wynik 12,1%:
np.mean(perm_diffs > mean_b - mean_a)
---
0.121

102 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 3.4. Częstość rozkładu dla różnic w czasach trwania sesji na stronach A i B; linia pionowa ukazuje
zaobserwowaną różnicę

To sugeruje, że obserwowana różnica w czasach trwania sesji pomiędzy stronami A i B mieści się
w przedziale zmienności losowej, czyli nie jest istotna statystycznie.

Zupełny test permutacyjny i bootstrap


Poza przedstawioną metodą losowego mieszania wyników, zwanego losowym testem permutacyjnym
lub testem randomizacyjnym, można stosować również dwa inne warianty testu permutacyjnego:
• zupełny test permutacyjny,
• bootstrap.
Zupełny test permutacyjny, w przeciwieństwie do zwykłego losowego mieszania i dzielenia danych,
wykorzystuje wszystkie możliwości podziału danych. Metoda ta jest praktyczna jedynie dla nie-
wielkich zbiorów danych. Duża liczba powtórzeń mieszania powoduje, że losowy test permuta-
cyjny daje wyniki porównywalne do wyników testu zupełnego. Zupełny test permutacyjny można
nazwać dokładnym, a to dzięki gwarancji, że model zerowy nie będzie testował na wyższym pozio-
mie istotności niż poziom alfa testu (patrz podrozdział „Istotność statystyczna i p-wartość” w dalszej
części tego rozdziału).

Testy randomizacyjne | 103

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W metodzie boostrapu punkty 2. i 3. losowego testu permutacyjnego są zastępowane przez loso-
wanie ze zwracaniem. W ten sposób metoda podziału symuluje nie tylko losowe przypisywanie
elementów do konkretnej procedury, ale również losowe wybieranie obiektów z populacji. Obie
metody są spotykane w statystyce, a różnice między nimi są zawiłe i nie mają znaczenia w praktyce
data science.

Test permutacyjny: podstawa w data science


Testy permutacyjne są użytecznymi, heurystycznymi metodami badania roli losowego zróżnico-
wania. Są stosunkowo łatwe w implementacji i interpretacji oraz stanowią wygodną alternatywę
dla formalizmu i „fałszywego determinizmu” klasycznej statystyki, opartej na wyrażeniach mate-
matycznych, w której dokładność „rozwiązań” dostarczanych przez wzory może sugerować nieu-
zasadnioną pewność wyniku.
Jedną z zalet testów randomizacyjnych, której nie posiada podejście oparte na wzorach, jest uni-
wersalność. Dane mogą być binarne lub numeryczne. Rozmiar prób może być ten sam lub różny.
Założenia dotyczące danych pochodzących z rozkładu normalnego nie są konieczne.

Główne zasady
• W testach permutacyjnych grupy są łączone w jedną i mieszane.

• Wymieszane wartości są dzielone na nowe grupy, a następnie obliczane są statystyki.

• Powyższy proces jest powtarzany, a wyniki są zapisywane.

• Porównanie wartości statystyk dla obserwowanych wyników z wynikami dla nowo stwo-
rzonych grup pozwolą Ci ocenić, czy obserwowana różnica pomiędzy grupami jest efek-
tem losowości.

Dla pogłębienia wiedzy


• Czytając Randomization Tests, 4th ed. Eugene’a Edgingtona i Patricka Ongheny (Chapman &
Hall/CRC Press, 2007), uważaj, by nie wpaść zbyt głęboko w pułapkę zawiłości nieloso-
wych prób.
• Sięgnij też po Introductory Statistics and Analytics: A Resampling Perspective Petera Bruce’a
(Wiley, 2014).

Istotność statystyczna i p-wartość


Istotność statystyczna jest miarą, przy pomocy której statystycy sprawdzają, czy eksperyment (albo
nawet badania istniejących danych) dostarcza wyników bardziej nietypowych, niż wynikałoby to
z przypadku. Jeśli wyniki wykraczają poza zróżnicowanie losowe, możemy powiedzieć, że są istotne
statystycznie.

104 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące istotności statystycznej i p-wartości
p-wartość
Jeśli weźmiemy pod uwagę model wyrażający hipotezę zerową, p-wartość to prawdopodobień-
stwo uzyskania wartości tak niezwykłej lub skrajnej jak obserwowany wynik.

Alfa
Próg prawdopodobieństwa dla „niezwykłości”, który musi przewyższać wynik, żeby był
uznany za istotny statystycznie.

Błąd pierwszego rodzaju


Błędne wnioskowanie, że efekt jest rzeczywisty (podczas gdy tak naprawdę jest dziełem przy-
padku).

Błąd drugiego rodzaju


Błędne wnioskowanie, że efekt jest dziełem przypadku (podczas gdy jest rzeczywisty).

Przeanalizujmy zamieszczone w tabeli 3.2 wyniki przedstawionego wcześniej testu stron interne-
towych.

Tabela 3.2. Tabela 2×2 zawierająca wyniki testu e-commerce

Wynik Cena A Cena B


Sprzedaż 200 182
Bez sprzedaży 23 539 22 406

Zwrot z ceny A o niemal 5% lepszy od zwrotu z ceny B (0,8425% = 200/(23539+200)∙100 w porów-


naniu z 0.8057% = 182/(22406+182)∙100 — różnica to 0,0368 punktu procentowego) jest wystar-
czająco duży, by mieć znaczenie w sprzedaży hurtowej. Mamy tu ponad 45 tysięcy punktów po-
miarowych i kuszące jest rozważenie tego problemu jako big data, które nie wymagają testów
istotności statystycznej (potrzebnych w małych próbkach do określenia różnorodności w próbie).
Jednakże poziomy zwrotu są na tyle niskie (mniej niż 1%), że faktycznie znaczące wartości — zwrot
— są liczone w setkach, w związku z czym rozmiary prób są determinowane przez ten zwrot.
Wykorzystując testy randomizacyjne, możemy sprawdzić, czy różnica w zwrocie pomiędzy cenami
A i B mieści się w przedziale zmienności losowej. Przez zmienność losową rozumiemy przypad-
kową zmienność będącą efektem modelu prawdopodobieństwa określającego hipotezę zerową jako
brak różnic w poziomach (patrz punkt „Hipoteza zerowa” we wcześniejszej części tego rozdziału).
Zamieszczona poniżej metoda permutacji sprawdza, czy jeśli dwie ceny mają taki sam poziom
zwrotu, to zmienność losowa może spowodować różnicę na poziomie 5%.
1. Umieść w pudełku karty oznaczone jedynkami i zerami — w ten sposób będziemy reprezentować
przypuszczalny zaobserwowany poziom zwrotu: 382 jedynki i 45 945 zer = 0,008246 = 0,8246%.
2. Wymieszaj wartości, stwórz nową grupę o rozmiarze 23 739 (n równe ilości dla ceny A)
i sprawdź, jak dużo jest jedynek.
3. Sprawdź liczbę jedynek w pozostałych 22 588 wynikach (n równe ilości dla ceny B).

Istotność statystyczna i p-wartość | 105

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


4. Oblicz różnicę w proporcjach jedynek.
5. Powtórz kroki 2. – 4.
6. Jak często różnica była >= 0,0368?
Wykorzystując ponownie funkcję perm_fun, zdefiniowaną w punkcie „Przykład: licznik odwiedzin
strony”, zamieszczonym wcześniej w tym rozdziale, możemy stworzyć w R histogram różnic
w poziomie zwrotu dla losowych permutacji:
obs_pct_diff <- 100 * (200 / 23739 - 182 / 22588)
conversion <- c(rep(0, 45945), rep(1, 382))
perm_diffs <- rep(0, 1000)
for (i in 1:1000) {
perm_diffs[i] = 100 * perm_fun(conversion, 23739, 22588)
}
hist(perm_diffs, xlab='Poziom zwrotu (w procentach)', main='')
abline(v=obs_pct_diff)

Odpowiednik w Pythonie wygląda następująco:


obs_pct_diff = 100 * (200 / 23739 - 182 / 22588)
print(f'Zaobserwowana różnica: {obs_pct_diff:.4f}%')
conversion = [0] * 45945
conversion.extend([1] * 382)
conversion = pd.Series(conversion)

perm_diffs = [100 * perm_fun(conversion, 23739, 22588)


for _ in range(1000)]

fig, ax = plt.subplots(figsize=(5, 5))


ax.hist(perm_diffs, bins=11, rwidth=0.9)
ax.axvline(x=obs_pct_diff, color='black', lw=2)
ax.text(0.06, 200, 'Zaobserwowana\nróżnica ', bbox={'facecolor':'white'})
ax.set_xlabel('Poziom zwrotu (w procentach)')
ax.set_ylabel('Częstość')

Rysunek 3.5 przedstawia histogram 1000 powtórzeń dla testu permutacyjnego: tak się składa, że
w tym przypadku obserwowana różnica 0,0368% mieści się w zakresie zmienności losowej.

p-wartość
Zazwyczaj patrzenie na wykres nie jest zbyt precyzyjną metodą pomiaru istotności statystycznej;
zdecydowanie lepszą jest obliczenie p-wartości. Mówi ona o częstości, z jaką wynik modelu ma
szansę dać wyniki bardziej ekstremalne niż obserwowane. Możemy oszacować p-wartość na pod-
stawie testu permutacyjnego, uwzględniając to, kiedy wynik testu był równy obserwowanemu lub
od niego większy.
mean(perm_diffs > obs_pct_diff)
[1] 0.308
np.mean([diff > obs_pct_diff for diff in perm_diffs])

Zarówno R, jak i Python korzystają z faktu, że prawda jest interpretowana jako 1, a fałsz jako 0.
p-wartość wynosi 0,308, co oznacza, że możemy się spodziewać losowych wyników na tym samym
poziomie co wyniki otrzymane w 30% przypadków lub bardziej skrajnych od nich.

106 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 3.5. Częstość rozkładu dla różnic w poziomach zwrotu dla cen A i B

W przedstawionym przykładzie nie trzeba używać testu permutacyjnego do obliczania p-wartości.


Nasz przykład pochodzi z rozkładu dwumianowego, w związku z czym możemy oszacować p-war-
tość na podstawie rozkładu normalnego. W języku R możemy użyć do tego funkcji prop.test:
> prop.test(x=c(200, 182), n=c(23739, 22588), alternative='greater')

2-sample test for equality of proportions with continuity correction

data: c(200, 182) out of c(23739, 22588)


X-squared = 0.14893, df = 1, p-value = 0.3498
alternative hypothesis: greater
95 percent confidence interval:
-0.001057439 1.000000000
sample estimates:
prop 1 prop 2
0.008424955 0.008057376

Argument x jest liczbą sukcesów w każdej z grup, a argument n jest liczbą prób w obu grupach.
Metoda scipy.stats.chi2_contingency przyjmuje wartości widoczne w tabeli 3.2:
survivors = np.array([[200, 23739 - 200], [182, 22588 - 182]])
chi2, p_value, df, _ = stats.chi2_contingency(survivors)

print(f'p-wartość testu jednostronnego: {p_value / 2:.4f}')

Przybliżenie normalne dostarcza p-wartości na poziomie 0,3498, co jest wartością zbliżoną do tej
otrzymanej za pomocą testu permutacji.

Istotność statystyczna i p-wartość | 107

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Alfa
Statystycy niechętnie pozostawiają badaczom możliwość podjęcia decyzji, czy wynik jest zbyt „nie-
prawdopodobny”, by był przypadkowy. Zazwyczaj na początku określa się próg: „bardziej skrajny
niż 5% wyników losowych (hipoteza zerowa)”; ten próg jest znany jako alfa. Typowy poziom alfa
to 5% lub 1%. Dowolny poziom jest zakładany arbitralnie — nie ma metody, która będzie gwaran-
towała, że założony próg na poziomie x% jest prawidłowy, a to dlatego, że zadane pytanie nie brzmi:
„Jakie jest prawdopodobieństwo, że coś dzieje się przez przypadek?”, ale raczej: „Biorąc pod uwagę
model losowy, jakie jest prawdopodobieństwo otrzymania tak skrajnego wyniku?”. Wnioskujemy
wstecz o poprawności modelu losowego, ale ocena nie pociąga za sobą prawdopodobieństwa. Ten
temat jest przedmiotem wielu sporów.

Kontrowersje związane z p-wartością


Duże kontrowersje budzi w ostatnich latach użycie p-wartości. Jedno z czasopism psychologicz-
nych nie przyjmuje artykułów, w których użyto p-wartości do podejmowania decyzji, uzasadnia-
jąc to tym, że badania oparte na p-wartości są kiepskiej jakości. Zbyt wielu badaczy ma jedynie
mgliste pojęcie o tym, czym tak naprawdę jest p-wartość. Nie poświęcając danym i różnym moż-
liwościom testowania hipotezy wystarczająco dużej ilości czasu, trudno jest znaleźć odpowiednią
kombinację, która pozwoli na uzyskanie istotnej p-wartości, a co za tym idzie, wyników nadają-
cych się do opublikowania.
Prawdziwy problem polega na tym, że ludzie oczekują od p-wartości więcej, niż jest ona w stanie
zaoferować. Oto co chcielibyśmy, żeby p-wartość wyrażała:
Prawdopodobieństwo, że wynik, który uzyskaliśmy, jest dziełem przypadku.
Mamy nadzieję na niską wartość, dzięki czemu będziemy mogli wysnuć wnioski, że udało się coś
udowodnić. To przykład tego, w jaki sposób wielu redaktorów w czasopismach interpretuje p-war-
tość. A ona tak naprawdę znaczy:
Istnieje niezerowe prawdopodobieństwo, że badany model losowy da wyniki tak skrajne jak
wyniki obserwowane.
Różnica jest subtelna, ale jest. Znacząca p-wartość nie będzie prowadzić do „udowodnienia” cze-
goś, mimo że może się tak wydawać na pierwszy rzut oka. Podstawy logiczne wniosku „istotny
statystycznie” stają się w pewien sposób słabsze, kiedy zrozumie się faktyczne znaczenie pojęcia
p-wartość.
W marcu 2016 r. Amerykańskie Towarzystwo Statystyczne (ang. ASA od American Statistical
Association) po wielu naradach wydało oświadczenie pokazujące, jak duże jest niezrozumienie
istoty p-wartości. Stanowisko ASA dotyczyło sześciu podstawowych zasad dla badaczy i redakto-
rów czasopism (https://amstat.tandfonline.com/doi/full/10.1080/00031305.2016.1154108):
1. p-wartość może wskazywać na to, jak niekompatybilne są dane w tworzonym modelu.
2. p-wartość nie mierzy prawdopodobieństwa, że badana hipoteza jest prawdziwa, albo prawdo-
podobieństwa, że dane zostały wytworzone przez przypadek.

108 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


3. Naukowe konkluzje oraz biznesowe i polityczne decyzje nie powinny bazować tylko na tym,
czy p-wartość jest powyżej określonego progu.
4. Właściwe wnioskowanie wymaga pełnego raportowania i przejrzystości.
5. p-wartość lub istotność statystyczna nie mierzy siły efektu ani istotności wyniku.
6. p-wartość sama w sobie nie stanowi wymiernego potwierdzenia w odniesieniu do modelu lub
hipotezy.

Istotność praktyczna
Nawet jeżeli wynik jest istotny statystycznie, nie musi to wcale oznaczać, że ma istotność prak-
tyczną. Mała różnica pozbawiona znaczenia praktycznego może być istotna statystycznie, jeżeli
została uzyskana z wystarczająco dużej próby. Duże próby sprawiają, że małe, niezbyt znaczące
zjawiska mogą okazać się na tyle duże, żeby wyeliminować przypadek jako ich wyjaśnienie.
Wykluczenie przypadku nie sprawi automatycznie, że nabierze o wiele większej wagi wynik,
który w istocie jest niezbyt ważny.

Błędy pierwszego i drugiego rodzaju


W szacowaniu istotności statystycznej możliwe są dwa typy błędów:
• Błąd pierwszego rodzaju — błędnie określasz efekt jako rzeczywisty, a tak naprawdę jest on
dziełem przypadku.
• Błąd drugiego rodzaju — błędnie oceniasz efekt jako przypadkowy, kiedy tak naprawdę jest on
rzeczywisty.
Tak naprawdę błąd drugiego rodzaju nie jest aż tak dużym błędem jak stwierdzenie, że rozmiar
próby jest zbyt mały, by wykryć efekt. W przypadku gdy p-wartość jest niewiele większa od istot-
ności statystycznej (np. przekracza 5%), powiemy, że efekt nie jest potwierdzony. W rzeczywistości
może się zdarzyć tak, że większy rozmiar próby spowoduje zmniejszenie p-wartości.
Podstawową funkcją testu istotności (nazywanego również testem hipotezy) jest ochrona przed
znajdowaniem efektów tam, gdzie jest tylko losowość. Innymi słowy, tego typu testy są typowo
zaprojektowane po to, by minimalizować błąd pierwszego rodzaju.

Data science i p-wartość


Prace wykonywane na podstawie data science zazwyczaj nie są przeznaczone do publikacji w cza-
sopismach naukowych, dlatego dyskusja dotycząca p-wartości jest, poniekąd, czysto akademicka.
Dla specjalisty data science p-wartość jest użyteczną metryką w sytuacji, gdy chce on wiedzieć, czy
otrzymane interesujące wyniki modelu są zawarte w przedziale typowej zmienności losowej. Jako
narzędzie p-wartość nie powinna być kontrolą, a jedynie kolejną informacją ułatwiającą podjęcie
decyzji podczas eksperymentu. p-wartości stanowią czasem pośrednie wejścia w modelach staty-
stycznych lub uczenia maszynowego — cecha jest włączana bądź wyłączana z modelu na podstawie
jej p-wartości.

Istotność statystyczna i p-wartość | 109

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Główne zasady
• Testy istotności są wykorzystywane do określenia, czy obserwowany efekt mieści się w grani-
cach zmienności statystycznej dla hipotezy zerowej modelu.
• p-wartość jest prawdopodobieństwem, że wynik tak skrajny jak obserwowany może wystą-
pić, biorąc pod uwagę hipotezę zerową modelu.
• Wartość alfa jest poziomem „niezwykłości” dla hipotezy zerowej w modelu losowym.

• Testowanie istotności jest znacznie ważniejsze w formalnym raportowaniu badań niż w data
science (chociaż zanika także w formalnych badaniach).

Dla pogłębienia wiedzy


• Publikacja Stephena Stiglera Fisher and the 5% Level („Chance” 2008, 21, nr 4, s. 12) jest krót-
kim komentarzem do książki Ronalda Fishera Statistical Methods for Research Workers (Oliver
& Boyd) i zauważonego przez Fishera znaczenia poziomu istotności na poziomie 5%.
• Przejrzyj również wcześniejszy podrozdział, „Testowanie hipotezy”, oraz dalsze części tego
rozdziału.

Test t
Istnieje wiele typów testów istotności, w zależności od tego, czy dane składają się z danych zliczanych,
czy mierzonych, od tego, ile mamy prób i co było mierzone. Bardzo popularny jest test t, którego
nazwa pochodzi od rozkładu t-Studenta, opisany przez W.S. Gosseta jako narzędzie do szacowania
rozkładu średniej dla pojedynczej próby (patrz podrozdział „Rozkład t-Studenta” w rozdziale 2.).

Kluczowe pojęcia dotyczące testu t


Statystyka testowa
Miara dla obserwowanej różnicy lub obserwowanego efektu.

Statystyka t
Standaryzowana wersja powszechnych statystyk testowych, takich jak średnie.

Rozkład t
Rozkład referencyjny (w tym przypadku pochodzący od hipotezy zerowej), do którego obser-
wowana statystyka t może być porównana.

By można było zmierzyć interesujący Cię efekt, wszystkie testy istotności muszą mieć określoną
statystykę testową, która pomoże w stwierdzeniu, czy obserwowany efekt leży wewnątrz prze-
działu normalnego rozkładu losowego. W teście randomizacyjnym (patrz dyskusja o permutacji
w punkcie „Test permutacyjny” we wcześniejszej części tego rozdziału) skala danych nie ma zna-
czenia. Tworzysz rozkład odniesienia (hipoteza zerowa) bezpośrednio z danych i wykorzystujesz
statystykę testową w tej postaci.

110 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W latach 20. i 30. ubiegłego wieku, kiedy testy hipotez statystycznych były rozwijane, nierealne
było mieszanie danych tysiące razy w testach randomizacyjnych. Statystycy odkryli, że dobrym
przybliżeniem rozkładu permutacji (mieszania) jest test t, bazujący na rozkładzie t opisanym przez
Gosseta. Jest on wykorzystywany do popularnego porównania dwóch prób — w teście A/B — dla
danych numerycznych. Żeby rozkład mógł być użyty, bez względu na skalę, musi być zastosowana
standaryzowana forma statystyki testowej.
W klasycznym podręczniku do statystyki zamieszczono by w tym miejscu mnóstwo równań doty-
czących rozkładu Gosseta i pokazano by, w jaki sposób znormalizować dane, aby móc porównać je
ze standardowym rozkładem t. Te równania nie są tu przedstawione, ponieważ każde oprogra-
mowanie do statystyki, w tym również R i Python, ma gotowe biblioteki zawierające te funkcje.
W języku R jest to funkcja t.test:
> t.test(Time ~ Page, data=session_times, alternative='less')

Welch Two Sample t-test

data: Time by Page


t = -1.0983, df = 27.693, p-value = 0.1408
alternative hypothesis: true difference in means is less than 0
95 percent confidence interval:
-Inf 19.59674
sample estimates:
mean in group Page A mean in group Page B
126.3333 162.0000

W Pythonie użyjemy funkcji scipy.stats.ttest_ind:


res = stats.ttest_ind(session_times[session_times.Page == 'Page A'].Time,
session_times[session_times.Page == 'Page B'].Time,
equal_var=False)
print(f'p-wartość testu jednostronnego: {res.pvalue / 2:.4f}')

Hipoteza alternatywna stwierdza, że średni czas trwania sesji dla strony A jest mniejszy od czasu
trwania sesji na stronie B. p-wartość rzędu 0,1408 jest zbliżona do otrzymanych w teście permuta-
cyjnym p-wartości 0,121 i 0,126 (patrz punkt „Przykład: licznik odwiedzin strony” we wcześniejszej
części tego rozdziału).
W systemie testów randomizacyjnych konstruujemy rozwiązanie w taki sposób, by odzwierciedlało
zebrane dane i umożliwiało przetestowanie hipotezy. Nie trzeba przejmować się tym, czy dane są
liczbowe, czy binarne, czy rozmiary prób są zbalansowane, jakie są wariancje prób i jakie jest zróż-
nicowanie innych czynników. W świecie równań pojawia się wiele kombinacji i mogą być one przy-
tłaczające. Statystycy muszą się nauczyć poruszać w tym świecie, analitycy już niekoniecznie. Spe-
cjaliści data science nie muszą się zajmować żmudnym testowaniem hipotez i przedziałami ufności
w taki sposób, w jaki jest to konieczne w przypadku przedstawiania badań naukowych.

Główne zasady
• Przed rozpowszechnieniem się komputerów testy randomizacyjne były niepraktyczne i staty-
stycy używali standaryzowanych rozkładów referencyjnych.
• Statystyka testowa może być standaryzowana i porównywana do rozkładu referencyjnego.
• Szeroko rozpowszechnioną statystyką testową jest statystyka t.

Test t | 111

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Dla pogłębienia wiedzy
• Dowolny wstęp do podręcznika do statystyki dobrze zilustruje statystykę t i sposoby jej uży-
cia; dwa wstępy godne polecenia znajdują się w podręcznikach: Statistics, 4th ed. Davida
Freedmana, Roberta Pisaniego i Rogera Purvesa (W.W. Norton, 2007) oraz The Basic Prac-
tice of Statistics, 8th ed.,Davida S. Moore’a, Williama I. Notza i Michaela A. Flignera (W.H.
Freeman, 2017).
• Opis wykorzystania jednocześnie testu t i testów randomizacyjnych zawarto w publikacjach
Introductory Statistics and Analytics: A Resampling Perspective Petera Bruce’a (Wiley, 2014)
i Statistics: Unlocking the Power of Data, 2nd ed., Robina Locka (Wiley, 2016).

Testowanie wielokrotne
Jak już wcześniej wspomniano, w statystyce jest takie angielskie powiedzenie: torture the data long
enough, and it will confess2. Oznacza to, że jeśli będziesz przyglądał się danym odpowiednio długo
i z odpowiednio wielu perspektyw oraz zadasz wystarczająco dużo pytań, niemal na pewno znaj-
dziesz istotny statystycznie efekt.
Rozważmy przykład, w którym generujemy 20 zmiennych predykcyjnych i jedną zmienną wyni-
kową. Jeśli przeprowadzisz serię 20 testów z alfa = 0,05, istnieją całkiem spore szanse, że co najmniej
jedna ze zmiennych predykcyjnych okaże się (fałszywie) istotna statystycznie. Jak już wcześniej
wspomniano, jest to przykład błędu pierwszego rodzaju. Możesz obliczyć to prawdopodobień-
stwo, znajdując na początek prawdopodobieństwo, że wszystkie testy prawidłowo wykażą brak
istotności statystycznej na poziomie 0,05. Prawdopodobieństwo, że wynik jednego testu będzie nie-
istotny statystycznie, wynosi 0,95, dlatego prawdopodobieństwo, że wyniki wszystkich 20 testów
będą, zgodnie z prawdą, nieistotne statystycznie, wynosi 0,95∙0,95∙0,95 … lub 0,9520 = 0,36.3 Praw-
dopodobieństwo, że co najmniej jedna ze zmiennych predykcyjnych będzie (fałszywie) istotna sta-
tystycznie, jest prawdopodobieństwem odwrotnym lub 1 – (prawdopodobieństwo, że wszystkie
będą nieistotne statystycznie) = 0,64. Jest to tak zwana inflacja wyników fałszywie znaczących
(ang. alpha inflation).
Kwestia istotności statystycznej jest związana z problemem nadmiernego dopasowania znanego
z pozyskiwania danych (ang. data mining) lub „dopasowywania modelu do szumu”. Im więcej
danych dodasz i im więcej modeli przetestujesz, tym większa szansa na to, że pojawi się coś „istot-
nego” z przypadku.

2
Jeśli będziesz torturować dane wystarczająco długo, prędzej czy później zaczną zeznawać — przyp. tłum.
3
Zgodnie z zasadą mnożenia prawdopodobieństw zdarzeń niezależnych prawdopodobieństwo n niezależnych wy-
darzeń jest iloczynem poszczególnych prawdopodobieństw. Jeśli Ty i ja rzucimy monetą, to prawdopodobieństwo,
że oboje dostaniemy orła, wynosi 0,5∙0,5 = 0,25. (A właściwie dlaczego nie 1/3, skoro są trzy wyniki: OO, RR i OR?
— przyp. tłum).

112 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące testowania wielokrotnego
Błąd pierwszego rodzaju
Błędne wnioskowanie, że efekt jest istotny statystycznie.

Odsetek fałszywie dodatni


W testowaniu wielokrotnym wskaźnik prawdopodobieństwa popełnienia błędu pierwszego
rodzaju.

Inflacja alfa
Zjawisko występujące w testowaniu wielokrotnym, zgodnie z którym współczynnik alfa, czyli
prawdopodobieństwo popełnienia błędu pierwszego rodzaju, wzrasta w miarę przeprowadza-
nia kolejnych testów.

Korekta na p-wartość
Uwzględnienie wielokrotnego testowania tych samych danych.

Nadmierne dopasowanie/przetrenowanie (ang. overfitting)


Dopasowanie nie tylko danych, ale też szumu pomiarowego.

W zadaniach z dziedziny uczenia nadzorowanego testowanie modelu na danych, których nie uży-
wano w fazie uczenia, zmniejsza ryzyko nadmiernego dopasowania. W statystyce i uczeniu maszy-
nowym brak zbioru testowego, co do którego znane są wyniki testów, powoduje ryzyko wyciągania
wniosków na podstawie szumu statystycznego.
W statystyce istnieją pewne procedury, które w bardzo szczególnych przypadkach rozwiązują
wspomniany problem. Przykładowo jeśli porównujesz wyniki wielu grup, może się pojawić wiele
pytań; dla trzech grup: A, B, C, możesz zadać pytania:
• Czy A jest inne od B?
• Czy B jest inne od C?
• Czy A jest inne od C?
W badaniach klinicznych możesz w ten sposób popatrzeć na wyniki terapii w różnych stadiach.
W każdym przypadku zadajesz wiele pytań i z każdym kolejnym pytaniem zwiększasz swoją szansę
na bycie oszukanym przez losowość. Korekty w statystyce mogą kompensować takie przypadki po-
przez bardziej rygorystyczne blokowanie istotności statystycznej niż w przypadku testu z pojedyn-
czą hipotezą. Zazwyczaj korekty obejmują „dzielenie alfy” w zależności od liczby testów. Skutkuje
to mniejszą alfą (tzn. większymi ograniczeniami dla istotności statystycznej) dla każdego testu.
Jedną z takich procedur jest korekta Bonferroniego, która po prostu każe dzielić alfę przez liczbę
porównań. Inną metodą wykorzystywaną do porównywania średnich wielu grup jest test HSD Tukeya
(ang. honest significant difference — w wolnym tłumaczeniu „uczciwej istotnej różnicy”). Test ten
dotyczy maksymalnej różnicy pomiędzy średnimi grup, które porównywane są z punktem odnie-
sienia bazującym na rozkładzie t (w przybliżeniu odpowiada to przetasowaniu wszystkich możli-
wych wartości, uzyskaniu nowych grup o takich samych rozmiarach jak grupy pierwotne i znale-
zieniu maksymalnej różnicy pomiędzy średnimi tych nowych grup).

Testowanie wielokrotne | 113

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Jednakże problem wielokrotnego porównywania wykracza daleko poza takie dobrze określone przy-
padki i jest powiązany ze zjawiskiem „uporczywego drążenia” danych, co daje podstawę do sfor-
mułowań o torturowaniu danych. Innymi słowy, jeśli przy wystarczająco złożonych danych nie zna-
lazłeś niczego interesującego, to znaczy, że nie patrzyłeś dostatecznie długo i intensywnie. Obecnie
mamy dostęp do tak dużej ilości danych jak nigdy przedtem, a liczba artykułów w czasopismach
naukowych w latach 2002 – 2010 niemalże się podwoiła. Otwiera to nowe możliwości związane ze
znalezieniem czegoś interesującego w danych; pojawia się przy tym wiele kwestii do rozstrzygnię-
cia, takich jak:
• Sprawdzanie wielu różnic typu „każdy z każdym” pomiędzy grupami.
• Przeglądanie wielu wyników w podgrupach („Nie znaleźliśmy istotnego efektu w populacji, ale
znaleźliśmy go wśród niezamężnych kobiet poniżej 30. roku życia”).
• Sprawdzanie wielu modeli statystycznych.
• Wykorzystywanie wielu zmiennych w modelach.
• Zadawanie wielu różnych pytań (np. gdy oczekujemy różnych możliwych wyników).

Odsetek fałszywie dodatni


Pojęcie odsetka fałszywie dodatniego było oryginalnie użyte do opisania poziomu,
na którym zestaw testów hipotezy mógłby zidentyfikować fałszywy, statystycznie
istotny efekt. Pojęcie to okazało się niezwykle przydatne w momencie pojawienia się
badań genetycznych, w przypadku których ogromna liczba testów statystycznych
może kierować poszczególnymi projektami sekwencjonowania genów. W takich sy-
tuacjach omawiane pojęcie stosuje się do protokołu testowego, a pojedynczy „przy-
padek” fałszywie dodatni odnosi się do wyników testu hipotezy (np. pomiędzy dwoma
próbkami). Badacze roztrząsają problem ustawienia parametrów procesu testowa-
nia, żeby móc kontrolować odsetek fałszywie dodatni na odpowiednim poziomie.
Opisywane pojęcie jest również używane w zadaniach klasyfikacji w kontekście po-
zyskiwania danych; definiujemy je jako współczynnik nieprawidłowych klasyfikacji
w ramach przewidywań klasy 1. Innymi słowy, jest prawdopodobieństwo, zgodnie
z którym „odkrycie” (oznaczenie rekordu etykietą 1) jest fałszywe. W takich sytua-
cjach najczęściej występuje wiele zer, a jedynki są rzadkie i interesujące (patrz punkt
„Problem mało licznych klas” w rozdziale 5.).

Z wielu powodów, w tym z powodu występowania ogólnego problemu „różnorodności”, większa


liczba badań nie oznacza koniecznie lepszych badań. Dobrym przykładem jest przypadek firmy
Bayer, która w 2011 r. odkryła, że jest w stanie powtórzyć wyniki uzyskane jedynie w 14 z 67 pro-
jektów naukowych. Prawie 2/3 wyników były niemożliwe do odtworzenia.
W każdym przypadku korekta dla ściśle zdefiniowanych i usystematyzowanych danych staty-
stycznych jest narzędziem zbyt specyficznym i sztywnym dla generalnych zastosowań data science.
Kluczowe kwestie w tym przypadku są następujące:
• W modelowaniu predykcyjnym ryzyko otrzymania iluzorycznego modelu, którego oczywista
skuteczność jest głównie zasługą przypadku, można niwelować sprawdzenie krzyżowe (patrz
punkt „Kroswalidacja” w rozdziale 4.), wykorzystując zbiory testowe.

114 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


• W przypadku procedur, dla których niedostępne są dane testowe z etykietami, musisz polegać na:
• świadomości, że im bardziej kwestionujesz dane i manipulujesz nimi, tym większą rolę
może odgrywać losowość;
• testach randomizacyjnych i heurystycznych symulacjach, które mogą stanowić punkt od-
niesienia dla danych losowych jako kontrast dla danych obserwowanych.

Główne zasady
• Zróżnicowanie w badaniach i pozyskiwaniu danych (wielokrotne porównywanie, wiele zmien-
nych, wiele modeli itp.) zwiększa ryzyko wnioskowania o istotności zjawisk przypadkowych.
• Podczas wykorzystywania wielokrotnych porównań statystycznych (takich jak wielokrotny
test istotności) można zastosować korekty statystyczne.
• W trakcie pozyskiwania danych używamy prób testowych zawierających dane wraz z etykie-
tami, co pomaga uniknąć błędów.

Dla pogłębienia wiedzy


• Krótki opis jednej z korekt (testu Dunnetta) na wielokrotne porównywanie znajdziesz w pu-
blikacji Davida Lane’a zamieszczonej na stronie: http://davidmlane.com/hyperstat/ B112114.html.
• Nieco dłuższy tekst o korekcie Bonferroniego, autorstwa Megan Goldman, znajdziesz pod ad-
resem: http://www.stat.berkeley.edu/~mgoldman/Section0402.pdf.
• Dokładniejsze omówienie zagadnienia elastycznych procedur statystycznych korekty p-warto-
ści znajdziesz w książce Petera Westfalla i Stanleya Younga Resampling-Based Multiple Testing
(Wiley, 1993).
• Omówienie podziału danych i wykorzystania prób testowych w modelowaniu predykcyjnym
zawarte jest w rozdziale 2. publikacji Data Mining for Business Analytics, której autorami
są Galit Shmueli, Peter Bruce, Nitin Patel, Peter Gedeck, Inbal Yahaw i Kenneth Lichtendahl
(Wiley, 2007 – 2020; wydania dla R, Pythona, Excela i JMP).

Stopnie swobody
W dokumentacji wielu testów statystycznych i rozkładów prawdopodobieństwa znajdziesz pojęcie
stopni swobody. Jest ono stosowane w statystykach obliczanych z prób danych i odnosi się do liczby
niezależnych wartości. Przykładowo jeśli znasz średnią z próby 10 wartości, to występuje 9 stopni
swobody (gdy znasz 9 wartości próby, to możesz obliczyć również dziesiątą wartość, która nie może
różnić się od pozostałych). Dotyczący wielu rozkładów prawdopodobieństwa parametr stopni swo-
body wpływa na kształt danego rozkładu.
Liczba stopni swobody jest wartością bazową w wielu testach statystycznych. Dla przykładu mia-
nem stopni swobody określa się mianownik n–1 obliczanej wariancji i odchylenia standardowego.
Dlaczego ma to znaczenie? Jeśli użyjesz n jako mianownika w próbie oszacowania wariancji dla
populacji, otrzymasz zaniżony, obciążony wynik. Jeśli użyjesz n–1 w mianowniku, estymator bę-
dzie nieobciążony.

Stopnie swobody | 115

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące stopni swobody
n lub rozmiar próby
Liczba obserwacji (zwanych również wierszami lub rekordami) w danych.

Ogromna część tradycyjnych kursów z zakresu statystyki lub podręczników z tej dziedziny jest po-
święcona różnym standardom testów hipotez (takich jak test t, test F). Kiedy próby statystyczne są
standaryzowane do użycia tradycyjnych wzorów statystycznych, stopnie swobody są częścią obli-
czeń standaryzujących, by można było mieć pewność, że standaryzowane dane odpowiadają roz-
kładowi referencyjnemu (np. rozkładowi t, rozkładowi F).
Czy jest to istotne w data science? Niekoniecznie, przynajmniej nie w kontekście istotności testowania.
Z jednej strony formalne testy statystyczne używane są oszczędnie w data science. Z drugiej — rozmiar
danych jest zazwyczaj na tyle duży, by to, czy mianownik ma wartość n, czy n–1, nie zrobiło szczególnej
różnicy (w miarę zwiększania wartości n znika obciążenie wynikające z używania n w mianowniku).
Istnieje jednak jedna sytuacja, w której jest to istotne: użycie zmiennych faktoryzowanych w regre-
sji (także w regresji logistycznej). Niektóre algorytmy regresji „zatkają się”, jeśli w modelu będą
wykorzystywane zbędne zmienne predykcyjne. Dzieje się tak najczęściej, gdy faktoryzujemy
zmienne kategoryczne do zmiennych binarnych (zmiennych fikcyjnych). Rozważmy zmienną
„dzień tygodnia”. Mimo iż mamy siedem dni tygodnia, istnieje jedynie sześć stopni swobody do
określenia dnia tygodnia. Jeśli wiesz już, że chodzi o dzień tygodnia, który nie zawiera się w okresie
od poniedziałku do soboty, to wiadomo, że chodzi o niedzielę. Zawarcie w modelu wskaźnika pon.
– sob. również oznacza, że dodatkowe określenie wskaźnika dla niedzieli spowodowałoby porażkę
regresji z uwagi na błąd współliniowości.

Główne zasady
• Liczba stopni swobody odpowiada za część obliczeń standaryzującą statystyki testowe, tak
by można było je porównać z rozkładami referencyjnymi (np. rozkładem t, rozkładem F).
• Pojęcie stopni swobody wynika z faktoryzowania zmiennych kategorycznych do postaci
n–1 wskaźników lub zmiennych fikcyjnych podczas regresji (żeby można było uniknąć
współliniowości).

Dla pogłębienia wiedzy


Internetowe kursy w zakresie stopni swobody znajdziesz pod adresem: http://blog.minitab.com/
blog/statistics-and-quality-data-analysis/what-are-degrees-of-freedom-in-statistics.

ANOVA
Załóżmy, że zamiast przeprowadzić test A/B, musimy porównać wiele grup, np. A/B/C/D, a każda
z nich zawiera dane numeryczne. Procedura statystyczna na istotną statystycznie różnicę pomiędzy
kilkoma grupami jest nazywana analizą wariancji lub ANOVA.

116 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące ANOVA
Porównanie parami
Test hipotezy (np. dla średniej) pomiędzy dwoma grupami z wielu grup w populacji.

Test omnibusa
Test pojedynczej hipotezy obejmującej wariancje średnich w wielu grupach.

Dekompozycja wariancji
Rozdział na wiele czynników składających się na jedną wartość (np. ze wszystkich ogólnych
średnich, ze wszystkich średnich procedur, ze wszystkich błędów resztowych).

Statystyka F
Standaryzowana statystyka mierząca zakres, który przekraczają średnie w grupach. Może to
być oczekiwane w modelu losowym.

Suma kwadratów
Odniesienie do odchylenia wartości od pewnej wartości uśrednionej.

Tabela 3.3 pokazuje czas przebywania użytkownika (w sekundach) na czterech wersjach strony
internetowej. Cztery wersje są podmieniane w taki sposób, że jeden odwiedzający ogląda tylko
jedną, losowo wybraną wersję. W tabeli 3.3 dla każdej wersji strony mamy pięciu odwiedzających,
a każda kolumna stanowi niezależny zbiór danych. Pierwszy oglądający stronę 1. nie jest powiązany
z pierwszym oglądającym stronę 2. Zauważ, że w tego typu sytuacji nie możemy zastosować w pełni
losowego testu, w którym każdy odwiedzający jest wybierany losowo z dużej populacji. Musimy
uwzględniać tych, którzy faktycznie odwiedzają stronę. Odwiedzający mogą być zupełnie różni,
w zależności od pory dnia, dnia tygodnia, pory roku, warunków sieci, używanego sprzętu itd.
Wszystkie te czynniki powinny być uwzględnione jako potencjalne obciążenie podczas oceny wy-
ników eksperymentu.

Tabela 3.3. Czas przebywania użytkowników (zaokrąglony do pełnych sekund) na czterech stronach internetowych

Strona 1. Strona 2. Strona 3. Strona 4.


164 178 175 155
172 191 193 166
177 182 171 164
156 185 163 170
195 177 176 168
Średnia w grupie 173 185 176 162
Średnia całkowita 173,75

ANOVA | 117

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Teraz, kiedy porównywaliśmy jedynie dwie grupy (patrz rysunek 3.6), było to proste zadanie —
wystarczyło rzucić okiem na średnią w obu grupach. Przy czterech średnich mamy aż sześć możli-
wości porównywania grup:
• porównanie strony 1. i strony 2.,
• porównanie strony 1. i strony 3.,
• porównanie strony 1. i strony 4.,
• porównanie strony 2. i strony 3.,
• porównanie strony 2. i strony 4.,
• porównanie strony 3. i strony 4.

Rysunek 3.6. Boxploty dla czterech grup pokazują znaczne różnice pomiędzy tymi grupami

Im więcej takich porównań parami przeprowadzimy, tym większa szansa na odkrycie zależności
wynikających z przypadku (patrz podrozdział „Testowanie wielokrotne” we wcześniejszej części
tego rozdziału). Zamiast przejmować się wszystkimi możliwymi porównaniami, jakich można do-
konać, możemy zrobić jeden wspólny test, który odpowie na pytanie: czy wszystkie strony mają
sumarycznie taki sam czas trwania odwiedzin, a różnica w tych czasach dla poszczególnych stron
bierze się z losowego rozdziału zestawu czasów trwania odwiedzin między cztery strony?
Procedura umożliwiająca taki test to ANOVA. Jej podstawy można opisać testem randomizacyj-
nym (dostosowanym tu do testu A/B/C/D dla czasu trwania odwiedzin stron), w którym należy
wykonać następujące kroki:

118 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


1. Połączyć wszystkie dane w jeden zbiór.
2. Wymieszać wartości i stworzyć nowe cztery grupy po pięć wartości w każdej.
3. Policzyć średnią w każdej z nowych grup.
4. Policzyć wariancję dla średnich w tych czterech grupach.
5. Powtórzyć kroki 2. – 4. wiele razy (powiedzmy 1000).
Jak często nowa wariancja przekraczała obserwowaną wariancję? To jest właśnie oszacowana
p-wartość dla testu.
Ten typ testu permutacyjnego jest nieco bardziej złożony niż ten używany w punkt „Testy permutacyjne”
we wcześniejszej części tego rozdziału. Na szczęście funkcja aovp z pakietu lmPerm może to policzyć:
> library(lmPerm)
> summary(aovp(Czas ~ Strona, data=four_sessions))
[1] "Settings: unique SS "
Component 1 :
Df R Sum Sq R Mean Sq Iter Pr(Prob)
Strona 3 831.4 277.13 3104 0.09278 .
Residuals 16 1618.4 101.15
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Obliczona p-wartość Pr(Prob) wynosi 0,09278. Innymi słowy, przy takim samym czasie przebywa-
nia na stronie 9,3% zaobserwowanego czasu potrzebnego na reakcję, różniącego się pomiędzy
wszystkimi czterema stronami, może wynikać jedynie z przypadku. Taki stopień nieprawdopodo-
bieństwa nie dorównuje tradycyjnemu progowi statystycznemu rzędu 5%, dlatego stwierdzamy, że
różnica pomiędzy czterema stronami może wynikać z przypadku.
Kolumna Iter pokazuje liczbę iteracji wykonanych w teście. Pozostałe kolumny odpowiadają ty-
powej tablicy ANOVA i będą opisane w dalszej części tego rozdziału.
Możemy w Pythonie wykonać test permutacyjny za pomocą następującego kodu:
observed_variance = four_sessions.groupby('Page').mean().var()[0]
print('Zaobserwowane średnie:', four_sessions.groupby('Page').mean().values.ravel())
print('Wariancja:', observed_variance)

def perm_test(df):
df = df.copy()
df['Time'] = np.random.permutation(df['Time'].values)
return df.groupby('Page').mean().var()[0]

perm_variance = [perm_test(four_sessions) for _ in range(3000)]


print('Pr(Prawdop.)', np.mean([var > observed_variance for var in perm_variance]))

Statystyka F
Tak jak test t może być użyty zamiast testu permutacyjnego do porównania średnich, tak samo
istnieje test statystyczny dla ANOVA bazujący na statystyce F. Statystyka F opiera się na stosunku
wariancji średnich w grupach (efekt procedury) do wariancji ze względu na błędy resztowe. Im
większy jest ten stosunek, tym bardziej istotny statystycznie jest wynik. Teoria statystyki mówi, że
jeśli dane pochodzą z rozkładu normalnego, to statystyka testowa powinna mieć określony rozkład.
Bazując na tej wiedzy, możemy policzyć p-wartość.

ANOVA | 119

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W języku R możemy stworzyć tablicę ANOVA przy użyciu funkcji aov:
> summary(aov(Czas ~ Strona, data=four_sessions))
Df Sum Sq Mean Sq F value Pr(>F)
Strona 3 831.4 277.1 2.74 0.0776 .
Residuals 16 1618.4 101.2
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Pakiet statsmodels zapewnia implementację ANOVA w Pythonie:


model = smf.ols('Czas ~ Strona', data=four_sessions).fit()

aov_table = sm.stats.anova_lm(model)
aov_table

Wynik uzyskany za pomocą kodu Pythona jest niemal taki sam jak otrzymany w R.
Df to stopnie swobody, Sum Sq to suma błędów kwadratowych, Mean Sq to odchylenie średniokwa-
dratowe, F value to wartość statystyki F. Dla ogólnej średniej suma kwadratów jest kwadratem
różnicy tej średniej od 0 pomnożonej przez 20 (liczba obserwacji). Liczba stopni swobody dla ogól-
nej średniej z definicji wynosi 1.
Dla średnich w grupie liczba stopni swobody wynosi 3 (trzy wartości są ustalone, średnia ogólna
jest ustalona, ostatnia średnia nie może się zmieniać). Suma kwadratów dla średnich w grupach jest
sumą kwadratów różnic pomiędzy średnimi w grupach a średnią ogólną.
Dla rezyduów liczba stopni swobody wynosi 20 (wszystkie obserwacje mogą się zmieniać). Suma
kwadratów jest różnicą pomiędzy poszczególnymi obserwacjami a średnią dla grupy, w której znaj-
duje się obserwacja. Średnia kwadratów jest sumą kwadratów podzieloną przez stopnie swobody.
Statystyka F jest średnią kwadratów podzieloną przez średnią błędów. Wartość F zależy tylko od
tego stosunku i może być porównana do standardowego rozkładu F w celu określenia, czy różnice
pomiędzy średnimi w grupach są większe, niż wynikałoby to z losowości.

Dekompozycja wariancji
Obserwowane wartości w zbiorze danych mogą być rozważane jako suma różnych
komponentów. Dowolną obserwowaną wartość w zbiorze możemy rozbić na ogólną
zmienną, efekt działania poszczególnych procedur i błędy rezyduów. Nazywamy to
dekompozycją wariancji:
1. Zacznij od ogólnej średniej (173,75 dla danych czasu przebywania na stronie).
2. Dodaj efekt działania procedur, który może być ujemny (zmienne niezależne = strony).
3. Dodaj błędy rezyduów, które mogą być ujemne.

Dekompozycję wariancji dla górnej lewej wartości w tabeli dla testu A/B/C/D możesz
przeprowadzić następująco:
1. Zacznij od ogólnej średniej: 173,75.
2. Dodaj efekt procedury dla grupy: −1,75 (172−173.75).
3. Dodaj rezydua: −8 (164−172).
4. Wynik:164.

120 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Dwustronna ANOVA
Test A/B/C/D był przykładem „jednostronnego” testu ANOVA, w którym jeden czynnik (grupa)
się zmienia. Możemy mieć drugi czynnik — powiedzmy „weekend vs. dni robocze” — dla którego
rozdzielamy dane dla wszystkich kombinacji (grupa A — weekend, grupa A — dni robocze, grupa B
— weekend itd.). Taki podział stworzyłby możliwość wykorzystania „dwustronnego” testu ANOVA,
przeprowadzonego w podobny sposób jak test jednostronny, poprzez identyfikację „efektu interakcji”.
Po zidentyfikowaniu efektu ogólnej średniej i efektu procedur dzielimy kolejno obserwacje dla każ-
dej grupy na pochodzące z weekendu i dni roboczych i znajdujemy różnice średnich dla tych
podgrup oraz średnie dla procedur.
Możesz zauważyć, że zastosowanie jednostronnego testu ANOVA i dwustronnego testu ANOVA
to pierwszy krok do uzyskania pełnego modelu statystycznego, takiego jak regresja czy regresja
logistyczna, w której można modelować wiele czynników i ich efekty (patrz rozdział 4.).

Główne zasady
• ANOVA jest metodą statystyczną służącą do analizy efektów eksperymentu w wielu
grupach.
• ANOVA jest rozszerzeniem procedury dla testu A/B, używanej do określenia tego, kiedy
ogólne wariacje w poszczególnych grupach mieszczą się w zmienności losowej.
• Użytecznym wynikiem testu ANOVA jest identyfikacja zmienności komponentów powią-
zanych z procedurami dla grup, efektami interakcji i błędami.

Dla pogłębienia wiedzy


• Publikacja Petera Bruce’a Introductory Statistics and Analytics: A Resampling Perspective (Wiley,
2014) zawiera rozdział o teście ANOVA.
• Introduction to Design and Analysis of Experiments George’a Cobba (Wiley, 2008) jest przystępnym
omówieniem testu ANOVA.

Test chi-kwadrat
Testowanie stron internetowych często wykracza poza testy A/B i wykorzystuje testy wielokrotne.
Test chi-kwadrat jest używany do testowania tego, jak dane numeryczne są dopasowane do pew-
nego spodziewanego rozkładu. Najbardziej popularnym użyciem statystyki chi-kwadrat jest ta-
blica kontyngencji w×k, służąca do określenia tego, czy hipoteza zerowa o niezależności zmiennych
jest uzasadniona (zob. podrozdział „Rozkład chi-kwadrat” w rozdziale 2.).
Test chi-kwadrat został przedstawiony przez Karla Pearsona w 1900 r. Określenie „chi” pochodzi
od greckiej litery Χ, użytej przez Pearsona w artykule http://www.economics.soton.ac.uk/staff/
aldrich/1900.pdf.

Test chi-kwadrat | 121

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące testu chi-kwadrat
Statystyka chi-kwadrat
Miara rozciągnięcia, określająca, jak bardzo niektóre z obserwowanych danych wychodzą
poza spodziewane granice.

Spodziewane rezultaty
Oczekuje się, że dane będą realizowały założenia, najczęściej hipotezę zerową.

Zapis w×k oznacza „wiersze × kolumny” — tabela 2×3 składa się z dwóch wierszy
i trzech kolumn.

Test chi-kwadrat: podejście randomizacyjne


Wyobraź sobie, że chcesz przetestować trzy różne nagłówki na stronie — A, B, C; w tym celu pre-
zentujesz każdy z nich 1000 odwiedzających. Rezultaty przedstawia tabela 3.4.

Tabela 3.4. Wyniki testowania trzech różnych nagłówków w internecie

Nagłówek A Nagłówek B Nagłówek C


Odwiedziny 14 8 12
Bez odwiedzin 986 992 988

Nagłówki z całą pewnością różnią się od siebie. Nagłówek A ma prawie dwukrotnie większy wskaź-
nik odwiedzin niż B. Jednak bezwzględne liczby są małe. Test randomizacyjny może sprawdzić, czy
wskaźniki odwiedzin różnią się bardziej, niż może to wynikać z przypadku. W tym celu należy
stworzyć „oczekiwany” rozkład odwiedzin. W naszym przykładzie założeniem dla hipotezy zero-
wej będzie to, że wszystkie trzy nagłówki mają jednakowy wskaźnik odwiedzin, taki jak wskaźnik
sumaryczny — 34/3000. Tablicę kontyngencji dla tych założeń przedstawia tabela 3.5.

Tabela 3.5. Oczekiwana wartość wskaźnika odwiedzin jednakowa dla wszystkich trzech nagłówków (hipoteza zerowa)

Nagłówek A Nagłówek B Nagłówek C


Odwiedziny 11,33 11,33 11,33
Bez odwiedzin 988,67 988,67 988,67

Rezydua Pearsona (R) są zdefiniowane jako:

Obserwowane − Oczekiwane
𝑅
√Oczekiwane
R mierzą, w jakim stopniu otrzymane wyniki różnią się od wyników oczekiwanych (patrz tabela 3.6).

122 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Tabela 3.6. Rezydua Pearsona

Nagłówek A Nagłówek B Nagłówek C


Odwiedziny 0,792 –0,990 0,198
Bez odwiedzin –0,085 0,106 –0,021

Statystyka chi-kwadrat jest zdefiniowana jako suma kwadratów rezyduów Pearsona:

Χ= 𝑅

gdzie w i k są, odpowiednio, liczbami wierszy i kolumn. Statystyka testowa chi-kwadrat dla tego
przypadku wynosi 1,666. Czy jest to więcej, niż można by uzyskać w modelu losowym?
Możemy to sprawdzić w teście randomizacyjnym:
1. Stwórz grupę zawierającą 34 jedynki (odwiedziny) i 2966 zer (bez odwiedzin).
2. Wymieszaj wartości i stwórz nowe grupy po 1000 wyników każda, a następnie w każdej z grup
policz odwiedziny (jedynki).
3. Oblicz kwadrat różnicy pomiędzy wymieszanymi zliczeniami a oczekiwaną wartością i posu-
muj je.
4. Powtórz kroki 2. i 3., powiedzmy, 1000 razy.
5. Sprawdź, jak często nowa suma kwadratów różnic przekracza obserwowaną. W ten sposób
uzyskasz obliczoną p-wartość.
Funkcja chisq.test może być użyta do obliczenia randomizacyjnej statystyki chi-kwadrat w R.
Dla danych z odwiedzin test chi-kwadrat wygląda następująco:
> chisq.test(clicks, simulate.p.value=TRUE)
Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)

data: clicks
X-squared = 1.6659, df = NA, p-value = 0.4853

Test pokazuje, że uzyskany w eksperymencie wynik może być efektem losowości.


Aby wykonać test permutacyjny w Pythonie, skorzystaj z następującej implementacji:
box = [1] * 34
box.extend([0] * 2966)
random.shuffle(box)

def chi2(observed, expected):


pearson_residuals = []
for row, expect in zip(observed, expected):
pearson_residuals.append([(observe - expect) ** 2 / expect
for observe in row])

# zwraca sumę kwadratów


return np.sum(pearson_residuals)

Test chi-kwadrat | 123

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


expected_clicks = 34 / 3
expected_noclicks = 1000 - expected_clicks
expected = [34 / 3, 1000 - 34 / 3]
chi2observed = chi2(clicks.values, expected)

def perm_fun(box):
sample_clicks = [sum(random.sample(box, 1000)),
sum(random.sample(box, 1000)),
sum(random.sample(box, 1000))]
sample_noclicks = [1000 - n for n in sample_clicks]
return chi2([sample_clicks, sample_noclicks], expected)

perm_chi2 = [perm_fun(box) for _ in range(2000)]


resampled_p_value = sum(perm_chi2 > chi2observed) / len(perm_chi2)
print(f'Zaobserwowana wartość chi2: {chi2observed:.4f}')
print(f'p-wartość z randomizacji: {resampled_p_value:.4f}')

Test chi-kwadrat: teoria


Teoria wskazuje, że asymptotycznie rozkład statystyki chi-kwadrat może być oszacowany przez
rozkład chi-kwadrat (zob. podrozdział „Rozkład chi-kwadrat” w rozdziale 2.). Właściwy rozkład
chi-kwadrat dobiera się na podstawie liczby stopni swobody statystyki (patrz podrozdział „Stopnie
swobody” we wcześniejszej części tego rozdziału). Dla tablicy kontyngencji stopnie swobody są po-
wiązane z liczbą wierszy (w) i kolumn (k) w następujący sposób:

stopnie swobody = (𝑤 − 1) × (𝑘 − 1)

Chi-kwadrat jest przykładem rozkładu, który jest w dość typowy sposób wygięty „w dzwon” i ma
długi ogon po prawej stronie [patrz rysunek 3.7 dla rozkładu z 1, 2, 5 i 20 stopniami swobody
(st_swobody)]. Im bardziej obserwowana statystyka zbliża się do krańca rozkładu chi-kwadrat, tym
mniejsza jest p-wartość.
Funkcja chisq.test może być użyta do obliczenia p-wartości z wykorzystaniem rozkładu chi-kwa-
drat jako referencji:
> chisq.test(clicks, simulate.p.value=FALSE)
Pearson's Chi-squared test

data: clicks
X-squared = 1.6659, df = 2, p-value = 0.4348

W Pythonie skorzystaj z funkcji scipy.stats.chi2_contingency:


chisq, pvalue, df, expected = stats.chi2_contingency(clicks)
print(f'Zaobserwowana wartość chi2: {chi2observed:.4f}')
print(f'p-wartość: {pvalue:.4f}')

Obliczona p-wartość jest nieco mniejsza niż ta szacowana poprzednio w teście randomizacyj-
nym: dzieje się tak, ponieważ rozkład chi-kwadrat jest jedynie przybliżeniem faktycznego roz-
kładu statystyki.

124 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 3.7. Rozkład chi-kwadrat dla różnych stopni swobody

Dokładny test Fishera


Rozkład chi-kwadrat jest dobrym przybliżeniem testu randomizacyjnego, poza przypadkiem, w którym
próby są bardzo mało liczne (stanowią pojedyncze wartości, najczęściej pięć i mniej). W takiej sy-
tuacji metoda randomizacyjna określi dokładniej p-wartość. W rzeczywistości oprogramowanie
statystyczne ma zazwyczaj funkcje umożliwiające przeliczenie wszystkich możliwości przegrupo-
wania danych (permutacji), jakie mogą wystąpić, zebranie ich częstości i dokładne określenie, jak
skrajny jest obserwowany wynik. Taka metoda nazywana jest dokładnym testem Fishera, na cześć
wybitnego statystyka R.A. Fishera. Kod R dla dokładnego testu Fishera jest niezwykle prosty:
> fisher.test(clicks)

Fisher's Exact Test for Count Data

data: clicks
p-value = 0.4824
alternative hypothesis: two.sided

Test chi-kwadrat | 125

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Otrzymana p-wartość jest zbliżona do tej oszacowanej w teście randomizacyjnym i wynosi 0,4853.
W przypadku gdy niektóre grupy są niewielkie, a inne bardzo duże (np. w zamieszczonym we wcze-
śniejszej części tego rozdziału przykładzie dotyczącym odwiedzin różnych wersji strony), konieczne
może się okazać użycie testu permutacyjnego zamiast pełnego testu dokładnego z uwagi na trud-
ności w obliczeniu wszystkich permutacji. Przedstawiona poprzednio funkcja ma kilka argumen-
tów, które umożliwiają kontrolę nad oszacowaniem (simulate.p.value=TRUE lub FALSE) tego, ile
iteracji ma wykonać (B=…), oraz ograniczenia obliczeń (workspace=…), które wskazują, jak dużo pa-
mięci mogą zająć obliczenia dla otrzymania dokładnego wyniku.
W Pythonie nie występuje jeszcze gotowa implementacja dokładnego testu Fishera.

Wykrycie oszustwa naukowego


Interesującym przykładem jest przypadek Therezy Imanishi-Kari z Tufts University, która
w 1991 r. została oskarżona o sfałszowanie wyników swoich badań. W sprawę zamieszany był
kongresmen John Dingell, a cała ta sytuacja spowodowała rezygnację znajomego Imanishi-Kari,
Davida Baltimore’a, z prezydencji w Rockefeller University.
Jeden element w sprawie opierał się na dowodzie statystycznym odnoszącym się do oczekiwa-
nego rozkładu cyfr w danych laboratoryjnych, gdzie każda obserwacja składała się z wielu cyfr.
Śledczy skupili się na środkowych cyfrach (pierwsza i ostatnia cyfra liczby była ignorowana);
oczekiwano, że będą one pochodziły z rozkładu jednostajnego. Oznaczało to, że powinny po-
jawiać się losowo, z jednakowym prawdopodobieństwem wystąpienia każdej cyfry (główne cy-
fry analizowanych danych mogą być zdominowane przez jedną wartość, a końcowe cyfry mogą
być zafałszowane przez zaokrąglanie). Tabela 3.7 przedstawia częstości występowania wewnętrz-
nych cyfr dla danych pochodzących z badań rozpatrywanych w omawianej sprawie.

Tabela 3.7. Częstość występowania środkowych cyfr z danych laboratoryjnych

Cyfra Częstość

0 14
1 71
2 7
3 65
4 23
5 19
6 12
7 45
8 53
9 6

Rozkład 315 cyfr przedstawiony na rysunku 3.8 zdecydowanie nie wygląda na losowy.

126 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 3.8. Histogram dla danych z eksperymentu Imanishi-Kari

Śledczy przeliczyli odchylenia od oczekiwanej wartości (31,5 — tak często powinna pojawiać się
każda cyfra w ściśle jednostajnym rozkładzie) i użyli testu chi-kwadrat (test randomizacyjny też
mógłby być tu zastosowany), by pokazać, że faktyczny rozkład jest daleki od normalnej losowej
zmienności, co wskazywało na to, że dane mogły zostać sfabrykowane (uwaga: po długim procesie
Imanishi-Kari została ostatecznie oczyszczona z zarzutów).

Znaczenie testu chi-kwadrat w data science


Test chi-kwadrat i dokładny test Fishera są używane wtedy, gdy chcemy sprawdzić, czy dane zja-
wisko jest istotne, czy stanowi dzieło przypadku. W większości klasycznych zastosowań statystycz-
nych testu chi-kwadrat jego zadaniem jest ustalenie istotności statystycznej, co jest zazwyczaj nie-
zbędne przed opublikowaniem wyników badań lub eksperymentu. Dla analityków danych nie jest
to istotne. W większości eksperymentów data science nie ma znaczenia, czy użyjemy testu A/B, czy
A/B/C itd. — celem nie jest określenie istotności statystycznej, ale raczej ustalenie najlepszej pro-
cedury. Aby to osiągnąć, można zastosować metodę Wielorękiego Bandyty (patrz podrozdział
„Algorytm Wielorękiego Bandyty” w dalszej części tego rozdziału).
Jednym z zastosowań testu chi-kwadrat, w szczególności dokładnej wersji Fishera, w data science
jest określenie odpowiedniego rozmiaru próby dla eksperymentów internetowych. Te ekspe-
rymenty zazwyczaj mają bardzo niski wskaźnik kliknięć w porównaniu do tysięcy wyświetleń.
Częstości mogą być zbyt niskie, by można było wyciągnąć prawidłowe wnioski z eksperymentu.
W takim przypadku dokładny test Fishera, test chi-kwadrat i inne testy mogą być użyteczne jako
elementy obliczenia mocy i rozmiaru próby (patrz podrozdział „Moc i rozmiar próby” w dalszej
części tego rozdziału).

Test chi-kwadrat | 127

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Testy chi-kwadrat są powszechnie używane w badaniach poszukujących utopijnych, istotnych sta-
tystycznie p-wartości, które umożliwią publikację. Test chi-kwadrat lub inne symulacje randomi-
zacyjne są używane w data science bardziej jako filtr umożliwiający określenie, czy efekt lub właści-
wość są warte dalszego rozpatrywania w formalnym teście istotności. Są one np. używane w statystykach
przestrzennych i mapowaniu do określenia, czy dane przestrzenne potwierdzają specyficzny roz-
kład zerowy (np. czy przestępstwa koncentrują się w poszczególnych obszarach bardziej, niż wyni-
kałoby to z przypadku). Mogą również być użyte podczas automatycznej ekstrakcji cech w uczeniu
maszynowym, do oceny rozpowszechnienia klas w cechach i do identyfikacji cech, kiedy to rozpo-
wszechnienie konkretnych cech jest nietypowo wysokie bądź niskie, w sposób inny niż losowy.

Główne zasady
• Typowym postępowaniem w statystyce jest test sprawdzający, czy obserwowane zliczenia
danych są spójne z założeniem niezależności (np. tendencja do kupowania poszczególnych rze-
czy niezależna od płci).
• Rozkład chi-kwadrat jest rozkładem referencyjnym (odzwierciedlającym założenie niezależ-
ności), do którego należy porównać obliczoną dla danych statystykę chi-kwadrat.

Dla pogłębienia wiedzy


• Słynny przykład R.A. Fishera „Lady Tasting Tea” z początku lat 20. ubiegłego wieku jest prostą
i efektywną ilustracją jego dokładnego testu. Gdy wpiszesz w wyszukiwarkę Google hasło: Lady
Tasting Tea, otrzymasz adresy kilku dobrych publikacji na ten temat.
• Stat Trek oferuje niezłe materiały dotyczące testu chi-kwadrat, zamieszczone pod adresem:
http://stattrek.com/chi-square-test/independence.aspx?Tutorial=AP.

Algorytm Wielorękiego Bandyty


Wieloręki Bandyta jest podejściem, wykorzystywanym szczególnie w testach stron internetowych,
które umożliwia wyraźną optymalizację testów i dużo szybsze podejmowanie decyzji niż w przy-
padku tradycyjnego statystycznego podejścia do planowania eksperymentu.

Kluczowe pojęcia dotyczące algorytmu Wielorękiego Bandyty


Wieloręki Bandyta
Wyimaginowany automat z wieloma dźwigniami do wyboru, każda z inną wygraną; tu trak-
towany jako analogia do eksperymentu z wieloma procedurami.

Ręka
Procedura w eksperymencie (np. „nagłówek A w teście internetowym”).

Wygrana
Eksperymentalny analog do wygranej w automacie (np. „klient kliknął link”).

128 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W zależności od specyfiki projektu tradycyjny test A/B wykorzystuje dane zebrane w eksperymen-
cie do odpowiedzi na konkretne pytanie, np. „Która z procedur jest lepsza, A czy B?”. Przypusz-
czalnie, kiedy otrzymamy odpowiedź na zadane pytanie, eksperyment się zakończy, a my przej-
dziemy do opracowania wyników.
Prawdopodobnie dostrzegłeś kilka problemów w takim podejściu. Po pierwsze, możemy uzyskać
nierozstrzygającą odpowiedź: „efekt nieudowodniony”. Innymi słowy, wyniki naszego ekspery-
mentu mogą sugerować efekt, ale jeśli on faktycznie istnieje, mamy zbyt małą próbę, by to udo-
wodnić (zgodnie ze standardami tradycyjnej statystyki). Po drugie, możemy chcieć zacząć wyko-
rzystywać wyniki, które pojawią się przed wnioskami z eksperymentu. Po trzecie, chcemy mieć
prawo do zmiany zdania lub do sprawdzenia czegoś innego na podstawie dodatkowych danych,
które pojawiły się już po zakończeniu eksperymentu. Tradycyjne podejście do eksperymentów
i testów hipotezy z lat 20. ubiegłego wieku jest pod tym względem raczej nieelastyczne. Era kom-
puterów i oprogramowania spowodowała pojawienie się kompleksowych i wszechstronnych roz-
wiązań. Co więcej, data science (i biznes w ogóle) nie przejmują się zbytnio istotnością statystyczną,
są raczej skupione na optymalizacji wysiłków i wyników.
Algorytmy Bandytów, które są bardzo popularne w testowaniu stron internetowych, umożliwiają
Ci testowanie wielu procedur za jednym razem i wyciąganie wniosków szybciej niż przy tradycyj-
nym podejściu. Algorytmy te wzięły swoją nazwę od nazwy automatów hazardowych, zwanych
jednorękimi bandytami (ponieważ są skonstruowane w taki sposób, że wyłudzają od gracza stały
strumień pieniędzy). Wyobraź sobie, że masz automat z więcej niż jedną „ręką” i na każdą z nich
wydajesz inną sumę — to właśnie Wieloręki Bandyta, czyli pełna nazwa opisywanego algorytmu.
Twoim celem jest wygrać tak dużo, jak to możliwe, a dokładniej — zidentyfikować i określić wy-
grywającą „rękę” jak najszybciej. Wyzwanie stanowi to, że nie wiesz, na którą „rękę” ile łącznie
wydajesz — znasz jedynie wynik będący efektem poszczególnych pociągnięć „ręki”. Przypuśćmy,
że każda wygrana ma taką samą wartość i nie ma znaczenia, którą „rękę” wybierzesz. Jedyne, co się
zmienia, to prawdopodobieństwo wygranej. Przypuśćmy też, że na początek przetestowałeś każdą
„rękę” 50 razy i otrzymałeś następujące wyniki:
„ręka” A: 10 wygranych na 50 prób,
„ręka” B: 2 wygrane na 50 prób,
„ręka” C: 4 wygrane na 50 prób.
W pierwszym ekstremalnym podejściu stwierdzimy: „Wygląda na to, że ramię A jest najlepsze —
porzućmy testowanie innych i zostańmy przy A”, co będzie pełnym wykorzystaniem informacji
z testów wstępnych. Jeśli A faktycznie dominuje, najszybciej przyniesie zyski. Jednak jeśli B lub C
jest faktycznie lepsze, stracimy możliwość odkrycia tego. W drugim ekstremalnym podejściu
stwierdzimy: „To wszystko wygląda na przypadek, pozostańmy przy dalszym testowaniu wszyst-
kich jednakowo”. To umożliwi alternatywom dla A ujawnienie się. Jednakże w proponowanym
procesie testowania stosujemy coś na wzór gorszego traktowania. Algorytmy Bandyty wykorzy-
stują podejście hybrydowe: zaczynamy testować A częściej, żeby czerpać korzyści z jego domnie-
manej wyższości, ale nie porzucamy jeszcze B i C. Po prostu testujemy je rzadziej. Jeśli C zacznie
być lepsze, a A gorsze, możemy zmienić testy z A na C. Jeśli któraś alternatywa okaże się lepsza od
A, a nie zauważyliśmy tego w badaniach wstępnych, teraz będzie okazja do wychwycenia tego
w dalszych testach.

Algorytm Wielorękiego Bandyty | 129

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Teraz pomyślmy o wykorzystaniu tego w testach stron internetowych. Zamiast wielu „rąk” auto-
matu możesz mieć na stronie wiele ofert, nagłówków, kolorów itd., które trzeba przetestować.
Klienci mogą kliknąć (wygrana w automacie) albo nie. Na początek oferty są pokazywane losowo
i jednakowo często. Jeśli jednak któraś z nich okaże się dominująca, może być pokazywana (testo-
wana) częściej. Jakie powinny być parametry algorytmu, żeby można było modyfikować częstość
konkretnego wyboru? Jak musimy zmienić „wskaźnik wyboru” i kiedy należy to zrobić?
Poniżej znajduje się prosty algorytm epsilon-zachłanny dla testu A/B:
1. Wygeneruj losową liczbę o rozkładzie jednostajnym z przedziału  0, 1 .
2. Jeśli liczba leży pomiędzy 0 a epsilon (gdzie epsilon jest liczbą z przedziału  0, 1 , zazwyczaj
odpowiednio małą), rzuć monetą (prawdopodobieństwo 50/50) i:
a. jeśli wypadnie orzeł, pokaż ofertę A;
b. jeśli wypadnie reszka, pokaż ofertę B.
3. Jeśli wylosowana liczba jest ≥ epsilon, pokaż ofertę, która ma wyższy wskaźnik wyboru.
Epsilon jest pojedynczym parametrem, który rządzi całym algorytmem. Jeśli epsilon wynosi 1,
otrzymujemy klasyczny eksperyment A/B (losowe pokazywanie A i B oglądającym). Jeśli epsilon wy-
nosi 0, mamy do czynienia z zachłannym algorytmem — takim, który wybiera najlepsze bieżące roz-
wiązanie (optimum lokalne). Nie zamierza on dalej eksperymentować, po prostu postępuje zgodnie
z procedurą o najwyższej wydajności (wyświetla stronę o najwyższym do tej pory wskaźniku wyboru).
Bardziej wyszukanym algorytmem będzie próbkowanie Thompsona. Metoda próbkowania (wybierania
„ręki” Bandyty) w każdym stadium zwiększa prawdopodobieństwo wybrania najlepszej „ręki”. Oczywi-
ście nie wiesz, która „ręka” jest najlepsza (i w tym cały problem!), ale obserwując zwrot, z każdą wygraną
masz coraz więcej informacji. Próbkowanie Thompsona wykorzystuje podejście Bayesowskie: pewien
wstępny rozkład nagród jest zakładany na samym początku przy użyciu tzw. rozkładu beta (jest to
powszechny mechanizm dla określenia wstępnych informacji w problemach Bayesowskich). Roz-
kład ten jest aktualizowany jako informacja kumulatywna z każdego powtórzenia, co umożliwia
zoptymalizowanie wyboru przy kolejnej próbie, tak by ostatecznie dało się wybrać właściwe ramię.
Algorytm Bandyty może wydajnie testować więcej niż trzy hipotezy naraz i w optymalny sposób
odnaleźć „najlepszą” z nich. Dla tradycyjnych metod testowania statystycznego złożoność podej-
mowania decyzji dla trzech i więcej procedur znacznie przewyższa złożoność klasycznego testu A/B,
a korzyści płynące ze stosowania algorytmu Bandyty są znacznie większe niż z używania testu A/B.

Główne zasady
• Tradycyjny test A/B przewiduje losowy dobór prób, co prowadzi do nadmiernej ekspozycji
gorszej procedury.
• Wieloręki Bandyta modyfikuje proces doboru prób, wykorzystując informacje zdobyte pod-
czas eksperymentu i redukując częstość stosowania gorszej procedury.
• Algorytm Bandyty ułatwia efektywne porównanie więcej niż dwóch procedur jednocześnie.

• Istnieją różne algorytmy modyfikacji doboru prób ograniczające gorsze procedury na rzecz
tych lepszych.

130 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Dla pogłębienia wiedzy
• Rewelacyjny krótki opis algorytmu Wielorękiego Bandyty można znaleźć w publikacji Johna
Mylesa White’a Bandit Algorithm for Website Optimization (O’Reilly, 2012). White zawarł
w niej kody Pythona wraz z wynikami symulacji, by ocenić wydajność algorytmów.
• Znacznie dokładniejszy (technicznie) opis próbkowania Thompsona znajdziesz w tekście Shipry
Agrawal i Navina Goyala Analysis of Thompson Sampling for the Multi-armed Bandit Problem,
zamieszczonym na stronie: http://proceedings.mlr.press/v23/agrawal12/agrawal12.pdf.

Moc i rozmiar próby


Kiedy wykonujesz test internetowy, na jakiej podstawie decydujesz o czasie trwania eksperymentu
(jak wiele wyników dla poszczególnych procedur jest potrzebnych)? Pomijając wszystko, co możesz
przeczytać w wielu podręcznikach na temat testowania w internecie, nie ma jednej dobrej zasady
— wszystko zależy głównie od częstości, z jaką osiągany jest dany cel.

Kluczowe pojęcia dotyczące mocy i rozmiaru próby


Efekt rozmiaru
Minimalny rozmiar efektu, jaki masz nadzieję wykryć w teście statystycznym, np. „20% po-
prawy wskaźnika kliknięć”.

Moc
Prawdopodobieństwo wykrycia zadanego efektu rozmiaru w próbie o zadanym rozmiarze.

Poziom istotności
Poziom istotności statystycznej, na jakim test będzie przeprowadzony.

Pierwszym krokiem w obliczeniach statystycznych dla rozmiaru próby jest zadanie pytania: czy test
hipotezy faktycznie ujawni różnice pomiędzy procedurą A i procedurą B? Wynik z testu hipotezy
— p-wartość — zależy od rzeczywistej różnicy pomiędzy procedurą A i procedurą B. Zależy rów-
nież od szczęścia, czyli od tego, kto będzie przypisany do grup eksperymentalnych. Z całą pewno-
ścią im większa różnica pomiędzy procedurami A i B, tym większe prawdopodobieństwo, że nasz
eksperyment ją wykaże; im mniejsza jest różnica, tym więcej danych potrzebujemy, żeby ją wykryć.
By rozróżnić pałkarza ze średnią .350 od takiego ze średnią .200, nie potrzeba wielu podejść (ang.
at-bats). Żeby rozróżnić pałkarzy ze średnimi .300 i .280, będziemy potrzebować zdecydowanie
więcej podejść.
Moc jest prawdopodobieństwem wykrycia konkretnego efektu rozmiaru, który precyzuje charak-
terystyka próby. Możemy powiedzieć (hipotetycznie), że prawdopodobieństwo rozróżnienia pał-
karzy o średnich .330 i .200 w 25 podejściach wynosi 0,75. Efekt rozmiaru w tym przypadku wynosi
.130. Wykrycie znaczy, że test hipotezy odrzuci hipotezę zerową o „braku różnicy” i stwierdzi fak-
tyczny efekt. Eksperyment złożony z 25 powtórzeń (n = 25) dla dwóch pałkarzy z rozmiarem efektu
na poziomie 0.130 ma moc (hipotetyczną) na poziomie 0,75 lub 75%. Możesz zobaczyć, że jest tu

Moc i rozmiar próby | 131

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


kilka zmiennych elementów i łatwo można się zaplątać w liczne statystyczne założenia i równania,
które będą potrzebne (określenie zmienności próby, obliczenie mocy, rozmiar efektu, rozmiar
próby, poziom alfa dla testu hipotezy itd.).
Istnieje oprogramowanie statystyczne specjalnego przeznaczenia służące do obliczania mocy.
Większość specjalistów data science nie musi wykonywać wszystkich formalnych kroków niezbęd-
nych do określenia mocy np. w artykule naukowym. Jednakże mogą się oni spotkać z przypadkami,
w których będą musieli zebrać dane do testu A/B, a zbieranie i przetwarzanie danych wiąże się
z kosztami. W takim przypadku, wiedząc z grubsza, ile danych należy zebrać, można uniknąć sy-
tuacji, w której zebrane z pewnym wysiłkiem dane przynoszą nierozstrzygające wyniki. Oto alter-
natywne, dość intuicyjne podejście:
• Zacznij od hipotetycznych danych przedstawiających Twoje przypuszczenia na temat danych,
które masz zebrać (np. na bazie wcześniejszych danych); przykładowo urna z 20 jedynkami
i 80 zerami będzie reprezentowała pałkarza ze średnią .200 lub z obserwacjami czasu spędzo-
nego na stronie internetowej.
• Stwórz drugą próbę, dodając po prostu pożądany efekt do pierwszej próby; przykład: druga
urna z 33 jedynkami i 67 zerami lub z 25 sekundami dodanymi do początkowego czasu spę-
dzonego na stronie internetowej.
• Stwórz próby bootstrapowe o rozmiarze n dla każdej z urn.
• Przeprowadź permutacyjny (albo oparty na równaniu) test hipotezy na dwóch próbach boot-
strapowych i sprawdź, czy różnica pomiędzy nimi jest istotna statystycznie.
• Powtórz poprzednie dwa kroki wielokrotnie i określ, jak często różnica jest istotna statystycz-
nie — to właśnie szacowana moc.

Rozmiar próby
Najpowszechniejszym użyciem obliczonej mocy jest oszacowanie, jak dużej liczby prób potrzebujesz.
Przypuśćmy, że szukasz wskaźnika konwersji (kliknięcia jako wskaźnik odwiedzin) i testujesz nową
reklamę w porównaniu do starej. Jak dużo kliknięć musisz zebrać w badaniach? Jeśli interesują Cię
jedynie wyniki, które wskażą na ogromną różnicę (powiedzmy 50%), stosunkowo niewielka grupa
może wystarczyć. Jeśli jednak nawet niewielka różnica będzie interesująca, wtedy potrzebna będzie
zdecydowanie większa próba. Standardowym podejściem będzie założenie, że nowa reklama musi
być lepsza od obecnej na konkretnym poziomie, powiedzmy, że 10%; w innym przypadku obecna
reklama zostaje niezmieniona. Ustalony cel „rozmiar efektu” dyktuje rozmiar próby.
Załóżmy, że obecny wskaźnik konwersji z kliknięć jest na poziomie 1,1%, a Ciebie interesuje wzrost
o 10% — do 1,21%. Innymi słowy, mamy dwie urny: urnę A, zawierającą 1,1% jedynek (powiedzmy,
że 110 jedynek i 9890 zer), i urnę B, gdzie jedynki to 1,21% (121 jedynek i 9879 zer). Na początek
sprawdzasz 300 przypadków z każdej urny (to będzie Twoje 300 wrażeń dla każdej reklamy). Przy-
puśćmy, że nasz wstępny test wykazał następujące wyniki:
urna A: 3 jedynki,
urna B: 5 jedynek.

132 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W tej chwili widzimy, że każdy test hipotezy uznałby tę różnicę (5 vs. 3) za dzieło przypadku. Taki
rozmiar próby (n = 300 w każdej grupie) przy takim rozmiarze efektu (10% różnicy) jest zbyt mały
dla jakiejkolwiek hipotezy do wskazania wiarygodnych różnic.
Spróbujmy w takim razie zwiększyć rozmiar próby (powiedzmy, że na 2000 wrażeń) i załóżmy
większy postęp (50% zamiast 10%).
Przykładowo obecny poziom kliknięć jest wciąż na poziomie 1,1%, ale w tym przypadku oczekujemy
50-procentowego wzrostu, do 1,65%. Tym razem znów mamy dwie urny: urna A zawiera ponownie
1,1% jedynek (110 jedynek i 9890 zer), a urna B ma 1,65% jedynek (165 jedynek i 9835 zer). Tym razem
sprawdzamy po 2000 przypadków z każdej urny. Nasze wyniki przedstawiają się następująco:
urna A: 19 jedynek,
urna B: 34 jedynki.
Test istotności dla tej różnicy (34 – 19) wciąż mówi, że nie jest ona znacząca (jednak jest znacznie
bliżej istotności niż poprzednia, 5 – 3). By obliczyć moc, musimy powtórzyć poprzednią procedurę
wielokrotnie lub użyć oprogramowania statystycznego, które będzie potrafiło ją policzyć. Nasze
wstępne wyniki sugerują, że wykrycie nawet 50% poprawy będzie wymagało kilku tysięcy wyświe-
tleń reklamy.
Podsumowując, możemy stwierdzić, że by obliczyć moc lub wymagany rozmiar próby, trzeba roz-
ważyć cztery niestałe aspekty:
• rozmiar próby;
• rozmiar efektu, jaki chce się wykryć;
• poziom istotności (alfa), na jakim test ma być przeprowadzony;
• moc.
Określ trzy z nich, a czwarty będzie można łatwo obliczyć. Najczęściej będziesz chciał obliczyć roz-
miar próby, więc będziesz musiał określić pozostałe trzy elementy. W przypadku R i Pythona mu-
sisz także wyznaczyć hipotezę alternatywną jako „większą”, aby otrzymać test jednostronny; po-
równanie testów jednostronnego i dwustronnego znajdziesz w punkcie „Test jednostronny i test
dwustronny”. Poniżej przedstawiono kod R dla testu proporcji, w którym obie próby są tych sa-
mych rozmiarów (funkcja z pakietu pwr):
effect_size = ES.h(p1=0.0121, p2=0.011)
pwr.2p.test(h=effect_size, sig.level=0.05, power=0.8, alternative='greater’)
--
Difference of proportion power calculation for binomial distribution
(arcsine transformation)
h = 0.01029785
n = 116601.7
sig.level = 0.05
power = 0.8
alternative = greater

NOTE: same sample sizes

Moc i rozmiar próby | 133

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Funkcja ES.h oblicza rozmiar zjawiska. Jak widać, jeżeli chcemy uzyskać moc rzędu 80%, potrze-
bujemy próby zawierającej co najmniej 120 000 obserwacji. W przypadku mocy 50% (p1=0.0165)
rozmiar próby zmniejsza się do 6500 obserwacji.
Pakiet statsmodels zawiera kilka metod obliczania mocy. Skorzystamy tu z metody proportion_
effectsize do obliczenia rozmiaru zjawiska i z TTestIndPower do określenia rozmiaru próby:
effect_size = sm.stats.proportion_effectsize(0.0121, 0.011)
analysis = sm.stats.TTestIndPower()
result = analysis.solve_power(effect_size=effect_size,
alpha=0.05, power=0.8, alternative='larger')
print('Rozmiar próby: %.3f' % result)
--
Rozmiar próby: 116602.393

Główne zasady
• Określenie tego, jak dużej próby potrzebujesz, wymaga myślenia w przód o teście statystycznym,
jaki zamierzasz przeprowadzić.
• Musisz określić minimalny efekt rozmiaru, jaki chcesz wykryć.

• Musisz również określić wymagane prawdopodobieństwo, z jakim ten efekt wykryjesz (moc).

• I wreszcie musisz określić poziom istotności (alfa), na którym będziesz przeprowadzać test.

Dla pogłębienia wiedzy


• Publikacja Thomasa Ryana Sample Size Determination and Power (Wiley, 2013) to zwięzłe i jasne
omówienie tematu przedstawionego w tym podrozdziale.
• Steve Simon — konsultant statystyczny — napisał przystępny post na temat mocy i rozmiaru
próby, zamieszczony pod adresem: http://www.pmean.com/09/AppropriateSampleSize.html.

Podsumowanie
Podstawy planowania eksperymentów — losowe przydzielanie podmiotów do dwóch lub więcej
grup traktowanych różnymi procedurami — pozwalają na wyciągnięcie uzasadnionych wniosków
o działaniu procedur. Pożądane jest dołączenie grupy z procedurą kontrolną nieulegającą zmianie
w stosunku do procedury stosowanej obecnie. Opisy obiektu formalnego wnioskowania statystycz-
nego — testowanie hipotezy, p-wartość, test t i wiele innych w tej ścieżce — zajmują dużo miejsca
w tradycyjnych kursach statystyki i w podręcznikach z tej dziedziny, a formalizm jest w większości
przypadków zbędny z perspektywy data science. Jednakże istotne pozostaje uznanie roli, jaką lo-
sowa zmienność odgrywa w mamieniu ludzkiego umysłu. Intuicyjne metody randomizacyjne
(permutacje, próby bootstrapowe) umożliwiają analitykom danych zmierzenie tego, jak dużą rolę
w analizowanych danych odgrywa zmienność losowa.

134 | Rozdział 3. Eksperymenty statystyczne i testowanie istotności

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


ROZDZIAŁ 4.
Regresja i predykcja

Prawdopodobnie najbardziej powszechnym celem w statystyce jest odpowiedź na pytanie: czy


zmienna X (ale częściej X1, …, Xp) jest powiązana ze zmienną Y, a jeśli tak, to jaka jest relacja i czy
możemy jej użyć do predykcji Y?
Nigdzie indziej związek pomiędzy statystyką a data science nie jest silniejszy niż w zakresie predyk-
cji — zwłaszcza w predykcji zmiennej wynikowej (celu), bazującej na wartościach innych zmien-
nych „predykcyjnych”. Proces uczenia modelu na danych, dla których znany jest rezultat, w celu
przygotowania go na dane, dla których rezultat nie jest znany, nazywamy uczeniem nadzorowanym
(ang. supervised learning). Innym ważnym połączeniem data science ze statystyką jest obszar wykry-
wania anomalii (ang. anomaly detection), gdzie diagnostyka metodą regresji, zakładająca na po-
czątku analizę danych i poprawę modelu regresji, może być użyta do wykrycia nietypowych rekordów.

Prosta regresja liniowa


Prosta regresja liniowa modeluje związki pomiędzy wielkością jednej zmiennej a wielkością drugiej,
np. jeśli X rośnie, Y również rośnie, lub jeśli X rośnie, Y maleje1. Korelacja jest kolejnym sposobem
pomiaru tego, jak dwie zmienne są ze sobą powiązane (patrz podrozdział „Korelacja” w rozdziale 1.).
Różnica jest następująca: korelacja mierzy siłę związku pomiędzy zmiennymi, a regresja określa
ilościowo naturę związku.

Równanie regresji
Prosta regresja liniowa szacuje, o ile zmieni się Y, jeśli X zmieni się o określoną wartość. Dla współ-
czynnika korelacji X i Y są zamienne. W przypadku regresji staramy się przewidzieć Y, wykorzy-
stując jego liniową zależność z X (tj. prostą):

𝑌 =𝑏 +𝑏 𝑋

1
Ta i kolejne części tego rozdziału wykorzystano za zgodą Petera Bruce’a, Andrew Bruce’a i Petera Gedecka, © 2020
Datastats LCC.

135

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące prostej regresji liniowej
Odpowiedź
Zmienna, którą staramy się prognozować.
Synonimy
zmienna zależna, zmienna y, cel, wynik
Zmienna niezależna
Zmienna wykorzystywana do prognozowania odpowiedzi.
Synonimy
zmienna x, cecha, atrybut, predyktor
Rekord
Wektor zmiennych niezależnych i wyników dla konkretnego pojedynczego przypadku.
Synonimy
wiersz, przypadek, instancja, przykład

Wyraz wolny
Wyraz wolny równania regresji — wartość zmiennej predykcyjnej, gdy X = 0.
Synonimy
b0, β0
Współczynnik regresji
Współczynnik kierunkowy równania regresji.
Synonimy
współczynnik kierunkowy, b1, β1, estymatory parametrów, wagi
Wartości aproksymowane
Oszacowanie Ŷi uzyskane na podstawie równania regresji.
Synonim
wartości prognozowane
Rezydua
Różnica pomiędzy wartościami obserwowanymi a wartościami dopasowanymi.
Synonim
błąd
Metoda najmniejszych kwadratów
Metoda dopasowania do krzywej regresji poprzez minimalizację sumy kwadratów rezyduów.
Synonimy
OLS (ang. ordinary least squares), regresja liniowa, metoda wyrównawcza Gaussa

136 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Czytamy to jako „Y równe b1 razy X plus stała b0”. Symbol b0 jest znany jako wyraz wolny (lub
stała) (ang. intercept, constatnt), a symbol b1 jest współczynnikiem kierunkowym (ang. slope) dla X.
Oba symbole pojawiają się w R jako współczynniki (ang. coefficients), chociaż w ogólnym zastoso-
waniu pojęcie współczynnika (ang. coefficient) jest zarezerwowane dla b1. Zmienna Y jest znana
pod nazwą odpowiedź (ang. response) lub zmienna zależna (ang. dependent variable), ponieważ
zależy od X. Zmienna X z kolei jest nazywana predyktorem (ang. predictor) lub zmienną nieza-
leżną (ang. independent variable). Społeczność uczenia maszynowego ma w zwyczaju używać in-
nych pojęć, nazywając Y celem (ang. target), a X wektorem cech (ang. feature vector). W dalszej
części książki będziemy wymiennie używać pojęć predyktor i cecha.
Załóżmy, że wykres punktowy na rysunku 4.1 przedstawia liczbę lat, przez jakie pracownik był
narażony na działanie pyłu bawełnianego (Exposure) względem wyniku pomiaru objętości jego
płuc (PEFR ang. peak expiratory flow rate, wskaźnik szczytowego przepływu wydechowego). W jaki
sposób PEFR jest powiązany z Exposure? Trudno to stwierdzić na podstawie samego rysunku.

Rysunek 4.1. Ekspozycja na bawełnę a pojemność płuc (PEFR)

Prosta regresja liniowa próbuje znaleźć najlepszą prostą oddającą PEFR w funkcji zmiennej predyk-
cyjnej Exposure (ekspozycja).
𝑃𝐸𝐹𝑅 = 𝑏 + 𝑏 𝐸𝑥𝑝𝑜𝑠𝑢𝑟𝑒

Funkcja lm w R może być użyta do dopasowania regresją liniową.


model <- lm(PEFR ~ Exposure, data=lung)

lm oznacza model liniowy (ang. linear model), a symbol ~ określa predykcję PEFR na podstawie
zmiennej Exposure. Dzięki takiej definicji modelu automatycznie zostaje uwzględniony i dopaso-
wany punkt przecięcia z osią x. Jeżeli chcesz wykluczyć ten punkt z modelu, musisz napisać defini-
cję modelu w następujący sposób:
𝑃𝐸𝐹𝑅 ∼ 𝐸𝑥𝑝𝑜𝑠𝑢𝑟𝑒 − 1

Prosta regresja liniowa | 137

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Wywołując obiekt model, tworzy się następujące wyjście:
Call:
lm(formula = PEFR ~ Exposure, data = lung)

Coefficients:
(Intercept) Exposure
424.583 -4.185

Wyraz wolny, lub b0, wynosi 424,583 i może być interpretowany jako przewidywana wartość
PEFR dla pracowników z zerową ekspozycją. Współczynnik regresji, lub b1, można interpreto-
wać następująco: każdy kolejny rok ekspozycji pracownika na pył bawełniany zmniejsza wynik
PEFR o 4,185.

Możemy w Pythonie wykorzystać klasę LinearRegression z pakietu scikit-learn (pakiet


statsmodels zawiera implementację przypominającą używaną w R (sm.OLS); użyjemy jej w dalszej
części rozdziału):
predictors = ['Exposure']
outcome = 'PEFR'

model = LinearRegression()
model.fit(lung[predictors], lung[outcome])

print(f'Punkt przecięcia z osią x: {model.intercept_:.3f}')


print(f'Współczynnik Exposure: {model.coef_[0]:.3f}')

Prosta regresji z powyższego modelu jest przedstawiona na rysunku 4.2.

Rysunek 4.2. Współczynnik kierunkowy i wyraz wolny dla regresji dopasowanej do danych z płuc

138 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Dopasowanie wartości i rezydua
Ważnymi pojęciami w analizie regresji są wartości aproksymowane (ang. fitted values; przewidy-
wania) i rezydua (ang. residuals; błędy predykcji). W ogólnym przypadku dane nie układają się
idealnie w prostą, dlatego równanie regresji powinno zawierać precyzyjne określenie błędu ei:
𝑌 =𝑏 +𝑏 𝑋 +𝑒
Wartości aproksymowane, nazywane również prognozowanymi (ang. predicted), są standardowo
oznaczane przez Ŷi (Y z daszkiem) i opisywane równaniem:
𝑌 =𝑏 +𝑏 𝑋
Zapis bƹ 0 i bƹ 1 wskazuje na to, że współczynniki są szacowane, w przeciwieństwie do tych znanych.

Zapis „z daszkiem”: wartości szacowane a wartości znane


Zapis „z daszkiem” jest wykorzystywany do rozróżnienia wartości szacowanych i war-
tości znanych. Symbol bǻ („b z daszkiem”) jest oszacowaniem znanego parametru b.
Dlaczego statystycy rozróżniają wartości szacowane i wartości faktyczne? Oszacowa-
nie niesie za sobą niepewność, a wartość faktyczna jest pewna2.

Obliczamy rezydua eˆi poprzez odjęcie wartości prognozowanych na podstawie wartości oryginal-
nych:
𝑒̂ = 𝑌 − 𝑌
W R możemy uzyskać wartości prognozowane i rezydua, wykorzystując funkcje predict i residuals:
fitted <- predict(model)
resid <- residuals(model)

Za pomocą modelu LinearRegression możemy użyć metody predict na danych uczących po to,
aby uzyskać wartości dopasowane (fitted) i rezydua (residuals). Jak się przekonamy, ten ogólny
mechanizm jest stosowany we wszystkich modelach z pakietu scikit-learn:
fitted = model.predict(lung[predictors])
residuals = lung[outcome] - fitted

Rysunek 4.3 przedstawia rezydua dla prostej regresji dopasowanej do danych z wyników badania
płuc. Reszty są długością pionowych przerywanych linii od punktu do prostej.

Metoda najmniejszych kwadratów


W jaki sposób model jest dopasowywany do danych? W przypadku jasnych związków możesz wy-
obrazić sobie dopasowanie prostej ręcznie. W praktyce prosta regresji jest estymatorem, który mi-
nimalizuje sumę kwadratów rezyduów (RSS, ang. residual sum of squares):

𝑅𝑆𝑆 = 𝑌 −𝑌 = 𝑌 −𝑏 −𝑏 𝑋

2
W statystyce bayesowskiej przyjmuje się, że wartość prawdziwa jest zmienną losową z określonym rozkładem. W tym
kontekście, zamiast szacowania nieznanych parametrów, mamy rozkłady a priori (wstępny) i a posteriori (z następstwa).

Prosta regresja liniowa | 139

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 4.3. Rezydua dla prostej regresji (w celu zmieszczenia wszystkich danych na osi y jest inna skala niż
na rysunku 4.2; wskazuje to na inny współczynnik kierunkowy)

Oszacowane bƹ 0 i bƹ 1 są wartościami, które minimalizują wartość RSS.


Metoda minimalizacji sumy kwadratów rezyduów jest nazywana regresją za pomocą metody naj-
mniejszych kwadratów (również regresją OLS, ang. ordinary least squares). Autorstwo metody jest
często przypisywane niemieckiemu matematykowi Carlowi Friedrichowi Gaussowi, jednak jako
pierwszy opublikował ją w 1805 r. francuski matematyk Adrien-Marie Legendre. Regresję metodą
najmniejszych kwadratów można obliczyć szybko i łatwo za pomocą standardowego oprogramo-
wania statystycznego.
Patrząc historycznie, można stwierdzić, że wygoda obliczeń jest jednym z powodów rozprzestrze-
nienia się metody najmniejszych kwadratów w regresji. W erze big data szybkość obliczeń jest wciąż
ważnym czynnikiem. Metoda najmniejszych kwadratów, tak jak średnia (patrz punkt „Mediana
i estymatory odporne” w rozdziale 1.), jest wrażliwa na wartości odstające; sprawiają one problem
jedynie w zbiorach małych i średniej wielkości. W podpunkcie „Wartości odstające” w dalszej części
tego rozdziału omówiono wpływ wartości odstających na wynik regresji.

Terminologia związana z regresją


Gdy analitycy i badacze używają pojęcia regresji, najczęściej odnosi się ono do regresji
liniowej, czyli stworzenia modelu liniowego, tłumaczącego związki pomiędzy zmienną
predykcyjną a numerycznymi zmiennymi wynikowymi. Formalnie regresja zawiera
również modele nieliniowe, które opisują związki pomiędzy zmiennymi predykcyj-
nymi a wynikami. W społeczności zajmującej się uczeniem maszynowym pojęcie to
jest wykorzystywane okazjonalnie i odnosi się ono do użycia dowolnego modelu pre-
dykcyjnego, który stworzy wyniki numeryczne (w przeciwieństwie do metod klasy-
fikacji, przewidujących wyniki binarne lub kategoryzowane).

140 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Predykcja a objaśnienie (profilowanie)
Historycznie rzecz ujmując, podstawowym powodem użycia regresji jest uchwycenie możliwej li-
niowej zależności pomiędzy zmienną predykcyjną a wynikiem. Celem jest zrozumienie relacji
i wytłumaczenie jej przy wykorzystaniu danych, które regresja ma dopasować. W tym przypadku
główny nacisk był położony na oszacowanie współczynnika kierunkowego równania regresji bƹ .
Ekonomiści chcieliby poznać relacje pomiędzy wydatkami konsumentów a wzrostem PKB. Pra-
cownicy publicznej ochrony zdrowia mogą chcieć wiedzieć, czy publiczna kampania informacyjna
promująca bezpieczne zachowania seksualne jest efektywna. Dla tak postawionych problemów ce-
lem nie jest przewidywanie poszczególnych przypadków, tylko raczej ogólne zrozumienie relacji
pomiędzy zmiennymi.
Wraz z nastaniem ery big data regresja zaczęła być szeroko wykorzystywana do tworzenia modeli
prognozujących poszczególne wyniki dla nowych danych (tj. modeli predykcyjnych) zamiast obja-
śniania już zebranych danych. W tym przypadku interesujące są przede wszystkim wartości dopa-
sowane Ŷ. W marketingu regresja może być użyta do przewidzenia zmian dochodów w odpowiedzi
na rozmiar kampanii. Uniwersytety wykorzystują regresję do przewidywania ocen studentów na
podstawie wyników egzaminów SAT (ang. Scholastic Assessment Test, ustandaryzowany test dla
uczniów szkół średnich w Stanach Zjednoczonych).
Model regresji, który dobrze dopasowuje dane, jest stworzony w taki sposób, że zmiana X prowadzi
do zmiany Y. Równanie regresji samo w sobie nie dowodzi jednak przyczynowości. Wnioski o po-
wodach muszą wynikać z szerszego zrozumienia tych zależności. Na przykład równanie regresji
może wskazać na ewidentny związek pomiędzy liczbą kliknięć w stronę a liczbą zakupów. To nasza
wiedza o procesie marketingowym, a nie równanie regresji prowadzi nas do wniosku, że kliknięcia
w reklamę prowadzą do sprzedaży, nie odwrotnie.

Główne zasady
• Równanie regresji modeluje związek pomiędzy zmienną wynikową Y a zmienną predykcyjną
X w postaci zależności liniowej.
• Model regresji dostarcza wartości aproksymowanych i rezyduów — predykcji odpowiedzi
i błędów tej predykcji.
• Modele regresji są standardowo dopasowywane metodą najmniejszych kwadratów.

• Regresja jest używana zarówno do predykcji, jak i objaśniania.

Dla pogłębienia wiedzy


W celu dokładnego zrozumienia różnic pomiędzy predykcją a objaśnianiem przejrzyj artykuł Galit
Shmueli To Explain or to Predict, zamieszczony pod adresem: https://projecteuclid.org/euclid.ss/
1294167961.

Prosta regresja liniowa | 141

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Regresja wieloraka
Gdy istnieje wiele predyktorów, równanie jest w prosty sposób rozszerzane, by można było je
uwzględnić:
𝑌 = 𝑏 + 𝑏 𝑋 + 𝑏 𝑋 +. . . +𝑏 𝑋 + 𝑒

Zamiast równania prostej mamy teraz płaszczyznę w przestrzeni wielowymiarowej — związek po-
między każdym współczynnikiem i odpowiadającą mu zmienną (cechą) jest liniowy.

Kluczowe pojęcia dotyczące regresji wielorakiej


Pierwiastek błędu średniokwadratowego
Pierwiastek kwadratowy z błędu średniokwadratowego (najczęściej używana metryka do po-
równywania modeli regresji).
Synonim
RMSE (ang. root mean square error)

Błąd standardowy reszt


To samo co pierwiastek błędu średniokwadratowego, ale w odniesieniu do stopni swobody.
Synonim
błąd standardowy rezyduów

R-kwadrat
Odsetek wariancji wyjaśniający model, wartość z przedziału 0, 1.
Synonimy
współczynnik determinacji, R2

Statystyka t
Współczynnik dla predyktora, podzielony przez błąd standardowy dla tego współczynnika,
metryka do porównywania znaczenia zmiennych w modelu. Zob. podrozdział „Test t” w roz-
dziale 3.

Regresja ważona
Regresja z różnymi wagami dla rekordów.

Wszystkie koncepcje stosowane w regresji liniowej, takie jak dopasowanie metodą najmniejszych
kwadratów, definicje wartości aproksymowanych i rezyduów, można rozszerzyć na potrzeby re-
gresji wielorakiej. Przykładowo wartości aproksymowane są opisane wzorem:

𝑌 =𝑏 +𝑏 𝑋 , + 𝑏 𝑋 , +. . . +𝑏 𝑋 ,

142 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Przykład: wartość domów w King County
Przykładem użycia wielokrotnej regresji liniowej jest oszacowanie wartości domów. Rzeczoznawcy
z County muszą oszacować wartość domu na potrzeby określenia podatków. Nabywcy na rynku nieru-
chomości i profesjonaliści konsultują się ze stronami internetowymi typu Zillow (https://zillow.com/)
w celu ustalenia uczciwych cen. Poniżej przedstawiono kilka wierszy danych dotyczących domów
z King County (Seattle, Waszyngton) z house data.frame:
head(house[, c('AdjSalePrice', 'SqFtTotLiving', 'SqFtLot', 'Bathrooms',
'Bedrooms', 'BldgGrade')])
Source: local data frame [6 x 6]
AdjSalePrice SqFtTotLiving SqFtLot Bathrooms Bedrooms BldgGrade
(dbl) (int) (int) (dbl) (int) (int)
1 300805 2400 9373 3.00 6 7
2 1076162 3764 20156 3.75 4 10
3 761805 2060 26036 1.75 4 8
4 442065 3200 8618 3.75 5 7
5 297065 1720 8620 1.75 4 7
6 411781 930 1012 1.50 2 8

Metoda head ramki danych pandas służy do wyświetlania pierwszych rzędów:


subset = ['AdjSalePrice', 'SqFtTotLiving', 'SqFtLot', 'Bathrooms',
'Bedrooms', 'BldgGrade']
house[subset].head()

Celem jest uzyskanie prognozy ceny sprzedaży na podstawie innych zmiennych. Funkcja lm obsłu-
guje regresję wieloraką poprzez dodanie kolejnych pojęć po prawej stronie równania; argument
na.action=na.omit powoduje, że model pomija rekordy, w których brakuje wartości:
> house_lm <- lm(AdjSalePrice ~ SqFtTotLiving + SqFtLot + Bathrooms +
Bedrooms + BldgGrade,
data=house, na.action=na.omit)

Klasa LinearRegression może zostać użyta również w zadaniu wielokrotnej regresji liniowej:
predictors = ['SqFtTotLiving', 'SqFtLot', 'Bathrooms', 'Bedrooms', 'BldgGrade']
outcome = 'AdjSalePrice'

house_lm = LinearRegression()
house_lm.fit(house[predictors], house[outcome])

Wyświetlenie obiektu house_lm daje następujący wynik:


house_lm

Call:
lm(formula = AdjSalePrice ~ SqFtTotLiving + SqFtLot + Bathrooms +
Bedrooms + BldgGrade, data = house, na.action = na.omit)

Coefficients:
(Intercept) SqFtTotLiving SqFtLot Bathrooms Bedrooms
-5.219e+05 2.288e+02 -6.047e-02 -1.944e+04 -4.777e+04
BldgGrade
1.061e+05

Regresja wieloraka | 143

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W modelu LinearRegression punkt przecięcia z osią x i współczynniki są polami odpowiednio:
intercept_ i coef_ dopasowanego modelu:
print(f'Punkt przecięcia z osią x: {house_lm.intercept_:.3f}')
print('Współczynniki:')
for name, coef in zip(predictors, house_lm.coef_):
print(f' {name}: {coef}')

Interpretacja współczynników jest podobna jak w regresji liniowej: prognozowana wartość Ŷ zmie-
nia się o współczynnik bi dla każdej zmiany o jednostkę Xj, pod warunkiem że pozostałe zmienne
Xk dla k ≠ j pozostają takie same. Na przykład każda dodatkowa jednostka powierzchni domu pod-
nosi szacowaną wartość o około 229 $; dodanie 1000 stóp kwadratowych powoduje wzrost wartości
o 228 800 $.

Ocena modelu
Najważniejszą metryką wydajności z perspektywy data science jest pierwiastek błędu średniokwa-
dratowego (RMSE, ang. root mean squared error). RMSE jest pierwiastkiem kwadratowym ze śred-
niej kwadratów błędów dla wartości prognozowanych ŷi:

∑ (𝑦 − 𝑦 )
𝑅𝑀𝑆𝐸 =
𝑛

Mierzy on ogólną dokładność modelu i stanowi podstawę porównania z innymi modelami (włą-
czając w to dopasowanie modelu wykorzystujące techniki uczenia maszynowego). Podobny do
RMSE jest błąd standardowy reszt (RSE, ang. residua standard error). W tym przypadku mamy
p predyktorów, a RSE jest opisane jako:

∑ (𝑦 − 𝑦 )
𝑅𝑆𝐸 =
𝑛−𝑝−1

Jedyną różnicę stanowi mianownik w postaci stopni swobody, a nie liczby rekordów (patrz pod-
rozdział „Stopnie swobody” w rozdziale 3.). W praktyce dla regresji liniowej różnica pomiędzy
RMSE a RSE jest niewielka, zwłaszcza gdy metody stosowane są do dużych zbiorów danych.
Funkcja summary w R oblicza RSE, jak również inne metryki dla modelu regresji:
> summary(house_lm)

Call:
lm(formula = AdjSalePrice ~ SqFtTotLiving + SqFtLot + Bathrooms +
Bedrooms + BldgGrade, data = house, na.action = na.omit)

Residuals:
Min 1Q Median 3Q Max
-1199479 -118908 -20977 87435 9473035

Coefficients:
Estimate Std. Error t value Pr(>|t|)

144 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


(Intercept) -5.219e+05 1.565e+04 -33.342 < 2e-16 ***
SqFtTotLiving 2.288e+02 3.899e+00 58.694 < 2e-16 ***
SqFtLot -6.047e-02 6.118e-02 -0.988 0.323
Bathrooms -1.944e+04 3.625e+03 -5.363 8.27e-08 ***
Bedrooms -4.777e+04 2.490e+03 -19.187 < 2e-16 ***
BldgGrade 1.061e+05 2.396e+03 44.277 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 261300 on 22681 degrees of freedom
Multiple R-squared: 0.5406, Adjusted R-squared: 0.5405
F-statistic: 5338 on 5 and 22681 DF, p-value: < 2.2e-16

Pakiet scikit-learn zawiera wiele miar regresji i klasyfikacji. Skorzystamy z miary mean_squa
´red_error, aby obliczyć błąd RMSE, a także z miary r2_score w celu obliczenia współczynnika
determinacji:
fitted = house_lm.predict(house[predictors])
RMSE = np.sqrt(mean_squared_error(house[outcome], fitted))
r2 = r2_score(house[outcome], fitted)
print(f'RMSE: {RMSE:.0f}')
print(f'r2: {r2:.4f}')

Bardziej szczegółową analizę modelu regresji w Pythonie uzyskamy dzięki modułowi statsmodels:
model = sm.OLS(house[outcome], house[predictors].assign(const=1))
results = model.fit()
results.summary()

Metoda assign z pakietu pandas dodaje do predyktorów stałą kolumnę o wartości 1. Jest to wyma-
gane do modelowania punktu przecięcia z osią x.
Kolejną przydatną metryką, którą znajdziesz w wyniku działania programu, jest współczynnik de-
terminacji (ang. coefficient of determination), zwany również statystyką R-kwadrat (ang. R-squared)
lub R2. Zakres wartości dla R-kwadrat to od 0 do 1, co mierzy proporcje zróżnicowania danych wyja-
śnianych za pomocą modelu. Jest to stosowane głównie w objaśniającym podejściu do regresji, w którym
celem jest określenie, jak dobrze model dopasowuje się do danych. Wzór na R2 jest następujący:

∑ (𝑦 − 𝑦 )
𝑅 =1−
∑ (𝑦 − 𝑦̄ )

Mianownik jest proporcjonalny do wariancji z Y. Wynik z R zawiera również skorygowany


R-kwadrat (ang. adjusted R-squared), który uwzględnia stopnie swobody i skutecznie karze za do-
dawanie predyktorów do modelu. Rzadko jednak jest on znacząco różny od współczynnika R-kwa-
drat w regresji wielokrotnej wykorzystującej duże zestawy danych.
Wraz z oszacowanymi współczynnikami R i pakiet statsmodels przedstawiają również błąd stan-
dardowy dla tych współczynników (SE, ang. standard error) i statystykę t (ang. t-statistic):

𝑏
𝑡 =
𝑆𝐸(𝑏)

Regresja wieloraka | 145

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Statystyka t i jej obraz lustrzany, p-wartość, mierzą, w jakim stopniu dany współczynnik jest
„istotny statystycznie” — tj. znajduje się poza zakresem, który może wynikać z losowych fluktuacji
predyktorów i zmiennych celu. Im wyższa jest statystyka t (a niższa p-wartość), tym bardziej pre-
dyktor jest istotny statystycznie. Ponieważ prostota jest bardzo pożądaną cechą modelu, wskazane
jest posiadanie narzędzi ułatwiających wybór zmiennych — będą nimi predyktory (patrz punkt
„Dobór modelu i regresja krokowa” w dalszej części tego rozdziału).

R i inne pakiety, jako dodatek do statystyki t, często przedstawiają również p-wartość


((Pr(>|t|) w wyniku R) i statystykę F. Specjaliści data science zazwyczaj nie anga-
żują się zbytnio w interpretację tych statystyk ani nie zagłębiają się w szczegóły za-
gadnienia istotności statystycznej. Specjaliści data science skupiają się głównie na
statystyce t jako praktycznym przewodniku po predyktorach wartych uwzględnienia
w modelu. Wysoka wartość statystyki t (i p-wartość bliska 0) wskazuje na to, że pre-
dyktor powinien pozostać w modelu, a bardzo niska wartość statystyki t wskazuje na
to, że predyktor może być pominięty (patrz punkt „p-wartość” w rozdziale 3.).

Kroswalidacja
Klasyczne metryki regresji statystycznej (R2, statystyka F i p-wartość) są metrykami „w-próbie” —
są stosowane na tych samych danych, na podstawie których dopasowano model. Zapewne prze-
czuwasz już, że ma sens pozostawienie części oryginalnych danych i niewykorzystanie ich do do-
pasowania modelu, a następnie zastosowanie uzyskanego modelu do pozostawionych danych, aby
sprawdzić, jak dobry jest model. Normalnie używa się większej części danych do dopasowania mo-
delu, a następnie mniejszej części do jego testowania.
Idea walidacji „spoza próby” nie jest nowa, ale była praktycznie bezużyteczna aż do momentu, gdy
stały się dostępne duże zbiory danych. Mając do dyspozycji mały zbiór danych, analityk zazwyczaj
chce użyć wszystkich danych, by otrzymać najlepiej dopasowany model.
Wykorzystując podział próby, narażasz się na niepewność, jaka wynika ze zmienności pozostawio-
nej mniejszej części. Jak wyglądałoby oszacowanie, gdybyś wybrał inną próbę do testów?
Kroswalidacja rozszerza ideę podziału próby na wiele sekwencyjnych podziałów. Algorytm dla
podstawowej k-krotnej kroswalidacji (ang. k-fold cross-validation) jest następujący:
1. Oddziel 1/k danych jako próbę testową.
2. Wytrenuj model na pozostałych danych.
3. Zastosuj model na próbie testowej i zapisz potrzebne metryki oceniające model.
4. Zwróć do puli pierwsze 1/k danych i wybierz kolejne 1/k danych (z pominięciem tych już wy-
korzystanych).
5. Powtórz kroki 2. i 3.
6. Powtarzaj je tak długo, aż każdy rekord będzie wykorzystany w próbie testowej.
7. Uśrednij bądź powiąż w inny sposób metryki opisujące model.
Podział danych na próbę uczącą i próbę testową jest nazywany krzyżowaniem (ang. fold).

146 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Dobór modelu i regresja krokowa
Dla niektórych problemów można wykorzystać wiele zmiennych jako predyktory w regresji.
Na przykład w przewidywaniu wartości domu dodatkowymi zmiennymi mogą być rozmiar piw-
nicy czy rok wybudowania. W R istnieje prosta metoda do dołączania kolejnych elementów do
równania regresji:
house_full <- lm(AdjSalePrice ~ SqFtTotLiving + SqFtLot + Bathrooms +
Bedrooms + BldgGrade + PropertyType + NbrLivingUnits +
SqFtFinBasement + YrBuilt + YrRenovated + NewConstruction,
data=house, na.action=na.omit)

W Pythonie musimy przekształcić zmienne kategoryzujące i logiczne w liczby:


predictors = ['SqFtTotLiving', 'SqFtLot', 'Bathrooms', 'Bedrooms', 'BldgGrade',
'PropertyType', 'NbrLivingUnits', 'SqFtFinBasement', 'YrBuilt',
'YrRenovated', 'NewConstruction']

X = pd.get_dummies(house[predictors], drop_first=True)
X['NewConstruction'] = [1 if nc else 0 for nc in X['NewConstruction']]

house_full = sm.OLS(house[outcome], X.assign(const=1))


results = house_full.fit()
results.summary()

Dodawanie kolejnych zmiennych nie oznacza koniecznie lepszego modelu. Statystycy wykorzy-
stują zasadę brzytwy Ockhama jako podstawę tworzenia modeli: wszystkie cechy są równe, prostszy
model ma przewagę nad bardziej skomplikowanym.

Dołączanie dodatkowych zmiennych zawsze powoduje redukcję RMSE i wzrost R2 dla danych
uczących. Dlatego nie są one odpowiednimi wskazówkami w procesie podejmowania decyzji o mo-
delu. Jednym ze sposobów uwzględnienia złożoności modelu jest użycie skorygowanego współ-
czynnika R2:

𝑛−1
𝑅 . = 1 − (1 − 𝑅 )
𝑛−𝑃−1

Parametr n oznacza tu liczbę rekordów, a P określa liczbę zmiennych modelu.

W latach 70. ubiegłego wieku Hirotugu Akaike, szanowany japoński statystyk, rozwinął metrykę
nazywaną AIC (ang. Akaike’s Information Criteria, kryterium informacyjne Akaikego), która karze
dodawanie kolejnych elementów do modelu. W przypadku regresji AIC przyjmuje formę:

𝐴𝐼𝐶 = 2𝑃 + 𝑛 𝑙𝑜𝑔( 𝑅𝑆𝑆/𝑛)

gdzie P jest liczbą zmiennych, a n liczbą rekordów. Celem jest znalezienie modelu, który minima-
lizuje AIC; modele z k dodatkowymi zmiennymi są karane przez 2k.

Regresja wieloraka | 147

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


AIC, BIC i Cp Mallowsa
Wzór opisujący AIC może się wydawać tajemniczy, ale w rzeczywistości jest oparty
na asymptotycznych wynikach teorii informacji. Poniżej podano kilka wariantów AIC:
• AICc: wariant AIC z poprawką dla małych prób.

• BIC (ang. Bayesian information criteria, bayesowskie kryterium informacyjne):


podobne do AIC, ale z większą karą za dodatkowe zmienne w modelu.
• Cp Mallowsa: wariant AIC rozwinięty przez Collina Mallowsa.

Wskaźniki te są zazwyczaj uznawane za miary „wewnątrz próby” (tzn. obliczane na


danych uczących), a specjaliści data science wykorzystujący odłożone dane do oceny
modelu zazwyczaj nie muszą się przejmować różnicami pomiędzy tymi wskaźnikami
ani stojącą za nimi teorią.

Jak znaleźć model z minimalnym AIC lub maksymalnym skorygowanym współczynnikiem R2?
Jednym ze sposobów jest przeszukanie wszystkich możliwych modeli, nazywane metodą wszyst-
kich możliwych podzbiorów regresji (ang. all subset regression). Jest to wymagające obliczeniowo
i niewykonalne przy rozwiązywaniu problemów dla dużych zbiorów danych z wieloma zmiennymi.
Atrakcyjną alternatywą jest regresja krokowa (ang. stepwise regression). Na początku może imple-
mentować pełny model i stopniowo odrzucać zmienne niemające znaczącego wpływu. Jest to tzw.
eliminacja wsteczna (ang. backward elimination). Ewentualnie może zaimplementować najpierw
stały model i systematycznie dodawać kolejne zmienne (wprowadzanie postępujące — ang. for-
ward selection). Istnieje także trzecie rozwiązanie, w którym z sukcesem dodajemy i odrzucamy
predyktory w celu znalezienia modelu z niskim AIC. Dostępny w R pakiet MASS, stworzony przez
Venablesa i Ripleya, zawiera funkcję do regresji krokowej, nazywaną stepAIC:
library(MASS)
step_lm <- stepAIC(house_full, direction="both")
step_lm

Call:
lm(formula = AdjSalePrice ~ SqFtTotLiving + Bathrooms + Bedrooms +
BldgGrade + PropertyType + SqFtFinBasement + YrBuilt, data = house,
na.action = na.omit)

Coefficients:
(Intercept) SqFtTotLiving
6.179e+06 1.993e+02
Bathrooms Bedrooms
4.240e+04 -5.195e+04
BldgGrade PropertyTypeSingle Family
1.372e+05 2.291e+04
PropertyTypeTownhouse SqFtFinBasement
8.448e+04 7.047e+00
YrBuilt
-3.565e+03

Moduł scikit-learn nie zawiera implementacji regresji krokowej. Zaimplementowaliśmy funkcje


stepwise_selection, forward_selection i backward_elimination w naszym pakiecie dbma:

148 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


y = house[outcome]

def train_model(variables):
if len(variables) == 0:
return None
model = LinearRegression()
model.fit(X[variables], y)
return model

def score_model(model, variables):


if len(variables) == 0:
return AIC_score(y, [y.mean()] * len(y), model, df=1)
return AIC_score(y, model.predict(X[variables]), model)

best_model, best_variables = stepwise_selection(X.columns, train_model,


score_model, verbose=True)
print(f'Punkt przecięcia z osią x: {best_model.intercept_:.3f}')
print('Współczynniki:')
for name, coef in zip(best_variables, best_model.coef_):
print(f' {name}: {coef}')

Definiuje funkcję zwracającą dopasowany model dla danego zbioru zmiennych.


Definiuje funkcję zwracającą wynik dla danego modelu i zbioru zmiennych. W tym przypadku
wykorzystujemy miarę AIC_score zaimplementowaną w pakiecie dmba.
Funkcja wybrała model, w którym nie uwzględniono kilku zmiennych z house_full: SqFtLot,
NbrLivingUnits, YrRenovated i NewConstruction.

Jeszcze prostsza jest selekcja w przód (ang. forward selection) lub selekcja wstecz (ang. backward
selection). W selekcji w przód zaczynasz bez predyktorów i dodajesz je pojedynczo, w każdym
kroku dodając predyktor z największym udziałem w R2 i zatrzymując się, gdy kolejny udział nie
jest już istotny statystycznie. W selekcji wstecz lub eliminacji wstecz (ang. backward elimination)
zaczynasz z pełnym modelem i eliminujesz predyktory nieistotne statystycznie tak długo, aż uzy-
skasz model, w którym wszystkie predyktory będą istotne statystycznie.
Regresja z karą (ang. penalized regression) jest w swoim założeniu podobna do AIC. Zamiast bez-
pośrednio szukać w dyskretnym zbiorze modeli, równanie dopasowujące model zawiera ograni-
czenia, które karzą model za zbyt wiele zmiennych (parametrów). Zamiast całkowitej eliminacji
predyktorów — jak w selekcji w przód i selekcji wstecz — regresja z karą wprowadza karę poprzez
redukcję współczynników, w niektórych przypadkach do około zera. Podobne do metody regresji
z karą są regresja grzbietowa (ang. ridge regression) i regresja asso (ang. lasso regression).
Regresja krokowa i wszystkie jej pochodne są metodami wewnątrz próby, oceniającymi i dostraja-
jącymi model. Oznacza to, że selekcja modelu może być narażona na przetrenowanie (dopasowanie
modelu do szumu w danych) i może nie sprawdzać się tak samo dobrze przy nowych danych. Jedną
z najpopularniejszych metod zapobiegania temu jest wykorzystanie kroswalidacji do sprawdzenia
modelu. W regresji liniowej przeuczenie nie jest aż tak częstym problemem z uwagi na prostą (liniową)
strukturę globalną narzucaną danym. Dla bardziej wyszukanych typów modeli, w szczególności
procedur iteracyjnych, które dopasowują się do lokalnej struktury danych, kroswalidacja jest bar-
dzo ważnym narzędziem (patrz punkt „Kroswalidacja” we wcześniejszej części tego rozdziału).

Regresja wieloraka | 149

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Regresja ważona
Regresja ważona jest wykorzystywana przez statystyków w wielu przypadkach, w szczególności jest
ważna w analizie badań złożonych. Specjaliści data science mogą uznać regresję ważoną za uży-
teczną w dwóch przypadkach:
• Podczas dobierania wag równych odwróconej wariancji, gdy różne obserwacje są mierzone
z różną precyzją; te o większej wariancji otrzymują mniejsze wagi.
• Podczas analizy danych, w których rzędy reprezentują wiele przypadków; wagi zmiennych ko-
dują, jak wiele oryginalnych obserwacji reprezentuje każdy wiersz.
Dla przykładu w przypadku danych dotyczących domów starsze transakcje są mniej wiarygodne
niż nowsze. Wykorzystując DocumentDate do określenia roku sprzedaży, możemy obliczyć wagi
(Weight) jako liczbę lat począwszy od roku 2005 (data rozpoczęcia).
R
library(lubridate)
house$Year = year(house$DocumentDate)
house$Weight = house$Year - 2005

Python
house['Year'] = [int(date.split('-')[0]) for date in house.DocumentDate]
house['Weight'] = house.Year - 2005

Możemy obliczyć regresję ważoną za pomocą funkcji lm z argumentem weight.


house_wt <- lm(AdjSalePrice ~ SqFtTotLiving + SqFtLot + Bathrooms +
Bedrooms + BldgGrade,
data=house, weight=Weight)
round(cbind(house_lm=house_lm$coefficients,
house_wt=house_wt$coefficients), digits=3)

house_lm house_wt
(Intercept) -521871.368 -584189.329
SqFtTotLiving 228.831 245.024
SqFtLot -0.060 -0.292
Bathrooms -19442.840 -26085.970
Bedrooms -47769.955 -53608.876
BldgGrade 106106.963 115242.435

Współczynniki w regresji ważonej nieznacznie różnią się od tych w oryginalnej regresji.


Większość modeli z pakietu scikit-learn przyjmuje wagi jako argument sample_weight w wywo-
łaniu metody fit:
predictors = ['SqFtTotLiving', 'SqFtLot', 'Bathrooms', 'Bedrooms', 'BldgGrade']
outcome = 'AdjSalePrice'

house_wt = LinearRegression()
house_wt.fit(house[predictors], house[outcome], sample_weight=house.Weight)

150 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Główne zasady
• Regresja wieloraka modeluje związki pomiędzy zmienną zależną Y a wieloma predyktorami
X1, …, Xp.
• Najważniejszymi metrykami do ewaluacji modelu są pierwiastek błędu średniokwadrato-
wego (RMSE) i R-kwadrat (R2).
• Błąd standardowy dla współczynników może być użyty do pomiaru wiarygodności udziału
zmiennej w modelu.
• Regresja krokowa jest metodą do automatycznego określania, która zmienna powinna być
zawarta w modelu.
• Regresja ważona jest używana do nadawania poszczególnym rekordom mniejszej lub więk-
szej wagi — oznacza to jej mniejszy lub większy wpływ na dopasowywane równanie.

Dla pogłębienia wiedzy


Doskonałą analizę sprawdzianu krzyżowego i randomizacji można znaleźć w książce An Introduc-
tion to Statistical Learning autorstwa Garetha Jamesa, Danieli Witten, Trevora Hastiego i Roberta
Tibshiraniego (Springer, 2013).

Predykcja z wykorzystaniem regresji


Podstawowym powodem użycia regresji w data science jest predykcja. Należy pamiętać, że regresja,
jako stara i uznana metoda statystyczna, posiada pewien „bagaż”, który jest bardziej istotny dla
tradycyjnej roli narzędzia modelowania eksploracyjnego niż dla predykcji.

Kluczowe pojęcia dotyczące predykcji z wykorzystaniem regresji


Przedział predykcji
Przedział niepewności wokół pojedynczej wartości prognozowanej.

Ekstrapolacja
Rozszerzenie modelu poza zakres danych wykorzystywanych do jego dopasowania.

Niebezpieczeństwa związane z ekstrapolacją


Modele regresji nie powinny być wykorzystywane do ekstrapolacji poza zakres posiadanych da-
nych (nie licząc stosowania regresji w prognozowaniu szeregów czasowych). Model jest poprawny
jedynie dla wartości predykcyjnych, dla których dane przyjmują odpowiednie wartości (nawet
w przypadku, gdy te odpowiednie dane są dostępne, mogą istnieć inne problemy; patrz podrozdział
„Diagnostyka regresji” w dalszej części tego rozdziału). Jako przypadek ekstremalny załóżmy, że
model_lm jest wykorzystywany do predykcji wartości działki o powierzchni 5000 stóp kwadratowych.
W takiej sytuacji wszystkie predyktory powiązane z budynkiem będą miały wartość 0, a równanie

Predykcja z wykorzystaniem regresji | 151

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


regresji dostarczy absurdalnej wartości –521 900+5 000∙(–0,0605) = –522 202$. Dlaczego tak się
stanie? Dane zawierają jedynie działki z budynkami — nie ma danych dotyczących pustych działek.
W efekcie model nie ma wystarczających informacji, by móc przewidzieć cenę pustej działki.

Przedziały ufności i predykcji


Wiele statystyk wymaga zrozumienia i pomiaru zmienności (niepewności). Statystyka t i p-wartość
podawane jako wynik regresji zajmują się tym w sposób formalny, co czasem jest praktyczniejsze
przy wyborze zmiennych (patrz punkt „Ocena modelu” we wcześniejszej części tego rozdziału).
Użyteczną metryką jest również przedział ufności, który stanowi przedział niepewności wokół
współczynników regresji i predykcji. Prostą metodą ułatwiającą zrozumienie tego zagadnienia jest
użycie bootstrapu (więcej szczegółów na temat procedury bootstrapu znajdziesz w podrozdziale
„Próby bootstrapowe” w rozdziale 2.). Najczęstszym przedziałem ufności dla regresji, jaki możesz
napotkać w wyniku z oprogramowania, jest ten dla parametrów regresji (współczynników). Poniżej
zaprezentowano algorytm bootstrapowy generujący przedziały ufności dla parametrów regresji
(współczynników) dla zbioru danych z P predyktorami i n rekordami (wierszami):
1. Załóżmy, że każdy wiersz (włącznie ze zmienną wyjściową) jest pojedynczym „biletem”, a każdy
z n biletów umieszczamy w urnie.
2. Wylosuj bilet, zapisz wartości i odłóż bilet do urny.
3. Powtórz poprzedni krok 2n razy; teraz masz jedną próbę bootstrapową.
4. Dopasuj model regresji do próby bootstrapowej i zapisz oszacowane współczynniki.
5. Powtórz kroki 2. – 4., powiedzmy, 1000 razy.
6. Teraz masz 1000 wartości bootstrapowych dla każdego współczynnika; znajdź odpowiednie
percentyle dla każdego z nich (np. 5. i 95. dla 90-procentowego przedziału ufności).
Możesz wykorzystać funkcję R Boot do wygenerowania bootstrapowych przedziałów ufności dla
współczynników albo możesz po prostu użyć przedziałów opartych na wzorach, które są typowym
wynikiem w R. Znaczenie koncepcyjne i interpretacja są jednakowe i niekoniecznie kluczowe dla
specjalisty data science, ponieważ dotyczą one współczynników regresji. Bardziej interesujące z punktu
widzenia data science są przedziały wokół prognozowanych wartości y (Ŷi). Niepewność wokół Ŷi
pochodzi z dwóch źródeł:
• niepewności co do istotności wartości prognozowanych i ich współczynników (patrz przedsta-
wiony wcześniej algorytm bootstrapu);
• dodatkowego błędu charakterystycznego dla poszczególnych punktów w danych.
Błąd poszczególnych punktów danych może być potraktowany w następujący sposób: nawet jeśli znamy
równanie regresji (np. jeśli mamy ogromną liczbę rekordów do tworzenia modelu), faktyczny wy-
nik dla zadanego zbioru wartości predykcyjnych będzie się zmieniać. Na przykład niektóre domy
— każdy z 8 pokojami, z działką o powierzchni 6500 stóp kwadratowych, z 3 łazienkami i piwnicą
— mogą mieć różne ceny. Możemy modelować błąd indywidualny, uwzględniając reszty z wartości
dopasowanych. Algorytm bootstrapu modelujący zarówno błąd modelu regresji, jak i błąd poszcze-
gólnych punktów danych będzie wyglądał następująco:

152 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


1. Weź próbę bootstrapową z danych (sposób zrobienia tego wyjaśniono już wcześniej).
2. Dopasuj model regresji i spróbuj przewidzieć nowe wartości.
3. Weź losową, pojedynczą resztę z oryginalnego dopasowania regresji, dodaj ją do prognozowa-
nej wartości i zapisz wynik.
4. Powtórz kroki 1. – 3., powiedzmy, 1000 razy.
5. Znajdź percentyl 2,5 i percentyl 97,5 dla wyników.

Główne zasady
• Ekstrapolacja poza przedział danych może prowadzić do błędów.

• Przedziały ufności określają ilościowo niepewność wokół współczynników regresji.

• Przedziały predykcji określają ilościowo niepewność pojedynczej predykcji.

• Najczęściej oprogramowanie, także R, wykorzystując wzory, tworzy przedziały predykcji


i ufności w domyślnym lub określonym wyjściu.
• Próby bootstrapowe również mogą być wykorzystywane do uzyskiwania predykcji i prze-
działów ufności: ich interpretacja i idea są takie same jak w przypadku pozostałych metod.

Przedział predykcji czy przedział ufności?


Przedział przewidywania dotyczy niepewności wokół pojedynczej wartości, a prze-
dział ufności odnosi się do średniej lub innej statystyki obliczonej na podstawie wielu
wartości. W związku z tym przedział predykcji będzie zazwyczaj znacznie szerszy niż
przedział ufności dla tej samej wartości. Modelujemy ten błąd dla pojedynczej war-
tości w modelu bootstrapowym poprzez dobór poszczególnych rezyduów dołączo-
nych do przewidywanej wartości. Których powinieneś użyć? To zależy od kontekstu
i celu analizy, ale generalnie specjaliści data science interesują się specyficznymi po-
jedynczymi predykcjami, a więc bardziej odpowiedni będzie tu przewidywany prze-
dział predykcji. Użycie przedziału ufności wtedy, gdy powinieneś zastosować prze-
dział predykcji, znacznie obniża niepewność dla danej przewidywanej wartości.

Zmienne skategoryzowane w regresji


Zmienne skategoryzowane (czynniki) (ang. factor variables) przyjmują skończoną liczbę dyskret-
nych wartości. Na przykład powodem wzięcia pożyczki może być „konsolidacja długu”, „wesele”,
„samochód” itp. Zmienna binarna (tak/nie), nazywana również indykatorową (ang. indicator), jest
specjalnym przypadkiem zmiennej skategoryzowanej. Regresja wymaga numerycznych wejść,
w związku z czym zmienne skategoryzowane tylko w wersji zakodowanej mogą być wykorzystane
w modelu. Najczęstszym podejściem jest konwersja do zestawu binarnych zmiennych fikcyjnych
(ang. dummy).

Zmienne skategoryzowane w regresji | 153

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące zmiennych skategoryzowanych
Zmienna fikcyjna
Binarna zmienna 0-1, pochodząca od zakodowanych danych skategoryzowanych na potrzeby
regresji i innych modeli.

Kodowanie referencyjne
Najpopularniejszy typ kodowania wykorzystywany przez statystyków, w którym jeden poziom
czynnika jest uznawany za referencyjny, a pozostałe poziomy są do niego porównywane.

Kodowanie 1 z n
Powszechny typ kodowania wykorzystywany w uczeniu maszynowym, w którym zachowane
zostają wszystkie poziomy czynnika. Praktyczny dla niektórych algorytmów uczenia maszy-
nowego, nie jest odpowiedni dla regresji wielorakiej.
Synonim
gorącojedynkowe

Kodowanie odchyleń
Typ kodowania, który porównuje każdy poziom do ogólnej średniej jako poziomu referencyjnego.
Synonim
suma kontrastów

Zmienne fikcyjne
Dla danych dotyczących domów z King County istnieje zmienna skategoryzowana dla typu nieru-
chomości; niewielki podzbiór sześciu rekordów jest przedstawiony poniżej:
R
head(house[, 'PropertyType'])
Source: local data frame [6 x 1]

PropertyType
(fctr)
1 Multiplex
2 Single Family
3 Single Family
4 Single Family
5 Single Family
6 Townhouse

Python
house.PropertyType.head()

Istnieją trzy możliwe wartości: Multiplex, Single Family i Townhouse. Żeby wykorzystać je jako
zmienną skategoryzowaną, musimy przekonwertować ją do zestawu zmiennych binarnych.

154 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Wykorzystujemy do tego zmienną binarną dla każdej możliwej wartości zmiennej oryginalnej.
W R używamy funkcji model.matrix3:
prop_type_dummies <- model.matrix(~PropertyType -1, data=house)
head(prop_type_dummies)
PropertyTypeMultiplex PropertyTypeSingle Family PropertyTypeTownhouse
1 1 0 0
2 0 1 0
3 0 1 0
4 0 1 0
5 0 1 0
6 0 0 1

Funkcja model.matrix konwertuje obiekt data frame do macierzy odpowiedniej dla modelu linio-
wego. Zmienna skategoryzowana PropertyType, która ma trzy poziomy, jest reprezentowana jako
macierz z trzema kolumnami. Społeczność związana z uczeniem maszynowym nazywa taką repre-
zentację kodowaniem 1 z n (ang. one hot encoding) (patrz punkt „Kodowanie 1 z n” w rozdziale 6.).
W Pythonie możemy przekształcać zmienne kategoryzujące w zmienne fikcyjne za pomocą metody
get_dummies z pakietu pandas:
pd.get_dummies(house['PropertyType']).head()
pd.get_dummies(house['PropertyType'], drop_first=True).head()

Domyślnie zwraca kodowanie 1 z n zmiennej kategoryzującej.


Argument drop_first zwraca P−1 kolumn. Używamy tego rozwiązania do uniknięcia pro-
blemu współliniowości.
Dla niektórych algorytmów uczenia maszynowego, np. najbliżsi sąsiedzi, drzewa decyzyjne, kodo-
wanie 1 z n jest standardową reprezentacją zmiennej skategoryzowanej (patrz np. punkt „Drzewa
losowe” w rozdziale 6.).
W parametrach regresji zmienna skategoryzowana z P różnymi poziomami jest zazwyczaj przed-
stawiana jako macierz z P–1 kolumnami. Dzieje się tak, ponieważ modele regresji zazwyczaj zawie-
rają wyraz wolny. Jeśli już zdefiniowałeś wartości dla P–1 zmiennych binarnych, wartości dla P-tej
kolumny są znane i mogą być uznane za zbędne. Dodanie P-tej kolumny spowoduje błąd współli-
niowości (patrz punkt „Współliniowość” w dalszej części tego rozdziału).
Domyślna reprezentacja w R wykorzystuje pierwszy poziom zmiennej skategoryzowanej jako
referencję (ang. reference) i interpretuje pozostałe poziomy względem tego pierwszego.
lm(AdjSalePrice ~ SqFtTotLiving + SqFtLot + Bathrooms +
Bedrooms + BldgGrade + PropertyType, data=house)

Call:
lm(formula = AdjSalePrice ~ SqFtTotLiving + SqFtLot + Bathrooms +
Bedrooms + BldgGrade + PropertyType, data = house)

3
Argument –1 w model.matrix tworzy reprezentację 1 z n (przez usunięcie wyrazu wolnego, stąd „–”). W innym
przypadku R domyślnie tworzy macierz z P–1 kolumnami, w której pierwszy czynnik stanowi referencję dla
pozostałych.

Zmienne skategoryzowane w regresji | 155

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Coefficients:
(Intercept) SqFtTotLiving
-4.468e+05 2.234e+02
SqFtLot Bathrooms
-7.037e-02 -1.598e+04
Bedrooms BldgGrade
-5.089e+04 1.094e+05
PropertyTypeSingle Family PropertyTypeTownhouse
-8.468e+04 -1.151e+05

Metoda get_dummies przyjmuje dodatkowy argument drop_first, co pozwala wykluczyć pierwszą


zmienną czynnikową jako odniesienie (ang. reference):
predictors = ['SqFtTotLiving', 'SqFtLot', 'Bathrooms', 'Bedrooms',
'BldgGrade', 'PropertyType']

X = pd.get_dummies(house[predictors], drop_first=True)

house_lm_factor = LinearRegression()
house_lm_factor.fit(X, house[outcome])

print(f'Wyraz wolny: {house_lm_factor.intercept_:.3f}')


print('Współczynniki:')
for name, coef in zip(X.columns, house_lm_factor.coef_):
print(f' {name}: {coef}')

Wynik z regresji R pokazuje dwa współczynniki odpowiadające zmiennej PropertyType: Proper-


tyTypeSingle Family i PropertyTypeTownhouse. Nie istnieje współczynnik dla typu Multiplex, po-
nieważ niejawnie jest zdefiniowane PropertyTypeSingle Family == 0 i PropertyTypeTownhouse == 0.
Współczynniki są interpretowane jako względne do Multiplex, dlatego dom Single Family jest
wart niemal 85 000 $ więcej, a Townhouse ponad 150 000 $ mniej4.

Różne metody kodowania czynników


Istnieje kilka metod kodowania zmiennej skategoryzowanej, znanych jako systemy
kodowania porównawczego (ang. contrast coding systems). Na przykład kodowanie
odchyleń (ang. deviation coding) porównuje każdy poziom do ogólnej średniej.
Natomiast kodowanie wielomianowe (ang. polynomial coding) jest odpowiednie dla
czynników uporządkowanych (patrz punkt „Uporządkowane zmienne skategoryzo-
wane” w dalszej części tego rozdziału). Z wyjątkiem przypadku stosowania zmien-
nych uporządkowanych specjaliści data science nie spotkają się z żadnym typem ko-
dowania danych poza kodowaniem referencyjnym lub 1 z n.

Zmienne skategoryzowane na wielu poziomach


Niektóre zmienne skategoryzowane mogą wymagać ogromnej liczby binarnych zmiennych fikcyj-
nych — kody pocztowe są zmienną skategoryzowaną, a w Stanach Zjednoczonych istnieją 43 000
kodów pocztowych. W takim przypadku wygodnie jest przejrzeć dane i związki pomiędzy predyk-
torami a wynikami w celu określenia, czy informacja zawarta w tych kategoriach jest użyteczna.

4
Jest to nieintuicyjne, ale może być wytłumaczone przez wpływ położenia jako zmiennej zakłócającej (patrz punkt
„Zmienne zakłócające” w dalszej części tego rozdziału).

156 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Jeśli tak, musisz zdecydować, czy należy pozostawić wszystkie czynniki, czy też poziomy mogą być
połączone.
W danych z King County występuje 80 kodów pocztowych dla domów:
table(house$ZipCode)

98001 98002 98003 98004 98005 98006 98007 98008 98010 98011 98014 98019
358 180 241 293 133 460 112 291 56 163 85 242
98022 98023 98024 98027 98028 98029 98030 98031 98032 98033 98034 98038
188 455 31 366 252 475 263 308 121 517 575 788
98039 98040 98042 98043 98045 98047 98050 98051 98052 98053 98055 98056
47 244 641 1 222 48 7 32 614 499 332 402
98057 98058 98059 98065 98068 98070 98072 98074 98075 98077 98092 98102
4 420 513 430 1 89 245 502 388 204 289 106
98103 98105 98106 98107 98108 98109 98112 98113 98115 98116 98117 98118
671 313 361 296 155 149 357 1 620 364 619 492
98119 98122 98125 98126 98133 98136 98144 98146 98148 98155 98166 98168
260 380 409 473 465 310 332 287 40 358 193 332
98177 98178 98188 98198 98199 98224 98288 98354
216 266 101 225 393 3 4 9

Te same informacje zwraca metoda value_counts ramki danych pandas:


pd.DataFrame(house['ZipCode'].value_counts()).transpose()

ZipCode jest istotną zmienną, ponieważ jest identyfikatorem efektu położenia wpływającego na
wartość domu. Uwzględnienie wszystkich poziomów wymaga 79 współczynników odpowiadają-
cych 79 stopniom swobody. Oryginalny model house_lm ma jedynie 5 stopni swobody (patrz punkt
„Ocena modelu” we wcześniejszej części tego rozdziału). Co więcej, istnieją pojedyncze rekordy dla
niektórych kodów pocztowych. W pewnych przypadkach możesz połączyć kody pocztowe, wyko-
rzystując ich pierwsze dwie lub trzy cyfry, odpowiadające podregionom geograficznym. Dla King
County niemal wszystkie dane pochodzą ze sprzedaży w rejonie 980xx lub 981xx, więc niewiele
nam to pomoże.
Alternatywnym podejściem jest grupowanie kodów pocztowych względem innej zmiennej, np.
ceny sprzedaży. Jeszcze lepszym podejściem jest grupowanie kodów pocztowych przy wykorzysta-
niu reszty z pierwszego modelu. Kod z biblioteki dplyr stanowiącej część R łączy 80 kodów pocz-
towych w 5 grup opartych na medianie z reszt dla modelu regresji house_lm:
zip_groups <- house %>%
mutate(resid = residuals(house_lm)) %>%
group_by(ZipCode) %>%
summarize(med_resid = median(resid),
cnt = n()) %>%
# sortuje kody pocztowe wg reszt z modelu
arrange(med_resid) %>%
mutate(cum_cnt = cumsum(cnt),
ZipGroup = factor(ntile(cum_cnt, 5)))
house <- house %>%
left_join(select(zip_groups, ZipCode, ZipGroup), by='ZipCode')

Mediana z reszt jest obliczana dla każdego kodu pocztowego, a funkcja ntile jest wykorzystywana do
podziału posortowanych według mediany kodów na 5 grup. Punkt „Zmienne zakłócające” w dalszej
części tego rozdziału zawiera przykład sposobu użycia ich do poprawy dopasowania modelu regresji.

Zmienne skategoryzowane w regresji | 157

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W Pythonie uzyskujemy te informacje następująco:
zip_groups = pd.DataFrame([
*pd.DataFrame({
'ZipCode': house['ZipCode'],
'residual' : house[outcome] - house_lm.predict(house[predictors]),
})
.groupby(['ZipCode'])
.apply(lambda x: {
'ZipCode': x.iloc[0,0],
'count': len(x),
'median_residual': x.residual.median()
})
]).sort_values('median_residual')
zip_groups['cum_count'] = np.cumsum(zip_groups['count'])
zip_groups['ZipGroup'] = pd.qcut(zip_groups['cum_count'], 5, labels=False,
retbins=False)

to_join = zip_groups[['ZipCode', 'ZipGroup']].set_index('ZipCode')


house = house.join(to_join, on='ZipCode')
house['ZipGroup'] = house['ZipGroup'].astype('category')

Użycie reszt jako wskaźnika ułatwiającego dopasowanie modelu regresji jest podstawowym krokiem
w procesie modelowania (patrz podrozdział „Diagnostyka regresji” w dalszej części tego rozdziału).

Uporządkowane zmienne skategoryzowane


Niektóre zmienne skategoryzowane oddają poziomy kategorii; nazywane są one uporządkowanymi
zmiennymi skategoryzowanymi (ang. ordered factor variables lub ordered categorical variables).
Dla przykładu oceną pożyczki może być A, B, C itd. — każda kolejna klasa niesie za sobą większe
ryzyko niż poprzednia. Często uporządkowane zmienne skategoryzowane mogą być zamienione
na wartości numeryczne i używane jako takie. Na przykład zmienna BldgGrade jest uporządkowaną
zmienną skategoryzowaną. Kilka typów klas jest przedstawionych w tabeli 4.1. Mimo że klasy mają
swoje specyficzne znaczenie, wartości numeryczne są uporządkowane od najmniejszej do najwięk-
szej, co odpowiada wyższym standardom domów. W modelu regresji house_lm, tworzonym w pod-
rozdziale „Regresja wieloraka” we wcześniejszej części tego rozdziału, BldgGrade była traktowana
jako zmienna numeryczna.

Tabela 4.1. Tworzenie klas i ich odpowiedników numerycznych

Wartość Opis
1 Cabin
2 Substandard
5 Fair
10 Very good
12 Luxury
13 Mansion

Traktowanie uporządkowanych kategorii jako zmiennych numerycznych pozwala zachować infor-


macje zawarte w uporządkowaniu, które mogłyby być zgubione podczas konwersji do czynników.

158 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Główne zasady
• Żeby użyć zmiennych skategoryzowanych w modelu regresji, trzeba je przekształcić w zmienne
numeryczne.
• Najczęstszą metodą kodowania zmiennych skategoryzowanych z P różnymi wartościami jest
przedstawienie ich jako P–1 fikcyjnych zmiennych.
• Może okazać się niezbędne grupowanie zmiennej skategoryzowanej z wieloma poziomami
w bardzo dużym zbiorze danych do zmiennej z kilkoma poziomami.
• Niektóre zmienne zawierają uporządkowane czynniki, które mogą być przedstawione w po-
staci zmiennej numerycznej.

Interpretacja równania regresji


W data science najistotniejszym zastosowaniem regresji jest uzyskanie możliwości przewidzenia
pewnych zmiennych zależnych (wyjść). Jednak w niektórych przypadkach wartością samą w sobie
może być dokładniejsze zrozumienie równania, co pozwala na zgłębienie natury związków pomię-
dzy predyktorami a wynikami. Ten podrozdział dostarcza wskazówek, jak badać i interpretować
równanie regresji.

Kluczowe pojęcia dotyczące interpretacji równania regresji


Zmienne skorelowane
Kiedy zmienna niezależna jest mocno skorelowana, niezwykle trudno interpretować poszcze-
gólne współczynniki.

Współliniowość
Kiedy zmienne predykcyjne są idealnie lub niemal idealnie skorelowane, model regresji może
być niestabilny lub niemożliwy do policzenia.
Synonim
zmienne liniowo zależne

Zmienne zakłócające
Ważne zmienne, których pominięcie może spowodować zakłócenie związków w równaniu
regresji.

Efekt główny
Związek pomiędzy predyktorem a wynikiem, niezależny od innych zmiennych.

Interakcje
Wspólna zależność pomiędzy dwoma lub więcej predyktorami a odpowiedzią.

Interpretacja równania regresji | 159

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Predyktory skorelowane
W regresji wielorakiej zmienne predykcyjne są najczęściej skorelowane ze sobą. W ramach przy-
kładu prześledźmy współczynniki regresji dla modelu step_lm, dopasowanego w punkcie „Dobór
modelu i regresja krokowa” we wcześniejszej części tego rozdziału:
R:
step_lm$coefficients
(Intercept) SqFtTotLiving
6.178645e+06 1.992776e+02
Bathrooms Bedrooms
4.239616e+04 -5.194738e+04
BldgGrade PropertyTypeSingle Family
1.371596e+05 2.291206e+04
PropertyTypeTownhouse SqFtFinBasement
8.447916e+04 7.046975e+00
YrBuilt
-3.565425e+03

Python:
print(f'Wyraz wolny: {best_model.intercept_:.3f}')
print('Współczynniki:')
for name, coef in zip(best_variables, best_model.coef_):
print(f' {name}: {coef}')

Współczynnik dla Bedrooms jest ujemny! Sugeruje to, że dodanie sypialni do domu zmniejsza jego
wartość. Jak to możliwe? Otóż zmienne predykcyjne są skorelowane: większy dom zazwyczaj ma
więcej sypialni, a to rozmiar domu ma największy wpływ na jego wartość, nie liczba sypialni. Roz-
ważmy dwa domy o tej samej powierzchni: możemy się spodziewać, że dom z większą liczbą mniej-
szych sypialni będzie mniej atrakcyjny.
Skorelowane predyktory mogą utrudnić interpretację znaków i wartości współczynników regresji
(i mogą rozdmuchać błąd standardowy oszacowania). Zmienne dla sypialni, rozmiaru domu i liczby
łazienek są skorelowane. Jest to przedstawione w kolejnym przykładzie w R, w którym dopasowano
kolejny model, tym razem usuwając z równania zmienne SqFtTotLiving, SqFtFinBasement i Bathrooms:
update(step_lm, . ~ . -SqFtTotLiving - SqFtFinBasement - Bathrooms)

Call:
lm(formula = AdjSalePrice ~ Bedrooms + BldgGrade + PropertyType +
YrBuilt, data = house, na.action = na.omit)

Coefficients:
(Intercept) Bedrooms
4913973 27151
BldgGrade PropertyTypeSingle Family
248998 -19898
PropertyTypeTownhouse YrBuilt
-47355 -3212

Funkcja update może być użyta do dodania zmiennych do modelu lub ich usunięcia z niego. Tym
razem współczynnik dla sypialni jest dodatni — tak jak się spodziewaliśmy (jednak teraz, kiedy
zmienne zostały usunięte, działa on jak wskaźnik dotyczący rozmiaru domu).

160 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Nie ma w Pythonie odpowiednika funkcji update. Musimy ponownie dopasować model za pomocą
zmodyfikowanej listy predyktorów:
predictors = ['Bedrooms', 'BldgGrade', 'PropertyType', 'YrBuilt']
outcome = 'AdjSalePrice'

X = pd.get_dummies(house[predictors], drop_first=True)

reduced_lm = LinearRegression()
reduced_lm.fit(X, house[outcome])

Zmienne skorelowane są tylko jedną z kwestii, jakie należy poruszyć podczas interpretacji współczyn-
ników regresji. W house_lm nie ma zmiennej odpowiadającej za lokalizację domu, a model miesza
ze sobą bardzo różne regiony. Lokalizacja może być zmienną zakłócającą (ang. confounding variable);
więcej szczegółów znajdziesz w punkcie „Zmienne zakłócające” w dalszej części tego rozdziału.

Współliniowość
W skrajnym przypadku skorelowane zmienne są współliniowe (ang. multicollinearity, colinearity)
— w takiej sytuacji występuje redundancja wśród zmiennych predykcyjnych. Idealna współlinio-
wość pojawia się, kiedy jedna zmienna predykcyjna może być wyrażona jako liniowa kombinacji
innych. Współliniowość pojawia się gdy:
• Przez pomyłkę zmienna pojawia się wielokrotnie.
• Zostało stworzonych P zmiennych fikcyjnych zamiast P–1 (patrz podrozdział „Zmienne ska-
tegoryzowane w regresji” we wcześniejszej części tego rozdziału).
• Dwie zmienne są niemal idealnie skorelowane z inną zmienną.
Nie można pozostawić współliniowości w modelu regresji — zmienne powinny być usuwane tak długo,
aż współliniowość zniknie. Nie istnieje uniwersalne i skuteczne rozwiązanie problemu usuwania
nadmiarowych danych w regresji. Wiele pakietów oprogramowania, w tym R i Python, automa-
tycznie zajmuje się niektórymi przypadkami współliniowości. Na przykład jeśli SqFtTotLiving jest
zawarta dwukrotnie w regresji dla danych house, wyniki będą takie same jak dla modelu house_lm.
W przypadku nieidealnej współliniowości oprogramowanie może zaoferować rozwiązanie, ale wy-
niki mogą być bezużyteczne.

Współliniowość nie jest problemem dla metod regresji nieliniowej, np. drzew decy-
zyjnych, klasteryzacji, najbliższych sąsiadów — w takich metodach może być wska-
zane pozostawienie P zmiennych fikcyjnych (zamiast P–1). Nie oznacza to jednak,
że w przypadku tych metod problem redundancji zmiennych nie istnieje.

Zmienne zakłócające
Dla zmiennych skorelowanych problem stanowi jedno z zaleceń: dołączanie możliwie wielu zmien-
nych — niektóre z nich mogą być liniowo zależne. Dla zmiennych zakłócających (ang. confounding
variables) problem stanowi jedno z zaniedbań: istotna zmienna nie jest zawarta w równaniu regresji.
Nieostrożna interpretacja współczynników równania może prowadzić do niepoprawnych wniosków.

Interpretacja równania regresji | 161

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Weźmy np. równanie regresji house_lm dla danych z King County z punktu „Przykład: wartość
domów w King County” we wcześniejszej części tego rozdziału. Współczynniki regresji dla SqFtLot,
Bathrooms i Bedrooms są ujemne. Oryginalny model nie zawiera zmiennej reprezentującej lokaliza-
cję — bardzo istotnego predyktora ceny domu.
Do zamodelowania lokalizacji dodano zmienną ZipGroup, która kategoryzuje kody pocztowe jako
jedną z 5 klas, od najtańszej (1) do najdroższej (5)5.
lm(formula = AdjSalePrice ~ SqFtTotLiving + SqFtLot + Bathrooms +
Bedrooms + BldgGrade + PropertyType + ZipGroup, data = house,
na.action = na.omit)

Coefficients:
(Intercept) SqFtTotLiving
-6.666e+05 2.106e+02
SqFtLot Bathrooms
4.550e-01 5.928e+03
Bedrooms BldgGrade
-4.168e+04 9.854e+04
PropertyTypeSingle Family PropertyTypeTownhouse
1.932e+04 -7.820e+04
ZipGroup2 ZipGroup3
5.332e+04 1.163e+05
ZipGroup4 ZipGroup5
1.784e+05 3.384e+05

Ten sam model w Pythonie:


predictors = ['SqFtTotLiving', 'SqFtLot', 'Bathrooms', 'Bedrooms',
'BldgGrade', 'PropertyType', 'ZipGroup']
outcome = 'AdjSalePrice'

X = pd.get_dummies(house[predictors], drop_first=True)

confounding_lm = LinearRegression()
confounding_lm.fit(X, house[outcome])

print(f'Wolny wyraz: {confounding_lm.intercept_:.3f}')


print('Współczynniki:')
for name, coef in zip(X.columns, confounding_lm.coef_):
print(f' {name}: {coef}')

ZipGroup jest istotną zmienną: dom w grupie z najdroższym kodem pocztowym ma szacowaną cenę
wyższą o niemal 340 000 $. Współczynniki dla SqFtLot i Bathrooms są teraz dodatnie, a dodanie
łazienki podnosi cenę o ponad 5928 $.
Współczynnik dla Bedrooms jest nadal negatywny. Mimo że wydaje się to nieintuicyjne, jest to do-
brze znane zjawisko na rynku nieruchomości. Dla domów o tej samej powierzchni użytkowej
i liczbie łazienek większa liczba mniejszych sypialni powiązana jest z mniejszą wartością domu.

5
W danych King County mamy 80 kodów pocztowych, kilka z nich ma niewielką liczbę rekordów. Alternatywą dla
bezpośredniego wykorzystywania kodów pocztowych jako zmiennej skategoryzowanej jest stworzenie kategorii
ZipGroup, łączącej podobne kody pocztowe. Szczegóły znajdziesz w punkcie „Zmienne skategoryzowane na wielu
poziomach” we wcześniejszej części tej książki.

162 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Interakcje i efekty główne
Statystycy lubią odróżniać efekty główne (ang. main effects) lub zmienne niezależne od interakcji
(ang. interactions) pomiędzy efektami głównymi. Efekty główne są tym, co zazwyczaj odnosi się do
zmiennej predykcyjnej w równaniu regresji. Gdy w modelu użyte są jedynie efekty główne, ukry-
tym założeniem jest to, że relacja pomiędzy predyktorem a odpowiedzią jest niezależna od innych
predyktorów. Jednak nie zawsze ma to miejsce.
Dla przykładu model dla danych domów z King County, stworzony w punkcie „Zmienne zakłóca-
jące” we wcześniejszej części tego rozdziału, zawiera kilka zmiennych w postaci efektów głównych,
m.in. ZipCode. Lokalizacja jest wszystkim na rynku nieruchomości i naturalne jest przypuszczenie,
że związek pomiędzy rozmiarem domu a ceną sprzedaży zależy od lokalizacji. Duży dom zbudowany
w rejonie tanich mieszkań nie osiągnie tej samej wartości co duży dom zbudowany w ekskluzywnej
okolicy. W R można dodać interakcje pomiędzy zmiennymi, wykorzystując operator *. Dla danych
z King County zostały zamodelowane następujące interakcje pomiędzy SqFtTotLiving a ZipGroup:
lm(formula = AdjSalePrice ~ SqFtTotLiving * ZipGroup + SqFtLot +
Bathrooms + Bedrooms + BldgGrade + PropertyType, data = house,
na.action = na.omit)

Coefficients:
(Intercept) SqFtTotLiving
-4.853e+05 1.148e+02
ZipGroup2 ZipGroup3
-1.113e+04 2.032e+04
ZipGroup4 ZipGroup5
2.050e+04 -1.499e+05
SqFtLot Bathrooms
6.869e-01 -3.619e+03
Bedrooms BldgGrade
-4.180e+04 1.047e+05
PropertyTypeSingle Family PropertyTypeTownhouse
1.357e+04 -5.884e+04
SqFtTotLiving:ZipGroup2 SqFtTotLiving:ZipGroup3
3.260e+01 4.178e+01
SqFtTotLiving:ZipGroup4 SqFtTotLiving:ZipGroup5
6.934e+01 2.267e+02

Wynikowy model zawiera cztery nowe elementy: SqFtTotLiving:ZipGroup2, SqFtTotLiving:ZipGroup3 itd.


W Pythonie musimy użyć pakietu statsmodels, aby wyuczyć modele regresji liniowej z interak-
cjami. Pakiet ten został zaprojektowany podobnie do R i umożliwia definiowanie modeli za po-
mocą interfejsu równań:
model = smf.ols(formula='AdjSalePrice ~ SqFtTotLiving*ZipGroup + SqFtLot + ' +
'Bathrooms + Bedrooms + BldgGrade + PropertyType', data=house)
results = model.fit()
results.summary()

Pakiet statsmodels zajmuje się zmiennymi kategoryzującymi (np. ZipGroup[T.1], PropertyType


´[T.Single Family]) i członami interakcji (np. SqFtTotLiving:ZipGroup[T.1]).

Wydaje się, że lokalizacja i rozmiar domu wchodzą w silne interakcje. Dla domu w najtańszej
ZipGroup współczynnik jest taki sam jak dla efektu głównego SqFtTotLiving i wynosi 118 $ na stopę

Interpretacja równania regresji | 163

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


kwadratową [dzieje się tak, ponieważ R wykorzystuje referencje (ang. reference) do zakodowania
zmiennych skategoryzowanych; patrz podrozdział „Zmienne skategoryzowane w regresji” we
wcześniejszej części tego rozdziału]. Dla domu w najdroższej ZipGroup współczynnik jest sumą
średniego efektu i SqFtTotLiving:ZipGroup5 lub 115 $+227 $ = 342 $ na stopę kwadratową. Innymi
słowy, dodanie stopy kwadratowej w najdroższej grupie zwiększy cenę sprzedaży niemal 3 razy
w porównaniu do przeciętnego wzrostu wynikającego z dodania powierzchni.

Dobór modelu za pomocą interakcji


W przypadku problemów dotyczących wielu zmiennych wyzwaniem może się okazać
podjęcie decyzji o tym, które interakcje powinny być zawarte w modelu. Powszechnie
stosuje się kilka różnych metod:
• Wykorzystanie swojej wiedzy i intuicji mogą pomóc we wskazaniu interakcji,
które należy zawrzeć w modelu.
• Selekcja krokowa (patrz podrozdział „Dobór modelu i regresja krokowa” we
wcześniejszej części tego rozdziału) może być użyta do przeszukania różnych
modeli.
• Regresja z karą może automatycznie dopasować model do dużego zbioru moż-
liwych interakcji.
• Użycie drzewa decyzyjnego (ang. tree models) (prawdopodobnie najczęściej sto-
sowana metoda), jak również jego pochodnych, lasów losowych (ang. random
forest) i drzew decyzyjnych ze wzmacnianiem (ang. gradient boosted trees),
mogą pomóc w szukaniu optymalnych interakcji (patrz podrozdział „Drzewa
decyzyjne” w rozdziale 6.).

Główne zasady
• Z uwagi na korelacje pomiędzy predyktorami należy uważnie przyjrzeć się współczynnikom
regresji wielorakiej podczas ich interpretacji.
• Współliniowość może spowodować niestabilność numeryczną w dopasowaniu równania
regresji.
• Zmienna zakłócająca jest ważnym predyktorem i wykluczenie jej z modelu może prowadzić
do powstania równania regresji z mylnie zidentyfikowanymi relacjami.
• Określenie interakcji pomiędzy dwoma zmiennymi jest potrzebne, jeśli relacje pomiędzy
tymi zmiennymi a odpowiedzią są zależne od siebie.

Diagnostyka regresji
W modelowaniu wyjaśniającym (tj. w kontekście badań) jako dodatek do metryk wspomnianych
wcześniej (patrz punkt „Ocena modelu” we wcześniejszej części tego rozdziału) są wykonywane
różne kroki w celu ustalenia tego, jak dobrze model dopasowuje się do danych; większość tych
kroków bazuje na analizie reszt. Kroki te nie zajmują się bezpośrednio dokładnością predykcji, ale
mogą pomóc w zrozumieniu jej parametrów.

164 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące diagnostyki regresji
Reszty standaryzowane
Rezydua podzielone przez ich błąd standardowy.

Wartość odstająca
Rekord (lub wynik) odległy od pozostałych danych (lub prognozowanych wartości).

Obserwacja wpływowa
Wartość lub rekord, których obecność lub nieobecność powoduje znaczną różnicę w równa-
niu regresji.

Nacisk
Poziom wpływu, jaki pojedynczy rekord może mieć na równanie regresji.
Synonim
wpływ

Reszty anormalne
Rozkład reszt inny od normalnego; może unieważnić niektóre z wymagań technicznych re-
gresji, ale zazwyczaj nie jest to problem w data science.

Heteroskedastyczność
Sytuacja, w której dla pewnych zakresów wyników obserwowana jest większa wariancja reszt
(może to wskazywać na to, że w równaniu brakuje jakiegoś predyktora).

Wykres reszt częściowych


Wykres diagnostyczny do przedstawiania relacji pomiędzy zmiennymi wynikowymi a niektó-
rymi pojedynczymi predyktorami.
Synonim
wykres zmiennych dodanych

Wartości odstające
Ogólnie rzecz ujmując, wartość ekstremalna, zwana również odstającą (ang. outlier), jest oddalona
od większości innych obserwacji. Tak jak wartości odstające mogą stwarzać trudności podczas sza-
cowania położenia i rozproszenia (patrz podrozdziały „Miary położenia” i „Miary rozproszenia”
w rozdziale 1.), tak wartości odstające mogą powodować problemy w modelach regresji. Wartość
odstająca dla regresji jest rekordem, którego faktyczna wartość y jest oddalona od przewidywanej
wartości. Możesz wykryć wartości odstające poprzez badanie reszt standaryzowanych (ang. stan-
dardized residua), które są rezyduami podzielonymi przez ich błąd standardowy.
Nie istnieje żadna statystyczna teoria, która pozwala odróżnić wartości odstające od nieodstających.
Zamiast tego najczęściej przyjmuje się arbitralnie, jak odległy od głównej części danych musi być
rekord, żeby nazwać go odstającym. Dla przykładu na wykresie pudełkowym wartości odstające

Diagnostyka regresji | 165

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


są punktami, które są zbyt daleko od granic pudełka (patrz punkt „Percentyle i boxploty” w roz-
dziale 1.), gdzie „zbyt daleko” = „więcej niż 1,5 raza przedział międzykwartylowy”. W regresji stan-
daryzowane rezydua są metryką, która powszechnie wykorzystywana jest do określenia, czy rekord
można zaklasyfikować jako odstający. Standaryzowane rezydua mogą być interpretowane jako
„liczba błędów standardowych, jakie dzielą rekord od prostej regresji”.
Dopasujmy w R równanie regresji do danych dotyczących sprzedaży domów w King County dla
wszystkich sprzedaży z kodem pocztowym 98105:
house_98105 <- house[house$ZipCode == 98105,]
lm_98105 <- lm(AdjSalePrice ~ SqFtTotLiving + SqFtLot + Bathrooms +
Bedrooms + BldgGrade, data=house_98105)

W Pythonie:
house_98105 = house.loc[house['ZipCode'] == 98105, ]

predictors = ['SqFtTotLiving', 'SqFtLot', 'Bathrooms', 'Bedrooms', 'BldgGrade']


outcome = 'AdjSalePrice'

house_outlier = sm.OLS(house_98105[outcome],
house_98105[predictors].assign(const=1))
result_98105 = house_outlier.fit()

Wyciągnijmy reszty standardowe, wykorzystując funkcję rstandard, i znajdźmy indeks najmniej-


szej reszty za pomocą funkcji order:
sresid <- rstandard(lm_98105)
idx <- order(sresid, decreasing=FALSE)
sresid[idx[1]]
20429
-4.326732

Pakiet statsmodels zawiera funkcję OLSInfluence służącą do analizowania wartości resztowych:


influence = OLSInfluence(result_98105)
sresiduals = influence.resid_studentized_internal
sresiduals.idxmin(), sresiduals.min()

Największym przeszacowaniem w modelu jest więcej niż cztery błędy standardowe powyżej linii
regresji, co odpowiada przeszacowaniu o 757 754 $. Rekord w oryginalnych danych odpowiadający
tej wartości jest następujący:
R:
house_98105[idx[1], c('AdjSalePrice', 'SqFtTotLiving', 'SqFtLot',
'Bathrooms', 'Bedrooms', 'BldgGrade')]
AdjSalePrice SqFtTotLiving SqFtLot Bathrooms Bedrooms BldgGrade
(dbl) (int) (int) (dbl) (int) (int)
20429 119748 2900 7276 3 6 7

Python:
outlier = house_98105.loc[sresiduals.idxmin(), :]
print('AdjSalePrice', outlier[outcome])
print(outlier[predictors])

166 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W tym przypadku wydaje się, że z rekordem coś jest nie tak: dom tej wielkości jest standardowo
sprzedawany za więcej niż 119 748 $ w tym rejonie. Rysunek 4.4 przedstawia fragment umowy
sprzedaży: jasne jest, że sprzedaż dotyczy jedynie części praw do nieruchomości. W tym przypadku
wartość odstająca odnosi się do nietypowej sprzedaży i nie powinna być dołączona do modelu re-
gresji. Wartości odstające mogą być również wynikiem innych zdarzeń, takich jak niechlujne wpro-
wadzanie danych lub pomylenie jednostek (np. zapisanie sprzedaży w tysiącach dolarów zamiast
w dolarach).

Akt przekazania

CEDENT _____, osoba fizyczna, za kwotę 105 000,00 $ przekazuje prawa mężowi i żonie, CESJONARIUSZOM, niepo-
dzielne dwadzieścia pięć procent (25%) udziałów w opisanej poniżej nieruchomości, znajdującej się w King County
w stanie Waszyngton, łącznie z wszystkimi prawami nabytymi przez CEDENTA wobec nieruchomości.

Rysunek 4.4. Akt przekazania dla największej ujemnej reszty

Dla problemów związanych z big data wartości odstające generalnie nie stanowią przeszkody
w dopasowaniu modelu regresji, używanego do prognozy nowych danych. Jednakże wartości od-
stające mogą również odpowiadać próbom oszustw lub przypadkowym działaniom. Każdorazowo
wykrycie wartości odstających może być krytyczne dla potrzeb biznesowych.

Obserwacje wpływowe
Wartość, której brak mógłby diametralnie zmienić równanie regresji, jest nazywana obserwacją
wpływową (ang. influential value). W regresji taka wartość nie musi być powiązana z dużym rezy-
duum. Jako przykład rozważmy prostą regresji z rysunku 4.5. Linia ciągła przedstawia równanie
regresji dla wszystkich danych, a przerywana odnosi się do regresji, w której prawy górny punkt
został usunięty. Wyraźnie widać, że punkt ten ma ogromny wpływ na równanie regresji, mimo że
nie jest powiązany z dużą wartością odstającą (dla pełnej regresji). Ta wartość jest traktowana jako
wywierająca duży nacisk (ang. leverage lub hat value) na równanie regresji.
Poza resztami standaryzowanymi (patrz punkt „Wartości odstające” we wcześniejszej części tego
rozdziału) statystycy rozwinęli kilka metryk do określenia wpływu pojedynczego rekordu na regresję.
Tradycyjnie używa się metryki hat value, której wartości powyżej 2(P+1)/n wskazują na duży wpływ6.
Kolejną metryką jest odległość Cooka (ang. Cook’s distance), która jest w istocie kombinacją
wpływu i wielkości reszty. Przyjęło się, że obserwacja ma wysoki wpływ, jeśli odległość Cooka prze-
kracza 4/(n–P–1).

6
Pojęcie hat value pochodzi z notacji macierzy hat w regresji. Regresja wieloraka może być wyrażona równaniem:
Ŷ = HY, gdzie H jest macierzą hat. Wartości hat odpowiadają wartościom na przekątnej H.

Diagnostyka regresji | 167

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 4.5. Przykład obserwacji wpływowej w regresji

Wykres wpływu (ang. influence plot) lub wykres bąbelkowy (ang. bubble plot) łączy reszty standa-
ryzowane, wartości nacisku i odległość Cooka na jednym wykresie. Rysunek 4.6 przedstawia wy-
kres wpływu dla danych dotyczących domów z King County i może być stworzony następującym
kodem w R:
std_resid <- rstandard(lm_98105)
cooks_D <- cooks.distance(lm_98105)
hat_values <- hatvalues(lm_98105)
plot(subset(hat_values, cooks_D > 0.08), subset(std_resid, cooks_D > 0.08),
xlab='hat_values', ylab='std_resid',
cex=10*sqrt(subset(cooks_D, cooks_D > 0.08)), pch=16, col='lightgrey')
points(hat_values, std_resid, cex=10*sqrt(cooks_D))
abline(h=c(-2.5, 2.5), lty=2)

Podobny rysunek w Pythonie uzyskamy w następujący sposób:


influence = OLSInfluence(result_98105)
fig, ax = plt.subplots(figsize=(5, 5))
ax.axhline(-2.5, linestyle='--', color='C1')
ax.axhline(2.5, linestyle='--', color='C1')
ax.scatter(influence.hat_matrix_diag, influence.resid_studentized_internal,
s=1000 * np.sqrt(influence.cooks_distance[0]),
alpha=0.5)
ax.set_xlabel('hat_values')
ax.set_ylabel('std_resid')

Najwyraźniej istnieje kilka punktów, które wykazują największy wpływ na regresję. Odległość
Cooka może być obliczona przy wykorzystaniu funkcji cooks.distance, dodatkowo możesz użyć
hatvalues do obliczenia diagnostyki. Wartości nacisku są rysowane na osi x, rezydua na osi y,
a rozmiar bańki odpowiada wartości odległości Cooka.

168 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 4.6. Wykres do określenia tego, która obserwacja ma największy wpływ na regresję; punkty o odległości
Cooka większej od 0,08 zostały zaznaczone szaro

Tabela 4.2 porównuje współczynniki regresji dla pełnego zbioru danych oraz po usunięciu najbar-
dziej wpływowych obserwacji (odległość Cooka > 0,08).
Współczynnik regresji dla Bathrooms zmienia się diametralnie7.

Tabela 4.2. Porównanie współczynników regresji dla pełnych danych (Original) i z usuniętymi obserwacjami
wpływowymi (Influential removed)

Original Influential removed


(Intercept) –772 550 –647 137
SqFtTotLiving 210 230
SqFtLot 39 33
Bathrooms 2282 –16 132
Bedrooms –26 320 –22 888
BldgGrade 130 000 114 871

Na potrzeby dopasowania modelu regresji, który dobrze prognozuje przyszłe dane, zidentyfikowa-
nie obserwacji wpływowych jest użyteczne jedynie dla małych zbiorów danych. W przypadku re-
gresji analizujących wiele rekordów nie zdarza się, żeby jakakolwiek obserwacja miała aż taką wagę,
by w znaczący sposób wpłynąć na dopasowane równanie (chociaż dane wciąż mogą zawierać war-
tości odstające). Mimo to identyfikacja obserwacji wpływowych może być korzystna z punktu wi-
dzenia detekcji anomalii.

7
Współczynnik dla Bathrooms stał się ujemny, co jest nieintuicyjne. Położenie nie zostało wzięte pod uwagę, kod
pocztowy 98105 zawiera obszar o najróżniejszych typach domów. Więcej szczegółów znajdziesz w punkcie
„Zmienne zakłócające” we wcześniejszej części tego rozdziału.

Diagnostyka regresji | 169

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Heteroskedastyczność, anormalność i błędy skorelowane
Statystycy przywiązują dużą wagę do rozkładu reszt. Okazuje się, że zwykła metoda najmniejszych
kwadratów (patrz punkt „Metoda najmniejszych kwadratów” we wcześniejszej części tego rozdziału)
jest nieobciążonym i w niektórych przypadkach „optymalnym” estymatorem dla szerokiego za-
kresu założeń rozkładu. Oznacza to, że specjaliści data science w większości przypadków nie muszą
się przejmować rozkładem reszt.
Rozkład reszt ma znaczenie głównie dla zasadności formalnych założeń statystycznych (testów hi-
potez i p-wartości), co ma niewielkie znaczenie dla specjalistów data science, skupionych głównie
na poprawności predykcji. Błędy o rozkładzie normalnym oznaczają, że model jest kompletny; je-
żeli rozkład błędów nie jest normalny, to może oznaczać, że modelowi czegoś brakuje. Dla zacho-
wania poprawności formalnego wnioskowania zakłada się, że reszty pochodzą z rozkładu normal-
nego, mają taką samą wariancję i są niezależne. Jedynym obszarem, w którym specjalista data
science mógłby się tym przejmować, jest standardowe obliczanie przedziałów ufności dla progno-
zowanych danych opartych na założeniach o resztach (patrz punkt „Przedziały ufności i predykcji”
we wcześniejszej części tego rozdziału).
Heteroskedastyczność (ang. heteroskedasticity) stanowi niestałość wariancji reszt na przedziale
prognozowanych wartości. Innymi słowy, dla niektórych fragmentów zakresu błędy są większe niż
dla innych. Wizualizacja danych stanowi wygodny sposób analizowania reszt.
Poniższy kod R rysuje zależność reszt całkowitych od prognozowanych wartości dla modelu regresji
lm_98105 z punkt „Wartości odstające” z wcześniejszej części tego rozdziału.
df <- data.frame(resid = residuals(lm_98105), pred = predict(lm_98105))
ggplot(df, aes(pred, abs(resid))) + geom_point() + geom_smooth()

Rysunek 4.7 przedstawia wykres wynikowy. Wykorzystując geom_smooth, można prosto nałożyć wy-
gładzony cień reszt całkowitych. Funkcja wywołuje metodę loess (ang. locally estimated scatterplot
smoothing — szacowane lokalnie wygładzanie wykresu punktowego) do stworzenia wizualnego
wygładzenia oszacowania związku pomiędzy zmiennymi na osiach x i y w postaci wykresu punkto-
wego (patrz uwaga „Funkcja wygładzająca wykresu punktowego” w dalszej części tego rozdziału).
W Pythonie możemy stworzyć podobny wykres za pomocą funkcji regplot z pakietu seaborn:
fig, ax = plt.subplots(figsize=(5, 5))
sns.regplot(result_98105.fittedvalues, np.abs(result_98105.resid),
scatter_kws={'alpha': 0.25}, line_kws={'color': 'C1'},
lowess=True, ax=ax)
ax.set_xlabel('Przewidywane')
ax.set_ylabel('abs(resztowe)')

Wariancja reszt ewidentnie ma tendencje wzrostowe dla domów o wysokiej wartości, ale rośnie również dla
domów o niskiej wartości. Taki wykres wskazuje na to, że lm_98105 zawiera błąd heteroskedastyczny.

Dlaczego specjalista data science przejmuje się heteroskedastycznością?


Heteroskedastyczność wskazuje na to, że prognozowane błędy różnią się w zależno-
ści od różnych zakresów prognozowanych wartości, i może ona sugerować niekom-
pletny model. Dla przykładu heteroskedastyczność w lm_98105 może wskazywać na
to, że regresja pomija coś nieodkrytego dla domów o wysokiej i niskiej wartości.

170 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek. 4.7. Wykres zależności wartości bezwzględnych reszt (abs(resid)) od prognozowanych wartości (pred)

Rysunek 4.8 przedstawia histogram błędów standaryzowanych dla modelu regresji lm_98105 .
Rozkład ten ma zdecydowanie dłuższe ogony niż rozkład normalny i przedstawia łagodną skośność
w kierunku większych reszt.

Rysunek 4.8. Histogram reszt dla regresji (std_resid) z danych dotyczących sprzedaży domów

Diagnostyka regresji | 171

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Statystycy mogą również sprawdzić założenie, czy błędy są niezależne. Założenie to jest szcze-
gólnie istotne dla danych zbieranych w czasie lub przestrzeni. Statystyka Durbina-Watsona (ang.
Durbin-Watson statistic) może być użyta do stwierdzenia, czy istnieje istotna autokorelacja w re-
gresji dla serii czasowych. Jeżeli błędy z modelu regresji są skorelowane, to informacja ta przydaje
się podczas sporządzania prognoz krótkoterminowych i należy ją uwzględnić w modelu. Więcej
informacji na temat mechanizmów dołączania informacji o autokorelacji w modelach regresji sze-
regów czasowych znajdziesz w książce Practical Time Series Forecasting with R, 2nd ed. autorstwa
Galita Shmueliego i Kennetha Lichtendahla (Axelrod Schnall, 2018). Jeżeli celem są prognozy dłu-
goterminowe lub modele eksploracyjne, nadmiar danych skorelowanych w mikroskali może sta-
nowić przeszkodę. W takim przypadku konieczne może okazać się wygładzanie lub gromadzenie
ogólniejszych danych.
Nawet jeśli regresja może naruszać jedno z założeń rozkładu, to czy powinniśmy się tym przejmo-
wać? Najczęściej w data science najważniejsza jest dokładność prognozy, w związku z czym pewne
typy heteroskedastyczności są dopuszczalne. Możesz odkryć, że w danych istnieją sygnały, których
Twój model nie obejmuje. Jednakże zrealizowanie założeń rozkładu dla dobra walidacji formalnych
statystycznych wyników (p-wartości, statystyki F itp.) nie jest zbyt istotne dla specjalisty data science.

Funkcja wygładzająca wykresu punktowego


Regresja dotyczy modelowania związku pomiędzy odpowiedzią a zmiennymi obja-
śniającymi. Podczas oceny modelu regresji praktyczne jest użycie funkcji wygładza-
jącej wykresu punktowego (ang. scatterplot smoother) dla wizualnego podkreślenia
związków pomiędzy dwoma zmiennymi.
Przykładowo na rysunku 4.7 wygładzona zależność pomiędzy wartością bezwzględną
z reszt a prognozowanymi wartościami pokazuje, że wariancja reszt zależy od ich
wartości. W takim przypadku użyta była funkcja loess; działa ona poprzez wielo-
krotne dopasowanie serii lokalnych modeli regresji do ciągłych podzbiorów w celu
uzyskania wygładzenia. Loess jest prawdopodobnie najpowszechniej wykorzysty-
waną funkcją wygładzającą, ale w R dostępne są również inne funkcje, np. super
smooth (supsmu) i kernel smoothing (ksmooth). W Pythonie dostępne są również
dodatkowe funkcje wygładzające w pakietach scipy (wiener lub sav) i statsmodels
(kernel_regression). W przypadku oceny modelu regresji nie ma potrzeby przej-
mowania się szczegółami tych funkcji wygładzających.

Wykresy częściowych rezyduów i nieliniowość


Wykresy częściowych rezyduów (ang. partial residual plots) są metodą wizualizacji dokładności
oszacowania dopasowania, tłumaczącego związek pomiędzy zmienną objaśniającą a wynikiem.
Częściowe wykresy rezyduów powstają na zasadzie oddzielenia relacji pomiędzy predyktorem
a odpowiedzią, uwzględniane są przy tym wszystkie inne zmienne predykcyjne. Rezydua częściowe
mogą być traktowane jako „syntetyczne wyniki”, łączące prognozy oparte na pojedynczej zmiennej
predykcyjnej z faktycznymi resztami z pełnego równania regresji.

172 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rezydua częściowe dla zmiennej Xi to zwykła reszta plus czynnik regresji powiązany z Xi:
𝑅𝑒𝑧𝑦𝑑𝑢𝑎 𝑐𝑧ęś𝑐𝑖𝑜𝑤𝑒 = 𝑅𝑒𝑧𝑦𝑑𝑢𝑎 + 𝑏 𝑋
gdzie bƹ i jest szacowanym współczynnikiem regresji. Funkcja predict w R jest opcją, która zwraca
pojedyncze wartości regresji bƹ i Xi.
terms <- predict(lm_98105, type='terms')
partial_resid <- resid(lm_98105) + terms

Wykres rezyduów częściowych wyświetla predyktor Xi na osi x, a reszty częściowe na osi y. Wyko-
rzystując ggplot2, można łatwo dołączyć do wykresu funkcję wygładzającą rezydua częściowe.
df <- data.frame(SqFtTotLiving = house_98105[, 'SqFtTotLiving'],
Terms = terms[, 'SqFtTotLiving'],
PartialResid = partial_resid[, 'SqFtTotLiving'])
ggplot(df, aes(SqFtTotLiving, PartialResid)) +
geom_point(shape=1) + scale_shape(solid = FALSE) +
geom_smooth(linetype=2) +
geom_line(aes(SqFtTotLiving, Terms))

Pakiet statsmodels zawiera metodę sm.graphics.plot_ccpr, tworzącą podobny wykres reszt cząstkowych:
sm.graphics.plot_ccpr(result_98105, 'SqFtTotLiving')

Wykresy w R i Pythonie różnią się o stałe przesunięcie. W R dodawana jest stała po to, aby średnia
członów była równa 0.
Wykres końcowy jest przedstawiony na rysunku 4.9. Rezydua częściowe są oszacowaniem udziału,
jaki SqFtTotLiving dodaje do ceny sprzedaży. Związek pomiędzy SqFtTotLiving i ceną sprzedaży
jest ewidentnie nieliniowy (linia przerywana). Prosta regresji (linia ciągła) nie doszacowuje ceny
sprzedaży dla domów o powierzchni poniżej 1000 stóp kwadratowych i przeszacowuje ceny dla domów
o powierzchni pomiędzy 2000 a 3000 stóp kwadratowych. Istnieje zbyt mało danych dla domów o po-
wierzchni powyżej 4000 stóp kwadratowych, by można było wyciągnąć wnioski o takich domach.

Rysunek 4.9. Wykres rezyduów częściowych dla zmiennej SqFtTotLiving

Diagnostyka regresji | 173

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Taka nieliniowość ma sens w powyższym przypadku. Dodanie 500 stóp kwadratowych do małego
domu stanowi zdecydowanie większą różnicę niż dodanie 500 stóp kwadratowych do dużego
domu. Sugeruje to, że zamiast prostej liniowej zależności dla SqFtTotLiving powinna być rozwa-
żona zależność nieliniowa (patrz podrozdział „Regresja wielomianowa i regresja sklejana” w dalszej
części tego rozdziału).

Główne zasady
• Mimo iż wartości odstające mogą sprawiać problemy w przypadku małych zbiorów da-
nych, podstawowym celem takiej analizy jest identyfikacja problemów z danymi i lokali-
zacja anomalii.
• Pojedyncze rekordy (w tym wartości odstające regresji) mogą mieć duży wpływ na równanie
regresji dla małych zbiorów danych, ale efekt ten rozmywa się w dużych zbiorach.
• Jeśli model regresji jest używany do formalnego wnioskowania (p-wartości itp.), to należy
sprawdzić pewne założenia dla rozkładu reszt. W ogólnym przypadku jednak rozkłady reszt
nie są krytyczne w data science.
• Wykres rezyduów częściowych może być użyty do określenia ilościowego dopasowania
dla każdego czynnika regresji, prawdopodobnie prowadzącego do alternatywnej specy-
fikacji modelu.

Regresja wielomianowa i regresja sklejana


Związek pomiędzy odpowiedzią a zmiennymi opisującymi nie musi koniecznie być liniowy.
Odpowiedź na dawkę leku najczęściej jest nieliniowa: podwajanie dawki nie prowadzi do podwo-
jenia odpowiedzi. Popyt na produkt nie jest liniową funkcją kwoty, jaką się wyda na reklamę;
w pewnym momencie popyt się nasyci. Istnieje wiele metod, za pomocą których można zawrzeć
w regresji te nieliniowe zjawiska.

Kluczowe pojęcia dotyczące regresji nieliniowej


Regresja wielomianowa
Dodanie czynników wielomianu (kwadratowych, sześciennych itd.) do równania regresji.

Regresja sklejana
Dopasowanie wygładzonej krzywej serią odcinków wielomianów.

Węzły
Wartości, które rozdzielają odcinki funkcji sklejanej.

Uogólnione modele addytywne


Modele sklejane z automatycznym doborem węzłów.

174 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Regresja nieliniowa
Kiedy statystycy mówią o regresji nieliniowej (ang. nonlinear regression), odnoszą
się do modeli, które nie mogą być dopasowane metodą najmniejszych kwadratów.
Jakie rodzaje modeli są nieliniowe? W zasadzie wszystkie, w których odpowiedź nie
może być przedstawiona za pomocą liniowej kombinacji predyktorów lub pewnych
ich transformacji. Dopasowanie modeli regresji nieliniowej jest trudniejsze i bardziej
wymagające obliczeniowo, ponieważ niezbędna jest przy nim optymalizacja nume-
ryczna. Z tego powodu, jeśli to możliwe, używa się modeli liniowych.

Wielomian
Regresja wielomianowa (ang. polynomial regression) wymaga zastosowania czynników wielomianu
w równaniu regresji. Pierwszy raz użyto regresji wielomianowej w artykule J.D. Gergonne’a z 1815 r.
Dla przykładu regresja kwadratowa pomiędzy odpowiedzią Y a zmienną opisującą X ma formę:

𝑌 = 𝑏 + 𝑏` 𝑋 + 𝑏 𝑋 + 𝑒

Regresja wielomianowa może być dopasowana w R za pomocą funkcji poly. Poniższy przykład do-
pasowuje równanie kwadratowe dla SqFtTotLiving z danych dotyczących domów w King County:
lm(AdjSalePrice ~ poly(SqFtTotLiving, 2) + SqFtLot +
BldgGrade + Bathrooms + Bedrooms,
data=house_98105)

Call:
lm(formula = AdjSalePrice ~ poly(SqFtTotLiving, 2) + SqFtLot +
BldgGrade + Bathrooms + Bedrooms, data = house_98105)

Coefficients:
(Intercept) poly(SqFtTotLiving, 2)1
-402530.47 3271519.49
poly(SqFtTotLiving, 2)2 SqFtLot
776934.02 32.56
BldgGrade Bathrooms
135717.06 -1435.12
Bedrooms
-9191.94

W pakiecie statsmodels dodajemy do definicji człon kwadratowy za pomocą wyrażenia I(SqFtTot


´Living**2):
model_poly = smf.ols(formula='AdjSalePrice ~ SqFtTotLiving + ' +
'+ I(SqFtTotLiving**2) + ' +
'SqFtLot + Bathrooms + Bedrooms + BldgGrade', data=house_98105)
result_poly = model_poly.fit()
result_poly.summary()

Wyraz wolny i współczynniki wielomianowe są inne w porównaniu z R. Wynika to z różnic


w implementacjach. Pozostałe współczynniki i przewidywania są takie same.
W tym przypadku mamy dwa współczynniki powiązane z SqFtTotLiving: jeden dla części liniowej,
drugi dla części kwadratowej.

Regresja wielomianowa i regresja sklejana | 175

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Wykres częściowych rezyduów (patrz punkt „Wykresy częściowych rezyduów i nieliniowość” we
wcześniejszej części tego rozdziału) wskazuje na pewne krzywizny w równaniu regresji, powiązane
z SqFtTotLiving. Dopasowana krzywa bardziej odpowiada funkcji wygładzonej (patrz punkt „Funk-
cja sklejana” w dalszej części tego rozdziału) dla rezyduów częściowych w porównaniu do prostej
(patrz rysunek 4.10).

Rysunek 4.10. Dopasowanie regresji wielomianowej do zmiennej SqFtTotLiving (linia ciągła) a funkcja
wygładzona (linia przerywana; o funkcji sklejanej przeczytasz w kolejnym punkcie)

Implementacja z pakietu statsmodels działa tylko dla członów liniowych. W materiałach dodatko-
wych znajdziesz implementację przeznaczoną również dla regresji wielomianowej.

Funkcja sklejana
Regresja wielomianowa obejmuje jedynie pewien zakres krzywych w związkach nieliniowych.
Dodawanie czynników wyższych rzędów, jak sześcienny, najczęściej prowadzi do niepożądanego
„zachwiania” w równaniu regresji. Alternatywą, zazwyczaj lepszą, jest modelowanie związków nie-
liniowych za pomocą funkcji sklejanych (ang. splines). Funkcje sklejane umożliwiają wygładzoną
interpolację pomiędzy stałymi punktami. Funkcje sklejane były początkowo wykorzystywane przez
kreślarzy do rysowania gładkich krzywych, szczególnie przy projektowaniu statków i samolotów.
Funkcje sklejane były tworzone poprzez wyginanie cienkich drewnianych listew za pomocą obciąż-
ników, nazywanych kaczkami (patrz rysunek 4.11).

176 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 4.11. Funkcje sklejane były początkowo tworzone przy wykorzystaniu wyginanych listew drewnianych
oraz „kaczek” i były używane przez kreślarzy jako narzędzie do dopasowywania krzywych (fotografia dzięki
uprzejmości Boba Perry’ego)

Techniczna definicja funkcji sklejanej mówi, że jest ona serią wielomianów odcinkami ciągłych.
Funkcje te zostały stworzone podczas II wojny światowej w Aberdeen Proving Grounds8 przez I.J.
Schoenberga, rumuńskiego matematyka. Odcinki wielomianów są gładko łączone na podstawie
serii stałych punktów ze zmiennych opisujących, nazywanych węzłami (ang. knots). Sformułowa-
nie funkcji sklejanych jest zdecydowanie bardziej skomplikowane niż sformułowanie regresji wie-
lomianowej; szczegóły obliczania funkcji sklejanej zazwyczaj pozostawia się oprogramowaniu.
Pakiet R splines zawiera funkcję bs, która tworzy b-spline (ang. basis spline — bazowa krzywa
sklejana) dla modelu regresji. Poniższy kod doda b-spline do modelu regresji dla domów:
library(splines)
knots <- quantile(house_98105$SqFtTotLiving, p=c(.25, .5, .75))
lm_spline <- lm(AdjSalePrice ~ bs(SqFtTotLiving, knots=knots, degree=3) + SqFtLot +
Bathrooms + Bedrooms + BldgGrade, data=house_98105)

Dwa parametry muszą być doprecyzowane: stopnie swobody i położenie węzłów. W tym przy-
padku zmienna SqFtTotLiving jest zawarta w modelu przy wykorzystaniu sześciennej funkcji skle-
janej (degree = 3). Domyślnie bs wstawia węzły na granicach; dodatkowo węzły zostały umiesz-
czone na dolnym i górnym kwartylu oraz na medianie.
Interfejs równań statsmodel obsługuje funkcje sklejane podobnie jak R. Stworzymy teraz b-spline
za pomocą obiektu df i stopni swobody. W ten sposób otrzymamy df – degree = 6 – 3 = 3 węzły
wewnętrzne na pozycjach obliczonych tak samo jak w implementacji R:
formula = 'AdjSalePrice ~ bs(SqFtTotLiving, df=6, degree=3) + ' +
'SqFtLot + Bathrooms + Bedrooms + BldgGrade'
model_spline = smf.ols(formula=formula, data=house_98105)
result_spline = model_spline.fit()

8
Amerykański ośrodek wojskowy — przyp. tłum.

Regresja wielomianowa i regresja sklejana | 177

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W przeciwieństwie do członów liniowych, dla których współczynniki mają bezpośrednie znacze-
nie, współczynniki dla funkcji sklejanej są nieinterpretowalne. Zamiast tego praktyczne jest wyko-
rzystanie wizualizacji do prześledzenia natury dopasowania. Rysunek 4.12 przedstawia wykres
rezyduów częściowych dla modelu regresji. W przeciwieństwie do modeli wielomianowych modele
sklejane bardziej oddają funkcję wygładzoną, wykazując się większą elastycznością. W tym przy-
padku krzywa jest lepiej dopasowana do danych. Czy to oznacza, że funkcja sklejana jest lepszym
modelem? Niekoniecznie: nie ma to ekonomicznego sensu, że bardzo małe domy (o powierzchni
poniżej 1000 stóp kwadratowych) mają wyższe ceny niż nieco większe domy. Jest to prawdopodob-
nie artefakt wynikający ze zmiennej zakłócającej (patrz punkt „Zmienne zakłócające” we wcześniej-
szej części tego rozdziału).

Rysunek 4.12. Dopasowanie modelu regresji dla zmiennej SqFtTotLiving funkcją sklejaną (linia ciągła)
w porównaniu do dopasowania funkcją wygładzoną (linia przerywana)

Uogólnione modele addytywne


Załóżmy, że podejrzewasz nieliniowy związek pomiędzy wynikiem a zmienną objaśniającą; nie ma
znaczenia, czy bazujesz na posiadanej wiedzy, czy na badaniach modelu regresji. Czynniki wielo-
mianu mogą nie być wystarczająco elastyczne, by można było opisać ten związek. Z kolei funkcja
sklejana wymaga określenia węzłów. Uogólnione model addytywne (ang. generalized additive mo-
dels) są elastyczną techniką modelowania umożliwiającą automatyczne dopasowanie regresji skle-
janej. Pakiet R mgcv zawiera funkcję gam, która może być użyta do dopasowania modelu addytyw-
nego do danych dotyczących sprzedaży domów:

178 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


library(mgcv)
lm_gam <- gam(AdjSalePrice ~ s(SqFtTotLiving) + SqFtLot +
Bathrooms + Bedrooms + BldgGrade,
data=house_98105)

Argument s(SqFtTotLiving) mówi funkcji gam, żeby znalazła „najlepsze” węzły dla czynników
funkcji sklejanej (patrz rysunek 4.13).

Rysunek 4.13. Regresja modelu addytywnego dopasowana do zmiennej SqFtTotLiving (linia ciągła)
porównana z funkcją wygładzoną (linia przerywana)

W Pythonie możemy skorzystać z pakietu pyGAM. Dostępne są w nim metody umożliwiające regre-
sję oraz klasyfikację. Stworzymy tu model regresji za pomocą funkcji LinearGAM:
predictors = ['SqFtTotLiving', 'SqFtLot', 'Bathrooms', 'Bedrooms', 'BldgGrade']
outcome = 'AdjSalePrice'
X = house_98105[predictors].values
y = house_98105[outcome]

gam = LinearGAM(s(0, n_splines=12) + l(1) + l(2) + l(3) + l(4))


gam.gridsearch(X, y)

Domyślną wartością n_splines jest 20. Prowadzi ona do przetrenowania w przypadku więk-
szych wartości SqFtTotLiving. Wartość 12 pozwala uzyskać rozsądniejsze dopasowanie.

Regresja wielomianowa i regresja sklejana | 179

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Główne zasady
• Wartości odstające w regresji są rekordami z największą resztą.

• Współliniowość może spowodować niestabilność numeryczną w dopasowaniu równania


regresji.
• Zmienna zakłócająca jest ważnym predyktorem, który — wykluczony z modelu — może do-
prowadzić do fałszywych zależności w równaniu regresji.
• Określenie interakcji pomiędzy dwoma zmiennymi jest potrzebne, jeśli efekt jednej zmien-
nej zależy od poziomu lub wielkości tej drugiej.
• Regresja wielomianowa może dopasować nieliniowe związki pomiędzy zmienną predyk-
cyjną a zmienną wynikową.
• Funkcja sklejana jest serią odcinków wielomianów połączonych razem na węzłach.

• Możemy zautomatyzować proces doboru węzłów dla funkcji sklejanej za pomocą modeli GAM.

Dla pogłębienia wiedzy


• Więcej szczegółów dotyczących funkcji sklejanych i uogólnionych modeli addytywnych znaj-
dziesz w publikacji Elements of Statistical Learning, 2nd ed. Trevora Hastiego, Roperta Tibshi-
raniego i Jerome’a Friedmana (2009), a także w jej krótszej wersji, opartej na R, An Introduction to
Statistical Learning Garetha Jamesa, Danieli Witten, Trevora Hastiego i Roberta Tibshiraniego
(2013); obie pozycje zostały wydane przez wydawnictwo Springer.
• Dodatkowe informacje na temat stosowania modeli regresji w prognozowaniu szeregów cza-
sowych znajdziesz w książce Practical Time Series Forecasting with R, 2nd ed. autorstwa Galita
Shmueliego i Kennetha Lichtendahla (Axelrod Schnall, 2018).

Podsumowanie
Prawdopodobnie żadna inna metoda statystyczna nie była w ciągu ostatnich lat używana częściej
niż regresja — proces określania relacji pomiędzy wieloma zmiennymi opisującymi a zmienną wy-
nikową. Podstawową formą regresji jest forma liniowa: każdy predyktor ma przypisany współczyn-
nik, który opisuje liniowy związek pomiędzy regresją a wynikiem. Bardziej zaawansowane formy
regresji, jak wielomianowa czy sklejana, dopuszczają modelowanie związków nieliniowych. W sta-
tystyce klasycznej nacisk kładzie się na znalezienie dobrego dopasowania do obserwowanych danych
w celu wyjaśnienia lub opisania jakiegoś zjawiska. Siłą tego dopasowania jest określenie, w jakim
stopniu tradycyjne metryki wewnątrz próby mogą być użyte do określenia modelu. Dla kontrastu
celem w data science jest zazwyczaj prognoza dla nowych wartości, więc używane są metryki spoza
próby, oparte na dokładności predykcji. Różnorodny dobór metod jest wykorzystywany do reduk-
cji wymiarów i tworzenia bardziej zwięzłych modeli.

180 | Rozdział 4. Regresja i predykcja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


ROZDZIAŁ 5.
Klasyfikacja

Specjalistom data science często są powierzane zadania automatyzacji decyzji w problemach biz-
nesowych. Czy e-mail jest formą phishingu1? Czy klient będzie chciał zrezygnować z usług firmy?
Czy użytkownik w sieci kliknie reklamę? To wszystko są problemy klasyfikacji, czyli odmiany
uczenia nadzorowanego, w którym najpierw uczymy model na danych dających znane wyniki,
a następnie wprowadzamy do tak wytrenowanego modelu dane o nieznanych rezultatach. Klasyfi-
kacja jest prawdopodobnie najważniejszą formą predykcji: jej celem jest przewidzenie, czy rekord
jest „0”, czy „1” (phishing/nie phishing, kliknął/nie kliknął, zrezygnuje/nie zrezygnuje), lub czy jest
jedną z wielu kategorii (np. Gmail filtruje maile i dzieli te przychodzące na kategorie: „główne”,
„społeczności”, „oferty”, „fora”).
Często potrzebujemy czegoś więcej niż prostej klasyfikacji binarnej: chcemy znać prognozowane
prawdopodobieństwo tego, że dany przypadek należy do konkretnej klasy.
Zamiast modelu przypisującego za pomocą prostej klasyfikacji binarnej większość algorytmów
zwraca wynik prawdopodobieństwa należenia do konkretnej klasy (skłonność do tego). Dla regresji
logistycznej domyślny wynik z R jest w skali logarytmu szans, co musi być przekształcone na skłon-
ność. W pythonowym pakiecie scikit-learn regresja logistyczna, podobnie jak większość technik
klasyfikacji, zawiera dwie metody predykcyjne: predict (zwraca klasę) i predict_proba (zwraca
prawdopodobieństwo przynależności do każdej klasy). Do przekonwertowania skłonności w decy-
zję można użyć ruchomego poziomu odcięcia dla wyniku. Ogólne podejście jest następujące:
1. Załóż dla rozważanych klas prawdopodobieństwo progowe, powyżej którego przyjmujemy, że
rekord należy do danej klasy.
2. Oszacuj (dowolnym modelem) prawdopodobieństwo przynależności rekordu do danej klasy.
3. Jeśli to prawdopodobieństwo jest powyżej zakładanego progu, przypisz nowy rekord do danej
klasy.
Im wyższy próg, tym mniej rekordów prognozowanych jako 1 — przynależących do danej klasy.
Im niższy próg, tym więcej rekordów zaklasyfikowanych jako 1.

1
Rodzaj wiadomości wyłudzających dane, np. dotyczące konta bankowego — przyp. tłum.

181

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Ten rozdział przedstawia kilka kluczowych technik klasyfikacji i szacowania skłonności; dodat-
kowe metody, które mogą być użyte zarówno w klasyfikacji, jak i predykcji numerycznej, są opisane
w kolejnym rozdziale.

Więcej niż dwie kategorie?


Znaczna większość problemów bazuje na odpowiedzi binarnej. Jednakże niektóre problemy do-
tyczące klasyfikacji wymagają odpowiedzi dla więcej niż dwóch możliwych klas. Na przykład od-
nawianie rocznej umowy przez klienta może przebiegać zgodnie z jednym z trzech scenariuszy:
klient rezygnuje (Y = 2), klient przechodzi na abonament odnawiany miesięcznie (Y = 1) lub pod-
pisuje nową umowę na rok (Y = 0). Celem klasyfikacji jest prognoza dla Y = j, dla j = 0, 1, 2.
Większość metod klasyfikacji przedstawionych w tym rozdziale może być, bezpośrednio lub po
niewielkiej zmianie, użyta jako klasyfikator dla więcej niż dwóch klas. Co więcej, każdy problem
wielu klas może być przedstawiony w postaci serii problemów binarnych z wykorzystaniem praw-
dopodobieństwa warunkowego. Na przykład żeby móc prognozować wynik dla kontraktu, należy
rozwiązać dwa problemy binarne:
• Predykcja dla Y = 0 czy Y > 0?

• Jeśli Y > 0, predykcja dla Y = 1 czy Y = 2?

W takiej sytuacji najlepiej jest podzielić problem na dwa przypadki: (1) czy klient zrezygnuje i,
jeśli nie, (2) jaki typ umowy wybierze. Z punktu widzenia dopasowania modelu najczęściej ko-
rzystniejsze jest przekształcenie problemu wieloklasowego na serię problemów binarnych. Zazwy-
czaj jest to stosowane, gdy jedna z kategorii występuje dużo częściej niż pozostałe.

Naiwny klasyfikator bayesowski


Naiwny klasyfikator bayesowski wykorzystuje prawdopodobieństwo obserwowanej zmiennej ob-
jaśniającej dla zadanego wyniku do oszacowania tego, co nas naprawdę interesuje: prawdopodo-
bieństwa obserwowanego wyniku Y = i dla zadanego zbioru zmiennych objaśniających2.

Kluczowe pojęcia dotyczące naiwnego klasyfikatora bayesowskiego


Prawdopodobieństwo warunkowe
Prawdopodobieństwo zaobserwowania jakiegoś zdarzenia (powiedzmy X = j) dla zadanego
innego zdarzenia (powiedzmy Y = i), zapisane jako P(Xj|Yi).

Prawdopodobieństwo a posteriori
Prawdopodobieństwo uzyskania wyniku po zebraniu informacji o zmiennych opisujących
(w przeciwieństwie do prawdopodobieństwa a priori wyniku, które nie bierze pod uwagę
informacji o predyktorze).

2
Tę i kolejne części tego rozdziału wykorzystano za zgodą Petera Bruce’a, Andrew Bruce’a i Petera Gedecka © 2020
Datastats LCC.

182 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Żeby zrozumieć zasadę działania naiwnego klasyfikatora bayesowskiego, można zacząć od wyob-
rażenia sobie pełnego lub dokładnego klasyfikatora bayesowskiego. Dla każdego rekordu, który
trzeba zaklasyfikować:
1. Znajdź wszystkie rekordy z tym samym profilem zmiennych opisujących (tj. takim, w którym
zmienne opisujące są takie same).
2. Określ, do jakiej klasy należą te rekordy i jaka klasa jest dominująca (tj. prawdopodobna).
3. Przypisz nowy rekord do tej klasy.
Przedstawione podejście jest równoznaczne ze znalezieniem wszystkich rekordów w próbie, które
są dokładnie takie jak nowy rekord, czyli wszystkie wartości zmiennych opisujących są identyczne.

W standardowym zastosowaniu naiwnego klasyfikatora bayesowskiego zmienne opi-


sujące muszą być zmiennymi skategoryzowanymi. W punkcie „Numeryczne zmienne
objaśniające” w dalszej części tego rozdziału znajdziesz opis sposobu obejścia pro-
blemu wykorzystania zmiennych ciągłych.

Dlaczego klasyfikator bayesowski jest niepraktyczny?


Kiedy liczba zmiennych objaśniających przekracza rozmiar poręczny, wiele z rekordów, które na-
leży zaklasyfikować, nie będzie się idealnie pokrywać co do wartości. Wyobraź sobie model pro-
gnozujący wyniki głosowania na bazie danych demograficznych. Nawet znaczna próba może nie
zawierać pojedynczego wpisu dla nowego rekordu, którym jest mężczyzna pochodzenia latyno-
skiego, z wysokimi dochodami, pochodzący ze środkowej części Zachodniego Wybrzeża, głosujący
w poprzednich wyborach, ale niegłosujący w wyborach wcześniejszych, mający trzy córki i jednego
syna, rozwiedziony. A to dopiero osiem zmiennych — niewielka liczba jak na problem klasyfikacji.
Dodanie kolejnej nowej zmiennej z pięcioma równie prawdopodobnymi kategoriami zmniejsza
prawdopodobieństwo pięciokrotnie.

Naiwne rozwiązanie
W rozwiązaniu naiwnego klasyfikatora bayesowskiego nie przestrzegamy już obliczania prawdo-
podobieństwa dla tych rekordów, które odpowiadają rekordom do zaklasyfikowania. Zamiast tego
wykorzystujemy cały zbiór danych. Naiwna modyfikacja klasyfikatora bayesowskiego jest następująca:
1. Dla binarnej odpowiedzi Y = i (i = 0 lub 1) oszacuj indywidualne warunki prawdopodobieństwa
dla każdej zmiennej oznajmiającej P(Xj|Y = i); to są wartości określające, z jakim prawdopodo-
bieństwem dany rekord występuje w danych, jeśli obserwujemy Y = i. To prawdopodobieństwo
jest szacowane na podstawie proporcji wartości Xj pośród rekordów Y = i w zbiorze uczącym.
2. Pomnóż wyliczone prawdopodobieństwa przez siebie, a następnie przez udział rekordów na-
leżących do Y = i.
3. Powtórz kroki 1. i 2. dla wszystkich klas.
4. Oszacuj prawdopodobieństwa wyniku i poprzez wartość obliczoną w kroku 2. dla i-tej klasy
i podziel przez sumę tych wartości dla wszystkich klas.
5. Przypisz rekord do klasy z najwyższym prawdopodobieństwem dla zadanego zbioru zmien-
nych objaśniających.

Naiwny klasyfikator bayesowski | 183

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Algorytm naiwnego klasyfikatora bayesowskiego może być przedstawiony w postaci równania dla
prawdopodobieństwa zaobserwowania wyniku Y = i dla zadanego zestawu zmiennych objaśniają-
cych X1, …, Xp:
𝑃(𝑌 = 𝑖|𝑋 , 𝑋 , . . . , 𝑋 )

Poniżej prezentujemy pełny wzór na obliczanie prawdopodobieństwa przynależności do klas za


pomocą dokładnego klasyfikatora bayesowskiego:

𝑃(𝑌 = 𝑖)𝑃 𝑋 , … , 𝑋 |𝑌 = 𝑖
𝑃 𝑌 = 𝑖|𝑋 , 𝑋 , … , 𝑋 =
𝑃(𝑌 = 0)𝑃 𝑋 , … , 𝑋 |𝑌 = 0 + 𝑃(𝑌 = 1)𝑃 𝑋 , … , 𝑋 |𝑌 = 1

Przy naiwnym założeniu bayesowskim niezależności warunkowej powyższy wzór przyjmuje nastę-
pującą postać:

𝑃 𝑌 = 𝑖|𝑋 , 𝑋 , … , 𝑋 =
𝑃(𝑌 = 𝑖)𝑃(𝑋 |𝑌 = 𝑖) … 𝑃 𝑋 |𝑌 = 𝑖
=
𝑃(𝑌 = 0)𝑃(𝑋 |𝑌 = 0) … 𝑃 𝑋 |𝑌 = 0 + 𝑃(𝑌 = 1)𝑃(𝑋 |𝑌 = 1) … 𝑃 𝑋 |𝑌 = 1

Dlaczego powyższy wzór jest nazywany naiwnym? Przyjęliśmy upraszczające założenie, że do-
kładne prawdopodobieństwo warunkowe dla wektora zmiennych opisujących dla obserwowanego
wyniku jest dobrze oszacowane poprzez iloczyn poszczególnych prawdopodobieństw warunko-
wych P(Xj|Y = i). Innymi słowy, w oszacowaniu P(Xj|Y = i) zamiast P(X1, X2, …, Xp|Y = i) zakła-
damy, że Xj jest niezależne od wszystkich pozostałych predyktorów Xk dla k ≠ j.
Kilka pakietów w R może być użytych do oszacowania naiwnego klasyfikatora bayesowskiego. Poniżej
przedstawiono dopasowanie modelu przy użyciu pakietu klaR na podstawie danych kredytowych:
library(klaR)
naive_model <- NaiveBayes(outcome ~ purpose_ + home_ + emp_len_,
data = na.omit(loan_data))
naive_model$table
$purpose_
var
grouping credit_card debt_consolidation home_improvement major_purchase
paid off 0.18759649 0.55215915 0.07150104 0.05359270
default 0.15151515 0.57571347 0.05981209 0.03727229
var
grouping medical other small_business
paid off 0.01424728 0.09990737 0.02099599
default 0.01433549 0.11561025 0.04574126

$home_
var
grouping MORTGAGE OWN RENT
paid 0.4894800 0.0808963 0.4296237
default 0.4313440 0.0832782 0.4853778

$emp_len_
var
grouping < 1 Year > 1 Year
paid off 0.03105289 0.96894711
default 0.04728508 0.95271492

184 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Wynik modelu jest prawdopodobieństwem warunkowym P(Xj|Y = i).
W Pythonie możemy użyć klasy sklearn.naive_bayes.MultinomialNB z pakietu scikit-learn.
Przed dopasowaniem modelu musimy przekształcić cechy kategoryzujące w zmienne fikcyjne:
predictors = ['purpose_', 'home_', 'emp_len_']
outcome = 'outcome'
X = pd.get_dummies(loan_data[predictors], prefix='', prefix_sep='')
y = loan_data[outcome]

naive_model = MultinomialNB(alpha=0.01, fit_prior=True)


naive_model.fit(X, y)

Możliwe jest wyprowadzenie prawdopodobieństw warunkowych z dopasowanego modelu za po-


mocą własności feature_log_prob_.
Model może być wykorzystany do sporządzenia prognozy wyniku nowej pożyczki. Sprawdźmy to
na ostatniej wartości z zestawu danych:
new_loan <- loan_data[147, c('purpose_', 'home_', 'emp_len_')]
row.names(new_loan) <- NULL
new_loan
purpose_ home_ emp_len_
1 small_business MORTGAGE > 1 Year

W Pythonie uzyskujemy tę wartość w następujący sposób:


new_loan = X.loc[146:146, :]

W tym przypadku model prognozuje opóźnienie spłaty:


predict(naive_model, new_loan)
$class
[1] default
Levels: paid off default

$posterior
paid off default
[1,] 0.3463013 0.6536987

Jak już wiemy, klasyfikatory scikit-learn zawierają dwie metody: predict, zwracającą przewidy-
waną klasę, i predict_proba, zwracającą prawdopodobieństwo przynależności do klasy:
print('Przewidywana klasa: ', naive_model.predict(new_loan)[0])
probabilities = pd.DataFrame(naive_model.predict_proba(new_loan),
columns=loan_data[outcome].cat.categories)
print('Przewidywane prawdopodobieństwa:', probabilities)
--
Przewidywana klasa: default
Przewidywane prawdopodobieństwa
default paid off
0 0.653696 0.346304

Prognoza zwraca również oszacowanie a posteriori prawdopodobieństwa opóźnienia spłaty.


Naiwny klasyfikator bayesowski jest znany z obciążonego oszacowania. Jednakże kiedy celem jest
uszeregowanie (ang. rank) rekordów w zależności od prawdopodobieństwa, że Y = 1, nieobciążone
oszacowanie prawdopodobieństwa jest zbędne i naiwny klasyfikator Bayesa daje wystarczająco
wiarygodne wyniki.

Naiwny klasyfikator bayesowski | 185

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Numeryczne zmienne objaśniające
Klasyfikator bayesowski działa jedynie na predyktorach skategoryzowanych (np. klasyfikacja spamu,
obecności w pracy, zdań, znaków itd. jest kwintesencją zadań predykcyjnych). W celu zastosowania
naiwnego klasyfikatora bayesowskiego dla zmiennych numerycznych należy wybrać jedną z dwóch
możliwości:
• Pogrupowanie i przekonwertowanie predyktorów numerycznych do zmiennych skategoryzo-
wanych, a następnie zastosowanie algorytmu z poprzedniego punktu.
• Wykorzystanie modelu prawdopodobieństwa — np. rozkładu normalnego (patrz punkt „Rozkład
normalny” w rozdziale 2.) — do oszacowania prawdopodobieństwa warunkowego P(Xj|Y = i).

Gdy jakaś kategoria predyktora nie występuje w danych uczących, algorytm przypi-
suje prawdopodobieństwo zerowe do zmiennej wyjściowej dla nowych danych,
zamiast po prostu ją zignorować i wykorzystać informacje z innych zmiennych,
tak jak to robią inne metody. Większość implementacji naiwnego klasyfikatora
bayesowskiego zapobiega temu poprzez wprowadzenie członu wygładzającego
(wygładzanie Laplace’a).

Główne zasady
• Naiwny klasyfikator bayesowski pracuje na skategoryzowanych predyktorach i wynikach.

• Klasyfikator ten pyta: „Która kategoria predyktora spośród wszystkich kategorii wyników
jest najbardziej prawdopodobna?”.
• Ta informacja jest następnie odwracana do oszacowania kategorii wyniku dla zadanego ze-
stawu zmiennych objaśniających.

Dla pogłębienia wiedzy


• Trevor Hastie, Robert Tibshirani, Jerome Friedman, The Elements of Statistical Learning, 2nd ed.,
Springer, 2009.
• Cały rozdział o naiwnym klasyfikatorze bayesowskim znajdziesz w książce Galit Shmueli,
Petera Bruce’a, Nitina Patela, Petera Gedecka, Inbala Yahava i Kennetha Lichtendahla Data
Mining for Business Analytics, (Wiley, 2016, wydania dla R, Pythona, Excela i JMP).

Analiza dyskryminacyjna
Analiza dyskryminacyjna jest najstarszym klasyfikatorem statystycznym; została przedstawiona
w 1936 r. przez R.A. Fishera w artykule opublikowanym w czasopiśmie „Annals of Eugenics”3.

3
Zaskakujące jest to, że pierwszy artykuł o klasyfikacji statystycznej został opublikowany w czasopiśmie poświęco-
nym eugenice. Faktycznie, istnieje kłopotliwe powiązanie pomiędzy wczesnym rozwojem statystyki a eugeniką
(https://www.statistics.com/history-eugenics-journey-to-the-dark-side-at-the-dawn-of-statistics/).

186 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące analizy dyskryminacyjnej
Kowariancja
Miara rozciągnięcia, określająca, w jaki sposób jedna zmienna zmienia się w odniesieniu do
innej (tj. podobieństwo wielkości i kierunku).

Funkcja dyskryminacyjna
Funkcja, która zastosowana na zmiennych objaśniających maksymalizuje rozdział klas.

Wagi funkcji dyskryminacyjnej


Współczynniki powstające poprzez zastosowanie funkcji dyskryminacyjnej, używane do osza-
cowania prawdopodobieństwa przynależności do takiej czy innej klasy.

Analiza dyskryminacyjna obejmuje kilka technik; najpowszechniej wykorzystywaną jest liniowa


analiza dyskryminacyjna (LDA, ang. linear discriminant analysis). Oryginalna metoda zapropo-
nowana przez Fishera tak naprawdę różniła nieco się od LDA, ale mechanizmy obu tych metod są
w zasadzie takie same. LDA jest obecnie rzadziej używana ze względu na mnogość bardziej wyszu-
kanych metod, takich jak drzewa decyzyjne i regresja logistyczna.
Jednakże wciąż możesz napotkać LDA w niektórych zastosowaniach, jest ona również powiązana
z innymi, szerzej stosowanymi metodami (takimi jak analiza głównych składowych; patrz podroz-
dział „Analiza głównych składowych” w rozdziale 7.). Dodatkowo analiza dyskryminacyjna może
dostarczyć miary istotności predyktora i jest wykorzystywana jako wydajna obliczeniowo metoda
selekcji cech.

Skrót LDA, oznaczający liniową analizę dyskryminacyjną, w języku angielskim ma


również inne rozwinięcie: Latent Dirichlet Allocation, co z kolei jest nazwą metody
wykorzystywanej w przetwarzaniu tekstu oraz mowy i niemającej nic wspólnego
z liniową analizą dyskryminacyjną.

Macierz kowariancji
W celu wyjaśnienia analizy dyskryminacyjnej na początek niezbędne jest wprowadzenie pojęcia
kowariancji (ang. covariance) pomiędzy dwoma zmiennymi lub większą ich liczbą. Kowariancja
mierzy związek pomiędzy dwoma zmiennymi: x i z. Oznaczmy średnią dla każdej zmiennej przez
𝑥̄ i z̄ (patrz punkt „Średnia” w rozdziale 1.). Kowariancja sx,z pomiędzy x i z jest opisana jako:

∑ (𝑥 − 𝑥̄ )(𝑧 − 𝑧̄ )
𝑠 , =
𝑛−1
gdzie n jest liczbą rekordów (zauważ, że dzielimy przez n–1 zamiast przez n; patrz ramka „Stopnie
swobody i n czy n–1?” w rozdziale 1.).
Podobnie jak w przypadku współczynnika korelacji (patrz podrozdział „Korelacja” w rozdziale 1.),
wartości pozytywne wskazują na pozytywny związek, a negatywne wartości wskazują na związek
negatywny. Jednak korelacja jest rozpięta pomiędzy –1 a 1, podczas gdy skala kowariancji zależy

Analiza dyskryminacyjna | 187

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


od skali zmiennych x i z. Macierz kowariancji (ang. covariance matrix) ∑ dla x i z zawiera poje-
dyncze wariancje zmiennej s2x i s2z na przekątnej (gdzie wiersz i kolumna to ta sama zmienna),
a kowariancje pomiędzy parami zmiennych w pozostałych polach.

𝑠 𝑠,
Σ=
𝑠, 𝑠

Jak być może pamiętasz, odchylenie standardowe jest wykorzystywane do normali-


zacji zmiennej do z-wartości; macierz kowariancji jest używana w wielowymiaro-
wym rozszerzeniu procesu standaryzacji. Jest to znane jako odległość Mahalanobisa
(patrz uwaga „Inne metryki odległości” w rozdziale 6.) i jest powiązane z funkcją LDA.

Liniowy dyskryminator Fishera


Dla uproszczenia sprawy skupmy się na problemie klasyfikacji, w której chcemy prognozować wy-
nik binarny y, wykorzystując jedynie dwie ciągłe zmienne numeryczne (x, z). Technicznie rzecz
ujmując, analiza dyskryminacyjna zakłada, że zmienna predykcyjna jest ciągła i ma rozkład nor-
malny; w praktyce metoda działa dobrze również dla przypadków niezbyt odległych od rozkładu
normalnego i predyktorów binarnych. Liniowy dyskryminator Fishera rozdziela wariacje pomiędzy
grupami z jednej strony od wariacji wewnątrz grup z drugiej strony. W szczególności, żeby podzie-
lić rekordy na dwie grupy, liniowa analiza dyskryminacyjna (ang. linear discriminant analysis —
LDA) skupia się na maksymalizacji sumy kwadratów „pomiędzy” SKpomiędzy (mierzony rozrzut po-
między dwoma grupami) w odniesieniu do sumy kwadratów wewnątrz SKwewnątrz (mierzony rozrzut
wewnątrz grupy). W tym przypadku dwie grupy odpowiadają rekordom: (x0, z0), dla którego y = 0,
oraz (x1, z1), dla którego y = 1. Ta metoda znajduje liniową zależność wxx+wzz, która maksymalizuje
stosunek sum kwadratów:

𝑆𝐾 ę
𝑆𝐾 ą

Suma kwadratów pomiędzy grupami jest odległością kwadratową pomiędzy dwoma średnimi
z grup, a wewnętrzna suma kwadratów jest rozrzuceniem wokół średniej w każdej grupie, ważonej
przez macierz kowariancji. Intuicyjnie, maksymalizując sumę kwadratów pomiędzy grupami i mi-
nimalizując sumę wewnętrzną, metoda doprowadzi do najlepszego rozdziału pomiędzy dwie grupy.

Prosty przykład
Pakiet MASS, związany z książką Modern Applied Statistics with S, autorstwa W.N. Venablesa, B.D.
Ripleya (Springer, 1994), zawiera funkcję dla LDA w R. Przedstawione poniżej rozwiązanie pre-
zentuje wykorzystanie funkcji do próbkowania danych dotyczących pożyczek przy użyciu dwóch
zmiennych objaśniających, borrower_score oraz payment_inc_ratio, i wyświetla oszacowane wagi
liniowego dyskryminatora.
library(MASS)
loan_lda <- lda(outcome ~ borrower_score + payment_inc_ratio,
data=loan3000)

188 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


loan_lda$scaling
LD1
borrower_score 7.17583880
payment_inc_ratio -0.09967559

W Pythonie możemy użyć metody LinearDiscriminantAnalysis z klasy sklearn.discriminant_analysis.


Własność scalings_ pozwala uzyskać oszacowane wagi:
loan3000.outcome = loan3000.outcome.astype('category')

predictors = ['borrower_score', 'payment_inc_ratio']


outcome = 'outcome'

X = loan3000[predictors]
y = loan3000[outcome]

loan_lda = LinearDiscriminantAnalysis()
loan_lda.fit(X, y)
pd.DataFrame(loan_lda.scalings_, index=X.columns)

Analiza dyskryminacyjna do selekcji cech


Jeśli zmienna predykcyjna jest normalizowana przed zastosowaniem LDA, wagi dys-
kryminatora są miarami istotności zmiennych, co zapewnia wydajną obliczeniowo
metodę do selekcji cech.

Funkcja lda może prognozować prawdopodobieństwo dwóch wykluczających się scenariuszy spłaty
pożyczki: „opóźnionej” i „spłaconej”:
pred <- predict(loan_lda)
head(pred$posterior)
default paid off
1 0.4464563 0.5535437
2 0.4410466 0.5589534
3 0.7273038 0.2726962
4 0.4937462 0.5062538
5 0.3900475 0.6099525
6 0.5892594 0.4107406

Metoda predict_proba dopasowanego modelu zwraca prawdopodobieństwa dla wyników default


i paid off:
pred = pd.DataFrame(loan_lda.predict_proba(loan3000[predictors]),
columns=loan_lda.classes_)
pred.head()

Wykres predykcji pomaga zilustrować sposób, w jaki działa LDA. Przy wykorzystaniu wyjścia
z funkcji predict wykres oszacowanego prawdopodobieństwa opóźnienia w spłacie jest tworzony
następująco:
center <- 0.5 * (loan_lda$mean[1, ] + loan_lda$mean[2, ])
slope <- -loan_lda$scaling[1] / loan_lda$scaling[2]
intercept <- center[2] - center[1] * slope

ggplot(data=lda_df, aes(x=borrower_score, y=payment_inc_ratio,


color=prob_default)) +
geom_point(alpha=.6) +

Analiza dyskryminacyjna | 189

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


scale_color_gradientn(colors=c('#ca0020', '#f7f7f7', '#0571b0')) +
scale_x_continuous(expand=c(0,0)) +
scale_y_continuous(expand=c(0,0), lim=c(0, 20)) +
geom_abline(slope=slope, intercept=intercept, color='darkgreen')

Podobny wykres tworzymy w Pythonie w następujący sposób:


# Granice decyzyjne zostają określone za pomocą skalowania i środka średnich
center = np.mean(loan_lda.means_, axis=0)
slope = - loan_lda.scalings_[0] / loan_lda.scalings_[1]
intercept = center[1] - center[0] * slope

# Wartości payment_inc_ratio dla borrower_score w punktach 0 i 20


x_0 = (0 - intercept) / slope
x_20 = (20 - intercept) / slope

lda_df = pd.concat([loan3000, pred['default']], axis=1)


lda_df.head()

fig, ax = plt.subplots(figsize=(4, 4))


g = sns.scatterplot(x='borrower_score', y='payment_inc_ratio',
hue='default', data=lda_df,
palette=sns.diverging_palette(240, 10, n=9, as_cmap=True),
ax=ax, legend=False)

ax.set_ylim(0, 20)
ax.set_xlim(0.15, 0.8)
ax.plot((x_0, x_20), (0, 20), linewidth=3)
ax.plot(*loan_lda.means_.transpose())

Wykres wynikowy jest przedstawiony na rysunku 5.1. Punkty znajdujące się na lewo od ukośnej linii
stanowią przewidywania opóźnień w spłacaniu kredytu (prawdopodobieństwo większe od 0,5).

Rysunek 5.1. Predykcja LDA opóźnienia spłaty (prob) przy wykorzystaniu dwóch zmiennych: wskaźnika
wiarygodności kredytobiorcy (borrower_score) i stosunku opłat do dochodów (payment_inc_ratio)

190 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Wykorzystując wagi funkcji dyskryminującej, LDA dzieli przestrzeń predykcyjną na dwa regiony,
co zaznaczono na rysunku linią ciągłą. Prognozy znajdujące się dalej od linii w obydwu kierunkach
mają wyższy poziom ufności (tj. prawdopodobieństwo odległe od 0,5).

Rozwinięcia analizy dyskryminacyjnej


Więcej zmiennych predykcyjnych: podczas gdy tekst i przykłady w tej części wyko-
rzystują jedynie dwie zmienne objaśniające, LDA radzi sobie świetnie z większą ich
liczbą. Jedynym czynnikiem limitującym jest liczba rekordów (oszacowanie macie-
rzy kowariancji wymaga dostatecznej liczby wartości dla każdej zmiennej, co zazwy-
czaj nie jest problemem w data science).
Kwadratowa analiza dyskryminacyjna: jest to inny, najlepiej znany wariant analizy
dyskryminacyjnej (QDA, ang. quadratic discriminant analysis). Niezależnie od na-
zwy QDA jest w dalszym ciągu funkcją liniową. Najważniejsza różnica między tymi
wariantami dotyczy macierzy kowariancji, która dla LDA musi być jednakowa dla
obu grup: Y = 0 i Y = 1, a dla QDA dopuszcza się różnice dla grup w macierzy kowa-
riancji. W praktyce różnice te nie są krytyczne.

Główne zasady
• Analiza dyskryminacyjna działa dla zmiennych ciągłych i skategoryzowanych, jak również
dla skategoryzowanych wyników.
• W macierzy kowariancji obliczana jest funkcja liniowego dyskryminatora, która jest wyko-
rzystywana do odróżnienia rekordów należących do jednej klasy od tych należących do innej.
• Ta funkcja jest stosowana do znalezienia wag lub wskaźników dla każdego rekordu (jedna
waga dla każdej prawdopodobnej klasy), co określa jego oszacowaną klasę.

Dla pogłębienia wiedzy


• Zarówno The Elements of Statistical Learning, 2nd ed. Trevora Hastiego, Roberta Tibshirani-
ego i Jerome’a Friedmana (Springer, 2009), jak i (jako krótsza wersja) An Introduction to Sta-
tistical Learning Garetha Jamesa, Danieli Witten, Trevora Hastiego i Roberta Tibshiraniego
(Springer, 2013) zawierają rozdziały poświęcone analizie dyskryminacyjnej.
• Książka Data Mining for Business Analytics, Galit Shmueli, Peter Bruce, Nitin Patel, Peter Gedeck,
Inbal Yahav i Kenneth Lichtendahl (Wiley, 2007 – 2020, wydania dla R, Pythona, Excela i JMP)
zawiera rozdział poświęcony analizie dyskryminacyjnej.
• Dla zainteresowanych rysem hitorycznym oryginalny artykuł Fishera The Use of Multiple
Measurements in Taxonomic Problems, opublikowany w 1936 r. w „Annals of Eugenics” (obecnie
„Annals of Genetics”), dostępny online pod adresem: https://onlinelibrary.wiley.com/doi/epdf/
10.1111/j.1469-1809.1936.tb02137.x.

Analiza dyskryminacyjna | 191

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Regresja logistyczna
Regresja logistyczna jest podobna do liniowej regresji wielorakiej (zob. rozdział 4.), jedynie jej
wynik jest binarny. Do dokonania konwersji problemu w taki sposób, by móc zastosować model
liniowy, są wykorzystywane różne transformaty, podobnie jak w przypadku analizy dyskrymina-
cyjnej, a inaczej niż w przypadku K-najbliższych sąsiadów i naiwnego klasyfikatora bayesowskiego.
Regresja logistyczna jest podejściem do modelowania bardziej strukturalnym niż skupionym na
danych. Metoda ta jest popularna przede wszystkim ze względu na dużą szybkość obliczeniową
i wyjście umożliwiające szybkie klasyfikowanie nowych danych.

Kluczowe pojęcia dotyczące regresji logistycznej


Logit
Funkcja mapująca prawdopodobieństwo przynależności do danej klasy w zakresie ±∞
(zamiast od 0 do 1).
Synonim
funkcja logitowa

Szansa
Stosunek sukcesów (1) do porażek (0).

Logarytm szans
Odpowiedź transformowanego modelu (tu liniowego), który jest mapowany ponownie do po-
staci prawdopodobieństwa.

Funkcja odpowiedzi logistycznej i logit


Kluczowe składniki regresji logistycznej to odpowiedź funkcji logistycznej (ang. logistic response
function) i logit (ang. logit), dla których mapujemy prawdopodobieństwo (w skali od 0 do 1) do
bardziej rozległej skali, odpowiedniej dla modelowania liniowego.
W pierwszym kroku należy popatrzeć na zmienną wyjściową nie jak na etykietę binarną, ale raczej
jak na prawdopodobieństwo p, że ta etykieta wyniesie „1”. Kuszące jest modelowanie p jako funkcji
liniowej zmiennych objaśniających:

𝑝 = 𝛽 + 𝛽 𝑥 + 𝛽 𝑥 +. . . +𝛽 𝑥

Jednakże dopasowanie do takiego modelu nie zapewnia, że p znajdzie się pomiędzy 0 a 1, a musi
się tak stać dla prawdopodobieństwa.
Zamiast tego modelujemy p, stosując odpowiedź logistyczną (ang. logistic response) lub odwrotną
funkcję logit (ang. inverse logit function) dla predyktorów:

1
𝑝= ( ... )
1+𝑒

192 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Ta transformata zapewnia pozostanie p w zakresie od 0 do 1.
Żeby pozbyć się wykładników z mianownika, rozważamy szanse (ang. odds) zamiast prawdopodo-
bieństw. Szanse, znane wszystkim miłośnikom różnych gier, są stosunkiem „sukcesów” (1) do „po-
rażek” (0). W kategoriach prawdopodobieństwa szansa jest prawdopodobieństwem wystąpienia
zdarzenia podzielonym przez prawdopodobieństwo, że to zdarzenie nie nastąpi. Przykładowo jeśli
prawdopodobieństwo, że koń wygra, wynosi 0,5, to prawdopodobieństwo, że nie wygra, wynosi
(1–0,5) = 0,5, a szanse są równe 1,0.
𝑝
𝑆𝑧𝑎𝑛𝑠𝑒(𝑌 = 1) =
1−𝑝

Możemy wykorzystać prawdopodobieństwo z szans, używając odwrotnej funkcji szans:


𝑆𝑧𝑎𝑛𝑠𝑒
𝑝=
1 + 𝑆𝑧𝑎𝑛𝑠𝑒
Łączymy to z odpowiedzią funkcji logistycznej, przedstawionej wcześniej, żeby otrzymać:
...
𝑆𝑧𝑎𝑛𝑠𝑒(𝑌 = 1) = 𝑒
Ostatecznie, logarytmując obustronnie, otrzymujemy wyrażenie, które zawiera funkcję liniową
predyktorów:
𝑙𝑜𝑔( 𝑆𝑧𝑎𝑛𝑠𝑒(𝑌 = 1)) = 𝛽 + 𝛽 𝑥 + 𝛽 𝑥 +. . . +𝛽 𝑥

Logarytm szans (ang. log-odds function), znany również jako funkcja logit (ang. logit), mapuje praw-
dopodobieństwo p z przedziału (0,1) do dowolnej wartości z przedziału (–∞, +∞); patrz rysunek
5.2. Cykl transformacji jest kompletny; wykorzystany został model liniowy do prognozy prawdo-
podobieństwa, co z kolei zostało zmapowane do etykiet klas przez zastosowanie reguły progowania
— dowolny rekord o wartości prawdopodobieństwa większej niż próg jest klasyfikowany jako 1.

Rysunek 5.2. Wykres funkcji logitowej mapującej prawdopodobieństwo (p) do skali odpowiedniej dla modelu liniowego

Regresja logistyczna | 193

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Regresja logistyczna i GLM
Odpowiedź w regresji logistycznej jest logarytmem szans dla binarnego wyniku równego 1. Obser-
wujemy jedynie wynik binarny, nie logarytm szans, dlatego niezbędne są specjalne metody staty-
styczne dla dopasowania równania. Regresja logistyczna jest specjalnym typem uogólnionego
modelu liniowego (GLM, ang. generalized linear model), rozwiniętego dla rozszerzenia regresji
liniowej o kolejne parametry.
W R wykorzystujemy funkcję glm do dopasowania modelu regresji logistycznej, z parametrem family
ustawionym jako binomial. Poniższy kod dopasowuje model regresji logistycznej do danych dotyczą-
cych pożyczek konsumenckich przedstawionych w podrozdziale „K-najbliższych sąsiadów” w rozdziale 6.
logistic_model <- glm(outcome ~ payment_inc_ratio + purpose_ +
home_ + emp_len_ + borrower_score,
data=loan_data, family='binomial')
logistic_model
Call: glm(formula = outcome ~ payment_inc_ratio + purpose_ + home_ +
emp_len_ + borrower_score, family = "binomial", data = loan_data)

Coefficients:
(Intercept) payment_inc_ratio
1.63809 0.07974
purpose_debt_consolidation purpose_home_improvement
0.24937 0.40774
purpose_major_purchase purpose_medical
0.22963 0.51048
purpose_other purpose_small_business
0.62066 1.21526
home_OWN home_RENT
0.04833 0.15732
emp_len_ > 1 Year borrower_score
-0.35673 -4.61264

Degrees of Freedom: 45341 Total (i.e. Null); 45330 Residual


Null Deviance: 62860
Residual Deviance: 57510 AIC: 57540

Wynikiem jest zmienna outcome, która przyjmuje wartość 0, jeśli pożyczka jest spłacona, i 1, gdy jest
opóźnienie spłaty. purpose_ oraz home_ są zmiennymi objaśniającymi przedstawiającymi, odpowied-
nio, cel pożyczki i status mieszkaniowy. Podobnie jak w regresji liniowej, zmienna objaśniająca z P
poziomami jest reprezentowana przez P–1 kolumn. Domyślnie w R wykorzystywane jest kodowa-
nie referencyjne (ang. reference coding), a poziomy są porównywane do poziomu referencyjnego
(patrz podrozdział „Zmienne skategoryzowane w regresji” w rozdziale 4.). Poziomy referencyjne
dla tych zmiennych to, odpowiednio, credit_card (karta kredytowa) i MORTAGE (hipoteka). Zmienna
borrower_score jest wskaźnikiem od 0 o 1 odpowiadającym zdolności kredytowej pożyczkobiorcy
(od słabej do doskonałej). Ta zmienna została stworzona z kilku innych zmiennych wykorzystywa-
nych w metodzie K-najbliższych sąsiadów (patrz punkt „KNN w doborze cech” w rozdziale 6.).
W Pythonie wykorzystujemy klasę LogisticRegression z modułu sklearn.linear_model. Argu-
menty penalty i C zapobiegają przetrenowaniu za pomocą regularyzacji L1 i L2. Regularyzacja jest
domyślnie włączona. Jeżeli chcesz dopasować model bez regularyzacji, wyznacz bardzo dużą wartość C.
Argument solver dobiera funkcję minimalizującą; domyślnie używana jest biblioteka liblinear:

194 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


predictors = ['payment_inc_ratio', 'purpose_', 'home_', 'emp_len_',
'borrower_score']
outcome = 'outcome'
X = pd.get_dummies(loan_data[predictors], prefix='', prefix_sep='',
drop_first=True)
y = loan_data[outcome]

logit_reg = LogisticRegression(penalty='l2', C=1e42, solver='liblinear')


logit_reg.fit(X, y)

W przeciwieństwie do R pakiet sckit-learn wyprowadza klasy z niepowtarzalnych wartości w y


(paid off i default). Zgodnie z wewnętrznymi mechanizmami klasy są sortowane alfabetycznie. Jest
to kolejność odwrotna do stosowanej w wektorach czynnikowych w R, zatem kolejność współczyn-
ników również będzie odwrotna. Metoda predict zwraca etykietę klasy, a metoda predict_proba
zwraca prawdopodobieństwa w kolejności zgodnej z atrybutem logit_reg_classes_.

Uogólnione modele liniowe


Uogólnione modele liniowe (GLM) charakteryzują się dwoma głównymi komponentami:
• prawdopodobieństwem rozkładu lub rodziny (dla regresji logistycznej — dwumianowym),
• funkcją łączącą, tj. funkcją przekształcającą, która mapuje odpowiedź do predyktorów (dla re-
gresji logistycznej — logit).
Regresja logistyczna jest najbardziej popularną formą GLM. Specjalista data science napotka także
inne typy GLM. Czasami funkcja łącząca log jest wykorzystywana zamiast logit; w praktyce w nie-
wielu przypadkach wyniki uzyskane dzięki użyciu funkcji log będą znacząco różne od tych otrzy-
manych poprzez zastosowanie logit (np. liczba wizyt na stronie internetowej w konkretnym okre-
sie). Inna rodzina, zawierająca funkcje: ujemną, dwumianową i gamma, jest najczęściej używana
do modelowania upływającego czasu (np. czasu do awarii). W przeciwieństwie do regresji logi-
stycznej aplikacja GLM dla tych modeli wymaga większej dbałości o szczegóły. Najlepiej jest unikać
bardziej złożonych odmian GLM, dopóki nie zaznajomisz się z ich właściwościami i pułapkami, na
jakie możesz natrafić.

Wartości prognozowane na podstawie regresji logistycznej


Wartość prognozowana na podstawie regresji logistycznej w kontekście logarytmu szans wygląda
następująco: Ŷ = log(Szanse(Y = 1)). Prognozowane prawdopodobieństwo jest dane poprzez odpo-
wiedź funkcji logistycznej:
1
𝑝̂ =
1+𝑒
Popatrz np. na prognozy z modelu logistic_model uzyskiwane w R:
pred <- predict(logistic_model)
summary(pred)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-2.704774 -0.518825 -0.008539 0.002564 0.505061 3.509606

Regresja logistyczna | 195

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W Pythonie możemy przekształcić prawdopodobieństwa w ramkę danych i użyć metody describe,
aby uzyskać charakterystykę rozkładu:
pred = pd.DataFrame(logit_reg.predict_log_proba(X),
columns=loan_data[outcome].cat.categories)
pred.describe()

Zamiana wartości na prawdopodobieństwa jest prostą transformatą:


prob <- 1/(1 + exp(-pred))
summary(prob)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.06269 0.37313 0.49787 0.50000 0.62365 0.97096

Prawdopodobieństwa są bezpośrednio dostępne dzięki metodom predict_proba z pakietu scikit-learn:


pred = pd.DataFrame(logit_reg.predict_proba(X),
columns=loan_data[outcome].cat.categories)
pred.describe()

Te wartości są na skali od 0 do 1 i na razie nie mówią nic na temat prognozowania wyniku jako
opóźnionego czy spłaconego. Możemy zadeklarować dowolną wartość większą niż 0,5 jako do-
myślną. W praktyce niższy próg odcięcia jest odpowiedni, jeśli celem jest identyfikacja członków
rzadkiej klasy (patrz punkt „Problem mało licznych klas” w dalszej części tego rozdziału).

Interpretacja współczynników i iloraz szans


Zaletą regresji logistycznej jest możliwość tworzenia modelu, który może być wykorzystany do kla-
syfikacji nowych danych bez przeliczania. Kolejną zaletą jest względna łatwość, w porównaniu z innymi
metodami, interpretacji modelu. Kluczem do sukcesu jest zrozumienie ilorazu szans (ang. odds
ratio). Iloraz szans najprościej można wyjaśnić na przykładzie binarnej zmiennej skategoryzowanej X:

𝑆𝑧𝑎𝑛𝑠𝑒(𝑌 = 1|𝑋 = 1)
𝐼𝑙𝑜𝑟𝑎𝑧_𝑠𝑧𝑎𝑛𝑠 =
𝑆𝑧𝑎𝑛𝑠𝑒(𝑌 = 1|𝑋 = 0)

Jest to interpretowane jako szansa, że Y = 1, gdy X = 1, a szansa, że Y = 1, gdy X = 0. Jeśli iloraz


szans jest równy 2, to szansa, że Y = 1, jest dwa razy większa dla X = 1 niż dla X = 0.
Dlaczego należy się przejmować ilorazem szans zamiast prawdopodobieństwem? Bazujemy na
szansach, ponieważ współczynnik βj z regresji logistycznej jest logarytmem ilorazu szans dla Xj.
Objaśnijmy to na przykładzie. Dla dopasowania modelu z punktu „Regresja logistyczna i GLM”
z wcześniejszej części tego rozdziału współczynnik regresji dla purpose_small_business wynosi
1,21526. Oznacza to, że pożyczka na mały biznes w porównaniu do pożyczki na spłatę karty
kredytowej redukuje szanse na opóźnienie spłacenia o exp(1,21526) ≈ 3,4. Ewidentnie pożyczki
zaciągane w celu stworzenia lub rozwoju małego biznesu są znacznie bardziej ryzykowne niż inne
typy pożyczek.
Rysunek 5.3 przedstawia związek pomiędzy ilorazem szans a logarytmem ilorazu szans dla wartości
większych od 1. Ponieważ współczynniki są na skali logarytmicznej, wzrost współczynnika o 1 po-
woduje wzrost ilorazu szans o exp(1) ≈ 2,72.

196 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 5.3. Związek pomiędzy ilorazem szans a logarytmem ilorazu szans

Iloraz szans dla zmiennych numerycznych może być interpretowany podobnie: mierzy zmianę ilo-
razu szans dla zmiany X o jednostkę. Przykładowo efekt wzrostu stosunku opłat do dochodów z,
powiedzmy, 5 na 6 powoduje wzrost szans na opóźnienie spłaty pożyczki o czynnik exp(0,08244)
≈ 1,09. Zmienna borrower_score jest wskaźnikiem dla wiarygodności pożyczkobiorcy w zakresie
od 0 (niska) do 1 (wysoka). Szansa dla najlepszego pożyczkobiorcy w porównaniu do szansy naj-
gorszego, zalegającego ze spłatą, jest mniejsza o czynnik exp(–4,61264) ≈ 0,01. Innymi słowy, ry-
zyko opóźnienia spłaty w przypadku pożyczkobiorcy z najgorszą zdolnością kredytową jest 100
razy większe niż w przypadku najbardziej wiarygodnego pożyczkobiorcy!

Regresja liniowa i regresja logistyczna: podobieństwa i różnice


Regresja liniowa i regresja logistyczna mają wiele cech wspólnych. Obie zakładają liniowe zależno-
ści pomiędzy predyktorami a odpowiedzią. Badanie i dopasowanie najlepszego modelu jest prze-
prowadzane w bardzo podobny sposób. Rozwinięcia modelu liniowego, takie jak wykorzystanie
funkcji sklejanej do opracowania prognozy (zob. punkt „Funkcja sklejana” w rozdziale 4.), mogą
być tak samo stosowane w modelu regresji logistycznej. Regresja logistyczna różni się jednak od
liniowej w dwóch zasadniczych aspektach:
• sposobie dopasowania modelu (metoda najmniejszych kwadratów jest niestosowalna),
• naturze i analizie rezyduów modelu.

Dopasowanie modelu
Regresja liniowa jest dopasowywana przy użyciu metody najmniejszych kwadratów, a jakość do-
pasowania jest określana przy użyciu RMSE i statystyki R-kwadrat. W regresji logistycznej (inaczej
niż w liniowej) nie istnieje rozwiązanie zbliżone, w związku z czym model musi być dopasowywany

Regresja logistyczna | 197

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


metodą największej wiarygodności (MLE, ang. maximum likelihood estimation). Oszacowanie
metodą największej wiarygodności jest procesem, w którym próbuje się znaleźć odpowiedni model.
Odpowiedni model w największym stopniu ma szansę stworzyć dane, które obserwujemy. W rów-
naniu regresji logistycznej odpowiedź nie stanowi wyboru pomiędzy 0 a 1, jest raczej oszacowa-
niem logarytmu szans, że odpowiedź wynosi 1. MLE znajduje takie rozwiązanie, dla którego osza-
cowany logarytm szans w najlepszy sposób opisuje obserwowane dane. Mechanizm algorytmu
angażuje optymalizację quasi-Newtona, która iteruje po kolejnych wskaźnikach (algorytm ocenia-
nia Fishera, ang. Fisher’s scoring) opartych na aktualnych parametrach i uaktualnia parametry
w celu poprawy dopasowania.

Metoda największej wiarygodności


Zaprezentujemy teraz nieco więcej szczegółów, jeśli lubisz symbole statystyczne: zacznij od zbioru
danych (X1, X2, …, Xn) i modelu prawdopodobieństwa Pθ(X1, X2, …, Xn), który zależy od zbioru
parametrów θ. Celem MLE jest znalezienie takiego zbioru parametrów , który maksymalizuje
wartość Pθ(X1, X2, …, Xn), co oznacza, że maksymalizuje prawdopodobieństwo zaobserwowania
(X1, X2, …, Xn) przy zadanym modelu P. W procesie dopasowania model jest oceniany przy wy-
korzystaniu metryki zwanej odchyłką (ang. deviance):

𝑂𝑑𝑐ℎ𝑦ł𝑘𝑎 = −2 𝑙𝑜𝑔( 𝑃 (𝑋 , 𝑋 , … , 𝑋 ))
Im niższa jest odchyłka, tym lepsze dopasowanie.

Na szczęście większość adeptów nie musi martwić się szczegółami algorytmu dopasowania modelu,
ponieważ jest to zaimplementowane w oprogramowaniu. Większości specjalistów data science wy-
starczy informacja, że metody dopasowania modelu są skuteczne po spełnieniu pewnych założeń.

Postępowanie ze zmiennymi skategoryzowanymi


W regresji logistycznej zmienne skategoryzowane powinny być zakodowane jak
w regresji liniowej (patrz podrozdział „Zmienne skategoryzowane w regresji” w roz-
dziale 4.). W R i innym oprogramowaniu zazwyczaj dzieje się to automatycznie, zwy-
kle przy użyciu kodowania referencyjnego. Wszystkie inne metody klasyfikacji
przedstawione w tym rozdziale zazwyczaj używają reprezentacji kodowania 1 z n
(patrz punkt „Kodowanie 1 z n” w rozdziale 5.). W pakiecie scikit-learn najłatwiej
skorzystać z kodowania 1 z n, co oznacza, że jedynie n−1 otrzymywanych zmiennych
fikcyjnych zostanie użytych w regresji.

Ocena modelu
Podobnie jak inne metody klasyfikacji, tak i regresja logistyczna jest oceniana poprzez określenie
tego, jak dokładnie model klasyfikuje nowe dane (patrz podrozdział „Ewaluacja modeli klasyfika-
cji” w dalszej części tego rozdziału). Tak jak w regresji liniowej, do oceny i poprawy modelu można
wykorzystać niektóre standardowe narzędzia statystyczne. Wraz z oszacowaniem współczynników
R podaje również błąd standardowy współczynników (SE), z-wartość i p-wartość:

198 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


summary(logistic_model)

Call:
glm(formula = outcome ~ payment_inc_ratio + purpose_ + home_ +
emp_len_ + borrower_score, family = "binomial", data = loan_data)

Deviance Residuals:
Min 1Q Median 3Q Max
-2.51951 -1.06908 -0.05853 1.07421 2.15528

Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 1.638092 0.073708 22.224 < 2e-16 ***
payment_inc_ratio 0.079737 0.002487 32.058 < 2e-16 ***
purpose_debt_consolidation 0.249373 0.027615 9.030 < 2e-16 ***
purpose_home_improvement 0.407743 0.046615 8.747 < 2e-16 ***
purpose_major_purchase 0.229628 0.053683 4.277 1.89e-05 ***
purpose_medical 0.510479 0.086780 5.882 4.04e-09 ***
purpose_other 0.620663 0.039436 15.738 < 2e-16 ***
purpose_small_business 1.215261 0.063320 19.192 < 2e-16 ***
home_OWN 0.048330 0.038036 1.271 0.204
home_RENT 0.157320 0.021203 7.420 1.17e-13 ***
emp_len_ > 1 Year -0.356731 0.052622 -6.779 1.21e-11 ***
borrower_score -4.612638 0.083558 -55.203 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

Null deviance: 62857 on 45341 degrees of freedom


Residual deviance: 57515 on 45330 degrees of freedom
AIC: 57539

Number of Fisher Scoring iterations: 4

Pakiet statsmodels zawiera implementację uogólnionego modelu liniowego (GLM), dostarczającego


podobne informacje:
y_numbers = [1 if yi == 'default' else 0 for yi in y]
logit_reg_sm = sm.GLM(y_numbers, X.assign(const=1),
family=sm.families.Binomial())
logit_result = logit_reg_sm.fit()
logit_result.summary()

Interpretacja p-wartości ma to samo zastrzeżenie co w regresji i powinna być postrzegana bardziej


jako względny wskaźnik istotności zmiennej (patrz punkt „Ocena modelu” w rozdziale 4.) niż jako
formalna miara istotności statystycznej. Model regresji logistycznej, który ma odpowiedź binarną,
nie jest powiązany z RMSE czy R-kwadrat. Zamiast tego ocenę modelu regresji logistycznej prze-
prowadza się zwyczajowo za pomocą ogólnych metryk klasyfikacji (patrz podrozdział „Ewaluacja
modeli klasyfikacji” w dalszej części tego rozdziału).
Wiele innych koncepcji dotyczących regresji liniowej można przenieść na ustawienia regresji logi-
stycznej (i innych GLM). Dla przykładu możesz użyć regresji krokowej, określić zasady interakcji
pomiędzy efektami lub wykorzystać funkcje sklejane. Te same problemy związane ze zmiennymi
zakłócającymi i skorelowanymi dotyczą regresji logistycznej (patrz podrozdział „Interpretacja

Regresja logistyczna | 199

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


równania regresji” w rozdziale 4.). Możesz dopasować uogólnione modele addytywne (patrz punkt
„Uogólnione modele addytywne” w rozdziale 4.), wykorzystując w R pakiet mgcv:
logistic_gam <- gam(outcome ~ s(payment_inc_ratio) + purpose_ +
home_ + emp_len_ + s(borrower_score),
data=loan_data, family='binomial')

Interfejs równań z pakietu statsmodels również obsługuje te rozszerzenia:


import statsmodels.formula.api as smf
formula = ('outcome ~ bs(payment_inc_ratio, df=4) + purpose_ + ' +
'home_ + emp_len_ + bs(borrower_score, df=4)')
model = smf.glm(formula=formula, data=loan_data, family=sm.families.Binomial())
results = model.fit()

Analiza reszt
Obszarem, w którym regresja logistyczna różni się od liniowej, jest analiza reszt. Jak w regresji
(patrz rysunek 4.9), jest to bezpośrednie obliczenie reszt częściowych w R:
terms <- predict(logistic_gam, type='terms')
partial_resid <- resid(logistic_gam) + terms
df <- data.frame(payment_inc_ratio = loan_data[, 'payment_inc_ratio'],
terms = terms[, 's(payment_inc_ratio)'],
partial_resid = partial_resid[, 's(payment_inc_ratio)'])
ggplot(df, aes(x=payment_inc_ratio, y=partial_resid, solid = FALSE)) +
geom_point(shape=46, alpha=0.4) +
geom_line(aes(x=payment_inc_ratio, y=terms),
color='red', alpha=0.5, size=1.5) +
labs(y='Rezydua częściowe')

Wykres wynikowy jest przedstawiony na rysunku 5.4. Oszacowanie dopasowania, zaznaczone li-
nią, przebiega pomiędzy dwoma zbiorami punktów. Górny zbiór odpowiada wynikowi 1 (opóź-
niona spłata pożyczki), dolny zbiór odpowiada wynikowi 0 (pożyczka spłacona). Jest to typowy
wynik reszt regresji logistycznej, ponieważ jest on binarny. Predykcja jest mierzona jako logit (lo-
garytm z ilorazu szans), który zawsze przyjmuje skończoną wartość. Rzeczywista wartość, bez-
względne 0 lub 1, odpowiada nieskończonemu logitowi (dodatniemu lub ujemnemu), zatem rezy-
dua (dodawane do skończonej wartości) nigdy nie będą równe 0. Z tego powodu widoczne na
wykresie punkty tworzą chmury powyżej lub poniżej linii dopasowania na wykresie reszt cząstko-
wych. Reszty częściowe w regresji logistycznej, mniej wartościowe niż w regresji liniowej, są wciąż
potwierdzeniem nieliniowego zachowania i identyfikują rekordy mocno wpływające na wynik.
Obecnie żaden główny pakiet Pythona nie zawiera implementacji reszt częściowych. W materia-
łach dodatkowych umieściliśmy kod służący do tworzenia wykresu reszt częściowych.

Niektóre wyniki dla funkcji summary mogą być efektywnie ignorowane. Rozrzut po-
między parametrami nie jest stosowany w regresji logistycznej oraz innych typach
GLM. Odchyłki reszt i liczba iteracji są powiązane z metodą dopasowania najwięk-
szej wiarygodności (patrz ramka „Metoda największej wiarygodności” we wcześniej-
szej części tego rozdziału).

200 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 5.4. Rezydua częściowe dla regresji logistycznej

Główne zasady
• Regresja logistyczna jest podobna do regresji liniowej, z wyjątkiem binarnego wyniku.
• Kilka transformacji jest niezbędnych do uzyskania modelu nadającego się do dopasowania
jako liniowy z logarytmem ilorazu szans i zmienną wynikową.
• Po dopasowaniu modelu liniowego (iteracyjnie) logarytm szans jest mapowany ponownie
do prawdopodobieństwa.
• Regresja logistyczna jest popularna ze względu na szybkość obliczeń i model wynikowy możliwy
do zastosowania do nowych danych przy użyciu zaledwie kilku operacji arytmetycznych.

Dla pogłębienia wiedzy


• Najpopularniejszą pozycją dotyczącą regresji logistycznej jest Applied Logistic Regression, 3rd ed.,
Davida Hosmera, Stanleya Lemeshowa i Rodneya Sturdivanta (Wiley, 2013).
• Popularne są również dwie książki Josepha Hilbego: Logistic Regression Models (bardzo
wszechstronna, 2017) i Practical Guide to Logistic Regression (kompaktowa, 2015), obie wy-
dane przez Chapman & Hall/CRC Press.
• Zarówno książka Elements of Statistical Learning, 2nd ed. Trevora Hastiego, Roberta Tibshi-
raniego i Jerome’a Friedmana (Springer, 2009), jak i jej krótsza wersja An Introduction to Sta-
tistical Learning Garetha Jamesa, Danieli Witten, Trevora Hastiego i Roberta Tibshiraniego
(Springer, 2013) zawierają rozdziały poświęcone regresji logistycznej.
• Książka Data Mining for Business Analytics, Galit Shmueli, Peter Bruce, Nitin Patel, Peter
Gedeck, Inbal Yahav i Kenneth Lichtendahl (Wiley, 2007 – 2020, wydania dla R, Pythona,
Excela i JMP) zawiera cały rozdział poświęcony regresji logistycznej.

Regresja logistyczna | 201

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Ewaluacja modeli klasyfikacji
W modelowaniu predykcyjnym powszechne jest uczenie kilku różnych modeli, stosowanie każ-
dego z nich na próbie testowej i ocena efektów ich działania. Czasami po ocenieniu i dostrojeniu
wielu modeli, a także w przypadku dysponowania dużym zestawem danych, można użyć trzeciego
zbioru odłożonych, nieużytych danych do oszacowania skuteczności predykcyjnej wybranego mo-
delu na nieznanych danych. Takie odłożone próby bywają nazywane w różnych dyscyplinach da-
nymi walidacyjnymi i testowymi. Zasadniczo dzięki ewaluacji próbujemy dowiedzieć się, który
model uzyskuje najdokładniejsze prognozy.

Kluczowe pojęcia dotyczące ewaluacji modeli klasyfikacji


Dokładność
Procent (lub odsetek) przypadków poprawnie zaklasyfikowanych.

Macierz błędów
Macierzowe przedstawienie (2×2 dla przypadków binarnych) rekordów zliczonych przez pro-
gnozowane i faktyczne wyniki klasyfikacji.

Czułość
Procent (lub odsetek) przypadków wszystkich jedynek, które zostały poprawnie zaklasyfiko-
wane jako 1.
Synonim:
pełność

Swoistość
Procent (lub odsetek) przypadków wszystkich zer, które zostały poprawnie zaklasyfikowane
jako 0.

Precyzja
Procent (lub odsetek) przypadków prognozowany jako 1, który faktycznie jest 1.

Krzywa ROC
Wykres zależności czułości od swoistości.

Lift
Miara tego, jak efektywny jest model w identyfikacji (porównywalnie rzadkich) 1 na różnych
progach odcięcia prawdopodobieństwa.

Prostą metodą określenia wydajności klasyfikacji jest obliczenie odsetka poprawnych prognoz,
czyli zmierzenie dokładności (ang. accuracy). Mówiąc najprościej, dokładność jest wskaźnikiem
błędu całkowitego:

Σ𝑃𝑟𝑎𝑤𝑑𝑧𝑖𝑤𝑖𝑒𝑃𝑜𝑧𝑦𝑡𝑦𝑤𝑛𝑦𝑐ℎ + Σ𝑃𝑟𝑎𝑤𝑑𝑧𝑖𝑤𝑖𝑒𝑁𝑒𝑔𝑎𝑡𝑦𝑤𝑛𝑦𝑐ℎ
𝐷𝑜𝑘ł𝑎𝑑𝑛𝑜ść =
𝑅𝑜𝑧𝑚𝑖𝑎𝑟Próby

202 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W większości algorytmów klasyfikacji każdy przypadek jest przypisywany jako „oszacowane praw-
dopodobieństwo bycia 1”4. Domyślny próg decyzyjny, lub odcięcia, wynosi zazwyczaj 0,5 lub 50%.
Jeśli prawdopodobieństwo jest powyżej 0,5, przypadek jest „1”, jeśli poniżej 0,5, jest „0”. Alterna-
tywnym domyślnym progiem odcięcia jest dominujące w danych prawdopodobieństwo dla 1.

Macierz błędów
W samym centrum metryk klasyfikacji znajduje się macierz błędów (ang. confusion matrix).
Macierz błędów jest tabelą przedstawiającą liczbę przypadków prawidłowo i nieprawidłowo zakla-
syfikowanych według typu odpowiedzi. Kilka pakietów w R i Pythonie potrafi obliczyć macierz
błędów, przy czym dla przypadków binarnych można to w prostszy sposób zrobić bezpośrednio.
Dla zilustrowania macierzy błędów zaprezentujemy model logistic_gam, który był uczony na zba-
lansowanym zestawie danych z równą liczbą pożyczek opóźnionych i spłaconych (patrz rysunek
5.4). Stosując dotychczasową konwencję, Y = 1 odpowiada wydarzeniu, którego szukamy, a Y = 0
odpowiada negatywnemu (typowemu) wydarzeniu (np. spłacie zadłużenia). Poniższy kod oblicza
macierz błędów dla modelu logistic_gam zastosowanego dla całości (niezbalansowanego) zbioru
uczącego w R:
pred <- predict(logistic_gam, newdata=loan_data)
pred_y <- as.numeric(pred > 0)
true_y <- as.numeric(loan_data$outcome=='default')
true_pos <- (true_y==1) & (pred_y==1)
true_neg <- (true_y==0) & (pred_y==0)
false_pos <- (true_y==0) & (pred_y==1)
false_neg <- (true_y==1) & (pred_y==0)
conf_mat <- matrix(c(sum(true_pos), sum(false_pos),
sum(false_neg), sum(true_neg)), 2, 2)
colnames(conf_mat) <- c('Yhat = 1', 'Yhat = 0')
rownames(conf_mat) <- c('Y = 1', 'Y = 0')
conf_mat
Yhat = 1 Yhat = 0
Y = 1 14295 8376
Y = 0 8052 14619

W Pythonie:
pred = logit_reg.predict(X)
pred_y = logit_reg.predict(X) == 'default'
true_y = y == 'default'
true_pos = true_y & pred_y
true_neg = ~true_y & ~pred_y
false_pos = ~true_y & pred_y
false_neg = true_y & ~pred_y
conf_mat = pd.DataFrame([[np.sum(true_pos), np.sum(false_neg)],
[np.sum(false_pos), np.sum(true_neg)]],
index=['Y = default', 'Y = paid off'],
columns=['Yhat = default', 'Yhat = paid off'])
conf_mat

4
Nie wszystkie metody dostarczają nieobciążonego oszacowania prawdopodobieństwa. W większości przypadków
wystarczające jest uzyskanie rankingu odpowiadającego takiemu, który uzyskano by z nieobciążonego oszacowa-
nia prawdopodobieństwa; metoda progowania jest w tym przypadku funkcjonalnie odpowiednia.

Ewaluacja modeli klasyfikacji | 203

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Prognozowane wyniki są kolumnami, a faktyczne wierszami. Elementy na przekątnej macierzy
przedstawiają liczbę prawidłowo zaklasyfikowanych przypadków, a pozostałe elementy przedsta-
wiają liczbę przypadków nieprawidłowo zaklasyfikowanych. Przykładowo 8 376 pożyczek opóź-
nionych zostało nieprawidłowo zaklasyfikowanych jako spłacone, ale 14 295 również opóźnionych
zaklasyfikowano już poprawnie.
Rysunek 5.5 przedstawia związek pomiędzy macierzą błędów dla wyników binarnych Y a różnymi
metrykami (patrz punkt „Precyzja, czułość i swoistość” w dalszej części tego rozdziału). Jak w przy-
kładzie dla danych dotyczących pożyczek, faktyczny wynik jest umieszczony w wierszach, a pro-
gnozowany w kolumnach. Elementy na przekątnej (górny lewy i prawy dolny) przedstawiają przy-
padki, gdy Ŷ poprawnie prognozuje wynik. Jedną z ważnych metryk, nieprzedstawioną tu wprost,
jest wskaźnik fałszywie dodatni (odbicie lustrzane precyzji). Gdy 1 są rzadkie, stosunek przypad-
ków fałszywie dodatnich do wszystkich dodatnich może być wysoki, co prowadzi do nieintuicyjnej
sytuacji, w której prognozowane 1 są częstsze niż 0. Ten problem jest zmorą w medycznych testach
przesiewowych (np. mammografii), które są szeroko stosowane: z uwagi na względną rzadkość ta-
kich przypadków wynik dodatni najczęściej nie oznacza raka piersi. Prowadzi to do dezorientacji
opinii publicznej.

Rysunek 5.5. Macierz błędów dla wyniku binarnego i powiązane metryki

Prezentujemy tu rzeczywiste wyniki w rzędach, a przewidywane wyniki w kolum-


nach, jednak można często spotkać się z odwrotną sytuacją. Najlepszym przykładem
jest popularny pakiet caret w R.

Problem mało licznych klas


W wielu przypadkach występuje nierówność klas, które mają być prognozowane, z jedną klasą
przeważającą nad drugą — np. uprawnione wnioski ubezpieczeniowe a sfałszowane lub poszuku-
jący a nabywający na stronie. Rzadkie klasy (np. sfałszowane wnioski) są zazwyczaj przypadkami
bardziej interesującymi i standardowo oznaczanymi jako 1, w przeciwieństwie do bardziej rozpo-
wszechnionych 0. W typowym scenariuszu 1 są istotniejsze niż 0 w sensie błędnego zaklasyfikowania.

204 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Takie przypadki są bardziej kosztowne niż błędne zaklasyfikowanie 0 jako 1. Przykładowo prawi-
dłowo zaklasyfikowany sfałszowany wniosek ubezpieczeniowy może pomóc zaoszczędzić tysiące
dolarów. Jednocześnie prawidłowo zaklasyfikowany prawidłowy wniosek może pomóc zmniejszyć
koszty i wysiłki związane z dokładnym, ręcznym przejrzeniem dokumentacji (co musiałbyś zrobić,
gdyby wniosek był zaklasyfikowany jako „sfałszowany”).
W takich przypadkach, jeśli klasy nie są łatwo separowalne, najdokładniejszym modelem klasyfi-
kacji może okazać się taki, który klasyfikuje wszystko jako 0. Przykładowo jeśli jedynie 0,1% od-
wiedzających stronę internetową faktycznie coś kupuje, model prognozujący, że każdy odwie-
dzający opuści stronę, nie kupując nic, będzie miał dokładność na poziomie 99,9%, ale będzie
bezużyteczny. Bylibyśmy bardziej zadowoleni z modelu o mniejszej dokładności, ale takiego, który
poprawnie typuje osoby kupujące, nawet jeśli zdarzą się pomyłki.

Precyzja, czułość i swoistość


Metryki inne niż czysta dokładność — bardziej zróżnicowane — są powszechnie stosowane do
oceny modeli klasyfikacji. Niektóre z nich mają długą historię w statystyce — w szczególności
biostatystyce, gdzie są używane do opisu oczekiwanej wydajności testów diagnostycznych.
Precyzja (ang. precision) jest miarą dokładności dla prognozowanych pozytywnych wyników
(patrz rysunek 5.5):

∑ 𝑃𝑟𝑎𝑤𝑑𝑧𝑖𝑤𝑖𝑒𝐷𝑜𝑑𝑎𝑡𝑛𝑖
𝑃𝑟𝑒𝑐𝑦𝑧𝑗𝑎 =
∑ 𝑃𝑟𝑎𝑤𝑑𝑧𝑖𝑤𝑖𝑒𝐷𝑜𝑑𝑎𝑡𝑛𝑖 + ∑ 𝐹𝑎ł𝑠𝑧𝑦𝑤𝑖𝑒𝐷𝑜𝑑𝑎𝑡𝑛𝑖

Czułość (ang. sensitivity lub recall) jest miarą siły modelu w prognozowaniu wyników pozytyw-
nych — jest to odsetek poprawnie zaklasyfikowanych 1 (patrz rysunek 5.5). Definicja czułości jest
następująca:

∑ 𝑃𝑟𝑎𝑤𝑑𝑧𝑖𝑤𝑖𝑒𝐷𝑜𝑑𝑎𝑡𝑛𝑖
𝐶𝑧𝑢ł𝑜ść =
∑ Pr𝑎𝑤𝑑𝑧𝑖𝑤𝑖𝑒𝐷𝑜𝑑𝑎𝑡𝑛𝑖 + ∑ 𝐹𝑎ł𝑠𝑧𝑦𝑤𝑖𝑒𝑈𝑗𝑒𝑚𝑛𝑦

Kolejną metryką jest swoistość (ang. specificity), która mierzy zdolność modelu do prognozowania
wyników negatywnych:

∑ 𝑃𝑟𝑎𝑤𝑑𝑧𝑖𝑤𝑖𝑒𝑈𝑗𝑒𝑚𝑛𝑦
𝑆𝑤𝑜𝑖𝑠𝑡𝑜ść =
∑ 𝑃𝑟𝑎𝑤𝑑𝑧𝑖𝑤𝑖𝑒𝑈𝑗𝑒𝑚𝑛𝑦 + ∑ 𝐹𝑎ł𝑠𝑧𝑦𝑤𝑖𝑒𝐷𝑜𝑑𝑎𝑡𝑛𝑖

Możemy obliczyć te trzy wskaźniki za pomocą funkcji conf_mat w R:


# precyzja
conf_mat[1,1] / sum(conf_mat[,1])
# czułość
conf_mat[1,1] / sum(conf_mat[1,])
# swoistość
conf_mat[2,2] / sum(conf_mat[2,])

Ewaluacja modeli klasyfikacji | 205

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Z kolei w Pythonie obliczymy te wskaźniki przy użyciu poniższego kodu:
conf_mat = confusion_matrix(y, logit_reg.predict(X))
print('Precyzja', conf_mat[0, 0] / sum(conf_mat[:, 0]))
print('Czułość', conf_mat[0, 0] / sum(conf_mat[0, :]))
print('Swoistość', conf_mat[1, 1] / sum(conf_mat[1, :]))

precision_recall_fscore_support(y, logit_reg.predict(X),
labels=['default', 'paid off'])

Pakiet scikit-learn zawiera niestandardową metodę precision_recall_fscore_support oblicza-


jącą jednocześnie wszystkie trzy miary.

Krzywa ROC
Możesz zauważyć, że istnieje pewien kompromis pomiędzy czułością i swoistością. Znalezienie
większej liczby 1 oznacza, że błędnie zaklasyfikowano 0 jako 1. Idealny klasyfikator klasyfikowałby
wszystkie 1 bez błędów prognozy dla 0 jako 1.
Metryka, która określa ten kompromis, nosi nazwę krzywej Receiver Operating Characteristics
(charakterystyka operacyjna odbiornika), zwana jest także krzywą ROC (ang. ROC curve). Krzywa
ROC przedstawia czułość na osi y w zależności od swoistości na osi x5. Krzywa ROC stanowi kom-
promis pomiędzy czułością i swoistością podczas zmiany progu odcięcia określającego, w jaki spo-
sób zaklasyfikować rekord. Czułość jest rysowana na osi y, oś x natomiast może być opisywana na
dwa sposoby:
• swoistość wyrysowana na osi x, 1 po lewej stronie, 0 po prawej;
• 1-swoistość wyrysowana na osi x, 0 po lewej stronie, 1 po prawej.
Krzywa wygląda identycznie bez względu na metodę rysowania. Procedura tworząca krzywą ROC
jest następująca:
1. Posortuj wszystkie rekordy według prognozowanego prawdopodobieństwa bycia 1, począwszy
od najbardziej prawdopodobnych, a skończywszy na tych najmniej prawdopodobnych.
2. Oblicz kumulatywną swoistość i czułość, bazując na posortowanych rekordach.
Obliczanie krzywej ROC w R jest proste. Poniższy kod oblicza ją dla danych dotyczących pożyczek:
idx <- order(-pred)
recall <- cumsum(true_y[idx] == 1) / sum(true_y == 1)
specificity <- (sum(true_y == 0) - cumsum(true_y[idx] == 0)) / sum(true_y == 0)
roc_df <- data.frame(recall = recall, specificity = specificity)
ggplot(roc_df, aes(x=specificity, y=recall)) +
geom_line(color='blue') +
scale_x_reverse(expand=c(0, 0)) +
scale_y_continuous(expand=c(0, 0)) +
geom_line(data=data.frame(x=(0:100) / 100), aes(x=x, y=1-x),
linetype='dotted', color='red')

5
Krzywa ROC była użyta po raz pierwszy podczas II wojny światowej do opisu wydajności stacji odbioru sygnału
radarowego, których zadaniem było prawidłowe klasyfikowanie odbitych sygnałów radarowych i ostrzeganie sił
obronnych o zbliżających się samolotach.

206 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W Pythonie możemy użyć funkcji sklearn.metrics.roc_curve z pakietu scikit-learn do oblicze-
nia informacji wymaganych do utworzenia wykresu ROC. Podobne pakiety, np. ROCR, są dostępne
również w R:
fpr, tpr, thresholds = roc_curve(y, logit_reg.predict_proba(X)[:,0],
pos_label='default')
roc_df = pd.DataFrame({'recall': tpr, 'specificity': 1 - fpr})

ax = roc_df.plot(x='specificity', y='recall', figsize=(4, 4), legend=False)


ax.set_ylim(0, 1)
ax.set_xlim(1, 0)
ax.plot((1, 0), (0, 1))
ax.set_xlabel('Swoistość')
ax.set_ylabel('Czułość')

Wynik jest przedstawiony na rysunku 5.6. Przerywana przekątna odpowiada klasyfikatorowi nie
lepszemu niż losowy. Ekstremalnie efektywny klasyfikator (lub w przypadku medycznym — eks-
tremalnie efektywny test diagnostyczny) będzie tworzył krzywą ROC usytuowaną blisko lewego
górnego rogu wykresu — będzie klasyfikować wiele 1 bez błędów dla 0. Dla takiego modelu
chcemy, by klasyfikator miał swoistość na poziomie przynajmniej 50% i czułość na poziomie 75%.

Rysunek 5.6. Krzywa ROC dla danych dotyczących pożyczek

Krzywa precyzja-czułość
Poza krzywą ROC pomocna może się okazać analiza krzywej precyzja-czułość (PR,
ang. precision-recall curve; https://www.biostat.wisc.edu/~page/rocpr.pdf). Krzywa PR
jest obliczana w podobny sposób jak ROC, jedynie dane sortowane są od najmniej
do najbardziej prawdopodobnych oraz obliczana jest kumulatywna precyzja i czułość.
Krzywa PR jest szczególnie praktyczna w ocenie wysoko niezbilansowanych wyników.

Ewaluacja modeli klasyfikacji | 207

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Pole pod wykresem krzywej ROC
Krzywa ROC jest wartościowym narzędziem graficznym, ale sama w sobie nie zawiera żadnej miary
dla wydajności klasyfikatora. Krzywa ROC może być jednak wykorzystana do obliczenia metryki pola
pod wykresem krzywej (AUC, ang. area underneath the curve). AUC jest po prostu całkowitym polem
pod krzywą ROC. Im większa wartość AUC, tym bardziej efektywny klasyfikator. AUC = 1 opisuje kla-
syfikator idealny: klasyfikuje wszystkie przypadki 1 poprawnie i nie popełnia błędów przy klasyfikacji 0.
Dla zupełnie nieefektywnego klasyfikatora przekątna AUC = 0,5.
Rysunek 5.7 przedstawia pole pod wykresem krzywej ROC dla modelu pożyczek. Wartość AUC
może być obliczona przez całkowanie numeryczne w R:
sum(roc_df$recall[-1] * diff(1 - roc_df$specificity))
[1] 0.6926172

W Pythonie możemy obliczyć dokładność tak jak w R albo użyć funkcji sklearn.metrics.roc_
auc_score. Należy wyznaczyć wartość oczekiwaną jako 0 lub 1:
print(np.sum(roc_df.recall[:-1] * np.diff(1 - roc_df.specificity)))
print(roc_auc_score([1 if yi == 'default' else 0 for yi in y],
logit_reg.predict_proba(X)[:, 0]))

Obliczone AUC dla modelu wynosi około 0,69, co odpowiada słabemu klasyfikatorowi.

Rysunek 5.7. Pole pod krzywą ROC dla danych dotyczących pożyczek

Nieścisłości związane ze wskaźnikiem fałszywie pozytywnym


Wskaźnik fałszywie pozytywny/negatywny jest często mylony lub łączony z czuło-
ścią albo ze swoistością (nawet w publikacjach i oprogramowaniu!). Czasami wskaźnik
fałszywie pozytywny jest zdefiniowany jako odsetek prawdziwie ujemnych wartości,
zaklasyfikowanych jako pozytywne. W wielu przypadkach (takich jak wykrywanie
włamania do sieci) pojęcie to jest stosowane w odniesieniu do odsetka pozytywnych
sygnałów, które są prawdziwie negatywne.

208 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Lift
Wykorzystanie metryki AUC do oceniania modelu jest usprawnieniem w stosunku do zwykłego
obliczenia dokładności, jako że może ocenić, jak klasyfikator radzi sobie z osiągnięciem kompro-
misu pomiędzy ogólną dokładnością a potrzebą zidentyfikowania ważniejszych rekordów jako 1.
Koncepcja ta zupełnie nie nadaje się do rozwiązywania problemów mało licznych klas, gdy musisz
obniżyć próg odcięcia dla prawdopodobieństwa w modelu poniżej 0,5, by uniknąć zaklasyfikowa-
nia wszystkich rekordów jako 0. W takich przypadkach, żeby rekord został opisany jako 1, może
okazać się konieczne ustawienie progu dla prawdopodobieństwa na poziomie 0,4, 0,3 a nawet
mniej. W efekcie uzyskujemy nadidentyfikację 1, odzwierciedlającą ich większe znaczenie.
Zmiana progu odcięcia poprawi skuteczność identyfikowania 1 (kosztem błędnego klasyfikowania
0 jako 1). Jaki jest optymalny próg odcięcia?
Koncepcja lift umożliwia opóźnienie podjęcia tej decyzji. Zamiast rozważania w kategoriach pro-
gnozowanego prawdopodobieństwa bycia 1 sprawdźmy, o ile lepszy jest algorytm w porównaniu
do zwykłego losowego przydzielania klas dla, załóżmy, górnych 10% rekordów opisanych jako 1.
Jeśli otrzymamy odpowiedź na poziomie 0,3% górnego decyla dla algorytmu, a 0,1% dla losowego
przydzielania klas, można powiedzieć, że lift dla algorytmu wynosi 3 dla górnego decyla. Wykres
lift wyraża ilościowe wskaźniki w całym zakresie danych. Można go stworzyć decyl po decylu lub
w sposób ciągły dla całego przedziału danych.
W celu obliczenia wykresu lift najpierw musisz stworzyć skumulowany wykres gains chart (ang.
cumulative gains chart), który pokaże czułość na osi y i całkowitą liczbę rekordów na osi x. Krzywa
lift (ang. lift curve) jest stosunkiem obliczonej wartości skumulowanej do przekątnej odzwier-
ciedlającej losowy przydział klas. Decylowe wykresy gains chart (ang. decile gains charts) są jedną
z najstarszych technik w modelowaniu predykcyjnym, używaną jeszcze przed nastaniem ery zaku-
pów w internecie. Wykresy te były szczególnie popularne wśród firm zajmujących się reklamą bez-
pośrednią. Jest to droga metoda reklamowania usług, jeśli stosuje się ją w sposób nieprzemyślany;
reklamodawcy wykorzystywali modele predykcyjne (w tamtych czasach bardzo proste) do ziden-
tyfikowania potencjalnych klientów z możliwie najwyższym prawdopodobieństwem opłacalności.

Uplift
Czasami zamiast terminu lift można spotkać określenie uplift, używane w tym samym
kontekście. Alternatywne znaczenie tego określenia jest wykorzystywane w przypadku
bardziej restrykcyjnych właściwości, kiedy jest przeprowadzany test A/B, a proce-
dura (A lub B) jest stosowana jako zmienna predykcyjna w modelu. Uplift jest wtedy
poprawą prognozowanej odpowiedzi dla indywidualnego przypadku procedury A
w odniesieniu do procedury B. Jest to szacowane poprzez punktowanie indywidual-
nego przypadku najpierw z predyktorem ustawionym jako A, a następne z predyk-
torem B. Marketingowcy i konsultanci kampanii politycznych wykorzystują tę metodę
do określenia, który z dwóch przekazów powinien być użyty w kampanii reklamowej
albo politycznej.

Ewaluacja modeli klasyfikacji | 209

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Krzywa typu lift pozwoli Ci na prześledzenie konsekwencji ustawienia różnych progów prawdo-
podobieństwa dla rekordów klasyfikowanych jako 1. Może to być pośredni krok w poszukiwaniu
odpowiedniego poziomu odcięcia. Dla przykładu urząd podatkowy może mieć jedynie określony
budżet, który może przeznaczyć na kontrole, do tego chce wykryć jak najwięcej oszustów. Mając
świadomość tego, że zasoby są ograniczone, można wykorzystać wykres lift do oszacowania,
gdzie postawić granicę pomiędzy podatnikami wytypowanymi do audytu a tymi, którzy nie będą
kontrolowani.

Główne zasady
• Dokładność (procent z prawidłowo prognozowaną klasą) jest pierwszym krokiem w procesie
ewaluacji modelu.
• Inne metryki (czułość, swoistość, precyzja) skupiają się na bardziej specyficznych charakte-
rystykach jakości (np. czułość mierzy, na ile skutecznie model klasyfikuje jako 1).
• AUC (pole pod wykresem krzywej ROC) jest popularną metryką zdolności modelu do roz-
działu pomiędzy 1 a 0.
• Lift mierzy, jak efektywny jest model w identyfikacji 1; zazwyczaj jest obliczany decyl po de-
cylu, począwszy od najbardziej prawdopodobnych 1.

Dla pogłębienia wiedzy


Ewaluacja i ocena są zazwyczaj przedstawiane w kontekście konkretnego modelu (np. K-naj-
bliższych sąsiadów, drzew decyzyjnych), a jako odrębne zagadnienia traktowane są one w trzech
książkach:
• Data Mining, 3rd ed. Iana Whittena, Eibego Franka i Marka Halla (Morgan Kaufmann, 2011);
• Modern Data Science with R Benjamina Baumera, Daniela Kaplana i Nicholasa Hortona
(Chapman & Hall/CRC Press, 2017);
• Książka Data Mining for Business Analytics, Galit Shmueli, Peter Bruce, Nitin Patel, Peter
Gedeck, Inbal Yahav i Kenneth Lichtendahl (Wiley, 2007 – 2020, wydania dla R, Pythona,
Excela i JMP).

Strategie dla niezbilansowanych danych


Poprzedni podrozdział opisywał metody ewaluacji modeli klasyfikacji przy wykorzystaniu metryk
wykraczających poza zwykłą dokładność, odpowiednich również dla danych niezbilansowanych
— takich, w których przypadku interesujący wynik (zakupy na stronie, oszustwo itp.) jest rzadki.
W tym podrozdziale zajmiemy się dodatkowymi strategiami, które mogą poprawić wydajność mo-
deli predykcyjnych dla danych niezbilansowanych.

210 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące niezbilansowanych danych
Undersample
Użycie kilku dominujących rekordów w klasie do modelu klasyfikacji.
Synonimy
niedopróbkowanie, podpróbkowanie

Oversample
Użycie większej liczby rekordów z klasy rzadkiej do modelu klasyfikacji, jeśli to konieczne —
z wykorzystaniem bootstrapu.
Synonim
nadpróbkowanie

Wzmocnienie wagi lub osłabienie wagi


Zwiększenie (lub obniżenie) wagi dla rzadkiej (lub dominującej) klasy w modelu.

Generowanie danych
Podobnie jak w próbach bootstrapowych, jedynie nowe rekordy różnią się nieco od swojego źródła.

z-wartość
Wartość, która jest wynikiem standaryzacji.

K
Liczba sąsiadów rozważanych w obliczaniu najbliższego sąsiedztwa.

Undersampling
Jeśli dysponujesz dostateczną ilością danych, jak w przypadku danych dotyczących pożyczek, jed-
nym z rozwiązań jest niedopróbkowanie (ang. undersampling, downsample) dominującej klasy
w taki sposób, by stosunek pomiędzy 0 a 1 był zbilansowany. Podstawową ideą niedopróbkowania
jest założenie, że dane klasy dominującej zawierają wiele redundantnych rekordów. Praca z mniej-
szym, zbilansowanym zbiorem danych wpływa korzystnie na wydajność modelu, ułatwia przygo-
towanie danych oraz badanie i testowanie modelu.
Ile to jest wystarczająco dużo danych? Zależy od zastosowania, ale w ogólnym przypadku będą to
dziesiątki tysięcy rekordów dla mniej licznej klasy. Im łatwiejsze rozróżnienie pomiędzy 1 a 0, tym
mniej danych jest potrzebnych.
Analizowane dane dotyczące pożyczek zamieszczone w podrozdziale „Regresja logistyczna” we
wcześniejszej części tego rozdziału oparte są na zbilansowanym zbiorze uczącym: połowa pożyczek
była spłacona, a druga połowa miała opóźnioną spłatę. Prognozowane wartości były podobne:
połowa prawdopodobieństw była wyższa od 0,5, a druga połowa niższa. W pełnym zbiorze danych
tylko około 19% pożyczek było opóźnionych, co zaprezentowano w R:
mean(full_train_set$outcome=='default')
[1] 0.1889455

Strategie dla niezbilansowanych danych | 211

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W Pythonie:
print('Odsetek kredytów w klasie default: ',
100 * np.mean(full_train_set.outcome == 'default'))

Co się stanie, jeśli wykorzystamy pełny zbiór danych do uczenia modelu? Sprawdźmy, jak to będzie
wyglądać w R:
full_model <- glm(outcome ~ payment_inc_ratio + purpose_ +
home_ + emp_len_+ dti + revol_bal + revol_util,
data=full_train_set, family='binomial')
pred <- predict(full_model)
mean(pred > 0)
[1] 0.003942094

I w Pythonie:
predictors = ['payment_inc_ratio', 'purpose_', 'home_', 'emp_len_',
'dti', 'revol_bal', 'revol_util']
outcome = 'outcome'
X = pd.get_dummies(full_train_set[predictors], prefix='', prefix_sep='',
drop_first=True)
y = full_train_set[outcome]

full_model = LogisticRegression(penalty='l2', C=1e42, solver='liblinear')


full_model.fit(X, y)
print('Odsetek kredytów, przewidzianych przez model do klasy default: ',
100 * np.mean(full_model.predict(X) == 'default'))

Prognoza dotycząca opóźnienia spłaty była stwierdzona jedynie dla 0,39% pożyczek, czyli mniej
niż 1/47 oczekiwanej liczby6. Pożyczki, które będą spłacone, stanowią przytłaczającą większość
w stosunku do tych z opóźnioną spłatą, ponieważ model jest uczony przy jednakowym wykorzy-
staniu wszystkich danych. Podchodząc do tego intuicyjnie, można stwierdzić, że tak duża liczba
pożyczek z nieopóźnioną spłatą łączy się nierozerwalnie ze zmiennością w danych objaśniających,
co oznacza, że nawet dla pożyczek z opóźnioną spłatą model jest skłonny znaleźć jakieś, przez przy-
padek podobne, pożyczki z nieopóźnioną spłatą. Gdy do tworzenia modelu wykorzystywana była
zbilansowana próba, około 50% pożyczek było prognozowanych jako opóźnione.

Oversampling i zwiększenie/obniżenie wag


Główny zarzut wobec metody niedopróbkowania dotyczy tego, że wyrzuca się dane i nie wykorzy-
stuje wszystkich dostępnych informacji. Jeśli dysponujesz stosunkowo małym zbiorem danych,
a rzadka klasa zawiera kilka tysięcy czy nawet kilkaset rekordów, niedopróbkowanie klasy domi-
nującej niesie za sobą ryzyko wyrzucenia istotnych informacji. W tym przypadku zamiast zmniej-
szać liczność klasy dominującej, powinieneś nadpróbkować (ang. oversampling, upsumple) klasę
rzadką poprzez dodanie wierszy z losowania ze zwracaniem (próby bootstrapowe).
Możesz osiągnąć podobny efekt poprzez określenie wag dla danych. Wiele algorytmów klasyfikacji
bierze pod uwagę wagi argumentów, które pozwalają na wzmocnienie czy osłabienie wpływu da-
nych, przykładowo poprzez dodanie wektora wag do danych dotyczących pożyczki przy wykorzy-
staniu argumentu weight w funkcji glm:

6
Z powodu różnic w implementacji wyniki w Pythonie mogą być nieco inne: o ok. 1% lub 1/18 od oczekiwanej wartości.

212 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


wt <- ifelse(full_train_set$outcome=='default',
1 / mean(full_train_set$outcome == 'default'), 1)
full_model <- glm(outcome ~ payment_inc_ratio + purpose_ + home_ +
emp_len_+ dti + revol_bal + revol_util,
data=full_train_set, weight=wt, family='quasibinomial')
pred <- predict(full_model)
mean(pred > 0)
[1] 0.5767208

Większość metod z pakietu scikit-learn umożliwia określanie wag w funkcji fit za pomocą ar-
gumentu sample_weight:
default_wt = 1 / np.mean(full_train_set.outcome == 'default')
wt = [default_wt if outcome == 'default' else 1
for outcome in full_train_set.outcome]

full_model = LogisticRegression(penalty="l2", C=1e42, solver='liblinear')


full_model.fit(X, y, sample_weight=wt)
print('Odsetek kredytów, przewidzianych przez model do klasy default (ważony): ',
100 * np.mean(full_model.predict(X) == 'default'))

Wagi dla pożyczek z opóźnioną spłatą są ustawione jako 1/p, gdzie p jest prawdopodobieństwem
opóźnienia spłaty. Pożyczki z nieopóźnioną spłatą mają wagę 1. Sumy wag dla pożyczek ze spłatą
opóźnioną i spłatą nieopóźnioną są mniej więcej równe. Średnia dla wartości prognozowanych wy-
nosi teraz 58% zamiast 0,39%.
Zauważ, że wprowadzenie wag jest alternatywą zarówno do niedopróbkowania klasy dominującej,
jak i nadpróbkowania klasy rzadkiej.

Adaptacja funkcji straty


Wiele algorytmów klasyfikacji i regresji optymalizuje pewne kryteria lub inaczej funk-
cję straty (ang. loss function). Dla przykładu regresja logistyczna próbuje minimali-
zować odchyłki. W literaturze czasami proponuje się modyfikację funkcji straty w celu
uniknięcia problemów powodowanych przez mało liczne klasy. W praktyce jest to
trudne do wykonania: algorytmy klasyfikacji mogą być złożone i trudne do modyfi-
kacji. Dodawanie wag jest prostą metodą zmiany funkcji straty i obniżenia błędów
dla rekordów z niskimi wagami, na czym korzystają rekordy z wagami wysokimi.

Generowanie danych
Wariacją na temat metody nadpróbkowania przy użyciu prób bootstrapowych (patrz punkt „Over-
sampling i zwiększenie/obniżenie wag” we wcześniejszej części tego rozdziału) jest generowanie
danych poprzez zaburzenie istniejących rekordów i stworzenie nowych. Intuicja podpowiada, że
skoro możemy zaobserwować jedynie ograniczony zestaw przypadków, algorytm nie ma pełnego
zestawu informacji do zbudowania „reguł” klasyfikacji. Dzięki stworzeniu nowych rekordów, które
są podobne, ale nie identyczne z już istniejącymi, algorytm ma szansę nauczyć się bardziej odpor-
nego zestawu reguł. Ta koncepcja jest w założeniu podobna do koncepcji zestawu modeli staty-
stycznych, takich jak boosting czy bagging (patrz rozdział 6.).

Strategie dla niezbilansowanych danych | 213

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Idea ta zyskała na znaczeniu w momencie publikacji algorytmu SMOTE (akronim od ang. Synthe-
tic Minority Oversamlping Technique, czyli technika syntetycznego nadpróbkowania mniejszości).
Algorytm SMOTE znajduje rekord podobny do rekordu nadpróbkowanego (patrz podrozdział
„K-najbliższych sąsiadów” w rozdziale 6.) i tworzy syntetyczny rekord, którego waga jest uśred-
niana losowo na bazie wag rekordu oryginalnego i najbliższych sąsiadów; wagi generowane są nie-
zależnie dla każdego predyktora. Liczba stworzonych syntetycznych, nadpróbkowanych rekordów
zależy od wskaźnika nadpróbkowana wymaganego do oszacowanego zbilansowania w odniesieniu
do klasy wynikowej.
Istnieje kilka implementacji SMOTE w R. Dawniej najbardziej wszechstronnym pakietem do pracy
z niezbilansowanymi danymi był unbalanced. Oferował różnorodność technik, w tym algorytm
„Racing” do wyboru najlepszego modelu. Jednakże algorytm SMOTE jest dostatecznie prosty, by
można było go zaimplementować bezpośrednio w R przy użyciu pakietu FNN.
Dostępny w Pythonie pakiet imbalanced-learn implementuje różne metody za pomocą interfejsu
kompatybilnego ze scikit-learn. Uzyskujemy dzięki niemu dostęp do różnych metod over- i un-
dersamplingu, a także obsługę tych technik z klasyfikatorami wzmacniania i agregacji.

Klasyfikacja oparta na kosztach


W praktyce dokładność i AUC nie są najlepszymi kryteriami wyboru reguł klasyfikacji. Zazwyczaj
oszacowany koszt może być powiązany ze stosunkiem fałszywie dodatnich i fałszywie ujemnych
przypadków, podczas gdy lepszym wyjściem jest zawarcie tych kosztów w określaniu najlepszego
progu odcięcia do klasyfikacji 1 i 0. Przypuśćmy, że oczekiwany koszt opóźnienia nowej pożyczki
wynosi C, a spodziewany zwrot ze spłaty — R. Wtedy oczekiwany zwrot dla pożyczki wynosi:

𝑂𝑐𝑧𝑒𝑘𝑖𝑤𝑎𝑛𝑦_𝑧𝑤𝑟𝑜𝑡 = 𝑃(𝑌 = 0) × 𝑅 + 𝑃(𝑌 = 1) × 𝐶

Od prostego etykietowania pożyczek jako opóźnione i spłacone lub określania prawdopodobień-


stwa opóźnienia bardziej sensowne wydaje się określenie, czy pożyczka ma dodatni oczekiwany
zwrot. Prognozowane prawdopodobieństwo opóźnienia jest pośrednim krokiem i musi być połą-
czone z całkowitą wartością pożyczki do określenia oczekiwanych zysków, które są ostateczną me-
tryką planowania w biznesie. Mniejsza wartość pożyczki może być pominięta na korzyść większej
z niewiele większym prognozowanym prawdopodobieństwem opóźnienia.

Badanie prognozy
Pojedyncza metryka, taka jak AUC, nie może ocenić wszystkich aspektów dostosowania modelu
do sytuacji. Rysunek 5.8 przedstawia reguły decyzyjne dla czterech różnych modeli dopasowania
do danych dotyczących pożyczek przy wykorzystaniu jedynie dwóch zmiennych objaśniających:
borrower_score i payment_inc_ratio. Modele są oparte na liniowej analizie dyskryminacyjnej
(LDA), liniowej regresji logistycznej, dopasowaniu regresją logistyczną przy użyciu uogólnionego
modelu addytywnego (GAM) oraz drzewa decyzyjne (patrz podrozdział „Drzewa decyzyjne”
w rozdziale 6.). Obszar na lewo w górę od linii odpowiada prognozowanym opóźnieniom. LDA
i liniowa regresja logistyczna dają niemal identyczne wyniki dla tego przypadku. Drzewo decyzyjne

214 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 5.8. Porównanie reguł klasyfikacji dla czterech różnych metod

stworzyło w dwóch etapach najmniej regularną regułę: w rzeczywistości istnieją sytuacje, dla któ-
rych wzrost punktacji pożyczkobiorcy przesuwa prognozę ze „spłaconej” na „opóźnioną”! I wresz-
cie dopasowanie GAM regresji logistycznej przedstawia kompromis pomiędzy drzewem decyzyj-
nym a modelem liniowym.
Niełatwo jest zwizualizować reguły predykcji w wielu wymiarach lub, w przypadku GAM i drzew
decyzyjnych, nawet wygenerować regiony dla takich reguł.
W każdym przypadku analiza badawcza wartości prognozowanych jest wskazana.

Główne zasady dotyczące niezbilansowanych danych


• Mocno niezbilansowane dane (np. takie, w których przypadku interesujący wynik — 1 —
jest bardzo rzadki) są problematyczne dla algorytmów klasyfikacji.
• Jedną z możliwości pracy z niezbilansowanymi danymi jest zbilansowanie danych uczących
za pomocą undersamplingu nadmiarowych przypadków (lub oversamplingu przypadków
rzadkich).
• Jeśli użycie wszystkich rekordów typu 1 wciąż jest niewystarczające, możesz stworzyć próby
bootstrapowe dla przypadków rzadkich lub za pomocą SMOTE stworzyć syntetyczne dane
podobne do już istniejących.
• Dane niezbilansowane zazwyczaj wskazują na to, że poprawne zaklasyfikowanie do jednej
z klas (1) ma wyższą wartość, a stosunek tych wartości powinien być wzięty pod uwagę pod-
czas tworzenia metryk oceniających model.

Strategie dla niezbilansowanych danych | 215

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Dla pogłębienia wiedzy
• Tom Fawcett, autor Data Science for Business, napisał dobry artykuł o danych niezbilansowa-
nych, dostępny pod adresem: https://svds.com/learning-imbalanced-classes.
• Więcej o SMOTE znajdziesz w: Nitesh V. Chawla, Kevin W. Bowyer, Lawrence O. Hall, W. Philip
Kegelmeyer, SMOTE: Synthetic Minority Over-sampling Technique, „Journal of Artificial In-
telligence Research” 2002, 16, s. 321 – 357 (https://jair.org/index.php/jair/article/view/10302).
• Przejrzyj również artykuł Practical Guide to Deal with Imbalanced Classification Problems in R,
dostępny pod adresem: https://www.analyticsvidhya.com/blog/2016/03/practical-guide-deal-
imbalanced-classification-problems.

Podsumowanie
Klasyfikacja stanowi proces prognozowania tego, do której z co najmniej dwóch kategorii należy
rekord, i jest podstawowym narzędziem analizy predykcyjnej. Czy spłata pożyczki się opóźni (tak
lub nie)? Czy usługa jest przedpłacona? Czy odwiedzający stronę kliknie link? Czy klient coś kupi?
Czy wniosek ubezpieczeniowy jest sfałszowany? Często w problemach dotyczących klasyfikacji
jedna klasa jest szczególnie interesująca (np. sfałszowane roszczenia ubezpieczeniowe) i, w przy-
padku klasyfikacji binarnej, klasa jest projektowana jako 1, a druga, dominująca klasa jako 0. Klu-
czową częścią tego procesu jest najczęściej oszacowanie wskaźnika tendencji (ang. propensity score),
przynależności do konkretnej klasy. Powszechny scenariusz jest taki, że klasa bardziej interesująca
z punktu widzenia modelu jest względnie rzadka. Podczas oceniania klasyfikatora korzystamy z róż-
nych metryk oceny modelu, które wykraczają poza prostą dokładność; jest to istotne w przypadku
mało licznych klas, gdy klasyfikacja wszystkich rekordów jako 0 prowadzi do dużej dokładności.

216 | Rozdział 5. Klasyfikacja

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


ROZDZIAŁ 6.
Statystyczne uczenie maszynowe

Rozwój statystyki w ostatnich latach był związany głównie z doskonaleniem potężnych technik au-
tomatycznego modelowania predykcyjnego — zarówno regresji, jak i klasyfikacji. Metody te, po-
dobnie jak omówione w poprzednim rozdziale, są technikami nadzorowanymi: modele są treno-
wane na danych dających znane wyniki, dzięki czemu uczą się przewidywać rezultaty w nowych
danych. Wrzucono je do jednego worka, zwanego statystycznym uczeniem maszynowym, i od-
dzielono je od klasycznych metod statystycznych, ponieważ są oparte na danych i nie wymagają
narzucenia struktury liniowej czy jakiejkolwiek innej. Przykładowo metoda K-najbliższych sąsia-
dów jest całkiem prosta: klasyfikuje rekord zgodnie z klasyfikacją podobnych rekordów. Najsku-
teczniejsze i najchętniej stosowane metody oparte są na uczeniu zagregowanym (ang. ensemble
learning) w odniesieniu do drzew decyzyjnych (ang. decision trees). Podstawową ideą uczenia za-
gregowanego jest użycie wielu modeli predykcyjnych, w opozycji do używania modelu pojedyn-
czego. Drzewa decyzyjne są elastyczną i automatyczną techniką służącą do uczenia regułowego
o związkach pomiędzy zmiennymi objaśniającymi a wynikami. Okazuje się, że kombinacja uczenia
zagregowanego z metodą opartą na drzewach decyzyjnych pozwala uzyskać jedne z najbardziej
wydajnych technik modelowania predykcyjnego spośród istniejących.
Rozwój wielu technik uczenia maszynowego zawdzięczamy badaniom prowadzonym przez Leo
Breimana (patrz rysunek 6.1) z Uniwersytetu Kalifornijskiego w Berkeley i Jerry’ego Friedmana
z Uniwersytetu Stanforda. Ich prace, podobnie jak inne badania prowadzone na uczelniach w Ber-
keley i Stanford, rozpoczęły się od rozwinięcia modeli drzew decyzyjnych, co nastąpiło w 1984 r.
Późniejszy rozwój metod zagregowanych baggingu i boostingu, przypadający na lata 90., dał pod-
stawy statystycznego uczenia maszynowego.

Rysunek 6.1. Leo Breiman, profesor statystyki na uniwersytecie w Berkley, odegrał ogromną rolę w rozwoju
wielu podstawowych technik wykorzystywanych współcześnie przez specjalistów data science

217

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Uczenie maszynowe a statystyka
Jaka jest różnica pomiędzy uczeniem maszynowym a statystyką w kontekście mode-
lowania predykcyjnego? Nie istnieje jasno wytyczona granica między tymi dwiema
dyscyplinami. Uczenie maszynowe skłania się bardziej ku rozwojowi efektywnych
algorytmów, które można skalować na duże zbiory danych, optymalizując modele
predykcyjne. Statystyka z kolei skupia się na teorii prawdopodobieństwa i podstawowej
strukturze modelu. Bagging i lasy losowe (patrz podrozdział „Bagging i lasy losowe”
w dalszej części tego rozdziału) rozwinęły się z metod statystycznych. Natomiast bo-
osting (patrz podrozdział „Boosting” w dalszej części tego rozdziału) został rozwi-
nięty w obu dyscyplinach, jednak więcej uwagi poświęca mu się w uczeniu maszyno-
wego. Bez względu na historię możliwości boostingu utwierdzają w przekonaniu, że
jako technika będzie on rozwijany zarówno w uczeniu maszynowym, jak i statystyce.

K-najbliższych sąsiadów
Idea metody K-najbliższych sąsiadów (KNN, ang. K-nearest neighbors) jest bardzo prosta1. Dla
każdego rekordu, który należy poddać klasyfikacji lub prognozie, należy:
1. Znaleźć K rekordów, które mają podobne cechy (tj. podobne wartości predyktorów).
2. W przypadku klasyfikacji określić, jaka klasa dominuje wśród znalezionych rekordów, i przy-
pisać tę klasę do nowego rekordu.
3. W przypadku predykcji (nazywanej również regresją KNN, ang. KNN regression) określić
średnią dla znalezionych rekordów i przypisać tę średnią do nowego rekordu.

Kluczowe pojęcia dotyczące metody K-najbliższych sąsiadów


Sąsiad
Rekord podobny, pod względem wartości predyktorów, do innego rekordu.
Metryka odległości
Miara podsumowująca jedną wartością, jak odległy jest jeden rekord od innego.
Standaryzacja
Odjęcie średniej i podzielenie przez odchylenie standardowe.
Synonim
normalizacja
z-wartość
Wartość po standaryzacji.
K
Liczba sąsiadów branych pod uwagę przy obliczaniu sąsiedztwa.

1
Tę i kolejne części tego rozdziału wykorzystano za zgodą Petera Bruce’a, Andrew Bruce’a i Petera Gedecka, © 2020
Datastats LCC.

218 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


KNN jest jedną z prostszych technik klasyfikacji (predykcji): nie ma modelu, który trzeba dopaso-
wać (jak w regresji). Nie oznacza to jednak, że KNN jest procedurą automatyczną w użyciu. Wyniki
predykcji zależą od skalowania cech, sposobu pomiaru podobieństwa, rozmiaru K. Podobnie
wszystkie predyktory muszą mieć postać numeryczną. Pokażemy sposób stosowania metody KNN
na przykładzie klasyfikacji.

Przykład: przewidywanie opóźnienia w spłacie pożyczki


Tabela 6.1 przedstawia kilka rekordów danych dotyczących pożyczek konsumenckich z Lending-
Club. LendingClub jest liderem usług kredytowych — zespół inwestorów oferuje pożyczki osobom
fizycznym. Celem analizy byłaby prognoza wyniku dla nowej potencjalnej pożyczki: spłata na czas
lub opóźnienie spłaty.

Tabela 6.1. Kilka rekordów i kolumn danych pochodzących z LendingClub

Loan Years Home


Outcome Income Purpose State
amount employed ownership
Paid off 10 000 79 100 debt_consolidation 11 MORTAGE NV
Paid off 9600 48 000 moving 5 MORTAGE TN
Paid off 18 800 120 036 debt_consolidation 11 MORTAGE MD
Default 15 250 232 000 small_business 9 MORTAGE CA
Paid off 17 050 35 000 debt_consolidation 4 RENT MD
Paid off 5500 43 000 debt_consolidation 4 RENT KS

Rozważmy bardzo prosty model oparty na dwóch zmiennych predykcyjnych: dt1, która określa
stosunek spłat zadłużenia (bez hipoteki) do przychodów, oraz payment_inc_rattio, która określa
stosunek opłat do przychodów. Obie zmienne są mnożone przez 100. Wykorzystując niewielki
zbiór 200 pożyczek, loan200 , o znanym wyniku (spłata opóźniona lub na czas), określonym
w outcome200, oraz określając K jako równe 20, można przyjąć, że szacowanie KNN spłaty dla no-
wej pożyczki newloan przy zadanych parametrach, z dt1 = 22,5 i payment_inc_ratio = 9 w R,
będzie wyglądało następująco2:
newloan <- loan200[1, 2:3, drop=FALSE]
knn_pred <- knn(train=loan200[-1, 2:3], test=newloan, cl=loan200[-1, 1], k=20)
knn_pred == 'paid off'
[1] TRUE

Klasyfikator KNN przyporządkuje pożyczkę do tych z opóźnioną spłatą (default).


R posiada własną funkcję knn, a biblioteka FNN (ang. Fast Nearest Neighbor, https://cran.r-project.org/
web/packages/FNN/FNN.pdf) jest bardziej uniwersalna i przystosowana do danych typu big data.

2
W tym przykładzie bierzemy pierwszy rząd z zestawu danych loan200 jako newloan i wykluczamy go z zestawu
danych w celu uczenia.

K-najbliższych sąsiadów | 219

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Pakiet scikit-learn zapewnia szybką i wydajną implementację algorytmu KNN w Pythonie:
predictors = ['payment_inc_ratio', 'dti']
outcome = 'outcome'

newloan = loan200.loc[0:0, predictors]


X = loan200.loc[1:, predictors]
y = loan200.loc[1:, outcome]

knn = KNeighborsClassifier(n_neighbors=20)
knn.fit(X, y)
knn.predict(newloan)

Rysunek 6.2 obrazuje przykład opisany wcześniej. Nowa prognozowana pożyczka jest krzyżykiem
w centrum. Koła (pożyczki z opóźnioną spłatą) i kwadraty (pożyczki spłacane) stanową dane uczące.
Duże czarne koło obrazuje obszar, wewnątrz którego znajduje się najbliższych 20 sąsiadów. W pre-
zentowanym przypadku 9 pożyczek z opóźnioną spłatą jest zawartych wewnątrz okręgu, podczas
gdy spłacanych jest 11. Dlatego prognoza dla tej pożyczki brzmi: pożyczka spłacona. Zwróć uwagę,
że gdybyśmy brali pod uwagę tylko trzech najbliższych sąsiadów, zgodnie z predykcją pożyczka
pozostałaby niespłacona.

Rysunek 6.2. Prognoza KNN dla pożyczek z opóźnioną spłatą opracowana z wykorzystaniem dwóch
zmiennych: stosunku długu do dochodów (dti) oraz stosunku opłat do dochodów (payment_inc_ratio)

220 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W opisanym przypadku pożyczek klasyfikacja KNN jest problemem binarnym,
zazwyczaj jednak KNN umożliwia szacowanie wyniku jako prawdopodobieństwa
(skłonności) z zakresu [0,1]. Prawdopodobieństwo jest licznością jednej klasy wśród
K najbliższych sąsiadów. W przytoczonym przykładzie obliczone prawdopodobień-
stwo wynosi 9/20 lub 0,45. Uzyskanie wyniku w postaci prawdopodobieństwa umoż-
liwia wykorzystanie innych reguł klasyfikacji niż tylko jednoznaczne przypisanie do
grupy (prawdopodobieństwo 0,5). Jest to niezwykle istotne w przypadku dużych roz-
bieżności w licznościach klas (patrz podrozdział „Strategie dla niezbilansowanych
danych” w rozdziale 5.). Przykładowo gdy celem jest identyfikacja obiektów w mało
licznej klasie, punkt odcięcia znajdzie się poniżej 50%. Powszechnym podejściem jest
ustawienie go na wartości odpowiadającej prawdopodobieństwu wystąpienia tego
rzadkiego zjawiska.

Metryki odległości
Podobieństwo (w sensie odległości) jest określone za pomocą metryki odległości (ang. distance
metric), która jest funkcją mierzącą, jak odległe od siebie są dwa rekordy: (x1, x2, … xp) i (u1, u2, …, up).
Najpopularniejszą metryką odległości pomiędzy dwoma wektorami jest odległość euklidesowa
(ang. Euclidean distance). W celu obliczenia odległości euklidesowej pomiędzy dwoma wektorami
odejmujesz jeden od drugiego, podnosisz różnice do kwadratu, sumujesz je i wyciągasz pierwiastek
kwadratowy:

𝑥 −𝑢 𝑥 −𝑢 ... 𝑥 −𝑢

Inną popularną metryką dla danych numerycznych jest metryka Manhattan (ang. Manhattan
distance):
|𝑥 − 𝑢 | |𝑥 − 𝑢 | . . . |𝑥 − 𝑢 |

Odległość euklidesowa odpowiada odległości w linii prostej pomiędzy dwoma punktami. Metryka
Manhattan jest odległością pomiędzy dwoma punktami przy przemieszczeniu się tylko w jednym
kierunku naraz (np. po dzielnicy, gdzie wszystkie ulice są prostopadłe do siebie). Z tego powodu
metryka Manhattan jest praktycznym przybliżeniem, jeśli podobieństwo jest zdefiniowane jako
czas przemieszczania się z punktu do punktu.
Podczas pomiaru odległości pomiędzy dwoma wektorami zmienne (cechy), które są mierzone
we względnie dużej skali, zdominują pomiar. Przykładowo dla danych dotyczących pożyczek
odległość będzie niemal wyłącznie funkcją zmiennych opisujących przychody i wysokość po-
życzki, które są mierzone w dziesiątkach, setkach lub tysiącach. Dla porównania zmienne wskaź-
ników nie będą liczyły się praktycznie wcale. Problem ten można jednak rozwiązać poprzez stan-
daryzację danych; patrz podrozdział „Standaryzacja (normalizacja, z-wartość)” w dalszej części
tego rozdziału.

K-najbliższych sąsiadów | 221

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Inne metryki odległości
Istnieje wiele innych metryk do pomiaru odległości pomiędzy wektorami. W przy-
padku danych numerycznych atrakcyjna wydaje się odległość Mahalanobisa (ang.
Mahalanobis distance), ponieważ uwzględnia korelację pomiędzy dwoma zmiennymi.
Jest to szczególnie przydatne, gdy dwie zmienne są mocno skorelowane ze sobą; od-
ległość Mahalanobisa w zasadzie traktuje je jako jedną w sensie odległości, a metryki
euklidesowa i Manhattan nie biorą pod uwagę korelacji, efektywnie określając wyż-
sze wagi dla atrybutów, które tworzą te cechy. Odległość Mahalanobisa stanowi od-
ległość euklidesową pomiędzy głównymi składowymi (zob. podrozdział „Analiza
głównych składowych” w rozdziale 7.). Wadą wykorzystania metryki Mahalanobisa
jest wzrost wymagań i złożoności obliczeniowej; metryka ta jest obliczana za pomocą
macierzy kowariancji (patrz punkt „Macierz kowariancji” w rozdziale 5.).

Kodowanie 1 z n
Dane dotyczące pożyczek z tabeli 6.1 zawierają kilka zmiennych skategoryzowanych (typu string).
Większość modeli statystycznych i uczenia maszynowego wymaga, żeby tego typu zmienne były
przedstawione w postaci serii fikcyjnych zmiennych binarnych zawierających te same informacje,
które umieszczono w tabeli 6.2. Zamiast jednej zmiennej opisującej status osoby zajmującej dom
jako „właściciel z hipoteką” (MORTAGE), „właściciel bez hipoteki” (OWN), „wynajmujący”
(RENT), „inne” (OTHER), mamy cztery zmienne binarne. Pierwszą będzie „właściciel z hipoteką
— tak/nie”, drugą „właściciel bez hipoteki — tak/nie” itd. Predyktor opisujący status osoby zajmu-
jącej dom będzie zawierał wektory z jedną 1 i trzema 0 dla każdego rekordu, co może być użyte
w algorytmach statystycznych i uczenia maszynowego. Określenie kodowanie 1 z n (ang. one hot
encoder) pochodzi z terminologii opisującej właściwości obwodów cyfrowych, w której dopusz-
czalne jest, żeby tylko jeden bit był pozytywny (hot).

Tabela 6.2. Reprezentacja danych dotyczących skategoryzowanych własności domu z tabeli 6.1
jako zmiennej fikcyjnej

MORTAGE OTHER OWN RENT


1 0 0 0
1 0 0 0
1 0 0 0
1 0 0 0
1 0 0 0
1 0 0 0

W przypadku regresji liniowej i regresji logistycznej kodowanie 1 z n powoduje pro-


blem współliniowości (patrz punkt „Współliniowość” w rozdziale 4.). W takich sy-
tuacjach jedna ze zmiennych fikcyjnych jest pomijana (jej wartość może być wnio-
skowana na podstawie pozostałych). Nie stanowi to problemu dla KNN i innych
metod omówionych w niniejszej książce.

222 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Standaryzacja (normalizacja, z-wartość)
W pomiarach zazwyczaj nie jest zbyt interesujące, „jak bardzo”, a „o ile odległe od średniej”. Standa-
ryzacja, nazywana również normalizacją (ang. normalization), tworzy jedną skalę dla wszystkich zmien-
nych poprzez odjęcie średniej i podzielenie ich przez odchylenie standardowe; w ten sposób upew-
niamy się, że zmienna nie wpływa nadmiernie na model jedynie z powodu skali oryginalnej zmiennej:

𝑥 − 𝑥̄
𝑧
𝑠
Wynik powyższego przekształcenia jest często nazywany z-wartością (ang. z-score). Pomiary są
w ten sposób wyrażane w liczbie „odchyleń standardowych od średniej”.

Normalizacja w jej statystycznym kontekście nie może być mylona z normalizacją


bazy danych, co oznacza usuwanie powielonych danych i weryfikację zależności
danych.

W przypadku KNN i kilku innych procedur (np. analizy głównych składowych, klasteryzacji) klu-
czowe jest rozważenie standaryzacji danych przed zastosowaniem procedur. Żeby zilustrować tę ideę,
użyto KNN w odniesieniu do danych dotyczących pożyczek, wykorzystując zmienne dti i pay-
ment_inc_ratio (patrz punkt „Przykład: przewidywanie opóźnienia w spłacie pożyczki” we wcześniej-
szej części tego rozdziału) oraz dwie inne zmienne: revol_bal, całkowity dostępny kredyt odnawialny
w dolarach, i revol_util, wykorzystany procent kredytu. Nowy rekord do predykcji przedstawiono poniżej:
newloan
payment_inc_ratio dti revol_bal revol_util
1 2.3932 1 1687 9.4

Wpływ zmiennej revol_bal, która jest określana w dolarach, jest dużo większy niż wpływ innych
zmiennych. Funkcja knn zwraca indeks najbliższego sąsiada jako atrybut nn.index, a to może być
wykorzystane do pokazania pięciu najbliższych rekordów w loan_df:
loan_df <- model.matrix(~ -1 + payment_inc_ratio + dti + revol_bal +
revol_util, data=loan_data)
newloan <- loan_df[1, , drop=FALSE]
loan_df <- loan_df[-1,]
outcome <- loan_data[-1, 1]
knn_pred <- knn(train=loan_df, test=newloan, cl=outcome, k=5)
loan_df[attr(knn_pred, "nn.index"),]

payment_inc_ratio dti revol_bal revol_util


35537 1.47212 1.46 1686 10.0
33652 3.38178 6.37 1688 8.4
25864 2.36303 1.39 1691 3.5
42954 1.28160 7.14 1684 3.9
43600 4.12244 8.98 1684 7.2

Po dopasowaniu modelu możemy użyć metody kneighbors z pakietu scikit-learn do określenia


pięciu najbliższych rzędów ze zbioru uczącego:
predictors = ['payment_inc_ratio', 'dti', 'revol_bal', 'revol_util']
outcome = 'outcome'

newloan = loan_data.loc[0:0, predictors]

K-najbliższych sąsiadów | 223

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


X = loan_data.loc[1:, predictors]
y = loan_data.loc[1:, outcome]

knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X, y)

nbrs = knn.kneighbors(newloan)
X.iloc[nbrs[1][0], :]

Wartość zmiennej revol_bal dla znalezionych sąsiadów jest bardzo zbliżona do wartości nowego
rekordu, ale pozostałe wartości są rozrzucone po całym zakresie i w zasadzie nie odgrywają żadnej
roli w określeniu sąsiadów.
Porównajmy powyższe wyniki do wyników uzyskanych poprzez wykorzystanie KNN w odnie-
sieniu do danych standaryzowanych za pomocą funkcji scale, która oblicza z-wartość dla każdej
zmiennej:
loan_df <- model.matrix(~ -1 + payment_inc_ratio + dti + revol_bal +
revol_util, data=loan_data)
loan_std <- scale(loan_df)
newloan_std <- loan_std[1, , drop=FALSE]
loan_std <- loan_std[-1,]
loan_df <- loan_df[-1,]
outcome <- loan_data[-1, 1]
knn_pred <- knn(train=loan_std, test=newloan_std, cl=outcome, k=5)
loan_df[attr(knn_pred, "nn.index"),]

payment_inc_ratio dti revol_bal revol_util


2081 2.61091 1.03 1218 9.7
1439 2.34343 0.51 278 9.9
30216 2.71200 1.34 1075 8.5
28543 2.39760 0.74 2917 7.4
44738 2.34309 1.37 488 7.2

Musimy również usunąć pierwszy rząd z ramki danych loan_df, aby zachować właściwą nu-
merację rzędów.
Metoda sklearn.preprocessing.StandardScaler zostaje najpierw wytrenowana za pomocą
predyktorów, a następnie użyta do przekształcenia zestawu danych tuż przed wyuczeniem mo-
delu KNN:
newloan = loan_data.loc[0:0, predictors]
X = loan_data.loc[1:, predictors]
y = loan_data.loc[1:, outcome]

scaler = preprocessing.StandardScaler()
scaler.fit(X * 1.0)

X_std = scaler.transform(X * 1.0)


newloan_std = scaler.transform(newloan * 1.0)

knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_std, y)

nbrs = knn.kneighbors(newloan_std)
X.iloc[nbrs[1][0], :]

224 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Tych pięciu sąsiadów jest bardziej zbliżonych dla wszystkich zmiennych, dzięki czemu zapewniają
oni bardziej wiarygodne wyniki. Zauważ, że wyniki są wyświetlone w oryginalnej skali, ale KNN
do prognozy dla nowej pożyczki było zastosowane do danych przeskalowanych.

Wykorzystanie z-wartości jest tylko jedną z możliwości przeskalowania zmiennych.


Zamiast średniej można wykorzystać bardziej praktyczną miarę położenia, jak cho-
ciażby medianę. Podobnie różne miary skali, jak przedział międzykwartylowy, można
zastosować zamiast odchylenia standardowego. Czasami zmienne są „zbijane” do
przedziału 0 – 1. Bardzo ważne jest uświadomienie sobie, że skalowanie każdej
zmiennej tak, by miała wariancję jednostkową, jest arbitralne. Wymusza to uczenie
klasyfikatora z jednakową istotnością dla każdej zmiennej. Jeśli wiesz, że jakaś zmienna
jest ważniejsza od innej, to taka zmienna może być wyróżniona przy skalowaniu, np.
dla danych dotyczących pożyczek; uzasadnione jest założenie, że wskaźnik stosunku
opłat do przychodów jest bardzo ważny.

Normalizacja (standaryzacja) nie zmienia kształtu rozkładu danych; nie spowoduje


ona, że dane przyjmą kształt rozkładu normalnego, jeśli wcześniej go nie miały (patrz
podrozdział „Rozkład normalny” w rozdziale 2.).

Dobór K
Wybór K jest bardzo ważny dla jakości KNN. Najprościej jest ustawić K = 1, co jest znane jako
klasyfikator najbliższego sąsiada. Metoda predykcji jest tu intuicyjna — oparta na znalezieniu ta-
kiego rekordu w danych uczących, który jest najbardziej podobny do nowego rekordu poddanego
klasyfikacji. Ustawienie K = 1 rzadko kiedy jest najlepszym wyborem; niemal zawsze otrzymasz
lepszą jakość, wykorzystując K > 1-najbliższego sąsiada.
Ogólnie mówiąc, jeśli K jest zbyt niskie, może powstać problem nadmiernego dopasowania — włą-
czając w to szumy w danych. Wyższe wartości K wprowadzają wygładzenie w danych uczących,
które obniża ryzyko nadmiernego dopasowania. Jednocześnie zbyt wysokie K może rozmyć dane
i uniemożliwić KNN wychwycenie lokalnych struktur w danych, co jest jego główną zaletą.
Dobrze zbalansowane K, pomiędzy nadmiernym dopasowaniem a rozmyciem, jest zazwyczaj okre-
ślane przez metryki jakości i, w szczególności, jakości z próbą testową. Nie ma jednej ogólnej zasady
dotyczącej doboru K — zależy ono w dużej mierze od charakterystyki danych. W przypadku mocno
ustrukturyzowanych danych z niewielkim szumem niewielkie wartości K będą działały dobrze.
Specjalista od przetwarzania sygnałów taki typ danych określiłby jako posiadający wysoki stosunek
sygnału do szumu (SNR, ang. signal-to-noise ratio). Przykłady danych z typowo wysokim SNR to
zestawy danych utworzonych przez pismo odręczne i rozpoznawanie mowy. Dla danych zaszu-
mionych, mniej ustrukturyzowanych (danych z niskim SNR), np. danych dotyczących pożyczek,
większe wartości K są bardziej odpowiednie; najczęściej są to wartości K z przedziału od 1 do 20.
By uniknąć nierozstrzygalności, wybiera są najczęściej wartości nieparzyste.

K-najbliższych sąsiadów | 225

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kompromis między obciążeniem a zróżnicowaniem
Napięcie pomiędzy nadmiernym dopasowaniem a rozmyciem jest związane z poję-
ciem kompromisu pomiędzy obciążeniem a zmiennością (ang. bias-variance tra-
deoff), dotyczącym powszechnego problemu w statystycznym dopasowaniu modelu.
Zmienność odnosi się do błędów modelowania, które pojawiają się ze względu na
wybór takich, a nie innych danych uczących. Obciążenie z kolei to błąd modelowa-
nia, który jest wynikiem błędnego zidentyfikowania fundamentalnego scenariusza
w świecie rzeczywistym; ten rodzaj błędu nie zniknie, jeśli po prostu dodasz więcej
danych uczących. Kiedy elastyczny model jest nadmiernie dopasowany, zmienność
rośnie. Można ją zredukować poprzez uproszczenie modelu, ale wtedy może wzro-
snąć obciążenie ze względu na utratę elastyczności w modelowaniu faktycznej sytu-
acji. Ogólnym rozwiązaniem tego problemu jest znalezienie kompromisu poprzez
kroswalidację. Więcej szczegółów na ten temat znajdziesz w punkcie „Kroswalidacja”
w rozdziale 4.

KNN w doborze cech


Technika KNN zyskała na popularności dzięki swojej prostocie i intuicyjności. Jeśli chodzi o wy-
dajność, KNN sama w sobie nie jest konkurencyjna w porównaniu do bardziej wyszukanych metod
klasyfikacji. Niemniej jednak w praktycznym dopasowaniu modelu metoda KNN może być uży-
wana do dodawania „lokalnej wiedzy” jako etap pośredni w innych metodach klasyfikacji.
1. KNN jest stosowana do danych, a klasyfikacja (lub quazi-prawdopodobieństwo klasy) jest
określana dla każdego rekordu.
2. Wynik jest dodawany jako nowa cecha do rekordu, a kolejna metoda klasyfikacji jest stoso-
wana do tych danych. Oryginalne wartości predyktorów są wykorzystywane dwukrotnie.
Możesz się zastanawiać, czy ponieważ ta procedura wykorzystuje niektóre predyktory dwukrotnie,
nie doprowadzi do wystąpienia współliniowości (patrz punkt „Współliniowość” w rozdziale 4.).
Tak się jednak nie stanie, ponieważ informacja, która jest zawarta w modelu z drugiego etapu, jest
lokalna, uwzględniana na podstawie kilku sąsiednich rekordów, a przez to jest informacją dodat-
kową, a nie redundantną.

Możesz myśleć o tym pośrednim wykorzystaniu KNN jako o formie uczenia zagre-
gowanego, w którym wiele metod modelowania predykcyjnego jest używanych w po-
łączeniu z innymi. Technika KNN może być również rozważana jako forma metody
doboru cech, kiedy celem jest znalezienie cech (zmiennych predykcyjnych), które
mają moc predykcyjną. Najczęściej wymusza to ręczne przejrzenie danych, jednak
KNN jest automatycznym sposobem na otrzymanie podobnych wyników.

Rozważmy dane dotyczące domów z King County. Podczas wyceny domu na sprzedaż pośrednik
będzie opierał się na cenach podobnych domów, sprzedanych niedawno. Pośrednik wykonuje ma-
nualną wersję KNN: poprzez szukanie cen sprzedaży podobnych domów może oszacować, za ile
sprzedać dom. Możemy stworzyć nową cechę modelu statystycznego, naśladującą pośrednika nie-
ruchomości poprzez zastosowanie KNN do ostatnich sprzedaży. Prognozowana wartość jest ceną
sprzedaży i istniejącymi predyktorami, które zawierają lokalizację, całkowitą powierzchnię, typ

226 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


struktury, rozmiar działki, liczbę sypialni i łazienek. Nowa zmienna predykcyjna (cecha), którą do-
dajemy poprzez KNN, jest predyktorem KNN dla każdego rekordu. Ponieważ prognozujemy war-
tość numeryczną, średnia z K-najbliższych sąsiadów jest wykorzystywana zamiast głosowania
większościowego (znanego jako regresja KNN).
Podobnie dla danych dotyczących pożyczek możemy stworzyć cechę, która reprezentuje różne
aspekty zaciągania pożyczki. Przedstawiony poniżej kod R stworzy cechę reprezentującą wiarygod-
ność kredytową:
borrow_df <- model.matrix(~ -1 + dti + revol_bal + revol_util + open_acc +
delinq_2yrs_zero + pub_rec_zero, data=loan_data)
borrow_knn <- knn(borrow_df, test=borrow_df, cl=loan_data[, 'outcome'],
prob=TRUE, k=20)
prob <- attr(borrow_knn, "prob")
borrow_feature <- ifelse(borrow_knn == 'default', prob, 1 - prob)
summary(borrow_feature)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 0.400 0.500 0.501 0.600 0.950

W pakiecie scikit-learn uzyskujemy prawdopodobieństwa za pomocą metody predict_proba


wyuczonego modelu:
predictors = ['dti', 'revol_bal', 'revol_util', 'open_acc',
'delinq_2yrs_zero', 'pub_rec_zero']
outcome = 'outcome'

X = loan_data[predictors]
y = loan_data[outcome]

knn = KNeighborsClassifier(n_neighbors=20)
knn.fit(X, y)

loan_data['borrower_score'] = knn.predict_proba(X)[:, 1]
loan_data['borrower_score'].describe()

Wynik jest cechą, która prognozuje prawdopodobieństwo opóźnienia w spłacie kredytu na podsta-
wie historii kredytowej pożyczkobiorcy.

Główne zasady
• K-najbliższych sąsiadów (KNN) klasyfikuje rekord poprzez przypisanie go do klasy, do której
należą podobne rekordy.
• Podobieństwo (odległość) jest określane poprzez odległość euklidesową lub inne metryki.

• Liczba najbliższych sąsiadów K do porównania dla rekordu jest określana na podstawie zgod-
ności dopasowania algorytmu do danych uczących przy wykorzystaniu różnych wartości K.
• Najczęściej zmienne predykcyjne są standaryzowane, dzięki czemu zmienne z wysokimi
wartościami nie dominują w metryce odległości.
• Metoda KNN stanowi często pierwszy krok w modelowaniu predykcyjnym, a prognozowane
wartości są dodawane do danych jako predyktory do drugiego etapu modelowania (metodą
inną niż KNN).

K-najbliższych sąsiadów | 227

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Drzewa decyzyjne
Drzewa decyzyjne (ang. decision trees), nazywane również drzewami klasyfikacji i regresji (CART,
ang. Classification and Regression Trees)3, drzewami losowymi albo drzewami (ang. trees), są efektywną
i popularną metodą klasyfikacji (i regresji), stworzoną przez Leo Breimana i jego zespół w 1984 r.
Drzewa decyzyjne i ich najbardziej potężne metody pochodne: lasy losowe (ang. random forests)
i drzewa wzmacniane (ang. boosted trees) (patrz podrozdziały „Bagging i lasy losowe” oraz „Boosting”
w dalszej części tego rozdziału) stanowią podstawy najszerzej wykorzystywanych i najbardziej sku-
tecznych narzędzi modelowania predykcyjnego w data science dla regresji i klasyfikacji.

Kluczowe pojęcia dotyczące drzew decyzyjnych


Podział rekursywny
Powtarzany wielokrotnie podział danych, w którym celem jest stworzenie maksymalnie jed-
norodnych grup.
Kryterium podziału
Wartość predyktora, która dzieli rekordy na większe i mniejsze od kryterium podziału.
Węzeł
W drzewach decyzyjnych oraz innych metodach podobnych do reguł rozgałęziania węzeł jest
graficzną lub regułową reprezentacją kryterium podziału.
Liść
Koniec zbioru reguł typu „jeśli, to” lub gałęzi drzewa — reguł, które doprowadziły do liścia,
opisujących zasady klasyfikacji dla dowolnego rekordu w drzewie.
Strata
Liczba błędnie zaklasyfikowanych rekordów na etapie podziału; im większa strata, tym większe
zanieczyszczenie.
Zanieczyszczenie
Rozszerzenie w pewnej części danych, w którym można znaleźć mieszaninę klas (im więcej
różnych klas, tym większe zanieczyszczenie).
Synonimy
heterogeniczność, niejednorodność
Antonimy
homogeniczność, jednorodność
Przycinanie
Proces, w którym w pełni wykształcone drzewo ma wstecznie przycinane gałęzie w celu zre-
dukowania nadmiernego dopasowania.

3
Termin CART jest zarejestrowanym znakiem towarowym firmy Salford Systems i odnosi się do jej specyficznej
implementacji modelu drzew losowych.

228 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Drzewo decyzyjne jest zbiorem reguł „jeśli, to, w przeciwnym wypadku”, które są łatwe do zrozu-
mienia i implementacji. W przeciwieństwie do regresji liniowej i logistycznej drzewa umożliwiają
ujawnienie ukrytych wzorców w złożonych interakcjach pomiędzy danymi. Jednakże w przeci-
wieństwie do KNN czy naiwnego klasyfikatora bayesowskiego proste modele drzew mogą być wy-
rażone w postaci związków predykcyjnych, które można łatwo zinterpretować.

Drzewa decyzyjne w badaniach operacyjnych


Pojęcie drzewa decyzyjnego (ang. decision trees) ma inne (i starsze) znaczenie w nau-
kach decyzyjnych i inne w badaniach operacyjnych, w których odnosi się ono do pro-
cesu analitycznego człowieka. W tym kontekście punkt decyzyjny, prawdopodobne
wyniki i ich oszacowane prawdopodobieństwa są przedstawiane za pomocą diagramu
gałązkowego o wybranej ścieżce decyzyjnej z maksymalną wartością oczekiwaną.

Prosty przykład
Dwa główne pakiety dopasowania drzew decyzyjnych w R to rpart i tree. Wykorzystajmy pakiet
rpart do dopasowania modelu dla 3000 rekordów danych dotyczących pożyczek na podstawie
zmiennych payment_inc_ratio i borrower_score (opis danych znajdziesz w podrozdziale „K-naj-
bliższych sąsiadów” we wcześniejszej części tego rozdziału).
library(rpart)
loan_tree <- rpart(outcome ~ borrower_score + payment_inc_ratio,
data=loan3000, control=rpart.control(cp=0.005))
plot(loan_tree, uniform=TRUE, margin=0.05)
text(loan_tree)

Funkcja sklearn.tree.DecisionTreeClassifier zawiera implementację drzewa decyzyjnego.


W pakiecie dmba znajdziesz dodatkową funkcję pozwalającą na tworzenie wizualizacji w notatni-
kach Jupyter:
predictors = ['borrower_score', 'payment_inc_ratio']
outcome = 'outcome'

X = loan3000[predictors]
y = loan3000[outcome]

loan_tree = DecisionTreeClassifier(random_state=1, criterion='entropy',


min_impurity_decrease=0.003)
loan_tree.fit(X, y)
plotDecisionTree(loan_tree, feature_names=predictors,
class_names=loan_tree.classes_)

Wynik w postaci drzewa został przedstawiony na rysunku 6.3. Z powodu różnic w implementa-
cjach wyniki uzyskane za pomocą R i Pythona nie będą takie same; nie jest to nic niezwykłego.
Reguły klasyfikacji są określane poprzez sposób poruszania się po drzewie, od korzenia aż do liścia,
i w lewo dla wartości prawdziwej oraz w prawo dla wartości fałszywej, aż do natrafienia na liść.
Przyjęło się, że drzewo rysowane jest do góry nogami, więc korzeń jest na górze, a liście na dole.
Jeśli dla przykładu przeanalizujemy pożyczkę, w której przypadku borrower_score jest na poziomie
0,6 i payment_inc_ratio jest równe 0,8, to znajdziemy się w skrajnie lewym liściu, a prognozą dla
pożyczki będzie „spłacona w terminie”.

Drzewa decyzyjne | 229

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 6.3. Reguły dla prostego drzewa decyzyjnego dopasowane do danych dotyczących pożyczek

Inna wersja drzewa może być stworzona również następująco w R:


loan_tree
n= 3000

node), split, n, loss, yval, (yprob)


* denotes terminal node

1) root 3000 1445 paid off (0.5183333 0.4816667)


2) borrower_score>=0.575 878 261 paid off (0.7027335 0.2972665) *
3) borrower_score< 0.575 2122 938 default (0.4420358 0.5579642)
6) borrower_score>=0.375 1639 802 default (0.4893228 0.5106772)
12) payment_inc_ratio< 10.42265 1157 547 paid off (0.5272256 0.4727744)
24) payment_inc_ratio< 4.42601 334 139 paid off (0.5838323 0.4161677) *
25) payment_inc_ratio>=4.42601 823 408 paid off (0.5042527 0.4957473)
50) borrower_score>=0.475 418 190 paid off (0.5454545 0.4545455) *
51) borrower_score< 0.475 405 187 default (0.4617284 0.5382716) *
13) payment_inc_ratio>=10.42265 482 192 default (0.3983402 0.6016598) *
7) borrower_score< 0.375 483 136 default (0.2815735 0.7184265) *

Poziom w drzewie jest przedstawiony za pomocą wcięć. Każdy węzeł odpowiada tymczasowej kla-
syfikacji określonej za pomocą dominującego w tej części wyniku. „Strata” jest liczbą błędnie za-
klasyfikowanych przypadków, które znalazły się w klasyfikacji dla tymczasowego podziału. Przy-
kładowo w węźle 2. znaleziono 261 przypadki błędnie zaklasyfikowane w każdym z 878 rekordów.
Wartości w nawiasach odpowiadają odsetkowi rekordów, które mają, odpowiednio, spłaty termi-
nowe lub opóźnione. W węźle 13., który przewiduje opóźnienie spłaty, ponad 60% rekordów to
pożyczki z opóźnioną spłatą.

230 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W dokumentacji scikit-learn znajduje się instrukcja tworzenia reprezentacji tekstowej modelu
drzewa decyzyjnego. Umieściliśmy dodatkową funkcję w pakiecie dmba:
print(textDecisionTree(loan_tree))
--
node=0 test node: go to node 1 if 0 <= 0.5750000178813934 else to node 6
node=1 test node: go to node 2 if 0 <= 0.32500000298023224 else to node 3
node=2 leaf node: [[0.785, 0.215]]
node=3 test node: go to node 4 if 1 <= 10.42264986038208 else to node 5
node=4 leaf node: [[0.488, 0.512]]
node=5 leaf node: [[0.613, 0.387]]
node=6 test node: go to node 7 if 1 <= 9.19082498550415 else to node 10
node=7 test node: go to node 8 if 0 <= 0.7249999940395355 else to node 9
node=8 leaf node: [[0.247, 0.753]]
node=9 leaf node: [[0.073, 0.927]]
node=10 leaf node: [[0.457, 0.543]]

Algorytm rekursywnego podziału


Algorytm konstruujący drzewa decyzyjne, nazywany algorytmem rekursywnego podziału (ang.
recursive partitioning), jest prosty i intuicyjny. Dane są sekwencyjnie dzielone na podstawie zmien-
nych predykcyjnych, które w najlepszy sposób dzielą dane na względnie homogeniczne podgrupy.
Rysunek 6.4 przedstawia podziały stworzone dla drzewa z rysunku 6.3. Pierwszą regułą, opisywaną
przez regułę 1, jest borrower_score >= 0.575 i oddziela ona prawą część wykresu. Drugą regułą jest
borrowe_score < 0.375, która oddziela lewą stronę wykresu.

Rysunek 6.4. Pierwsze trzy reguły dla prostego drzewa decyzyjnego dopasowanego do danych dotyczących pożyczek

Drzewa decyzyjne | 231

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Przypuśćmy, że mamy zmienną wyjściową Y i zestaw P predyktorów Xj, gdzie j = 1, …, P. Rekur-
sywny podział znajdzie najlepszą drogę podziału A na dwie podgrupy:
1. Dla każdej zmiennej predykcyjnej Xj:
a. dla każdej wartości sj z Xj:
i. wydziel rekordy z A dla wartości Xj < sj jako jedną grupę, a pozostałe rekordy, w których
Xj ≥ sj, jako drugą;
ii. zmierz homogeniczność klas w podgrupach A;
b. wybierz wartości sj, które dają największą wewnętrzną homogeniczność klas w grupach.
2. Wybierz zmienną Xj i kryterium podziału sj, za pomocą których otrzymasz największą homo-
geniczność grup.
Teraz czas na część rekursywną:
1. Zainicjalizuj A dla całego zbioru danych.
2. Zastosuj algorytm podziału do podziału A na dwie podgrupy: A1 i A2.
3. Powtórz krok 2. w podgrupach A1 i A2.
4. Algorytm kończy się, gdy nie można zrobić więcej podziałów, które wyraźnie poprawią homo-
geniczność grup.
Wynikiem końcowym jest podział danych pokazany na rysunku 6.4; wyjątek stanowi p-wymiarów
dla każdego prognozowanego podzbioru wyników 0 lub 1, w zależności od większości odpowiedzi
w danym podzbiorze.

Jako dodatek do binarnych prognoz 0/1 drzewa decyzyjne mogą tworzyć również
prawdopodobieństwa oszacowane na liczbach 0 i 1 w podzbiorze. Oszacowanie jest
sumą 0 i 1 w podzbiorze podzielonym przez liczbę obserwacji w tym podzbiorze.

𝐿𝑖𝑐𝑧𝑏𝑎 𝑤𝑦𝑠𝑡ą𝑝𝑖𝑒ń 1 𝑤 𝑝𝑜𝑑𝑧𝑏𝑖𝑜𝑟𝑧𝑒


𝑃𝑟𝑜𝑏 𝑌 1
𝐿𝑖𝑐𝑧𝑏𝑎 𝑜𝑏𝑠𝑒𝑟𝑤𝑎𝑐𝑗𝑖 𝑤 𝑝𝑜𝑑𝑧𝑏𝑖𝑜𝑟𝑧𝑒

Oszacowana wartość Prob(Y = 1) może być przeliczona na decyzję binarną, np. usta-
wienie oszacowania na 1, jeśli Prob(Y = 1) > 0,5.

Pomiar homogeniczności lub zanieczyszczenia


Drzewa decyzyjne tworzą rekursywnie podzbiory (zestawy rekordów), A, które prognozują wyniki
Y = 0 lub Y = 1. Na podstawie opisanego już algorytmu możesz stwierdzić, że potrzebujemy sposobu
na pomiar homogeniczności, zwanej również jednorodnością klasy (ang. class purity), wewnątrz
podzbioru lub na mierzenie niejednorodności podzbioru. Jakość prognozy jest proporcją p błędnie
zaklasyfikowanych rekordów w podzbiorze i waha się od 0 (idealne) do 0,5 (czysto losowy dobór).
Okazuje się, że jakość nie jest dobrą miarą jednorodności. Zamiast jakości wykorzystuje się dwie
popularne miary jednorodności: miarę Giniego zanieczyszczenia węzła (ang. Gini impurity) i en-
tropię informacji (ang entropy of information). Te (i inne) metody pomiaru zanieczyszczenia

232 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


stosuje się w przypadku problemów klasyfikacji dla więcej niż dwóch klas; my skupimy się na przy-
padkach binarnych. Miara Giniego dla zbioru rekordów określona jest następująco:

𝐼 𝐴 𝑝 1−𝑝
Entropia jest dana wzorem:

𝐼 𝐴 −𝑝 𝑙𝑜𝑔 𝑝 − 1 − 𝑝 𝑙𝑜𝑔 1 − 𝑝

Rysunek 6.5 pokazuje, że zmierzone miara Giniego zanieczyszczenia węzła (przeskalowana) i en-
tropia są podobne, przy czym entropia wskazuje na wyższy poziom niejednorodności dla średnich
i wysokich wartości jakości.

Rysunek 6.5. Miary zanieczyszczenia węzła (impurity): Giniego (Gini) i entropia (Entropy)
porównane z dokładnością (Accuracy)

Współczynnik Giniego
Miara Giniego zanieczyszczenia węzła nie powinna być mylona ze współczynnikiem
Giniego. Oba pojęcia reprezentują podobne zagadnienia, jednak współczynnik
Giniego ogranicza się jedynie do klasyfikacji binarnej i jest związany z AUC (patrz
punkt „Pole pod wykresem krzywej ROC” w rozdziale 5.).

Miary zanieczyszczenia są wykorzystywane w algorytmach podziału opisanych już wcześniej.


Dla każdego proponowanego podzbioru oblicza się miarę zanieczyszczenia jako efekt każdego po-
działu. Następnie obliczana jest średnia ważona i wybierany jest podzbiór (na każdym poziomie)
z najniższą średnią ważoną.

Drzewa decyzyjne | 233

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Zatrzymanie wzrostu drzewa
W miarę jak drzewo się rozrasta, reguły podziału zaczynają być coraz bardziej szczegółowe,
a drzewo stopniowo przechodzi z identyfikowania „dużych” reguł, które identyfikują rzeczywiste
i wiarygodne związki w danych, do identyfikowania „małych” reguł, które odzwierciedlają jedynie
szum. W pełni rozwinięte drzewo ma całkowicie czyste liście i 100% dokładności w klasyfikacji
danych, na których jest trenowane. Ta dokładność oczywiście jest iluzoryczna — mamy do czynienia
z nadmiernym dopasowaniem do danych (patrz ramka „Kompromis między obciążeniem a zróż-
nicowaniem” we wcześniejszej części tego rozdziału), dopasowaniem do szumu w danych uczących,
a nie do faktycznego sygnału, który chcemy zidentyfikować.
Potrzebujemy sposobu na określenie tego, kiedy drzewo ma przestać rosnąć na etapie, który
pozwoli wyciągać wnioski dla nowych danych. Istnieje wiele popularnych metod zatrzymywania
podziałów w R i Pythonie:
• Unikanie podziałów na podzbiory, jeśli wynikowy podzbiór jest zbyt mały lub jeśli liść koń-
cowy jest zbyt mały. W rpart (R)obie właściwości są kontrolowane niezależnie przez parametry
minsplit i minbucket, z domyślnymi wartościami, odpowiednio, 20 i 7 W klasie DecisionTree
´Classifier (Python) możemy regulować to za pomocą parametrów min_samples_split
(domyślna wartość 2) i min_samples_leaf (domyślna wartość 1).
• Zaprzestanie podziałów, jeśli nowy podzbiór nie redukuje „znacząco” niejednorodności.
W rpart jest to kontrolowane przez parametr złożoności (ang. complexity parameter) cp, który
jest miarą tego, jak bardzo złożone jest drzewo — im bardziej jest złożone, tym wyższa wartość cp.
W praktyce cp jest wykorzystywane do ograniczenia wzrostu drzewa poprzez dawanie kary za
dodatkową złożoność (podział) drzewa. Klasa DecisionTreeClassifier (Python) zawiera pa-
rametr min_impurity_decrease ograniczający podział na podstawie wartości ważonej spadku
zanieczyszczenia. Małe wartości prowadzą do bardziej złożonych drzew.
Metody te wykorzystują techniki arbitralne i mogą być przydatne w badaniach, ale nie jest łatwo
określić wartości optymalne (tj. wartości maksymalizujące dokładność predykcyjną dla nowych
danych). Musimy połączyć sprawdzian krzyżowy z systematycznym zmienianiem parametrów mo-
delu lub z modyfikowaniem drzewa poprzez jego przycinanie.

Kontrolowanie złożoności drzewa w R


Jeśli cp jest zbyt małe, drzewo nadmiernie dopasuje się do danych, uwzględniając szum, a nie sy-
gnał. Natomiast jeśli cp jest zbyt duże, drzewo będzie zbyt małe będzie miało zbyt małą moc pre-
dykcyjną. Domyślnie w rpart wartość cp wynosi 0,01, jednak szybko zauważysz, że jest ona zbyt
duża dla dużych zbiorów danych. W poprzednim przykładzie cp zostało ustawione na 0.005, po-
nieważ wartość domyślna prowadziła do drzewa z jednym podziałem. W analizie eksploracyjnej
wystarcza zwykle przetestowanie kilku wartości.
Określenie optymalnego cp jest szczególnym przypadkiem kompromisu pomiędzy obciążeniem
a zróżnicowaniem. Najpowszechniejszą metodą szacowania dobrej wartości cp jest kroswalidacja
(patrz punkt „Kroswalidacja” w rozdziale 4.):

234 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


1. Podziel dane na zbiory uczący i testowy.
2. Stwórz drzewo na bazie zbioru uczącego.
3. Przycinaj drzewo krok po kroku, uwzględniając cp (użyj danych uczących) na każdym poziomie.
4. Sprawdź, które cp odpowiada minimalnemu błędowi (stracie) dla danych testowych.
5. Podziel ponownie dane na nowe zbiory uczący i testowy, powtórz tworzenie drzewa, przyci-
nanie i sprawdzanie cp.
6. Powtórz to jeszcze raz i jeszcze raz, aż średnia ze wszystkich wartości cp będzie odpowiadać
błędowi minimalnemu dla każdego drzewa.
7. Wróć do danych oryginalnych lub nowych danych, stwórz drzewo, zatrzymaj się na znalezio-
nej optymalnej wartości cp.
W rpart możesz użyć argumentu cptable do tworzenia tabeli wartości cp i ich błędów z kroswalidacją
(xerror w R), na podstawie których można określić wartość cp z najniższym błędem kroswalidacji.

Kontrolowanie złożoności drzewa w Pythonie


Implementacja drzewa decyzyjnego w pakiecie scikit-learn nie zawiera ani parametru złożoności,
ani możliwości przycinania drzew. Rozwiązaniem jest tutaj stosowanie przeszukiwania siatki wobec
różnych wartości parametrów. Możemy na przykład wyznaczyć parametr max_depth w przedziale
od 5 do 30 i min_samples_split w zakresie od 20 do 100. Metoda GridSearchCV w wygodny sposób
łączy wyczerpujące przeszukiwanie wszystkich kombinacji parametrów z kroswalidacją. Optymalny
zbiór parametrów zostaje następnie wybrany za pomocą sprawdzonej krzyżowo wydajności modelu.

Prognoza ciągłych wartości


Prognozy dla zmiennych ciągłych (nazywane również regresją) stworzone za pomocą drzew pod-
legają tej samej logice i tym samym procedurom, z wyjątkiem miary homogeniczności, która jest
obliczana jako odchylenie kwadratowe ze średniej (błąd średniokwadratowy) dla każdego pod-
zbioru, oraz prognozowanej wydajności, ocenianej przez pierwiastek kwadratowy błędu średnio-
kwadratowego (RMSE) (patrz punkt „Ocena modelu” w rozdziale 4.) dla każdego podzbioru.
Pakiet scikit-learn zawiera metodę sklearn.tree.DecisionTreeRegressor służącą do trenowania
modelu regresyjnego drzewa decyzyjnego.

Jak są wykorzystywane drzewa


Jedną z głównych przeszkód w modelowaniu predykcyjnym dla organizacji jest niezaprzeczalna
natura czarnej skrzynki tej metody, która stoi w opozycji do innych elementów organizacji. Drzewa
decyzyjne stanowią atrakcyjną metodę ze względu na dwie swoje cechy:
• Oferują wizualne narzędzie do badania danych i stwierdzania, które zmienne są ważne i jak są
związane z pozostałymi. Drzewa mogą wyłapywać nieliniowe związki pomiędzy zmiennymi
objaśniającymi.
• Zapewniają zestaw reguł, które mogą być efektywnie przedstawione niespecjalistom, zarówno
do implementacji, jak i do „sprzedania” projektu data mining.

Drzewa decyzyjne | 235

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Wróćmy do predykcji: wykorzystywanie wyników z wielu drzew ma zazwyczaj większą moc niż
używanie pojedynczego drzewa. W szczególności lasy losowe i drzewa wzmacniane niemal zawsze
dostarczają wyników o większej wiarygodności i dokładności predykcyjnej (patrz podrozdziały
„Bagging i lasy losowe” i „Boosting” w dalszej części tego rozdziału), jednak nie można wtedy sko-
rzystać z wspomnianych zalet pojedynczego drzewa.

Główne zasady
• Drzewa decyzyjne zapewniają zestaw reguł klasyfikacji lub predykcji wyniku.
• Reguły odpowiadają udanemu podziałowi danych na podzbiory.
• Każdy podzbiór lub podział odnosi się do specyficznej wartości zmiennej predykcyjnej i dzieli
dane na rekordy, w których wartość predyktora znajduje się powyżej lub poniżej tego kryte-
rium podziału.
• Algorytm drzewa dobiera kryterium podziału na każdym poziomie tak, by minimalizować
niejednorodność wyników w każdym podzbiorze.
• Kiedy nie da się już bardziej dzielić, drzewo jest w pełni wykształcone i każdy węzeł końcowy
lub liść zawiera rekordy pojedynczej klasy; nowe przypadki, spełniając wyznaczone ścieżki
reguł (podziałów), są na tej podstawie przypisywane do konkretnych klas.
• W pełni rozwinięte drzewo nadmiernie dopasowane do danych musi być przycięte tak, żeby
opisywało sygnał, a nie szum.
• Algorytmy wielu drzew, takie jak lasy losowe i drzewa wzmacniane, umożliwiają osiągnięcie
lepszej wydajności predykcyjnej, ale tracą moc jednoznaczności pojedynczego drzewa opar-
tego na regułach.

Dla pogłębienia wiedzy


• Analytics Vidhya Content Team, Tree Based Algorithms: A Complete Tutorial from Scratch
(in R & Python) (https://www.analyticsvidhya.com/blog/2016/04/tree-based-algorithms-com-
plete-tutorial-scratch-in-python/), 12 kwietnia 2016 r.
• Terry M. Therneau, Elizabeth J. Atkinson (Mayo Foundation), An Introduction to Recursive
Partitioning Using the RPART Routines (https://cran.r-project.org/web/packages/rpart/vignettes/
longintro.pdf), 11 kwietnia 2019 r.

Bagging i lasy losowe


W 1906 r. statystyk sir Francis Galton odwiedzał wesołe miasteczko w Anglii, gdzie przeprowa-
dzono konkurs, w którym trzeba było zgadnąć wagę tuszy wołu leżącej na wystawie. W konkursie
wzięło udział 800 chętnych, padły różne odpowiedzi, ale zarówno średnia, jak i mediana znajdo-
wały się w odległości 1% od prawdziwej wagi wołu. James Surowiecki zbadał to zjawisko, a wyniki
przedstawił w swojej książce The Wisdom of Crowds (Doubleday, 2004). Ta zasada obowiązuje rów-
nież w odniesieniu do modeli predykcyjnych: uśrednianie (lub słuchanie większości głosów) w wielu
modelach — modelach zagregowanych (ang. ensemble) — okazuje się bardziej dokładne niż wybór
pojedynczego modelu.

236 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Kluczowe pojęcia dotyczące baggingu i lasów losowych
Agregacja
Formowanie predykcji na podstawie zestawu modeli.
Synonim
uśrednianie modelu

Bagging
Ogólna metoda formowania zestawu modeli poprzez tworzenie prób bootstrapowych z danych.
Synonim
agregacja bootstrapowa

Las losowy
Typ oszacowania typu bagging opartego na modelach drzew decyzyjnych.
Synonim
zagregowane drzewa losowe

Istotność zmiennej
Miara istotności zmiennej objaśniającej w jakości modelu.

Hiperparametry
Parametry, które muszą być doprecyzowane przed rozpoczęciem dopasowania algorytmu.

Podejście zagregowane było stosowane w wielu różnych metodach modelowania. Najbardziej me-
dialnym przypadkiem był konkurs Netflix Prize; zaproponowano w nim nagrodę w wysokości mi-
liona dolarów dla osoby, która stworzy model poprawiający o 10% wskaźnik predykcji określający
wybór proponowanych filmów dla klientów firmy. Najprostsza wersja agregacji jest następująca:
1. Stwórz model predykcyjny i zapisz prognozy dla zadanego zbioru danych.
2. Powtórz to wielokrotnie na różnych modelach, ale tych samych danych.
3. Dla każdego rekordu wyciągnij średnią (lub średnią ważoną, lub głosy większościowe) z pro-
gnozy.
Metody zagregowane były stosowane systematycznie i efektywnie dla drzew decyzyjnych. Zagre-
gowane drzewa decyzyjne są tak potężne, że można za ich pomocą budować dobre modele predyk-
cyjne stosunkowo niewielkim wysiłkiem.
Wychodząc poza proste algorytmy zagregowane, można powiedzieć, że istnieją dwa warianty mo-
deli zagregowanych: bagging i boosting. W przypadku drzew decyzyjnych odnoszą się one do la-
sów losowych (ang. random forest) i drzew wzmacnianych (ang. boosted tree). Ten punkt skupia
się na baggingu, boosting jest opisany w kolejnym.

Bagging i lasy losowe | 237

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Bagging
Bagging (nazwa pochodzi od angielskich słów bootstrap aggregating) został opisany przez Leo
Breimana w 1994 r. Przypuśćmy, że mamy Y odpowiedzi i P zmiennych objaśniających X = X1,
X2, …, XP w N rekordach.
Bagging jest podobny do podstawowego algorytmu agregacji, tylko zamiast dopasowywać różne
modele do tych samych danych, każdy nowy model dopasowuje się do nowej próby bootstrapowej.
Poniżej znajduje się bardziej formalny opis algorytmu:
1. Zainicjalizuj M, liczbę modeli do dopasowania, oraz n, liczbę rekordów do wyboru (n < N).
Ustaw licznik iteracji m = 1.
2. Wylosuj jedną próbę bootstrapową (ze zwracaniem) i n rekordów ze zbioru uczącego, a następnie
stwórz podzbiory Ym i Xm.
3. Naucz model, wykorzystując Ym i Xm do stworzenia zestawu reguł decyzyjnych fǻm(X).
4. Zmień licznik modelu na kolejny: m = m+1. Jeśli m <= M, przejdź do kroku 2.

W przypadku gdy fǻm(X) prognozuje prawdopodobieństwo Y = 1, oszacowanie typu zagregowanego


jest dane przez:
1
𝑓= (𝑓 (𝑋) + 𝑓 (𝑋)+. . . +𝑓 (𝑋))
𝑀

Las losowy
Las losowy (ang. random forest) jest oparty na metodzie baggingu dla drzew decyzyjnych,
z jednym ważnym rozszerzeniem: poza próbkowaniem rekordów algorytm próbkuje również
zmienne4. Tradycyjne drzewa decyzyjne określają, w jaki sposób stworzyć podzbiory zbioru A.
Algorytm wybiera zmienne i kryteria podziału poprzez minimalizację takich miar jak zanie-
czyszczenie węzła Giniego (patrz punkt „Pomiar homogeniczności lub zanieczyszczenia” we
wcześniejszej części tego rozdziału). Dla lasów losowych na każdym etapie algorytmu dobór
zmiennych jest ograniczony do losowego zbioru zmiennych. W porównaniu do podstawowego
algorytmu (patrz punkt „Algorytm rekursywnego podziału” we wcześniejszej części tego roz-
działu) las losowy dodaje dwa kolejne elementy: omówiony wcześniej bagging (patrz po-
przedni punkt „Bagging”) i próby bootstrapowe dla zmiennych przy każdym podziale. Proce-
dura jest następująca:
1. Wylosuj próbę bootstrapową (ze zwracaniem) z rekordów.
2. Dla pierwszego kryterium podziału użyj p < P losowo wybranych zmiennych bez zwracania.

4
Pojęcie lasu losowego jest znakiem towarowym Leo Breimana i Adele Cutler; jest ono licencjonowane przez Salford
Systems. Nie ma standardowej nazwy niebędącej znakiem towarowym, a termin „lasy losowe” jest tak jedno-
znaczny dla algorytmu jak nazwa „Kleenex” dla chusteczek do twarzy.

238 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


3. Dla każdej zmiennej w próbie Xj(1), Xj(2), … Xj(p) zastosuj algorytm podziału:
a. Dla każdej wartości sj(k) z Xj(k):
i. Wydziel rekordy w zbiorze A na Xj(k) < sj(k) jako jeden podzbiór, a pozostałą część, gdzie
Xj(k) ≥ sj(k), wydziel jako drugi.
ii. Zmierz homogeniczność klas w obu podzbiorach A.
b. Wybierz wartość sj(k), dla której otrzymano maksymalną homogeniczność klas wewnątrz
podzbioru.
4. Wybierz zmienną Xj(k) i kryterium podziału sj(k), dla którego otrzymano maksymalną homoge-
niczność klas wewnątrz podzbioru.
5. Przejdź do kolejnego kryterium podziału i powtórz poprzednie kroki, rozpoczynając od
punktu 2.
6. Kontynuuj dodatkowe podziały, przeprowadzając te same procedury, aż drzewo będzie rozwinięte.
7. Wróć do kroku 1., weź inną próbę bootstrapową i zacznij cały proces od nowa.

Jak wiele zmiennych potrzeba do każdego kroku? Przyjęło się wybieranie √𝑃, gdzie P jest liczbą
zmiennych objaśniających. Pakiet randomForest ma zaimplementowane lasy losowe w R. Poniżej
przedstawiono zastosowanie tego pakietu do danych dotyczących pożyczek (opis danych znaj-
dziesz w podrozdziale „K-najbliższych sąsiadów” we wcześniejszej części tego rozdziału).
rf <- randomForest(outcome ~ borrower_score + payment_inc_ratio,
data=loan3000)
rf
Call:
randomForest(formula = outcome ~ borrower_score + payment_inc_ratio, data = loan3000)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 1

OOB estimate of error rate: 39.17%


Confusion matrix:
Default paid off class.error
default 873 572 0.39584775
paid off 603 952 0.38778135

W Pythonie możemy użyć metody sklearn.ensemble.RandomForestClassifier:


predictors = ['borrower_score', 'payment_inc_ratio']
outcome = 'outcome'

X = loan3000[predictors]
y = loan3000[outcome]

rf = RandomForestClassifier(n_estimators=500, random_state=1, oob_score=True)


rf.fit(X, y)

Domyślnie uczonych jest 500 drzew. Ponieważ mamy jedynie dwie zmienne w zbiorze predykto-
rów, algorytm losowo dobiera zmienną, która będzie stanowiła kryterium podziału na każdym eta-
pie (będzie to próba bootstrapowa o rozmiarze 1).

Bagging i lasy losowe | 239

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Oszacowanie błędu typu out-of-bag (OOB) jest wskaźnikiem błędu dla stworzonego modelu, za-
stosowanym do danych, które były poza zbiorem uczącym dla konkretnego drzewa. Wykorzystując
wyjście z modelu, błąd OOB można narysować w R na różne sposoby w zależności od liczby drzew
w lesie losowym:
error_df = data.frame(error_rate=rf$err.rate[,'OOB'],
num_trees=1:rf$ntree)
ggplot(error_df, aes(x=num_trees, y=error_rate)) +
geom_line()

Implementacja RandomForestClassifier nie zawiera prostego sposobu uzyskiwania oszacowań


OOB w funkcji liczby drzew lasu losowego. Możemy wyuczyć sekwencję klasyfikatorów zawierają-
cych coraz większą liczbę drzew i śledzić wartości oob_score_. Niestety, metoda ta nie jest wydajna:
n_estimator = list(range(20, 510, 5))
oobScores = []
for n in n_estimator:
rf = RandomForestClassifier(n_estimators=n, criterion='entropy',
max_depth=5, random_state=1, oob_score=True)
rf.fit(X, y)
oobScores.append(rf.oob_score_)
df = pd.DataFrame({ 'n': n_estimator, 'oobScore': oobScores })
df.plot(x='n', y='oobScore')

Wynik jest przedstawiony na rysunku 6.6. Wskaźnik błędu gwałtownie spada z ponad 0,44 aż do
stabilizacji w punkcie mniej więcej 0,385. Wartości prognozowane mogą być otrzymane za pomocą
funkcji predict, jak pokazano poniżej w R:
pred <- predict(rf, prob=TRUE)
rf_df <- cbind(loan3000, pred = pred)
ggplot(data=rf_df, aes(x=borrower_score, y=payment_inc_ratio,
shape=pred, color=pred, size=pred)) +
geom_point(alpha=.8) +
scale_color_manual(values = c('paid off'='#b8e186', 'default'='#d95f02')) +
scale_shape_manual(values = c('paid off'=0, 'default'=1)) +
scale_size_manual(values = c('paid off'=0.5, 'default'=2))

Możemy stworzyć w Pythonie podobny wykres:


predictions = X.copy()
predictions['prediction'] = rf.predict(X)
predictions.head()

fig, ax = plt.subplots(figsize=(4, 4))

predictions.loc[predictions.prediction=='paid off'].plot(
x='borrower_score', y='payment_inc_ratio', style='.',
markerfacecolor='none', markeredgecolor='C1', ax=ax)
predictions.loc[predictions.prediction=='default'].plot(
x='borrower_score', y='payment_inc_ratio', style='o',
markerfacecolor='none', markeredgecolor='C0', ax=ax)
ax.legend(['paid off', 'default']);
ax.set_xlim(0, 1)
ax.set_ylim(0, 25)
ax.set_xlabel('borrower_score')
ax.set_ylabel('payment_inc_ratio')

240 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 6.6. Przykład poprawy jakości lasu losowego poprzez dodanie większej liczby drzew

Wykres przedstawiony na rysunku 6.7 jest całkiem odkrywczy, jeśli chodzi o naturę lasów losowych.
Lasy losowe to metoda „czarnej skrzynki”. Tworzą one bardziej dokładne prognozy niż pojedyncze
drzewo, ale jednocześnie gubią intuicyjne reguły decyzyjne pojedynczego drzewa. Prognozy lasu
losowego są nieco zaszumione: zauważ, że niektórzy pożyczkobiorcy z wysokim wskaźnikiem wia-
rygodności wciąż kończą jako potencjalnie zalegający ze spłatą. Jest to efekt pewnych nietypowych
rekordów w danych, co obrazuje niebezpieczeństwo nadmiernego dopasowania przez las losowy
(patrz ramka „Kompromis między obciążeniem a zróżnicowaniem” we wcześniejszej części tego rozdziału).

Rysunek 6.7. Prognozowane wyniki z lasów losowych zastosowane do danych dotyczących pożyczek z opóźnioną spłatą

Bagging i lasy losowe | 241

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Istotność zmiennej
Siła algorytmu lasów losowych objawia się, kiedy budujesz modele predykcyjne dla danych o wielu
cechach dla wielu rekordów. Ma on zdolność automatycznego określania, który predyktor jest
ważny, i odkrywania złożonych relacji pomiędzy predyktorami odpowiadającymi warunkom inte-
rakcji (patrz punkt „Interakcje i efekty główne” w rozdziale 4.). Dopasujmy przykładowy model do
danych dotyczących pożyczek dla wszystkich kolumn w R:
rf_all <- randomForest(outcome ~ ., data=loan_data, importance=TRUE)
rf_all

Call:
randomForest(formula = outcome ~ ., data = loan_data, importance = TRUE)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 4

OOB estimate of error rate: 33.79%


Confusion matrix:
default paid off class.error
paid off 14676 7995 0.3526532
default 7325 15346 0.3231000

I w Pythonie:
predictors = ['loan_amnt', 'term', 'annual_inc', 'dti', 'payment_inc_ratio',
'revol_bal', 'revol_util', 'purpose', 'delinq_2yrs_zero',
'pub_rec_zero', 'open_acc', 'grade', 'emp_length', 'purpose_',
'home_', 'emp_len_', 'borrower_score']
outcome = 'outcome'

X = pd.get_dummies(loan_data[predictors], drop_first=True)
y = loan_data[outcome]

rf_all = RandomForestClassifier(n_estimators=500, random_state=1)


rf_all.fit(X, y)

Argument importance=TRUE wskazuje na to, że randomForest będzie gromadzić dodatkowe infor-


macje o istotności poszczególnych zmiennych. Funkcja varImpPlot rysuje względną istotność
zmiennych (względną do permutacji tej zmiennej):
varImpPlot(rf_all, type=1)
varImpPlot(rf_all, type=2)

Średni spadek dokładności.


Średni spadek zanieczyszczenia węzła.
W Pythonie funkcja RandomForestClassifier zbiera informacje o istotności cech w czasie uczenia
modelu i udostępnia je w polu feature_importances_:
importances = rf_all.feature_importances_

Wskaźnik Giniego jest dostępny jako własność feature_importance_ dopasowanego klasyfikatora.


Jednak spadek dokładności nie jest domyślnie dostępny w Pythonie. Możemy obliczyć go (scores)
w następujący sposób:

242 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


rf = RandomForestClassifier(n_estimators=500)
scores = defaultdict(list)

# kroswalidacja wyników na wielu różnych losowych podziałach danych


for _ in range(3):
train_X, valid_X, train_y, valid_y = train_test_split(X, y, test_size=0.3)
rf.fit(train_X, train_y)
acc = metrics.accuracy_score(valid_y, rf.predict(valid_X))
for column in X.columns:
X_t = valid_X.copy()
X_t[column] = np.random.permutation(X_t[column].values)
shuff_acc = metrics.accuracy_score(valid_y, rf.predict(X_t))
scores[column].append((acc-shuff_acc)/acc)

Wynik przedstawiono na rysunku 6.8. Podobny wykres możemy otrzymać także w Pythonie:
df = pd.DataFrame({
'feature': X.columns,
'Accuracy decrease': [np.mean(scores[column]) for column in X.columns],
'Gini decrease': rf_all.feature_importances_,
})
df = df.sort_values('Accuracy decrease')

fig, axes = plt.subplots(ncols=2, figsize=(8, 4.5))


ax = df.plot(kind='barh', x='feature', y='Accuracy decrease',
legend=False, ax=axes[0])
ax.set_ylabel('')

ax = df.plot(kind='barh', x='feature', y='Gini decrease',


legend=False, ax=axes[1])
ax.set_ylabel('')
ax.get_yaxis().set_visible(False)

Istnieją dwa sposoby pomiaru istotności zmiennej:


• Poprzez miarę spadku dokładności modelu, jeśli wartości zmiennych są losowo permutowane
(type=1). Losowe permutowanie wartości skutkuje usunięciem całej mocy predykcyjnej dla
zmiennej. Jakość jest obliczana na podstawie danych out-of-bag (miara jest w zasadzie oszaco-
waniem kroswalidacyjnym).
• Poprzez miarę spadku średniej we wskaźniku zanieczyszczenia Giniego (patrz punkt „Pomiar
homogeniczności lub zanieczyszczenia” we wcześniejszej części tego rozdziału) dla wszystkich
węzłów podziałowych dla zmiennej (type=2). Mierzy to, w jakim stopniu dołączenie danej
zmiennej przyczynia się do jednorodności węzła. Ta miara jest oparta na zbiorze uczącym
i dlatego jest mniej wiarygodna niż miara oparta na danych out-of-bag.
Górny i dolny panel rysunku 6.8 przedstawiają istotność zmiennych w zależności od, odpowiednio,
spadku dokładności i wskaźnika zanieczyszczenia Giniego. Zmienne w obu panelach są uszerego-
wane malejąco według dokładności. Wskaźniki istotności zmiennej obliczone tymi dwoma meto-
dami są zdecydowanie różne.
Wiemy już, że spadek dokładności jest bardziej wiarygodną metryką, dlaczego zatem powinniśmy
używać miary spadku wskaźnika Giniego? Domyślnie randomForest oblicza jedynie wskaźnik Gi-
niego: wynik jest efektem ubocznym działania algorytmu, podczas gdy dokładność wymaga dodat-
kowych obliczeń (losowych permutacji danych i prognoz dla nich). W przypadku gdy złożoność

Bagging i lasy losowe | 243

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 6.8. Istotność zmiennych dla pełnego modelu dopasowania do danych dotyczących pożyczek

obliczeniowa jest istotna, np. w ustawieniach produkcji, kiedy to dopasowywane są tysiące modeli,
może nie warto dokładać sobie wysiłku. Dodatkowo spadek wskaźnika Giniego wskazuje, których
zmiennych używa las losowy do tworzenia kryterium podziału (przypomnijmy, że ta informacja,
widoczna w zwykłym drzewie decyzyjnym, jest tracona w lesie losowym).

Hiperparametry
Las losowy, podobnie jak wiele algorytmów statystycznych i uczenia maszynowego, może być roz-
ważany jako algorytm czarnej skrzynki z pokrętłami do regulacji działania. Te pokrętła są zwane
hiperparametrami (ang. hyperparameters) i są parametrami, które muszą być określone przed roz-
poczęciem dopasowywania modelu; nie są optymalizowane jako część procesu dopasowywania.
Tradycyjne modele statystyczne wymagają jedynie dokonania pewnego wyboru parametrów (np.
predyktorów wykorzystywanych w modelu regresji); hiperparametry lasu losowego są od nich zde-
cydowanie bardziej wrażliwe, zwłaszcza w przypadku unikania nadmiernego dopasowania. Dwa
najważniejsze hiperparametry lasu losowego to:

244 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


nodesize/min_samples_leaf
Minimalny rozmiar dla węzła końcowego (liścia w drzewie). Domyślnie jest to 1 dla klasyfikacji
i 5 dla regresji w R. W implementacji scikit-learn w obydwu przypadkach wartość domyślna
wynosi 1.
maxnodes/max_leaf_nodes
Maksymalna liczba węzłów w każdym drzewie decyzyjnym. Domyślnie nie ma tu ograniczeń
i duże drzewa będą dopasowywane zgodnie z ograniczeniem nodesize. W Pythonie wyzna-
czamy maksymalną liczbę węzłów końcowych. Wiążą się z tym obydwa parametry:
maxnodes = 2max_leaf_nodes−1
Może być kuszące zignorowanie tych parametrów i użycie wartości domyślnych. Jednakże uży-
wanie wartości domyślnych może doprowadzić do nadmiernego dopasowania przy stosowaniu
lasów losowych do zaszumionych danych. Jeśli podniesiesz wartości nodesize/min_samples_leaf
i maxnodes/max_leaf_nodes, algorytm dopasuje mniejsze drzewo i najprawdopodobniej stwo-
rzy mniej fałszywych reguł predykcyjnych. Kroswalidacja (patrz podrozdział „Kroswalidacja”
w rozdziale 4.) może być wykorzystana do testów efektywności ustawień różnych wartości
dla hiperparametrów.

Główne zasady
• Modele zagregowane zwiększają dokładność modelu poprzez łączenie wyników z różnych
modeli.
• Bagging jest szczególnym przypadkiem modelu zagregowanego opartego na dopasowaniu
wielu modeli do prób bootstrapowych z danych i uśrednieniu modelu.
• Las losowy jest specjalnym typem baggingu stosowanego do drzew decyzyjnych. Poza da-
nymi algorytm lasu losowego próbkuje zmienne objaśniające podczas podziałów.
• Praktyczny wynik z lasu losowego jest miarą istotności zmiennych, która szereguje predyk-
tory w zależności od ich udziału w dokładności modelu.
• Las losowy ma zestaw hiperparametrów, które powinny być wyregulowane przy użyciu kro-
swalidacji, by można było uniknąć nadmiernego dopasowania.

Boosting
Modele zagregowane stały się standardowym narzędziem modelowania predykcyjnego. Boosting5
jest ogólną techniką do tworzenia modeli zagregowanych. Została ona rozwinięta mniej więcej
w tym samym czasie co bagging (patrz podrozdział „Bagging i lasy losowe” we wcześniejszej części
tego rozdziału). Podobnie jak bagging, boosting jest najczęściej wykorzystywany w kontekście
drzew decyzyjnych. Pomimo pewnych podobieństw do baggingu boosting stanowi zdecydowanie

5
Istnieje polska nazwa: wzmacnianie, jednak nie spotkasz się z nią często w dziedzinie data science — przyp. tłum.

Boosting | 245

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


odmienne podejście — takie, w którym jest o wiele więcej dodatków. Podczas gdy bagging można
wykonać niewielkim nakładem pracy, boosting wymaga zdecydowanie większej dokładności w sto-
sowaniu. Jeśli te dwie metody byłyby samochodami, bagging mógłby być postrzegany jako honda
accord (niezawodna i stabilna), a boosting jako porsche (mocne, ale wymagające większej uwagi).
W modelach regresji liniowej rezydua bada się zazwyczaj w celu sprawdzenia możliwości poprawy
dopasowania (patrz punkt „Wykresy częściowych rezyduów i nieliniowość” w rozdziale 4.). Boosting
rozszerza tę koncepcję i dopasowuje serię modeli tak, że każdy kolejny model stara się zmniejszyć
błąd poprzedniego modelu. Powszechnie stosuje się kilka wariantów tego algorytmu: AdaBoost,
wzmacnianie gradientowe (ang. gradient boosting) i stochastyczne wzmacnianie gradientowe
(ang. stochastic gradient boosting). Ten ostatni jest najbardziej ogólny i najszerzej stosowany. Przy
odpowiednim doborze parametrów algorytm faktycznie może naśladować las losowy.

Kluczowe pojęcia dotyczące ewaluacji modeli klasyfikacji


Agregacja
Formowanie predykcji na podstawie zestawu modeli.
Synonim
uśrednianie modeli

Boosting
Ogólna technika dopasowania sekwencji modeli poprzez dodawanie większych wag rekordom
z większymi resztami przy każdym skutecznym dopasowaniu.

AdaBoost
Wczesna wersja boostingu bazującego na zmianie wag danych na podstawie reszt.

Wzmacnianie gradientowe
Bardziej ogólna forma boostingu, która pracuje na minimalizacji funkcji kosztów.

Stochastyczne wzmacnianie gradientowe


Najbardziej ogólny algorytm boostingu, który wymaga próbkowania rekordów i kolumn
w każdym powtórzeniu.

Regularyzacja
Technika unikania nadmiernego dopasowania poprzez dodanie do funkcji kosztów kary za
liczbę parametrów w modelu.

Hiperparametry
Parametry, które muszą być doprecyzowane przed rozpoczęciem dopasowywania algorytmu.

246 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Algorytm wzmacniania
Istnieje wiele różnych algorytmów boostingu, ale 2w każdym z nich idea jest w zasadzie taka sama.
Najprościej można to wyjaśnić na przykładzie AdaBoost, który stosuje się w następujący sposób:
1. Zainicjalizuj M, maksymalną liczbę modeli do dopasowania, i ustaw licznik iteracji m = 1.
Zainicjalizuj wagi obserwacji wi = 1/N dla i = 1, 2, …, N. Zainicjalizuj model zagregowany
Fƹ 0 = 0.
2. Za pomocą wag obserwacji w1, w2, … wN naucz model fƹm minimalizujący błąd ważony em,
zdefiniowany jako suma wag dla błędnie zaklasyfikowanych obserwacji.
( )
3. Dodaj model do agregacji: Fƹ m = Fƹ m–1 + αm fƹm, gdzie 𝛼 =
4. Zaktualizuj wagi w1, w2, … wN tak, by wzrosły dla błędnie zaklasyfikowanych przypadków.
Poziom wzrostu zleży od αm, większe wartości αm powodują przypisanie większych wag.
5. Podnieś licznik modelu m = m+1. Jeśli m ≤ M, przejdź do kroku 2.
Wzmocnione oszacowanie jest dane wzorem:

𝐹 = 𝛼 𝑓 + 𝛼 𝑓 +. . . +𝛼 𝑓

Poprzez wzrost wag dla błędnie zaklasyfikowanych obserwacji algorytm wymusza uczenie modelu
skupione na danych, dla których wykazuje słabą jakość. Czynnik αm zapewnia, że model z mniej-
szym błędem będzie miał większą wagę.
Wzmacnianie gradientowe jest podobne do AdaBoost, ale traktuje problem jako optymalizację
funkcji kosztów. Zamiast poprawiać wagi, wzmacnianie gradientowe dopasowuje model na pod-
stawie pseudorezyduów (ang. pseudo-residual), co skutkuje ukierunkowaniem uczenia na większe
reszty. Podobnie jak w lasach losowych, stochastyczne wzmacnianie gradientowe dodaje losowość
do algorytmu poprzez próbkowanie na każdym etapie obserwacji i zmiennych objaśniających.

XGBoost
Najczęściej wykorzystywane oprogramowanie licencjonowane na zasadzie public domain dla me-
tod boostingu to XGBoost, implementacja stochastycznego wzmacniania gradientowego, której
twórcami byli Tianqi Chen i Carlos Guestrin z Uniwersytetu Waszyngtona. Wydajna obliczeniowo
implementacja z wieloma opcjami jest dostępna jako pakiet dla najbardziej rozwiniętego języka dla
data science, jakim jest R. W języku tym XGBoost jest dostępny jako pakiet xgboost (https://xgbo-
ost.readthedocs.io/en/latest/) i pod taką samą nazwą jest dostępny w Pythonie.
Funkcja xgboost zawiera wiele parametrów, które mogą i powinny być wyregulowane (patrz punkt
„Hiperparametry i kroswalidacja” w dalszej części tego rozdziału). Dwa bardzo ważne parametry
to subsample, regulujący frakcję obserwacji, które powinny być próbkowane w każdej iteracji, oraz
eta, współczynnik redukcji stosowany do αm w algorytmie wzmacniania (patrz punkt „Algorytm
wzmacniania” we wcześniejszej części tego rozdziału). Użycie subsample powoduje upodobnienie

Boosting | 247

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


boostingu do lasów losowych, z tą różnicą, że boosting próbkuje bez zwracania. Współczynnik re-
dukcji eta jest przydatny przy zapobieganiu nadmiernemu dopasowaniu poprzez redukcję zmiany
dla wag (mniejsza zmiana wagi oznacza mniejsze prawdopodobieństwo nadmiernego dopasowania
algorytmu do zbioru uczącego). Następujący fragment stosuje xgboost w R do danych dotyczących
pożyczek jedynie dla dwóch zmiennych objaśniających:
predictors <- data.matrix(loan3000[, c('borrower_score', 'payment_inc_ratio')])
label <- as.numeric(loan3000[,'outcome']) - 1
xgb <- xgboost(data=predictors, label=label, objective="binary:logistic",
params=list(subsample=0.63, eta=0.1), nrounds=100)
[1] train-error:0.358333
[2] train-error:0.346333
[3] train-error:0.347333
...
[99] train-error:0.239333
[100] train-error:0.241000

Zwróć uwagę na to, że xgboost nie wspiera składni wzorów, więc predyktory muszą być przekon-
wertowane do data.matrix, a odpowiedź do zmiennej 0/1. Argument objective wskazuje xgboost,
z jakim typem problemu ma do czynienia; bazując na nim, xgboost wybiera metrykę optymalizacji.
Pakiet xgboost w Pythonie zawiera dwa różne interfejsy: scikit-learn API i bardziej funkcjonalny
interfejs podobny do używanego w R. W celu zachowania spójności z pozostałymi metodami
scikit-learn nazwy niektórych parametrów zostały zmienione. Na przykład parametr eta został
przemianowany na learning_rate; użycie nazwy eta nie spowoduje błędu, ale też nie uzyskamy za
jej pomocą zamierzonego skutku:
predictors = ['borrower_score', 'payment_inc_ratio']
outcome = 'outcome'

X = loan3000[predictors]
y = loan3000[outcome]

xgb = XGBClassifier(objective='binary:logistic', subsample=0.63)


xgb.fit(X, y)
--
XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,
colsample_bynode=1, colsample_bytree=1, gamma=0, learning_rate=0.1,
max_delta_step=0, max_depth=3, min_child_weight=1, missing=None,
n_estimators=100, n_jobs=1, nthread=None, objective='binary:logistic',
random_state=0, reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,
silent=None, subsample=0.63, verbosity=1)

Prognozowane wartości można otrzymać w R za pomocą funkcji predict, a ponieważ mamy jedy-
nie dwie zmienne objaśniające, możemy wykreślić otrzymane wyniki względem predyktorów:
pred <- predict(xgb, newdata=predictors)
xgb_df <- cbind(loan3000, pred_default = pred > 0.5, prob_default = pred)
ggplot(data=xgb_df, aes(x=borrower_score, y=payment_inc_ratio,
color=pred_default, shape=pred_default, size=pred_default)) +
geom_point(alpha=.8) +
scale_color_manual(values = c('FALSE'='#b8e186', 'TRUE'='#d95f02')) +
scale_shape_manual(values = c('FALSE'=0, 'TRUE'=1)) +
scale_size_manual(values = c('FALSE'=0.5, 'TRUE'=2))

248 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Ten sam wykres możemy stworzyć w Pythonie za pomocą poniższego kodu:
fig, ax = plt.subplots(figsize=(6, 4))

xgb_df.loc[xgb_df.prediction=='paid off'].plot(
x='borrower_score', y='payment_inc_ratio', style='.',
markerfacecolor='none', markeredgecolor='C1', ax=ax)
xgb_df.loc[xgb_df.prediction=='default'].plot(
x='borrower_score', y='payment_inc_ratio', style='o',
markerfacecolor='none', markeredgecolor='C0', ax=ax)
ax.legend(['paid off', 'default']);
ax.set_xlim(0, 1)
ax.set_ylim(0, 25)
ax.set_xlabel('borrower_score')
ax.set_ylabel('payment_inc_ratio')

Wynik działania kodu jest przedstawiony na rysunku 6.9. Jakościowo jest podobny do prognozy
otrzymanej za pomocą lasów losowych (patrz rysunek 6.7). Prognozy są w pewien sposób zakłó-
cone, gdyż niektórzy pożyczkobiorcy z wysokim wskaźnikiem wiarygodności wciąż kończą jako
potencjalni dłużnicy.

Rysunek 6.9. Prognozowane wyniki z XGBoost zastosowanym do danych dotyczących pożyczek

Regularyzacja: unikanie nadmiernego dopasowania


Ślepe stosowanie xgboost może prowadzić do niestabilnych modeli, co skutkuje nadmiernym dopa-
sowaniem (ang. overfitting) do danych uczących. Problem nadmiernego dopasowania jest dwojaki:
• Dokładność modelu na nowych danych, niezawartych w zbiorze uczącym może się zmniejszyć.
• Prognozy modelu są wysoce zmienne, co prowadzi do niestabilnych wyników.

Boosting | 249

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Każda technika modelowania jest potencjalnie podatna na nadmierne dopasowanie. Przykładowo
jeśli w równaniu regresji zawartych jest zbyt wiele zmiennych, model ostatecznie daje zafałszowane
wyniki. Jednakże w przypadku większości technik statystycznych nadmiernego dopasowania można
uniknąć poprzez rozsądny dobór zmiennych objaśniających. Nawet lasy losowe w ogólnym przy-
padku dają rozsądne wyniki bez dostrajania parametrów.
Nie dzieje się tak jednak dla xgboost. Dopasujmy xgboost do danych dotyczących pożyczek dla zbioru
uczącego ze wszystkimi zmiennymi zawartymi w modelu. W R dokonamy tego w następujący sposób:
seed <- 400820
predictors <- data.matrix(loan_data[, -which(names(loan_data) %in%
'outcome')])
label <- as.numeric(loan_data$outcome) - 1
test_idx <- sample(nrow(loan_data), 10000)

xgb_default <- xgboost(data=predictors[-test_idx,], label=label[-test_idx],


objective='binary:logistic', nrounds=250, verbose=0)
pred_default <- predict(xgb_default, predictors[test_idx,])
error_default <- abs(label[test_idx] - pred_default) > 0.5
xgb_default$evaluation_log[250,]
mean(error_default)
-
iter train_error
1: 250 0.133043

[1] 0.3529

W Pythonie używamy funkcji train_test_split do podzielenia zestawu danych na zbiory uczący


i testowy:
predictors = ['loan_amnt', 'term', 'annual_inc', 'dti', 'payment_inc_ratio',
'revol_bal', 'revol_util', 'purpose', 'delinq_2yrs_zero',
'pub_rec_zero', 'open_acc', 'grade', 'emp_length', 'purpose_',
'home_', 'emp_len_', 'borrower_score']
outcome = 'outcome'

X = pd.get_dummies(loan_data[predictors], drop_first=True)
y = pd.Series([1 if o == 'default' else 0 for o in loan_data[outcome]])

train_X, valid_X, train_y, valid_y = train_test_split(X, y, test_size=10000)

xgb_default = XGBClassifier(objective='binary:logistic', n_estimators=250,


max_depth=6, reg_lambda=0, learning_rate=0.3,
subsample=1)
xgb_default.fit(train_X, train_y)

pred_default = xgb_default.predict_proba(valid_X)[:, 1]
error_default = abs(valid_y - pred_default) > 0.5
print('Spóźniony dług (default): ', np.mean(error_default))

Zbiór testowy zawiera 10 000 losowo wybranych rekordów z pełnego zbioru danych, a zbiór uczący
stanowią pozostałe rekordy. Boosting prowadzi do otrzymania wskaźnika błędu dla zbioru uczącego
na poziomie 13,3%. Natomiast dla zbioru testowego wskaźnik błędu jest znacznie wyższy i wynosi
35,3%. Jest to efekt nadmiernego dopasowania: boosting potrafi wytłumaczyć zmienność zbioru
uczącego bardzo dobrze, jednak reguły predykcyjne nie mają zastosowania do nowych danych.

250 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Boosting dostarcza kilku parametrów, które zapobiegają nadmiernemu dopasowaniu, w tym para-
metry eta (lub learning_rate)i subsample (patrz punkt „XGBoost” we wcześniejszej części tego
rozdziału). Kolejnym podejściem jest regularyzacja (ang. regularization), technika modyfikująca
funkcję kształtu, by ukarać (ang. penalize) złożoność modelu. Drzewa decyzyjne są dopasowywane
poprzez minimalizację kryterium kosztu, jakim może być miara zanieczyszczenia węzła Giniego
(patrz punkt „Pomiar homogeniczności lub zanieczyszczenia” we wcześniejszej części tego roz-
działu). Wykorzystując xgboost, można modyfikować funkcję kształtu poprzez dodanie członu
mierzącego złożoność modelu.
Istnieją dwa parametry xgboost służące do regularyzacji modelu: alpha i lambda, które odpowia-
dają, odpowiednio, odległości Manhattan (regularyzacja L1) i kwadratowi odległości euklidesowej
(regularyzacja L2; patrz punkt „Metryki odległości” we wcześniejszej części tego rozdziału). Wzrost
wartości tych parametrów będzie skutkował karą dla bardziej złożonych modeli i redukcją roz-
miaru dopasowywanego drzewa. Popatrz, co się stanie, gdy ustawimy w R lambda na 1000:
xgb_penalty <- xgboost(data=predictors[-test_idx,], label=label[-test_idx],
params=list(eta=.1, subsample=.63, lambda=1000),
objective='binary:logistic', nrounds=250, verbose=0)
pred_penalty <- predict(xgb_penalty, predictors[test_idx,])
error_penalty <- abs(label[test_idx] - pred_penalty) > 0.5
xgb_penalty$evaluation_log[250,]
mean(error_penalty)
-
iter train_error
1: 250 0.30966

[1] 0.3286

W interfejsie scikit-learn parametry te noszą nazwy reg_alpha i reg_lambda:


xgb_penalty = XGBClassifier(objective='binary:logistic', n_estimators=250,
max_depth=6, reg_lambda=1000, learning_rate=0.1,
subsample=0.63)
xgb_penalty.fit(train_X, train_y)
pred_penalty = xgb_penalty.predict_proba(valid_X)[:, 1]
error_penalty = abs(valid_y - pred_penalty) > 0.5
print('Kara: ', np.mean(error_penalty))

Teraz błąd dla danych uczących jest niewiele niższy niż błąd dla danych testowych.
Metoda predict zawiera w R wygodny argument ntreelimit, który wymusza wykorzystanie jedy-
nie pierwszych i drzew do predykcji. Prowadzi to bezpośrednio do porównania wskaźników błę-
dów wewnątrz próby oraz spoza próby dla wielu dołączonych modeli:
error_default <- rep(0, 250)
error_penalty <- rep(0, 250)
for(i in 1:250){
pred_def <- predict(xgb_default, predictors[test_idx,], ntreelimit=i)
error_default[i] <- mean(abs(label[test_idx] - pred_def) >= 0.5)
pred_pen <- predict(xgb_penalty, predictors[test_idx,], ntreelimit=i)
error_penalty[i] <- mean(abs(label[test_idx] - pred_pen) >= 0.5)
}

Boosting | 251

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Możemy w Pythonie wywołać metodę predict_proba z argumentem ntree_limit:
results = []
for i in range(1, 250):
train_default = xgb_default.predict_proba(train_X, ntree_limit=i)[:, 1]
train_penalty = xgb_penalty.predict_proba(train_X, ntree_limit=i)[:, 1]
pred_default = xgb_default.predict_proba(valid_X, ntree_limit=i)[:, 1]
pred_penalty = xgb_penalty.predict_proba(valid_X, ntree_limit=i)[:, 1]
results.append({
'Iteracje': ntree_limit,
'Uczące (domyślny)': np.mean(abs(train_y - train_default) > 0.5),
'Uczące (kara)': np.mean(abs(train_y - train_penalty) > 0.5),
'Testowe (domyślny)': np.mean(abs(valid_y - pred_default) > 0.5),
'Testowe (kara)': np.mean(abs(valid_y - pred_penalty) > 0.5),
})
results = pd.DataFrame(results)
results.head()
Wynik z modelu zwraca błąd dla zbioru uczącego jako element xgb_default$evaluation_log. Poprzez
połączenie tego z błędem spoza próby, możemy narysować zależność błędu od liczby iteracji:
errors <- rbind(xgb_default$evaluation_log,
xgb_penalty$evaluation_log,
ata.frame(iter=1:250, train_error=error_default),
data.frame(iter=1:250, train_error=error_penalty))
errors$type <- rep(c('default train', 'penalty train',
'default test', 'penalty test'), rep(250, 4))
ggplot(errors, aes(x=iter, y=train_error, group=type)) +
geom_line(aes(linetype=type, color=type))
Możemy użyć metody plot z pakietu pandas do stworzenia wykresu liniowego. Oś zwracana na
pierwszym wykresie umożliwia nam nakładanie dodatkowych linii na ten sam wykres. Jest to sche-
mat wykorzystywany przez wiele pakietów graficznych Pythona:
ax = results.plot(x='Iteracje', y='Testowe (domyślny)')
results.plot(x='Iteracje', y='Testowe (kara)', ax=ax)
results.plot(x='Iteracje', y='Uczące (domyślny)', ax=ax)
results.plot(x='Iteracje', y='Uczące (kara)', ax=ax)
Wynik, przedstawiony na rysunku 6.10, pokazuje model domyślny, który poprawia dokładność dla
danych uczących i jednocześnie staje się coraz gorszy dla danych testowych. Nie obserwuje się tego
w przypadku modelu z karą.

Rysunek 6.10. Wskaźnik błędu (Error) dla domyślnego i karanego XGBoost

252 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Grzbiet regresji i lasso
Dodawanie kary za złożoność modelu pomaga uniknąć nadmiernego dopasowania do danych od
lat 70. XX wieku. Regresja najmniejszych kwadratów minimalizuje sumę kwadratów reszt (patrz punkt
„Metoda najmniejszych kwadratów” w rozdziale 4.). Grzbiet regresji (ang. ridge regression) minimali-
zuje sumę kwadratów reszt i dodaje człon kary będący funkcją liczby i rozmiaru współczynników:

(𝑌 − 𝑏 − 𝑏 𝑋 −. . . −𝑏 𝑋 ) + 𝜆(𝑏 +. . . +𝑏 )

Wartość λ determinuje wysokość kary dla współczynnika; wyższe wartości tworzą modele, które
mniej chętnie dopasowują się nadmiernie do danych. Lasso działa podobnie, z tą różnicą, że jako
czynnik kary wykorzystuje metrykę Manhattan zamiast metryki euklidesowej:

(𝑌 − 𝑏 − 𝑏 𝑋 −. . . −𝑏 𝑋 ) + 𝜆(|𝑏 |+. . . +|𝑏 |)

Parametry xgboost, lambda (reg_lambda) i alpha (reg_alpha) działają w podobny sposób.


Stosowanie odległości euklidesowej jest nazywane regularyzacją L2, a odległości Manhattan regulary-
zacją L2. Parametry xgboost, lambda (reg_lambda) i alpha (reg_alpha) działają w podobny sposób.

Hiperparametry i kroswalidacja
xgboost ma zniechęcająco dużą tablicę hiperparametrów; więcej szczegółów na ten temat znaj-
dziesz w ramce „Hiperparametry XGBoost” w dalszej części tego rozdziału. Jak wspomniano w punk-
cie „Regularyzacja: unikanie nadmiernego dopasowania” we wcześniejszej części tego rozdziału,
specyficzny wybór może radykalnie zmienić dopasowanie modelu. Czym powinniśmy się kierować
w wyborach dla tak ogromnej liczby możliwych kombinacji hiperparametrów? Standardowym roz-
wiązaniem tego problemu jest użycie kroswalidacji (patrz punkt „Kroswalidacja” w rozdziale 4.).
Kroswalidacja losowo dzieli dane na K różnych grup. Dla każdej grupy model jest uczony na danych,
które w tej grupie nie są zawarte, a następnie testowany na tej pozostałej grupie danych. Prowadzi
to do miary spoza próby dla dokładności modelu. Najlepszy zestaw hiperparametrów to taki, za pomocą
którego otrzymujemy najniższy ogólny błąd obliczony przez uśrednienie błędów z każdej grupy.
Żeby zilustrować powyższą technikę, zastosujemy ją do doboru parametrów dla xgboost. W tym
przykładzie zbadamy dwa parametry: parametr redukcji eta (learning_rate; patrz punkt „XGBoost”
we wcześniejszej części tego rozdziału) i maksymalną głębokość drzewa max_depth. Parametr max_depth
jest maksymalną liczbą węzłów typu liść od początku drzewa, z domyślną wartością 6. Daje nam to
inną metodę kontroli nadmiernego dopasowania: głębokie drzewa są zazwyczaj bardziej złożone,
przez co mogą nadmiernie dopasowywać się do danych. Na początek określamy grupy i listę para-
metrów. W R dokonujemy tego następująco:
N <- nrow(loan_data)
fold_number <- sample(1:5, N, replace=TRUE)
params <- data.frame(eta = rep(c(.1, .5, .9), 3),
max_depth = rep(c(3, 6, 12), rep(3,3)))

Boosting | 253

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Następnie stosujemy poprzedni algorytm do obliczenia błędu dla każdego modelu i każdej grupy,
wykorzystując pięć grup:
error <- matrix(0, nrow=9, ncol=5)
for(i in 1:nrow(params)){
for(k in 1:5){
fold_idx <- (1:N)[fold_number == k]
xgb <- xgboost(data=predictors[-fold_idx,], label=label[-fold_idx],
params=list(eta=params[i, 'eta'],
max_depth=params[i, 'max_depth']),
objective='binary:logistic', nrounds=100, verbose=0)
pred <- predict(xgb, predictors[fold_idx,])
error[i, k] <- mean(abs(label[fold_idx] - pred) >= 0.5)
}
}

W poniższym kodzie Pythona tworzymy wszystkie możliwe kombinacje hiperparametrów, a na-


stępnie dopasowujemy modele do każdej z tych kombinacji i je oceniamy:
idx = np.random.choice(range(5), size=len(X), replace=True)
error = []
for eta, max_depth in product([0.1, 0.5, 0.9], [3, 6, 9]):
xgb = XGBClassifier(objective='binary:logistic', n_estimators=250,
max_depth=max_depth, learning_rate=eta)
cv_error = []
for k in range(5):
fold_idx = idx == k
train_X = X.loc[~fold_idx]; train_y = y[~fold_idx]
valid_X = X.loc[fold_idx]; valid_y = y[fold_idx]

xgb.fit(train_X, train_y)
pred = xgb.predict_proba(valid_X)[:, 1]
cv_error.append(np.mean(abs(valid_y - pred) > 0.5))
error.append({
'eta': eta,
'max_depth': max_depth,
'avg_error': np.mean(cv_error)
})
print(error[-1])
errors = pd.DataFrame(error)

Używamy funkcji itertools.product z biblioteki standardowej Pythona do stworzenia wszyst-


kich możliwych kombinacji dwóch hiperparametrów.
Ponieważ dopasowujemy w sumie 45 modeli, może to chwilę potrwać. Błędy są zapisywane jako
macierz z modelami w wierszach i grupami w kolumnach. Wykorzystując funkcję rowMeans, mo-
żemy porównać wskaźnik błędu dla różnych zestawów parametrów:
avg_error <- 100 * round(rowMeans(error), 4)
cbind(params, avg_error)
eta max_depth avg_error
1 0.1 3 32.90
2 0.5 3 33.43
3 0.9 3 34.36
4 0.1 6 33.08

254 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


5 0.5 6 35.60
6 0.9 6 37.82
7 0.1 12 34.56
8 0.5 12 36.83
9 0.9 12 38.18

Kroswalidacja sugeruje, że użycie płytszych drzew z mniejszą wartością eta/learnig_rate prowa-


dzi do dokładniejszych wyników. Ponieważ te modele są również bardziej stabilne, najlepsze para-
metry to eta = 0.1 i max_depth = 3 (albo też max_depth = 6).

Hiperparametry dla XGBoost


Hiperparametry dla xgboost są głównie wykorzystywane do bilansowania nadmiernego dopaso-
wania z dokładnością i ze złożonością obliczeniową. Kompletne omówienie parametrów znaj-
dziesz w dokumentacji xgboost (https://xgboost.readthedocs.io/en/latest/).
eta/learnig_rate
Współczynnik redukcji pomiędzy 0 i 1, stosowany na α do wzmacniania. Domyślna wartość
to 0,3, ale dla danych zaszumionych rekomendowane są mniejsze wartości (np. 0,1). W Pythonie
domyślna wartość wynosi 0,1.
nrounds/n_estimators
Liczba rund wzmacniania. Jeśli eta jest ustawione na niskie wartości, ważne jest zwiększenie
liczby rund, ponieważ algorytm uczy się wolniej. Tak długo, jak długo niektóre parametry za-
pobiegają nadmiernemu dopasowaniu, większa liczba rund nic nie popsuje.
max_depth
Maksymalna głębokość drzewa (domyślnie 6). W przeciwieństwie do lasów losowych, które
tworzą bardzo głębokie drzewa, boosting zazwyczaj tworzy płytkie drzewa. Ma to taką zaletę,
że unikamy w modelu fałszywie złożonych interakcji, które mogą wynikać z zaszumienia danych.
W Pythonie wartość domyślna to 3.
subsample i colsample_bytree
Część rekordów dla próby bez zwracania i frakcja predyktorów dla próby używana do dopa-
sowywania drzewa. Te parametry są podobne w lasach losowych i zapobiegają nadmiernemu
dopasowaniu.
lambda/reg_lambda i alpha/reg_alpha
Regularyzacja parametrów, która pomaga kontrolować nadmierne dopasowanie (patrz punkt
„Regularyzacja: unikanie nadmiernego dopasowania” we wcześniejszej części tego rozdziału).
W Pythonie domyślne wartości to reg_lambda=1 i reg_alpha=0. W R obydwa parametry mają
domyślną wartość 0.

Boosting | 255

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Główne zasady
• Boosting jest klasą modeli zagregowanych opartych na dopasowaniu sekwencji modeli z więk-
szymi wagami dla rekordów, które mają duże błędy dla poprawnych rund.
• Stochastyczne wzmacnianie gradientowe jest najbardziej ogólnym typem boostingu i umoż-
liwia uzyskanie najlepszej wydajności. Najpopularniejszą formę stochastycznego wzmacnia-
nia gradientowego wykorzystują drzewa losowe.
• XGBoost jest popularnym i efektywnym obliczeniowo pakietem oprogramowania dla sto-
chastycznego wzmacniania gradientowego; jest dostępny dla wszystkich popularnych języków
programowania w data science.
• Boosting ma skłonności do nadmiernego dopasowywania się do danych, więc by tego uniknąć,
trzeba dostroić hiperparametry.
• Regularyzacja jest jedną z metod unikania nadmiernego dopasowania poprzez włączenie
czynnika kary za liczbę parametrów (np. rozmiar drzewa) w modelu.
• Kroswalidacja jest szczególnie istotna dla boostingu ze względu na dużą liczbę hiperparame-
trów, które muszą być dostrojone.

Podsumowanie
W tym rozdziale zostały opisane dwie metody klasyfikacji i predykcji, które „uczą się” elastycznie
i lokalnie z danych zamiast z początkowego modelu strukturalnego (np. regresji liniowej), co ozna-
cza, że metody te dopasowują się do całego zbioru danych. K-najbliższych sąsiadów jest prostym
procesem, który poszukuje podobnych rekordów i przypisuje większościową klasę (lub wartość
uśrednioną) do prognozowanego rekordu. Testując różne kryteria podziału dla wartości zmien-
nych objaśniających, drzewa decyzyjne iteracyjnie dzielą dane na zbiory i podzbiory, wewnątrz
których wzrasta jednorodność w odniesieniu do klasy. Najbardziej efektywne wartości kryterium
podziału tworzą ścieżkę, jak również „reguły” klasyfikacji i predykcji. Drzewa decyzyjne są niezwy-
kle potężnym i popularnym narzędziem predykcyjnym, zazwyczaj wyprzedzającym inne metody.
Rozwiniętych zostało wiele metod zagregowanych (lasy losowe, boosting, bagging), które zwięk-
szają moc predykcyjną drzew.

256 | Rozdział 6. Statystyczne uczenie maszynowe

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


ROZDZIAŁ 7.
Uczenie nienadzorowane

Termin uczenie nienadzorowane (ang. unsupervised learning) odnosi się do metod statystycznych
znajdujących znaczenie danych bez treningu na danych etykietowanych (danych, w których przy-
padku interesujący wynik jest znany). W rozdziałach od 4. do 6. celem było zbudowanie modelu
(zestawu reguł) do prognozowania zmiennej odpowiedzi z zestawu zmiennych objaśniających. Jest
to uczenie nadzorowane. Z kolei uczenie nienadzorowane również tworzy model na podstawie da-
nych, ale nie rozróżnia się tu zmiennych zależnych i niezależnych.
Uczenie nienadzorowane może służyć do osiągania innych celów. W niektórych przypadkach, gdy
brak etykietowanych danych, może być użyte do stworzenia reguł predykcyjnych. Metody klaste-
ryzacji (ang. clustering methods) mogą być wykorzystane do identyfikacji znaczących grup danych,
np. stosując kliknięcia i dane demograficzne, możemy być w stanie połączyć w grupy różne typy
użytkowników strony internetowej. Następnie ta strona może być personalizowana, z uwzględnie-
niem znalezionych typów.
W innym przypadku celem może być redukcja wymiarów (ang. reduce the dimension) danych do
łatwiej zarządzalnego zestawu zmiennych. Taki zredukowany zestaw może być następnie wykorzy-
stany jako wejście modelu predykcyjnego, np. regresji czy klasyfikacji. Przykładowo możemy dys-
ponować tysiącami czujników do monitorowania procesu przemysłowego. Redukcja danych do
mniejszego zestawu cech umożliwi zbudowanie silnego i łatwego w interpretacji modelu do pro-
gnozy awarii procesu zamiast modelu wykorzystującego potoki danych z tysięcy czujników.
I wreszcie uczenie nienadzorowane może być rozpatrywane jako rozwinięcie analizy badawczej
(patrz rozdział 1.) w sytuacjach, w których masz do czynienia z ogromną liczbą zmiennych i rekor-
dów. Celem jest zrozumienie zestawu danych i relacji pomiędzy poszczególnymi zmiennymi.
Uczenie nienadzorowane umożliwia przeszukanie i analizę tych zmiennych pod kątem odkrycia
związków między nimi.

Uczenie nienadzorowane i predykcja


Uczenie nienadzorowane może odgrywać ważną rolę w predykcji, zarówno w pro-
blemach dotyczących regresji, jak i klasyfikacji. W takim przypadku chcielibyśmy
przewidzieć kategorię w danych bez etykiet. Przykładowo możemy chcieć progno-
zować typ wegetacji na pewnym obszarze, opierając się na danych z monitoringu
satelitarnego. Ponieważ nie dysponujemy wynikami do uczenia modelu, klasteryza-
cja umożliwia zidentyfikowanie podobnych wzorców i skategoryzowanie regionów.

257

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Klasteryzacja jest szczególnie ważnym narzędziem dla „świeżych problemów”. W ta-
kim przypadku, np. gdy rozpoczynamy nową kampanię reklamową czy identyfiku-
jemy nowy typ oszustwa lub spamu, na samym początku możemy nie mieć żadnych
ciąg dalszy wzorców do uczenia modelu. Wraz z upływem czasu, kiedy dane są nieustannie gro-
madzone, można dowiedzieć się więcej i zbudować tradycyjny model predykcyjny.
Klasteryzacja ułatwia początkowy etap procesu uczenia, szybciej identyfikując seg-
menty populacji.
Uczenie nienadzorowane jest również istotne jako element budujący dla technik
regresji i klasyfikacji. Dla problemów związanych z big data, jeśli jakaś mała frakcja
populacji nie jest dobrze reprezentowana w danych, nauczony model może nie
uwzględniać w pełni charakterystyki tej frakcji. Klasteryzacja umożliwia zidentyfi-
kowanie i etykietowanie frakcji w populacji. Na opisanych już danych można dopa-
sowywać różne modele do różnych frakcji. Inną opcją jest reprezentacja frakcji po-
przez typowe dla niej cechy; polega to na wymuszaniu na ogólnym modelu szczególnego
traktowania identyfikacji subpopulacji jako predyktora.

Analiza głównych składowych


Zmienne najczęściej zmieniają się grupami, a niektóre z tych zmian w jednej zmiennej są w zasadzie
duplikacją zmian innej (np. rachunki i napiwki w restauracji). Analiza głównych składowych
(PCA, ang. principal component analysis) jest techniką odkrywania właśnie takich wspólnych zmian
w zmiennych numerycznych1.

Kluczowe pojęcia dotyczące analizy głównych składowych


Główna składowa
Liniowa kombinacja zmiennych predykcyjnych.

Wagi
Wagi zmieniające predyktory w składowe.
Synonim
ładunki

Wykres osypiska
Wykres wariancji dla składowej, przedstawiający względną istotność składowej albo w postaci
wariancji wyjaśnionej, albo współczynnika wariancji wyjaśnionej.

1
Tę i kolejne części tego rozdziału wykorzystano za zgodą Petera Bruce’a, Andrew Bruce’a i Petera Gedecka, © 2020
Datastats LCC.

258 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Ideą PCA jest łączenie wielu numerycznych zmiennych objaśniających w mniejsze zestawy zmien-
nych, które są ważonymi kombinacjami liniowymi oryginalnego zbioru. Mniejsze podzbiory,
główne składowe (ang. principal components), „tłumaczą” większość zmienności pełnego zbioru
zmiennych, redukując wymiarowość danych. Wagi wykorzystywane do tworzenia głównych skła-
dowych wskazują na względny udział oryginalnych zmiennych w nowych składowych głównych.
PCA została zaproponowana po raz pierwszy przez Karla Pearsona (https://vdocuments.mx/
pearson-1901-on-lines-planes-of-closest-fit-to-systems-of-points-in-space.html). W swoim artykule,
prawdopodobnie pierwszym o uczeniu nienadzorowanym, Pearson stwierdził, że dla wielu proble-
mów istnieje zmienność predyktorów, więc rozwinął PCA jako technikę do modelowania tej
zmienności. PCA może być postrzegana jako nienadzorowana wersja liniowej analizy dyskrymi-
nacyjnej (patrz punkt „Analiza dyskryminacyjna” w rozdziale 5.).

Prosty przykład
Dla dwóch zmiennych, X1 i X2, istnieją dwie składowe główne Zi (i = 1 lub 2):

𝑍 𝑤, 𝑋 𝑤, 𝑋

Wagi (wi,1, wi,2) są znane jako ładunki (ang. loadings), co transformuje oryginalne zmienne w główne
składowe. Pierwsza składowa główna, Z1, jest liniową kombinacją, która tłumaczy całkowitą wa-
riancję. Druga składowa główna, Z2, jest ortogonalna wobec pierwszej i tłumaczy pozostałą zmien-
ność (gdyby występowały dodatkowe składowe, każda byłaby ortogonalna wobec pozostałych).

Powszechne jest również obliczanie składowych głównych na podstawie odchylenia


od średniej dla predyktorów zamiast dla samych wartości.

Możemy obliczyć składowe główne w R, wykorzystując funkcję princomp. Poniżej przedstawiono


PCA dla zwrotów z akcji dla spółek Chevron (CVX) i ExxonMobil (XOM):
oil_px <- sp500_px[, c('CVX', 'XOM')]
pca <- princomp(oil_px)
pca$loadings

Loadings:
Comp.1 Comp.2
CVX -0.747 0.665
XOM -0.665 -0.747

Comp.1 Comp.2
SS loadings 1.0 1.0
Proportion Var 0.5 0.5
Cumulative Var 0.5 1.0

W Pythonie możemy wykorzystać implementację sklearn.decomposition.PCA z pakietu scikit-learn:


pcs = PCA(n_components=2)
pcs.fit(oil_px)
loadings = pd.DataFrame(pcs.components_, columns=oil_px.columns)
loadings

Analiza głównych składowych | 259

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Wagi dla CVX i XOM dla pierwszej składowej wynoszą –0,747 i –0,665, a dla drugiej 0,665 i –0,747.
Jak to zinterpretować? Pierwsza składowa główna jest w zasadzie średnią CVX i XOM, odzwierciedla-
jącą korelację pomiędzy dwoma spółkami energetycznymi. Druga składowa główna mierzy, kiedy
ceny akcji CVX i XOM różnią się od siebie.
Pomocne jest narysowanie składowych głównych wraz z danymi. Tutaj tworzymy wizualizację w R:
loadings <- pca$loadings
ggplot(data=oil_px, aes(x=CVX, y=XOM)) +
geom_point(alpha=.3) +
stat_ellipse(type='norm', level=.99) +
geom_abline(intercept = 0, slope = loadings[2,1]/loadings[1,1]) +
geom_abline(intercept = 0, slope = loadings[2,2]/loadings[1,2])

Podobną wizualizację możemy uzyskać w Pythonie:


def abline(slope, intercept, ax):
"""Oblicza współrzędne prostej na podstawie nachylenia i punktu przecięcia z osią x"""
x_vals = np.array(ax.get_xlim())
return (x_vals, intercept + slope * x_vals)

ax = oil_px.plot.scatter(x='XOM', y='CVX', alpha=0.3, figsize=(4, 4))


ax.set_xlim(-3, 3)
ax.set_ylim(-3, 3)
ax.plot(*abline(loadings.loc[0, 'CVX'] / loadings.loc[0, 'XOM'], 0, ax),
'--', color='C1')
ax.plot(*abline(loadings.loc[1, 'CVX'] / loadings.loc[1, 'XOM'], 0, ax),
'--', color='C1')

Wynik jest przedstawiony na rysunku 7.1.

Rysunek 7.1. Główne składowe dla zwrotów akcji spółek Chevron (CVX) i ExxonMobil (XOM)

260 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Przerywane linie przedstawiają kierunki dwóch składowych głównych: pierwsza układa się wzdłuż
długiej osi elipsy, a druga wzdłuż krótkiej osi. Możesz zauważyć, że większość zmienności dla zwro-
tów z akcji jest wyjaśniona przez pierwszą składową. Ma to sens, ponieważ ceny akcji mają tenden-
cję do wzrostu w grupach.

Wagi dla pierwszego komponentu są negatywne, ale zmiana znaku dla wszystkich
wag nie zmieni składowych głównych. Przykładowo używanie wag 0,747 i 0,655 dla
pierwszej składowej głównej jest równoznaczne z używaniem wag negatywnych, tak
jak prosta zdefiniowana w początku 1,1 jest taka sama jak ta zdefiniowana w po-
czątku –1, –1.

Obliczanie głównych składowych


Metodę PCA można wprost rozszerzyć z dwóch zmiennych na dowolną większą ich liczbę. Dla
pierwszej składowej dodaje się po prostu kolejne predyktory w liniowej kombinacji, przypisując
wagi, które optymalizują zbiór wspólnej zmienności wszystkich predyktorów w pierwszej składowej
[formalną nazwą statystyczną jest kowariancja (ang. covariance); patrz punkt „Macierz kowarian-
cji” w rozdziale 5.]. Obliczenie głównych składowych jest klasyczną metodą statystyczną, opartą na
macierzy korelacji danych lub macierzy kowariancji i wykonuje się ją natychmiast, bez potrzeby
iterowania. Jak już zauważono wcześniej, analizy głównych składowych można używać jedynie dla
zmiennych numerycznych, nie kategorycznych. Pełny proces może być opisany następująco:
1. Do określenia pierwszej składowej głównej PCA tworzy liniową kombinację predyktorów,
która maksymalizuje odsetek objaśnienia całkowitej zmienności.
2. Stworzona liniowa kombinacja staje się tym samym pierwszym „nowym” predyktorem Z1.
3. PCA powtarza proces, wykorzystując te same zmienne, ale inne wagi do stworzenia drugiego
nowego predyktora Z2. Wagi są dobierane w taki sposób, żeby Z1 i Z2 nie były skorelowane.
4. Proces powtarza się tak długo, aż stworzonych zostanie tak dużo nowych zmiennych lub skła-
dowych Zi jak oryginalnych zmiennych Xi.
5. Wybierz i zatrzymaj tak wiele składowych, ile potrzebujesz do wyjaśnienia większości zmienności.
6. Wynik jak do tej pory jest zestawem wag dla każdej składowej. Ostatni krok to konwersja ory-
ginalnych danych do nowych wyników składowych głównych przez zastosowanie wag do ory-
ginalnych wartości. Te nowe wyniki mogą następnie być wykorzystane jako zredukowany ze-
staw zmiennych objaśniających.

Interpretacja głównych składowych


Charakter głównych składowych często ujawnia informacje o strukturze danych. Istnieje kilka
standardowych metod wizualizacji, które pomagają wniknąć w główne składowe. Jedną z nich jest
wykres osypiska (ang. screeplot) służący do przedstawiania względnej istotności głównych składo-
wych (nazwa pochodzi od podobieństwa wykresu do osypiska; tutaj oś y jest wartością własną).
Kolejny przykład w R przedstawia kilka czołowych spółek z S&P 500:

Analiza głównych składowych | 261

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


syms <- c( 'AAPL', 'MSFT', 'CSCO', 'INTC', 'CVX', 'XOM',
'SLB', 'COP', 'JPM', 'WFC', 'USB', 'AXP', 'WMT', 'TGT', 'HD', 'COST')
top_sp <- sp500_px[row.names(sp500_px)>='2005-01-01', syms]
sp_pca <- princomp(top_sp)
screeplot(sp_pca)

Informacje służące do wczytania wykresu z poziomu pakietu scikit-learn są dostępne w zmiennej


explained_variance_. Przekształcimy ją w ramkę danych pandas, z której uzyskamy wykres słupkowy:
syms = sorted(['AAPL', 'MSFT', 'CSCO', 'INTC', 'CVX', 'XOM', 'SLB', 'COP',
'JPM', 'WFC', 'USB', 'AXP', 'WMT', 'TGT', 'HD', 'COST'])
top_sp = sp500_px.loc[sp500_px.index >= '2011-01-01', syms]

sp_pca = PCA()
sp_pca.fit(top_sp)

explained_variance = pd.DataFrame(sp_pca.explained_variance_)
ax = explained_variance.head(10).plot.bar(legend=False, figsize=(4, 4))
ax.set_xlabel('Składowa')

Jak pokazano na rysunku 7.2, wariancja pierwszej głównej składowej jest dość duża (jak zawsze),
ale kolejne początkowe główne składowe są również znaczące.

Rysunek 7.2. Wykresy osypiska dla PCA czołowych spółek z S&P 500

Szczególnie odkrywcze może być narysowanie wag dla najważniejszych głównych składowych.
Jedną z metod umożliwiających to w R jest wykorzystanie funkcji gather z pakietu tidyr w po-
łączeniu z ggplot:
library(tidyr)
loadings <- sp_pca$loadings[,1:5]
loadings$Symbol <- row.names(loadings)
loadings <- gather(loadings, 'Component', 'Weight', -Symbol)
ggplot(loadings, aes(x=Symbol, y=Weight)) +
geom_bar(stat='identity') +
facet_grid(Component ~ ., scales='free_y')

262 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Taką samą wizualizację możemy stworzyć w Pythonie w następujący sposób:
loadings = pd.DataFrame(sp_pca.components_[0:5, :], columns=top_sp.columns)
maxPC = 1.01 * np.max(np.max(np.abs(loadings.loc[0:5, :])))

f, axes = plt.subplots(5, 1, figsize=(5, 5), sharex=True)


for i, ax in enumerate(axes):
pc_loadings = loadings.loc[i, :]
colors = ['C0' if l > 0 else 'C1' for l in pc_loadings]
ax.axhline(color='#888888')
pc_loadings.plot.bar(ax=ax, color=colors)
ax.set_ylabel(f'PC{i+1}')
ax.set_ylim(-maxPC, maxPC)

Wagi dla pierwszych pięciu głównych składowych przedstawiono na rysunku 7.3. Wagi dla pierw-
szej składowej mają ten sam znak: jest to typowe dla danych, w których przypadku wszystkie
kolumny mają wspólny czynnik (w tym przykładzie jest to ogólny trend zachowań akcji). Druga
składowa wyłapuje zmiany cen akcji w energetyce w porównaniu do innych. Trzecia składowa po-
równuje firmy Apple i Costco. Czwarta składowa porównuje akcje Schlumbergera (SLB) do pozo-
stałych akcji z branży energetyki. I w końcu piąta składowa jest najbardziej zdominowana przez
spółki finansowe.

Rysunek 7.3. Wagi dla pięciu najważniejszych głównych składowych cen akcji

Analiza głównych składowych | 263

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Jak wiele składowych wybrać?
Jeśli Twoim celem jest redukcja wymiarów danych, musisz zdecydować, jak wiele
głównych składowych wybrać. Najpopularniejszym podejściem jest wykorzystanie
reguły ad hoc i wybranie składowych, które „najbardziej” tłumaczą zmienność.
Możesz zastosować podejście wizualne poprzez sporządzenie wykresu osypiska, jak
np. w przypadku rysunku 7.2. Alternatywnie możesz wybrać takie najwyższe skła-
dowe, że skumulowana wariancja przekroczy pewien próg, np. 80%. Możesz również
prześledzić wagi w celu określenia, czy składowe mają intuicyjną interpretację.
Kroswalidacja oferuje bardziej formalne metody do wyboru znaczących składowych
(patrz punkt „Kroswalidacja” w rozdziale 4.).

Analiza odpowiedniości
Analiza PCA nie nadaje się do danych kategoryzujących; jednak poniekąd podobną techniką jest
analiza odpowiedniości/korespondencji (ang. correspondence analysis). Celem jest rozpoznawa-
nie związków pomiędzy kategoriami lub cechami kategoryzującymi. Podobieństwa pomiędzy ana-
lizą odpowiedniości a analizą głównych składowych dotyczą głównie mechanizmów działania:
algebry macierzowej używanej do skalowania wymiarów. Analiza odpowiedniości jest wykorzysty-
wana głównie w analizie graficznej danych kategoryzujących w przestrzeni małowymiarowej i nie
stosuje się jej tak jak analizy PCA do redukowania wymiarowości jako etapu przygotowań olbrzy-
mich zestawów danych.
Dane wejściowe mogą być tabelą, której rzędy reprezentują jedną zmienną, a kolumny drugą, na-
tomiast poszczególne komórki zawierają zliczenia rekordów. W rezultacie analizy odpowiedniości
otrzymujemy tzw. biplot, czyli wykres punktowy z przeskalowanymi osiami (a także wartościami
procentowymi określającymi wariancję wyjaśnioną w tym wymiarze). Znaczenie jednostek na
osiach nie jest powiązane intuicyjnie z pierwotnymi danymi, a zadaniem głównej wartości na wy-
kresie jest graficzne zaprezentowanie zmiennych powiązanych ze sobą (stopień powiązania ilu-
struje odległość pomiędzy zmiennymi). Na przykład na rysunku 7.4 widzimy wykres powiązań
czynności domowych w kontekście ich realizowanie samodzielnie lub wspólnie (oś pionowa),
a także tego, kto jest głównie odpowiedzialny za daną czynność (żona czy mąż; oś pozioma). Ana-
liza odpowiedniości istnieje już od kilku dekad, podobnie jak duch tego przykładu, zważywszy na
podział obowiązków.
Istnieje wiele pakietów realizujących analizę odpowiedniości w R. Skorzystamy z pakietu ca:
ca_analysis <- ca(housetasks)
plot(ca_analysis)

W Pythonie użyjemy pakietu prince, implementującego analizę odpowiedniości poprzez interfejs


scikit-learn:
ca = prince.CA(n_components=2)
ca = ca.fit(housetasks)

ca.plot_coordinates(housetasks, figsize=(6, 6))

264 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 7.4. Graficzna reprezentacja analizy odpowiedniości na zestawie danych housetasks

Główne zasady
• Główne składowe są liniową kombinacją zmiennych predykcyjnych (tylko dla danych
numerycznych).
• Główne składowe są obliczane w taki sposób, by można było zminimalizować korelację
i redundancję pomiędzy składowymi.
• Zazwyczaj ograniczona liczba składowych tłumaczy większość zmienności ze zmiennej
wynikowej.
• Zawężony zestaw głównych składowych może być wykorzystany zamiast (bardziej licznych)
oryginalnych predyktorów, co ogranicza redundancję.
• Pozornie podobną techniką obsługującą dane kategoryzujące jest analiza odpowiedniości,
ale okazuje się nieprzydatna w kontekście big data.

Analiza głównych składowych | 265

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Dla pogłębienia wiedzy
W celu lepszego zrozumienia wykorzystania kroswalidacji w głównych składowych przejrzyj pu-
blikację R. Bro, K. Kjeldahla, A.K. Smilde’a i H.A.L. Kiersa Cross-Validation of Component Models:
A Critical Look at Current Methods („Analytical and Bioanalytical Chemistry” 2008, 390, nr 5), za-
mieszczoną pod adresem: https://www.researchgate.net/publication/5638191_Cross-validation_of_
component_models_A_critical_look_at_current_methods.

Metoda K-średnich (centroidów)


Klasteryzacja jest techniką dzielenia danych na różne grupy; rekordy w każdej z tych grup są do
siebie podobne. Celem klasteryzacji jest znalezienie istotnych grup danych. Grupy te mogą być
użyte bezpośrednio, analizowane bardziej szczegółowo albo przekazane jako cecha lub wynik do
modelu regresji bądź klasyfikacji predykcyjnej. K-średnich (ang. K-means) była pierwszą metodą
klasteryzacji, jaka powstała; wciąż jest szeroko stosowana, a swoją popularność zawdzięcza względ-
nej prostocie algorytmu i możliwości skalowania na duże zbiory danych.

Kluczowe pojęcia dotyczące algorytmu K-średnich


Klaster
Grupa podobnych rekordów.
Synonim
skupienie

Średnia dla klastra


Wektor średnich ze zmiennych dla rekordów w klastrze.
Synonim
centroida

K
Liczba klastrów.

K-średnich dzieli dane na K klastrów poprzez minimalizację sumy kwadratów odległości każdego
z rekordów od średniej obliczonej dla klastra. Określane to jest mianem sumy kwadratów wewnątrz
klastra (ang. within-cluster sum of square). K-średnich nie zapewnia jednakowych rozmiarów kla-
strów, ale znajduje grupy, które są najlepiej separowalne.

Normalizacja
Zazwyczaj normalizuje (standaryzuje) się zmienne ciągłe poprzez odjęcie średniej
i podzielenie przez odchylenie standardowe. W przeciwnym wypadku zmienne
z większą skalą zdominują proces klasteryzacji [patrz punkt „Standaryzacja (norma-
lizacja, z-wartość)” w rozdziale 6.].

266 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Prosty przykład
Rozpocznijmy od zbioru danych z n rekordami i dwoma zmiennymi, x oraz y. Przypuśćmy, że
chcemy podzielić dane na K = 4 klastry. Oznacza to przypisanie każdego rekordu (xi, yi) do klastra
k. Zakładając przypisanie nk rekordów do klastra k, centroida klastra 𝑥̄ , 𝑦̄ jest średnią punktów
w klastrze:
1
𝑥̄ 𝑥
𝑛

1
𝑦̄ 𝑦
𝑛

Średnia klastra
Dla klasteryzacji rekordów opisanych przez wiele zmiennych (typowy przypadek)
termin średnia klastra nie odnosi się do pojedynczej wartości, ale do wektora śred-
nich z tych zmiennych.

Suma kwadratów wewnątrz klastra jest obliczana za pomocą wzoru:

𝑆𝐾 𝑥 − 𝑥̄ 𝑦 − 𝑦̄
∈ _

K-średnich dobiera grupę dla rekordu w taki sposób, by minimalizować sumę kwadratów we-
wnątrz klastra dla wszystkich czterech klastrów: SK1+SK2+SK3+SK4:

𝑆𝐾

Typowym zastosowaniem analizy skupień jest wyszukiwanie naturalnych, oddzielnych osobnych


skupień w danych. Może także używać jej do rozdzielania danych na określoną liczbę grup, przy
czym proces właściwej analizy skupień ma zagwarantować w tym przypadku utworzenie grup mak-
symalnie zróżnicowanych wobec wszystkich pozostałych.
Załóżmy na przykład, że chcemy podzielić codzienne zwroty cen akcji na cztery grupy. Klasteryza-
cja K-średnich może być użyta do dzielenia danych na optymalne skupienia. Zauważ, że codzienne
zwroty akcji są zapisywane w sposób ustandaryzowany, więc ostatecznie nie musimy ich normali-
zować. W R klasteryzacja K-średnich może być przeprowadzona za pomocą funkcji kmeans. Za po-
mocą następującego kodu można znaleźć cztery klastry bazujące na dwóch zmiennych — codzien-
nym zwrocie z akcji spółek ExxonMobil (XOM) i Chevron (CVX):
df <- sp500_px[row.names(sp500_px)>='2011-01-01', c('XOM', 'CVX')]
km <- kmeans(df, centers=4)

W Pythonie użyjemy funkcji sklearn.cluster.KMeans z pakietu scikit-learn:


df = sp500_px.loc[sp500_px.index >= '2011-01-01', ['XOM', 'CVX']]
kmeans = KMeans(n_clusters=4).fit(df)

Metoda K-średnich (centroidów) | 267

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Przypisanie grupy do każdego rekordu jest zwracane jako element cluster:
df$cluster <- factor(km$cluster)
head(df)
XOM CVX cluster
2011-01-03 0.73680496 0.2406809 2
2011-01-04 0.16866845 -0.5845157 1
2011-01-05 0.02663055 0.4469854 2
2011-01-06 0.24855834 -0.9197513 1
2011-01-07 0.33732892 0.1805111 2
2011-01-10 0.00000000 -0.4641675 1

W pakiecie scikit-learn etykiety skupień znajdziemy wewnątrz pola labels_:


df['cluster'] = kmeans.labels_
df.head()

Pierwszych sześć rekordów jest przypisanych do klastra nr 1 lub 2. Średnie dla klastrów również są
zwracane (R):
> centers <- data.frame(cluster=factor(1:4), km$centers)
> centers
cluster XOM CVX
1 1 -0.3284864 -0.5669135
2 2 0.2410159 0.3342130
3 3 -1.1439800 -1.7502975
4 4 0.9568628 1.3708892

W pakiecie scikit-learn środki skupień są wyznaczone w polu cluster_centers_:


centers = pd.DataFrame(kmeans.cluster_centers_, columns=['XOM', 'CVX'])
centers

Klastry nr 1 i 3 reprezentują „spadki” giełdowe, a klastry nr 2 i 4 „wzrosty”.


Algorytm centroidów wykorzystuje losowe punkty początkowe, dlatego wyniki mogą różnić się
w poszczególnych przebiegach i implementacjach tej metody. Zasadniczo jednak fluktuacje nie po-
winny być zbyt duże.
W tym przykładzie jedynie dla dwóch zmiennych w prosty sposób można zwizualizować klastry
i ich centroidy:
ggplot(data=df, aes(x=XOM, y=CVX, color=cluster, shape=cluster)) +
geom_point(alpha=.3) +
geom_point(data=centers, aes(x=XOM, y=CVX), size=3, stroke=2)

Funkcja scatterplot z pakietu seaborn pozwala z łatwością nadawać kolor (hue) i styl (style)
punktom zgodnie z ich własnościami:
fig, ax = plt.subplots(figsize=(4, 4))
ax = sns.scatterplot(x='XOM', y='CVX', hue='cluster', style='cluster',
ax=ax, data=df)
ax.set_xlim(-3, 3)
ax.set_ylim(-3, 3)
centers.plot.scatter(x='XOM', y='CVX', ax=ax, s=50, color='black')

268 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Przedstawiony na rysunku 7.5 wynik ukazuje podział danych na klastry i ich centroidy. Zwróć
uwagę, że algorytm centroidów będzie przypisywał rekordy do skupień, nawet jeśli skupienia te
nie są idealnie rozdzielone (co może okazać się przydatne, jeżeli musisz podzielić optymalnie
rekordy na grupy).

Rysunek 7.5. Klastry po zastosowaniu algorytmu K-średnich do danych codziennych zwrotów akcji dla spółek
ExxonMobil i Chevron (centroidy są zaznaczone czarnymi symbolami)

Algorytm K-średnich
W ogólnym przypadku K-średnich może być stosowane do zbioru danych z p zmiennymi X1, X2,
…, Xp. Dokładne rozwiązanie dla K-średnich jest bardzo trudne obliczeniowo; algorytm heury-
styczny oferuje wydajną metodę do obliczania optymalnego lokalnie rozwiązania.
Algorytm rozpoczyna się od określonego przez użytkownika K i początkowego zbioru centroidów,
a następnie iterowane są następujące kroki:
1. Przypisanie każdego rekordu do najbliższego centroidu i zmierzenie kwadratu odległości.
2. Obliczenie nowych centroidów na podstawie przypisanych rekordów.
Algorytm zbiega się, gdy przypisanie rekordów się nie zmienia.
Dla pierwszej iteracji należy określić początkowy zestaw centroidów. Zazwyczaj tworzy się go poprzez
losowe przypisanie rekordów do jednego z K klastrów, a następnie znajduje się wartości średnie.
Ponieważ algorytm nie gwarantuje najlepszego możliwego rozwiązania, zaleca się uruchomienie
go kilka razy przy wykorzystaniu różnych wartości początkowych. Kiedy przeprowadzany jest wię-
cej niż jeden ciąg iteracji, wyniki dla metody K-średnich są tymi, które mają najniższą sumę kwa-
dratów wewnątrz klastra.

Metoda K-średnich (centroidów) | 269

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Parametr nstart dla funkcji R kmeans pozwala określić liczbę próbnych startów losowania.
Przykładowo poniższy kod wykonuje klasteryzację K-średnich, żeby znaleźć 5 klastrów, wykonując
10 podejść do obliczenia początkowych centroidów:
syms <- c( 'AAPL', 'MSFT', 'CSCO', 'INTC', 'CVX', 'XOM', 'SLB', 'COP',
'JPM', 'WFC', 'USB', 'AXP', 'WMT', 'TGT', 'HD', 'COST')
df <- sp500_px[row.names(sp500_px) >= '2011-01-01', syms]
km <- kmeans(df, centers=5, nstart=10)

Funkcja automatycznie zwraca najlepsze rozwiązanie spośród 10 próbnych punktów początko-


wych. Możesz wykorzystać argument iter.max do ustawienia maksymalnej liczby iteracji dopusz-
czalnej dla każdego przeliczenia algorytmu.
W Pythonie algorytm domyślnie jest powtarzany dziesięciokrotnie (n_init). Argument max_iter
(wartość domyślna: 300) służy do kontrolowania liczby iteracji:
syms = sorted(['AAPL', 'MSFT', 'CSCO', 'INTC', 'CVX', 'XOM', 'SLB', 'COP',
'JPM', 'WFC', 'USB', 'AXP', 'WMT', 'TGT', 'HD', 'COST'])
top_sp = sp500_px.loc[sp500_px.index >= '2011-01-01', syms]
kmeans = KMeans(n_clusters=5).fit(top_sp)

Interpretacja klastrów
Ważną częścią analizy klastrów jest ich interpretacja. Dwa najważniejsze wyjścia dla funkcji kmeans
to rozmiary klastrów i ich centroidy. Przykładowo dla poprzedniego punktu rozmiary wynikowych
klastrów są zadane komendą R:
km$size
[1] 106 186 285 288 266

W Pythonie możemy skorzystać z klasy collections.Counter stanowiącej część biblioteki standar-


dowej, aby uzyskać te informacje. Z powodu różnic w implementacjach i nieodłączonej losowości
algorytmu wyniki będą odmienne:
from collections import Counter
Counter(kmeans.labels_)

Counter({4: 302, 2: 272, 0: 288, 3: 158, 1: 111})

Rozmiary klastrów są względnie zbalansowane. Niezbalansowane klastry mogą być efektem war-
tości odstających lub grup rekordów bardzo odległych od pozostałych danych — w obu przypad-
kach niezbędne jest dalsze badanie.
Możesz narysować centroidy klastrów, wykorzystując funkcję gather w połączeniu z ggplot:
centers <- as.data.frame(t(centers))
names(centers) <- paste("Skupienie", 1:5)
centers$Symbol <- row.names(centers)
centers <- gather(centers, 'Cluster', 'Mean', -Symbol)
centers$Color = centers$Mean > 0
ggplot(centers, aes(x=Symbol, y=Mean, fill=Color)) +
geom_bar(stat='identity', position='identity', width=.75) +
facet_grid(Cluster ~ ., scales='free_y')

270 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W Pythonie kod użyty do stworzenia wizualizacji przypomina listing wykorzystany w analizie PCA:
centers = pd.DataFrame(kmeans.cluster_centers_, columns=syms)

f, axes = plt.subplots(5, 1, figsize=(5, 5), sharex=True)


for i, ax in enumerate(axes):
center = centers.loc[i, :]
maxPC = 1.01 * np.max(np.max(np.abs(center)))
colors = ['C0' if l > 0 else 'C1' for l in center]
ax.axhline(color='#888888')
center.plot.bar(ax=ax, color=colors)
ax.set_ylabel(f'Skupienie {i + 1}.')
ax.set_ylim(-maxPC, maxPC)

Wykres wynikowy jest przedstawiony na rysunku 7.6 i obrazuje charakter klastrów. Na przykład
klastry nr 4 i 5 odpowiadają kolejno dniom, w których na giełdzie mamy spadki i wzrosty. Klastry
nr 2 i 3 charakteryzują, odpowiednio, dni wzrostów dla akcji konsumenckich i dni spadku dla akcji
z branży energetycznej. I wreszcie klaster nr 1 wyłapuje dni, w których ceny akcji z branży energe-
tycznej rosną, a ceny akcji konsumenckich maleją.

Rysunek 7.6. Średnie dla zmiennych w każdym klastrze („centroidy”)

Metoda K-średnich (centroidów) | 271

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Analiza klastrów a PCA
Wykres centroidów jest podobny w swojej istocie do wykresu wag dla analizy głów-
nych składowych (PCA) (patrz punkt „Interpretacja głównych składowych” we wcze-
śniejszej części tego rozdziału). Podstawową różnicą w porównaniu do PCA jest istot-
ność znaku dla centroidów. PCA identyfikuje główne kierunki zmienności, podczas
gdy analiza klastrów identyfikuje grupy rekordów położone blisko siebie.

Dobór liczby klastrów


Algorytm K-średnich wymaga określenia liczby klastrów K. Czasami liczba klastrów jest określona
przez aplikację. Na przykład spółka zarządzająca sprzedażą może chcieć podzielić klientów na
„osoby”, by skoncentrować i wspierać zapytania sprzedaży. W takim przypadku czynniki odgórne
będą dyktowały, na ile segmentów podzielić klientów — przykładowo dwa mogą nie dostarczyć
użytecznych informacji, z kolei osiem może stanowić zbyt wiele grup do opanowania.
Jeśli liczba klastrów nie jest dyktowana czynnikami odgórnymi, można zastosować podejście sta-
tystyczne. Nie ma jednej standardowej metody do znalezienia „najlepszej” liczby klastrów.
Popularnym podejściem, nazywanym metodą łokcia (ang. elbow method), jest identyfikacja, który
zestaw klastrów „najlepiej” opisuje zmienność danych. Dodawanie kolejnych klastrów powyżej
tego zestawu prowadzi do wzrostu dokładności w objaśnieniu zmienności. Łokieć jest punktem,
w którym opis skumulowanej wariancji ustala się po okresie wzrostu, stąd nazwa metody.
Rysunek 7.7 przedstawia skumulowany odsetek opisu zmienności dla danych domyślnych i liczby
klastrów rosnącej od 2 do 15. Gdzie jest łokieć w tym przypadku? Nie ma oczywistego kandydata,
ponieważ wzrost opisu zmienności jest stopniowy. Jest to typowe dla danych, które nie mają dobrze
zdefiniowanych klastrów. Jest to prawdopodobnie wada metody łokcia, która odkrywa jednocze-
śnie charakter danych.

Rysunek 7.7. Metoda łokcia zastosowana do danych z giełdy

272 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W R funkcja kmeans nie dostarcza pojedynczych komend do zastosowania metody łokcia, ale
można jej bezpośrednio użyć w odniesieniu do wyniku z kmeans przedstawionym poniżej:
pct_var <- data.frame(pct_var = 0,
num_clusters = 2:14)
totalss <- kmeans(df, centers=14, nstart=50, iter.max=100)$totss
for (i in 2:14) {
kmCluster <- kmeans(df, centers=i, nstart=50, iter.max=100)
pct_var[i-1, 'pct_var'] <- kmCluster$betweenss / totalss
}

W przypadku algorytmu KMeans informacje te są przechowywane w polu inertia_. Po przekształ-


ceniu go w ramkę danych pandas możemy stworzyć wykres za pomocą jej metody plot:
inertia = []
for n_clusters in range(2, 14):
kmeans = KMeans(n_clusters=n_clusters, random_state=0).fit(top_sp)
inertia.append(kmeans.inertia_ / n_clusters)

inertias = pd.DataFrame({'n_clusters': range(2, 14), 'inertia': inertia})


ax = inertias.plot(x='n_clusters', y='inertia')
plt.xlabel('Liczba skupień(k)')
plt.ylabel('Średnie kwadraty odległości wewnątrzskupieniowych')
plt.ylim((0, 1.1 * inertias.inertia.max()))
ax.legend().set_visible(False)

Prawdopodobnie najważniejszą metodą do określenia tego, jak wiele klastrów jest potrzebnych, jest
odpowiedź na pytanie: jak prawdopodobne jest, że klastry powtórzą się na nowych danych? Czy
klastry są interpretowalne, czy odnoszą się do ogólnej charakterystyki danych i czy odzwierciedlają
specyficzne instancje? Możesz określić to częściowo, wykorzystując kroswalidację (patrz punkt
„Kroswalidacja” w rozdziale 4.).
W ogólnym przypadku nie istnieje jedna reguła, która niezawodnie doprowadza do uzyskania
optymalnej liczby klastrów.

Istnieje jeszcze kilka innych formalnych metod do określania liczby klastrów, opar-
tych na statystyce lub teorii informacji. Na przykład Robert Tibshirani, Guenther
Walther i Trevor Hastie (https://web.stanford.edu/~hastie/Papers/gap.pdf) do ziden-
tyfikowania łokcia zaproponowali statystykę „przerwy”, opartą na teorii statystyki.
Dla większości zastosowań podejście teoretyczne nie jest najprawdopodobniej przy-
datne lub nawet odpowiednie.

Główne zasady
• Liczba potrzebnych klastrów K jest wybierana przez użytkownika.

• Algorytm rozwija klastry poprzez iteracyjne przypisywanie rekordów do najbliższej centroidy


tak długo, aż klasy poszczególnych rekordów przestaną się zmieniać.
• Praktyczne podejście zazwyczaj dominuje w doborze K; nie ma określonej statystycznie
optymalnej liczby klastrów.

Metoda K-średnich (centroidów) | 273

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Klasteryzacja hierarchiczna
Klasteryzacja hierarchiczna (ang. hierarchical clustering) jest alternatywą dla metody K-średnich,
która prowadzi do innych klastrów. Klasteryzacja hierarchiczna pozwala użytkownikowi wizuali-
zować skutek określania różnej liczby skupień. Jest bardziej wrażliwa w detekcji wartości odstają-
cych lub odmiennych grup rekordów. Klasteryzacja hierarchiczna prowadzi również do intuicyjnej
wizualizacji, umożliwiającej łatwiejszą interpretację klastrów.

Kluczowe pojęcia dotyczące klasteryzacji hierarchicznej


Dendrogram
Wizualna reprezentacja rekordów i hierarchii klastrów, do których one należą.
Odległość
Miara odległości jednego rekordu od innego.
Podobieństwo
Miara odległości jednego klastra od innego.

Elastyczność klasteryzacji hierarchicznej niesie za sobą pewne negatywne konsekwencje, mianowi-


cie nie dostosowuje się ona dobrze do ogromnych zbiorów danych zawierających miliony rekordów.
Nawet dla średniego rozmiaru danych, z jedynie dziesiątkami tysięcy rekordów, klasteryzacja hie-
rarchiczna może wymagać dużych zasobów obliczeniowych. Większość zastosowań klasteryzacji
hierarchicznej jest w zasadzie skupiona na względnie małych zbiorach danych.

Prosty przykład
Klasteryzacja hierarchiczna działa na zbiorach danych z n rekordami oraz p zmiennymi i jest oparta
na dwóch głównych blokach:
• metryce odległości di,j, służącej do mierzenia odległości pomiędzy dwoma rekordami i oraz j;
• mierze podobieństwa DA,B do mierzenia różnic pomiędzy dwoma klastrami, A oraz B, na pod-
stawie odległości di,j pomiędzy członkami klastrów.
Dla zastosowań wykorzystujących dane numeryczne najważniejszy wybór to miara podobieństwa.
Klasteryzacja hierarchiczna rozpoczyna się od opisania każdego rekordu jako osobnego klastra
i iteracyjnego łączenia tych najbardziej podobnych rekordów.
Funkcja R hclust może być wykorzystana do przeprowadzenia klasteryzacji hierarchicznej. Jedną
z ważnych różnic pomiędzy hclust a kmeans jest operacja na sparowanych odległościach di,j zamiast
na danych samych w sobie. Odległości możesz obliczyć, wykorzystując funkcję dist. Poniżej przed-
stawiono przykład zastosowania klasteryzacji hierarchicznej dla danych z giełdy dla zestawu spółek:
syms1 <- c('GOOGL', 'AMZN', 'AAPL', 'MSFT', 'CSCO', 'INTC', 'CVX', 'XOM', 'SLB',
'COP', 'JPM', 'WFC', 'USB', 'AXP', 'WMT', 'TGT', 'HD', 'COST')
# transpozycja macierzy: klastry są tworzone ze spółek, chcemy grupować po wierszach
df <- t(sp500_px[row.names(sp500_px) >= '2011-01-01', syms1])
d <- dist(df)
hcl <- hclust(d)

274 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Algorytm klasteryzacji grupuje po rekordach (wierszach) obiektu data.frame. Ponieważ chcemy tworzyć
klastry dla spółek, należy transponować (t) obiekt i umieścić akcje w wierszach, a daty w kolumnach.
Pakiet scipy zawiera wiele różnych metod hierarchicznej analizy skupień w module scipy.cluster.
´hierarchy. Tutaj skorzystamy z funkcji linkage w połączeniu z metodą complete:
syms1 = ['AAPL', 'AMZN', 'AXP', 'COP', 'COST', 'CSCO', 'CVX', 'GOOGL', 'HD',
'INTC', 'JPM', 'MSFT', 'SLB', 'TGT', 'USB', 'WFC', 'WMT', 'XOM']
df = sp500_px.loc[sp500_px.index >= '2011-01-01', syms1].transpose()

Z = linkage(df, method='complete')

Dendrogram
Klasteryzacja hierarchiczna w naturalny sposób prowadzi do obrazowania wyniku w postaci drzewa
nazywanego dendrogramem (ang. dendrogram). Nazwa pochodzi od greckiego dendro (drzewo)
i gramma (rysować). W R można je łatwo stworzyć za pomocą funkcji plot:
plot(hcl)

Możemy wykorzystać metodę dendrogram do zwizualizowania wyniku funkcji linkage w Pythonie:


fig, ax = plt.subplots(figsize=(5, 5))
dendrogram(Z, labels=df.index, ax=ax, color_threshold=0)
plt.xticks(rotation=90)
ax.set_ylabel('distance')

Wynik przedstawiony jest na rysunku 7.8 (tym razem grupujemy nie dni, a firmy na podstawie
podobieństwa). Liście drzewa odpowiadają rekordom. Długość gałęzi w drzewie wskazuje na po-
ziom podobieństwa pomiędzy odpowiednimi klastrami. Zwrot dla Google i Amazona jest zdecy-
dowanie niepodobny, zarówno wzajemnie, jak i względem zwrotu z pozostałych akcji. Spółki pali-
wowe (SLB, CVX, XOM, COP) tworzą własne skupienie, Apple (AAPL) jest jedynym przedstawicielem
swojego skupienia, a pozostałe firmy są do siebie podobne.

Rysunek 7.8. Dendrogram dla akcji

Klasteryzacja hierarchiczna | 275

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Inaczej niż w metodzie K-średnich nie jest tu konieczne określenie na początku liczby klastrów.
Możemy graficznie identyfikować różne liczby skupień za pomocą linii poziomej przesuwającej się
w górę lub w dół; mamy do czynienia ze skupieniem na przecięciu linii poziomej z liniami pionowymi.
Do określenia liczby klastrów możesz użyć funkcji cutree:
cutree(hcl, k=4)
GOOGL AMZN AAPL MSFT CSCO INTC CVX XOM SLB COP JPM WFC
1 2 3 3 3 3 4 4 4 4 3 3
USB AXP WMT TGT HD COST
3 3 3 3 3 3

W Pythonie osiągamy to samo za pomocą metody fcluster:


memb = fcluster(Z, 4, criterion='maxclust')
memb = pd.Series(memb, index=df.index)
for key, item in memb.groupby(memb):
print(f"{key} : {', '.join(item.index)}")

Optymalna liczba klastrów wynosi 4; możesz zauważyć, że firmy Google i Amazon należą każda
do własnego klastra. Akcje paliwowe należą do osobnego klastra. Pozostałe spółki należą do czwar-
tego klastra.

Algorytm aglomeracyjny
Główny algorytm klasteryzacji hierarchicznej jest algorytmem aglomeracyjnym (ang. agglomera-
tive algorithm), który iteracyjnie łączy podobne klastry. Algorytm aglomeracyjny rozpoczyna z od-
dzielnym klastrem dla każdego rekordu, a następnie buduje coraz większe grupy. Pierwszy krok to
obliczenie dystansów pomiędzy parami rekordów.
Dla każdej pary rekordów (x1, x2, …, xp) i (y1, y2, …, yp) mierzymy odległość pomiędzy dwoma
rekordami dx,y, wykorzystując miarę odległości (patrz punkt „Miary odległości” w rozdziale 6.).
Dla przykładu odległość euklidesowa to:

𝑑(𝑥, 𝑦) = (𝑥 − 𝑦 ) + (𝑥 − 𝑦 ) +. . . +(𝑥 − 𝑦 )

Rozważmy dwa klastry, A i B, każdy z charakterystycznym zbiorem rekordów: A = (a1, a2, …, am)
i B = (b1, b2, …, bm). Możemy zmierzyć podobieństwo pomiędzy klastrami D(A,B) poprzez wykorzy-
stanie odległości pomiędzy członkami A i B.
Miara podobieństwa jest obliczana metodą całkowitego połączenia (ang. complete-linkage method),
co jest maksymalną odległością ze wszystkich par rekordów pomiędzy A i B:

𝐷(𝐴, 𝐵) = 𝑚𝑎𝑥 𝑑 (𝑎 , 𝑏 ) dla wszystkich par i, j.

Powyższy wzór definiuje podobieństwo jako największą różnicę wśród wszystkich par.
Główne kroki algorytmu aglomeracyjnego to:
1. Stworzenie początkowego zestawu klastrów zawierających po jednym rekordzie dla wszystkich
rekordów z danych.
2. Obliczenie podobieństwa D(Ck,Cℓ) pomiędzy wszystkimi parami klastrów k, ℓ.

276 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


3. Połączenie tych dwóch klastrów Ck i Cℓ, dla których miara D(Ck,Cℓ) jest najmniejsza.
4. Jeśli pozostał więcej niż jeden klaster, powrót do kroku 2. W przeciwnym wypadku zakończe-
nie czynności.

Miary podobieństwa
Istnieją cztery popularne miary podobieństwa: całkowite połączenie (ang. complete linkage), po-
jedyncze połączenie (ang. single linkage), uśrednione połączenie (ang. average linkage) i mini-
malna wariancja (ang. minimum variance). Te (i inne) metody są wspierane przez większość pro-
gramów służących do klasteryzacji hierarchicznej, w tym hclust i linkage. Zdefiniowana już
metoda całkowitego połączenia ma tendencję do tworzenia klastrów, w których członkowie są po-
dobni. Z kolei metoda pojedynczego połączenia minimalizuje odległość pomiędzy rekordami
w dwóch klastrach:

𝐷(𝐴, 𝐵) = 𝑚𝑖𝑛 𝑑 (𝑎 , 𝑏 ) dla wszystkich par i, j.

Jest to bardzo „zachłanna” metoda, która tworzy klastry zawierające niewspółmierne elementy.
Metoda uśrednionego połączenia jest średnią ze wszystkich par odległości i reprezentuje kompromis
pomiędzy metodami pojedynczego i pełnego połączenia. Natomiast metoda minimalnej wariancji,
nazywana również metodą Warda (ang. Ward’s method), jest podobna do metody K-średnich, po-
nieważ minimalizuje sumy kwadratów wewnątrz klastrów (patrz podrozdział „Metoda K-średnich”
we wcześniejszej części tego rozdziału).
Rysunek 7.9 przedstawia klasteryzację hierarchiczną wykorzystującą powyższe cztery metody dla
danych z giełdy, spółek ExxonMobil i Chevron. Dla każdej metody stworzono po cztery klastry.

Rysunek 7.9. Porównanie miar podobieństwa zastosowane do danych z giełdy

Klasteryzacja hierarchiczna | 277

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Wyniki są uderzająco różne: metoda pojedynczego łączenia przypisuje niemal wszystkie punkty do
jednego klastra. Z wyjątkiem metody minimalnej wariancji (R: ward.D; Python: ward) wszystkie
inne miary zakończyły proces, zachowując jeden klaster, zawierający jedynie kilka punktów odsta-
jących. Metoda minimalnej wariancji jest najbardziej podobna do metody K-średnich; porównaj
to z rysunkiem 7.5.

Główne zasady
• Hierarchiczna analiza skupień zaczyna się od osobnego klastra dla każdego rekordu.
• Klastry są kolejno łączone z sąsiadami, tak długo, aż wszystkie będą należały do jednego klastra
(algorytm aglomeracyjny).
• Historia aglomeracji jest zachowana i narysowana, a użytkownik (bez określania na początku
liczby klastrów) może zwizualizować ich liczbę i strukturę na poszczególnych etapach.
• Odległości wewnątrz klastra mogą być obliczane na wiele sposobów; wszystkie opierają się
na zbiorze wszystkich odległości wewnętrznych pomiędzy rekordami.

Klasteryzacja oparta na modelu


Metody klasteryzacji, takie jak klasteryzacja hierarchiczna i K-średnich, są oparte na heurystykach
i bazują głównie na znalezionych bezpośrednio w danych grupach, wewnątrz których członkowie
są sobie bliscy (niewykorzystywany jest żaden model probabilistyczny). Przez ostatnie 20 lat po-
święcono znaczące nakłady finansowe na rozwój metod klasteryzacji opartej na modelu (ang.
model-based clustering). Adrian Raftery i inni badacze z Uniwersytetu Waszyngtona mieli wielki
wkład w rozwój tych metod, zarówno jeśli chodzi o teorię, jak i o oprogramowanie. Techniki te są
oparte na teorii statystyki i zapewniają bardziej szczegółowe sposoby określania charakteru i liczby
klastrów. Mogą być wykorzystane np. wtedy, gdy może istnieć grupa rekordów podobnych do innej,
ale niekoniecznie jej bliskich (np. akcje spółek technicznych z wysokim zróżnicowaniem zwrotu), oraz
grupa, która jest zarówno podobna do innej, jak i jej bliska (np. akcje rynku usług z niską zmiennością).

Wielowymiarowy rozkład normalny


Najczęściej wykorzystywana metoda klasteryzacji opartej na modelu bazuje na wielowymiarowym
rozkładzie normalnym (ang. multivariate normal distribution). Wielowymiarowy rozkład nor-
malny jest uogólnieniem rozkładu normalnego na zestaw p zmiennych X1, X2, …, Xp. Rozkład jest
zdefiniowany jako zestaw średnich μ = μ1, μ2 …, μp i macierz kowariancji ∑. Macierz kowariancji
jest miarą wzajemnej korelacji zmiennych (więcej szczegółów na temat kowariancji znajdziesz
w punkcie „Macierz kowariancji” w rozdziale 4.). Macierz kowariancji ∑ zawiera p wariancji σ21,
σ22,… σ2p i kowariancji σi,j dla wszystkich par zmiennych i ≠ j. Ze zmiennymi ustawionymi w wier-
szach i zduplikowanymi w kolumnach macierz wygląda następująco:

𝜎 𝜎, ⋯ 𝜎,
⎡ ⎤
𝜎 𝜎 ⋯ 𝜎, ⎥
Σ = ⎢⎢ ,
⎢ ⋮ ⋮ ⋱ ⋮ ⎥⎥
⎣𝜎 , 𝜎, ⋯ 𝜎 ⎦

278 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Zwróć uwagę, że macierz kowariancji jest symetryczna względem przekątnej biegnącej od lewego
górnego rogu. Ponieważ σi,j = σ,j,i, istnieje jedynie (p×(p–1))/2 elementów. W sumie macierz kowa-
riancji ma (p×(p–1))/2+p parametrów. Rozkład jest określony przez:

(𝑋 , 𝑋 , . . . , 𝑋 ) ∼ 𝑁 (𝜇, Σ)

Jest to symboliczny sposób opisania rozkładu normalnego dla zmiennej, a ogólny rozkład jest w pełni
opisany przez wektor średnich dla zmiennych i macierzy kowariancji.
Rysunek 7.10 przedstawia wykres konturowy prawdopodobieństwa dla wielowymiarowego roz-
kładu normalnego dla zmiennych X i Y (kontur 0.5 zawiera 50% punktów rozkładu).

Rysunek 7.10. Wykres konturowy prawdopodobieństwa dla dwuwymiarowego rozkładu normalnego

Średnie wynoszą μx = 0,5 i μy = –0,5, a macierz kowariancji:

1 1
Σ=
1 2
Ponieważ kowariancja σx,y jest dodatnia, X i Y są pozytywnie skorelowane.

Klasteryzacja oparta na modelu | 279

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Mieszaniny rozkładów normalnych
Kluczową ideą klasteryzacji opartą na modelu jest założenie, że każdy rekord jest przypisany do
jednego z K wielowymiarowych rozkładów normalnych, gdzie K jest liczbą klastrów. Każdy rozkład
ma inną średnią μ i macierz kowariancji ∑. Przykładowo jeśli mamy dwie zmienne X i Y, to każdy
wiersz (Xi, Yi) jest modelowany jako pochodzący z jednego z K wielowymiarowych rozkładów nor-
malnych N(μ1,∑1), N(μ2,∑2), … N(μK,∑K).
R zawiera rozwinięty pakiet do klasteryzacji opartej na modelu, nazywany mclust, stworzony przez
Chrisa Fraleya i Adriana Raftery’ego. Za pomocą tego pakietu możemy zastosować klasteryzację do
danych z giełdy, analizowanych już przy użyciu metody K-średnich i klasteryzacji hierarchicznej:
> library(mclust)
> df <- sp500_px[row.names(sp500_px) >= '2011-01-01', c('XOM', 'CVX')]
> mcl <- Mclust(df)
> summary(mcl)
Mclust VEE (ellipsoidal, equal shape and orientation) model with 2 components:

log.likelihood n df BIC ICL


-2255.134 1131 9 -4573.546 -5075.856

Clustering table:
1 2
963 168

Moduł scikit-learn zawiera klasę sklearn.mixture.GaussianMixture dla analizy skupień ba-


zującej na modelu:
df = sp500_px.loc[sp500_px.index >= '2011-01-01', ['XOM', 'CVX']]
mclust = GaussianMixture(n_components=2).fit(df)
mclust.bic(df)

Jeśli uruchomisz powyższy kod, zauważysz, że obliczenia trwają zdecydowanie dłużej niż przy in-
nych procedurach. Przypisane klastry można znaleźć funkcją predict i zwizualizować w następu-
jący sposób:
cluster <- factor(predict(mcl)$classification)
ggplot(data=df, aes(x=XOM, y=CVX, color=cluster, shape=cluster)) +
geom_point(alpha=.8)

Podobny wykres uzyskamy w Pythonie następująco:


fig, ax = plt.subplots(figsize=(4, 4))
colors = [f'C{c}' for c in mclust.predict(df)]
df.plot.scatter(x='XOM', y='CVX', c=colors, alpha=0.5, ax=ax)
ax.set_xlim(-3, 3)
ax.set_ylim(-3, 3)

Wykres wynikowy został przedstawiony na rysunku 7.11. Zostały stworzone dwa klastry: jeden
w środku danych, a drugi na ich zewnętrznej krawędzi. Wynik jest zdecydowanie inny od tych
otrzymanych za pomocą metody K-średnich (rysunek 7.5) czy klasteryzacji hierarchicznej (rysu-
nek 7.9), które określiły spójne klastry.

280 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 7.11. Dwa klastry otrzymane dla akcji przy użyciu mclust

Można wyciągnąć parametry rozkładów normalnych za pomocą funkcji summary:


> summary(mcl, parameters=TRUE)$mean
[,1] [,2]
XOM 0.05783847 -0.04374944
CVX 0.07363239 -0.21175715
> summary(mcl, parameters=TRUE)$variance
, , 1
XOM CVX
XOM 0.3002049 0.3060989
CVX 0.3060989 0.5496727
, , 2
XOM CVX
XOM 1.046318 1.066860
CVX 1.066860 1.915799

W Pythonie informacje te są zawarte w polach means_ i covariances_:


print('Średnia')
print(mclust.means_)
print('Kowariancje')
print(mclust.covariances_)

Rozkłady mają podobne średnie i korelacje, ale pierwszy rozkład ma zdecydowanie większą wa-
riancję i kowariancję. Wyniki w poszczególnych przebiegach mogą różnić się pomiędzy sobą z po-
wodu losowości algorytmu.
Klastry otrzymane przy użyciu mclust mogą wydawać się zaskakujące, ale w rzeczywistości ilustrują
statystyczny charakter metody. Celem klasteryzacji opartej na modelu jest znalezienie najlep-
szego dopasowania zbioru wielowymiarowych rozkładów normalnych. Dane akcji wydają się mieć
kształt zbliżony do kształtu rozkładu normalnego (patrz wykres konturowy na rysunku 7.10).

Klasteryzacja oparta na modelu | 281

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


W rzeczywistości zwrot z akcji jest bardziej rozkładem z długim ogonem niż rozkładem normalnym.
Żeby sobie z tym poradzić, mclust dopasowuje rozkład do większości danych, a następnie dopaso-
wuje drugi rozkład, tyle że z większą wariancją.

Dobór liczby klastrów


W przeciwieństwie do metody K-średnich i klasteryzacji hierarchicznej mclust automatycznie do-
biera liczbę klastrów w R (w tym przypadku dwa). Liczba klastrów jest wybierana na podstawie naj-
większej wartości Kryterium Informacyjnego Bayesa (BIC, ang. Bayesian Information Criteria).
Wskaźnik BIC jest podobny do wskaźnika (patrz punkt „Dobór modelu i regresja krokowa” w roz-
dziale 4). AIC jest ogólnym narzędziem służącym do znajdowania najlepszego modelu wśród moż-
liwego zestawu modeli. Przykładowo AIC (lub BIC) jest powszechnie stosowany do wyboru modeli
w regresji krokowej. BIC działa poprzez dobór najlepiej dopasowanego modelu, z karą dla liczby
parametrów w modelu. W przypadku klasteryzacji opartej na modelu dodawanie większej liczby
klastrów zawsze skutkuje lepszym dopasowaniem, jednak kosztem dodatkowych parametrów.

W większości przypadków wskaźnik BIC jest zazwyczaj minimalizowany. Autorzy


pakietu mclust postanowili zdefiniować wartość BIC z przeciwnym znakiem, aby
ułatwić interpretowanie wykresów.

Funkcja mclust dopasowuje 14 różnych modeli o rosnącej liczbie składowych i automatycznie wy-
biera optymalny model. Możesz narysować wartość BIC dla każdego zestawu klastrów, wykorzy-
stując funkcję mclust:
plot(mcl, what='BIC', ask=FALSE)

Liczba klastrów — lub liczba różnych wielowymiarowych rozkładów normalnych (komponentów)


— jest pokazana na osi x (patrz rysunek 7.12).

Rysunek 7.12. Wskaźniki BIC dla 14 modeli danych zwrotu notowań dla rosnącej liczby składowych

282 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Z kolei implementacja GaussianMixture nie wypróbowuje różnych kombinacji. Jak widać poniżej,
nie jest trudno w Pythonie sprawdzać wiele kombinacji naraz. Jak zwykle definiowany jest tu wskaź-
nik BIC. Dlatego obliczona wartość BIC będzie dodatnia, a my musimy ją zminimalizować:
results = []
covariance_types = ['full', 'tied', 'diag', 'spherical']
for n_components in range(1, 9):
for covariance_type in covariance_types:
mclust = GaussianMixture(n_components=n_components, warm_start=True,
covariance_type=covariance_type)
mclust.fit(df)
results.append({
'bic': mclust.bic(df),
'n_components': n_components,
'covariance_type': covariance_type,
})

results = pd.DataFrame(results)

colors = ['C0', 'C1', 'C2', 'C3']


styles = ['C0-','C1:','C0-.', 'C1--']

fig, ax = plt.subplots(figsize=(4, 4))


for i, covariance_type in enumerate(covariance_types):
subset = results.loc[results.covariance_type == covariance_type, :]
subset.plot(x='n_components', y='bic', ax=ax, label=covariance_type,
kind='line', style=styles[i])

Dzięki argumentowi warm_start zostaną wykorzystane informacje z poprzedniego dopasowa-


nia. W ten sposób kolejne obliczenia szybkiej uzyskają zbieżność.
Stworzony wykres jest podobny do wykresu dla metody łokcia, wykorzystywanej w identyfikacji
optymalnej liczby klastrów dla metody K-średnich; różnicą jest wyświetlenie wartości BIC zamiast
wartości procentowych (patrz rysunek 7.7). Największą różnicą jest liczba linii — mclust przedsta-
wia aż 14 różnych krzywych! Dzieje się tak, ponieważ mclust dopasowuje 14 różnych modeli do
każdego zestawu klastrów, a ostatecznie wybiera ten najlepszy. Funkcja GaussianMixture imple-
mentuje mniej rozwiązań, dlatego wyświetlane są tylko cztery krzywe.
Dlaczego mclust dopasowuje tak wiele modeli do określenia najlepszego zestawu wielowymiaro-
wych rozkładów normalnych? Dzieje się tak, ponieważ istnieje wiele różnych metod do parame-
tryzacji macierzy kowariancji ∑ podczas dopasowywania modelu. W większości przypadków nie
musisz się przejmować szczegółami tych metod i możesz wybrać model, który sugeruje mclust.
W tym przykładzie, na podstawie BIC, najlepsze dopasowanie dla dwóch komponentów uzyskano
za pomocą trzech różnych modeli (nazwanych VEE, VEV i VVE).

Klasteryzacja oparta na modelu jest bogatym i intensywnie rozwijanym obszarem


badań, a przedstawiony tu opis obejmuje jedynie jego niewielki zakres. Dokumenta-
cja dotycząca mclust liczy w tej chwili 154 strony. Instruowanie o niuansach klaste-
ryzacji opartej na modelu wymaga prawdopodobnie znacznie większego wysiłku niż
większość zadań z zakresu data science.

Klasteryzacja oparta na modelu | 283

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Techniki klasteryzacji opartej na modelu mają jednak pewne ograniczenia. Modele wymagają nie-
jawnego założenia dotyczącego modelu dla danych, a wyniki klasteryzacji w dużej mierze zależą od
tego założenia. Wymagania obliczeniowe są jeszcze większe niż dla klasteryzacji hierarchicznej,
przez co opisywana metoda trudno skaluje się do dużych zbiorów danych. Ostatecznie algorytm
jest bardziej wyszukany i mniej dostępny niż wszystkie inne metody.

Główne zasady
• Zakłada się, że klastry pochodzą z różnych procesów generowania danych dla różnych roz-
kładów prawdopodobieństwa.
• Ze względu na założenie różnej liczby rozkładów (zazwyczaj normalnych) dopasowywane są
różne modele.
• Metoda wybiera model (i powiązaną z nim liczbę klastrów), który dobrze opisuje dane bez
użycia nadmiaru parametrów (tj. nadmiernego dopasowania).

Dla pogłębienia wiedzy


Więcej szczegółów dotyczących klasteryzacji opartej na modelu znajdziesz w dokumentacji mclust
zamieszczonej pod adresem: https://stat.uw.edu/sites/default/files/files/reports/2012/tr597.pdf oraz
GaussianMixture (https://scikit-learn.org/stable/modules/mixture.html).

Skalowanie i zmienne skategoryzowane


Techniki uczenia nienadzorowanego generalnie wymagają, by dane były odpowiednio przeskalo-
wane. Jest to podstawowy wyróżnik w porównaniu do innych technik regresji i klasyfikacji, w których
przypadku skalowanie nie jest istotne (wyjątkiem jest K-najbliższych sąsiadów; patrz podrozdział
„K-najbliższych sąsiadów” w rozdziale 6.).

Kluczowe pojęcia dotyczące skalowania danych


Skalowanie
Ściągnięcie lub rozciągnięcie danych, zazwyczaj konwersja wielu zmiennych do wspólnej skali.

Normalizacja
Jedna z metod skalowania — odjęcie średniej i podzielenie przez odchylenie standardowe.
Synonim
standaryzacja

Odległość Gowera
Algorytm skalowania stosowany do łączonych danych numerycznych i skategoryzowanych,
konwertujący wszystkie zmienne do zakresu od 0 do 1.

284 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Dla danych dotyczących pożyczek zmienne mają różne jednostki. Niektóre zmienne mają względ-
nie niewielkie wartości (np. okres zatrudnienia), podczas gdy inne osiągają bardzo wysokie wartości
(np. wartość pożyczki w dolarach). Jeśli nie przeskalujemy danych, metody klasteryzacji, jak PCA,
czy K-średnich lub inne, zostaną zdominowane przez zmienne o wysokich wartościach, a zmienne
o niskich wartościach zostaną zignorowane.
Dane skategoryzowane powodują kolejny problem w przypadku niektórych procedur klasteryzacji.
W metodzie K-najbliższych sąsiadów nieuporządkowane zmienne skategoryzowane są w ogólnym
przypadku konwertowane do zestawu zmiennych binarnych (0/1) przy wykorzystaniu kodowania
1 z n (patrz punkt „Kodowanie 1 z n” w rozdziale 6.). Nie dość, że zmienne binarne występują
w innej skali niż pozostałe dane, to jeszcze zmienna binarna przyjmuje jedynie dwie wartości,
co może być również problematyczne dla metod typu PCA lub K-średnich.

Skalowanie zmiennych
Zmienne określone w wielu różnych skalach i jednostkach muszą być odpowiednio znormalizo-
wane przed rozpoczęciem klasteryzacji. Przykładowo wykorzystajmy kmeans dla zbioru danych do-
tyczących pożyczek opóźnionych w spłacie bez normalizacji.
defaults <- loan_data[loan_data$outcome=='default',]
df <- defaults[, c('loan_amnt', 'annual_inc', 'revol_bal', 'open_acc',
'dti', 'revol_util')]
km <- kmeans(df, centers=4, nstart=10)
centers <- data.frame(size=km$size, km$centers)
round(centers, digits=2)

size loan_amnt annual_inc revol_bal open_acc dti revol_util


1 52 22570.19 489783.40 85161.35 13.33 6.91 59.65
2 1192 21856.38 165473.54 38935.88 12.61 13.48 63.67
3 13902 10606.48 42500.30 10280.52 9.59 17.71 58.11
4 7525 18282.25 83458.11 19653.82 11.66 16.77 62.27

Poniżej znajdziesz odpowiednik kodu w Pythonie:


defaults = loan_data.loc[loan_data['outcome'] == 'default',]
columns = ['loan_amnt', 'annual_inc', 'revol_bal', 'open_acc',
'dti', 'revol_util']

df = defaults[columns]
kmeans = KMeans(n_clusters=4, random_state=1).fit(df)
counts = Counter(kmeans.labels_)

centers = pd.DataFrame(kmeans.cluster_centers_, columns=columns)


centers['size'] = [counts[i] for i in range(4)]
centers

Zmienne annual_inc i revol_bal zdominowały podział na klastry, przez co mają one bardzo różne
rozmiary. Klaster nr 1 zawiera jedynie 52 członków, o stosunkowo wysokich dochodach i wysokiej
zdolności kredytowej.

Skalowanie i zmienne skategoryzowane | 285

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Popularnym podejściem do skalowania zmiennych jest ich konwersja do z-wartości poprzez odję-
cie średniej i podzielenie przez odchylenie standardowe. Jest to określane mianem standaryzacji
lub normalizacji [więcej informacji o wykorzystaniu z-wartości znajdziesz w punkcie „Standaryzacja
(normalizacja, z-wartość)” w rozdziale 6.]:

𝑥 − 𝑥̄
𝑧=
𝑠
Popatrz, co się dzieje z klastrami, kiedy kmeans jest stosowane do danych znormalizowanych:
df0 <- scale(df)
km0 <- kmeans(df0, centers=4, nstart=10)
centers0 <- scale(km0$centers, center=FALSE,
scale=1 / attr(df0, 'scaled:scale'))
centers0 <- scale(centers0, center=-attr(df0, 'scaled:center'), scale=FALSE)
centers0 <- data.frame(size=km0$size, centers0)
round(centers0, digits=2)

size loan_amnt annual_inc revol_bal open_acc dti revol_util


1 7355 10467.65 51134.87 11523.31 7.48 15.78 77.73
2 5309 10363.43 53523.09 6038.26 8.68 11.32 30.70
3 3713 25894.07 116185.91 32797.67 12.41 16.22 66.14
4 6294 13361.61 55596.65 16375.27 14.25 24.23 59.61

W Pythonie możemy skorzystać z klasy StandardScaler stanowiącej część pakietu scikit-learn.


Metoda inverse_transform umożliwia przekształcanie centroidów w pierwotną skalę:
scaler = preprocessing.StandardScaler()
df0 = scaler.fit_transform(df * 1.0)

kmeans = KMeans(n_clusters=4, random_state=1).fit(df0)


counts = Counter(kmeans.labels_)

centers = pd.DataFrame(scaler.inverse_transform(kmeans.cluster_centers_),
columns=columns)
centers['size'] = [counts[i] for i in range(4)]
centers

Liczności klastrów są bardziej zbalansowane, a same klastry nie są zdominowane przez annual_inc
i revol_bal; odkrywane są znacznie bardziej interesujące struktury w danych. Zwróć uwagę na to, że
w przedstawionym kodzie wartości centroid zostały ponownie przeskalowane do oryginalnych za-
kresów. Jeśli pozostałyby nieprzeskalowane, wartości wynikowe przedstawione byłyby jako z-war-
tości, przez co stałyby się trudniejsze w interpretacji.

Skalowanie jest również istotne dla PCA. Wykorzystanie z-wartości jest równo-
znaczne z wykorzystaniem macierzy korelacji (patrz podrozdział „Korelacja” w roz-
dziale 1.) zamiast macierzy kowariancji w obliczaniu głównych składowych. Opro-
gramowanie obliczające PCA ma zazwyczaj opcję umożliwiającą wykorzystanie
macierzy korelacji (w R funkcja princomp ma argument cor).

286 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Zmienne dominujące
Czasami praktyczne jest przeskalowanie zmiennych, nawet jeśli wszystkie są w tej samej skali, a do-
kładność odzwierciedla względną istotność (np. wahania cen akcji).
Przypuśćmy, że dodajemy spółki Google (GOOGL) i Amazon (AMZN) do analizy z punktu „Interpreta-
cja głównych składowych” z wcześniejszej części tego rozdziału. W R dokonujemy tego następująco:
syms <- c('GOOGL', 'AMZN', 'AAPL', 'MSFT', 'CSCO', 'INTC', 'CVX', 'XOM',
'SLB', 'COP', 'JPM', 'WFC', 'USB', 'AXP', 'WMT', 'TGT', 'HD', 'COST')
top_sp1 <- sp500_px[row.names(sp500_px) >= '2005-01-01', syms]
sp_pca1 <- princomp(top_sp1)
screeplot(sp_pca1)

W Pythonie otrzymujemy wykres osypiska w sposób przedstawiony poniżej:


syms = ['GOOGL', 'AMZN', 'AAPL', 'MSFT', 'CSCO', 'INTC', 'CVX', 'XOM',
'SLB', 'COP', 'JPM', 'WFC', 'USB', 'AXP', 'WMT', 'TGT', 'HD', 'COST']
top_sp1 = sp500_px.loc[sp500_px.index >= '2005-01-01', syms]

sp_pca1 = PCA()
sp_pca1.fit(top_sp1)

explained_variance = pd.DataFrame(sp_pca1.explained_variance_)
ax = explained_variance.head(10).plot.bar(legend=False, figsize=(4, 4))
ax.set_xlabel('Składowa')

Wykres osypiska przedstawia wariancje dla najważniejszych składowych głównych. W tym przy-
padku wykres na rysunku 7.13 ukazuje, że wariancje dla pierwszej i drugiej składowej są znacznie
większe od pozostałych. Wskazuje to najczęściej na to, że jedna lub dwie zmienne dominują nad
pozostałymi, co faktycznie ma miejsce w tym przykładzie:
round(sp_pca1$loadings[,1:2], 3)
Comp.1 Comp.2
GOOGL 0.781 0.609
AMZN 0.593 -0.792
AAPL 0.078 0.004
MSFT 0.029 0.002
CSCO 0.017 -0.001
INTC 0.020 -0.001
CVX 0.068 -0.021
XOM 0.053 -0.005
...

W Pythonie dokonamy tego następująco:


loadings = pd.DataFrame(sp_pca1.components_[0:2, :], columns=top_sp1.columns)
loadings.transpose()

Pierwsze dwie główne składowe są niemal zupełnie zdominowane przez GOOGL i AMZN. Dzieje się tak
ze względu na wahania cen akcji GOOGL i AMZN.
Żeby poradzić sobie z tą sytuacją, możesz dołączyć zmienne z wartościami zaobserwowanymi
i przeskalować je (patrz punkt „Skalowanie zmiennych” we wcześniejszej części tego rozdziału) lub
wyłączyć zmienne dominujące z analizy i zająć się nimi osobno. Nie istnieje jedno „poprawne”
podejście, procedury zawsze zależą od celu zastosowania.

Skalowanie i zmienne skategoryzowane | 287

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 7.13. Wykres osypiska dla PCA najważniejszych akcji z S&P 500, w tym GOOGL i AMZN

Zmienne skategoryzowane i odległość Gowera


W przypadku danych skategoryzowanych musisz przekonwertować je do danych numerycznych,
albo poprzez szufladkowanie (dla zmiennych uporządkowanych), albo poprzez kodowanie ich jako
zbioru zmiennych binarnych (fikcyjnych). Jeśli dane zawierają zarówno zmienne ciągłe, jak i bi-
narne, zazwyczaj będziesz skalował zmienne w taki sposób, by uzyskać podobne zakresy (patrz
punkt „Skalowanie zmiennych” we wcześniejszej części tego rozdziału). Jedną z popularnych metod
jest wykorzystanie odległości Gowera (ang. Gower’s distance).
Główna idea odległości Gowera opiera się na zastosowaniu różnych metryk odległości dla każdej
zmiennej w zależności od jej typu:
• Dla zmiennych numerycznych i uporządkowanych zmiennych skategoryzowanych odległość
obliczana jest jako wartość bezwzględna różnicy pomiędzy rekordami (metryka Manhattan).
• Dla zmiennych skategoryzowanych odległość wynosi 1, jeśli kategorie dla dwóch rekordów są
różne, a 0, jeśli są identyczne.
Odległość Gowera możesz obliczyć w następujący sposób w R:
1. Oblicz odległość di,j dla wszystkich par zmiennych i oraz j dla każdego rekordu.
2. Przeskaluj każdą parę di,j w taki sposób, żeby wartość minimalna wyniosła 0, a maksymalna 1.
3. Dodaj przeskalowane odległości par pomiędzy zmiennymi, wykorzystując średnią prostą lub
ważoną do stworzenia macierzy odległości.
Przyjrzyj się kilku wierszom danych dotyczących pożyczek, ilustrującym problem związany z od-
ległością Gowera:
> x <- loan_data[1:5, c('dti', 'payment_inc_ratio', 'home_', 'purpose_')]
> x
# A tibble: 5 × 4
dti payment_inc_ratio home purpose

288 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


<dbl> <dbl> <fctr> <fctr>
1 1.00 2.39320 RENT car
2 5.55 4.57170 OWN small_business
3 18.08 9.71600 RENT other
4 10.08 12.21520 RENT debt_consolidation
5 7.06 3.90888 RENT other

Funkcja daisy w pakiecie kluster (R) może być wykorzystana do obliczenia odległości Gowera:
library(cluster)
daisy(x, metric='gower')
Dissimilarities :
1 2 3 4
2 0.6220479
3 0.6863877 0.8143398
4 0.6329040 0.7608561 0.4307083
5 0.3772789 0.5389727 0.3091088 0.5056250
Metric : mixed ; Types = I, I, N, N
Number of objects : 5

W trakcie pisania książki odległość Gowera nie była dostępna w żadnych z popularnych pakietów
Pythona, twórcy jednak dążą do tego, aby wskaźnik ten znalazł się w pakiecie scikit-learn. Gdy
tylko taka implementacja stanie się dostępna, zaktualizujemy materiały dodatkowe.
Wszystkie odległości pochodzą z zakresu od 0 do 1. Pary rekordów z największą odległością to 2 i 3:
żaden rekord nie ma takiej samej wartości dla zmiennej home i purpose oraz wszystkie mają zdecy-
dowanie inny poziom dti (ang. debt-to-income) oraz payment_inc_ratio. Rekordy nr 3 i 5 są naj-
mniej odległe, ponieważ mają jednakowe wartości home i purpose.
Możesz przekazać macierz odległości Gowera obliczoną za pomocą funkcji daisy i hclust w celu
hierarchicznej analizy skupień (patrz podrozdział „Klasteryzacja hierarchiczna” we wcześniejszej
części tego rozdziału):
df <- defaults[sample(nrow(defaults), 250),
c('dti', 'payment_inc_ratio', 'home', 'purpose')]
d = daisy(df, metric='gower')
hcl <- hclust(d)
dnd <- as.dendrogram(hcl)
plot(dnd, leaflab='none')

Wynik w postaci dendrogramu został przedstawiony na rysunku 7.14. Pojedyncze rekordy nie są
rozróżnialne na osi x, ale możemy obciąć dendrogram poziomo w punkcie 0,5 i badać rekordy
w jednej z gałęzi drzewa (w lewej — ustawiając cut na poziomie 0,5) za pomocą następującego kodu:
dnd_cut <- cut(dnd, h=0.5)
df[labels(dnd_cut$lower[[1]]),]
dti payment_inc_ratio home_ purpose_
44532 21.22 8.37694 OWN debt_consolidation
39826 22.59 6.22827 OWN debt_consolidation
13282 31.00 9.64200 OWN debt_consolidation
31510 26.21 11.94380 OWN debt_consolidation
6693 26.96 9.45600 OWN debt_consolidation
7356 25.81 9.39257 OWN debt_consolidation
9278 21.00 14.71850 OWN debt_consolidation
13520 29.00 18.86670 OWN debt_consolidation
14668 25.75 17.53440 OWN debt_consolidation
19975 22.70 17.12170 OWN debt_consolidation
23492 22.68 18.50250 OWN debt_consolidation

Skalowanie i zmienne skategoryzowane | 289

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Rysunek 7.14. Dendrogram dla hclust zastosowanego na próbie danych dotyczących pożyczek opóźnionych w
spłacie, zawierających różne typy zmiennych

Badane rozgałęzienie obejmuje wyłącznie właścicieli z celem kredytu debt_consolidation (konsoli-


dacja pożyczki). Nie wszystkie rozgałęzienia można ściśle oddzielić od pozostałych, ale na tym
przykładzie widać, że zmienne kategoryzujące zazwyczaj są pogrupowane razem.
Badana gałąź zawiera w całości wynajmujących, którzy jako powód pożyczki podali „inne” (other).
Generalnie ścisła separacja nie jest prawdziwa dla wszystkich gałęzi drzewa, niemniej jednak ten
przykład pokazuje, że zmienne skategoryzowane mają skłonności do łączenia się w grupy.

Problem z klasteryzacją danych mieszanych


Metody K-średnich i PCA są najbardziej odpowiednie dla zmiennych ciągłych. W przypadku mniej-
szych zbiorów danych lepiej jest wykorzystać klasteryzację hierarchiczną z odległością Gowera.
W zasadzie nie ma powodu, dla którego K-średnich nie może być stosowane dla zmiennych binar-
nych lub skategoryzowanych. Zazwyczaj będziesz używał reprezentacji kodowania 1 z n (patrz
punkt „Kodowanie 1 z n” w rozdziale 6.) do konwersji zmiennych skategoryzowanych do wartości
numerycznych. Jednak w praktyce stosowanie metody K-średnich lub PCA do danych binarnych
może być utrudnione.
Jeśli stosowana jest standaryzowana z-wartość, zmienne binarne zdominują tworzenie klastrów.
Dzieje się tak, ponieważ zmienne 0/1 zawierają jedynie dwie wartości, a metoda K-średnich uzy-
skuje małą wartość sumy kwadratów wewnątrz klastra poprzez przypisanie wszystkich rekordów
z 0 lub 1 do jednej grupy. W celu zobrazowania tej sytuacji zastosujmy w R kmenas do danych do-
tyczących pożyczek zawierających zmienne binarne home i pub_rec_zero:

290 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


df <- model.matrix(~ -1 + dti + payment_inc_ratio + home_ + pub_rec_zero,
data=defaults)
df0 <- scale(df)
km0 <- kmeans(df0, centers=4, nstart=10)
centers0 <- scale(km0$centers, center=FALSE,
scale=1/attr(df0, 'scaled:scale'))
round(scale(centers0, center=-attr(df0, 'scaled:center'), scale=FALSE), 2)
dti payment_inc_ratio home_MORTGAGE home_OWN home_RENT pub_rec_zero
1 17.20 9.27 0.00 1 0.00 0.92
2 16.99 9.11 0.00 0 1.00 1.00
3 16.50 8.06 0.52 0 0.48 0.00
4 17.46 8.42 1.00 0 0.00 1.00

W Pythonie:
columns = ['dti', 'payment_inc_ratio', 'home_', 'pub_rec_zero']
df = pd.get_dummies(defaults[columns])

scaler = preprocessing.StandardScaler()
df0 = scaler.fit_transform(df * 1.0)
kmeans = KMeans(n_clusters=4, random_state=1).fit(df0)
centers = pd.DataFrame(scaler.inverse_transform(kmeans.cluster_centers_),
columns=df.columns)
centers

Główne cztery klastry są kluczowym łącznikiem dla różnic w poziomach zmiennych skategoryzo-
wanych. By uniknąć takiego zachowania, możesz przeskalować zmienne binarne do mniejszego
zakresu niż zakres innych zmiennych. Inną opcją dla bardzo dużych zbiorów jest zastosowanie
klasteryzacji do różnych podzbiorów w zależności od konkretnej wartości dla zmiennej skategory-
zowanej. Przykładowo możesz zastosować oddzielną klasteryzację do tych pożyczek, w których
przypadku aplikujący ma hipotekę, jest właścicielem domu lub go wynajmuje.

Główne zasady
• Zmienne mierzone w różnych skalach muszą być przetransformowane do podobnej skali, by
ich wpływ na algorytm nie był zdeterminowany głównie przez skalę.
• Powszechną metodą skalowania jest normalizacja (standaryzacja) — odjęcie średniej i po-
dzielenie przez odchylenie standardowe.
• Inną metodą jest odległość Gowera, która skaluje zmienne do przedziału od 0 do 1 (jest za-
zwyczaj wykorzystywana w zbiorach zawierających zarówno zmienne skategoryzowane, jak
i numeryczne).

Podsumowanie
Głównymi narzędziami do redukcji wymiarów danych numerycznych są analiza głównych składo-
wych i klasteryzacja metodą K-średnich. Obie wymagają odpowiedniego przeskalowania danych,
by można było uzyskać wiarygodną ich redukcję.

Podsumowanie | 291

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Klasteryzacja na danych wysoko ustrukturyzowanych, kiedy to klastry są dobrze separowalne, bę-
dzie dawała identyczne wyniki bez względu na metodę. Każda metoda ma swoje zalety. K-średnich
jest stosowane do bardzo dużych zbiorów danych i jest łatwe w zrozumieniu. Klasteryzacja hierar-
chiczna może być zastosowana do mieszanych typów danych — numerycznych i skategoryzowa-
nych — a jej wynikiem jest przedstawiany w intuicyjnej postaci (dendrogram). Klasteryzacja oparta
na modelu bazuje na teorii statystyki i stanowi bardziej rygorystyczne podejście, jako przeciwień-
stwo metod heurystycznych. W przypadku bardzo dużych zbiorów danych głównie używana jest
metoda K-średnich.
Dla danych zaszumionych, jak dane dotyczące pożyczek i dane giełdowe (oraz wiele innych da-
nych, z jakimi spotka się specjalista data science), wybór jest bardziej skomplikowany. Każda z me-
tod klasteryzacji K-średnich, czyli hierarchiczna i, szczególnie, oparta na modelu, stworzy odmienne
rozwiązanie. Jak powinien postępować specjalista data science? Niestety nie ma jednej przyjętej
reguły, której stosowanie mogłoby pomóc w dokonaniu wyboru. Ostatecznie użycie konkretnej
metody będzie zależeć od rozmiaru danych i celu analizy.

292 | Rozdział 7. Uczenie nienadzorowane

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


Bibliografia

[Baumer-2017] Baumer B., Kaplan D., Horton N., Modern Data Science with R, Boca Raton, Fla.:
Chapman & Hall/CRC Press, 2017.
[Trellis-Graphics] Becker R.A., Cleveland W.S., Shyu, M., Kaluzny S.P., A Tour of Trellis Graphics,
15 kwietnia 1996, http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.551.1202&rep=
rep1&type=pdf.
[bokeh] Bokeh Development Team, Bokeh: Python library for interactive visualization, 2014,
https://docs.bokeh.org/en/latest/.
[Deng-Wickham-2011] Deng H., Wickham H., Density Estimation in R, wrzesień 2011,
http://vita.had.co.nz/papers/density-estimation.pdf.
[Donoho-2015] Donoho D., 50 Years of Data Science, 18 września 2015, http://courses.csail.mit.
edu/18.337/2015/docs/50YearsDataScience.pdf.
[Duong-2001] Duong T., An Introduction to Kernel Density Estimation, 2001, http://www.mvstat.
net/tduong/research/seminars/seminar-2001-05.pdf.
[Few-2007] Few S., Save the Pies for Dessert, „Visual Business Intelligence Newsletter” 2007, Perceptual
Edge, https://courses.washington.edu/info424/2007/readings/Save%20the%20Pies%20for%20Dessert.pdf.
[Freedman-2007] Freedman D., Pisani R., Purves R. Statistics. 4th ed. New York: W.W. Norton, 2007.
[Galton-1886] Galton F., Regression Towards Mediocrity in Hereditary Stature, „The Journal of the
Anthropological Institute of Great Britain and Ireland”, 15, 1886, s. 246 – 263, https://www.
jstor.org/stable/2841583?seq=1.
[Hintze-Nelson-1998] Hintze J. L., Nelson R. D., Violin Plots: A Box Plot-Density Trace Synergism,
„The American Statistician”, 52, nr 2, maj 1998, s. 181 – 184.
[Hyndman-Fan-1996] Hyndman R.J., Fan Y., Sample quantiles in statistical packages, „American
Statistician”, 50, nr 4, 1996, s. 361 – 365.
[Legendre] Legendre A.-M., Nouvelle méthodes pour la détermination desorbites des cométes,
F. Didot, Paris 1805, https://babel.hathitrust.org/cgi/pt?id=nyp.33433069112559&view=1up&seq=9.
[NIST-Handbook-2012] Measures of Skewness and Kurtosis, w: „NIST/SEMATECH e-Handbook of
Statistical Methods”, 2012, http://www.itl.nist.gov/div898/handbook/eda/section3/eda35b.htm.

293

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


[R-base-2015] R Core Team, R: A Language and Environment for Statistical Computing, R Foun-
dation for Statistical Computing, 2015, http://www.R-project.org/.
[Salsburg-2001] Salsburg D., The Lady Tasting Tea: How Statistics Revolutionized Science in the
Twentieth Century, New York: W.H. Freeman, 2001.
[lattice] Sarkar D., Lattice: Multivariate Data Visualization with R, „Springer”, 2008, http: lmdvr.
r-forge.r-project.org.
[Tukey-1977] Tukey J.W., Exploratory Data Analysis, Reading, Mass.: Addison-Wesley, 1977.
[Tukey-1987] Tukey J.W., The collected works of John W. Tukey, Volume IV, „Philosophy and
Principles of Data Analysis: 1965 – 1986”, red. Lyle V. Jones, Boca Raton, Fla.: Chapman and
Hall/CRC, 1987.
[Tukey-1962] Tukey J.W., The Future of Data Analysis, „The Annals of Mathematical Statistics”,
33, nr 1, 1962, s. 1 – 67, https://projecteuclid.org/euclid.aoms/1177704711.
[seaborn] Waskom M., Seaborn: Statistical Data Visualization, 2015, https://seaborn.pydata.org/.
[ggplot2] Wickham H., ggplot2: Elegant Graphics for Data Analysis, „Springer-Verlag New York”
2009, http://had.co.nz/ggplot2/.
[Zhang-Wang-2007] Zhang Q., Wang W., A Fast Algorithm for Approximate Quantiles in High
Speed Data Streams, „19th International Conference on Scientific and Statistical Database Manage-
ment (SSDBM 2007)”, Piscataway, NJ: IEEE, 2007. Dostępny także pod adresem https://www.
semanticscholar.org/paper/A-Fast-Algorithm-for-Approximate-Quantiles-in-High-Zhang-Wang/
03a0f978de91f70249dc39de75e8958c49df4583.

294 | Bibliografia

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


O autorach
Peter Bruce założył i rozwinął Institute for Statistics Education na stronie Statistics.com, który
w chwili obecnej oferuje ponad 100 kursów statystyki. Przeszło połowa z nich jest przeznaczona
dla specjalistów data science. Podczas rekrutowania czołowych autorów w charakterze instrukto-
rów oraz rozwijania strategii marketingowej w kontaktach z profesjonalistami data science Peter
zdobywał cenne doświadczenie, a także wyrabiał sobie pogląd na rynek docelowy.
Andrew Bruce ma ponad 30 lat doświadczenia w statystyce i data science, zdobytego zarówno na
uczelni, w rządzie, jak i w biznesie. Uzyskał tytuł doktora statystyki na Uniwersytecie Waszyngtona
i jest autorem licznych artykułów w cytowanych w tej książce czasopismach. Rozwinął oparte na
statystyce rozwiązania dla szerokiego zakresu problemów z różnych gałęzi przemysłu, począwszy
od renomowanych firm finansowych, na start-upach internetowych skończywszy. Doskonale ro-
zumie znaczenie praktyki data science.
Peter Gedeck ma ponad trzydziestoletnie doświadczenie w dziedzinach obliczeń naukowych i data
science. Przez 20 lat był chemikiem obliczeniowym w firmie Novartis, obecnie zaś pracuje jako
starszy analityk danych w Collaborative Drug Discovery. Specjalizuje się w rozwijaniu algorytmów
uczenia maszynowego przewidujących własności biologiczne i fizykochemiczne potencjalnych leków.
Jest współautorem książki Data Mining for Business Analytics, uzyskał stopień doktora chemii na
Uniwersytecie Fryderyka Aleksandra w Erlangen i Norymberdze, a także studiował matematykę
na Uniwersytecie Zaocznym w Hadze.

Kolofon
Zwierzę na okładce książki Statystyka praktyczna w data science. 50 kluczowych zagadnień w języ-
kach R i Python to Pachygrapsus crassipes, krab z rzędu dziesięcionogich. Można go zaobserwować
na wybrzeżach Oceanu Spokojnego w Ameryce Północnej i Ameryce Środkowej, Korei oraz Japonii.
Skorupiak ten żyje pod skałami w szczelinach i zatokach. Ponad połowę życia spędza na lądzie,
powraca jednak okresowo do wody, by namoczyć skrzela.
Krab wziął swoją nazwę od zielonych pasów na brązowo-czarnym pancerzu. Ma on czerwone
szczypce i fioletowe odnóża, które również mają pasiasty lub cętkowany wzór. Krab zazwyczaj
osiąga rozmiar od 3 do 5 cm; samice są nieco mniejsze. Oczy tych zwierząt znajdują się na elastycz-
nych słupkach, co umożliwia ich rotację, dzięki czemu dają one krabom pełne pole widzenia pod-
czas przemieszczania się.
Kraby są wszystkożerne; żywią się głównie algami, ale również mięczakami, robakami, grzybami,
padłymi zwierzętami i innymi skorupiakami (w zależności od tego, co jest dostępne). Linieją wiele
razy, nim osiągną dojrzałość; wchodząc do wody, pęcznieją, przez co ich stary pancerz pęka. Spę-
dzają kilka trudnych godzin na uwolnieniu się z niego, a następnie chowają się do czasu, aż nowy
pancerz stwardnieje.
Wiele zwierząt z okładek O’Reilly jest zagrożonych wyginięciem, a każde z nich jest istotne dla
świata. Sprawdź, jak możesz pomóc, na animals.oreilly.com.
Rysunek z okładki stworzyła Karen Montgomery na podstawie czarno-białej ryciny pochodzącej
z Pictorial Museum of Animated Nature.

https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk


https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk
https://biblio.ebookpoint.pl - Pozycja dla Jaroslaw Kowalczyk

You might also like