---
format:
  revealjs:
    slide-number: true
    theme: [default, ../theme/presentation_theme.scss, ../theme/presentation_components.scss]
    embed-resources: true
    preview-links: false
    output-file: "presentation"
    output-ext: "html"
    highlight-style: github-light
    include-in-header: "../theme/fonts-include.html"
filters:
  - ../theme/rn-shorthand.lua
  - ../_extensions/EmilHvitfeldt/roughnotation/rough.lua
---

```{r}
#| label: setup
#| include: false
options(htmltools.dir.version = FALSE)

if (
  identical(.Platform$OS.type, "windows") &&
    !isTRUE(l10n_info()[["UTF-8"]])
) {
  locale_utf8 <-
    Sys.setlocale(
      category = "LC_CTYPE",
      locale = "Czech_Czechia.utf8"
    )

  if (is.na(locale_utf8) || !isTRUE(l10n_info()[["UTF-8"]])) {
    stop("Presentation rendering requires a UTF-8 locale.")
  }
}

knitr::opts_chunk$set(
  fig.width = 7,
  fig.height = 5,
  fig.align = "center",
  out.width = "100%"
)

library(here)

here::i_am("Presentation/presentation.qmd")

path_materials <- "Presentation/Materials"

dir.create(
  here::here(path_materials),
  recursive = TRUE,
  showWarnings = FALSE
)

source(
  here::here(
    "R",
    "set_r_theme.R"
  )
)

include_local_figure <- function(data_source) {
  knitr::include_graphics(
    path = here::here(
      path_materials,
      data_source
    ),
    error = TRUE
  )
}
```

```{r}
#| label: dynamic-link-generation
#| include: false
project_name <-
  basename(here::here())

display_name <-
  "Biostatistika"

github_url <-
  stringr::str_glue(
    "https://github.com/CUNI-NATUR-Biostatistics/{project_name}"
  )

slides_url <-
  stringr::str_glue(
    "https://CUNI-NATUR-Biostatistics.github.io/{project_name}/"
  )
```

## Kolik váží „typický“ savec? {.course-title .course-title-illustrated .bg-indigo}

<style>
.reveal .slides section.course-title-illustrated::before,
.reveal .slides section.course-title-illustrated::after {
  content: none;
  display: none;
}
</style>

::: {.absolute top="9%" right="-1%" width="36%"}
```{r}
#| label: zobrazit-titulni-ilustraci
#| echo: false
#| fig-alt: "Humorná ilustrace slona na váze, netopýra zapisujícího údaje a spícího geparda; trojice ukazuje velkou rozmanitost savců."
#| out-width: "100%"

include_local_figure("typicky_savec_titulni_ilustrace.png")
```
:::

::: {.course-title-mark}
![Logo kurzu Biostatistika](../theme/course-logo-reversed.svg) BIOSTATISTIKA
:::

::: {.course-title-number}
L01
:::

::: {.course-title-formal}
Úvod do biostatistiky
:::

::: {.course-title-link}
[cuni-natur-biostatistics.github.io/materialy.html](https://cuni-natur-biostatistics.github.io/materialy.html)
:::


## Ondřej Mottl

:::: {.columns .align-center}

::: {.column width="38%"}

```{r}
#| label: zobrazit-portret-vyucujiciho
#| echo: false
#| fig-alt: "Portrét vyučujícího Ondřeje Mottla v terénu."
#| out-width: "92%"

include_local_figure("instructor_ondrej_mottl.png")
```

:::

::: {.column width="60%" .text-center}

<br>

🌿 [Vegetační ekolog]{.text-hgl-indigo_velvet} na katedře botaniky

🧑‍💻 vedoucí [Laboratoře kvantitativní ekologie]{.text-hgl-amethyst}

♻️ zastánce [otevřené a reprodukovatelné vědy]{.text-hgl-orange}

<br>

::: {.takeaway-strip}
Jak z velkého množství biologických dat "vyždímat" nové informace
:::

:::

::::

::: {.footer}
Foto: Vladimír Šigut, Univerzita Karlova
:::

## Co mě zajímá? {.text-center}

<br>

:::: {.columns .align-top .text-center .justify-center}

::: {.column .fragment .text-center width="31%"}

#### Biodiverzita

napříč měřítky

:::: {.r-hstack}

::: {.column width="89%"}

```{r}
#| label: zobrazit-vyzkum-biodiverzity
#| echo: false
#| fig-alt: "Ilustrace biodiverzity od jednotlivého organismu přes vegetační plochu po krajinu."
#| fig-align: center
#| out-width: "99%"

include_local_figure("research_biodiversity_scales_transparent.png")
```

:::

::::

:::

::: {.column .fragment .text-center width="31%"}

#### Velká data

nové metody

:::: {.r-hstack}

::: {.column width="89%"}

```{r}
#| label: zobrazit-vyzkum-velka-data
#| echo: false
#| fig-alt: "Ilustrace ekologických pozorování, která vstupují do statistické analýzy."
#| fig-align: center
#| out-width: "99%"

include_local_figure("research_big_data_methods_transparent.png")
```

:::

::::

:::

::: {.column .fragment .text-center width="31%"}

#### Otevřená věda

reprodukovatelnost

:::: {.r-hstack}

::: {.column width="89%"}

```{r}
#| label: zobrazit-otevrena-veda
#| echo: false
#| fig-alt: "Ilustrace otevřeného a opakovatelného výzkumného postupu od terénu přes analýzu ke sdílenému výsledku."
#| fig-align: center
#| out-width: "99%"

include_local_figure("research_open_science_transparent.png")
```

:::

::::

:::

::::

::: {.footer}
Ilustrace vytvořené pomocí OpenAI, 2026
:::

## Co se od vás očekává?

::::: {.slide-margin-top-15}

::: {.takeaway-strip}
**Příprava → společné přemýšlení → vlastní práce s daty**
:::

<br>

:::: {.columns .align-top}

::: {.column .fragment width="31%"}

### Před výukou

Krátce projdete materiály (skripta).

:::

::: {.column .fragment width="31%"}

### 90 minut přednášky

Aktivní účast na přednášce.

:::

::: {.column .fragment width="31%"}

### 120 minut praktika

V jedné z pěti paralelních skupin budete analyzovat data v R.

:::

::::

:::::

## Materiály najdete na webu kurzu (HUB) {.text-center}

::::: {.slide-margin-top-15}

::: {.takeaway-strip}
[cuni-natur-biostatistics.github.io](https://cuni-natur-biostatistics.github.io)<br>
[bit.ly/CUNI-MB120P163](https://bit.ly/CUNI-MB120P163)
:::

<br>

:::: {.columns .align-top}

::: {.column width="31%"}

### Skripta

[HTML]{.text-hgl-indigo_velvet} pro interaktivní čtení<br>
[PDF]{.text-hgl-graphite} pro tisk

:::

::: {.column width="31%"}

### Prezentace

[HTML]{.text-hgl-indigo_velvet} pro prohlížení v prohlížeči<br>
[PDF]{.text-hgl-graphite} pro tisk

:::

::: {.column width="31%"}

### R skripty

Kód pro praktickou práci s daty v R.

:::

::::

::: {.footer}
SIS slouží pro zápis a termíny zkoušek. Moodle slouží pro testy, odevzdávání, výsledky a neveřejná oznámení.
:::

:::::

## Výuka je dobrovolná, kompetence povinné

::::: {.slide-margin-top-15}

::: {.text-size-heading2 .text-bold .text-center}
[Na přednášky a praktika chodit nemusíte.]{.text-hgl-indigo_velvet}
:::

<br>

:::: {.columns .align-top .text-center}

::: {.column width="31%" .fragment}

### Ve výuce

Získáte vysvětlení, podporu a zpětnou vazbu.

:::

::: {.column width="31%" .fragment}

### Při samostudiu

Všechny požadované znalosti najdete ve skriptech a cvičeních v R.

:::

::: {.column width="31%" .fragment}

### Povinně

Absolvujete praktický zápočet a závěrečnou zkoušku.

:::

::::

<br>

::: {.takeaway-strip .fragment}
Učit se můžete prezenčně i doma — [stejné kompetence]{.text-hgl-indigo_velvet} však musí prokázat každý.
:::

:::::

## Zápočet a zkouška ověřují jiné dovednosti

<br>

::::: {.slide-margin-top-10}

:::: {.columns .align-stretch}

::: {.column width="48%" .fragment}
::: {.panel-data}
[Praktický zápočet]{.panel-title}

**Dokážete samostatně provést a vysvětlit základní analýzu v R?**

- malý dataset a biologická otázka
- částečně připravený R skript
- kontrola dat, graf, model a biologický závěr
:::
:::

::: {.column width="48%" .fragment}
::: {.panel-indigo}
[Závěrečná zkouška]{.panel-title}

**Rozumíte analytickým rozhodnutím a interpretaci výsledků?**

- dodaný R kód, grafy a modelové výstupy
- interpretace, diagnostika a nejistota
- ne psaní syntaxe zpaměti
:::
:::

::::

<br>

::: {.takeaway-strip .fragment}
[AI můžete používat při učení.]{.text-hgl-indigo_velvet}<br>
U zápočtu a zkoušky pracujete [samostatně bez internetu a AI]{.text-hgl-orange}.
:::

::: {.footer}
Pravidla hodnocení: [web kurzu (HUB)](https://cuni-natur-biostatistics.github.io/hodnoceni.html). Termíny zkoušek: [SIS](https://is.cuni.cz/studium/predmety/index.php?do=predmet&kod=MB120P163). Neveřejné pokyny a výsledky: [Moodle](https://dl2.cuni.cz/course/view.php?id=106).
:::

:::::

{{< include ../pollslive/generated/active.qmd >}}

# Kolik váží běžný savec?

## Tabulka savců

```{r}
#| label: pripravit-tabulku-savcu
#| include: false
#| message: false
#| warning: false
data_savci <-
  ggplot2::msleep |>
  dplyr::transmute(
    druh = name,
    typ_potravy = dplyr::recode(
      vore,
      "carni" = "masožravec",
      "herbi" = "býložravec",
      "insecti" = "hmyzožravec",
      "omni" = "všežravec",
      .missing = "neuvedeno"
    ),
    rad = order,
    spanek_h = sleep_total,
    hmotnost_kg = bodywt
  )
```

<br>

```{r}
#| label: zobrazit-ukazku-tabulky-savcu
#| echo: false
#| message: false
#| warning: false
data_savci |>
  dplyr::slice_head(n = 3) |>
  knitr::kable(
    align = c("l", "l", "l", "r", "r")
  )
```

::: {.text-size-tiny}
Ukázka z tabulky `msleep` (celkem `r nrow(data_savci)` řádků).
:::

##

<br>
<br>

```{r}
#| label: pripravit-hmotnost-pro-titulky
#| include: false
#| message: false
#| warning: false
vec_hmotnost_kg <-
  ggplot2::msleep[["bodywt"]]

prumer_hmotnosti <-
  mean(vec_hmotnost_kg)

median_hmotnosti <-
  median(vec_hmotnost_kg)

txt_prumer_hmotnosti <-
  formatC(
    prumer_hmotnosti,
    format = "f",
    digits = 0,
    decimal.mark = ","
  )

txt_median_hmotnosti <-
  formatC(
    median_hmotnosti,
    format = "f",
    digits = 2,
    decimal.mark = ","
  )
```

:::: {.columns .align-top}

<br>

::: {.column width="48%"}
::: {.card-data}
[Smyšlený titulek A]{.card-title}

**Vědci spočítali:**<br>
„Průměrný savec váží
[**`r txt_prumer_hmotnosti` kg**]{.text-hgl-indigo_velvet}.“
:::
:::

::: {.column width="48%"}
::: {.card-data}
[Smyšlený titulek B]{.card-title}

**Jiná analýza tvrdí:**<br>
„Běžný savec váží jen
[**`r txt_median_hmotnosti` kg**]{.text-hgl-amethyst}.“
:::
:::

::::

<br>

::: {.fragment .text-center}
*Stejná tabulka. Dvě dramaticky odlišná čísla.*
:::

## Výsledky učení

<br>

Po dnešní přednášce budete schopni:

::: {.incremental}
- vysvětlit, co v tabulce představuje [jeden řádek]{.text-hgl-graphite}
- přečíst vhodný [graf jedné proměnné]{.text-hgl-graphite}
- vybrat smysluplnou dvojici [středu]{.text-hgl-indigo_velvet} a [rozptýlení]{.text-hgl-orange}
- rozlišit čtyři [typy proměnných]{.text-hgl-indigo_velvet} a zvolit jejich první popis
- vysvětlit, proč jedno správně vypočtené číslo ještě nemusí být dobrý titulek
:::

## Jak budeme pracovat?

::::: {.slide-margin-top-15}

::: {.takeaway-strip}
**Otázka → data → graf → souhrn → (opatrná interpretace)**
:::

<br>

:::: {.columns .align-top}

::: {.column width="48%"}
::: {.panel-data}
[Na přednášce]{.panel-title}

Budete odhadovat, hlasovat, porovnávat grafy a obhajovat závěry.
:::
:::

::: {.column width="48%"}
::: {.panel-note}
[V materiálech]{.panel-title}

HTML nabízí záložky a rozbalovací otázky; PDF je vhodné pro souvislé čtení.
:::
:::

::::

:::::

##

::::: {.layout-stack}

:::: {.columns .align-stretch}

::: {.column width="48%"}
::: {.card-data .card-compact}
[Titulek A]{.card-title}

„Průměrný savec váží **`r txt_prumer_hmotnosti` kg**.“
:::
:::

::: {.column width="48%"}
::: {.card-data .card-compact}
[Titulek B]{.card-title}

„Běžný savec váží **`r txt_median_hmotnosti` kg**.“
:::
:::

::::

::: {.box-question}
Hlasování: který titulek je správný?
:::

:::: {.columns .align-stretch}

::: {.column width="23%"}
::: {.panel-question}
**A)** Pouze titulek A.
:::
:::

::: {.column width="23%"}
::: {.panel-question}
**B)** Pouze titulek B.
:::
:::

::: {.column width="23%"}
::: {.panel-question}
**C)** Oba mohou být správně.
:::
:::

::: {.column width="23%"}
::: {.panel-question}
**D)** Zatím nemáme dost informací.
:::
:::

