<table width = 900 border = 0><tr><td>
# <b>NMSA230 - 	Úvod do programování v R</b>
### Zimný semester 2019/2020 | Cvičenie 2 | St 23/10/19

**************
**************

## <font color = "#880000"><b>II. Data a základné popisné charakteristiky v R</b></font>

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

<a href = "https://www.r-project.org">https://www.r-project.org</a>

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 <a href = "https://cran.r-project.org/mirrors.html">https://cran.r-project.org/mirrors.html</a>). 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 <a href = "https://www.rstudio.com">RStudio</a>.<br><br>

<b>Užitočné materiály pre prácu so štatistickým softwarom <i>R</i></b><br>
		
<ul>
<li>Bína, V., Komárek, A. a Komárková, L.: <i>Jak na jazyk R.</i>  (<a href = "NMFM301/Rmanual2.pdf">PDF súbor</a>)</li>
<li>Komárek, A.: <i>Základy práce s R.</i>  (<a href = "http://msekce.karlin.mff.cuni.cz/~komarek/vyuka/dataRko/Rmanual1.pdf">PDF súbor</a>)</li>
<li>Kulich, M.: <i>Velmi stručný úvod do R.</i> (<a href = "NMFM301/uvodr.pdf" >PDF súbor</a>)</li>
<li>De Vries, A. a Meys, J.: <i>R for Dummies.</i> (ISBN-13: 978-1119055808) </li>		
</ul>

<br><br>

### <font color = "#880000">1. Práca s datovými súbormi</font>
V programe R je štandardne k dispozícii množstvo vzorových datových súborov rôzných formátov a typov. Zoznam týchto datových suborov sa získa 
zavolaním príkazu `data()`. Na konkrétny datový súbor sa následne odkazuje pomocou mena príslušného datového súboru. 
```{r, eval = FALSE}
rm(list = ls())
Orange
```

Reálne datové súbory bývajú prevažne reprezentované prostredníctvom tabuliek (tzv. datových matíc) s množstvom ríadkov (väčšinou jednotlivé pozorovania) a stĺpcov (väčšinou sledované premenné). 
Nie vždy je možné celkový datový súbor zobraziť na obrazovke, preto je užitočné poznať niektoré príkazy, prostredníctvom ktorých sa o datach dozvieme tie podstatné informácie. 
V praxi sa ale bežne stane, že samotné data je potrebné vyrazne upraviť/modifikovať/prispôsobiť tak, aby bolo možné s nimi efektívne pracovať. Príprava datového súboru je prvý a nutný krok pred samotnou 
štatistickou analýzou. 

```{r}
test.data <- read.table("http://www.karlin.mff.cuni.cz/~maciak/NMSA407/NMSA407-1617-HW1.txt", header=T)
```

```{r, eval = FALSE}
dim(test.data) ### velkost datoveho suboru: pocet pozorovani a pocet sledovanych premennych
str(test.data) ### struktura a typ jednotlivych premennych
head(test.data) ### niekolko prvych pozorovani
summary(test.data) ### zakladne popisne charakteristiky polohy
```

V prípade, že pracujeme pouze s jednym datovým súborom, je možne odkazovať sa na jednotlivé premenné aj pomocou príslušného názvu premenných. 
Potrebný je príkaz `attach()` (záleží tiež od konkrétnej verzie programu R), ktorý volanie prostredníctvom názvu premenných umožní. 
Porovnajte výstup dvoch nasledujúcich časti zdrojového kódu 
```{r, eval = FALSE}
table(hitchhikers)
table(test.data$hitchhikers)
```

a
```{r, eval = FALSE}
attach(test.data)
table(hitchhikers)
```

S jednotlivými premennými môžeme v Rku následne jednoducho pracovať a podľa potreby si ich upravovať, prípadne definovať nové premenné (resp. rôzne datové podsúbory). 
Užitočný príkaz pre manipuláciu s premennými a definíciu nových premenných je príkaz `transform()`.

```{r}
test.data <- transform(test.data, driverCZ = factor(1*(driverGender == "male") + 2*(driverGender == "female"), labels = c("M", "Z")))

test.data <- transform(test.data, distance01 = factor(1*(travelDistance != "> 500km") + 2*(travelDistance == "> 500km"), labels = c("short_trip", "long_trip")))

test.data <- transform(test.data, waitingTimeHours = ceiling(waitingTime/60))
```


```{r}
head(test.data)

table(test.data$driverCZ, test.data$driverGender)
table(test.data$distance01, test.data$travelDistance)
table(test.data$waitingTimeHours, test.data$waitingTime)[,1:20]
```

