Przetwarzanie danych

Statystyczne i graficzne podstawy geowizualizacji

Author

Anna Dmowska, dmowska@amu.edu.pl

1 Wprowadzenie do pracy w R

Kod do tego ćwiczenia znajduje się w pliku cwiczenie2.qmd

1.1 Katalog roboczy

Zawsze rozpocznij pracę od ustawienia ścieżki do folder roboczego.

#ustawienie ścieżki do katalogu roboczego
setwd("statystyka_geowizualizacja/cwiczenie_1")
#sprawdzanie ścieżki do katalogu 
getwd()

W przypadku korzystania z dokumentów Quarto jako katalog roboczy domyślnie jest ustawiany katalog, w którym zapisano dokument Quarto o rozszerzeniu .qmd.

1.2 Wczytywanie danych

Pliki tekstowe są podstawowym sposobem przechowywania informacji, np. danych w postaci tabelarycznej. Wykorzystując dane zawarte w plikach tekstowych należy zawsze zwrócić uwagę na znak dzisiętny stosowany w zapisie liczb zmiennoprzecikowych (czy liczba jest zapisana jako 10.3 czy 10,3) oraz na separator oddzielający poszczególne kolumny (przecinek, spacja, średnik, tabulator). Jednym z najczęściej wykorzystywanych formatów tekstowych jest format CSV (ang. comma-separated values). W pliku CSV kolumny są zazwyczaj odzielone przecinkami, a jako symbol dziesiętny stosuje się kropkę. Warto jednak pamiętać, że w notacji stosowanej np. przez oprogramowanie MS Excel w krajach Europy Środkowo-Wschodniej jako symbol dziesiętny używa przecinka (“,”), a jako separator między kolumnami używa się średnik (“;”). Plik tekstowy może zawierać tekst używając różnych standardów kodowania znaków. Standard kodowania znaków można zdefiniować na etapie wczytywania pliku tekstowego wykorzystując argument encoding.

Plik gapminder_regions.csv znajdujący się w folderze dane zawiera zestaw danych dla krajów świata dla lat 1952-2007. Jeśli otworzymy plik gapminder_regions.csv w edytorze tekstowym zobaczymy, że pierwszy wiersz zawiera nazwy kolumn, a kolejny dane. Kolumny odzielone są przecinkiem (,), a liczby zmiennoprzecinkowe kropką (.).

Do wczytanania danych z pliku gapminder_regions.csv można użyć wbudowanej w R funkcji read.csv(). W funckji read.csv() należy podać względną lub bezwzględną ścieżkę do pliku. Dodatkowo argument encoding pozwala na ustawienie typu kodowania znaków. Na etapie wczytywania danych, trzeba je przypisać w R do obiektu, któremu nadamy jakąś nazwę (np. dane w poniższym przykładzie).

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

Po wczytaniu danych do R warto sprawdzić czy dane zostały wczytane poprawnie. Można w tym celu użyć funkcji head() lub str().

head(dane)
        kraj kontynent          region  rok     le      pop      pkb income_grp
1 Afganistan      Azja Azja Południowa 2002 42.129 25268405 726.7341          1
2 Afganistan      Azja Azja Południowa 2007 43.828 31889923 974.5803          1
3 Afganistan      Azja Azja Południowa 1992 41.674 16317921 649.3414          1
4 Afganistan      Azja Azja Południowa 1972 36.088 13079460 739.9811          1
5 Afganistan      Azja Azja Południowa 1987 40.822 13867957 852.3959          1
6 Afganistan      Azja Azja Południowa 1982 39.854 12881816 978.0114          1

Podstawowe informacje o danych można uzyskać wykorzystując funkcję str(). Dla ramki danych uzyskamy informację o nazwach kolumn, typach danych (int - stałoprzecinkowy, num - zmiennoprzecinkowy (numeryczny), chr - tekstowy, Factor - zmienna czynnikowa) oraz podgląd kilku wartości.

