---
title: "Ćwiczenie 3: Statystyki opisowe"
author: Anna Dmowska
format: html
editor: visual
---

Celem ćwiczenia jest wykorzystanie statystyk opisowych do przeanalizowania wartości długości trwania życia w Europie w 2007 roku oraz zmian w PKB między rokiem 1977 a 2007.

W ćwiczeniu wykorzystane zostaną funkcje z pakietu *dplyr*, *tidyr*. Pakiety te można wczytać oddzielnie lub wczytując pakiet **tidyverse**, który stanowi zbiór kilku pakietów do przetwarzania,analizy i wizualizacji danych.

```{r}
#| message: false
#| warning: false
library(tidyverse)
```

## Zastosowanie operatora łączącego

Pakiet tidyverse dostarcza operator potoku (operator łączący), który umożliwia łączenie wielu operacji w sekwencyjny, czytelny ciąg działań, co znacznie poprawia przejrzystość kodu. W takim zapisie wynik jednego kroku staje się wejściem dla następnego. W starszych wersjach R był to `%>%` . Od wersji 4.1 jako operator potoku używa się `|>`. Operator ten można wstawić za pomocą skrótu *Ctrl + Shift + M*. Domyślnie zostanie użyty operator `%>%`. Jeśli chcemy używać operatora `|>` dostępnego od wersji R 4.1 w ustawieniach R Studio trzeba wybrać ***Tools - Global options - Code - Editing*** i zaznaczyć *Use native pipe operator \|\>*

```{r}
dane = read.csv("dane/gapminder_regions.csv", encoding = 'UTF-8')
```

Standardowa składnia (bez użycia operatora łączącego) wyglądałaby następująco:

```{r}
dane = na.omit(dane)
europa2007 = filter(dane, kontynent == 'Europa' & rok == 2007)
europa2007 = select(europa2007, -kontynent, -rok)
```

W zapisie z wykorzystaniem operatora łączącego wynik jednego kroku staje się wejściem dla następnego.

```{r}
#selekcja danych dla Europy dla 2007 roku
europa = dane |> 
  na.omit() |> 
  filter(kontynent == 'Europa' & rok == 2007) |> 
  select(-kontynent, -rok)
```

## Przykład 1. Analiza długości trwania życia w roku 2007 w Europie

Analiza zostanie wykonana w oparciu o dane znajdujące się w pliku tekstowym *dane/gapminder_regions.csv*

```{r}
dane = read.csv("dane/gapminder_regions.csv", encoding = 'UTF-8')
```

Funkcja `na.omit()` pozwala na usunięcie wierszy z brakami danych.

```{r}
# usun wiersze z brakami danych
dane = dane |> 
  na.omit()
```

Funkcja `mutate()` służy do tworzenia nowej zmiennej. W przykładzie poniżej, wszystkie zmienne, które mają typ tekstowy (*chr*) zostaną zamienione na zmienne czynnikowe (*factor*). Funkcja `as.factor()` służy do prostej konwersji między typami danych, poziomy zmiennej zostaną przypisane domyślnie w kolejności alfabetycznej.

```{r}
#konwertowanie zmiennych tekstowych do factor
dane = dane |> 
  mutate(across(where(is.character), as.factor))
```

W przykładzie poniżej, do konwersji zmiennej *income_grp* została wykorzystana funkcja `factor()`, która dodatkowo pozwala na zdefiniowanie poziomów zmiennej czynnikowej.

```{r}
# przekształcenie zmiennej do factor
dane = dane |> 
  mutate(income_grp = factor(income_grp, levels = c(1,2,3), labels = c("niski", "średni", "wysoki")))
```

W kolejnym kroku zostaną wyselekcjonowane dane dla Europy dla 2007 roku. Funkcja `filter()`służy do tworzenie podzbioru danych poprzez wybór wierszy na podstawie określonego warunku, natomiast funkcja `select()` służy do tworzenie podzbioru danych poprzez wybór zmiennych na podstawie ich nazw . W poniższym przykładzie wybrano dane dla kontynentu Europa dla 2007 roku, a ze zbioru danych usunięto zmienne kontynent oraz rok.