::::

::: {.takeaway-strip}
Hlasujte samostatně a svou volbu pak obhajte sousedovi.
:::

:::::

## Přesvědčte souseda {.text-center}

<br>

::: {.text-size-heading2 .text-bold .text-center}
Proč jste vybrali právě svoji možnost?
:::

<br>

::: {.panel-data}
[Důkaz, který máte k dispozici]{.panel-title}

- stejná tabulka savců;
- `r txt_prumer_hmotnosti` kg versus `r txt_median_hmotnosti` kg
:::

::: {.notes}
Nechám přibližně 20 sekund na individuální volbu a 60–90 sekund na obhajobu ve dvojici. Správnou možnost zatím neodhalím.
:::

## Odpověď zatím odložíme {.text-center}

:::: {.slide-margin-top-15}

::: {.text-size-heading2 .text-bold .text-center}
Zjistíme, [co bylo změřeno]{.text-hgl-graphite}
a [jak hodnoty vypadají]{.text-hgl-orange}.
:::

<br>
<br>

::: {.fragment}
::: {.takeaway-strip}
Správný výpočet ještě nezaručuje správnou interpretaci.
:::
:::

::::


# Od organismu k datům

## Začneme jedním savcem

Stejná tabulka obsahuje hmotnost i spánek. Na době spánku si ukážeme, jak data zobrazit a popsat. K otázce o hmotnosti se vrátíme s těmito nástroji.

```{r}
#| label: pripravit-data-savcu
#| include: false
#| message: false
#| warning: false
data_spanek <-
  data_savci |>
  tidyr::drop_na(spanek_h)

vec_spanek_h <-
  data_spanek |>
  dplyr::pull(spanek_h)
```

:::: {.columns .align-center .fragment}

::: {.column width="50%"}
::: {.text-size-heading2 .text-bold}
Gepard (*Cheetah*)
:::

<br>

Výzkumníci studovali spánkové návyky savců a u geparda zaznamenali
[**`r data_spanek |> dplyr::filter(druh == "Cheetah") |> dplyr::pull(spanek_h)` hodiny spánku za den**]{.text-hgl-orange}.

<br>

::: {.panel-data .fragment}
[Při záznamu měření]{.panel-title}

Výsledek pro jeden zastoupený druh zapíšeme do jednoho řádku tabulky.
:::
:::

::: {.column width="50%"}

<br>

```{r}
#| label: zobrazit-geparda
#| echo: false
#| fig-alt: "Humorná ilustrace geparda spícího v pyžamu."
#| out-width: "100%"

include_local_figure("mammal_cheetah_illustrative.png")
```

::: {.text-size-tiny .text-right}
Ilustrace vytvořená pomocí AI.
:::
:::

::::

## První pozorování přidá první řádek

<br>

<br>

```{r}
#| label: zobrazit-prvni-radek
#| echo: false
#| message: false
#| warning: false
data_spanek |>
  dplyr::slice_head(n = 1) |>
  dplyr::transmute(
    `Druh (species)` = druh,
    `Spánek za den (h)` = spanek_h
  ) |>
  knitr::kable(
    align = c("l", "r")
  )
```

<br>

::: {.takeaway-strip}
Jeden řádek zachovává spojení mezi **druhem** a jeho **hodnotou**.
:::

## Další druh přidá další řádek

<br>

<br>

```{r}
#| label: zobrazit-prvni-dva-radky
#| echo: false
#| message: false
#| warning: false
data_spanek |>
  dplyr::slice_head(n = 2) |>
  dplyr::transmute(
    `Druh (species)` = druh,
    `Spánek za den (h)` = spanek_h
  ) |>
  knitr::kable(
    align = c("l", "r")
  )
```

<br>

::: {.strip-olive}
Tabulka roste **po řádcích**: jeden zastoupený druh po druhém.
:::

## Čtyři druhy, čtyři řádky

<br>

```{r}
#| label: zobrazit-prvni-ctyri-radky
#| echo: false
#| message: false
#| warning: false
data_spanek |>
  dplyr::slice_head(n = 4) |>
  dplyr::transmute(
    `Druh (species)` = druh,
    `Spánek za den (h)` = spanek_h
  ) |>
  knitr::kable(
    align = c("l", "r")
  )
```

<br>

:::{.panel-question .fragment}
*Na co přesně se vztahuje hodnota 12,1 hodiny v prvním řádku?*
:::

## Co představuje jeden řádek?

::::: {.slide-margin-top-15}

:::: {.columns .align-top}

::: {.column width="31%"}
::: {.card-question}
[A]{.card-title}

Jednoho konkrétního geparda.
:::
:::

::: {.column width="31%"}
::: {.card-question}
[B]{.card-title}

[Jeden zastoupený druh savce.]{.rn-circle-indigo}
:::
:::

::: {.column width="31%"}
::: {.card-question}
[C]{.card-title}

Jednu hodinu měření.
:::
:::

::::

:::::

## Jeden řádek = jeden zastoupený druh

::::: {.slide-margin-top-15}

:::: {.columns .align-top}

::: {.column width="48%"}
::: {.panel-result}
[Co víme]{.panel-title}

Každá hodnota spánku patří jednomu **druhu**, který je v tabulce zastoupen.
:::
:::

::: {.column width="48%" .fragment}
::: {.panel-warning}
[Co z toho neplyne]{.panel-title}

Tabulka neobsahuje data o spánku všech jednotlivých savců na Zemi.
:::
:::

::::

:::::

::: {.notes}
Zdůrazním rozdíl mezi druhem a jedincem. Tento rozdíl se vrátí při interpretaci titulku.
:::

## Jak uložíme jednu hodnotu v R?

::::: {.slide-margin-top-15}

:::: {.columns .align-center}

::: {.column width="48%"}
```{r}
#| label: vytvorit-vektor-jedna-hodnota
#| echo: true
#| eval: true
vec_spanek_ukazka <-
  c(
    12.1 # Cheetah
  )

vec_spanek_ukazka
```
:::

::: {.column width="48%"}
<br>

::: {.panel-data}
[Vektor (*vector*)]{.panel-title}

Vektor je uspořádaná řada hodnot stejného typu.
:::
:::

::::

:::::

## Druhý řádek přidá druhou hodnotu

::::: {.slide-margin-top-15}

:::: {.columns .align-center}

::: {.column width="48%"}
```{r}
#| label: vytvorit-vektor-dve-hodnoty
#| echo: true
#| eval: true
vec_spanek_ukazka <-
  c(
    12.1, # Cheetah
    17.0  # Owl monkey
  )

vec_spanek_ukazka
```
:::

::: {.column width="48%"}
<br>

::: {.panel-result}
[Co znamená pořadí?]{.panel-title}

První hodnota vektoru patří prvnímu řádku tabulky, druhá druhému řádku.
:::
:::

::::

:::::

## Stejné čtyři hodnoty zapíšeme do vektoru

<br>

```{r}
#| label: vytvorit-vektor-spanku
#| echo: true
#| eval: true
vec_spanek_ukazka <-
  c(
    12.1, # Cheetah
    17.0, # Owl monkey
    14.4, # Mountain beaver
    14.9  # Greater short-tailed shrew
  )
```

::: {.fragment}
::: {.strip-olive}
Tabulka uchovává i jména druhů. Samotný vektor uchovává jen hodnoty a jejich pořadí.
:::
:::

## Základní operace

::::: {.slide-margin-top-15}

:::: {.columns .align-top}

::: {.column width="48%"}
```{r}
#| label: zkontrolovat-delku-vektoru
#| echo: true
#| eval: true
length(
  x = vec_spanek_ukazka
)
```

::: {.panel-result .fragment}
`length()` říká, kolik hodnot máme.
:::
:::

::: {.column width="48%" .fragment}
```{r}
#| label: zkontrolovat-hlavu-vektoru
#| echo: true
#| eval: true
head(
  x = vec_spanek_ukazka,
  n = 2
)
```

::: {.panel-result .fragment}
`head()` ukáže první hodnoty (2 hodnoty v našem případě).
:::
:::

::::

:::::

## Celá tabulka přidává další proměnné

::: {.panel-data}
[Dataset `msleep`]{.panel-title}

- **`r nrow(data_savci)` řádků:** zastoupené druhy savců;
- **`r ncol(data_savci)` sloupců:** například spánek, hmotnost, potrava nebo taxonomický řád;
:::

::: {.fragment}
```{r}
#| label: zobrazit-prvni-radky-dat
#| echo: false
#| message: false
#| warning: false
data_savci |>
  dplyr::slice_head(n = 3) |>
  knitr::kable(
    align = c("l", "l", "l", "r", "r")
  )
```
:::


::: {.takeaway-strip .fragment}
Než popisujeme čísla, vždy si ujasníme **jednotku pozorování**, význam proměnné a jednotky měření.
:::

# Od tabulky ke grafu

## Data přibývají druh po druhu

