#///////////////////////////////////////////////////////////////////////////////////// #################### Cvičení 3 - Základy statistiky ################################### ########## Martina Litschmannová, Lenka Přibylová, Adéla Vrtková ###################### ################# Katedra aplikované matematiky, FEI, VŠB-TUO ######################### #///////////////////////////////////////////////////////////////////////////////////// # Zobrazuje-li se vám skript s chybným kódováním, využijte příkaz File / Reopen with Encoding # Náplň je inspirována online kurzy na https://www.datacamp.com/ # Ukážeme si, jak požadované výstupy připravit pomocí standardních funkcí software R, # i efektní přípravu výstupů s využitím balíčků dplyr a ggplot2 (vizualizace). # Načtení balíčků (nutno opakovat při každém novém spuštění Rka, vhodné mít na začátku skriptu) library(readxl) # potřebné k načtení xlsx souboru library(dplyr) library(ggplot2)# pro "hezčí" grafiku library(ggrepel)# potřebné k efektivnímu umístění popisku ve výsečovém grafu vytvořeném pomocí funkce ggplot # Veškerá analýza je prezentována na výstupech z dotazníkového šetření určeného # studentům Základů statistiky - viz http://am-nas.vsb.cz/lit40/ZS/dotaznik.pdf. # Importujeme do R data uložena v souboru dotaznik.xlsx - viz http://am-nas.vsb.cz/lit40/ZS/dotaznik.xlsx # Datová soubor si uložte do pracovního adresáře a před vlastním exportem do R # proveďte potřebný preprocessing, popřípadě využijte data, v nichž již první úpravy # byly provedeny - viz http://am-nas.vsb.cz/lit40/ZS/Excel/dotaznik_pp.xlsx. getwd() setwd("C:/Users/Martina/OneDrive - VŠB-TU Ostrava/Výuka/Základy statistiky/Dotaznik") # V případě potřeby upravte odkaz na vlastní pracovní adresář dotaznik = read_excel("dotaznik_pp.xlsx")# Název souboru případně upravte. # Zjednodušme pojmenování proměnných. colnames(dotaznik)=c("ID","prace","koleje","naklady","prijmy","plat","pocitac_studium","soc_site", "os","leg_software","ikb_znalost","soc_inz","soc_inz_techniky","sexting","darknet", "hesla","piti","sport","pocitac_hry","student_typ","hry","odpocivarna","serialy", "prokrastinace","hobby","bez_stresu","bez_problemu") # Dříve než se pustíme do vlastní analýzy, je nutné se rozhodnout, # které statistické jednotky budou zařazeny do analýzy. # V případě, že analýza nebude prováděna pro všechny respondenty, kteří se zúčastnili # dotazníkového šetření, je toto nutné uvést ve "výzkumné zprávě". # V našem případě budeme analýzu provádět pouze pro respondenty, # u nichž máme úplné záznamy s výjimkou odpovědí na otázku # „S jakými technikami sociálního inženýrství jste se setkal(a)? (soc_inz_techniky)". #* Úkol A -------------------------------------------------------------------------------------- # Zamyslete se nad důvody tohoto rozhodnutí a z datového rámce dotaznik vyfiltrujte # pouze ty respondenty, kteří splňují uvedenou podmínku. # Výstup uložte do datového rámce dotaznik2. dotaznik2 = dotaznik %>% filter(complete.cases(select(dotaznik, -soc_inz_techniky))) # --- #///////////////////////////////////////////////////////////////////////////////////// ## 1. Tabulka četností ######################################################################## #///////////////////////////////////////////////////////////////////////////////////// #* 1.1 Nominální proměnná (základní R) ####### # Analyzujme strukturu respondentů z hlediska jejich sebehodnocení (proměnná student_typ). # Nejdříve si danou proměnnou prohlédněme a zamysleme se, jak by měl požadovaný výstup vypadat # (seřazení variant proměnné, způsob prezentace výsledků). # Začněme přípravou tabulky četností. # Chceme-li kvalitativní proměnnou zpracovávat do formátu tabulek četnosti, musíme je nejdříve # překódovat na typ factor. dotaznik2$student_typ = as.factor(dotaznik2$student_typ) # Prohlédněme si varianty proměnné a v případě potřeby je překódujme. levels(dotaznik2$student_typ) dotaznik2$student_typ = factor(dotaznik2$student_typ, levels = c("bojujícího studenta.","kampusového povaleče.","normálního studenta.","pilného studenta.","premianta." ), labels = c("bojující student","kampusový povaleč","normální student","pilný student","premiant")) # Určeme četnosti výskytu jednotlivých variant a uložme je pod názvem cetnosti_nom. cetnosti_nom = table(dotaznik2$student_typ) cetnosti_nom # výpis absolutních četností # V případě nominální proměnné je vhodné varianty proměnné seřadit dle jejich četností. names(sort(table(dotaznik2$student_typ),decreasing = T)) # Uvědomte si, co je výstupem této "složené" funkce. V případě potřeby prozkoumejte její dílčí části. dotaznik2$student_typ = factor(dotaznik2$student_typ, levels = names(sort(table(dotaznik2$student_typ), decreasing = TRUE)), order = T) cetnosti_nom = table(dotaznik2$student_typ) cetnosti_nom # Nyní jsou výstupem četnosti variant analyzované proměnné v požadovaném pořadí. # Určíme relativní četnosti jednotlivých typů studenta a uložíme je pod názvem rel.cetnosti. rel.cetnosti_nom = prop.table(cetnosti_nom) rel.cetnosti_nom = cetnosti_nom/sum(cetnosti_nom) # alternativní "ruční" výpočet relativních četností rel.cetnosti_nom # Dle celkového počtu respondentů se rozhodneme o zaokrouhlení rel. četností a vyjádříme je v procentech. sum(cetnosti_nom) # Vzhledem k počtu respondentů je vhodné procenta zaokrouhlit na desetiny procent. rel.cetnosti_nom = round(100*rel.cetnosti_nom,digits = 1) rel.cetnosti_nom # Vzhledem k zaokrouhlování relativních četností je nutno ošetřit případnou zaokrouhlovací chybu. rel.cetnosti_nom[1] = 100 - sum(rel.cetnosti_nom[2:5]) rel.cetnosti_nom # Na závěr vytvořme tabulku četností (tab_cetnosti_nom) obsahující záznamy o absolutních i relativních četnostech # a exportujme ji do csv formátu do pracovního adresáře. tab_cetnosti_nom = cbind(cetnosti_nom,rel.cetnosti_nom) tab_cetnosti_nom colnames(tab_cetnosti_nom) = c("četnosti","rel.četnosti (%)") # pojmenování sloupců tabulky tab_cetnosti_nom # Export tabulky do pracovního adresáře (Napíšeme-li do uvozovek celou cestu, exportujeme tabulku do libovolného lokálního umístění.) write.csv2(tab_cetnosti_nom,"tab_cetnosti_nom.csv") # Ve výzkumné zprávě by součásti tabulky měl být i celkový počet respondentů, # popř. by toto mělo být zmíněno v příslušném titulku. #///////////////////////////////////////////////////////////////////////////////////// #* 1.2 Ordinální proměnná (základní R) ####### # Určeme rozdělení respondentů (četnosti) dle úrovně jejich znalostí v oblasti informační a komunikační bezpečnosti. # (proměnná ikb_znalost). Varianty proměnné překódujme na: uživatelská, mírně pokročilá, pokročilá, velmi pokročilá. dotaznik2$ikb_znalost = as.factor(dotaznik2$ikb_znalost) # překódování na typ factor levels(dotaznik2$ikb_znalost) # Všimněme si, že v tomto případě se jedná o ordinální (přirozeně uspořádanou) proměnnou. # V tomto případě je vhodné varianty proměnné přímo "přirozeně" uspořádat. dotaznik2$ikb_znalost = factor(dotaznik2$ikb_znalost, levels = c("Uživatelská (PC používám jako nástroj pro každodenní činnost)", "Mírně pokročilá (Kromě uživatelské činnosti instalují software, nastavuji OS, ...)", "Pokročilá (Jsem schopen instalovat OS.)", "Velmi pokročilá (Starám se o nastavení, bezpečnost a servis PC.)"), labels = c("uživatelská", "mírně pokročilá", "pokročilá", "velmi pokročilá"), order = T) levels(dotaznik2$ikb_znalost) #* Úkol B -------------------------------------------------------------------------------------- # Další postup tvorby tabulky četnosti již znáte. Pokuste se tabulku četnosti (obsahující absolutní # i relativní četnosti) vytvořit samostatně. Výstup uložte jako tab_cetnosti_ord. cetnosti_ord = table(dotaznik2$ikb_znalost) # výpočet četností(Všimněte si, že díky uspořádání, které jsme provedli výše, jsou varianty proměnné seřazeny tak, jak bychom očekávali.) rel.cetnosti_ord = prop.table(cetnosti_ord) # výpočet relativních četností sum(cetnosti_ord) # výpočet celkového počtu respondentů nutný pro rozhodnutí o zaokrouhlení relativních četností rel.cetnosti_ord = round(100*rel.cetnosti_ord,1) # vyjádření rel. četností v procentech a zaokrouhlení na jedno des. místo rel.cetnosti_ord[4] = 100 - sum(rel.cetnosti_ord[1:3]) # ošetření zaokrouhlovací chyby tab_cetnosti_ord = cbind(cetnosti_ord,rel.cetnosti_ord) # vytvoření tabulky četností colnames(tab_cetnosti_ord) = c("četnosti","rel. četnosti (%)") # úprava názvů sloupců tab_cetnosti_ord #--- # Tabulka četností pro ordinální proměnnou se zpravidla rozšiřuje # o kumulativní četnosti a kumulativní relativní četnosti. # Kumulativní četnost dané varianty proměnné je součtem četnosti dané varianty # a četnosti všech "nižších" variant. # Kumulativní relativní četnost je definována obdobně. kum.cetnosti = cumsum(cetnosti_ord) kum.rel.cetnosti = cumsum(rel.cetnosti_ord) tab_cetnosti_ord = cbind(cetnosti_ord,rel.cetnosti_ord,kum.cetnosti,kum.rel.cetnosti) colnames(tab_cetnosti_ord)=c("četnosti","rel. četnosti (%)", "kum. četnosti","kum. rel. četnosti (%)") tab_cetnosti_ord # Výsledky interpretujte! write.csv2(tab_cetnosti_ord,"tab_cetnosti_ord.csv")# export tabulky v csv formátu do pracovního adresáře #///////////////////////////////////////////////////////////////////////////////////// #* 1.3 Nominální proměnná (dplyr) ####### # Analyzujme strukturu respondentů z hlediska jejich sebehodnocení (proměnná student_typ). # Využijme toho, že proměnná je již kódovaná jako typ factor a její varianty jsou seřezeny # dle četnosti.Pro tvorbu tabulky četností obsahující jak absolutní, tak i relativní četnosti # využijme balíček dplyr. tab_cetnosti_nom_dp = dotaznik2 %>% group_by(student_typ) %>% summarise(cetnost = n()) %>% # výpočet abs. četností mutate(rel_cetnost_proc = round(100*(cetnost / sum(cetnost) ),1) ) # výpočet rel. četností colnames(tab_cetnosti_nom_dp)=c("typ studenta","četnost", "rel. četnost (%)") # Ošetříme případnou zaokrouhlovací chybu tab_cetnosti_nom_dp[1,3]=100-sum((tab_cetnosti_nom_dp[2:5,3])) tab_cetnosti_nom_dp write.csv2(tab_cetnosti_nom_dp,"tab_cetnosti_nom_dp.csv") # export výstupu do pracovního adresáře #///////////////////////////////////////////////////////////////////////////////////// #* 1.4 Ordinální proměnná (dplyr) ####### #* Úkol C -------------------------------------------------------------------------------------- # Určete rozdělení respondentů dle úrovně jejich znalostí v oblasti informační a komunikační bezpečnosti # (proměnná ikb_znalost). # Využijte toho, že proměnná je již kódovaná jako typ factor a její varianty jsou "přirozeně" seřezeny. # Připravte přímo tabulku četnosti obsahující jak absolutní (cetnosti_ord), tak i relativní četnosti (rel.cetnosti_ord). # Tabulku rozšiřte i o kumulativní absolutní a relativní četnosti. # Pro přípravu výstupu použijte balíček dplyr. # Výstup uložte jako tab_cetnosti_ord_dp. tab_cetnosti_ord_dp = dotaznik2 %>% group_by(ikb_znalost) %>% summarise(cetnost = n()) %>% # výpočet abs. četností mutate(rel_cetnost_proc = round(100*(cetnost / sum(cetnost)),1)) # výpočet rel. četností tab_cetnosti_ord_dp # Ošetříme případnou zaorouhlovací chybu tab_cetnosti_ord_dp[1,3]=100-sum((tab_cetnosti_ord_dp[2:4,3])) # výpočet rel. četností tab_cetnosti_ord_dp tab_cetnosti_ord_dp = tab_cetnosti_ord_dp %>% mutate(kum_cetnost = cumsum(cetnost), # výpočet kum. četností kum_rel_cetnost_proc = cumsum(rel_cetnost_proc)) # výpočet kum. rel. četností colnames(tab_cetnosti_ord_dp)=c("úroveň znalostí","četnost","rel. četnost (%)","kum. četnost","kum. rel. četnost(%)") tab_cetnosti_ord_dp write.csv2(tab_cetnosti_ord_dp,"tab_cetnosti_ord_dp.csv") # export výstupu do pracovního adresáře # --- #///////////////////////////////////////////////////////////////////////////////////// # 2. Vizualizace ################################################################################# # Před prací s grafikou si uveďme pár úvodních poznámek ke grafice v R. # Základem jsou tzv. high-level funkce, které vytvoří graf (tj. otevřou grafické oknou a vykreslí dle zadaných parametrů) # na ně navazují tzv. low-level funkce, které něco do aktviního grafického okna přidají, samy o sobě neotevřou nové # př. low-level funkcí - např. abline, points, lines, legend, title, axis ... které přidají přímku, body, legendu... # tzn. před použitím "low-level" funkce je potřeba, volat "high-level" funkci (např. plot, boxplot, hist, barplot, pie,...) # Další grafické parametry naleznete v nápovědě # např. zde http://publish.illinois.edu/johnrgallagher/files/2015/10/BaseGraphicsCheatsheet.pdf # nebo zde https://www.math.muni.cz/~kolacek/vyuka/vypsyst/navod_R.pdf (od str. 66) # nebo zde http://www.statmethods.net/advgraphs/parameters.html # nebo zde https://flowingdotaznik.com/2015/03/17/r-cheat-sheet-for-graphical-parameters/ # nebo http://bcb.dfci.harvard.edu/~aedin/courses/BiocDec2011/2.Plotting.pdf ## Barvy v R # http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf # https://www.nceas.ucsb.edu/~frazier/RSpatialGuides/colorPaletteCheatsheet.pdf #///////////////////////////////////////////////////////////////////////////////////// #* 2.1. Sloupcový graf (základní funkce R) ####### # Dříve než začneme připravovat grafické výstupy, měli bychom nastavit vzhled grafického okna par(mfrow = c(1,1), # jednoduché rozdělení grafického okna - 1 řádek, 1 sloupec mar = c(2,5,2,2), # okraje kolem každého z grafů v počtech řádků - - c(dole, vlevo, nahoře, vpravo) oma = c(2,2,2,2)) # vnější okraje v počtech řádků - c(dole, vlevo, nahoře, vpravo) # Pozor. Při tvorbě sloupcového grafu pomoci základních příkazů v R se vždy jako vstup # zadává tabulka četnosti vytvořená pomocí funkce table, nikoli samotná kategoriální proměnná. # S využitím sloupcového grafu vizualizujme rozdělení studentů dle jejich vlastního sebehodnocení (student_typ). # Graf by měl vždy korespondovat s tabulkovým výstupem (seřazení variant proměnné). # Vytvořme sloupcový graf jako grafický výstup doprovázející analýzu # struktury respondentů dle jejich sebehodnocení (student_typ). cetnosti_nom barplot(cetnosti_nom) # Úprava vzhledu grafu pomocí parametrů funkce barplot # Chceme-li posléze přidávat low-level graf. funkce, je vhodné graf pojmenovat (níže bp) bp=barplot(cetnosti_nom, col=c("blue","yellow","red","green","gray"), # vlastní volba barev main="Struktura respondentů \ndle jejich sebehodnocení", # nadpis (\n způsobí zalomení řádku) xlab="", # titulek osy x ylab="počet respondentů", # titulek osy y ylim=c(0,max(cetnosti_nom)+5), # nastavení rozsahu osy y names.arg=names(cetnosti_nom), # popisky sloupců space=0.6, # velikost mezery mezi sloupci cex.main = 0.8) # relativní změna velikosti písma v nadpisu (80 % původní velikosti) # generování popisků popisky_nom = paste0(cetnosti_nom," (",rel.cetnosti_nom,"%)") popisky_nom # doplnění popisků do grafu bp text(bp, cetnosti_nom, # souřadnice pro každou položku popisků popisky_nom, # vlastní popisky pos=3) # parametr pos udává, kde bude text uveden vzhledem k dané pozici # (1 = pod, 2 = vlevo, 3 = nad, 4 = vpravo) # V praxi je vhodné při zobrazení jedné proměnné použít pouze jednu barvu. Méně je někdy více. # Pro černobílý tisk nikdy nepoužívejte "barevné" grafy. V těchto případě v případě potřeby odlišení provést # pomoci různého typu čar, šrafování, apod. bp=barplot(cetnosti_nom, col = "gray", main="Struktura respondentů \ndle jejich sebehodnocení", xlab="", ylab="počet respondentů", ylim=c(0,max(cetnosti_nom)+5), names.arg=c("normální \nstudent","bojující \nstudent", # popisky sloupců - ruční nastavení "kampusový \npovaleč","pilný \nstudent", "premiant"), space=0.6) text(bp, cetnosti_nom, popisky_nom, pos=3) # Nejjednodušší export obrázku lze provést pomocí nabídky Export (přímo nad grafem). #* Úkol D ------------------------------------------------------------------------------ # Vizualizujte strukturu respondentů dle jejich sebehodnocení úrovně znalostí v oblasti informační a komunikační bezpečnosti. # V grafu zvýrazněte, že více než 10 % studentů hodnotí svou znalost IKB na nejnižší úrovní. bp_ord=barplot(cetnosti_ord, col=c("orange","gray","gray","gray"), main="Více než 10 % studentů hodnotí svou znalost \ninformatické a komunikační bezpečnosti na nejnižší úrovni!", xlab="", ylab="počet respondentů", ylim=c(0,max(cetnosti_ord)+5), names.arg=names(cetnosti_ord), space=0.5, cex.main = 0.9) popisky_ord = paste0(cetnosti_ord," (",rel.cetnosti_ord,"%)") popisky_ord text(bp_ord, cetnosti_ord, popisky_ord, pos=3) # --- #///////////////////////////////////////////////////////////////////////////////////// #* 2.2 Sloupcový graf (ggplot2) ####### ## Balíček ggplot2 # Základní fungování ggplot2 - pomocí vrstev: # Nejprve definujeme "estetiku" (aesthetics) # - důležitá část, kde specifikujeme proměnnou na ose x a/nebo na ose y # - lze ale i určit proměnnou, která ovlivní velikost (size) nebo barvu (color) vykreslených objektů (např. bodů) # Následuje určení "geometrie" (geometries) # - tato část definuje, jak se mají data znázornit # - jako body (geom_point), čáry (geom_line), krabicové grafy (geom_boxplot), sloupcové grafy (geom_bar),... # - je třeba uvážit typ dat a na základě toho, jakou chceme informaci předat, zvolit geometrii # - různé "geom" lze i kombinovat, má-li to smysl # Samozřejmostí je změna popisků pomocí vrstvy "labs", grafická témata (themes), přidání textu (geom_text) apod. # Užitečný "tahák" pro práci s balíčkem ggplot2 najdete na # https://www.rstudio.com/wp-content/uploads/2015/03/ggplot2-cheatsheet.pdf # S využitím sloupcového grafu vytvořeného pomoci balíčku ggplot2 # vizualizujme rozdělení studentů dle jejich vlastního sebehodnocení(student_typ). # Vstupem pro tvorbu grafických výstupu pomocí funkce ggplot musí být tabulka # obsahující sloupec s názvem variant a sloupec s příslušnými četnostmi # (pokud obsahuje i další informace, nevadí). # Prozkoumejme výstupy tab_cetnosti_nom a tab_cetnosti_nom_dp. tab_cetnosti_nom # Jde o matici s 5 řádky a 2 sloupci (názvy variant proměnné jsou pouze pojmenováním řádků) tab_cetnosti_nom_dp # Jde o matici s 5 řádky a 3 sloupci (obsahuje jak sloupec s názvy varian, tak sloupec s četnostmi) # Tj. jako vstup pro funkci ggplot lze buď použít tab_cetnosti_nom_dp # nebo musíme připravit příslušnou tabulku pomocí základních funkcí R. # Příprava vstupu pro ggplot pomocí základních funkcí R cetnosti_nom # názvy variant, které vidíme jsou pouze pojmenováním sloupců cetnosti_nom_gg = data.frame(cetnosti_nom) cetnosti_nom_gg colnames(cetnosti_nom_gg) = c("student_typ","cetnost") cetnosti_nom_gg ggplot(cetnosti_nom_gg, aes(x=student_typ,y=cetnost))+ # estetika geom_bar(stat="identity") # geom_? nastavuje typ grafu # Nastavení parametru stat je nutné uvést kvůli tomu, že vstup je ve formě tabulky # Funkce ggplot umožňuje generovat grafické výstupu pro kvalitativní proměnnou # i přímo z datové matice, ale pak je problematické přidávání popisků. ggplot(dotaznik2, aes(x=student_typ))+ # estetika geom_bar() # Pro další úpravy grafu je vhodné grafický výstup pojmenovat. bp_nom_col = ggplot(cetnosti_nom_gg, aes(x=student_typ,y=cetnost,fill = student_typ))+ # estetika, nastavení parametru fill umožňuje úpravu barvy výplně sloupců geom_bar(stat="identity",col = "black") # parametr col určuje barvu ohraničení sloupců bp_nom_col bp_nom_col + theme_bw() # vzhled grafu (další viz https://ggplot2.tidyverse.org/reference/ggtheme.html) # Další úpravy grafu bp_nom_col + theme_bw()+ theme(legend.position = "none")+ # odstranění legendy ylim(0,52)+ # nastavení rozsahu osy y scale_x_discrete(labels=c("normální \nstudent","bojující \nstudent", # popisky sloupců - ruční nastavení "kampusový \npovaleč","pilný \nstudent", "premiant"))+ # nastavení vlastních popisků variant proměnné labs(x = "", y = "počet respondentů", title = "Struktura respondentů \ndle jejich vlastního sebehodnocení")+ scale_fill_brewer(palette="Spectral")+ # nastavení barev dle palety barev v ggplot - viz https://www.datanovia.com/en/blog/ggplot-colors-best-tricks-you-will-love/ theme(plot.title = element_text(hjust = 0.5))+ # zarovnání názvu grafu na střed geom_text(aes(y=cetnost, label = popisky_nom), # jaký text a kam umístit size=4, # velikost textu vjust = -0.5) # nastavení popisků nad sloupce # Funkce ggsave() uloží aktuální obrázek vytvořený pomocí ggplot2 do pracovního adresáře ggsave("bp_typ_studenta.png",width = 13,height = 10,units = "cm") # Výsledná podoba vhodná pro tisk (méně je někdy více). bp_nom_col + theme_bw()+ theme(legend.position = "none")+ # odstranění legendy ylim(0,52)+ # nastavení rozsahu osy y scale_x_discrete(labels=c("normální \nstudent","bojující \nstudent", # popisky sloupců - ruční nastavení "kampusový \npovaleč","pilný \nstudent", "premiant"))+ # nastavení vlastních popisků variant proměnné labs(x = "", y = "počet respondentů", title = "Struktura respondentů \ndle jejich vlastního sebehodnocení")+ scale_fill_manual(values = rep("gray",5))+ # nastavení vlastních barev theme(plot.title = element_text(hjust = 0.5))+ # zarovnání názvu grafu na střed geom_text(aes(y=cetnost, label = popisky_nom), # jaký text a kam umístit size=4, # velikost textu vjust = -0.5) # nastavení popisků nad sloupce #* Úkol E ------------------------------------------------------------------------------ # S využitím sloupcového grafu vytvořeného pomoci balíčku ggplot2 # vizualizujte rozdělení studentů dle jejich znalosti IKB(ikb_znalost). # Jako vstup funkce ggplot použijte tabulku četností vytvořenou pomocí # balíčku dpyr (tab_cetnosti_ord_dp). tab_cetnosti_ord_dp colnames(tab_cetnosti_ord_dp) # Změna názvů sloupců (názvy s mezerami a diakritikou by působily problémy) colnames(tab_cetnosti_ord_dp)= c("uroven","cetnost","rel.cetnost","kum.cetnost","kum.rel.cetnost") bp_ord_col = ggplot(tab_cetnosti_ord_dp, aes(x=uroven,y=cetnost,fill = uroven))+ geom_bar(stat="identity",col = "black") bp_ord_col bp_ord_col + theme_bw()+ theme(legend.position = "none")+ # odstranění legendy ylim(0,40)+ # nastavení rozsahu osy y scale_x_discrete(labels=c("uživatelská","mírně \npokročilá", # popisky sloupců - ruční nastavení "pokročilá","velmi \npokročilá"))+ labs(x = "", y = "počet respondentů", title = "Struktura respondentů \ndle jejich úrovně znalostí \ninformační a komunikační bezpečnosti")+ scale_fill_manual(values = rep("gray",4))+ # nastavení vlastních barev theme(plot.title = element_text(hjust = 0.5))+ # zarovnání názvu grafu na střed geom_text(aes(y=cetnost, label = popisky_ord), # jaký text a kam umístit size=4, # velikost textu vjust = -0.5) # nastavení popisků nad sloupce # --- #///////////////////////////////////////////////////////////////////////////////////// #* 2.3 Výsečový graf (základní funkce R) ####### # S využitím výsečového grafu vizualizujme rozdělení studentů # dle jejich vlastního sebehodnocení(student_typ). # Vstupem jsou opět četnosti dané proměnné. cetnosti_nom # základní výsečový graf pie(cetnosti_nom) # Další úprava výsečové grafu popisky_nom_vg = paste0(levels(dotaznik2$student_typ)," (",cetnosti_nom,"; ",rel.cetnosti_nom, "%)") popisky_nom_vg pie(cetnosti_nom, col=terrain.colors(5), # nastavení barevné palety viz https://www.nceas.ucsb.edu/~frazier/RSpatialGuides/colorPaletteCheatsheet.pdf main="Úroveň znalosti \ninformační a komunikační bezpečnosti", label = popisky_nom_vg) #* Úkol F ------------------------------------------------------------------------------ # Pomoci výsečového grafu vizualizujte strukturu respondentů z hlediska úrovně znalosti IKB (ikb_znalost). popisky_ord_vg = paste0(levels(dotaznik2$ikb_znalost)," (",cetnosti_ord,"; ",rel.cetnosti_ord, "%)") popisky_ord_vg pie(cetnosti_ord, col=terrain.colors(4), main="Struktura respondentů \nz hlediska jejich sebehodnocení", label = popisky_ord_vg) # --- #///////////////////////////////////////////////////////////////////////////////////// #* 2.4 Výsečový graf (ggplot2) ####### # S využitím výsečového grafu vytvořeného pomoci balíčku ggplot2 vizualizujme rozdělení studentů # dle jejich vlastního sebehodnocení(student_typ). # Obdobně jako u sloupcového grafu, i nyní musíme vycházet z tabulky obsahující # sloupec s názvy variant proměnné a sloupec s příslušnými rel. četnostmi. # Využijme již dříve vytvořenou tabulku cetnosti_nom_gg. tab_cetnosti_nom_dp colnames(tab_cetnosti_nom_dp)=c("student_typ","cetnost","rel") # Shlukový sloupcový graf (pro relativní četnosti) ggplot(tab_cetnosti_nom_dp, aes(x="",y=rel,fill=student_typ))+ # estetika geom_bar(stat="identity") # shlukový sloupcový graf s parametrem stat kvůli vstupní tabulce # Transformace shlukového sloupcového grafu na graf výsečový ggplot(tab_cetnosti_nom_dp, aes(x="",y=rel,fill=student_typ))+ # estetika geom_bar(stat="identity")+ # shlukový sloupcový graf s parametrem stat kvůli vstupní tabulce coord_polar(theta="y") # transformace sloupcového grafu na výsečový # Chceme-li do výsečového grafu umístit popisky, musíme vstupní tabulku četností rozšířit # o pozici popisku pro každou variantu. tab_cetnosti_nom_gg = tab_cetnosti_nom_dp %>% mutate(pos = sum(rel) - cumsum(rel) + rel/2) tab_cetnosti_nom_gg popisky_nom # Pro další úpravy grafu si graf opět pojmenujme. pg = ggplot(tab_cetnosti_nom_gg, aes(x="",y=rel,fill=student_typ))+ geom_bar(stat="identity")+ coord_polar(theta="y") pg # Další úprava grafu pg + scale_fill_brewer(name = "",palette="Spectral")+ # odstranění titulku legendy + barevná paleta labs(x="", # odstranění popisku osy x y="", # odstranění popisku osy y title="Struktura respondentů \ndle sebehodnocení studentů")+ # název grafu theme_void()+ # vzhled grafu theme(axis.text = element_blank(), # odstranění rámečku kolem grafu panel.grid = element_blank(), # odstranění "osy" kolem grafu legend.position = "bottom", plot.title = element_text(hjust = 0.5))+ # zarovnání názvu grafu na střed guides(fill=guide_legend(nrow=2,byrow=TRUE))+ # legenda ve 2 řádcích geom_text_repel(aes(x = 1.4, y = pos, label = popisky_nom), nudge_x = .3, segment.size = .7, show.legend = FALSE) #* Úkol G ------------------------------------------------------------------------------ # S využitím výsečového grafu vytvořeného pomoci balíčku ggplot2 vizualizujme rozdělení studentů # dle jejich úrovně znalostí IKB (ikb_znalost). tab_cetnosti_ord_gg = tab_cetnosti_ord_dp colnames(tab_cetnosti_ord_gg)=c("uroven","cetnost","rel","kum.cetnost","kum.rel.cetnost") tab_cetnosti_ord_gg # doplnění souřadnic popisků tab_cetnosti_ord_gg = tab_cetnosti_ord_gg %>% mutate(pos = sum(rel) - cumsum(rel) + rel/2) tab_cetnosti_ord_gg popisky_ord # Pro další úpravy grafu si graf opět pojmenujme. pg = ggplot(tab_cetnosti_ord_gg, aes(x="",y=rel,fill=uroven))+ geom_bar(stat="identity")+ coord_polar(theta="y") pg # Další úprava grafu pg + scale_fill_brewer(name = "",palette="Spectral")+ labs(x="", # odstranění popisku osy x y="", # odstranění popisku osy y title="Struktura respondentů dle úrovně znalostí IKB")+ theme_void()+ theme(axis.text = element_blank(), panel.grid = element_blank(), legend.position = "bottom", plot.title = element_text(hjust = 0.5))+ guides(fill=guide_legend(nrow=2,byrow=TRUE))+ geom_text_repel(aes(x = 1.4, y = pos, label = popisky_ord), nudge_x = .3, segment.size = .7, show.legend = FALSE) # --- #///////////////////////////////////////////////////////////////////////////////////// # Pie charts are a very bad way of displaying information. # The eye is good at judging linear measures and bad at judging relative areas. # A bar chart or dot chart is a preferable way of displaying this type of data. #///////////////////////////////////////////////////////////////////////////////////// #///////////////////////////////////////////////////////////////////////////////////// ## 3. Analýza vícehodnotové proměnné (výstupy k otázkám s možností volby více odpovědí) ######## # Popišme strukturu respondentů dle jejich oblíbených nápojů (piti). # Prohlédněme si proměnnou piti a zamysleme se, jak efektivně zjistit četnosti jednotlivých variant odpovědí. dotaznik2$piti # Využijme funkci grepl, která nám jako TRUE označí řádky, v nichž se vyskytuje daný textový řetězec. grepl("Pivo",dotaznik2$piti) sum(grepl("Pivo",dotaznik2$piti)) # počet respondentů, kteří označili pivo jako svůj oblíbený nápoj # Obdobně bychom mohli určit četnosti dalších variant odpovědí. # Jaké varianty odpovědí byly v dotazníku v nabídce zjistíme na http://am-nas.vsb.cz/lit40/ZS/dotaznik.pdf # Pro efektivní zjištění četností lze využít cyklu for. # Vytvořme si vektor obsahující jednotlivé varianty odpovědí. # Uvědomme si, že vzhledem k použití funkce grepl může vektor obsahovat pouze části nastavených variant odpovědí. napoje=c("Pivo","Víno","Destiláty","Teplé nápoje","Studené nápoje") napoje cetnost_piti = rep(0,length(napoje)) #definování vektoru obsahujícího četnosti výskytu daných variant odpovědí na příslušnou otázku # Výpočet četností daných variant odpovědí na příslušnou otázku for (i in 1:length(napoje)){ cetnost_piti[i]=sum(grepl(napoje[i],dotaznik2$piti)) } cetnost_piti # Výpis četností # Ani v tomto případě nezapomeňme na vhodné uspořádání variant odpovědí. names(cetnost_piti) = napoje # nejdříve je nutno četnosti svázat s názvy variant odpovědí cetnost_piti = sort(cetnost_piti,decreasing = T) # seřazení dle četností (sestupně) cetnost_piti # Dále si uvědomme, že v tomto případě nás nezajímá procentuální zastoupení jednotlivých variant odpovědí vzhledem k celkovému počtu odpovědí, # ale vzhledem k počtu respondentů! Součet relativních četností nebude roven 1 (100 %)! # Toto je vhodné ve výzkumné zprávě zdůraznit i v popisu tabulky. # Výpočet relativních četností. rel.cetnost_piti = cetnost_piti/length(dotaznik2$piti) length(dotaznik2$piti) # počet respondentů (abychom věděli jak zaokrouhlovat rel. četnosti) rel.cetnost_piti = round(100*rel.cetnost_piti,1) rel.cetnost_piti # relativní četnosti jednotlivých variant odpovědí vzhledem k počtu respondentů (%) #* Úkol H ------------------------------------------------------------------------------ # Další postup byste již měli zvládnout samostatně. # Vytvořte tabulku četností (obsahující absolutní i relativní četnosti) # a odpovídající sloupcový graf s využitím balíčku ggplot. # Tabulku četností i graf exportujte do pracovního adresáře. # Nezapomeňte, že pro funkci ggplot potřebujete mít tabulku, která obsahuje sloupec s názvy variant. tab_cetnosti_piti = data.frame(names(cetnost_piti), cetnost_piti, rel.cetnost_piti) tab_cetnosti_piti rownames(tab_cetnosti_piti)=NULL colnames(tab_cetnosti_piti)=c("typ","cetnost","rel") tab_cetnosti_piti # V titulku tabulky nebo v popisu osy y je nutné uvést jaký je význam uvedených rel. četností!!! # POZOR! Pokud nenastavíme proměnnou typ jako factor a neošetříme # pořadí jejich variant, seřadí se nám v grafu proměnné dle abecedy! tab_cetnosti_piti$typ = factor(tab_cetnosti_piti$typ, levels = names(cetnost_piti), order = T) popisky_piti = paste0(cetnost_piti," (",rel.cetnost_piti," %)") popisky_piti # Sloupcový graf graf_piti = ggplot(tab_cetnosti_piti,aes(x=typ,y=cetnost,fill=typ))+ geom_bar(stat = "identity") graf_piti graf_piti + theme_bw()+ theme(legend.position = "none")+ ylim(0,80)+ labs(x = "", y = "počet respondentů \n(v závorce je uvedeno relativní zastoupení \nvzhledem k celkovému počtu 93 respondentů)", title = "Jaké nápoje mají v oblibě naší studenti?")+ scale_fill_manual(values = rep("gray",5))+ theme(plot.title = element_text(hjust = 0.5))+ geom_text(aes(y=cetnost, label = popisky_piti), size=4, # velikost textu vjust = -0.5) # nastavení popisků nad sloupce # Export tabulky tab_cetnosti_piti colnames(tab_cetnosti_piti)=c("typ nápoje","četnost","rel. četnost vzhledem k počtu respondentů") write.csv2(tab_cetnosti_piti,"tab_cetnosti_piti.csv") # Export obrázku provedeme pomocí nabídky Export (nad grafem). # --- # Na závěr se zamyslete nad vhodností nastavených variant odpovědí pro danou otázku.