> Należy zwrócić uwagę na podwójny znak == służący do wybrania danych. Określnie -kontynent w funkcji select oznacza, że zmienna kontynent nie ma być uwzględniona w wynikowym zbiorze danych.

```{r}
#selekcja danych dla Europy dla 2007 roku
europa = dane |> 
  filter(kontynent == 'Europa' & rok == 2007) |> 
  select(-kontynent, -rok)
```

### Braki danych

W R braki danych zazwyczaj kodowane są jako NA - *Not Available*.

```{r}
1 + NA
```

```{r}
x = c(1,2,3,NA)
mean(x)
```

Argument *na.rm = TRUE* oznacza, że wartości braków danych zostaną pominięte w obliczeniach.

```{r}
mean(x, na.rm = TRUE)
```

### Podstawowe statystyki

Istnieje kilka podstawowych funkcji, służących do obliczania statystyk podstawowych w R.

-   `summary()` oblicza zestaw statystyk dla każdej zmiennej w zbiorze danych lub dla wybranej zmiennej: średnia, mediana, kwartyl pierwszy, kwartyl trzeci, minimum i maksimum.

```{r}
summary(europa)
```

```{r}
summary(europa$le)
```

-   `mean()` oblicza średnią artymetyczną

```{r}
mean(europa$le)
```

-   `median()` oblicza medianę

```{r}
median(europa$le)
```

-   `quantile()` oblicza dowolne kwantyle. Argument `probs` pozwala na określenie, jakie kwantyle mają być obliczone.

W przykładzie poniżej *seq(0,1, 0.1)* oznacza, że zostaną obliczone decyle: 0, 0.1, 0.2..., 1.

```{r}
quantile(europa$le, probs = seq(0,1, 0.1))
```

*probs = c(0.05, 0.95)* oznacza, że zostanie wyliczony percentyl 5 i 95.

```{r}
quantile(europa$le, probs = c(0.05, 0.95))
```

-   `min()` oraz `max()` oblicza wartość minimalną oraz maksymalną.

```{r}
min(europa$le)
```

```{r}
max(europa$le)
```

-   `range()` zwraca wartość minimalną oraz maksymalną

```{r}
range(europa$le)
```

-   w R nie ma funkcji obliczającej rozstęp - różnicę między wartością maksymalną i minimalną.

```{r}
rozstep = max(europa$le) - min(europa$le)
rozstep
```

-   `IQR()` oblicza rozstęp międzykwatylowy

```{r}
IQR(europa$le)
```

-   `sd()` oblicza odchylenie standardowe

```{r}
sd(europa$le)
```

### Obliczanie zestawu statystyk

Wykorzystując funkcję `summarise()` z pakietu **dplyr** można obliczyć zestaw dowolnych statystyk. Poniższy kod składa się z kilku kroków:

-   selekcji danych dla Europy dla 2007 roku (funkcja `filter()`)
-   wykluczenia zmiennych kontynent oraz rok (funkcja `select()`)
-   obliczenia statystyk (funkcja `summarise()`)

```{r}
statystyki = dane |> 
  filter(kontynent == 'Europa' & rok == 2007) |> 
  select(-kontynent, -rok) |> 
  summarise(min = min(le),
            max = max(le),
            srednia = mean(le),
            sd = sd(le)
            )
```

Wyniki zostaną zapisane w postaci tabeli z 4 kolumnami: min, max, srednia, sd.

```{r}
statystyki
```

### Obliczanie zestawu statystyk w podziale na regiony

Aby policzyć statystyki w podziale na grupy, trzeba zbiór danych pogrupować używając funkcji `group_by()`. Poniższy kod składa się z kilku kroków:

-   selekcji danych dla Europy dla 2007 roku (funkcja `filter()`)
-   wykluczenia zmiennych kontynent oraz rok (funkcja `select()`)
-   pogrupowania zbioru danych na "oddzielne" podzbiory dla każdego regionu (funkcja `group_by()`)
-   obliczenia statystyk (funkcja `summarise()`)