```{r}
#| label: vytvorit-animaci-pribyvani-druhu
#| include: false
#| message: false
#| warning: false
path_gif_spanek <-
  here::here(
    path_materials,
    "spanek_pribyvani_druhu.gif"
  )

if (!file.exists(path_gif_spanek)) {
  set.seed(900723)

  plot_pozice_animace <-
    ggplot2::ggplot(
      data = data_spanek,
      mapping = ggplot2::aes(
        x = spanek_h,
        y = 1
      )
    ) +
    ggbeeswarm::geom_quasirandom(
      width = 0.34,
      orientation = "y"
    )

  data_pozice_animace <-
    ggplot2::ggplot_build(
      plot = plot_pozice_animace
    )$data[[1]] |>
    dplyr::transmute(
      x = x,
      y = y
    ) |>
    dplyr::bind_cols(
      data_spanek |>
        dplyr::select(druh)
    )

  vec_pocet_druhu <-
    unique(
      c(
        1:5,
        seq(
          from = 7,
          to = nrow(data_pozice_animace),
          by = 2
        ),
        nrow(data_pozice_animace)
      )
    )

  path_frames <-
    file.path(
      tempdir(),
      stringr::str_glue(
        "spanek-frame-{seq_along(vec_pocet_druhu)}.png"
      )
    )

  purrr::walk2(
    .x = vec_pocet_druhu,
    .y = path_frames,
    .f = function(pocet_druhu, path_frame) {
      plot_frame <-
        ggplot2::ggplot(
          data = data_pozice_animace |>
            dplyr::slice_head(n = pocet_druhu),
          mapping = ggplot2::aes(
            x = x,
            y = y
          )
        ) +
        ggplot2::geom_point(
          color = biostat_cols[["grey_olive"]],
          alpha = 0.85,
          size = 4
        ) +
        ggplot2::coord_cartesian(
          xlim = range(data_pozice_animace$x),
          ylim = c(0.55, 1.45)
        ) +
        ggplot2::scale_y_continuous(
          breaks = NULL,
          name = NULL
        ) +
        ggplot2::labs(
          title = stringr::str_glue(
            "{pocet_druhu} z {nrow(data_pozice_animace)} zastoupených druhů"
          ),
          x = "Celkový spánek za den (h)"
        ) +
        theme_biostat(base_size = 18) +
        ggplot2::theme(
          panel.grid.major.y = ggplot2::element_blank(),
          plot.title = ggplot2::element_text(
            hjust = 0.5,
            size = 20
          ),
          axis.title.x = ggplot2::element_text(
            size = 18
          ),
          axis.text.x = ggplot2::element_text(
            size = 14
          )
        )

      ggplot2::ggsave(
        filename = path_frame,
        plot = plot_frame,
        width = 10,
        height = 4.3,
        units = "in",
        dpi = 120,
        bg = "white"
      )
    }
  )

  vec_frames_s_dozvukem <-
    c(
      path_frames,
      rep(
        tail(path_frames, n = 1),
        times = 8
      )
    )

  magick::image_read(
    path = vec_frames_s_dozvukem
  ) |>
    magick::image_animate(
      fps = 10
    ) |>
    magick::image_write(
      path = path_gif_spanek
    )

  unlink(path_frames)
}
```

```{r}
#| label: zobrazit-animaci-pribyvani-druhu
#| echo: false
#| out-width: 92%
include_local_figure("spanek_pribyvani_druhu.gif")
```

::: {.takeaway-strip .fragment}
Graf nevzniká místo dat. Vzniká postupným zobrazením hodnot, které jsme vložili do tabulky a vektoru. Svislá poloha teček jen brání překryvu; osa y zde neznamená další měření.
:::
## Jak vypadá spánek všech zastoupených druhů?

```{r}
#| label: vytvorit-bodovy-graf-spanku
#| include: false
#| message: false
#| warning: false
plot_spanek_body <-
  ggplot2::ggplot(
    data = data_spanek,
    mapping = ggplot2::aes(
      x = spanek_h,
      y = 1
    )
  ) +
  ggbeeswarm::geom_quasirandom(
    width = 0.38,
    orientation = "y",
    color = biostat_cols[["grey_olive"]],
    alpha = 0.8,
    size = 4
  ) +
  ggplot2::scale_y_continuous(
    breaks = NULL,
    name = NULL
  ) +
  ggplot2::coord_cartesian(
    ylim = c(0.55, 1.45)
  ) +
  ggplot2::labs(
    x = "Celkový spánek za den (h)"
  ) +
  theme_biostat(base_size = 19) +
  ggplot2::theme(
    panel.grid.major.y = ggplot2::element_blank()
  ) +
  ggview::canvas(
    width = 1600,
    height = 700,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_spanek_body,
  file = here::here(
    path_materials,
    "spanek_bodovy_graf.png"
  )
)
```

```{r}
#| label: zobrazit-bodovy-graf-spanku
#| echo: false
include_local_figure("spanek_bodovy_graf.png")
```

::: {.fragment}
*Kde leží nejkratší a nejdelší doba spánku? Kde se body hromadí?*
:::

## Stejná data, seskupená do intervalů

```{r}
#| label: vytvorit-histogram-spanku
#| include: false
#| message: false
#| warning: false
plot_spanek_histogram <-
  ggplot2::ggplot(
    data = data_spanek,
    mapping = ggplot2::aes(x = spanek_h)
  ) +
  ggplot2::geom_histogram(
    binwidth = 2,
    boundary = 0,
    fill = biostat_cols[["amethyst"]],
    color = biostat_cols[["parchment"]],
    alpha = 0.65
  ) +
  ggplot2::labs(
    x = "Celkový spánek za den (h)",
    y = "Počet druhů"
  ) +
  theme_biostat(base_size = 19) +
  ggview::canvas(
    width = 1600,
    height = 800,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_spanek_histogram,
  file = here::here(
    path_materials,
    "spanek_histogram.png"
  )
)
```

```{r}
#| label: zobrazit-histogram-spanku
#| echo: false
include_local_figure("spanek_histogram.png")
```

::: {.strip-amethyst}
**Histogram** ukazuje počty v intervalech, ale skrývá přesné hodnoty jednotlivých druhů.
:::

## Stejná data, ale jako hladký tvar

```{r}
#| label: vytvorit-graf-hustoty-spanku
#| include: false
#| message: false
#| warning: false
plot_spanek_hustota <-
  ggplot2::ggplot(
    data = data_spanek,
    mapping = ggplot2::aes(x = spanek_h)
  ) +
  ggplot2::geom_density(
    fill = biostat_cols[["amethyst"]],
    color = biostat_cols[["indigo_velvet"]],
    alpha = 0.28,
    linewidth = 1.4
  ) +
  ggplot2::labs(
    x = "Celkový spánek za den (h)",
    y = "Hustota"
  ) +
  theme_biostat(base_size = 19) +
  ggview::canvas(
    width = 1600,
    height = 800,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_spanek_hustota,
  file = here::here(
    path_materials,
    "spanek_hustota.png"
  )
)
```

```{r}
#| label: zobrazit-graf-hustoty-spanku
#| echo: false
include_local_figure("spanek_hustota.png")
```

::: {.strip-amethyst}
**Graf hustoty** vyhlazuje naměřené hodnoty do souvislé křivky. Výška ukazuje hustotu, nikoli počet druhů; jednotlivé hodnoty v něm nevidíme.
:::

## Který graf byste použili?

::::: {.slide-margin-top-15}

::: {.box-question}
[Potřebujete zjistit, zda některý druh spí téměř 20 hodin denně.]{.panel-lead}
:::

<br>

:::: {.columns .align-top}

::: {.column width="31%"}
::: {.card-question}
[A]{.card-title}

[Bodový graf]{.rn-circle-indigo}
:::
:::

::: {.column width="31%"}
::: {.card-question}
[B]{.card-title}

[Histogram]{.rn-circle-indigo}
:::
:::

::: {.column width="31%"}
::: {.card-question}
[C]{.card-title}

Graf hustoty
:::
:::

::::

<br>

::: {.takeaway-strip}
Když nehlasujeme: napište si, který graf zachovává jednotlivé hodnoty a proč je to pro tuto otázku důležité.
:::

:::::

## Tři grafy, tři různé otázky

| Graf | Nejlépe ukáže | Co skrývá |
|---|---|---|
| Bodový graf | jednotlivé hodnoty | (při velkém počtu může být přeplněný) |
| Histogram | počty v intervalech | přesné hodnoty |
| Graf hustoty | hladký tvar | počty a konkrétní druhy |

<br>

::: {.takeaway-strip}
Graf vybíráme podle otázky.
:::

# Deskriptivní statistiky

## Devět druhů, devět dob spánku

```{r}
#| label: pripravit-maly-vzorek-spanku
#| include: false
#| message: false
#| warning: false
data_maly_spanek <-
  data_spanek |>
  dplyr::filter(
    druh %in% c(
      "Rabbit",
      "Domestic cat",
      "Dog",
      "Chimpanzee",
      "Sheep",
      "Human",
      "Pig",
      "Horse",
      "Cow"
    )
  ) |>
  dplyr::mutate(
    druh_cz = dplyr::recode(
      druh,
      "Rabbit" = "králík",
      "Domestic cat" = "kočka domácí",
      "Dog" = "pes",
      "Chimpanzee" = "šimpanz",
      "Sheep" = "ovce",
      "Human" = "člověk",
      "Pig" = "prase",
      "Horse" = "kůň",
      "Cow" = "kráva"
    ),
    druh_cz = forcats::fct_reorder(
      .f = druh_cz,
      .x = spanek_h
    )
  ) |>
  dplyr::arrange(spanek_h)

vec_maly_spanek <-
  data_maly_spanek |>
  dplyr::pull(spanek_h)

plot_maly_spanek <-
  ggplot2::ggplot(
    data = data_maly_spanek,
    mapping = ggplot2::aes(
      x = spanek_h,
      y = druh_cz
    )
  ) +
  ggplot2::geom_point(
    color = biostat_cols[["grey_olive"]],
    size = 4.5,
    alpha = 0.9
  ) +
  ggplot2::geom_text(
    mapping = ggplot2::aes(label = spanek_h),
    color = biostat_cols[["graphite"]],
    hjust = -0.45,
    size = 5
  ) +
  ggplot2::scale_x_continuous(
    limits = c(2, 15)
  ) +
  ggplot2::labs(
    x = "Celkový spánek za den (h)",
    y = NULL
  ) +
  theme_biostat(base_size = 18) +
  ggview::canvas(
    width = 1500,
    height = 850,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_maly_spanek,
  file = here::here(
    path_materials,
    "devet_druhu_spanek.png"
  )
)
```

```{r}
#| label: zobrazit-maly-vzorek-spanku
#| echo: false
include_local_figure("devet_druhu_spanek.png")
```

*Kam byste umístili jeden bod, který má zastoupit všech devět hodnot?*

## Minimum (*minimum*): nejmenší pozorovaná hodnota

```{r}
#| label: vytvorit-graf-minima
#| include: false
#| message: false
#| warning: false
minimum_maly <-
  min(vec_maly_spanek)

plot_maly_minimum <-
  plot_maly_spanek +
  ggplot2::geom_vline(
    xintercept = minimum_maly,
    color = biostat_cols[["orange"]],
    linewidth = 1.8
  )

ggview::save_ggplot(
  plot = plot_maly_minimum,
  file = here::here(
    path_materials,
    "devet_druhu_minimum.png"
  )
)
```

:::: {.columns .align-center}

::: {.column width="64%"}
```{r}
#| label: zobrazit-graf-minima
#| echo: false
include_local_figure("devet_druhu_minimum.png")
```
:::

::: {.column width="32%"}
<br>

```{r}
#| label: spocitat-minimum-v-r
#| echo: true
#| eval: true
vec_spanek_9 <- c(
  2.9, 3.8, 4, 8, 8.4,
  9.1, 9.7, 10.1, 12.5
)

min(
  x = vec_spanek_9
)
```

::: {.panel-result}
Minimum je zde **`r minimum_maly` h**.
:::
:::

::::

## Maximum (*maximum*): největší pozorovaná hodnota

```{r}
#| label: vytvorit-graf-maxima
#| include: false
#| message: false
#| warning: false
maximum_maly <-
  max(vec_maly_spanek)

plot_maly_maximum <-
  plot_maly_spanek +
  ggplot2::geom_vline(
    xintercept = maximum_maly,
    color = biostat_cols[["orange"]],
    linewidth = 1.8
  )

ggview::save_ggplot(
  plot = plot_maly_maximum,
  file = here::here(
    path_materials,
    "devet_druhu_maximum.png"
  )
)
```

:::: {.columns .align-center}

::: {.column width="64%"}
```{r}
#| label: zobrazit-graf-maxima
#| echo: false
include_local_figure("devet_druhu_maximum.png")
```
:::

::: {.column width="32%"}
<br>

```{r}
#| label: spocitat-maximum-v-r
#| echo: true
#| eval: true
max(
  x = vec_spanek_9
)
```

::: {.panel-result}
Maximum je zde **`r maximum_maly` h**.
:::
:::

::::

::: {.takeaway-strip .fragment}
Minimum a maximum ukazují krajní pozorované hodnoty. Když přidáme další druhy, mohou se posunout dál; silně závisejí na velikosti souboru a neříkají, kde leží většina dat.
:::

## Průměr: hodnoty sečteme a rozdělíme

```{r}
#| label: vytvorit-graf-prumeru
#| include: false
#| message: false
#| warning: false
prumer_maly <-
  mean(vec_maly_spanek)

txt_prumer_maly <-
  formatC(
    prumer_maly,
    format = "f",
    digits = 2,
    decimal.mark = ","
  )

plot_maly_prumer <-
  plot_maly_spanek +
  ggplot2::geom_vline(
    xintercept = prumer_maly,
    color = biostat_cols[["indigo_velvet"]],
    linetype = "dashed",
    linewidth = 1.8
  )

ggview::save_ggplot(
  plot = plot_maly_prumer,
  file = here::here(
    path_materials,
    "devet_druhu_prumer.png"
  )
)
```

