##########################################################################################
################################## SOFTWARE R - CAST 1 ###################################
##########################################################################################

# software R volne stazitelny z https://cran.r-project.org/
# RStudio volne stazitelne z https://www.rstudio.com/products/rstudio/download

# Nastaveni pracovniho adresare (kam se budou ukladat data/skripty) 
getwd() # zjistime aktualni nastaveni 
setwd("c:/Users/Desktop/vyuka/2018/FSTA/01_cviceni_popis_dat")# zmenime aktualni nastaveni (nezapomente zamenit lomitka: "\" za "/")

###########################################################################
###############         Nacteni dat a jejich kontrola       ###############
###########################################################################

readLines("Data_pro_R.txt",3) # nacteni prvnich 3 radku textoveho souboru
# prikaz readLines vhodny na zkontrolovani:
# 1) typu oddelovace sloupcu - zde tabulator -> v read.table bude: sep="\t"
# 2) zda jsou v souboru pouzity desetinne carky ci tecky - zde tecky -> v read.table bude: dec="."
# 3) zda ma soubor hlavicku - zde ma soubor hlavicku -> v read.table bude: header=T

kardio <- read.table(file="Data_pro_R.txt", sep="\t", dec=".", header=T) # nacteni dat

dim(kardio)                       # pocet radku a sloupcu datove matice
nrow(kardio)                      # pocet radku datove matice
ncol(kardio)                      # pocet sloupcu datove matice
names(kardio);colnames(kardio)    # nazvy promennych
row.names(kardio)                 # nazvy radku v datove matici
head(kardio)                      # prvnich 10 radku tabulky
tail(kardio)                      # poslednich 10 radku tabulky
str(kardio)                       # sumarni informace o jednotlivych promennych
attach(kardio)                    # na jednotlive promenne v tabulce se nemusime odkazovat napr. pomoci kardio$pohlavi, ale pouze pohlavi
is(kardio);class(kardio)          # typ objektu

# cilene byla u prvniho pacienta nahrazena vyska 150 cm za text "stopadesat"
# promennou R nacte jako factor - ordinalni promennou - nutno prevest na numerickou
kardio$vyska
mean(kardio$vyska)

# jak prevest factor na numeric - spatne! 
kardio$vyska_numeric<-as.numeric(kardio$vyska)
kardio$vyska_numeric
mean(kardio$vyska_numeric)


# jak prevest factor na numeric - spravne! 
kardio$vyska_character_numeric<-as.numeric(as.character(kardio$vyska))
kardio$vyska_character_numeric
kardio$vyska_character_numeric[1]<-150 #doplni puvodni spravnou hodnotu
mean(kardio$vyska_character_numeric)
kardio$vyska<-kardio$vyska_character_numeric #nahradi puvodni promennou novou se spravnymi hodnotami
mean(kardio$vyska)

###########################################################################
###############   Vyhledavani funkci a napoveda k funkcim   ###############
###########################################################################

# vyhledavani funkci - 2 ekvivaletni zpusoby:
help.search("read")
??read

# napoveda k funkcim - 2 ekvivaletni zpusoby:
help(read.table)
?read.table

## Ukol 1: Pomoci napovedy zjistete, jak je mozne vypsat prvnich 20 radku tabulky.
# Reseni:


?head
head(kardio,n=20L) # z napovedy 
head(kardio,20) # jednodussi zpusob

###########################################################################
###############                  Indexovani                 ###############
###########################################################################

# vypsani hodnot veku u vsech pacientu (nasledujici 3 prikazy jsou ekvivalentni):
kardio$vek 
kardio[,"vek"]
names(kardio)
kardio[,2]

# vypsani hodnot veku u prvnich 10 pacientu (nasledujici 3 prikazy jsou ekvivalentni):
kardio$vek[1:10]
kardio[1:10,"vek"]
kardio[1:10,2]

# vyber vsech sloupcu krome prvniho:
dim(kardio)
names(kardio)
kardio.pom <- kardio[,-1]
dim(kardio.pom)
names(kardio.pom)


# vyber vsech sloupcu krome druheho a pateho
kardio.pom <- kardio[,-c(2,5)]
dim(kardio.pom)
names(kardio.pom)

# vytvoreni nove datove tabulky, kde budou pouze zeny (nasledujici 2 prikazy jsou ekvivalentni):
kardio.zeny <- kardio[which(kardio$pohlavi_rek=="Z"),]
kardio.zeny <- subset(kardio,pohlavi_rek=="Z")
dim(kardio.zeny)

