library(tidyverse)Statystyki opisowe
Statystyczne i graficzne podstawy geowizualizacji
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.
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. Argumentprobspozwala 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()orazmax()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?