Zapisz jako PDF

Transkrypt

Zapisz jako PDF
Spis treści
1 Testowanie hipotez dotyczących jednej lub dwóch populacji
1.1 Wstęp
1.1.1 Hipoteza zerowa i alternatywna
1.1.2 Wybór statystyki
1.2 Poziom istotności i wartość
2 Formułowanie hipotez
2.1 Przykład: mutacje muszek owocowych
3 Testowanie hipotez na temat średniej
4 Testowanie hipotez na temat wariancji
4.1 Przykład
5 Błąd drugiego rodzaju. Moc testu.
5.1 Przykład
6 Porównanie dwóch populacji
6.1 Przykład: promocja
7 Badanie założenia o normalności rozkładu
7.1 Histfit: histogram z naniesionym fitem rozkładu normalnego
7.2 Normplot
7.3 Test Shapiro-Wilka
7.4 Test Kołmogorowa-Smirnowa
7.4.1 Test dla innych postaci rozkładu
7.5 Przykład
7.6 Przykład: transformacja Boxa-Coxa
8 Przykład (zastosowanie różnych testów do tych samych danych): karma
8.1 Badamy rozkłady danych:
8.2 Test parametryczny
8.3 Test nieparametryczny
8.4 Testy bootstrapowe
8.5 Wnioskowanie w oparciu o przedziały ufności
8.5.1 Wersja parametryczna
8.5.2 Wersja nieparametryczna
9 Zadanie: Przeżywalność myszy
10 Zadanie: Linie lotnicze
11 Zadanie: Agencja nieruchomości
12 Zadanie: Zabiegi bio-inżynieryjne
13 Zadanie: Porównanie lekarstwa i placebo
14 Przykład: Średnie grup sparowanych: Lek przeciwdepresyjny
14.1 Rozwiązanie
14.1.1 Wersja bootstrapowa
14.1.2 Wersja permutacyjna
14.1.3 Wersja parametryczna
14.1.4 Wersja nieparametryczna
14.1.5 Podsumowanie
15 Zadania
15.1 Zanieczyszczenie środowiska
15.2 Wzrost mocy turbin
15.3 Sonda
15.4 Wybory prezydenckie
15.5 Czy stosunek do marihuany się zmienił?
15.6 Zawały serca i cholesterol
15.7 Czy gęstości planet się różnią?
15.8 Elektrownia jądrowa
Testowanie hipotez dotyczących jednej lub dwóch populacji
Wstęp
Schemat weryfikowania hipotez omówiony jest w wykładzie Weryfikacja hipotez statystycznych. Tu
przypomnimy tylko krótko podstawowe pojęcia i decyzje, które trzeba pojąć w procedurze
weryfikacji.
Hipoteza zerowa i alternatywna
Podstawą sukcesu w statystycznym testowaniu hipotez jest prawidłowe ich sformułowanie. Hipotezy
muszą być rozłączne. Najczęściej jako hipotezę zerową przyjmujemy zdanie, które chcemy odrzucić,
gdyż błąd takiej decyzji można kontrolować. Logika testowania jest następująca: tworzymy funkcję
od zmiennych losowych, dla której przy spełnieniu przez owe zmienne hipotezy zerowej potrafimy
podać prawdopodobieństwa z jakimi przyjmuje ona różne wartości. Ta funkcja nazywana jest
statystyką. Następnie obliczamy wartość tej funkcji dla badanej próby. Jeśli prawdopodobieństwo
osiągnięcia otrzymanej bądź jeszcze bardziej ekstremalnej wartości statystyki jest niskie to wątpimy,
że nasze dane są zgodne z hipotezą zerową i jesteśmy skłonni przyjąć hipotezę alternatywną.
Wybór statystyki
Wybierając statystykę można posłużyć się następującym schematem:
Jeżeli znamy rozkład prawdopodobieństwa, z którego pochodzą nasze dane, lub umiemy je
przetransformować do znanego rozkładu, to wybierzemy klasyczny test parametryczny np. test
t (ttest_rel, ttest_ind), , itp.
Jeżeli nie znamy rozkładu prawdopodobieństwa naszych danych albo nie chcemy nic o nim
zakładać to mamy dwie możliwości:
korzystamy z klasycznego testu nieparametrycznego np.:
test Wilcoxona dla obserwacji sparowanych
testuje hipotezę zerową, że dwie próby
i , które ze sobą porównujemy
pochodzą z tej samej populacji ciągłej (przekłada się to na równość dystrybuant).
Próby
i są sparowane. W pythonie mamy ten test zaimplementowany jako:
scipy.stats.wilcoxon(x, y=None). Ta implementacja stosuje przybliżenie
dużych prób i zalecana jest dla
.
test Manna-Whitney'a
testuje hipotezę zerową, że dwie próby
i , które ze sobą porównujemy
pochodzą z tej samej populacji ciągłej. Próby
i nie są sparowane.
Implementacja w pyhtonie: scipy.stats.mannwhitneyu(x, y,
use_continuity=True) stosuje przybliżenia i zalecana jest dla
w każdej
z prób. Funkcja zwraca wartość p dla hipotezy jednostronnej. Jeśli testujemy
hipotezę dwustronną trzeba otrzymane p pomnożyć przez 2.
wytwarzamy rozkład statystyki na podstawie naszych danych przez repróbkowanie
(bootstrap lub permutacje). W podejściu repróbkowania tworzymy statystyczny model
badanego procesu zgodny z hipotezą zerową i następnie badamy w drodze symulacji
prawdopodobieństwa generowania przez ten model interesujących nas sytuacji.
Największą uwagę musimy tu poświęcić na prawidłowe sformułowanie modelu, a
następnie precyzyjne określenie prawdopodobieństwo jakiego zdarzenia nas naprawdę
interesuje.
Poziom istotności
i wartość
Błąd pierwszego rodzaju
błąd polegający na odrzuceniu hipotezy zerowej, która w rzeczywistości jest prawdziwa.
Oszacowanie prawdopodobieństwa popełnienia błędu pierwszego rodzaju oznaczamy
symbolem i nazywamy poziomem istotności testu.
Błąd drugiego rodzaju
polegaja na nieodrzuceniu hipotezy zerowej, która jest w rzeczywistości fałszywa. Oszacowanie
prawdopodobieństwo popełnienia błędu drugiego rodzaju oznaczamy symbolem , a jego
dopełnienie do jedności nazywane jest mocą testu.
Wartość jest to wartość prawdopodobieństwa, że wobec posiadanych danych hipoteza zerowa jest
prawdziwa. Jest ono obliczane jako prawdopodobieństwo zaobserwowania wartości statystyki takiej
jak dla badanej próby, lub bardziej ekstremalnej, przy prawdziwej hipotezie zerowej. Najczęściej
porównujemy p z wcześniej ustalonym poziomem istotności . Poziom istotności to wartość
krytyczna prawdopodobieństwa, taka że jeżeli
to odrzucamy hipotezę zerową.
Formułowanie hipotez
Przykład: mutacje muszek owocowych
Załóżmy, że badamy muszki owocowe. W standardowej populacji proporcja samic do samców jest
1:1. Opracowaliśmy metodę powodującą taką mutację muszek owocowych, że potomstwo ich nie
będzie miało jednakowej szansy na bycie samcem lub samiczką. W pierwszych 20 zbadanych
przypadkach uzyskujemy 14 samców i 6 samiczek.
Pytanie naukowe
Czy wyniki eksperymentu potwierdzają, że nasza metoda zaburza proporcję płci?
Najpierw musimy przetłumaczyć pytanie naukowe na pytanie statystyczne.
Pytanie statystyczne
Jakie jest prawdopodobieństwo uzyskania zaobserwowanej proporcji (14:6), lub bardziej
ekstremalnej w próbie 20 osobników, jeśli rzeczywista proporcja płci jest 1:1?
Z tego pytania wynikają dwie możliwe hipotezy:
Hipoteza zerowa: Nowa metoda nie zaburza proporcji płci 1:1. Zaobserwowana próbka
pochodzi z populacji, w której proporcja płci jest 1:1
Hipoteza alternatywna: Zaobserwowana próbka pochodzi z populacji, w której proporcja płci
nie jest 1:1.
Prawdopodobieństwo, które musimy oszacować
Jakie jest prawdopodobieństwo uzyskania 14 lub więcej jedynek w serii 20 prób, jeśli
prawdopodobieństwo jedynki jest
?
1. Oznaczmy 1: samiec 0: samiczka.
2. Zróbmy wektor 20-elementowy zawierający 10 zer i 10 jedynek.
3. Wylosujmy ze zwracaniem nowy wektor 20-elementowy. (Jest to nasz model uzyskiwania 20
elementowej próbki z populacji o proporcji 1:1.) Zapamiętajmy liczbę jedynek.
4. Powtórzmy poprzedni krok 1000 razy
5. Zróbmy histogram ilości jedynek.
6. Policzmy ile razy zdarzyło sie 14 lub więcej jedynek (to odpowiada 14 lub więcej samców) i
dodajmy do tego ilość przypadków gdy mieliśmy 6 lub mniej jedynek (to odpowiada 14 lub
więcej samiczek). Wynik podzielmy przez ilość losowań (1000).
Powyższa procedura opisuje test dwustronny. Testu dwustronnego musimy użyć jeśli nie mamy
istotnych powodów, żeby wierzyć, że nowa metoda działa jedynie na zwiększenie szansy pojawienia
się samca.
Jak powyższy problem rozwiązać w sposób parametryczny? Próby podlegają rozkładowi
dwumianowemu, można więc obliczyć szukane prawdopodobieństwo korzystając z jego
dystrybuanty.
Testowanie hipotez na temat średniej
Firma rozwożąca przesyłki po mieście deklaruje średni czas dostarczenia 28 minut. Przeprowadźmy
test tej hipotezy na poziomie istotności 5%.
Wybieramy losową próbę 100 przesyłek, mierzymy czas dostarczenia, liczymy średnią z próby
minut i odchylenie standardowe próby
minut.
Test ten można przeprowadzić z użyciem przedziałów ufności:
Konstruujemy przedziały ufności 95% dla średniej .Formalnie, ponieważ wyliczyliśmy
odchylenie standardowe z próby powinniśmy zastosować wartości krytyczne z rozkładu t.
Rozmiar próby wynosi 100 więc rozkład t ma 99 stopni swobody. Wartość krytyczna w tym
rozkladzie to
. Mamy zatem:
Wnioskowanie: Możemy więc być na 95% pewni, że nieznana średnia leży pomiędzy 30,51 a
32,49 a więc na 95% nie leży poza tym przedziałem.
Skoro
podaje
(poza przedziałem), możemy odrzucić tę hipotezę. Jeśli
jest prawdziwe,
istnieje prawdopodobieństwo 0,05, że skonstruowany przedział nie będzie zawierał . Istnieje zatem
prawdopodobieństwo 0,05 popełnienia błądu I-go rodzaju. Mówimy, że przeprowadziliśmy test na
poziomie istotności 0,05.
Test można też przeprowadzić następująco:
Jako statystykę wybieramy
Obliczmy jej wartość dla danych z próby:
Porównujemy otrzymaną wartość z wartością krytyczna dla przyjętego poziomu istotności .
Konstuowany przez nas test ma być testem dwustronnym więc musimy wziąć do porównania
wartość krytyczna dla
:
Wnioskowanie: Dla naszej próby otrzymaliśmy wartość statystyki równą 6.96. Dla przyjętego
poziomu istotności wartość statystyki wynosi 1,984. Prawdopodobieństwo zaobserwowania
statystyki o wartości 7 lub bardziej ekstremalnej (tu: większej) jest mniejsze niż założony
poziom istotności więc odrzucamy
na poziomie
.
Testowanie hipotez na temat wariancji
Do testowania hipotez na temat wariancji używamy statystyki chi-kwadrat o
swobody:
gdzie
jest wartością wariancji podaną w
stopniach
.
Przykład
Do produkcji baterii używane są metalowe płytki o średniej średnicy 5mm. Jeśli wariancja średnicy
płytki jest nie większa niż 1mm , produkcja jest kontynuowana. Jeśli wariancja przekracza 1mm
proces produkcji trzeba przerwać. Kontroler przeprowadza test na poziomie istotności
%:
i
.
Wybiera losową próbę 31 płytek i znajduje wariancję próby
przerwania produkcji ?
. Znajdujemy poziom
. Czy daje to podstawy do
dla tej wartości
z 30 stopniami swobody.
import scipy.stats as st
import pylab as py
p = 1-st.chi2.cdf(48.6,30)
print(p)
#ilustracja
x = py.arange(,60,1)
py.plot(x, st.chi2.pdf(x,30)) #rysujemy funkcję gęstości prawdopodobieństwa
chi2 o 30 st. swobody
x2 = py.arange(48.8,60,1)
py.fill_between(x2,st.chi2.pdf(x2,30)) #cieniujemy obszar pod funkcją
geęstości prawdopodobieństwa odpowiadający obliczonemu p
py.show()
Otrzymaliśmy
. Wniosek: Odrzucamy
Błąd drugiego rodzaju. Moc testu.
Błąd II-go rodzaju popełniamy wtedy gdy przyjmujemy
a prawdziwe jest
.
Przykład
Załóżmy następujący test:
Niech rozmiar próby wynosi
a odchylenie standardowe w populacji
Powinniśmy tu zastosować test jednostronny (mamy tylko dwie możliwości:
Znajdźmy punkt krytyczny
dla poziomu istotności
.
lub
).
:
Błąd pierwszego rodzaju popełnimy gdy
i prawdziwe będzie
pierwszego rodzaju ustaliliśmy z góry na poziomie
.
. Prawdopodobieństwo błędu
Błąd drugiego rodzaju popełnimy gdy
a prawdziwe będzie
. Prawdopodobieństwo
popełnienia tego błędu wynosi:
Moc testu jest dopełnieniem błędu II rodzaju. A moc testu czyli prawdopodobieństwo odrzucenia
hipotezy zerowej podczas gdy jest ona fałszywa wynosi:
.
Porównanie dwóch populacji
Dla przypomnienia: Jeśli mamy dwie próbki danych:
o liczebności
i estymowanej wariancji
o liczebności
i estymowanej wariancji
i
gdzie
pochodzących z rozkładu normalnego o takiej samej wariancji
to:
wspólna wariancja może być estymowana jako:
wariancja różnicy średnich może być estymowana jako:
Jeśli postawimy hipotezę zerową:
pochodzi z rozkładu o
to
stopniach swobody.
Przykład: promocja
Producent odtwarzaczy CD chce sprawdzić czy małe obniżenie ceny produktu wpłynie korzystnie na
sprzedaż. Losowa próba 15 tygodni sprzedaży przed obniżką dała średni dochód 6598 zł i
standardowe odchylenie 844 zł. Losowa próba 12 tygodni sprzedaży w trakcie promocji dała średnią
6870 i odchylenie standardowe 669 zł. Czy dane te wykazują poprawę sprzedaży w trakcie promocji
(przyjąć poziom istotności 5%) ?
Treść zadania odpowiada testowi jednostronnemu z poniższymi hipotezami:
Różnica średnich wynosi:
Estymowana wariancja różnicy średnich:
zatem:
Ilość stopni swobody:
Wniosek: Nie możemy odrzucić
sprzedaż.
. Nie mamy podstaw by uznać że mała obniżka cen poprawiła
Do testowania równości wariancji w dwóch populacjach stosuje się test
W przykładzie powyżej założyliśmy równość wariancji. Korzystając z testu
było uzasadnione.
:
sprawdzić czy założenie
Badanie założenia o normalności rozkładu
We wszystkich wspomnianych powyżej klasycznych testach statystycznych , , ,
istotnym
założeniem jest to, że dane wejściowe w próbie mają rozkład normalny. W powyższych zadaniach po
prostu to zakładaliśmy, ale w praktyce, kiedy dostajemy próbę do analizy, musimy sami sprawdzić,
czy możemy uznać ją za pochodzącą z rozkładu normalnego. Do weryfikacji takiej hipotezy służą
narzędzia graficzne:
Histfit: histogram z naniesionym fitem rozkładu normalnego
def histfit(x,N_bins):
'''
x - dane
N_bins -ilość binów w histogramie
Funkcja rysuje histogram i na jego tle dorysowuje wykres
funkcji gęstości prawdopodobieństwa rozkładu normalnego
o średniej i wariancji estymowanych z x.
Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''
n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green',
alpha=0.75)
# Rysujemy histogram i w jawny sposób odbieramy zwracane przez p.hist
obiekty
#
- normujemy histogram do jedności
#
- ustalamy kolor prostokątów na zielony
#
- ustawiamy przezroczystość prostokątów na 0.75
bincenters = 0.5*(bins[1:]+bins[:-1])
# wytwarzamy tablicę z centrami binów korzystając z granic binów
# zwróconych przez py.hist w macierzy bins
y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x))
# obliczamy momenty rozkładu x: średnią i wariancję (tak naprawdę to
jej pierwiastek czyli standardowe odchylenie)
# obliczamy wartości w normalnym rozkładzie gęstości
prawdopodobieństwa
# o średniej np.mean(x) i standardowym odchyleniu np.std(x) dla
wartości bincenters
l = py.plot(bincenters, y, 'r--', linewidth=1)
# do histogramu dorysowujemy linię
Normplot
Jest to wykres wartości w próbie, wzg. prawdopodobieństwa uzyskania takiej wartości w rozkładzie
normalnym. Wykres ten jest szczególnym przypadkiem kwantylowego wykresu prawdopodobieństwa
[1]. Konstruuje się go następująco:
Na osi pionowej odkładamy uporządkowane zaobserwowane wartości
Estymują one położenie kwantyli w populacji.
Na osi poziomej odkładamy położenia kwantyli w rozkładzie normalnym. Obliczamy je:
.
gdzie
jest funkcją odwrotną do dystrybuanty rozkładu teoretycznego (w
tym szczególnym przypadku normalnego) jest numerem obserwacji a
są
czynnikami (
) zapewniającymi, że argument funkcji odwrotnej do dystrybuanty nie
przyjmuje wartości 0 ani 1.
Jeśli dane x podlegają rozkładowi normalnemu to ich położenia kwantyli powinny być zgodne z
położeniami kwantyli w rozkładzie normalnym, zatem wykres powinien przedstawiać linię prostą.
Odstępstwa od prostej świadczą o odstępstwie od rozkładu normalnego. W pythonie możemy ten typ
wykresu zaimplementować np. tak (współczynniki zaczerpnięte z [2]):
# -*- coding: utf-8 -*import scipy.stats as st
import pylab as py
import numpy as np
def normplot(x):
'''normplot: x dane do testowania'''
x_ord = sorted(x)
N = len(x)
y = np.zeros(N)
y[]=st.norm.ppf(1- 0.5**(1.0/N) )
y[N-1] = st.norm.ppf(0.5**(1.0/N) )
for i in range(1,N-1):
arg = float(i-0.3175)/(N+0.365)
y[i] = st.norm.ppf(arg)
py.plot(y,x_ord,'.')
Test Shapiro-Wilka
W,p = st.shapiro(x)
Funkcja ta zwraca wartość statystyki W i prawdopodobieństwo p zaobserwowania takiej lub bardziej
ekstremalnej wartości statystyki W dla danych podlegających rozkładowi normalnemu. Jeśli p ma
wysoką wartość (większą niż przyjęta ) to nie możemy odrzucić hipotezy, że dane podlegają
rozkładowi normalnemu. Test Shapiro-Wilka nie jest wrażliwy na parametry rozkładu, z którego
pochodzą dane (dane mogą pochodzić z rozkładu o dowolnej średniej i dowolnym odchyleniu
standardowym).
Test Kołmogorowa-Smirnowa
Jest on oparty na badaniu maksymalnej różnicy pomiędzy dystrybuantą empiryczną (z próby) a
teoretyczną dystrybuantą rozkładu. Dla testowania normalności próby powinniśmy wywołać
D , p = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)) #sposób
zalecany
#lub
D , p = st.kstest((x-np.mean(x))/np.std(x,ddof=1), 'norm') #sposób
niezalecany, ale również prawidłowy
Funkcja zwraca wartość statystyki D i prawdopodobieństwo zaobserwowania takiej bądź bardziej
ekstremalnej wartości statystyki jeśli testowane dane pochodzą z tego samego rozkładu.
UWAGA! Test Kołmogorowa-Smirnowa jest wrażliwy na parametry rozkładu, z którego pochodzą
dane. Wywołanie poniższego kodu jest błędem:
D , p = st.kstest(x, 'norm') #BŁĘDNE użycie testu Kołmogorowa-Smirnowa
Test dla innych postaci rozkładu
Za pomocą testu Kołmogorowa-Smirnowa możemy zbadać również założenie o pochodzeniu danych z
populacji podlegającej dowolnemu innemu rozkładowi ciągłemu. W tym celu należy podać zamiast
'norm' odpowiednią nazwę rozkładu z modułu scipy.stats oraz parametry tegoż rozkładu w
odpowiedniej kolejności (należy w tym celu zajrzeć do dokumentacji). Przykład jak to należy zrobić
dla rozkładu wykładniczego:
D , p = st.kstest(x, 'expon', args=(, 1/np.mean(x)) #test, czy dane podlegają
rozkładowi wykładniczemu
Przykład
Proszę wygenerować 1000 liczb z rozkładu normalnego. Liczby te obejrzyjmy na wykresach
histfit oraz normplot i zbadamy ich normalność testem Shapiro-Wilka i Kołmogorova-Smirnova.
# -*- coding: utf-8 -*import scipy.stats as st
import pylab as py
import numpy as np
def normplot(x):
'''normplot: x dane do testowania'''
x_ord = sorted(x)
N = len(x)
y = np.zeros(N)
y[]=st.norm.ppf(1- 0.5**(1.0/N) )
y[N-1] = st.norm.ppf(0.5**(1.0/N) )
for i in range(1,N-1):
arg = float(i-0.3175)/(N+0.365)
y[i] = st.norm.ppf(arg)
py.plot(y,x_ord,'.')
def histfit(x,N_bins):
''' funkcja rysuje histogram i na jego tle dorysowuje wykres
funkcji gęstości prawdopodobieństwa rozkładu normalnego
o średniej i wariancji estymowanych z x
Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as
st'''
n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green',
alpha=0.75)
bincenters = 0.5*(bins[1:]+bins[:-1])
y = st.norm.pdf( bincenters, loc = np.mean(x), scale =
np.std(x,ddof=1))
l = py.plot(bincenters, y, 'r--', linewidth=1)
def porownania(x):
py.subplot(2,2,1)
normplot(x)
py.subplot(2,2,2)
histfit(x,15)
W,p_sw = st.shapiro(x)
D,p_ks = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)))
title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}
py.title(title)
# wybieramy pierwsze dziesięć punktów
y=x[:10]
py.subplot(2,2,3)
normplot(y)
py.subplot(2,2,4)
histfit(y,15)
W,p_sw = st.shapiro(y)
D,p_ks = st.kstest(y, 'norm', args=(np.mean(x),np.std(x,ddof=1)))
title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}
py.title(title)
x = st.norm.rvs(size=1000, loc=, scale=10)
py.figure(1)
porownania(x)
# A teraz zbadajmy dane z rozkładów innych niż normalny:
x = st.t.rvs(df = 2, size=1000, loc=, scale=1)
py.figure(2)
porownania(x)
x = st.expon.rvs(size=1000,loc=,scale=1)
py.figure(3)
porownania(x)
py.show()
Proszę zapuścić skrypt kilka razy i zwrócić uwagę na to, jak trudno jest ocenić normalność danych
przy małych próbach.
Przykład: transformacja Boxa-Coxa
Często normalność danych można poprawić przez zastosowanie odpowiedniej transformacji. Ogólną
rodzinę transformacji, które często prowadzą do normalizacji danych można zapisać tak
(trasformacja Box-Cox'a [3]):
W module scipy.stats mamy tę transformację zaimplementowaną jako boxcox().
Zobaczmy jej działanie na następującym przykładzie:
Proszę pobrać i zapisać w pliku tekstowym następujące dane. Zawierają one 8 kolumn
charakterystyk samochodów:
zużycie paliwa
cylindry
pojemność skokowa
moc w koniach mechanicznych
masa
przyspieszenie
rocznik
pochodzenie
Proszę narysować histfit i normplot oraz policzyć testy Shapiro-Wilka i Kolmogorowa-Smirnowa dla
masy pojazdów, a następnie zastosować do niej transformację Boxa-Coxa i zbadać normalność
przetransformowanych danych.
# -*- coding: utf-8 -*import scipy.stats as st
import pylab as py
import numpy as np
def normplot(x):
'''normplot: x dane do testowania'''
x_ord = sorted(list(x))
N = len(x)
y = np.zeros(N)
y[]=st.norm.ppf(1- 0.5**(1.0/N) )
y[N-1] = st.norm.ppf(0.5**(1.0/N) )
for i in range(1,N-1):
arg = float(i-0.3175)/(N+0.365)
y[i] = st.norm.ppf(arg)
py.plot(y,x_ord,'.')
def histfit(x,N_bins):
''' funkcja rysuje histogram i na jego tle dorysowuje wykres
funkcji gęstości prawdopodobieństwa rozkładu normalnego
o średniej i wariancji estymowanych z x
Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as
st'''
n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green',
alpha=0.75)
bincenters = 0.5*(bins[1:]+bins[:-1])
y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x))
l = py.plot(bincenters, y, 'r--', linewidth=1)
def porownania(x):
py.subplot(2,1,1)
normplot(x);
py.subplot(2,1,2)
histfit(x,15)
W,p_sw = st.shapiro(x);
D,p_ks = st.kstest(x,'norm',args=(np.mean(x),np.std(x) ))
title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}
py.title(title)
dane = np.loadtxt('Samochody.txt')
# Badamy przyspieszenia
w = dane[:,5]
py.figure(1)
porownania(w)
# A teraz stosujemy transformację Box-Coxa
wt,lam = st.boxcox(w)
py.figure(2)
porownania(wt)
# badamy masy
w = dane[:,4]
py.figure(3)
porownania(w)
# A teraz stosujemy transformację Box-Coxa
wt,lam = st.boxcox(w)
py.figure(4)
porownania(wt)
py.show()
W pierwszym przypadku - asymetrię rozkładu przyspieszeń udało się transformacją B-C poprawić,
ale w drugim przypadku, masa, asymetrię dało się skorygować (widać to na histfit) ale nie da się
poprawić ciężkich ogonów - widać to zarówno na normplocie jak i na wynikach testów. Ogólnie:
zanim zaczniemy analizować dane dobrze jest je pooglądać na różnych wykresach i chwilę pomyśleć.
Przykład (zastosowanie różnych testów do tych samych
danych): karma
Badamy dwie nowe karmy A i B. Mamy dwie grupy po 12 zwierząt. Uzyskane przyrosty masy są
następujące:
A: 31 34 29 26 32 35 38 34 31 29 32 31
B: 26 24 28 29 30 29 31 29 32 26 28 32
Pytanie: Czy któraś z karm daje istotnie większe przyrosty masy?
Poniżej rozwiążemy to zadanie stopniowo różnymi metodami. Kolejne kawałki kodu można dopisywać
do tego samego pliku.
ROZWIĄZANIE: Przyjmujemy poziom istotności, na którym przeprowadzamy testy
.
Badamy rozkłady danych:
import scipy.stats as st
import pylab as py
import numpy as np
A=[ 31, 34, 29, 26, 32, 35, 38, 34, 31, 29, 32, 31];
B=[ 26, 24, 28, 29, 30, 29, 31, 29, 32, 26, 28, 32];
W, p_A = st.shapiro(A)
print('Dla grupy A:', p_A)
W, p_B = st.shapiro(B)
print('Dla grupy B:', p_B)
Dla obu grup test Shapiro-Wilka nie daje nam podstaw do odrzucenia założenia o normalności
rozkładów.
Test parametryczny
Nie odrzuciliśmy hipotezy o normalnym rozkładzie danych zatem możemy zastosować test t dla
różnicy średnich.
Formułujemy hipotezy:
: średni przyrost masy w grupie A
: średni przyrost masy w grupie A
średni przyrost masy w grupie B
średni przyrost masy w grupie B
Przeprowadzamy test:
t, p = st.ttest_ind(A,B)
Otrzymujemy p = 0.01.
, zatem na przyjętym poziomie istotności odrzucamy hipotezę zerową i stwierdzamy, że grupa
A ma inną średnią niż grupa B.
Test nieparametryczny
Nie zakładajac postaci rozkładu danych mozemy zastosować test ze statystykami opartymi na
rangach. Formułujemy hipotezy:
: mediana przyrostu masy w grupie A
: mediana przyrostu masy w grupie A
mediana przyrostu masy w grupie B
mediana przyrostu masy w grupie B
Przeprowadzamy test:
U, p = st.mannwhitneyu(A, B)
p_dwustronne = 2*p
W pythonie zaimplementowana jest wersja jednostronna tego testu. Aby otrzymać
prawdopodobieństwo p dla testu dwustronnego musimy pomnożyć je przez 2.
Testy bootstrapowe
Teraz to samo sprawdzimy za pomocą testu repróbkowanego. Przyda nam się tu funkcja do
pobierania losowej próbki z powtórzeniami z danych:
def randsample(x, N):
'''zwraca wektor o dłougości N z losowo wybranymi elementami wektora
x. Losowanie odbywa się z powtórzeniami'''
n=len(x)
ind = np.random.randint(n, size = N)
y = x[ind]
return y
W testech repróbkowanych statystykę możemy wybrać dość dowolnie, ale jak pokażemy poniżej nie
każda jest równie dobra. Zgodnie z hipotezą zerową próbka A i B pochodza z tej samej populacji.
Nasza najlepsza wiedza o owej populacji to połączone próbki A i B:
POP=np.concatenate((A, B))
N=len(POP)
NA=len(A)
NB=len(B)
# Zasymulujemy N_rep razy wyciagniecie z POP prob o rozmiarach NA i NB i
# zobaczymy jak czesto zdarzają się wartości statystyki sie roznica srednich
taka jak w oryginalnym
# pomiarze lub jeszcze wieksza.
N_rep=10000
# oryginalna roznica srednich i median:
mi_0 = np.abs(np.mean(A) - np.mean(B))
T_0 = np.abs(np.mean(A) - np.mean(B))/np.std(POP)
me_0 = np.abs(np.median(A) - np.median(B))
mi = np.zeros(N_rep)
T = np.zeros(N_rep)
me = np.zeros(N_rep)
for i in range(N_rep):
AA = randsample(POP,NA)
BB = randsample(POP,NB)
R_POP = np.concatenate((AA,BB))
mi[i] = np.abs(np.mean(AA)-np.mean(BB)) # abs bo test dwustronny
T[i] = np.abs(np.mean(AA)-np.mean(BB))/np.std(R_POP)
me[i] = np.abs(np.median(AA)-np.median(BB))
p_mi = np.sum(mi>=mi_0)/N_rep
p_T = np.sum( T>=T_0 )/N_rep
p_me = np.sum(me>=me_0)/N_rep
print('testy repróbkowane: ')
print('rożnica średnich: ', p_mi)
print('pseudo T: ', p_T)
print('różnica median: ', p_me)
Widzimy, że dla testu ze statystyką różnicy średnich i pseudo T dostajemy podobne wyniki, z tym, że
pseudo T jest nieco silniejszy. Test ze statystyką różnicy średnich jest na tyle słaby, że nie pozwala
na odrzucenie hipotezy zerowej.
Wnioskowanie w oparciu o przedziały ufności
Wnioskowanie o równości średnich dwóch grup można też przerowadzić w oparciu o przedziały
ufności. W naszym przykładzie przedziały można skonstruować zarówno parametrycznie jak i
nieparametrycznie.
Wersja parametryczna
Konstruujemy 95% przedział ufności wokół oryginalnej różnicy średnich. Dla dwóch grup wariancję
różnicy średnich znajdujemy sumując wariancje śrenich estymowane dla każdej z grup:
ilość stopni swobody:
co prowadzi do estymatora
roznica_oryginalna = np.mean(A) - np.mean(B)
f = NA+NB-2;
v_A = np.var(A)
v_B = np.var(B)
sig = np.sqrt( ((NA*v_A +NB*v_B))/f * (NA + NB)/(NA*NB) )
t_2_5 = st.t.ppf(0.025,f);
t_97_5 = st.t.ppf(0.975,f);
print('przedział ufności dla różnicy średnich przy założeniu
normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+
roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})
Otrzymujemy w wyniku przedział ufności dla różnicy średnich przy założeniu
normalności 0.77 5.56. Oznacza to, że w 95% analogicznych badań powinniśmy otrzymać
różnicę średnich zawartą w tym przedziale. Przedził ten nie zawiera wartości 0, zatem na przyjętym
poziomie istotności średnie grupy A i B są różne.
Wersja nieparametryczna
# POP zawiera świat zgodny z H0
roznica_oryginalna = np.mean(A) - np.mean(B)
alfa = 0.05
N_rep = 10000
r = np.zeros(N_rep)
for i in range(N_rep):
gA = randsample(POP, NA)
gB = randsample(POP, NB)
r[i] = np.mean(gA) - np.mean(gB)
ci_d = st.scoreatpercentile(r, per = alfa/2*100)
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)
# print('przedział
ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d+roznica_oryginalna,
'g':ci_g+roznica_oryginalna})
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d,
'g':ci_g})
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})
Wynik: przedział ufności: -2.50 2.50 oryginalna różnica średnich: 3.17. Przedział
ufności 95% na różnicę skonstruowany zgodnie z
nie zawiera oryginalnej różnicy średnich, zatem
różnica 3.17 w świecie zgodnym z
zdarza się nie częściej niż w 5% przypadków. Wniosek: średnie
grup A i B są różne na przyjętym poziomie ufności.
Zadanie: Przeżywalność myszy
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność po operacji oraz 9
myszy kontrolnych, którym owego środka nie podano. Myszy traktowane specjalnie przeżyły
94, 38, 23, 197, 99, 16, 141 dni
a myszy traktowane standardowo:
52, 10, 40, 104, 51, 27, 146, 30, 46 dni
Średnia różnica wynosi 30,63 dni dłużej dla myszy traktowanych po nowemu. Pytanie, na które
chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie poprawia przeżywalność. Zadanie
proszę rozwiązać wszystkimi możliwymi sposobami, analogicznie do powyższego przykładu.
Odp:
przedział ufności: [−51,64 52,89]
oryginalna różnica średnich: 30,63
przedział ufności dla różnicy średnich przy założeniu normalności [−27,99 89,26]
Zadanie: Linie lotnicze
Linie lotnicze, projektując nowy samolot chcą sprawdzić czy średnia waga bagażu ręcznego
zabieranego przez pasażerów nie zmieniła się od czasu poprzednich badań i wynosi wciąż 12 kg.
Analiza ma być przeprowadzona na poziomie istotności
. Analityk pobrał próbę bagażu
ręcznego 144 pasażerów i obliczył wartość średnią z próby
kg i odchylenie standardowe z
próby
. Przeprowadź test hipotezy, że
.
Zadanie: Agencja nieruchomości
Agencja nieruchomości w Japonii podała, że ceny gruntu w centrum Tokio wzrosły o 49% w ciągu
ostatniego roku. Inwestor chcąc przetestować te dane, znajduje próbę 18 nieruchomości w centrum
Tokio, dla których zna cenę obecna i sprzed roku. Zakłada, że ceny podlegają rozkładowi
normalnemu. Dla każdej nieruchomości oblicza procentowy wzrost wartości a następnie znajduje
średnią i odchylenie standardowe z próby. Estymatory dla próby wynoszą
%i
%.
Przeprowadź test na poziomie istotności
.
Zadanie: Zabiegi bio-inżynieryjne
Załóżmy, że krowy są bardziej wartościowe od byków. Bio-inżynier twierdzi, że przy pomocy
pewnych zabiegów jest w stanie spowodować zwiększenie szansy na urodzenie się krowy powyżej
50%. W jego eksperymencie na 10 urodzonych zwierząt 9 było krowami, a tylko 1 bykiem. Czy
powinnniśmy wierzyć temu bio-inżynierowi? Jakia jest szansa na uzyskanie takiego, bądź bardziej
ekstremalnego wyniku przy założeniu, że procedura stosowana przez naszego inżyniera nia ma
żadnych efektów? W tym problemie dla odmiany założymy, że w normalnych warunkach 100 spośród
206 cieląt to krowy. Zadanie rozwiązać metodą parametryczną i przez repróbkowanie. Wskazówka
Zadanie: Porównanie lekarstwa i placebo
Badamy skuteczność leku na raka. Mamy grupę 12 chorych: 6 osobom podajemy lek — poprawa
wystąpiła u 5 osób, pozostałym sześciu osobom podajemy placebo — poprawa wystąpiła u 2 osób.
Czy te wyniki upoważniają do stwierdzenia, że lek istotnie zwiększa szansę poprawy? Test
przeprowadzić na poziomie istotności 5%.
Wskazówka: jako statystykę przyjąć różnicę w ilości popraw między grupą z lekiem a grupą z
placebo. Interesuje nas prawdopodobieństwo zaobserwowania takiej (3) bądź większej różnicy.
Przykład: Średnie grup sparowanych: Lek przeciwdepresyjny
Poniższa tabela prezentuje wyniki 9 pacjentów wykonujących pewien test diagnostyczny przed
podaniem leku i po podaniu leku.
przed
po
1,83
0,878
0,50
0,647
1,62
0,598
2,48
2,05
1,68
1,06
1,88
1,29
1,55
1,06
3,06
3,14
1,3
1,29
PRZED = [1.83, 0.5, 1.62, 2.48, 1.68, 1.88, 1.55, 3.06, 1.3] PO = [0.878, 0.647, 0.598, 2.05, 1.06,
1.29, 1.06, 3.14, 1.29]
Skonstruować test, który pozwoli stwierdzić czy lek jest skuteczny. Porównać różne wersje testu:
bootstrapową (losowanie z powtórzeniami),
permutacyjną,
test parametryczny
test nieparametryczny.
Jakie założenia przyjmujemy przy każdej z wersji testu?
Rozwiązanie
W tym zadaniu mamy dwie grupy przed i po ale oprócz tego istnieje ścisły porządek w parach, bez
sensu jest porównywanie przed od jednego pacjenta z po drugiego pacjenta. Musimy stosować testy,
które biorą ten porządek pod uwagę (testy pairwise).
Jako miarę tego czy lek jest skuteczny przyjmiemy różnicę (po - przed). Każda z zaobserwowanych
różnic to zmienna losowa. Ich średnia to nasza STATYSTYKA. Będziemy wierzyli, że lek działa jeśli ta
różnica jest istotnie mniejsza od zera. Mamy stąd hipotezy:
Wersja bootstrapowa
Założenie, które czynimy w wersji bootstrapowej testu jest następujące: Zaobserwowana grupa
pacjentów jest reprezentatywna, tzn. istnieje duża populacja pacjentów spośród której moglibyśmy
pobrać wiele innych grup podobnych pod względem interesujących nas parametrów do grupy
zaobserwowanej w tym konkretnym eksperymencie. Konsekwencją tego założenia jest to, że jeśli w
naszej grupie mamy już pacjenta z wynikami: [1.83, 0.878], to wylosowanie kolejnego pacjenta o
takich wynikach się nie zmienia i nadal jest 1/9. Prowadzi to do implementacji zawierającej
losowanie z powtórzeniami.
Losowość występuje tu w dwóch miejscach:
losujemy pacjentów z powtórzeniami - zakładamy, że badana grupa jest reprezentatywna dla
bardzo dużej populacji.
dla każdego z wybranych pacjentów losujemy jego wynik przed oraz wynik po z wyników, które
uzyskał w rzeczywistości --- to jest zgodne z hipotezą zerową.
Dla każdego losowania obliczamy wartość statystyki w tym losowania uśredniając różnice
indywidualne. Wartości statystyki otrzymane dla wszystkich losowań tworzą jej empiryczny rozkład,
przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa
zaobserwowania oryginalnej wartości statystyki mr (średnia różnica) przy prawdziwej hipotezie
zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe
niż mr. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją.
# -*- coding: utf-8 -*import scipy.stats as st
import pylab as py
import numpy as np
def randsample(x, N):
'''zwraca wektor z losowo wybranymi elementami wektora x.
Losowanie odbywa się z powtórzeniami'''
n=len(x)
ind = np.random.randint(n, size = N)
y = x[ind]
return y
def hist_z_markerem(x, N_bins, marker):
'''Rysuje histogram wartości w tablicy x, używając N_bins binów.
Na lewo od wartości wskazanej przez marker dorysowywany jest
prostokąt'''
r = np.max(x) - np.min(x)
szer_binu = r/N_bins
#konstruujemy biny
# robimy biny od markera co szerokość binu aż do x minimalnego
biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)
# odwracamy kolejność tej sekwencji żeby była rosnąca
biny_na_lewo = biny_na_lewo[-1::-1]
# robimy biny od markera co szerokość binu aż do x maksymalnego
biny_na_prawo = np.arange(marker,np.max(x), szer_binu)
# sklejamy oba zakresy binów
biny = np.concatenate((biny_na_lewo, biny_na_prawo))
(n,xx,patch) = py.hist(x,bins = biny)
py.fill([np.min(xx), np.min(xx), marker, marker] , [, np.max(n),
np.max(n), ] ,'r' ,alpha = 0.2)
A=np.array([[1.83,
[0.50,
0.647],
0.878],
[1.62,
[2.48,
[1.68,
[1.88,
[1.55,
[3.06,
[1.30,
0.598],
2.05],
1.06],
1.29],
1.06],
3.14],
1.29]])
r = A[:,1] - A[:,] # od drugiej kolumny odejmuję pierwszą
mr = np.mean(r) # średnia z tych różnic to wartość statystyki zaobserwowana
dla oryginalnych danych
print( 'średnia różnica: %(mr).2f'%{'mr':mr})
N = len(r)
N_rep = 100000
r_boot = np.zeros(N_rep)
przed = np.zeros(N)
po = np.zeros(N)
for i in range(N_rep):
ix=randsample(np.arange(,N,1),N) # wybieramy pacjentów z powtórzeniami
B=np.array(A[ix,:])
for j in range(N):
# mieszamy losowo przypisując wyniki do grupy przed
i po
# zakładając, że pacjent może uzyskać dwukrotnie
taki sam wynik
s = np.random.rand()
if s > 0.5:
przed[j]=B[j,]
else:
przed[j]=B[j,1]
s = np.random.rand()
if s > 0.5:
po[j]=B[j,1]
else:
po[j]=B[j,]
rr=po-przed
r_boot[i] = np.mean(rr)
hist_z_markerem(r_boot,30,mr)
p_h0 = np.sum( r_boot <= mr)/N_rep
s_boot = u'dla repróbkowanego testu jednostronnego: %(p_h0).5f'%{'p_h0':
p_h0}
print( s_boot)
py.title(s_boot)
py.show()
Wersja permutacyjna
W tym teście zakładamy, że grupa pacjentów jest unikalna, więc w procedurze wytwarzania
empirycznego rozkładu statystyki korzystamy z danych wszystkich pacjentów w każdej iteracji.
Zgodnie z hipotezą zerową pomiary przed i po są równoważne można je zatem zamieniać. Wykonamy
wszystkie możliwe zamiany przed i po. Możliwych zamian jest
. Skorzystamy z faktu, że bity w
reprezentacji binarnej liczb całkowitych od 0 do
zawierają wszystkie możliwe permutacje
ciągów zer i jedynek o długości N. Wartości 1 zamienimy na logiczne True a wartości 0 na False.
Zinterpretujemy True jako zamianę i False jako brak zamiany.
Dla każdej permutacji obliczamy wartość statystyki uśredniając różnice indywidualne. Wartości
statystyki otrzymane dla wszystkich permutacji tworzą jej empiryczny rozkład, przy założeniu, że
hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej
wartości statystyki mr przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu
empirycznego, w której wartości statystyki były nie większe niż mr. Wynik ilustrujemy histogramem
rozkładu empirycznego z zaznaczoną ową frakcją.
# -*- coding: utf-8 -*import scipy.stats as st
import pylab as py
import numpy as np
def dec2bin(n, l):
'''konwertuje dziesiętną liczbę całkowitą na tablicę
przedstawiającą reprezentację binarną tej liczby
n liczba do konwersji
l długość reprezentacji binarnej
zwracana jest binarna reprezentacja liczby
skonwertowana do tablicy logicznej (0->False, 1-> True)
'''
b = np.zeros(l, dtype = bool)
if n < : raise ValueError("must be a positive integer")
i = 1
while n > :
b[l-i] = bool( n % 2 )
n = n >> 1
i += 1
return b
def hist_z_markerem(x, N_bins, marker):
'''Rysuje histogram wartości w tablicy x, używając N_bins binów.
Na lewo od wartości wskazanej przez marker dorysowywany jest
prostokąt'''
r = np.max(x) - np.min(x)
szer_binu = r/N_bins
#konstruujemy biny
# robimy biny od markera co szerokość binu aż do x minimalnego
biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)
# odwracamy kolejność tej sekwencji żeby była rosnąca
biny_na_lewo = biny_na_lewo[-1::-1]
# robimy biny od markera co szerokość binu aż do x maksymalnego
biny_na_prawo = np.arange(marker,np.max(x), szer_binu)
# sklejamy oba zakresy binów
biny = np.concatenate((biny_na_lewo, biny_na_prawo))
(n,xx,patch) = py.hist(x,bins = biny )
py.fill([np.min(xx), np.min(xx), marker, marker] , [, np.max(n),
np.max(n), ] ,'r' ,alpha = 0.2)
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68,
1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])
r = A[:,1] - A[:,] # od drugiej kolumny odejmuję pierwszą
mr = np.mean(r) # średnia z tych różnic to wartość statystyki zaobserwowana
dla oryginalnych danych
print( 'średnia różnica: %(mr).2f'%{'mr':mr} )
N = len(r)
N_perm = 2**N
r_perm = np.zeros(N_perm)
for i in range(2**N):
B = np.array(A)
# B zawiera kopię tablicy A
zamiana = dec2bin(i,N) # w których wierszach dokonać zamiany?
# print( i,': ', zamiana )
# wiersze tablicy B wskazane przez True w wektorze indeksów ind
zamieniamy wartości 'przed' z wartościami 'po'
B[zamiana, ] = A[zamiana, 1]
B[zamiana, 1] = A[zamiana, ]
rr = B[:,1] - B[:,] # Obliczam wartości zmiennych losowych dla tej
zamiany
r_perm[i] = np.mean(rr) # Obliczmy wartość statystyki dla tej zamiany
p_h0 = np.sum( r_perm <= mr)/N_perm
s_perm = u'dla permutacyjnego testu jednostronnego: %(p_h0).3f'%{'p_h0':
p_h0}
print( s_perm)
hist_z_markerem(r_perm,30,mr)
py.title(s_perm)
py.show()
Wersja parametryczna
Jeśli badane różnice przed i po podlegają rozkładowi normalnemu to do testowania czy średnia
wartość różnicy jest równa 0 można zastosować test t dla prób zależnych st.ttest_rel(). Aby się
upewnić, że możemy zastosować ten test badamy normalność różnic przy pomocy normplot() oraz
testu Shapiro-Wilka st.shapiro().
# -*- coding: utf-8 -*import scipy.stats as st
import pylab as py
import numpy as np
def normplot(x):
'''normplot: x dane do testowania'''
x_ord = sorted(x)
N = len(x)
y = np.zeros(N)
y[]=st.norm.ppf(1- 0.5**(1.0/N) )
y[N-1] = st.norm.ppf(0.5**(1.0/N) )
for i in range(1,N-1):
arg = (i-0.3175)/(N+0.365)
y[i] = st.norm.ppf(arg)
py.plot(y,x_ord,'.')
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68,
1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])
r = A[:,1] - A[:,] # od drugiej kolumny odejmuję pierwszą
normplot(r)
py.title("Wyniki testów na normalność różnic\n Shapiro-Wilka: W=%.3f,
p=%.3f"%st.shapiro(r)
+"\nKołmogorowa-Smirnowa: D=%.3f, p=%.3f"%st.kstest(r, 'norm',
args=(np.mean(r),np.std(r,ddof=1))))
t, p = st.ttest_rel(A[:,1],A[:,])
p_t = p/2 # aby test był jednostronny
s_t = u'dla parametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_t}
print(s_t)
py.show()
Wersja nieparametryczna
W ogólności, nie zakładając normalności różnic można by przeprowadzić test Wilcoxona. W aktualnej
implementacji tego testu w scipy.stats jest on dla naszych danych niedokładny, gdyż mamy małą
liczebność grupy, a implementacja stosuje przybliżenia asymptotyczne.
# -*- coding: utf-8 -*import scipy.stats as st
import numpy as np
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68,
1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])
z, p = st.wilcoxon(A[:,1],A[:,] )
p_w = p/2 # aby test był jednostronny
s_w = u'dla nieparametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0':
p_w}
print( s_w)
Podsumowanie
średnia różnica: -0.43
dla repróbkowanego testu jednostronnego: 0.0013
dla permutacyjnego testu jednostronnego: 0.014
Wynik testu Shapiro-Wilka na normalność różnic
statystyka W: 0.921
prawdopodobieństwo takiej wartości statystyki dla rozkładu
normalnego: 0.404
dla parametrycznego testu jednostronnego: 0.008
dla nieparametrycznego testu jednostronnego: 0.019
Wszystkie testy wskazują prawdopodobieństwo zaobserwowania odpowiadających im statystyk
poniżej przyjętego poziomu istotności
. Zatem hipotezę zerową należy odrzucić i przyjąć
hipotezę alternatywną.
Zadania
Zanieczyszczenie środowiska
Agencja ochrony środowiska ustaliła limit na koncentrację zanieczyszczeń emitowanych przez
fabryki. Załóżmy, że dopuszczalny poziom zanieczyszczeń wynosi 55 cząstek na milion (cz/m) w
promieniu dwóch kilometrów od fabryki. Kontrola przeprowadza 100 pomiarów o różnej porze dnia i
roku w promieniu dwóch km od pewnej fabryki. Średnia z próby wyniosła 60 cz/m a odchylenie
standardowe
cz/m. Czy dane te są wystarczające by na poziomie istotności
uznać,
że fabryka łamie prawo?
Fabryka łamie prawo jeśli emituje zanieczyszczenia na poziomie wyższym niż dopuszczalny więc
należy przeprowadzić test jednostronny (w tym przypadku prawostronny). Czy moglibyśmy odrzucić
na tym samym poziomie stosując test dwustronny? Jest ważne aby w zależności od problemu
wybrać odpowiedni test: jedno- lub dwustronny.
Wzrost mocy turbin
Turbina hydroelektryczna generuje moc średnią 25,2 kW. Po unowocześnieniu maszyny chcemy
przetestować czy średnia moc generowana zmieniła się (na + lub −). Przeprowadzono 115
pomiarów, które dały średnią 26,1 kW i odch. std. 3,2 kW. Przeprowadzić test statystyczny na
poziomie istotności 1%, zinterpretować wynik. Wnioskowanie przeprowadzić także w oparciu
oprzedział ufności.
Sonda
Władze miasta chciałyby wiedzieć, czy przyznać koncesję operatorowi sieci kablowej. W tym celu
zleciły nam przeprowadzenie sondy wśród mieszkańców. Zapytaliśmy o zdanie 50 przypadkowo
wybranych osób. 30 osób powiedziało „tak” a 20 „nie”. Na ile pewnie otrzymane wyniki wskazują, że
mieszkańcy chcą tej kablówki?
Celem naszych badań jest uniknięcie błędu polegającego na tym, że powiemy iż większość
mieszkańców chce kablówki podczas gdy tak na prawdę to nie chce.
Wskazówka: Granicznym przypadkiem popełnienia tego błędu jest proporcja 1:1 zwolenników i
przeciwników kablówki. Jeśli przeciwników kablówki byłoby jeszcze więcej to uzyskanie naszych
wyników byłoby jeszcze mniej prawdopodobne.
Wybory prezydenckie
W ankiecie uzyskaliśmy 840 głosów popierających kandydaturę A i 660 kandydaturę B. Jaka jest
szansa, że tak naprawdę kandydat B ma poparcie 50% lub większe? Jakie jest prawdopodobieństwo
pojawienia sie zaobserwowanej próbki lub próbki wskazującej na jeszcze większe poparcie dla
kandydata A, jeśli w rzeczywistości poparcie kandydata A byłoby 50% lub mniej.
Czy stosunek do marihuany się zmienił?
Rozważmy dwie ankiety przeprowadzone w USA, pytano 1500 respondentów o stosunek do
legalizacji marihuany. Pierwszą ankietę przeprowadzono w 1980, wówczas za legalizacją opowiadało
się 52% a drugą w 1985 i za legalizacją było 46%. Czy wyniki tych dwóch ankiet są istotnie różne?
Z jaką proporcją powinniśmy porównywać te wyniki? Jaka jest hipoteza zerowa?
Zawały serca i cholesterol
Badano grupę 605 osób. 135 osób z tej grupy miało wysoki poziom cholesterolu a 470 niski. W
grupie z wysokim poziomem cholesterolu odnotowano 10 przypadków zawału serca a w grupie z
niskim poziomem 21, w czasie 16 lat obserwacji. Nasze pytanie brzmi: Czy możemy uznać, że wysoki
poziom cholesterolu zwiększa ryzyko zawału serca?
Czy gęstości planet się różnią?
Rozważmy pięć planet znanych w antycznym świecie. Chcemy zbadać, czy planety wewnętrzne
Merkury (0,68) i Wenus (0,94) mają istotnie większe gęstości niż planety zewnętrzne Mars (0,71)
Jowisz (0,24) i Saturn (0,12)?
Wskazówki:
Unikalność zestawu planet wskazuje na zastosowanie testu permutacyjnego.
Moduł implementujący funkcje kombinatoryczne w pythonie to itertools . Zawiera on
funkcję permutations. Wywołanie itertools.permutations(sekwencja[, r]) zwraca
obiekt permutacji. Obiekt ten zwraca kolejne permutacje o długości r elementów w sekwencji
(np. w wektorze). Przykład:
import itertools
for kolejny in itertools.permutations(range(3), 2):
print(kolejny)
Elektrownia jądrowa
Przed wybudowaniem elektrowni jądrowej przeprowadzono pomiary intensywności promieniowania
jonizującego w pobliżu planowanego budynku reaktora. Powtórzono te pomiary po uruchomieniu
reaktora. Czy zebrane dane pozwalają stwierdzić, że poziom promieniowania istotnie wzrósł? Dane
pomiarowe wczytaj z pliku.

Podobne dokumenty