:::: {.columns .align-top}

::: {.column width="62%"}
```{r}
#| label: zobrazit-graf-prumeru
#| echo: false
include_local_figure("devet_druhu_prumer.png")
```
:::

::: {.column width="34%"}

```{r}
#| label: spocitat-prumer-v-r
#| echo: true
#| eval: true
mean(
  x = vec_spanek_9
)
```

::: {.panel-result}
Průměr je zde **`r txt_prumer_maly` h**.
:::

:::

::::

::: {.strip-indigo .fragment}
**Aritmetický průměr (*mean*)** používá každou hodnotu a může být citlivý na hodnoty daleko od ostatních.
:::

## Seřadíme hodnoty a hledáme prostřední

```{r}
#| label: vytvorit-graf-medianu
#| include: false
#| message: false
#| warning: false
median_maly <-
  median(vec_maly_spanek)

txt_median_maly <-
  formatC(
    median_maly,
    format = "f",
    digits = 1,
    decimal.mark = ","
  )

plot_maly_median <-
  plot_maly_spanek +
  ggplot2::geom_vline(
    xintercept = median_maly,
    color = biostat_cols[["amethyst"]],
    linewidth = 1.8
  )

ggview::save_ggplot(
  plot = plot_maly_median,
  file = here::here(
    path_materials,
    "devet_druhu_median.png"
  )
)
```

:::: {.columns .align-top}

::: {.column width="62%"}
```{r}
#| label: zobrazit-graf-medianu
#| echo: false
include_local_figure("devet_druhu_median.png")
```
:::

::: {.column width="34%"}
**Medián = `r txt_median_maly` h**

```{r}
#| label: spocitat-median-v-r
#| echo: true
#| eval: true
median(
  x = vec_spanek_9
)
```

::: {.panel-result}
Čtyři hodnoty leží níže a čtyři výše.
:::
:::

::::

::: {.strip-indigo .fragment}
**Medián (*median*)** je prostřední hodnota seřazeného souboru.
:::

## Kvartily rozdělí seřazené hodnoty na čtvrtiny

```{r}
#| label: vytvorit-graf-kvartilu-a-iqr
#| include: false
#| message: false
#| warning: false
q1_maly <-
  quantile(
    vec_maly_spanek,
    probs = 0.25,
    names = FALSE
  )

q3_maly <-
  quantile(
    vec_maly_spanek,
    probs = 0.75,
    names = FALSE
  )

plot_maly_kvartily <-
  plot_maly_spanek +
  ggplot2::geom_vline(
    xintercept = c(q1_maly, q3_maly),
    color = biostat_cols[["amethyst"]],
    linewidth = 1.4,
    linetype = "dashed"
  )

ggview::save_ggplot(
  plot = plot_maly_kvartily,
  file = here::here(
    path_materials,
    "devet_druhu_kvartily.png"
  )
)
```

:::: {.columns .align-top}

::: {.column width="64%"}
```{r}
#| label: zobrazit-graf-kvartilu
#| echo: false
include_local_figure("devet_druhu_kvartily.png")
```
:::

::: {.column width="32%" .fragment}
<br>

```{r}
#| label: spocitat-kvartily-v-r
#| echo: true
#| eval: true
quantile(
  x = vec_spanek_9,
  probs = c(0.25, 0.75)
)
```

::: {.panel-result}
Q1 odděluje dolní čtvrtinu, Q3 horní čtvrtinu hodnot.
:::
:::

::::

::: {.strip-amethyst .fragment}
**Kvartily (*quartiles*) Q1 a Q3** určují hranice prostředních 50 % seřazených hodnot.
:::

## IQR je šířka prostřední poloviny

```{r}
#| label: vytvorit-graf-iqr
#| include: false
#| message: false
#| warning: false
plot_maly_iqr <-
  plot_maly_spanek +
  ggplot2::annotate(
    geom = "rect",
    xmin = q1_maly,
    xmax = q3_maly,
    ymin = -Inf,
    ymax = Inf,
    fill = biostat_cols[["amethyst"]],
    alpha = 0.18
  ) +
  ggplot2::geom_vline(
    xintercept = c(q1_maly, q3_maly),
    color = biostat_cols[["amethyst"]],
    linewidth = 1.2,
    linetype = "dashed"
  )

ggview::save_ggplot(
  plot = plot_maly_iqr,
  file = here::here(
    path_materials,
    "devet_druhu_iqr.png"
  )
)
```

:::: {.columns .align-top}

::: {.column width="64%"}
```{r}
#| label: zobrazit-graf-iqr
#| echo: false
include_local_figure("devet_druhu_iqr.png")
```
:::

::: {.column width="32%"}
<br>

```{r}
#| label: spocitat-iqr-v-r
#| echo: true
#| eval: true
IQR(
  x = vec_spanek_9
)
```
:::

::::

::: {.strip-amethyst .fragment}
**IQR (*interquartile range*) = Q3 − Q1.** Popisuje rozptýlení prostřední poloviny hodnot.
:::

## Oba soubory mají průměr 10 hodin — jsou stejné?

```{r}
#| label: vytvorit-soubory-se-stejnym-prumerem
#| include: false
#| message: false
#| warning: false
data_stejny_prumer <-
  tibble::tibble(
    soubor = c(
      rep("Soubor A", 5),
      rep("Soubor B", 5)
    ),
    spanek_h = c(
      8, 9, 10, 11, 12,
      4, 7, 10, 13, 16
    )
  ) |>
  dplyr::mutate(
    soubor = factor(
      soubor,
      levels = c("Soubor A", "Soubor B")
    )
  )

plot_stejny_prumer <-
  ggplot2::ggplot(
    data = data_stejny_prumer,
    mapping = ggplot2::aes(
      x = spanek_h,
      y = soubor
    )
  ) +
  ggplot2::geom_vline(
    xintercept = 10,
    color = biostat_cols[["indigo_velvet"]],
    linewidth = 1.2,
    linetype = "dashed"
  ) +
  ggplot2::geom_point(
    color = biostat_cols[["grey_olive"]],
    fill = biostat_cols[["grey_olive"]],
    size = 6,
    alpha = 0.8
  ) +
  ggplot2::annotate(
    geom = "label",
    x = 10,
    y = 2.18,
    label = "průměr = 10 h",
    color = biostat_cols[["indigo_velvet"]],
    fill = biostat_cols[["parchment"]],
    label.size = 0,
    fontface = "bold",
    size = 5
  ) +
  ggplot2::scale_x_continuous(
    breaks = seq(4, 16, by = 2),
    limits = c(3.5, 16.5)
  ) +
  ggplot2::labs(
    x = "Doba spánku (h)",
    y = NULL
  ) +
  theme_biostat(base_size = 18) +
  ggview::canvas(
    width = 1600,
    height = 700,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_stejny_prumer,
  file = here::here(
    path_materials,
    "dva_soubory_stejny_prumer.png"
  )
)
```

```{r}
#| label: zobrazit-soubory-se-stejnym-prumerem
#| echo: false
#| out-width: "78%"
include_local_figure("dva_soubory_stejny_prumer.png")
```


## Odchylka od průměru

```{r}
#| label: vytvorit-porovnani-sd
#| include: false
#| message: false
#| warning: false
data_sd_vypocet <-
  data_maly_spanek |>
  dplyr::mutate(
    prumer = prumer_maly,
    odchylka = spanek_h - prumer,
    poloha = dplyr::if_else(
      odchylka < 0,
      "pod průměrem",
      "nad průměrem"
    )
  )

plot_maly_vzdalenosti <-
  ggplot2::ggplot(
    data = data_sd_vypocet,
    mapping = ggplot2::aes(
      y = druh_cz
    )
  ) +
  ggplot2::geom_segment(
    mapping = ggplot2::aes(
      x = prumer,
      xend = spanek_h,
      yend = druh_cz,
      color = poloha
    ),
    linewidth = 3,
    alpha = 0.55
  ) +
  ggplot2::geom_vline(
    xintercept = prumer_maly,
    color = biostat_cols[["indigo_velvet"]],
    linetype = "dashed",
    linewidth = 1.5
  ) +
  ggplot2::geom_point(
    mapping = ggplot2::aes(
      x = spanek_h
    ),
    color = biostat_cols[["graphite"]],
    size = 4
  ) +
  ggplot2::scale_color_manual(
    values = c(
      "pod průměrem" = biostat_cols[["amethyst"]],
      "nad průměrem" = biostat_cols[["orange"]]
    )
  ) +
  ggplot2::scale_x_continuous(
    limits = c(2, 14)
  ) +
  ggplot2::labs(
    x = "Celkový spánek za den (h)",
    y = NULL,
    color = NULL
  ) +
  theme_biostat(base_size = 18) +
  ggplot2::theme(
    legend.position = "none"
  ) +
  ggview::canvas(
    width = 1500,
    height = 850,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_maly_vzdalenosti,
  file = here::here(
    path_materials,
    "devet_druhu_odchylky_od_prumeru.png"
  )
)
```

:::: {.columns .align-top}

::: {.column width="68%"}
```{r}
#| label: zobrazit-odchylky-od-prumeru
#| echo: false
#| out-width: "95%"
include_local_figure(
  "devet_druhu_odchylky_od_prumeru.png"
)
```
:::

::: {.column width="28%" .fragment}
::: {.panel-note}
[Odchylka (*deviation*)]{.panel-title}

::: {.text-size-body .text-bold .text-center}
odchylka doby spánku =

doba spánku druhu −

průměrná doba spánku
:::

[Fialová]{.text-hgl-amethyst} vede pod průměr, [oranžová]{.text-hgl-orange} nad něj.
:::
:::

::::

::: {.takeaway-strip}
Délka barevného úseku ukazuje, jak daleko je každá hodnota od [aritmetického průměru]{.text-hgl-indigo}.
:::

## Odchylka u kočky

```{r}
#| label: spocitat-odchylku-kocky
#| include: false
hodnota_kocka_maly <-
  data_sd_vypocet |>
  dplyr::filter(
    druh_cz == "kočka domácí"
  ) |>
  dplyr::pull(spanek_h)

odchylka_kocka_maly <-
  hodnota_kocka_maly - prumer_maly

txt_hodnota_kocka_maly <-
  formatC(
    hodnota_kocka_maly,
    format = "f",
    digits = 1,
    decimal.mark = ","
  )

txt_odchylka_kocka_maly <-
  formatC(
    odchylka_kocka_maly,
    format = "f",
    digits = 2,
    decimal.mark = ","
  )
```

:::: {.columns .align-top}

::: {.column width="62%"}
```{r}
#| label: zobrazit-odchylku-kocky
#| echo: false
#| out-width: "95%"
include_local_figure(
  "devet_druhu_odchylky_od_prumeru.png"
)
```
:::

::: {.column width="34%"}
::: {.panel-data}
[Hodnoty z horního řádku]{.panel-title}

Kočka domácí: **`r txt_hodnota_kocka_maly` h**

Aritmetický průměr: **`r txt_prumer_maly` h**
:::

::: {.panel-result .fragment}
[Dosazení]{.panel-title}

::: {.text-size-large .text-bold .text-center}
`r txt_hodnota_kocka_maly` h − `r txt_prumer_maly` h =

`r txt_odchylka_kocka_maly` h
:::
:::
:::

::::

::: {.takeaway-strip .fragment}
Kladný výsledek říká, že kočka domácí spí déle než průměr devíti druhů.
:::

## Odchylky se navzájem vyruší