str(dane)
'data.frame':   1704 obs. of  8 variables:
 $ kraj      : chr  "Afganistan" "Afganistan" "Afganistan" "Afganistan" ...
 $ kontynent : chr  "Azja" "Azja" "Azja" "Azja" ...
 $ region    : chr  "Azja Południowa" "Azja Południowa" "Azja Południowa" "Azja Południowa" ...
 $ rok       : int  2002 2007 1992 1972 1987 1982 1997 1967 1957 1977 ...
 $ le        : num  42.1 43.8 41.7 36.1 40.8 ...
 $ pop       : int  25268405 31889923 16317921 13079460 13867957 12881816 22227415 11537966 9240934 14880372 ...
 $ pkb       : num  727 975 649 740 852 ...
 $ income_grp: int  1 1 1 1 1 1 1 1 1 1 ...

Wczytane dane mają postać tabeli składającej się z 1704 wiersze (obserwacji) oraz 9 kolumn (zmiennych). W R dane tabelaryczne są najczęściej przechowywane jako ramka danych (data.frame).

1.3 Zmienne jakościowe w R

W R zmienne przechowujące dane jakościowe nazywa się czynnikami (ang. factor), a odmienne kategorie nazywamy poziomami (ang. levels). Poziomy mogą być uporządkowane lub nieuporządkowane. Jeśli wczytamy dane z pliku tesktowego domyślnie wartości nieliczbowe zostaną wczytane jako tekst (typ oznaczony jako chr). Jeśli zmienna przechowuje informacje o kategoriach, przed wykonaniem analiz należy ją zamienić na zmienną czynnikową. Zmienną można zamienić na zmienną czynnikową używając funkcji as.factor(). Funkcja as.factor() używana jest do prostej konwersji zmiennej (np. wektora liczbowego lub tekstowego) na zmienną czynnikową. Poziomy zmiennej są generowane automatycznie jako posortowane, unikalne wartości obecne w danych wejściowych.

#Zmienna przed przekształceniem 
head(dane$kontynent)
[1] "Azja" "Azja" "Azja" "Azja" "Azja" "Azja"
#przekształcenie na czynnik
dane$kontynent = as.factor(dane$kontynent)
str(dane$kontynent)
 Factor w/ 5 levels "Afryka","Ameryki",..: 4 4 4 4 4 4 4 4 4 4 ...

Po przekształceniu na czynnik każda kategoria opisana tekstowo zostaje zamieniona na kod liczbowy, któremu przypisany jest poziom (levels) mający swoją etykietę (w przykładzie jest to nazwa kontynentu).

head(dane$kontynent)
[1] Azja Azja Azja Azja Azja Azja
Levels: Afryka Ameryki Australia Azja Europa

Do przekształcenia zmiennej na zmienną czynnikową można użyć także funkcji factor(x,..), która pozwala także na przypisanie poziomów oraz etykiet. Funkcję factor() wykorzystujemy np. w sytuacji, gdy chcemy określić kolejność poziomów (np. “Low”, “Medium”, “High” zamiast kolejności alfabetycznej) lub uwzględnić poziomy, które nie występują w analizowanym zbiorze danych, ale potencjalnie zmienna może je przyjmować.

dane$income_grp = factor(dane$income_grp,
                  levels = c(1, 2, 3),
                  labels = c("niski", "średni", "wysoki"))

Po przekształceniu zmiennej liczbowej typu integer na zmienną czynnikową liczby 1,2,3 są traktowane jako kategorie - można wg nich grupować dane przy obliczeniach statystyk dla grup lub przy wizualizacji.

