NMSA230 - Softwarové prostředky
pro matematiku a stochastiku

Zimný semester 2018/2019 | Cvičenie 1 | Ut 09/10/18



I. Štatistický software R (úvod a základy)

Účelom prvého cvičenia z predmetu NMSA230 je oboznámiť sa so štatistickým softwarom R (R Development Core Team, 2017), ktorý je najčastejšie používaným softwarovým nástrojom určeným k spracovaniu, príprave a následnej štatistickej analýze dat. Jedná sa o GNU projekt, podobný programu S a primárne je navrhnutý a určený pre štatisticku analýzu dat.

Program R (dostupný pod GNU GPL licenciou) je k dispozícii k stiahnutiu (free of charge) na adrese

https://www.r-project.org

K dispozícii sú distribúcie s priamou podporou pre OS Windows, Linux aj Macintosh.

Základnú inštaláciu programu R je možne jednoducho rozšíriť pomocou dodatočných knižníc (balíčkov), ktoré sú k dispozícii na rôznych online repozitároch (zoznam hlavných repozitárov je na adrese https://cran.r-project.org/mirrors.html). Jednotlivé R knižnice sú tvorené samotnými užívateľmi softwaru R a ich správne fungovanie nie je garantované - je preto namieste určitá opatrnosť a hlavne aktívne premýšľanie pri ich používaní.

Pre užívateľov programu R sú k dispozícii aj rôzne grafické rozhrania, ktoré je možne dodatočne nainštalovať a umožňujú (v určitých smeroch) jednoduchšiu a prehľadnejšiu prácu. Najznámejší a pravdepodobne aj jeden z najlepších R interfacov je RStudio.

Užitočné materiály pre prácu so štatistickým softwarom R

  • Bína, V., Komárek, A. a Komárková, L.: Jak na jazyk R. (PDF súbor)
  • Komárek, A.: Základy práce s R. (PDF súbor)
  • Kulich, M.: Velmi stručný úvod do R. (PDF súbor)
  • De Vries, A. a Meys, J.: R for Dummies. (ISBN-13: 978-1119055808)


Štatisticky software R je nutnou súčasťou predmetu NMSA230 a s týto softwarom budeme viac či menej aktívne pracovať počas celého priebehu semestru. Študenti môžu využiť počítače, ktoré sú k dispozícii v posluchárni K11 (na každom z nich je program R nainštalovaný a súčastne je k dispozícii aj RStudio interface), alebo môžu pracovať na vlastných počítačoch (notebookoch), na ktorých ale musí byť program R nainštalovaný a plne funkčný.

V nasledujúcej časti si uvedieme niekoľko jednoduchých príkladov a úloh, ktoré majú primárne slúžiť ako názorné ukážky fungovania programu R, implementácie jednotlivých príkazov a spôsobov, ako načítať vlastný dátový súbor (nejedná sa ale o kompletný súhrn jednotlivých možnosti, ktoré software R užívateľom ponúka).

V prípade potreby/záujimu je možné využiť podrobnejšieho “sprievodcu” na cestu základmi Rka: Hrátky s R (autor: doc. Arnošt Komárek) - potrebné sú ale dátové súbory: auta2004.dat, auta2004.csv a auta2004.xls)

1. Základné matematické operácie v R

2 + (4 * 5)^2 ## za '#' nasleduje komentar, ktory R ignoruje
1:5 * 2
rep(4,3)

Výsledky je možné vždy uložiť do nejakého vhodne zvoleného objektu, na ktorý sa následne môžeme odvolávať.

v1 <- 2 + (4 * 5)^2 ## za '#' nasleduje komentar, ktory R ignoruje
v2 <- 1:5 * 2
v3 <- seq(1,5, length = 3)
v4 <- rep(4,3)

Jednotlivé výsledky je možné kombinovať a opäť uložiť ako nový výsledok (resp. prepísať pôvodný).

v1 + v2
v5 <- v3 - 2
v5 <- v5 * 2



Užitočné