Všimnite si, že na pôvodné premenné je naďalej možné odkazovať sa pomocou ich názvu, ale nové premenné týmto spôsobom sprístupnené nie sú. 
Z praktického hľadiska je vždy výhodnejšie odkazovať sa na premenné pomocou odkazu na konkrétny datov súbor - väčšinou totiž pracujeme s viacerými 
datovými súbormi naraz a zabráni sa takto nechcenej zámene, ktorú často ani nemusíme zaregistrovať. V prípade, že pracujeme pouze s jedným datovým súborom, postači opätovne zavolať príkaz 

```{r, eval = FALSE}
attach(test.data)
```

V programe R môžeme pracovať s datovými súbormi rôznych formátov a rôznych typov. Najčastejšie používané príkazy pre načítanie datového súboru z disku
sú `read.table()` a `read.csv()`. K načítaniu datového súboru, ktorý je typický pre program R (súbor typu <i>.RData</i>) slúži príkaz `load()`. 
Hlavne prvé dva príkazy používajú množstvo rôznych parametrov, ktorými sa da presne špecifikovať konkrétny spôsob, ako data načítať (často používané parametre 
sú napr. <i>header = </i>, <i>sep = </i>, <i>dec = </i>, <i>na.string = </i>, <i>as.is = </i>, <i>row.names = </i>, <i>col.names = </i> a mnoho ďalších). 


Porovnajte napr. nasledujúce dva príkazy:

```{r, eval = FALSE, eval = FALSE}
tempData <- read.table("testData.txt", header = T, sep = ";", dec = ".")
tempData <- read.table("testData.txt", header = F, sep = ".", dec = ";", skip = 1)
```

<br><br>
  
#### <font color = "#880000">Užitočné</font>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<ul>
<li> Pre správne načítanie datového súboru je nutné poznať data a vedieť, ako sú uložené a akým spôsobom sú reprezentované (napr. ako sú označené chýbajúce pozorovania, 
aký znak sa používa na oddelenie desatinných miest, a pod.);</li>
<li> Užitočné príkazy pre prácu sa datami a manipuláciu s premennýmu sú aj `class()`, `factor()`, `as.factor()`, `as.character()`, `as.numeric()` a ďalšie. Pužijte help 
k jednotlivým príkazom a podívajte sa spôsob ich implemenácie, ilustračné príklady aplikácie a dotatočne podobné funkcie v referenciách;</li>
<li> Pomocou dodatočných knižníc je môžne načítať aj súbory z Excelu (príkaz `read_excel()` z knižnice `library("readxl")`), z SQL databázy (knižnica `library(dbplyr)`) 
mnoho ďalších typov súborov, vrátane obrázkov, videí, alebo mp3 súborov;</li>
</ul>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<br>



### <font color = "#880000">2. Základné popisné charakteristiky</font>


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 (intuitivne implementovaných) funkcii: `mean()`, `median()`, `min()`, `max()`, `sd()`, `var()`, a mnoho ďalších. 
Pomocou helpu k jednotlivých príkazom 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. 

```{r, eval=FALSE}
mean(test.data$waitingTime)
```

Užitočný je aj samotný príkaz `summary()`, avšak ten poskytuje pouye popisné charakteristiky pre polohu (t.j., výberový priemer, výberový médian, výberové kvartily) a neposkytuje žiadnu informáciu o variabilite dat (napr. výberový rozptyl, výberová směrodatná odchýlka, výberové mezikvartilové rozpětí a pod.). Z tohto dôvodu nie je použitie príkazu  `summary()` postačujúce a je nutné doplniť ho o nejakú informáciu o volatilite. 

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: 

```{r, eval=FALSE}
mean(test.data$waitingTime[test.data$driverGender == "male"])
mean(test.data$waitingTime[test.data$driverGender == "female"])
```



Popisné charakteristiky je možné štrukturovať v závislosti na príslušnosti k nejakej skupine (konkrétna úroveň nejakéj faktorovej premennej). 

```{r, eval=FALSE}
with(test.data, tapply(waitingTime, driverCZ, summary))
with(test.data, tapply(waitingTime, country, summary))
```

alebo dokonca vytvárať vlastné špecifické výstupy pomocou vlastných pred-definovaných funkcii: 


```{r}
F1 <- function(x){
  temp <- round(c(min(x), mean(x), max(x), var(x), quantile(x, prob = 0.9)), 3)
  names(temp) <- c("Minimum", "Priemer", "Maximum", "Rozptyl", "90% kvantil")
  return(temp)
}

with(test.data, tapply(waitingTime, driverCZ, F1))
```

U kategorických (resp. faktorových) premenných nie je štandardné uvádzať klasické výberové popisné charakteristiky. Namiesto toho je vhodne uviesť absolútne a relatívne počty 
v jednotlivých kategóriach. 

```{r}
table(test.data$country) ## absolutne pocty
table(test.data$country)/length(test.data$country) ## relativne pocty
```