```{r}
#| label: vytvorit-soucet-odchylek
#| include: false
#| message: false
#| warning: false
soucet_odchylek_maly <-
  sum(data_sd_vypocet$odchylka)

txt_soucet_odchylek_maly <-
  formatC(
    soucet_odchylek_maly,
    format = "f",
    digits = 2,
    decimal.mark = ","
  )

plot_maly_odchylky <-
  ggplot2::ggplot(
    data = data_sd_vypocet,
    mapping = ggplot2::aes(
      x = druh_cz,
      y = odchylka,
      fill = poloha
    )
  ) +
  ggplot2::geom_col(
    width = 0.72,
    alpha = 0.8
  ) +
  ggplot2::geom_hline(
    yintercept = 0,
    color = biostat_cols[["graphite"]],
    linewidth = 1
  ) +
  ggplot2::scale_fill_manual(
    values = c(
      "pod průměrem" = biostat_cols[["amethyst"]],
      "nad průměrem" = biostat_cols[["orange"]]
    )
  ) +
  ggplot2::coord_flip() +
  ggplot2::labs(
    x = NULL,
    y = "Hodnota − průměr (h)",
    fill = NULL
  ) +
  theme_biostat(base_size = 18) +
  ggplot2::theme(
    legend.position = "none"
  ) +
  ggview::canvas(
    width = 1200,
    height = 850,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_maly_odchylky,
  file = here::here(
    path_materials,
    "devet_druhu_odchylky_soucet.png"
  )
)
```

:::: {.columns .align-top}

::: {.column width="62%"}
```{r}
#| label: zobrazit-soucet-odchylek
#| echo: false
include_local_figure(
  "devet_druhu_odchylky_soucet.png"
)
```
:::

::: {.column width="34%" .fragment}
::: {.panel-result}
[Součet odchylek]{.panel-title}

::: {.text-size-body .text-bold .text-center}
součet odchylek =

kladné odchylky + záporné odchylky
:::

::: {.text-size-large .text-bold .text-center}
= `r txt_soucet_odchylek_maly` h
:::

Kolem průměru se navzájem vyváží.
:::
:::

::::

::: {.box-question .fragment}
[Když prostý součet vždy vyjde přibližně nula, jak zachováme velikost vzdáleností?]{.panel-lead}
:::

## Odchylky umocníme na druhou

```{r}
#| label: vytvorit-ctverce-odchylek
#| include: false
#| message: false
#| warning: false
data_sd_vypocet <-
  data_sd_vypocet |>
  dplyr::mutate(
    ctverec_odchylky = odchylka^2
  )

ctverec_kocka_maly <-
  odchylka_kocka_maly^2

txt_ctverec_kocka_maly <-
  formatC(
    ctverec_kocka_maly,
    format = "f",
    digits = 2,
    decimal.mark = ","
  )

plot_maly_ctverce_odchylek <-
  ggplot2::ggplot(
    data = data_sd_vypocet,
    mapping = ggplot2::aes(
      x = druh_cz,
      y = ctverec_odchylky
    )
  ) +
  ggplot2::geom_col(
    width = 0.72,
    fill = biostat_cols[["orange"]],
    alpha = 0.8
  ) +
  ggplot2::coord_flip() +
  ggplot2::labs(
    x = NULL,
    y = "Odchylka² (h²)"
  ) +
  theme_biostat(base_size = 18) +
  ggview::canvas(
    width = 1200,
    height = 850,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_maly_ctverce_odchylek,
  file = here::here(
    path_materials,
    "devet_druhu_ctverce_odchylek.png"
  )
)
```

:::: {.columns .align-top}

::: {.column width="62%"}
```{r}
#| label: zobrazit-ctverce-odchylek
#| echo: false
include_local_figure(
  "devet_druhu_ctverce_odchylek.png"
)
```
:::

::: {.column width="34%" .fragment}
::: {.panel-result}
[Čtverec odchylky]{.panel-title}

::: {.text-size-body .text-bold .text-center}
čtverec odchylky = odchylka²
:::

Všechny příspěvky jsou nezáporné.

::: {.text-size-large .text-bold .text-center .fragment}
(`r txt_hodnota_kocka_maly` − `r txt_prumer_maly`)² =

`r txt_odchylka_kocka_maly`² =

`r txt_ctverec_kocka_maly` h²
:::

:::

::: {.panel-note .fragment}
Nejvíce zde přispívá kočka domácí, protože leží nejdále od průměru.
:::
:::

::::

## Stejný krok rozepíšeme pro všech devět druhů

```{r}
#| label: pripravit-soucet-ctvercu-odchylek
#| include: false
soucet_ctvercu_maly <-
  sum(data_sd_vypocet$ctverec_odchylky)

txt_soucet_ctvercu_maly <-
  formatC(
    soucet_ctvercu_maly,
    format = "f",
    digits = 2,
    decimal.mark = ","
  )

txt_hodnoty_maly <-
  formatC(
    vec_maly_spanek,
    format = "f",
    digits = 1,
    decimal.mark = ","
  )

txt_ctverce_radky_maly <-
  purrr::map_chr(
    .x = split(
      seq_along(txt_hodnoty_maly),
      ceiling(
        seq_along(txt_hodnoty_maly) / 3
      )
    ),
    .f = function(index) {
      paste0(
        "(",
        txt_hodnoty_maly[index],
        " − ",
        txt_prumer_maly,
        ")²",
        collapse = " + "
      )
    }
  )
```

::::: {.slide-margin-top-15}

::: {.panel-data}
[Všechny hodnoty jsou převzaté z grafu]{.panel-title}

::: {.text-size-body .text-bold .text-center}
`r txt_ctverce_radky_maly[[1]]` +

`r txt_ctverce_radky_maly[[2]]` +

`r txt_ctverce_radky_maly[[3]]`
:::

::: {.text-size-large .text-bold .text-center .fragment}
= `r txt_soucet_ctvercu_maly` h²
:::
:::

::: {.takeaway-strip .fragment}
Součet devíti čtverců odchylek shrnuje jejich celkovou velikost do jednoho čísla.
:::

:::::

## Výběrový rozptyl

```{r}
#| label: spocitat-rozptyl-maleho-souboru
#| include: false
rozptyl_maly <-
  var(vec_maly_spanek)

n_maly <-
  length(vec_maly_spanek)

txt_rozptyl_maly <-
  formatC(
    rozptyl_maly,
    format = "f",
    digits = 2,
    decimal.mark = ","
  )
```

<br>

::::: {}

::: {.panel-data}
[Výpočet slovy]{.panel-title}

::: {.text-size-large .text-bold .text-center}
výběrový rozptyl (*sample variance*) =

[součet čtvercových odchylek]{.text-hgl-indigo} dělený

[počtem hodnot]{.text-hgl-orange} [zmenšeným o jednu]{.text-hgl-amethyst}
:::
:::

::: {.panel-result .fragment}
[Dosazení hodnot]{.panel-title}

::: {.text-size-large .text-bold .text-center}
`r txt_soucet_ctvercu_maly` h² /
(`r n_maly` − 1) =

`r txt_soucet_ctvercu_maly` h² /
`r n_maly - 1` =
**`r txt_rozptyl_maly` h²**
:::
:::

::: {.strip-orange .fragment}
Jednotkou rozptylu jsou **hodiny na druhou**. Proto se rozptyl hůře interpretuje přímo.
:::

:::::

## Vzorec shrnuje stejný výpočet

:::: {.columns .align-top}

::: {.column width="48%"}
::: {.panel-result}
[Obecný vzorec]{.panel-title}

::: {.text-size-large .text-bold .text-center}
s² = Σ(xᵢ − x̄)² / (n − 1)
:::
:::

```{r}
#| label: spocitat-rozptyl-v-r
#| echo: true
#| eval: true
var(
  x = vec_spanek_9
)
```
:::

::: {.column width="48%"}
::: {.panel-note}
[Co znamenají symboly?]{.panel-title}

- **s²** — výběrový rozptyl;
- **xᵢ** — doba spánku jednoho druhu;
- **x̄** — aritmetický průměr;
- **n** — počet hodnot;
- **Σ** — sečteme příspěvky všech druhů.
:::
:::

::::

<br>

::: {.takeaway-strip .fragment}
Vzorec zapisuje stejný výpočet pro libovolný počet hodnot.
:::

## Směrodatná odchylka

```{r}
#| label: vytvorit-sd-jako-oblast
#| include: false
#| message: false
#| warning: false
sd_maly <-
  sd(vec_maly_spanek)

txt_sd_maly <-
  formatC(
    sd_maly,
    format = "f",
    digits = 2,
    decimal.mark = ","
  )

plot_maly_sd <-
  plot_maly_spanek +
  ggplot2::annotate(
    geom = "rect",
    xmin = prumer_maly - sd_maly,
    xmax = prumer_maly + sd_maly,
    ymin = -Inf,
    ymax = Inf,
    fill = biostat_cols[["orange"]],
    alpha = 0.2
  ) +
  ggplot2::geom_vline(
    xintercept = prumer_maly,
    color = biostat_cols[["indigo_velvet"]],
    linetype = "dashed",
    linewidth = 1.5
  )

ggview::save_ggplot(
  plot = plot_maly_sd,
  file = here::here(
    path_materials,
    "devet_druhu_sd_oblast.png"
  )
)
```

:::: {.columns .align-top}

::: {.column width="58%"}
```{r}
#| label: zobrazit-sd-jako-oblast
#| echo: false
include_local_figure("devet_druhu_sd_oblast.png")
```
:::

::: {.column width="38%"}
::: {.panel-data}
[Vztah k rozptylu]{.panel-title}

::: {.text-size-body .text-bold .text-center}
směrodatná odchylka =

druhá odmocnina z rozptylu
:::
:::

::: {.panel-result .fragment}
[Dosazení hodnot]{.panel-title}

::: {.text-size-large .text-bold .text-center}
√`r txt_rozptyl_maly` h² =
**`r txt_sd_maly` h**
:::
:::

::: {.panel-note .fragment}
[Vzorec]{.panel-title}

::: {.text-size-large .text-bold .text-center}
s = √s²
:::

**s** je směrodatná odchylka a **s²** výběrový rozptyl.
:::
:::

::::

::: {.takeaway-strip .fragment}
V R stejný krok provede `sd(x = vec_spanek_9)`. **SD (*standard deviation*)** je zpět v [původních jednotkách]{.text-hgl-indigo}.
:::

## Stejná průměrná mzda, jiné SD

```{r}
#| label: vytvorit-histogramy-sd
#| include: false
#| message: false
#| warning: false
set.seed(900723)

pocet_zamestnancu <-
  240

prumer_mzdy_tis <-
  50

sd_firma_a_tis <-
  3

sd_firma_b_tis <-
  12

popisek_firma_a <-
  stringr::str_glue(
    "Firma A: SD {sd_firma_a_tis} tis."
  )

popisek_firma_b <-
  stringr::str_glue(
    "Firma B: SD {sd_firma_b_tis} tis."
  )

vec_mzda_firma_a <-
  as.numeric(
    scale(
      rnorm(n = pocet_zamestnancu)
    )
  ) * sd_firma_a_tis + prumer_mzdy_tis

vec_mzda_firma_b <-
  as.numeric(
    scale(
      rnorm(n = pocet_zamestnancu)
    )
  ) * sd_firma_b_tis + prumer_mzdy_tis

data_mzdy_sd_histogram <-
  tibble::tibble(
    firma = rep(
      c(
        popisek_firma_a,
        popisek_firma_b
      ),
      each = pocet_zamestnancu
    ),
    mzda_tis_kc = c(
      vec_mzda_firma_a,
      vec_mzda_firma_b
    )
  )

plot_porovnani_sd_histogram <-
  ggplot2::ggplot(
    data = data_mzdy_sd_histogram,
    mapping = ggplot2::aes(
      x = mzda_tis_kc
    )
  ) +
  ggplot2::geom_histogram(
    binwidth = 3,
    boundary = 0,
    fill = biostat_cols[["amethyst"]],
    color = biostat_cols[["parchment"]],
    alpha = 0.7
  ) +
  ggplot2::geom_vline(
    xintercept = prumer_mzdy_tis,
    color = biostat_cols[["indigo_velvet"]],
    linetype = "dashed",
    linewidth = 1.4
  ) +
  ggplot2::facet_wrap(
    facets = ggplot2::vars(firma),
    ncol = 2
  ) +
  ggplot2::labs(
    x = "Měsíční mzda (tis. Kč)",
    y = "Počet zaměstnanců"
  ) +
  theme_biostat(base_size = 16) +
  ggview::canvas(
    width = 1600,
    height = 800,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_porovnani_sd_histogram,
  file = here::here(
    path_materials,
    "stejny_prumer_jina_sd_histogram.png"
  )
)
```

```{r}
#| label: zobrazit-histogramy-sd
#| echo: false
#| out-width: "80%"
include_local_figure("stejny_prumer_jina_sd_histogram.png")
```