Program R je objektový nástroj a zvláda aj matematické operacie, ktoré štandardne nie sú definované. Napr. súčet dvoch vektorov, ktoré majú rôznu dĺžku, operácie s maticami, ktoré majú rôzne typy/dimenzie. Je podstatné správne pochopiť, ako program R v takýchto prípadoch funguje. Zabráni sa možným problémom v budúcnosti a v mnohých prípadoch to zase na druhu stranu može zjednodušiť výpočet a ušetriť čas.

  • Štandardné operácie v programe R získame pomocou štandardných znamienok +, -, *, \, a symbolu ^ pro mocniny;
  • V programe R existuje niekoľko prikazov, ktoré vytvoria vektor: napr. c(), seq(), rep(), replicate() a pod.;
  • Podobne existuje niekoľko príkazov, ktoré vytvoria maticu: napr. cbind(), rbind(), matrix(), data.frame() a pod.;
  • Ku každému príkazu v R je k dispozícii návod, ako príkaz funguje - help sa zavolá zadaním samotného príkazu, ktorému predchádza otazník: napr. ?c(), ?seq(), ?rep();


2. Práca s vektormi a maticami

V prípade, že máme v objektoch uložené nejake štruktúry (vektor, maticu, pole, list, atď.), je možné sa v Rku odkazovať aj na jednotlivé elementy v daných objektoch.

v3[1] ### zobrazi prvu zlozku vektora v3
v3[-c(2,3)] ### rovnaky vystup, vektor v3 bez druhej a tretej zlozky

A to isté platí aj pre matice (a analogicky aj pre pole).

m1 <- rbind(v3, v3 * 2, v3 * 3)
m1[1:2,1:2] ## elementy z prveho a druheho riadku a stlpca matice m1

Príkazy je možné ľubovoľne kombinovať a vytvárať nové, zložitejšie objekty.

m2 <- rbind(cbind(m1[1:2,1:2], c(0,0)), seq(10,11, length = 3))
l1 <- list(m1, m2) ## list, ktory obsahuje dve rozne matice, m1 a m2
l1[[2]][1,] # vypise na obrazovku prvy riadok matice m2 



Užitočné


  • Pre maticové násobenie je užitočné poznať operátor %*%, ktorý výnasobi dve matice (ak majú správne rozmery). Vhodnosť rozmerov sa jednoducho skontroluje pomocou príkazu dim() (užitočne je poznať tiež príkazy nrow() a ncol()).
  • Štandardne binárne operátory +, -, *, /, ^ fungujú ‘po zložkách’ - toto ‘fungovanie’ je ale R-špecifické - porovnajte nasledujúce výstupy:

    1:4 + 1 ### sucet po zlozkach
    1:4 * 1:2 ### nasobenie po zlozkach v paroch (dlzka jedneho vektora je celociselny nasobok dlzky druheho)
    1:4 / 1:4 ### nasobenie v paroch (rovnake dlzky oboch vektorov)
    1:5 + 1:2 ## Error - preco?


3. Náhodné data - generátory náhodných čísel

Program R je primárne štatistický nástroj - umožňuje preto aj prácu s náhodnymi hodnotami. Implementované je celá rada rôznych generátorov náhodných čísel. Pre rôzne pravdepodobnostné rozdelenia sú k dispozícii príslušne generátory, ktoré simulujú náhodné hodnoty z daného pravdepodobnostného rozdelenia.

  • Diskrétne rozdelenia: rbinom(), rpois(), rgeom(), a ďalšie;
  • Spojité rozdelenia: runif(), rexp(), rnorm(), a ďalšie;

Pre správne použitie geneátorov je potrebné preštudovať prislušný návod - napr. ?rnorm zobrazí help pre generátor náhodných čísel s normálnym rozdelením. Je vhodné si tiež všimnúť, že existujú podobné príkazy, označené ako pnorm(), dnorm() a rnorm(), ktoré postupne značia distribučnú funkciu daného rozdelenia, hustotu a kvantilovú funkciu.

Užitočné


  • Je nutné dôsledne si preštudovať implementáciu jednotlivých generátorov a funkcií, ktoré súvisia s pravdepodobnostnými rozdeleniami - je totiž pomerne časté, že parametre, ktoré špecifikujú nejaké rozdelenie, majú iný význam. Napríklad:

    rnorm(10, 0, 2) ## simuluje 10 pozorovani z N(0, 4) - sigma^2 = 4
    rexp(10, 4) ## simuluje 10 pozorovani z Exp(lambda = 4), kde EX = 1/4


4. Reálne data - načítanie vlastných datových súborov

