#ustawienie ścieżki do katalogu roboczego
setwd("statystyka_geowizualizacja/cwiczenie_1")Przetwarzanie danych
Statystyczne i graficzne podstawy geowizualizacji
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.
#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)