{{indexmenu_n>3}}
Obsah této stránky bude přístupný od 19. 10. 2017.
TEST: https://goo.gl/forms/cszfBlVfFEK63lKv2
**TEST 2**
* (0.2 b) Shlukování (clustering). Stručně popiště dva základní přístupy ke tvorbě shluků.
* (0.2 b) Uvažujte dva body $x=(1;2)$ a $y=(4;6)$. Spočítejte jejich Eukleidovskou i Manhattanskou vzdálenost.
* (0.1 b) K čemu slouží dendrogram?
* (0.5 b) Uvažujte data ''airquality'', která jsou vestavěná v R. Z nich extrahujte příznak ''temp'', a to pouze v měsíci květnu (''data$Month == 5''). Pro tento výběr určete (a) minimální, (b) maximální hodnotu, (c ) medián, (d) mezikvartilovou odchylku a (e) ručně nakreslete boxplot a vyznačte do něj hodnotu mediánu, 1. a 3. kvartilu a konců obou 'fousů'.
====== Cvičení 3 - Lineární regrese, naivní Bayesův klasifikátor ======
===== Lineární regrese =====
**Terminologie**:
* pozorování
* příznak (proměnná, atribut)
* regresor (nezávislé proměnná), odezva (závislá proměnná)
==== Závislost odezvy na jednom regresoru ====
Budeme pracovat s daty ''iris'':
data(iris)
**Prohlídka dat:** kolik a jakých příznaků obsahují? Kolik porozování máme k dispozici? Obsahují data nějaké chybějící hodnoty?
dim(iris)
summary(iris)
Studujte **závislost délky korunního lístku (''Petal.Length'') na délce kališního lístku (''Sepal Length'')** u kosatců "virginica".
Jaký vztah očekáváte?
Závislost vizualizujte.
# vykresleni:
with(iris[iris$Species=='virginica', ], plot(Petal.Length ~ Sepal.Length))
# lepsi vykresleni, aby nesplyvaly pozorovani, u nichz byly namereny shodne hodnoty:
with(iris[iris$Species=='virginica', ], plot(Petal.Length ~ jitter(Sepal.Length)))
# uprava mezi (aby byl videt pocatek souradne soustavy):
with(iris[iris$Species=='virginica', ], plot(Petal.Length ~ jitter(Sepal.Length),
xlim = c(0, max(Sepal.Length)), ylim = c(0, max(Petal.Length))))
Jak byste intuitivně kvantifikovali studovanou závislost?
**Teoretická vsuvka:** Formální znázornění závislosti (vzorec). Grafické znázornění závislosti. Míry kvality proložení křivky (přímky). Metoda nejmenších čtverců. Vliv odlehlých pozorování.
Modelujte závislost délky korunního lístku na délce kališního lístku pomocí **lineární regrese**.
# regresni model:
m <- lm(Petal.Length ~ Sepal.Length, iris[iris$Species=='virginica', ])
# alternativne:
m <- lm(Petal.Length ~ Sepal.Length, iris, subset = Species=='virginica')
# prohlidka modelu:
m
coef(m)
summary(m)
# vizualizace modelu:
abline(coef(m), col='red')
Jaký je výsledek? Závislost formálně zapište. Je závislost statisticky významná?
Interpretujte výsledek.
**Výsledek:**
Petal.Lengthi = 0.61 + 0.75 * Sepal.Lengthi + epsi, přičemž intercept ("průsečík s osou Y") je nevýznamně odlišný od 0, ale koeficient 0.75 u Sepal.Lengthi je významně nenulový, čímž jsme i) prokázali lineární závislost mezi délkou okvětního a kališního lístku, a ii) tuto závislost kvantifikovali.
** Interpretace: S nárůstem délky kališního lístky (''Sepal.Length'') o 1cm narůstá průměrně délka okvětního lístku (''Petal.Length'') o 7.5mm.** Přitom jsme samozřejmě předpokládali (a přesvědčili se obrázkem), že závislost je skutečně lineární.
Modelujte nyní závislost šířky kališního lístku na jeho délce. Jaký výsledek dostáváte?
==== Vliv odlehlých pozorování ====
Nyní modelujte výše sledovanou závislost v případě, že v souboru bude (uměle vytvořené) odlehlé pozorování:
# pouzijeme kosatce virginica
d <- iris[iris$Species=='virginica',]
# a umele zmenime delku korunniho listku u rostliny s nejdelsim kalistnim listkem:
d$Petal.Length [d$Sepal.Length==max(d$Sepal.Length)] <- -5
# data vykreslime:
plot(Petal.Length ~ jitter(Sepal.Length), d)
# modelujeme:
m <- lm(Petal.Length ~ Sepal.Length, d)
summary(m)
# a vykreslime nalezeny model
abline(coef(m),col='red')
Zopakujte výše uvedené kroky. K jakému závěru jste dospěli? Co z toho plyne?
==== Závislost odezvy na více regresorech ====
Načtěte CSV soubor {{:courses:a6m33dvz:cviceni:tuk.txt|tuk.txt}}.
**Prohlídka dat:** kolik a jakých atributů obsahují? V jakých jednotkách jsou naměřeny? Kolik porozování máme k dispozici? Obsahují data nějaké chybějící hodnoty? Pokud ano, jak se s nimi vypořádáte? Jsou v datech odlehlé hodnoty? Pokud ano, co s nimi uděláte?
Studujte nejprve **závislost procenta tuku na hmotnosti**. Jaký vztah očekáváte? Závislost vizualizujte a modelujte pomocí lineární regrese. Jaký dostáváte výsledek? Závislost formálně zapište. Je závislost významná?
Studujte **závislost procenta tuku na tělesné výšce**. Jaký vztah očekáváte? Závislost opět vizualizujte a modelujte pomocí lineární regrese. Jaký dostáváte výsledek? Závislost formálně zapište. Je závislost významná?
Nyní modelujte **závislost procenta tuku zároveň na výšce a hmotnosti**. Jaký dostáváte výsledek? Závislost formálně zapište. Jsou závislosti významné? Srovnejte tento výsledek s předchozími dvěma. Co z toho plyne?
**Výsledek:** fati = 16.5 + 0.49 * weighti - 0.24 * heighti + epsi, přičemž intercept ("průsečík s osou Y") je nevýznamně odlišný od 0, ale oba zbývající koeficienty (u hmotnosti a výšky) jsou významně nenulové.
** Interpretace: S nárůstem hmotnosti o 1kg (při pevné výšce) vzrůstá procento tělesného tuku průměrně o 0.49%. Podobně s nárůstem výšky o 1cm (při pevné hmotnosti) klesá procento tělesného tuku průměrně o 0.24%.** Upozorňeme, že při interpretaci některého regresoru je podmínka pevných hodnot ostatních regresorů nutná, bez ní by tvrzení nebylo pravdivé.
{{courses:a6m33dvz:internal:fat.png}}
{{courses:a6m33dvz:internal:fat3d.png}}
**Příklad 1 (Předpovídání léčebných výdajů)**
Pro tuto analýzu použijeme simulovaný dataset obsahující hypotetické léčebné výdaje pacientů z USA.
- Načtete soubor {{courses:a6m33dvz:cviceni:insurance.txt|insurance.txt}}, změňte přípomu na ''.csv'' pomocí příkazu
insurance <- read.csv("insurance.csv", stringsAsFactors = TRUE)
- Kolik pacientů dataset obsahuje? Jaké atributy máme k dispozici? Použijte funkce ''str()'' a ''summary()''.
- Vypiště tabulku s počty pacientů přes jednotlivé geografické regiony. O jaký typ atributu se jedná?
- Pomocí funkce ''pairs()'' zobrazte matici scatterplotů pro atributy ''age'', ''bmi'', ''children'' a ''expenses''. Lze vypozorovat nějaké vzory?
- Nyní si nainstalujte balíček ''psych'' a použijte funkci ''pairs.panels()'' pro stejné atributy jako v předchozím případě. Čísla zobrazená v horním trojúhelníku jsou korelace mezi příslušnými atributy. Zobrazené ovály se nazávají **korelační elipy**. Jejich střed se nachází v těžišti dat (střední hodnota v //x// i //y//). Korelace mezi dvěma neznámými je symbolizována tvarem elipsy - čím protáhlejší, tím silnější korelace. Jaký tvar má korelační elipsa pro ''bmi'' a ''chilren'' a proč?
- Natrénujte jednoduchý lineární regresní model, kde využijete všechny atributy.
- Jak souvisí věk nebo počet dětí se zdravotnými výlohami?
- Jak si model poradil s kategorickými proměnnými? Kolik platí muži více/méně oproti ženám? Kolik stojí kuřáci oproti nekuřákům?
- Vypište hodnocení modelu pomocí funkce ''summary()''.
- -> Co značí rezidua? Jaká je maximální chyba na uvažovaných datech? Jaké je interpretace?
- -> Co značí vypsané p-hodnoty? Které atributy jsou v našem modelu významné? Dává to smysl/shoduje se to s naším očekáváním?
- -> Najděte koeficient determinace $R^2$ a upravený koeficient determinace $R^2_{adj}$. Jak byste zhodnotili výkon modelu?
Nyní zkusíme předchozí model upravit. Podíváme se na 3 různé závislosti, které nelze postihnout lineárním popisem. Vraťte se k bodu 3 nebo 4 a podívejte se, zdali není možné vysledovat nějaké zajímavé zákonitosti.
- Je závislost mezi léč. výlohami a věkem skutečně lineární?
- A co //bmi//? Zdá se, že jeho vliv není kumulativní. Spíše se začíná projevovat po překročení určité meze. Najděte vhodný zlomový bod a pomocí funkce ''ifelse'' modelujte jednoduchou binární funkci.
- Dosud jsme uvažovali pouze individuální příspěvek každého atributu na určenou závislou proměnnou. Lze však také modelovat kombinavaný vliv. Například kouření a obezita mohou mít škodlivý efekt samostatně, ale je možné se domnívat, že jejich kombinovaný efekt je horší než součet těch individuálních. Tento kombinovaný efekt nazýváme **interakce**. V prostředí R zapisujeme pomocí speciální syntaxe:
expenses ~ bmi30*smoker
To je ekvivalentní se zápisem:
expenses ~ bmi30 + smokeryes + bmi30:smokeryes
Operátor '':'' označuje interakci mezi dvěma proměnnými.
- Nyní do stávajícího modelu přidejte (i) nelinearitu věku, (ii) indikátor obezity a (iii) interakci mezi obezitou a kouřením.
- Jak si tento model stojí oproti předcházejícímu? Má interakce mezi obezitou a kouřením nějaký podstatný efekt? Kolik představují extra náklady za kuřáka? A kolik za obézního kuřáka?
===== Naivní Bayesův klasifikátor =====
**Opakování termínů ze statistiky:**
* nezávislost náhodných veličin
* Bayesova věta
Formulace Bayesova naivního klasifikátoru.
Proč se klasifikátoru říká naivní?
**Příklad:** Hráči chodí hrát tenis, ale hrají pouze za příznivého počasí. Příklady jejich rozhodnutí jsou v následující tabulce. Atributy jsou outlook, temperature, humidity, windy a rozhodnutí je ve sloupečku play. Nalezněte podle čeho se hráči rozhodují, zda půjdou hrát.
^ outlook ^ temperature ^ humidity ^ windy ^ play ^
| sunny | hot | high | false | no |
| sunny | hot | high | true | no |
| overcast| hot | high | false | yes |
| rainy | mild | high | false | yes |
| rainy | cool | normal | false | yes |
| rainy | cool | normal | true | no |
| overcast| cool | normal | true | yes |
| sunny | mild | high | false | no |
| sunny | cool | normal | false | yes |
| rainy | mild | normal | false | yes |
| sunny | mild | normal | true | yes |
| overcast| mild | high | true | yes |
| overcast| hot | normal | false | yes |
| rainy | mild | high | true | no |
Data jsou zde: {{:courses:a6m33dvz:cviceni:weather.csv|weather.csv}}.
Aplikací naivního Bayesova klasifikátoru sami vypočtěte, zda je (ne)pravděpodobné, že hráči půjdou hrát, když bude slunečno (sunny), horko (hot), normální vlhkost (normal) a bezvětří (windy=FALSE).
Váš explicitní výpočet můžete ověřit v R:
# nacteni a prohlidka dat
d<-read.csv('weather.csv')
summary(d)
# naivni Bayes
library(e1071)
# je treba zkonvertovat "logical" priznak na "numeric"
d$windy <- as.numeric(d$windy)
m <- naiveBayes(play~., d)
# vyzkousejme klasifikator
predict(m,d)
table(predict(m,d),d$play)
# a klasifikujme nove pozorovani:
d.new<-data.frame(outlook='sunny',temperature='hot',humidity='normal',windy=0)
predict(m,d.new)