V prvom rade, v programe R je k dispozícii niekoľko skutočných datových súborov. Ich zoznam je možne zobrazit zavolaním príkazu data(). Konkrétny datovy súbor následne zobrazíme pomocou názvu prislušného súboru - napr. Orange. Vo väčšíne sa jedná o data.frame - resp. datovu maticu. Na rozdiel od klasickej matice umožňuje data.frame rôzne datové typy v jednotlivých stĺpcoch.

stlpec1 <- seq(1:5)
stlpec2 <- c(rep("male", 3), rep("female", 2))
stlpec3 <- c("a", "b", "c", "d", "e")

### nie je mozne vytvorit maticu
cbind(stlpec1, stlpec2, stlpec3)
### ale je mozne vytvorit data.frame
data.frame(stlpec1, stlpec2, stlpec3)

K načítaniu vlastných datových súborov slúži niekoľko príkazov. V programe R je technicky možné načítať vpodstate akýkoľvek datovy súbor (txt, csv, xls, ale aj jpg, png, mp3 a mnoho ďalších). Najčastejšie používané sú read.table() a read.csv(), ktoré vyžaduju súbor uložený vo formáte txt resp. csv. Dodatočné parametre je možné využiť pri volani príkazu - tieto parametre upresňujú format súboru a spôsob načítania do R. Viac podrobnosti v príslušnom helpe ?read.table prípadne ?read.csv.

Užitočné


  • Program R umožňuje priamo načítať aj online zdroje. Potrebné je iba špecifikovať link a použiť vhodny príkaz. Napríklad:
test.data <- read.table("http://www.karlin.mff.cuni.cz/~maciak/NMSA407/NMSA407-1617-HW1.txt", header=T)


5. Štatistická analýza dat

V programe R máme momentálne v objekte test.data načítaný datový súbor. Jedné sa o niekoľko pozorovaní a niekoľko sledovaných premenných. Niečo o datovom súbore zistíme pomocou nasledujúcich príkazov:

dim(test.data)
## [1] 180   7
head(test.data)
##   hitchhikers travelDistance driverGender country waitingTime carNumber
## 1    two guys         < 50km         male      CZ          10        NA
## 2    two guys      100 - 500         male   other          34        NA
## 3    two guys      100 - 500       female       D          30        NA
## 4    two guys      100 - 500         male       D          45        NA
## 5    two guys         < 50km         male       D          30        NA
## 6    two guys         < 50km         male       D          45        NA
##   dayNight
## 1      day
## 2      day
## 3    night
## 4      day
## 5      day
## 6      day
summary(test.data)
##      hitchhikers    travelDistance driverGender    country  
##  single guy:143   100 - 500:49     female: 23   CZ     :63  
##  two guys  : 37   > 500km  : 8     male  :157   F      :32  
##                   50 - 100 :25                  FIN    :16  
##                   < 50km   :98                  other  :14  
##                                                 D      :11  
##                                                 ES     :11  
##                                                 (Other):33  
##   waitingTime       carNumber       dayNight  
##  Min.   :  0.00   Min.   :   1.0   day  :156  
##  1st Qu.: 10.00   1st Qu.:   6.0   night: 24  
##  Median : 30.00   Median :  31.5              
##  Mean   : 51.58   Mean   : 148.5              
##  3rd Qu.: 55.00   3rd Qu.: 137.2              
##  Max.   :720.00   Max.   :1538.0              
##                   NA's   :42

Na jednotlivé premenné sa môžeme odkazovať pomocou ich názvu. Môžeme takto spočítať základne emirické charakteristiky pre jednotlivé premenné. V programe R je k tomu celá rada rôznych funkcii: mean(), median(), min(), max(), sd(), var(), a mnoho ďalších. Pomocou helpu naštudujte, k čomu jednotlivé funkcie slúžia, ako sú v R implementované a nájdite ďalšie užitočné funkcie, ktoré sú vhodné pre základnú štatisticku analýzu dat.

mean(test.data$waitingTime)

Analogicky, ako v prípade vektorov a matíc môžeme odkazovať len na určitú časť datového súboru a spočítať empirické charakteristiky len pre konkrétnu skupinu:

mean(test.data$waitingTime[test.data$driverGender == "male"])
mean(test.data$waitingTime[test.data$driverGender == "female"])