## Ukol 2:
# 1. Vytvorte datovou tabulku, ktera bude obsahovat pouze muze. Kolik ma tato nova tabulka radku (tzn. kolik je muzu v souboru)?
# 2. Vytvorte datovou tabulku, ktera bude obsahovat parametry: id, vek, pohlavi_rek
# 3. Vypiste hodnoty vahy u 50. az 70. pacienta.
# 4. Vypiste hodnoty pohlavi u 5., 12. a 40. pacienta (pouzijte promennou pohlavi_rek).
# 5. vypiste hodnoty vysky u kazdeho 10. pacienta (napoveda: vyuzijte funkce "seq").

## Reseni:
# ad 1.
kardio.muzi <- subset(kardio,pohlavi_rek=="M")
dim(kardio.muzi) # 30
# ad 2.
names(kardio) # na zkontrolovani, kolikate sloupce jsou id, vek a pohlavi_rek
kardio.pom <- kardio[,c(1,2,5)]
kardio.pom <- kardio[,c("id","vek","pohlavi_rek")]
head(kardio.pom)
# ad 3.
kardio$vaha[50:70]
# [1]  68 112  78  60  58  60  84  71  52  89  70  64  45  73  85  85  64  70  86  68  99
# ad 4.
kardio$pohlavi_rek[c(5,12,40)]
# [1] M Z Z
# ad 5.
kardio$vyska[seq(10,nrow(kardio),by=10)]
# [1] 164 176 173 165 175 175 179 170 172

###########################################################################
###############        Pridani a odstraneni promenne        ###############
###########################################################################

# pridani promenne (nasledujici 2 prikazy jsou ekvivalentni):
kardio$log.vaha <- log(kardio$vaha)
kardio <- transform (kardio, log.vaha=log(vaha))
dim(kardio)
names(kardio)

# odstraneni promenne (nasledujici 2 prikazy jsou ekvivalentni): 
kardio$log.vaha <- NULL      
kardio <- kardio [,-ncol(kardio)]      
dim(kardio)
names(kardio)

## Ukol 3: 
## Pridejte do datove tabulky promennou s vyskou v metrech ("vyska" obsahuje hodnoty v cm).

## Reseni:
kardio$vyska.m <- kardio$vyska/100 # 1. zpusob
kardio <- transform(kardio, vyska.m = vyska/100) # 2. zpusob

###########################################################################
#########      Sumarizace promennych - prvni pohled na data       #########
###########################################################################

# sumarizace kategorialnich promennych:
summary(kardio$pohlavi)           # je patrne, ze u jedne zeny je misto "Z" zadano "F" - vytvorila jsem proto novou promennou "pohlavi_rek", ktera obsahuje jen "Z" a "M" (pozdeji si ukazeme, jak promennou "pohlavi_rek" vytvorit)
summary(kardio$pohlavi_rek)
levels(kardio$pohlavi_rek)        # vypise jen kategorie

# sumarizace spojitych promennych:
summary(kardio$vek)               # je patrne, ze funkce summary pozna typ promenne a podle toho vypise vysledek sumarizace
summary(kardio$vek_chybny)        # co je na promenne vek_chybny spatne? Je tam odlehla hodnota - vsimnete si, ze median zustava stejny, ale prumer se hodne zmeni

# bez ohledu na typ promennych lze aplikovat na cely datovy soubor:
summary(kardio)

## Ukol 4: Sumarizujte vysku.
## Reseni:
summary(kardio$vyska) 

###########################################################################
#############       Vizualizace promennych pomoci grafu       #############
###########################################################################

############# vizualizace kategorialnich promennych:

# kolacovy graf
pie(summary(kardio$pohlavi_rek))  
pie(summary(kardio$pohlavi),clockwise=T,init.angle=90)

# sloupcovy graf
kardio$vzdelani<-factor(kardio$vzdelani,levels=c("zakladni","stredoskolske","vysokoskolske"))# prekodovani, aby sly kategorie logicky za sebou
barplot(summary(kardio$vzdelani),xlab="Vzdelani",ylab="Pocet pacientu",ylim=c(0,60)) 

############# vizualizace spojitych promennych:

boxplot(kardio$vaha)              		# krabicovy graf
boxplot(kardio$vek_chybny)        		# je patrne, ze je tu odlehla hodnota
boxplot(kardio$vaha~kardio$pohlavi_rek)   # krabicovy graf vahy podle pohlavi

hist(kardio$vaha)                 		# histogram (pocet sloupcu je vypocitan pomoci Sturgesova pravidla)
hist(log(kardio$vaha))            		# histogram pro zlogaritmovanou vahu
hist(kardio$vek_chybny)

# vykresleni histogramu s krivkou hustoty normalniho rozdeleni a jeho ulozeni:

dev.new(width=8,height=7,noRStudioGD = TRUE)  # otevre nove graficke okno
# zapnuti nahravani historie vykreslenych grafu: kliknout na graficke okno -> History -> Recoding (pomoci Page Up/Down preskakuje mezi grafy))