::: {.takeaway-strip}
V obou firmách je průměr `r prumer_mzdy_tis` tisíc Kč. Vyšší SD ve firmě B (`r sd_firma_b_tis` tisíc Kč oproti `r sd_firma_a_tis` tisícům Kč) znamená širší histogram.
:::

## Které souhrny patří k sobě?

::::: {.slide-margin-top-15}

::: {.box-question}
[Vyberte dvojici, která popisuje střed a rozptýlení podobným způsobem.]{.panel-lead}
:::

<br>

:::: {.columns .align-top}

::: {.column width="31%"}
::: {.card-question}
[A]{.card-title}

průměr + IQR
:::
:::

::: {.column width="31%"}
::: {.card-question}
[B]{.card-title}

[průměr + SD]{.rn-circle-indigo}
:::
:::

::: {.column width="31%"}
::: {.card-question}
[C]{.card-title}

medián + SD
:::
:::

::::

<br>
<br>

:::::

## Dvě užitečné dvojice

::::: {.slide-margin-top-15}

:::: {.columns .align-top}

::: {.column width="48%" .fragment}
::: {.panel-result}
[Průměr + SD]{.panel-title}

Používají všechny hodnoty a jsou citlivější k hodnotám daleko od středu.
:::
:::

::: {.column width="48%" .fragment}
::: {.panel-result}
[Medián + IQR]{.panel-title}

Vycházejí z pořadí hodnot a jsou odolnější vůči vzdáleným hodnotám.
:::
:::

::::

<br>

::: {.takeaway-strip .fragment}
Volbu neurčuje zvyk. Rozhoduje tvar dat a otázka, kterou souhrnem zodpovídáme.
:::

:::::

# Zpět k titulku

## Malý netopýr a velký slon jsou v jedné tabulce

:::: {.columns .align-center}

::: {.column width="43%"}
::: {.text-size-heading2 .text-bold}
Co znamená „běžná“ hmotnost?
:::

<br>

::: {.panel-question}
[Biologická otázka]{.panel-title}

Má jedno číslo zastoupit druhy od velmi malých savců až po slony?
:::

<br>


::: {.fragment}
Volbu souhrnu opřeme o tvar dat v grafu.
:::

:::

::: {.column width="53%"}
```{r}
#| label: zobrazit-slona
#| echo: false
#| fig-alt: "Humorná ilustrace slona stojícího na malé osobní váze."
#| out-width: "100%"

include_local_figure("mammal_elephant_illustrative.png")
```

::: {.text-size-tiny .text-right}
Ilustrace vytvořená pomocí AI.
:::
:::

::::

## Vracíme se k tělesné hmotnosti

```{r}
#| label: vytvorit-hmotnost-linear
#| include: false
#| message: false
#| warning: false
data_hmotnost <-
  data_savci |>
  tidyr::drop_na(hmotnost_kg)

plot_hmotnost_linear <-
  ggplot2::ggplot(
    data = data_hmotnost,
    mapping = ggplot2::aes(
      x = hmotnost_kg,
      y = 1
    )
  ) +
  ggbeeswarm::geom_quasirandom(
    width = 0.28,
    orientation = "y",
    color = biostat_cols[["grey_olive"]],
    alpha = 0.75,
    size = 3.6
  ) +
  ggplot2::geom_vline(
    xintercept = prumer_hmotnosti,
    color = biostat_cols[["indigo_velvet"]],
    linetype = "dashed",
    linewidth = 1.5
  ) +
  ggplot2::geom_vline(
    xintercept = median_hmotnosti,
    color = biostat_cols[["amethyst"]],
    linewidth = 1.5
  ) +
  ggplot2::scale_x_continuous(
    labels = scales::label_number(
      big.mark = " ",
      decimal.mark = ","
    )
  ) +
  ggplot2::scale_y_continuous(
    breaks = NULL,
    name = NULL
  ) +
  ggplot2::coord_cartesian(
    ylim = c(0.6, 1.4)
  ) +
  ggplot2::labs(
    x = NULL
  ) +
  theme_biostat(base_size = 18) +
  ggplot2::theme(
    panel.grid.major.y = ggplot2::element_blank()
  ) +
  ggview::canvas(
    width = 1600,
    height = 700,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_hmotnost_linear,
  file = here::here(
    path_materials,
    "hmotnost_linearni_osa.png"
  )
)
```

```{r}
#| label: zobrazit-hmotnost-linear
#| echo: false
include_local_figure("hmotnost_linearni_osa.png")
```

::: {.text-center .text-size-body}
**Tělesná hmotnost druhu (kg), lineární osa**
:::

::: {.strip-orange .fragment}
Několik velmi těžkých druhů roztáhne osu tak silně, že většina bodů splývá u nuly.
:::

## Stejná data na logaritmické ose

```{r}
#| label: vytvorit-hmotnost-log
#| include: false
#| message: false
#| warning: false
plot_hmotnost_log <-
  ggplot2::ggplot(
    data = data_hmotnost,
    mapping = ggplot2::aes(
      x = hmotnost_kg,
      y = 1
    )
  ) +
  ggbeeswarm::geom_quasirandom(
    width = 0.34,
    orientation = "y",
    color = biostat_cols[["grey_olive"]],
    alpha = 0.75,
    size = 3.6
  ) +
  ggplot2::geom_vline(
    xintercept = prumer_hmotnosti,
    color = biostat_cols[["indigo_velvet"]],
    linetype = "dashed",
    linewidth = 1.5
  ) +
  ggplot2::geom_vline(
    xintercept = median_hmotnosti,
    color = biostat_cols[["amethyst"]],
    linewidth = 1.5
  ) +
  ggplot2::scale_x_log10(
    breaks = c(
      0.01,
      0.1,
      1,
      10,
      100,
      1000
    ),
    labels = c(
      "0,01",
      "0,1",
      "1",
      "10",
      "100",
      "1 000"
    )
  ) +
  ggplot2::scale_y_continuous(
    breaks = NULL,
    name = NULL
  ) +
  ggplot2::coord_cartesian(
    ylim = c(0.55, 1.45)
  ) +
  ggplot2::labs(
    x = NULL
  ) +
  theme_biostat(base_size = 18) +
  ggplot2::theme(
    panel.grid.major.y = ggplot2::element_blank()
  ) +
  ggview::canvas(
    width = 1600,
    height = 700,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_hmotnost_log,
  file = here::here(
    path_materials,
    "hmotnost_logaritmicka_osa.png"
  )
)
```

```{r}
#| label: zobrazit-hmotnost-log
#| echo: false
include_local_figure("hmotnost_logaritmicka_osa.png")
```

::: {.text-center .text-size-body}
**Tělesná hmotnost (kg), logaritmická osa**
:::

::: {.takeaway-strip .fragment}
Graf nezměnil data. Jen nám dovolil vidět lehké i těžké druhy současně. Plná fialová čára je medián, přerušovaná tmavá čára průměr.
:::

## Co znamená logaritmická osa?

::: {.text-size-heading2 .text-bold .text-center}
Stejná vzdálenost na ose znamená stejný násobek.
:::

```{r}
#| label: vytvorit-vysvetleni-logaritmicke-osy
#| include: false
#| message: false
#| warning: false
vec_log_hmotnost_kg <-
  c(
    0.1,
    1,
    10,
    100,
    1000
  )

data_log_hodnoty <-
  tibble::tibble(
    hmotnost_kg = vec_log_hmotnost_kg,
    popisek =
      c(
        "0,1 kg",
        "1 kg",
        "10 kg",
        "100 kg",
        "1 000 kg"
      )
  )

data_log_intervaly <-
  tibble::tibble(
    dolni = head(
      x = vec_log_hmotnost_kg,
      n = -1
    ),
    horni = tail(
      x = vec_log_hmotnost_kg,
      n = -1
    )
  ) |>
  dplyr::mutate(
    stred = sqrt(dolni * horni),
    popisek = "10x"
  )

plot_log_osa_vysvetleni <-
  ggplot2::ggplot(
    data = data_log_hodnoty,
    mapping = ggplot2::aes(
      x = hmotnost_kg,
      y = 0
    )
  ) +
  ggplot2::geom_segment(
    mapping = ggplot2::aes(
      x = min(vec_log_hmotnost_kg),
      xend = max(vec_log_hmotnost_kg),
      y = 0,
      yend = 0
    ),
    color = biostat_cols[["graphite"]],
    linewidth = 1.2
  ) +
  ggplot2::geom_point(
    color = biostat_cols[["indigo_velvet"]],
    size = 5
  ) +
  ggplot2::geom_text(
    mapping = ggplot2::aes(label = popisek),
    color = biostat_cols[["graphite"]],
    nudge_y = -0.12,
    size = 6
  ) +
  ggplot2::geom_text(
    data = data_log_intervaly,
    mapping = ggplot2::aes(
      x = stred,
      y = 0.13,
      label = popisek
    ),
    inherit.aes = FALSE,
    color = biostat_cols[["orange"]],
    fontface = "bold",
    size = 6
  ) +
  ggplot2::scale_x_log10(
    limits = c(0.08, 1250)
  ) +
  ggplot2::coord_cartesian(
    ylim = c(-0.2, 0.2),
    clip = "off"
  ) +
  ggplot2::labs(
    x = NULL,
    y = NULL
  ) +
  theme_biostat() +
  ggplot2::theme(
    axis.title = ggplot2::element_blank(),
    axis.text = ggplot2::element_blank(),
    axis.ticks = ggplot2::element_blank(),
    panel.grid = ggplot2::element_blank()
  )

ggview::save_ggplot(
  plot = plot_log_osa_vysvetleni,
  file = here::here(
    path_materials,
    "logaritmicka_osa_vysvetleni.png"
  )
)
```

```{r}
#| label: zobrazit-vysvetleni-logaritmicke-osy
#| echo: false
#| out-width: "92%"
include_local_figure("logaritmicka_osa_vysvetleni.png")
```

::: {.takeaway-strip}
Úsek od 1 do 10 kg je stejně dlouhý jako úsek od 10 do 100 kg. Nulu ani zápornou hodnotu na logaritmické ose zobrazit nelze.
:::

## Jak dvě redakce počítaly?

::::: {.slide-margin-top-15}

:::: {.columns .align-top}

::: {.column width="48%"}
::: {.card-data}
[Titulek A · průměr]{.card-title}

„Průměrný savec váží [**`r txt_prumer_hmotnosti` kg**]{.text-hgl-indigo_velvet}.“
:::

::: {.card-question}
**A)** Pouze A.
:::

::: {.card-question}
[**C) Oba mohou být správně.**]{.rn-circle-indigo}
:::
:::

::: {.column width="48%"}
::: {.card-data}
[Titulek B · medián]{.card-title}

„Běžný savec váží jen [**`r txt_median_hmotnosti` kg**]{.text-hgl-amethyst}.“
:::

::: {.card-question}
**B)** Pouze B.
:::

::: {.card-question}
**D)** Nemáme dost informací.
:::
:::

::::

<br>

::: {.takeaway-strip .fragment}
Obě čísla jsou správně vypočtená. Ani jedno však není univerzální „typický savec“.
:::

:::::

## Statistická redakce: opravte titulek

::: {.panel-data}
[Důkazy]{.panel-title}

- řádek představuje zastoupený **druh**
- rozdělení hmotnosti je ovlivněno několika velmi těžkými druhy;
- průměr = `r txt_prumer_hmotnosti` kg, medián = `r txt_median_hmotnosti` kg.
:::

<br>

::: {.text-size-heading2 .text-bold .text-center}
Přepište jeden titulek tak, aby byl pravdivý i po přečtení grafu.
:::

<br>


## Co z tabulky smíme tvrdit?

::::: {.slide-margin-top-15}

:::: {.columns .align-top}

::: {.column width="48%"}
::: {.panel-result}
[Poctivý závěr]{.panel-title}

V této tabulce je medián hmotnosti zastoupeného druhu
[**`r txt_median_hmotnosti` kg**]{.text-hgl-amethyst}, ale několik velmi těžkých
druhů posouvá průměr na [**`r txt_prumer_hmotnosti` kg**]{.text-hgl-indigo_velvet}.
:::
:::

::: {.column width="48%" .fragment}
::: {.panel-warning}
[Pozor!]{.panel-title}