Užitočné


  • Pomocou helpu naštudujte, k čomu slúžia funcie apply(), tapply(), aggregate() a by();
  • Použijte tieto funkcie v súvislosti s datovým súborom ‘test.data’ a pomocou nich spočítajte niektoré empirické charakteristiky;
  • V pripade, že pracujeme v programe R len s jednym datovým súborom, je možné prácu (resp. implementáciu príkazov) mierne zjednodušiť - pomocou príkazu attach(test.data) program R zprístupni jednotlivé premenné, ktoré je potom možne volať priamo pomocou ich názvu:

    attach(test.data)
    mean(waitingTime[driverGender == "male"])
    mean(waitingTime[driverGender == "female"])
    V prípade, že takto zprístupnene premenné už neplánujeme využívať, je dobre využiť komplementárny príkaz detach().
  • Je dôležité správne pochopiť fungovanie Rka a odkazovanie na premenné po použití príkazu attach(). Program R totiž zprístupni premenne v stave, v akom sa v momente volania príkazu attach() aktuálne nachádzaju v data.frame. Akýkoľvek následný zásah do data.framu a zmena hodnôt v ňom, nebude reflektovaná ak sa na premennu odkážeme pomocou jej názvu a nie priamo cez odkaz na data.frame;


6. Príprava a programovanie vlastných skriptov

Štatistický program R slúži aj ako výborný programovací jazyk: pomocou tohto programu je možné naprogramovať takmer akúkoľvek úlohu. Je pri tom užitočné poznať rôzne nástroje a konkrétne funkcie, ktoré k tomuto účelu môžu poslúžiť (napr. implementácia cyklov for a while, alebo overovanie podmienok pomocou if).

  • for cyklus:

    for (i in 1:10){
      print(1:i)
    }
  • while cyklus:

    i <- 1
    while (i < 10){
      print(1:i)
      i <- i + 1
    }
  • overovanie podmienky pomocou if

    N <- rpoiss(1)
    if (N %% 2 == 0){
      print("Sude cislo")
    } else {
      print("Liche cislo")
    }

Pri používaní cyklov je dôležité dôsledne skontrolovať skript - môže sa totiž veľmi jednoducho stáť, že program R neúmyselne zacyklíme. V takom prípade je dobré poznať klávesovú skratku CTR + C (v konzole programu R), prípadne ESC v interface RStudio.



Užitočné


  • Jednotlivé príkazy je možné v programe R vzájomne kombinovať a vytvárať z nich komplexné Rkové skripty. K dispozícii je samozrejme mnoho ďalších nástrojov určených k pokročilému programovaniu (viď napr. help a rôzne tutoriály).


7. Práca s textom (regular expressions)

Program R je taktiež výborne prispôsobený na prácu s textom, čo môže byť užitočné hlavne v prípadoch, že sme nútený spracovať nejaký dátový súbor a pripraviť si ho k analýze. Program R pracuje na úrovni tzv. regular expressions, čím sa rozsah môžnosti používania programu R na prácu textu výrazne rožiruje. Zaujímavý návod, rôzné ukážky a praktické rady, ako pracovať s textom v Rku, je k dispozícii na stránke http://gastonsanchez.com/.



Užitočné


  • Zaujímavé príkazy na prácu s textom sú napr.: paste(), strsplit(), grep(), sub(), match() a mnoho jiných.
  • Pomocou helpu k jednotlivých Rkovým funkciám zistite, čo dané funkcie robia a ako sú implementované. Na jednoduchých príkladoch ich skúste aplikovať.





Domáca úloha

(Deadline: 2. cvičenie | Po: 23.10.2018)

Z datových súborov, ktoré sú defaultne k dispozícii v štandardnej inštalácii programu R (zoznam sa zobrazí po zadaní príkazu data()) si vyberte jeden datový súbor, ktorý obsahuje aspoň dve numerické (spojité) premenné a aspoň dve kategorické (faktorové) premenné.

  • V programe R si pripravte jednoduchý skript, v ktorom spočítate základne popisné charakteristiky vo Vami zvolených dátach.
  • Využijte faktorové premenné a pomocou nich definujte podskupiny, v ktorých taktiež spočítate príslušné výberové charakteristiky.
  • Výsledný R skript si uložte (napr. ako ‘Rskript.R’, alebo plain txt ‘Rskript.txt’). V prípade, že si skript uložíte ako ‘R script’ (súbor ‘menoSuboru.R’), je možné tento súbor priamo načítať do programu R pomocou príkazu source("menoSuboru.R").
    Po načítaní súboru program automaticky spracuje predpripravené príkazy.