Statystyki opisowe

Statystyczne i graficzne podstawy geowizualizacji

Author

Anna Dmowska, dmowska@amu.edu.pl

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.

library(tidyverse)

1 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 |>

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:

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.

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

2 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

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

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

# 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.

#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.

# 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.

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

2.1 Braki danych

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

1 + NA
[1] NA
x = c(1,2,3,NA)
mean(x)
[1] NA

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

mean(x, na.rm = TRUE)
[1] 2

2.2 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.
summary(europa)
                   kraj                  region         le       
 Albania             : 1   Europa Południowa:10   Min.   :72.48  
 Austria             : 1   Europa Północna  : 7   1st Qu.:75.56  
 Belgia              : 1   Europa Wschodnia : 6   Median :78.89  
 Bośnia i Hercegowina: 1   Europa Zachodnia : 6   Mean   :77.85  
 Bułgaria            : 1   Afryka Północna  : 0   3rd Qu.:79.83  
 Chorwacja           : 1   Afryka Południowa: 0   Max.   :81.76  
 (Other)             :23   (Other)          : 0                  
      pop                pkb         income_grp
 Min.   :  301931   Min.   : 5937   niski : 0  
 1st Qu.: 4627926   1st Qu.:15390   średni: 6  
 Median : 9031088   Median :28570   wysoki:23  
 Mean   :17756548   Mean   :25627              
 3rd Qu.:16570613   3rd Qu.:33860              
 Max.   :82400996   Max.   :49357              
                                               
summary(europa$le)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  72.48   75.56   78.89   77.85   79.83   81.76 
  • mean() oblicza średnią artymetyczną
mean(europa$le)
[1] 77.85107
  • median() oblicza medianę
median(europa$le)
[1] 78.885
  • 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.

quantile(europa$le, probs = seq(0,1, 0.1))
     0%     10%     20%     30%     40%     50%     60%     70%     80%     90% 
72.4760 73.8692 74.7764 76.0180 77.9604 78.8850 79.4212 79.6504 80.3360 80.8954 
   100% 
81.7570 

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

quantile(europa$le, probs = c(0.05, 0.95))
     5%     95% 
73.1382 81.3970 
  • min() oraz max() oblicza wartość minimalną oraz maksymalną.
min(europa$le)
[1] 72.476
max(europa$le)
[1] 81.757
  • range() zwraca wartość minimalną oraz maksymalną
range(europa$le)
[1] 72.476 81.757
  • w R nie ma funkcji obliczającej rozstęp - różnicę między wartością maksymalną i minimalną.
rozstep = max(europa$le) - min(europa$le)
rozstep
[1] 9.281
  • IQR() oblicza rozstęp międzykwatylowy
IQR(europa$le)
[1] 4.266
  • sd() oblicza odchylenie standardowe
sd(europa$le)
[1] 2.814724

2.3 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())
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.

statystyki
     min    max  srednia       sd
1 72.476 81.757 77.85107 2.814724

2.4 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())
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)
  )
statystyki_regiony
# A tibble: 4 × 10
  region                n   min   max srednia    sd mediana   q25   q75   iqr
  <fct>             <int> <dbl> <dbl>   <dbl> <dbl>   <dbl> <dbl> <dbl> <dbl>
1 Europa Północna       7  78.3  81.8    79.8 1.19     79.4  78.5  81.5 1.44 
2 Europa Południowa    10  74.0  80.9    77.3 2.52     77.2  74.2  80.8 4.06 
3 Europa Wschodnia      6  72.5  76.5    74.3 1.58     74.0  72.6  76.3 2.25 
4 Europa Zachodnia      6  79.4  81.7    80.1 0.891    79.8  79.4  81.4 0.929

2.5 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.

table(europa$region)

          Afryka Północna         Afryka Południowa           Afryka Środkowa 
                        0                         0                         0 
        Afryka Wschodnia           Afryka Zachodnia          Ameryka Północna 
                        0                         0                         0 
       Ameryka Południowa          Ameryka Środkowa Australia i Nowa Zelandia 
                        0                         0                         0 
          Azja Południowa Azja Południowo-Wschodnia            Azja Wschodnia 
                        0                         0                         0 
           Azja Zachodnia           Europa Północna         Europa Południowa 
                        0                         7                        10 
         Europa Wschodnia          Europa Zachodnia                   Karaiby 
                        6                         6                         0 

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

dane |>
  filter(kontynent == 'Europa' & rok == 2007) |>
  group_by(region) |>
  summarise(licznosc = n(), .groups = "drop")
# A tibble: 4 × 2
  region            licznosc
  <fct>                <int>
1 Europa Północna          7
2 Europa Południowa       10
3 Europa Wschodnia         6
4 Europa Zachodnia         6
  • Liczba państw wg kategorii dochodu oraz regionu
dane |>
  filter(kontynent == 'Europa' & rok == 2007) |>
  group_by(region, income_grp) |>
  summarise(licznosc = n(), .groups = "drop")
# A tibble: 6 × 3
  region            income_grp licznosc
  <fct>             <fct>         <int>
1 Europa Północna   wysoki            7
2 Europa Południowa średni            4
3 Europa Południowa wysoki            6
4 Europa Wschodnia  średni            2
5 Europa Wschodnia  wysoki            4
6 Europa Zachodnia  wysoki            6

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.

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)
# A tibble: 4 × 3
  region            wysoki średni
  <fct>              <int>  <int>
1 Europa Północna        7     NA
2 Europa Południowa      6      4
3 Europa Wschodnia       4      2
4 Europa Zachodnia       6     NA

3 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
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)
# A tibble: 6 × 5
  kraj                 region            PKB2007 PKB1977 PKB07_77
  <fct>                <fct>               <dbl>   <dbl>    <dbl>
1 Albania              Europa Południowa   5937.   3533.    2404.
2 Bośnia i Hercegowina Europa Południowa   7446.   3528.    3918.
3 Bułgaria             Europa Wschodnia   10681.   7612.    3069.
4 Czarnogóra           Europa Południowa   9254.   9596.    -342.
5 Rumunia              Europa Wschodnia   10808.   9356.    1452.
6 Serbia               Europa Południowa   9787.  12981.   -3194.
  • 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?
spadek_pkb = europa77_07 |> 
  filter(PKB07_77 < 0) 
spadek_pkb
# A tibble: 2 × 5
  kraj       region            PKB2007 PKB1977 PKB07_77
  <fct>      <fct>               <dbl>   <dbl>    <dbl>
1 Czarnogóra Europa Południowa   9254.   9596.    -342.
2 Serbia     Europa Południowa   9787.  12981.   -3194.
  • 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
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))
stat_pkb
# A tibble: 3 × 6
  Zmienna  Srednia Mediana     SD    Min    Max
  <chr>      <dbl>   <dbl>  <dbl>  <dbl>  <dbl>
1 PKB07_77  10997.  11657.  7404. -3194. 29525.
2 PKB1977   14629.  14256.  5660.  3528. 26982.
3 PKB2007   25627.  28570. 11578.  5937. 49357.

4 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.

    • Czy istnieją różnice między regionami i między krajami o różnym poziomie dochodów?