x <- kardio$vyska
h<-hist(x, breaks=10, col="yellow", xlab="vyska",
        main="Histogram s krivkou hustoty normalniho rozdeleni")# vykresli hostogramu
xfit<-seq(min(x),max(x),length=40)
yfit<-dnorm(xfit,mean=mean(x),sd=sd(x))
yfit <- yfit*diff(h$mids[1:2])*length(x)
lines(xfit, yfit, col="blue", lwd=2) # prolozi gaussovu krivku

savePlot("Graf_01", type="jpg", device = dev.cur(),restoreConsole = TRUE)# ulozi graf
dev.off() # zavre okno

## Ukol 5.
# 1. Vykreslete krabicovy graf veku podle pohlavi, ktery bude mit cervenou barvu pro zeny a modrou pro muze.
# 2. Vykreslete kolacovy graf pro koureni (napoveda: numerickou promennou je nutne prevest na faktor pomoci funkce factor
# s parametry levels=c(0,1,2),labels=c("nekurak","prilezitostny kurak","kurak") ).

## Reseni:
# ad 1.
boxplot(kardio$vek~kardio$pohlavi_rek,col=c("blue","red"))
# ad 2.
pie(summary(factor(kardio$koureni,levels=c(0,1,2),labels=c("nekurak","prilezitostny kurak","kurak"))),clockwise=T,init.angle=90)

###########################################################################
#############              Rekodovani promennych              #############
###########################################################################

# vytvoreni nove promenne "pohlavi_rek2", ktera bude obsahovat pouze hodnoty "Z" a "M":
summary(kardio$pohlavi)
kardio$pohlavi_rek2 <- kardio$pohlavi # rekodovani nove promenne
kardio$pohlavi_rek2[which(kardio$pohlavi=="F")] <- "Z" 
table(kardio$pohlavi_rek2) # overeni, ze promenna pohlavi_rek2 obsahuje pouze hodnoty "Z" a "M"

# vytvoreni kategorii ze spojite promenne:
kardio$vek.2kat <- kardio$vek>=50 # vytvoreni dvou kategorii: 0(FALSE)...<50, 1(TRUE)...>=50
table(kardio$vek.2kat) #overeni
kardio$vek.3kat <- 1+(kardio$vek>=30)+(kardio$vek>=50) # vytvoreni trech kategorii: 1...<30, 2...30-50, 3...>=50 
table(kardio$vek.3kat) #overeni

# slouceni kategorii u kategorialni promenne:
install.packages("car")
library(car) 

table(kardio$cel_chol_norma,useNA="ifany") # 0...pod normou, 1...v norme, 2...nad normou, <NA>...chybejici hodnota
kardio$cel.chol.mimo.normu <- recode(kardio$cel_chol_norma,'c(0,2)=1;1=0;else=99') # 0...v norme, 1...mimo normu, 99...chybejici hodnoty
table(kardio$cel.chol.mimo.normu)

## Ukol 6. 
# 1. Kategorizujte pacienty dle promenne "vaha" do tri kategorii: 1...<60, 2...60-80, 3...>80.
# 2. Rekodujte promennou "pohlavi" tak, aby muzi meli hodnotu 1 a zeny hodnotu 0.

## Reseni:
# ad 1.
kardio$vaha.3kat <- 1+(kardio$vaha>=60)+(kardio$vaha>80) # vytvoreni tri kategorii: 1...<60, 2...60-80, 3...>=80 
table(kardio$vaha.3kat)
# ad 2.
kardio$pohlavi_01 <- recode(kardio$pohlavi,'c("F","Z")=0;"M"=1;else=99')
summary(kardio$pohlavi_01)


###########################################################################
#####################        Popisne statistiky       #####################
###########################################################################

############### Popisna statistika kategorialnich promennych ##############

# frekvencni tabulka pro jednu promennou:
table(kardio$pohlavi_rek,useNA="ifany") # frekvencni tabulka - pocty
prop.table(table(kardio$pohlavi_rek))   # frekvencni tabulka - procenta

# kontingencni tabulka pro dve promenne:
kt <- table(kardio$pohlavi_rek,kardio$koureni,useNA="ifany") # pohlavi: M..muz,Z..zena; koureni:0..nekurak,1..prilezitostny kurak,2..kurak 
kt
addmargins(kt)                    # pridani souctu radku a sloupcu

# kontingencni tabulka procent:
kt.procenta <- prop.table(kt)     # kontingencni tabulka procent (procenta z celkoveho poctu)
addmargins(kt.procenta)
kt.procenta <- prop.table(kt,1)   # kontingencni tabulka procent (radkova procenta)
addmargins(kt.procenta)
kt.procenta <- prop.table(kt,2)   # kontingencni tabulka procent (sloupcova procenta)
addmargins(kt.procenta)

