Professional Documents
Culture Documents
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.
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ę.
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
6 | Spis treści
Spis treści | 7
8 | Spis treści
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
10 | Spis treści
Bibliografia ........................................................................................................................293
Spis treści | 11
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.
13
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 ostrzeżenie.
14 | Przedmowa
Podziękowania | 15
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
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).
Główne zasady
• Dane są zazwyczaj klasyfikowane przez oprogramowanie ze względu na typ.
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.
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
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
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.
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).
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).
Ś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
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¯,
∑ 𝑥
Ś𝑟𝑒𝑑𝑛𝑖𝑎 𝑥̄
𝑛
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𝑝
∑ 𝑤 𝑥
Ś𝑟𝑒𝑑𝑛𝑖𝑎 𝑤𝑎ż𝑜𝑛𝑎 𝑥̄
∑ 𝑤
Miary położenia | 25
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.
Tabela 1.2. Kilka kolumn z data.frame zawierającego liczebność populacji i wskaźnik morderstw
dla poszczególnych stanów
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
Ś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'])
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ą.
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.
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.
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
∑ |𝑥 − 𝑥̄ |
Ś𝑟𝑒𝑑𝑛𝑖𝑒 𝑜𝑑𝑐ℎ𝑦𝑙𝑒𝑛𝑖𝑒 𝑏𝑒𝑧𝑤𝑧𝑔𝑙ę𝑑𝑛𝑒 =
𝑛
∑ (𝑥 − 𝑥̄ )
𝑊𝑎𝑟𝑖𝑎𝑛𝑐𝑗𝑎 = 𝑠 =
𝑛−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.
Ż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).
Miary rozproszenia | 31
𝑗 𝑗 1
100 ⋅ 𝑃 100 ⋅
𝑛 𝑛
Formalnie percentyl jest średnią ważoną:
Tabela 1.3. Kilka kolumn z data.frame zawierającego liczebność populacji i wskaźniki morderstw
dla poszczególnych stanów
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
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.
Miary rozproszenia | 33
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.
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)')
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()
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()
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)
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.
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.
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.
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).
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ę
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].
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:
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.
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.
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
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.
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.
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')
Korelacja | 45
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.
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)
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
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ść.
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
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')
Rysunek 1.9. Wykres konturowy dla zależności wartości podatku od powierzchni domu
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)
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
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')
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')
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.
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.
57
Populacja
Zbiór danych lub jego idea.
N (n)
Wielkość populacji (próby).
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.
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.
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.
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.
Tropienie danych
Intensywne poszukiwanie czegoś interesującego w danych.
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
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.
Rysunek 2.5. Wyniki badań Galtona, które pomogły zidentyfikować zjawisko regresji do średniej
(rysunek z oryginalnej publikacji Galtona)
2
Syndrom drugiego roku u sportowców — przyp. tłum.
Błąd doboru | 65
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.
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).
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)
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}')
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.
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.
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.
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).
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
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
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.
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.
Próby bootstrapowe | 73
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 $.
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
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.
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”.
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 | 77
Rysunek 2.11. Wykres K-K dla próby 100 wartości wylosowanych ze standardowego rozkładu normalnego
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')
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].
Główne zasady
• Większość danych nie pochodzi z rozkładu normalnego.
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.
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
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).
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”.
Rozkład binarny | 83
Sukces
Wynik pozytywny próby niezależnej.
Synonim
„1” (jako przeciwieństwo „0”)
Binarny
Mający dwa wyniki.
Synonimy
tak/nie, 0/1, dwumianowy
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?
Ś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.
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
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.
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
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.
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.
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)
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ę.
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.
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.
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.
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
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.
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
Test A/B | 93
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ń.
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.
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
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.
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.
Testowanie hipotezy | 97
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.
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.).
Test randomizacyjny
Losowanie dodatkowych prób (ang. resamples) z obserwowanego zestawu danych.
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
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()
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).
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
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.
Główne zasady
• W testach permutacyjnych grupy są łączone w jedną i mieszane.
• 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.
Alfa
Próg prawdopodobieństwa dla „niezwykłości”, który musi przewyższać wynik, żeby był
uznany za istotny statystycznie.
Przeanalizujmy zamieszczone w tabeli 3.2 wyniki przedstawionego wcześniej testu stron interne-
towych.
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.
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)
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ść 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.
• Testowanie istotności jest znacznie ważniejsze w formalnym raportowaniu badań niż w data
science (chociaż zanika także w formalnych badaniach).
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.).
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.
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
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).
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.
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).
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.
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.
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).
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.
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
ANOVA | 117
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:
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]
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
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.
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.
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.
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.
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)
Obserwowane − Oczekiwane
𝑅
√Oczekiwane
R mierzą, w jakim stopniu otrzymane wyniki różnią się od wyników oczekiwanych (patrz tabela 3.6).
Χ= 𝑅
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
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)
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
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.
data: clicks
p-value = 0.4824
alternative hypothesis: two.sided
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.
Ś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).
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.
Ręka
Procedura w eksperymencie (np. „nagłówek A w teście internetowym”).
Wygrana
Eksperymentalny analog do wygranej w automacie (np. „klient kliknął link”).
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.
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
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.
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.
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.
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
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
Prosta regresja liniowa próbuje znaleźć najlepszą prostą oddającą PEFR w funkcji zmiennej predyk-
cyjnej Exposure (ekspozycja).
𝑃𝐸𝐹𝑅 = 𝑏 + 𝑏 𝐸𝑥𝑝𝑜𝑠𝑢𝑟𝑒
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
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.
model = LinearRegression()
model.fit(lung[predictors], lung[outcome])
Rysunek 4.2. Współczynnik kierunkowy i wyraz wolny dla regresji dopasowanej do danych z płuc
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.
𝑅𝑆𝑆 = 𝑌 −𝑌 = 𝑌 −𝑏 −𝑏 𝑋
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).
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.
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.
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:
𝑌 =𝑏 +𝑏 𝑋 , + 𝑏 𝑋 , +. . . +𝑏 𝑋 ,
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])
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
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|)
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−
∑ (𝑦 − 𝑦̄ )
𝑏
𝑡 =
𝑆𝐸(𝑏)
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).
X = pd.get_dummies(house[predictors], drop_first=True)
X['NewConstruction'] = [1 if nc else 0 for nc in X['NewConstruction']]
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
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ę:
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.
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
def train_model(variables):
if len(variables) == 0:
return None
model = LinearRegression()
model.fit(X[variables], y)
return model
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).
Python
house['Year'] = [int(date.split('-')[0]) for date in house.DocumentDate]
house['Weight'] = house.Year - 2005
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
house_wt = LinearRegression()
house_wt.fit(house[predictors], house[outcome], sample_weight=house.Weight)
Ekstrapolacja
Rozszerzenie modelu poza zakres danych wykorzystywanych do jego dopasowania.
Główne zasady
• Ekstrapolacja poza przedział danych może prowadzić do błędów.
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.
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()
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.
X = pd.get_dummies(house[predictors], drop_first=True)
house_lm_factor = LinearRegression()
house_lm_factor.fit(X, house[outcome])
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).
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
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.
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).
Wartość Opis
1 Cabin
2 Substandard
5 Fair
10 Very good
12 Luxury
13 Mansion
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ą.
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).
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.
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
X = pd.get_dummies(house[predictors], drop_first=True)
confounding_lm = LinearRegression()
confounding_lm.fit(X, house[outcome])
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.
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
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ę
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.
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).
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
W Pythonie:
house_98105 = house.loc[house['ZipCode'] == 98105, ]
house_outlier = sm.OLS(house_98105[outcome],
house_98105[predictors].assign(const=1))
result_98105 = house_outlier.fit()
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])
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.
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.
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)
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.
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)
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.
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.
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
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.
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 sklejana
Dopasowanie wygładzonej krzywej serią odcinków wielomianów.
Węzły
Wartości, które rozdzielają odcinki funkcji sklejanej.
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
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).
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.
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)
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]
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.
• Możemy zautomatyzować proces doboru węzłów dla funkcji sklejanej za pomocą modeli GAM.
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.
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
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.
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.
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.
𝑃(𝑌 = 𝑖)𝑃 𝑋 , … , 𝑋 |𝑌 = 𝑖
𝑃 𝑌 = 𝑖|𝑋 , 𝑋 , … , 𝑋 =
𝑃(𝑌 = 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
$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
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.
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/).
Funkcja dyskryminacyjna
Funkcja, która zastosowana na zmiennych objaśniających maksymalizuje rozdział klas.
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
𝑠 𝑠,
Σ=
𝑠, 𝑠
𝑆𝐾 ę
𝑆𝐾 ą
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)
X = loan3000[predictors]
y = loan3000[outcome]
loan_lda = LinearDiscriminantAnalysis()
loan_lda.fit(X, y)
pd.DataFrame(loan_lda.scalings_, index=X.columns)
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
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
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)
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ę.
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.
𝑝 = 𝛽 + 𝛽 𝑥 + 𝛽 𝑥 +. . . +𝛽 𝑥
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+𝑒
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
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
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:
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).
𝑆𝑧𝑎𝑛𝑠𝑒(𝑌 = 1|𝑋 = 1)
𝐼𝑙𝑜𝑟𝑎𝑧_𝑠𝑧𝑎𝑛𝑠 =
𝑆𝑧𝑎𝑛𝑠𝑒(𝑌 = 1|𝑋 = 0)
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!
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
𝑂𝑑𝑐ℎ𝑦ł𝑘𝑎 = −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ń.
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ść:
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
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).
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.
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
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.
∑ 𝑃𝑟𝑎𝑤𝑑𝑧𝑖𝑤𝑖𝑒𝐷𝑜𝑑𝑎𝑡𝑛𝑖
𝑃𝑟𝑒𝑐𝑦𝑧𝑗𝑎 =
∑ 𝑃𝑟𝑎𝑤𝑑𝑧𝑖𝑤𝑖𝑒𝐷𝑜𝑑𝑎𝑡𝑛𝑖 + ∑ 𝐹𝑎ł𝑠𝑧𝑦𝑤𝑖𝑒𝐷𝑜𝑑𝑎𝑡𝑛𝑖
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:
∑ 𝑃𝑟𝑎𝑤𝑑𝑧𝑖𝑤𝑖𝑒𝑈𝑗𝑒𝑚𝑛𝑦
𝑆𝑤𝑜𝑖𝑠𝑡𝑜ść =
∑ 𝑃𝑟𝑎𝑤𝑑𝑧𝑖𝑤𝑖𝑒𝑈𝑗𝑒𝑚𝑛𝑦 + ∑ 𝐹𝑎ł𝑠𝑧𝑦𝑤𝑖𝑒𝐷𝑜𝑑𝑎𝑡𝑛𝑖
precision_recall_fscore_support(y, logit_reg.predict(X),
labels=['default', 'paid off'])
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.
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%.
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.
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
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.
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.
Oversample
Użycie większej liczby rekordów z klasy rzadkiej do modelu klasyfikacji, jeśli to konieczne —
z wykorzystaniem bootstrapu.
Synonim
nadpróbkowanie
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
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]
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.
6
Z powodu różnic w implementacji wyniki w Pythonie mogą być nieco inne: o ok. 1% lub 1/18 od oczekiwanej wartości.
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]
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.
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.).
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
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.
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.
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
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.
1
Tę i kolejne części tego rozdziału wykorzystano za zgodą Petera Bruce’a, Andrew Bruce’a i Petera Gedecka, © 2020
Datastats LCC.
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
2
W tym przykładzie bierzemy pierwszy rząd z zestawu danych loan200 jako newloan i wykluczamy go z zestawu
danych w celu uczenia.
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)
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.
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
𝑥 − 𝑥̄
𝑧
𝑠
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”.
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"),]
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"),]
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)
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_std, y)
nbrs = knn.kneighbors(newloan_std)
X.iloc[nbrs[1][0], :]
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.
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
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).
3
Termin CART jest zarejestrowanym znakiem towarowym firmy Salford Systems i odnosi się do jej specyficznej
implementacji modelu drzew losowych.
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)
X = loan3000[predictors]
y = loan3000[outcome]
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”.
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ą.
Rysunek 6.4. Pierwsze trzy reguły dla prostego drzewa decyzyjnego dopasowanego do danych dotyczących pożyczek
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.
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.
𝐼 𝐴 𝑝 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.).
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.
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.
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.
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
X = loan3000[predictors]
y = loan3000[outcome]
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).
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))
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')
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ą
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
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]
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')
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:
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
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.
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.
𝐹 = 𝛼 𝑓 + 𝛼 𝑓 +. . . +𝛼 𝑓
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
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]
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))
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.
Boosting | 249
[1] 0.3529
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]])
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.
[1] 0.3286
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
(𝑌 − 𝑏 − 𝑏 𝑋 −. . . −𝑏 𝑋 ) + 𝜆(𝑏 +. . . +𝑏 )
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:
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
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)
Boosting | 255
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.
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.
257
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.
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).
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
Rysunek 7.1. Główne składowe dla zwrotów akcji spółek Chevron (CVX) i ExxonMobil (XOM)
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.
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')
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 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)
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.
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.].
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.
𝑆𝐾 𝑥 − 𝑥̄ 𝑦 − 𝑦̄
∈ _
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:
𝑆𝐾
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
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')
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.
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
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')
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ą.
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.
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)
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)
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.
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:
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, ℓ.
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:
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.
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.
𝜎 𝜎, ⋯ 𝜎,
⎡ ⎤
𝜎 𝜎 ⋯ 𝜎, ⎥
Σ = ⎢⎢ ,
⎢ ⋮ ⋮ ⋱ ⋮ ⎥⎥
⎣𝜎 , 𝜎, ⋯ 𝜎 ⎦
(𝑋 , 𝑋 , . . . , 𝑋 ) ∼ 𝑁 (𝜇, Σ)
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).
1 1
Σ=
1 2
Ponieważ kowariancja σx,y jest dodatnia, X i Y są pozytywnie skorelowane.
Clustering table:
1 2
963 168
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)
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.
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).
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)
Rysunek 7.12. Wskaźniki BIC dla 14 modeli danych zwrotu notowań dla rosnącej liczby składowych
results = pd.DataFrame(results)
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).
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.
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)
df = defaults[columns]
kmeans = KMeans(n_clusters=4, random_state=1).fit(df)
counts = Counter(kmeans.labels_)
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.
𝑥 − 𝑥̄
𝑧=
𝑠
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)
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).
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
...
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.
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
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
[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
294 | Bibliografia
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.