Tabulka [není náhodným výběrem]{.text-hgl-orange} všech druhů ani všech
jednotlivých savců. Čísla proto nepopisují „náhodného savce na Zemi“.
:::
:::

::::

:::::

# Statistiky jako vizualizace

## Správný titulek můžeme doplnit grafem

```{r}
#| label: pripravit-konstrukci-boxplotu
#| include: false
#| message: false
#| warning: false
plot_hmotnost_body <-
  ggplot2::ggplot(
    data = data_hmotnost,
    mapping = ggplot2::aes(
      x = hmotnost_kg,
      y = 1
    )
  ) +
  ggbeeswarm::geom_quasirandom(
    width = 0.34,
    orientation = "y",
    color = biostat_cols[["grey_olive"]],
    alpha = 0.75,
    size = 3.6
  ) +
  ggplot2::scale_x_log10(
    breaks = c(
      0.01,
      0.1,
      1,
      10,
      100,
      1000,
      10000
    ),
    labels = c(
      "0,01",
      "0,1",
      "1",
      "10",
      "100",
      "1 000",
      "10 000"
    ),
    limits = c(0.004, 20000)
  ) +
  ggplot2::scale_y_continuous(
    breaks = NULL,
    name = NULL
  ) +
  ggplot2::coord_cartesian(
    ylim = c(0.55, 1.45)
  ) +
  ggplot2::labs(
    x = "Tělesná hmotnost (kg; logaritmická osa)"
  ) +
  theme_biostat(base_size = 18) +
  ggplot2::theme(
    panel.grid.major.y = ggplot2::element_blank()
  ) +
  ggview::canvas(
    width = 1600,
    height = 700,
    units = "px"
  )

plot_box_krok1 <-
  plot_hmotnost_body +
  ggplot2::geom_vline(
    xintercept = median_hmotnosti,
    color = biostat_cols[["amethyst"]],
    linewidth = 1.8
  )

ggview::save_ggplot(
  plot = plot_box_krok1,
  file = here::here(
    path_materials,
    "hmotnost_boxplot_krok_1_median.png"
  )
)
```

```{r}
#| label: zobrazit-boxplot-krok1
#| echo: false
include_local_figure("hmotnost_boxplot_krok_1_median.png")
```

::: {.takeaway-strip}
„Běžný zastoupený druh váží **`r txt_median_hmotnosti` kg**.“ Graf ukazuje data i medián za tímto titulkem.
:::

## Přidáme prostřední polovinu

```{r}
#| label: vytvorit-boxplot-krok2
#| include: false
#| message: false
#| warning: false
stat_boxplot_hmotnost <-
  boxplot.stats(vec_hmotnost_kg)

q1_hmotnost <-
  stat_boxplot_hmotnost$stats[[2]]

q3_hmotnost <-
  stat_boxplot_hmotnost$stats[[4]]

plot_box_krok2 <-
  plot_hmotnost_body +
  ggplot2::annotate(
    geom = "rect",
    xmin = q1_hmotnost,
    xmax = q3_hmotnost,
    ymin = 0.82,
    ymax = 1.18,
    fill = biostat_cols[["amethyst"]],
    color = biostat_cols[["indigo_velvet"]],
    alpha = 0.28,
    linewidth = 1.3
  ) +
  ggplot2::geom_vline(
    xintercept = median_hmotnosti,
    color = biostat_cols[["amethyst"]],
    linewidth = 1.8
  )

ggview::save_ggplot(
  plot = plot_box_krok2,
  file = here::here(
    path_materials,
    "hmotnost_boxplot_krok_2_iqr.png"
  )
)
```

```{r}
#| label: zobrazit-boxplot-krok2
#| echo: false
include_local_figure("hmotnost_boxplot_krok_2_iqr.png")
```

::: {.strip-amethyst}
Šířka krabice je [**IQR**]{.text-hgl-amethyst}: prostředních 50 % hodnot.
:::

## Přidáme vousy

Vous končí u nejkrajnější pozorované hodnoty nejvýše 1,5 × IQR od okraje krabice. Body dál od krabice vyznačíme zvlášť; nejsou automaticky chybou. Pravidlo počítáme v původních kilogramech.

```{r}
#| label: vytvorit-boxplot-krok3
#| include: false
#| message: false
#| warning: false
vous_dolni_hmotnost <-
  stat_boxplot_hmotnost$stats[[1]]

vous_horni_hmotnost <-
  stat_boxplot_hmotnost$stats[[5]]

plot_box_krok3 <-
  plot_hmotnost_body +
  ggplot2::annotate(
    geom = "rect",
    xmin = q1_hmotnost,
    xmax = q3_hmotnost,
    ymin = 0.82,
    ymax = 1.18,
    fill = biostat_cols[["amethyst"]],
    color = biostat_cols[["indigo_velvet"]],
    alpha = 0.28,
    linewidth = 1.3
  ) +
  ggplot2::annotate(
    geom = "segment",
    x = vous_dolni_hmotnost,
    xend = q1_hmotnost,
    y = 1,
    yend = 1,
    color = biostat_cols[["indigo_velvet"]],
    linewidth = 1.3
  ) +
  ggplot2::annotate(
    geom = "segment",
    x = q3_hmotnost,
    xend = vous_horni_hmotnost,
    y = 1,
    yend = 1,
    color = biostat_cols[["indigo_velvet"]],
    linewidth = 1.3
  ) +
  ggplot2::annotate(
    geom = "segment",
    x = c(
      vous_dolni_hmotnost,
      vous_horni_hmotnost
    ),
    xend = c(
      vous_dolni_hmotnost,
      vous_horni_hmotnost
    ),
    y = 0.9,
    yend = 1.1,
    color = biostat_cols[["indigo_velvet"]],
    linewidth = 1.3
  ) +
  ggplot2::geom_vline(
    xintercept = median_hmotnosti,
    color = biostat_cols[["amethyst"]],
    linewidth = 1.8
  )

ggview::save_ggplot(
  plot = plot_box_krok3,
  file = here::here(
    path_materials,
    "hmotnost_boxplot_krok_3_vousy.png"
  )
)
```

```{r}
#| label: zobrazit-boxplot-krok3
#| echo: false
include_local_figure("hmotnost_boxplot_krok_3_vousy.png")
```

::: {.strip-orange}
[Body za vousy]{.text-hgl-orange} mohou být zajímavé nebo neobvyklé,
ale nejsou automaticky chybné.
:::

## Z bodů vznikl krabicový graf

```{r}
#| label: vytvorit-finalni-boxplot
#| include: false
#| message: false
#| warning: false
data_boxplot_hmotnost <-
  tibble::tibble(
    poloha = 1,
    vous_dolni = vous_dolni_hmotnost,
    q1 = q1_hmotnost,
    median = median_hmotnosti,
    q3 = q3_hmotnost,
    vous_horni = vous_horni_hmotnost
  )

data_odlehle_hmotnost <-
  tibble::tibble(hmotnost_kg = stat_boxplot_hmotnost$out)

plot_hmotnost_boxplot <-
  ggplot2::ggplot(
    data = data_hmotnost,
    mapping = ggplot2::aes(
      x = hmotnost_kg,
      y = 1
    )
  ) +
  ggplot2::geom_boxplot(
    data = data_boxplot_hmotnost,
    mapping = ggplot2::aes(
      y = poloha,
      xmin = vous_dolni,
      xlower = q1,
      xmiddle = median,
      xupper = q3,
      xmax = vous_horni
    ),
    stat = "identity",
    orientation = "y",
    width = 0.5,
    inherit.aes = FALSE,
    color = biostat_cols[["indigo_velvet"]],
    fill = biostat_cols[["amethyst"]],
    alpha = 0.35,
    linewidth = 1.3
  ) +
  ggplot2::geom_point(
    data = data_odlehle_hmotnost,
    mapping = ggplot2::aes(x = hmotnost_kg, y = 1),
    inherit.aes = FALSE,
    color = biostat_cols[["grey_olive"]],
    size = 3
  ) +
  ggplot2::scale_x_log10(
    breaks = c(
      0.01,
      1,
      100,
      10000
    ),
    labels = c(
      "0,01",
      "1",
      "100",
      "10 000"
    ),
    limits = c(0.004, 20000)
  ) +
  ggplot2::scale_y_continuous(
    breaks = NULL,
    name = NULL
  ) +
  ggplot2::labs(
    x = "Hmotnost (kg; logaritmická osa)"
  ) +
  theme_biostat(base_size = 19) +
  ggplot2::theme(
    panel.grid.major.y = ggplot2::element_blank()
  ) +
  ggview::canvas(
    width = 1600,
    height = 700,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_hmotnost_boxplot,
  file = here::here(
    path_materials,
    "hmotnost_boxplot.png"
  )
)
```

```{r}
#| label: zobrazit-finalni-boxplot
#| echo: false
include_local_figure("hmotnost_boxplot.png")
```

::: {.takeaway-strip}
[**Krabicový graf (*boxplot*)**]{.text-hgl-indigo_velvet} je mapa několika
souhrnů, ne fotografie všech hodnot.
:::

## Co krabice schovala?

```{r}
#| label: vytvorit-porovnani-boxplot-housle
#| include: false
#| message: false
#| warning: false
plot_hmotnost_housle <-
  ggplot2::ggplot(
    data = data_hmotnost,
    mapping = ggplot2::aes(
      x = hmotnost_kg,
      y = 1
    )
  ) +
  ggplot2::geom_violin(
    orientation = "y",
    fill = biostat_cols[["amethyst"]],
    color = biostat_cols[["indigo_velvet"]],
    alpha = 0.35,
    linewidth = 1.2,
    trim = FALSE
  ) +
  ggplot2::geom_boxplot(
    data = data_boxplot_hmotnost,
    mapping = ggplot2::aes(
      y = poloha,
      xmin = vous_dolni,
      xlower = q1,
      xmiddle = median,
      xupper = q3,
      xmax = vous_horni
    ),
    stat = "identity",
    orientation = "y",
    width = 0.18,
    color = biostat_cols[["indigo_velvet"]],
    fill = biostat_cols[["parchment"]],
    inherit.aes = FALSE,
    linewidth = 1
  ) +
  ggplot2::geom_point(
    data = data_odlehle_hmotnost,
    mapping = ggplot2::aes(x = hmotnost_kg, y = 1),
    inherit.aes = FALSE,
    color = biostat_cols[["grey_olive"]],
    size = 2.4
  ) +
  ggplot2::geom_vline(
    xintercept = prumer_hmotnosti,
    color = biostat_cols[["indigo_velvet"]],
    linetype = "dashed",
    linewidth = 1.6
  ) +
  ggplot2::scale_x_log10(
    breaks = c(
      0.01,
      1,
      100,
      10000
    ),
    labels = c(
      "0,01",
      "1",
      "100",
      "10 000"
    ),
    limits = c(0.004, 20000)
  ) +
  ggplot2::scale_y_continuous(
    breaks = NULL,
    name = NULL
  ) +
  ggplot2::labs(
    x = "Hmotnost (kg; logaritmická osa)"
  ) +
  theme_biostat(base_size = 19) +
  ggplot2::theme(
    panel.grid.major.y = ggplot2::element_blank()
  ) +
  ggview::canvas(
    width = 1600,
    height = 700,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_hmotnost_housle,
  file = here::here(
    path_materials,
    "hmotnost_houslovy_boxplot.png"
  )
)
```

:::: {.columns .align-top}

::: {.column width="48%"}
**Krabicový graf**

```{r}
#| label: zopakovat-finalni-boxplot
#| echo: false
include_local_figure("hmotnost_boxplot.png")
```
:::

::: {.column width="48%"}
**Krabicový + houslový graf**

```{r}
#| label: zobrazit-houslovy-boxplot
#| echo: false
include_local_figure("hmotnost_houslovy_boxplot.png")
```

::: {.text-center .text-size-smaller}
[přerušovaná tmavá čára = průměr]{.text-hgl-indigo_velvet}<br>
[plná čára v krabici = medián]{.text-hgl-amethyst}
:::
:::

::::

## Houslový graf vrací tvar

::::: {.slide-margin-top-15}

:::: {.columns .align-top}

::: {.column width="48%"}
::: {.panel-result}
[Krabicový graf]{.panel-title}

Rychle porovná medián, IQR, vousy a možné odlehlé hodnoty.
:::
:::