str(dane)
'data.frame':   1704 obs. of  8 variables:
 $ kraj      : chr  "Afganistan" "Afganistan" "Afganistan" "Afganistan" ...
 $ kontynent : Factor w/ 5 levels "Afryka","Ameryki",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ region    : chr  "Azja Południowa" "Azja Południowa" "Azja Południowa" "Azja Południowa" ...
 $ rok       : int  2002 2007 1992 1972 1987 1982 1997 1967 1957 1977 ...
 $ le        : num  42.1 43.8 41.7 36.1 40.8 ...
 $ pop       : int  25268405 31889923 16317921 13079460 13867957 12881816 22227415 11537966 9240934 14880372 ...
 $ pkb       : num  727 975 649 740 852 ...
 $ income_grp: Factor w/ 3 levels "niski","średni",..: 1 1 1 1 1 1 1 1 1 1 ...

1.4 Podstawowe informacje o zbiorze danych

1.4.1 Liczba wierszy i kolumn

Informację o liczbie wierszy można uzyskać za pomocą funkcji nrow(), a o liczbie kolumn ncol()

nrow(dane)
[1] 1704
ncol(dane)
[1] 8

1.4.2 Nazwy zmiennych

Informację o nazwie zmiennych można uzyskać za pomocą names() lub colnames().

colnames(dane)
[1] "kraj"       "kontynent"  "region"     "rok"        "le"        
[6] "pop"        "pkb"        "income_grp"

1.4.3 Unikalne wartości

unique(dane$kontynent)
[1] Azja      Afryka    Ameryki   Europa    Australia
Levels: Afryka Ameryki Australia Azja Europa

1.5 Tworzenie podzbioru danych

Ramki danych (ang. data frame) to złożone obiekty składające sie z wierszy i kolumn. Każda kolumna może przechowywać dane innego typu.

Wybór jednej zmiennej wykonywany jest za pomocą operatora ‘$’.

kraje = dane$kraj
head(dane_kraj)

Do wyboru określonych wierszy lub kolumn można użyć tzw. indeksowania. Indeksowanie ramki danych ma postać: obiekt[wiersz, kolumna].

  • wybranie pierwszego wiersza i wszystkich kolumn.
dane[1,]
        kraj kontynent          region  rok     le      pop      pkb income_grp
1 Afganistan      Azja Azja Południowa 2002 42.129 25268405 726.7341      niski
  • wybranie pierwszej kolumny i wszystkich wierszy
sel = dane[,1]
head(sel)
[1] "Afganistan" "Afganistan" "Afganistan" "Afganistan" "Afganistan"
[6] "Afganistan"
  • wybranie 2 wiersza i trzeciej kolumny
dane[2,3]
[1] "Azja Południowa"
  • wybranie zmiennych Name oraz Region na podstawie nazw (wybrane zmienne są przypisane do obiektu sel1)
sel1 = dane[, c("kraj", "region")]
head(sel1)
        kraj          region
1 Afganistan Azja Południowa
2 Afganistan Azja Południowa
3 Afganistan Azja Południowa
4 Afganistan Azja Południowa
5 Afganistan Azja Południowa
6 Afganistan Azja Południowa
  • wybranie wierszy spełniających określony warunek, np. podzbiór dla 1952 roku. Zauważ, że do wybrania danych należy użyć podwójnego znaku ==.
dane1952 = dane[dane$rok == 1952,]
head(dane1952)
           kraj kontynent                    region  rok     le      pop
12   Afganistan      Azja           Azja Południowa 1952 28.801  8425333
15   Bangladesz      Azja           Azja Południowa 1952 37.484 46886859
30        Benin    Afryka          Afryka Zachodnia 1952 38.223  1738315
38 Burkina Faso    Afryka          Afryka Zachodnia 1952 31.975  4469979
57      Burundi    Afryka         Afryka Wschodnia  1952 39.031  2445618
68     Kambodża      Azja Azja Południowo-Wschodnia 1952 39.417  4693836
         pkb income_grp
12  779.4453      niski
15  684.2442      niski
30 1062.7522      niski
38  543.2552      niski
57  339.2965      niski
68  368.4693      niski
  • wybranie wierszy spełniających określony warunek, np. podzbiór państw leżących w Azji oraz Europie