Prehľadnejšia forma zápisu:
```{r, eval = F}
round(table(test.data$country)/length(test.data$country), 2)
```

Prípadne viac štrukturované tabuľky vzhľadom k viacerým kategorickým premenným: 
```{r, eval = F}
with(test.data, tapply(driverCZ, hitchhikers, table))
```
 prrípadne relatívne počty, ktoré bývajú na prvý pohľad viac výpovedné: 
```{r, eval = F}
F2 <- function(x){
  temp <- format(round(table(x)/length(x), 2), nsmall = 2)
  return(temp)
}

with(test.data, tapply(driverCZ, hitchhikers, F2))
```
<br><br>

#### <font color = "#880000">Užitočné</font>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<ul>
<li> Pomocou helpu sa podívajte na príkaz `subset()` a vyskúšajte, ako funguje;</li>
<li> Pomocou helpu naštudujte, k čomu slúžia funcie `apply()`, `tapply()`, `lapply()`,  `aggregate()` a `by()`;</li>
<li> Užitočné príkazy pra prácu s datami sú aj `order()` a `sort()`;</li>
<li> Použijte tieto funkcie v súvislosti s datovým súborom 'test.data' a pomocou nich spočítajte niektoré empirické charakteristiky;</li>
<li> 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)`. V prípade, že takto zprístupnene premenné už neplánujeme využívať, je dobre využiť komplementárny príkaz `detach()`.
</li>
<li> Je dôležité správne pochopiť fungovanie Rka a odkazovanie na premenné po použití príkazu `attach()`. Program R totiž zprístupní premenné 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 premennú odkážeme pomocou jej názvu a nie priamo cez odkaz na data.frame;</li>
</ul>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<br>


### <font color = "#880000">3. Príprava a programovanie vlastných skriptov</font>
Štatistický program R slúži aj ako samostatný 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 <i>for</i> a <i>while</i>, 
alebo overovanie podmienok pomocou <i>if</i>).

<ul>
<li><b><i>for</i> cyklus:</b><br>
```{r, eval=FALSE}
for (i in 1:10){
  print(1:i)
}
```
</li>
<li><b><i>while</i> cyklus:</b><br>
```{r, eval=FALSE}
i <- 1
while (i < 10){
  print(1:i)
  i <- i + 1
}
```
</li>
<li><b>overovanie podmienky pomocou <i>if</i></b><br>
```{r, eval=FALSE}
N <- rpoiss(1)
if (N %% 2 == 0){
  print("Sude cislo")
} else {
  print("Liche cislo")
}
```
</li>
<li><b>rozlíšovanie prípadov pomocou <i>else if</i></b>
```{r, eval=FALSE}
if (x < 0) {
print("Zaporne cislo")
} else if (x > 0) {
print("Kladne cislo")
} else
print("Nula")
```
</li></ul>

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. 

<br><br>

Uvedené cykly môžu byť užitočné napr. pri skúmaní dat, počítaní popisných charakteristík pre jednotlivé premenné a podobne. 

```{r, eval=FALSE}
vars <- names(test.data) ### premenne v datach
Nvars <- vars[c(5,6)]

for (var in Nvars){
  print(paste("Popisne charakteristiky pre promennu", var, sep = " "))
  print(F1(test.data[!is.na(test.data[, var]), var]))
  print("-------------------------------------------------------")
}
```

Jednotlivé výstupy ale dostaneme aj samostatne pomocou dvojice príkazov: 

```{r, eval=FALSE}
F1(test.data[, c("waitingTime")])
F1(test.data[!is.na(test.data[, "carNumber"]), "carNumber"])
```

Vo väčšine prípadov je možné požadované riešenie (požadovaný výstup) získať aj bez pomocu cyklov, 
pouze s využitím štandardne implementovaných R-kových príkazov a funkcii. 

<br><br>

#### <font color = "#880000">Užitočné</font>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<ul>
<li> 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).</li>
</ul>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<br>





## <font color = "#880000"><b>Domáca úloha</b></font>
### (Deadline: 3. cvičenie | Po: 06.11.2018)

Použijte datový súbor, ktorý ste si pripravili v predchádzajúcej domácej úlohe a urobte nasledujúce:

<ul>
<li> Pomocou príkazu `transform()` vytvorte dve ďalšie premenné. </li>
<li> Vytvorte si vlastnú funkciu a pomocou tejto funkcie spočítajte niektoré základné popisné charakteristiky k aspoň dvom premenným.</li>
<li> Využijte príkaz `with()` a urobte stejné popisné charakteristiky, ale rozdelené do skupín príslušných niektorej faktorovej premennej. </li>
</ul>

<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<hr size="3" width="100%" noshade style="color:#440000" align="left" />

<br><br>
</td></tr></table>
<br><br><br><br><br>