```{r}
statystyki_regiony = dane |>
  filter(kontynent == 'Europa' & rok == 2007) |>
  select(-kontynent, -rok) |>
  group_by(region) |>
  summarise(
    n = n(),
    min = min(le),
    max = max(le),
    srednia = mean(le),
    sd = sd(le),
    mediana = median(le),
    q25 = quantile(le, 0.05),
    q75 = quantile(le, 0.95),
    iqr = IQR(le)
  )
```

```{r}
statystyki_regiony
```

### Podsumowanie zmiennej jakościowej

W przypadku zmiennej jakościowej jako podsumowanie zlicza się częstość występowania danej kategorii. Można to wykonać używając funkcji `table()` z podstawowego R lub funkcji `n()` z pakietu dplyr.

```{r}
table(europa$region)
```

Obliczenie liczby państw w każdym z regionów Europy z wykorzystaniem pakietu **dplyr**.

```{r}
dane |>
  filter(kontynent == 'Europa' & rok == 2007) |>
  group_by(region) |>
  summarise(licznosc = n(), .groups = "drop")
```

-   Liczba państw wg kategorii dochodu oraz regionu

```{r}
dane |>
  filter(kontynent == 'Europa' & rok == 2007) |>
  group_by(region, income_grp) |>
  summarise(licznosc = n(), .groups = "drop")
```

Powyższy wynik jest w układzie długim. Funkcja `pivot_wider()` z pakietu **tidyr** pozwoli przekształcić wynik na układ szeroki, w którym każda kategoria zmiennej income_grp będzie w osobnej kolumnie.

```{r}
dane |>
  filter(kontynent == 'Europa' & rok == 2007) |>
  group_by(region, income_grp) |>
  summarise(licznosc = n(), .groups = "drop") |> 
  pivot_wider(names_from = income_grp, values_from = licznosc)

```

## Przykład 2. Zmiany PKB w Europie między rokiem 1977 a 2007

-   Selekcja danych, przekształcenie ich do układu w którym PKB dla roku 1977 i 2007 będzie w osobnych kolumnach oraz obliczenie różnic między PKB

```{r}
europa77_07 = dane |>
  filter(kontynent == 'Europa' & rok%in%c(1977, 2007)) |>
  select(kraj, region, rok, pkb) |> 
  pivot_wider(names_from = rok, values_from = pkb) |> 
  rename(PKB1977 = `1977`, PKB2007 = `2007`) |> 
  mutate(PKB07_77 = PKB2007 - PKB1977)

head(europa77_07)
```

-   Wybierz kraje w których PKB spadło między rokiem 1977 a 2007 (różnica \< 0). Ile było takich państw w Europie? Jakie to kraje?

```{r}
spadek_pkb = europa77_07 |> 
  filter(PKB07_77 < 0) 
```

```{r}
spadek_pkb
```

-   Przekształcenie danych z układu szerokiego w układ długi oraz obliczenie statystyk dla PKB w 1977, 2007 oraz dla różnic w PKB

```{r}
stat_pkb = dane |>
  filter(kontynent == 'Europa' & rok%in%c(1977, 2007)) |>
  select(kraj, region, rok, pkb) |> 
  pivot_wider(names_from = rok, values_from = pkb) |> 
  rename(PKB1977 = `1977`, PKB2007 = `2007`) |> 
  mutate(PKB07_77 = PKB2007 - PKB1977) |> 
  pivot_longer(cols = where(is.numeric), names_to = "Zmienna", values_to = "Wartosc") |> 
    group_by(Zmienna) |>
  summarise(
    Srednia = mean(Wartosc),
    Mediana = median(Wartosc),
    SD = sd(Wartosc),
    Min = min(Wartosc),
    Max = max(Wartosc))
  
```

```{r}
stat_pkb
```

## Zadanie samodzielne

-   Utwórz nowy dokument Quarto (File - New File - Quarto Document) i zapisz go w folderze materialy_do_cwiczen jako cw3_zadanie.qmd

-   Wczytaj potrzebne pakiety oraz dane z pliku *dane/gapminder_regions.csv*

-   Przeanalizuj jak zmieniła się długość trwania życia między 1952 a 2007 rokiem w Afryce.

    -   Oblicz statystyki opisowe dla roku 1952 i 2007
    -   Oblicz statystyki opisowe w podziale na regiony i poziom dochodów.