::: {.column width="48%" .fragment}
::: {.panel-result}
[Houslový graf]{.panel-title}

Ukáže, kde se hodnoty hromadí, ale přesná četnost se z jeho šířky čte obtížně.
:::
:::

::::

::: {.takeaway-strip .fragment}
Housle mohou být informativnější, když je důležitý
[tvar]{.text-hgl-amethyst}; [body]{.text-hgl-graphite} zůstávají
nejtransparentnější první kontrolou.
:::

:::::

# Typy proměnných

## Jeden netopýr, různé typy údajů

:::: {.columns .align-center}

::: {.column width="44%"}
::: {.text-size-heading2 .text-bold}
U netopýra můžeme zaznamenat:
:::

::: {.incremental}
- dobu spánku v hodinách;
- váhu v kilogramech;
- počet pozorovaných jedinců;
- druh;
- typ potravy;
- velikostní kategorii.
:::

::: {.takeaway-strip}
Typ neurčuje vzhled čísla. Určuje jej [význam proměnné]{.text-hgl-orange}.
:::
:::

::: {.column width="52%"}
```{r}
#| label: zobrazit-netopyra
#| echo: false
#| fig-alt: "Humorná ilustrace netopýra zapisujícího údaje do terénního formuláře."
#| out-width: "100%"

include_local_figure("mammal_bat_illustrative.png")
```

::: {.text-size-tiny .text-right}
Ilustrace vytvořená pomocí AI.
:::
:::

::::

## Číslo 37 může znamenat čtyři různé věci

:::: {.slide-margin-top-15}

| Zápis | Co znamená | Jak vznikl |
|---|---|---|
| 37,0 | tělesná teplota | měření |
| 37 | počet mláďat | počítání |
| 37 | číselný kód lokality | název kategorie |
| 3 | stupeň poškození | uspořádaná kategorie |

<br>

::: {.box-question}
::: {.panel-lead}
Rozhoduje vzhled hodnoty, nebo její [význam]{.text-hgl-orange}?
:::
:::

::::

## Typ určuje význam a možné operace

:::: {.slide-margin-top-15}

::: {.incremental}
- [**spojitá numerická**]{.text-hgl-indigo_velvet}: měření na číselné škále;
- [**diskrétní numerická**]{.text-hgl-indigo_velvet}: výsledek počítání;
- [**nominální kategoriální**]{.text-hgl-indigo_velvet}: názvy bez přirozeného pořadí;
- [**ordinální kategoriální**]{.text-hgl-indigo_velvet}: kategorie s přirozeným pořadím.
:::

<br>

::: {.takeaway-strip .fragment}
Technická třída objektu v R pomáhá s kontrolou, ale
[statistický typ]{.text-hgl-orange} určuje význam hodnot a způsob jejich vzniku.
:::

::::

## Doba spánku vznikla měřením

::::: {.slide-margin-top-15}

:::: {.columns .align-top}

::: {.column width="58%"}
::: {.panel-result}
[**Spojitá numerická proměnná**]{.text-hgl-indigo_velvet}: mezi dvěma
hodnotami mohou být další [měření]{.text-hgl-orange}.
:::

```{r}
#| label: zobrazit-spojitou-promennou
#| echo: false
include_local_figure("spanek_bodovy_graf.png")
```
:::

::: {.column width="38%" .fragment}
```{r}
#| label: zkontrolovat-spojitou-v-r
#| echo: true
#| eval: true
vec_spanek_h <-
  ggplot2::msleep[["sleep_total"]]

class(x = vec_spanek_h)
typeof(x = vec_spanek_h)
```
:::

::::

:::::

## Počet druhů v řádu jsme spočítali

```{r}
#| label: vytvorit-graf-diskretni-promenne
#| include: false
#| message: false
#| warning: false
data_pocet_druhu <-
  data_savci |>
  dplyr::count(
    rad,
    name = "pocet_druhu"
  ) |>
  dplyr::arrange(
    dplyr::desc(pocet_druhu)
  )

plot_pocet_druhu <-
  data_pocet_druhu |>
  dplyr::slice_head(n = 12) |>
  ggplot2::ggplot(
    mapping = ggplot2::aes(
      x = pocet_druhu,
      y = forcats::fct_reorder(
        rad,
        pocet_druhu
      )
    )
  ) +
  ggplot2::geom_segment(
    mapping = ggplot2::aes(
      x = 0,
      xend = pocet_druhu,
      yend = forcats::fct_reorder(
        rad,
        pocet_druhu
      )
    ),
    color = biostat_cols[["grey_olive"]],
    linewidth = 1.2
  ) +
  ggplot2::geom_point(
    color = biostat_cols[["indigo_velvet"]],
    size = 4.5
  ) +
  ggplot2::scale_x_continuous(
    breaks = scales::breaks_width(2)
  ) +
  ggplot2::labs(
    x = "Počet zastoupených druhů",
    y = "Taxonomický řád"
  ) +
  theme_biostat(base_size = 16) +
  ggview::canvas(
    width = 1500,
    height = 850,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_pocet_druhu,
  file = here::here(
    path_materials,
    "pocet_druhu_v_radu.png"
  )
)
```

:::: {.columns .align-top}

::: {.column width="58%"}
```{r}
#| label: zobrazit-diskretni-promennou
#| echo: false
include_local_figure("pocet_druhu_v_radu.png")
```
:::

::: {.column width="38%" .fragment}
::: {.panel-result}
[**Diskrétní numerická proměnná**]{.text-hgl-indigo_velvet}: vznikla
[počítáním]{.text-hgl-orange}; může nabývat pouze celočíselných hodnot (např. 1, 5, 10).
:::

```{r}
#| label: zkontrolovat-diskretni-v-r
#| echo: true
#| eval: true
vec_pocet_druhu <-
  as.integer(
    x = table(
      ggplot2::msleep[["order"]]
    )
  )

class(x = vec_pocet_druhu)
str(object = vec_pocet_druhu)
```


:::

::::

## Typ potravy je název bez pořadí

```{r}
#| label: vytvorit-graf-nominalni-promenne
#| include: false
#| message: false
#| warning: false
data_potrava <-
  data_savci |>
  dplyr::count(
    typ_potravy,
    name = "pocet_druhu"
  ) |>
  dplyr::arrange(
    dplyr::desc(pocet_druhu)
  )

plot_potrava <-
  ggplot2::ggplot(
    data = data_potrava,
    mapping = ggplot2::aes(
      x = pocet_druhu,
      y = forcats::fct_reorder(
        typ_potravy,
        pocet_druhu
      )
    )
  ) +
  ggplot2::geom_col(
    fill = biostat_cols[["amethyst"]],
    alpha = 0.65
  ) +
  ggplot2::labs(
    x = "Počet zastoupených druhů",
    y = "Typ potravy"
  ) +
  theme_biostat(base_size = 17) +
  ggview::canvas(
    width = 1500,
    height = 800,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_potrava,
  file = here::here(
    path_materials,
    "typ_potravy_sloupce.png"
  )
)
```

:::: {.columns .align-top}

::: {.column width="58%"}
```{r}
#| label: zobrazit-nominalni-promennou
#| echo: false
include_local_figure("typ_potravy_sloupce.png")
```
:::

::: {.column width="38%" .fragment}
::: {.panel-result}
[**Nominální kategoriální proměnná**]{.text-hgl-indigo_velvet}: smysl dávají
[četnosti a podíly]{.text-hgl-orange}, ne průměr.
:::

```{r}
#| label: zkontrolovat-nominalni-v-r
#| echo: true
#| eval: true
vec_typ_potravy <-
  ggplot2::msleep[["vore"]]

vec_chybi <-
  is.na(vec_typ_potravy)

vec_typ_potravy[vec_chybi] <-
  "neuvedeno"

vec_typ_potravy <-
  factor(x = vec_typ_potravy)

class(x = vec_typ_potravy)
str(object = vec_typ_potravy)
```

:::

::::

## Velikostní kategorie: lehký–střední–těžký

```{r}
#| label: vytvorit-graf-ordinalni-promenne
#| include: false
#| message: false
#| warning: false
hranice_hmotnosti <-
  quantile(
    data_hmotnost |>
      dplyr::pull(hmotnost_kg),
    probs = c(0, 1 / 3, 2 / 3, 1),
    names = FALSE
  )

data_velikost <-
  data_hmotnost |>
  dplyr::mutate(
    velikost = cut(
      hmotnost_kg,
      breaks = hranice_hmotnosti,
      labels = c(
        "lehký",
        "střední",
        "těžký"
      ),
      include.lowest = TRUE,
      ordered_result = TRUE
    )
  ) |>
  dplyr::count(
    velikost,
    name = "pocet_druhu"
  )

plot_velikost <-
  ggplot2::ggplot(
    data = data_velikost,
    mapping = ggplot2::aes(
      x = velikost,
      y = pocet_druhu
    )
  ) +
  ggplot2::geom_col(
    fill = biostat_cols[["amethyst"]],
    alpha = 0.65
  ) +
  ggplot2::labs(
    x = "Velikostní kategorie",
    y = "Počet zastoupených druhů"
  ) +
  theme_biostat(base_size = 17) +
  ggview::canvas(
    width = 1500,
    height = 800,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_velikost,
  file = here::here(
    path_materials,
    "hmotnostni_kategorie.png"
  )
)
```

:::: {.columns .align-top}

::: {.column width="58%"}
```{r}
#| label: zobrazit-ordinalni-promennou
#| echo: false
include_local_figure("hmotnostni_kategorie.png")
```
:::

::: {.column width="38%" .fragment}
::: {.panel-warning}
[**Ordinální kategoriální proměnná**]{.text-hgl-indigo_velvet}: pořadí je
součástí objektu: [lehký < střední < těžký]{.text-hgl-orange}.
:::

```{r}
#| label: zkontrolovat-ordinalni-v-r
#| echo: true
#| eval: true
poradi <-
  c("lehký", "střední", "těžký")

vec_velikost <-
  ordered(
    x = poradi,
    levels = poradi
  )

class(x = vec_velikost)
str(object = vec_velikost)
```

:::

::::

## Určete typ proměnné

::: {.panel-note}
[Možnosti]{.panel-title}

**spojitá numerická · diskrétní numerická · nominální kategoriální · ordinální kategoriální**
:::

| Proměnná | Jak vznikla? |
|---|---|
| pH vody v rybníce | měřením |
| počet mláďat ve vrhu | počítáním |
| druh stanoviště | názvem kategorie |
| stupeň poškození listu | uspořádanou kategorií |

::: {.box-question}
[Přiřaďte ke každé proměnné jeden ze čtyř typů.]{.panel-lead}
:::

## Od typu proměnné k prvnímu popisu

| Typ proměnné | Vhodný první souhrn | Vhodný první graf |
|---|---|---|
| numerická spojitá | medián + IQR nebo průměr + SD | body, histogram, hustota, boxplot |
| numerická diskrétní | četnosti; někdy medián/průměr | body nebo sloupce počtů |
| kategoriální nominální | četnosti a podíly | sloupcový graf |
| kategoriální ordinální | četnosti; někdy medián pořadí | uspořádaný sloupcový graf |

::: {.takeaway-strip}
Typ proměnné zužuje, které grafy, souhrny a později i modely dávají smysl.
:::

# Závěr

## Shrnutí

:::: {.slide-margin-top-15}

::: {.incremental}
- [Každý řádek]{.text-hgl-graphite} spojíme s jeho skutečnou jednotkou pozorování.
- Data zhodnotíme [graficky]{.text-hgl-indigo_velvet} před výběrem souhrnného čísla.
- [Průměr + SD]{.text-hgl-orange}; [medián + IQR]{.text-hgl-amethyst}.
- [Význam proměnné]{.text-hgl-orange} určuje její typ. Podle toho vybereme vhodný graf a vhodný souhrn.
:::

::::

## Co potřebujete vědět, než řeknete „typický“?

:::: {.slide-margin-top-15}

::: {.text-size-heading2 .text-bold .text-center}
Jaké tři otázky položíte člověku, který vám ukáže
[jedno souhrnné číslo]{.text-hgl-indigo_velvet}
bez grafu?
:::

<br>

::: {.fragment}
::: {.takeaway-strip}
V následující lekci přidáme druhou proměnnou a zeptáme se, zda spolu dvě měření souvisejí.
:::
:::

::::