cbind(kt,kt.procenta) # slouceni absolutnich hodnot se sloupcovami procenty
write.table(cbind(kt,kt.procenta),file="Tab1.csv",sep=";",row.names=T) # ulozeni tabulky do textoveho souboru
# Pozor! Pri otevreni souboru v Excelu je horni radek o jednu bunku posunuty! Aby nebylo posunute, museli bychom zadat row.names=F

## Ukol 7.  
#Sumarizujte vysku podle pohlavi (vysku vhodne kategorizujte: 1...<170, 2...170-180, 3...>180). Dale vytvorte kontingencni tabulku 
#procent, z niz bude patrne, zda se v jednotlivych vyskovych kategoriich zastoupeni muzu a zen lisi.

## Reseni:
hist(kardio$vyska,20)
kardio$vyska.3kat <- 1+(kardio$vyska>=170)+(kardio$vyska>180) # vytvoreni trech kategorii: 1...<170, 2...170-180, 3...>=180 
table(kardio$vyska.3kat)
kt <- table(kardio$pohlavi_rek,kardio$vyska.3kat,useNA="ifany")
addmargins(kt)                    # pridani souctu radku a sloupcu
kt.procenta <- prop.table(kt,2)   # kontingencni tabulka procent (sloupcova procenta)
addmargins(kt.procenta)

############### Popisna statistika spojitych promennych ###################

# popisna statistika jedne promenne:
summary(kardio$vek)
summary(kardio$vek_chybny)          # pokud je v souboru odlehla hodnota, prumer je touto odlehlou hodnotou ovlivneny (je to videt ze srovnani sumarizace promennych vek a vek_chybny)

# smerodatna odchylka:
sd(kardio$vek)
sd(kardio$vek_chybny)               # pokud je v souboru odlehla hodnota, i smerodatna odchylka je touto odlehlou hodnotou ovlivnena

# popisna statistika spojite promenne podle kategorialni promenne:
summary(kardio$vek[kardio$pohlavi=="M"])
summary(kardio$vek[kardio$pohlavi=="Z"])

# popisna statistika spojite promenne podle kategorialni promenne v jednom vystupu:
aggregate(kardio$vek ~ kardio$pohlavi_rek, FUN = function(x) c(M=mean(x),Med=median(x), SD=sd(x)))

# vytvareni hezcich tabulek:
install.packages("Epi")
library(Epi)
pp<-stat.table(pohlavi_rek,contents=list(count(vek),mean(vek),median(vek),min(vek),max(vek)),data=kardio) # N, prumer, median, minimum a maximum veku podle pohlavi
pp

# uprava popisku sloupcu, aby tabulka vypadala lepe:
pp<-stat.table(index=list("Pohlavi"=pohlavi_rek),contents=list(N=count(vek),"Prumer"=mean(vek),"Median"=median(vek),"Minimum"=min(vek),"Maximum"=max(vek)),data=kardio)
pp

# ulozeni tabulky do promenne, prevod na typ "data frame" a ulozeni do textoveho souboru:
tab1 <- stat.table(index=list("Pohlavi"=pohlavi_rek),contents=list(N=count(vek),"Prumer"=mean(vek),"Median"=median(vek),"Minimum"=min(vek),"Maximum"=max(vek)),data=kardio) # ulozeni do promenne tab1
tab1 <- as.data.frame(t(tab1))    # prevod na typ "data frame"; je nutne tab1 transponovat pomoci t()
tab1[,2]<-round(tab1[,2],1)       # zaokrouhleni prumeru na jedno desetinne misto
write.table(tab1,file="Tab2.csv",sep=";",row.names=TRUE) # ulozeni tabulky do textoveho souboru
# Pozor! Pri otevreni souboru v Excelu je horni radek o jednu bunku posunuty!


#seznam funkci pro popisnou statistiku:
x <- kardio$vek
length(x)                         # pocet prvku promenne x
mean(x)                           # prumer
median(x)                         # median
min(x)                            # minimum
max(x)                            # maximum
range(x)                          # rozsah hodnot promenne x
c(min(x),max(x))                  # stejny vysledek jako range(x)
var(x)                            # rozptyl
sd(x)                             # smerodatna odchylka
quantile(x,0.25)                  # 1. kvartil (tzn. 25. percentil)
quantile(x,0.5)                   # 2. kvartil (tzn. 50. percentil) - totez co median(x) 
quantile(x,0.75)                  # 3. kvartil (tzn. 75. percentil)
sum(x)                            # suma hodnot x
prod(x)                           # soucin hodnot x

# POZOR! Funkci musime pomoci na.rm=T rici, aby byly chybejici hodnoty vynechany z hodnoceni, jinak se statistika nespocita

x <- kardio$hdl_cholesterol
mean(x) # prumer se nespocita, protoze promenna "hdl_cholesterol" obsahuje alespon jednu hodnotu NA
mean(kardio$hdl_cholesterol,na.rm=T) 