europa_azja = dane[dane$kontynent%in%c('Europa', 'Azja'),]
  • wybranie wierszy spełniających określony warunek, np. dane dla roku 2007 dla Europy
europa2007 = dane[dane$kontynent == 'Europa' & dane$rok == 2007,]
  • wybranie wierszy spełniających określony warunek, np. dane dla wszystkich kontynentów z wyjątkiem Azji.
bez_azji = dane[dane$kontynent != 'Azja',]
bez_azji = dane[!dane$kontynent%in%c('Azja'),]

1.6 Zapisywanie pojedyńczego obiektu (np. ramki danych)

Dane wczytane do R można zapisać do pliku tesktowego, np. o rozszerzeniu .csv, który następnie może być otworzony w dowolnym oprogramowaniu.

Do zapisania danych w formacie .csv wykorzystuje się funkcję write.csv(), która jako znak dziesiętny używa kropki (“.”), a jako separator między kolumnami używa przecinka (“,”). Argument row.names = FALSE oznacza, że do pliku nie zostanie dodana dodatkowa kolumna z nazwami wierszy.

write.csv(europa2007, "out/europa2007.csv", row.names = FALSE)

1.6.1 Zapisywanie wyników pracy w formacie dostępnym tylko w R

Zapisywanie wybranych obiektów ze środowiska pracy R

save(europa2007, europa_azja, file = "out/cw2.rda")

Zapisywanie wszystkich obiektów znajdujących się w środowisku pracy R

save.image("out/cw2.RData")

Otwieranie środowiska pracy (przydatne, gdy chcemy wczytać kilka obiektów do R)

load("out/cw2.RData")

1.7 Dodatkowe informacje

Oprócz funkcji read.csv() istnieje także funkcja read.csv2().

  • Funkcja read.csv() jako symbol dziesiętny używa kropki (“.”), a jako separator między kolumnami używa przecinka (“,”).

  • Funkcja read.csv2() jako symbol dziesiętny używa przecinka (“,”), a jako separator między kolumnami używa średnika (“;”).

Uwaga! Przed wczytaniem danych do R zwróć uwagę, na symbol dzisiętny stosowany w zapisie liczb zmiennoprzecikowych (czy liczba jest zapisana jako 10.3 czy 10,3) oraz na separator oddzielający poszczególne kolumny (przecinek, spacja, średnik, tabulator).

Jeśli dane jako separator między kolumnami wykorzystują spację lub tabulator do ich wczytania należy użyć funkcji read.table(), która pozwala na zdefiniowanie dowolnego separatora (argument sep) oraz znaku dziesiętnego (argument dec).

Do zapisania plików do pliku tekstowego CSV można użyć write.csv() lub write.csv2()

1.7.1 Dane w arkusach kalkulacyjnych

Dane tabelaryczne często są przechowywane w arkuszach kalkulacyjnych tworzonych z wykorzystaniem oprogramowania MS Excel. Tego typu dane można wczytać do R wykorzystując fukcję read_excel() z pakietu readxl.

Plik dane/dane_gapminder.xlsx zawiera 2 skoroszty: Europa oraz Azja. W skoroszytach znajdują się dane dla 2007 roku dotyczące liczby ludności, PKB oraz długości trwania życia. Aby wczytać dane dla Europy do R należy podać ścieżkę do pliku oraz nazwę skoroszytu, z którego chcemy wczytać dane (argument sheet).

library(readxl)
europa = read_excel("dane/dane_gapminder.xlsx", sheet = "Europa")

Do zapisania ramki danych w formacie MS Excel wykorzystuje się funkcję write_xlsx() z pakietu writexl.

library(writexl)
write_xlsx(europa, "out/europa.xlsx")

1.7.2 Pomoc

?nazwaFunkcji
help(nazwaFunkcji)
example(nazwaFunkcji)
args(nazwaFunkcji)