+ - 0:00:00
Notes for current slide
Notes for next slide

Podstawy programowania

Przetwarzanie danych

© Łukasz Wawrowski

1 / 50

Zestaw analityka - tidyverse

install.packages("tidyverse")
  • readxl - wczytywanie plików Excela
  • haven - wczytywanie plików SAS, SPSS, Stata
  • jsonlite - wczytywanie JSON
  • xml2 - wczytywanie XML
  • httr - dostęp do stron html
  • rvest - web scraping
  • DBI - dostęp do baz danych
  • hms - operacje na czasie dnia
  • blob - przechowywanie danych binarnych
  • magrittr - przetwarzanie potokowe %>%
  • glue - łączenie tekstów
library("tidyverse")
  • dplyr - przetwarzanie danych tabelarycznych
  • forcats - operacje na czynnikach
  • ggplot2 - wykresy
  • lubridate - operacje na datach
  • purrr - programowanie funkcyjne
  • readr - wczytywanie plików tekstowych
  • stringr - operacje na tekstach
  • tibble - nowoczesny data.frame
  • tidyr - porządkowanie danych

Strona projektu Tidyverse

2 / 50

Instalacja vs. wczytywanie

3 / 50

Struktura projektu

project/
├── data/
├── docs/
├── figs/
├── output/
├── 01_input.R
└── 02_analysis.R
4 / 50

Pliki tekstowe i csv

Pakiet readr:

  • read_delim() - ogólna funkcja do plików tekstowych

  • read_csv() - uwzględnia nagłówek, separator kolumn to przecinek, separator miejsc dziesiętnych to kropka

  • read_csv2() - uwzględnia nagłówek, separator kolumn to średnik, separator miejsc dziesiętnych to przecinek

--

R dostarcza także funkcje read.csv(), read.csv2(), read.delim(), które są starszymi odpowiednikami funkcji z pakietu readr.

5 / 50

Pliki Excela

Pakiet readxl:

  • read_excel() - określa format na podstawie pliku

  • read_xls() - wczytuje pliki .xls

  • read_xlsx() - wczytuje pliki .xlsx

6 / 50

Pliki SAS, SPSS, Stata

Pakiet haven:

  • read_sas() - wczytuje pliki .sas

  • read_sav() - wczytuje pliki .sav

  • read_stata() - wczytuje pliki .dta

7 / 50

Wczytywanie danych o formacie R

  • load("zbior.RData")

  • dane <- readRDS("zbior.RDS")

8 / 50

Zapisywanie danych o formacie R

Zapisywanie do formatu R:

  • save(dane, file = "zbior.RData")

  • save(dane1, dane2, file = "zbior.RData")

  • saveRDS(dane, file = "zbior.RDS")

9 / 50

Zapisywanie danych

Zapisywanie do pliku tekstowego (txt, csv):

  • write_csv(x = obiekt, file = "plik.csv")

  • write_csv2(x = obiekt, file = "plik.csv")

Zapisywanie do pliku Excela z pakietem openxlsx:

  • write.xlsx(x = obiekt, file = "plik.xlsx")
10 / 50

Wczytanie zbioru danych

Importujemy zbiór danych dotyczący wyników wyborów w 2025 roku.

Plik z danymi: http://wawrowski.edu.pl/data/wybory2025.csv

Źródło

Alternatywnie: (https://github.com/lwawrowski/blog-quarto/tree/master/_site/data)

11 / 50

Zadanie

Wywołaj funkcję summary() na wczytanym zbiorze danych.

02:00
12 / 50

Pakiet janitor

Surowe dane zwykle nie posiadają nazw kolumn przystosowanych do przetwarzania przez komputer

  • nazwy zmiennych nie powinny zawierać polskich liter i spacji

  • nazwy zmiennych nie powinny zaczynać się od liczby

Te problemy rozwiązuje pakiet janitor (dozorca, woźny) i funkcja clean_names():

zbior <- janitor::clean_names(zbior)
  • funkcja ta zamienia wielkie litery na małe, spacje na podkreślniki i znaki transliteruje do ASCII.
13 / 50

Zadanie

Wczytaj do R plik movies: http://wawrowski.edu.pl/data/movies.csv i wywołaj na nim funkcję summary().

05:00
14 / 50

Rozpoczynanie pracy z R

Nowy projekt

  1. Otwórz RStudio
  2. Stwórz nowy projekt
  3. Przenieś dane do folderu projektu
  4. Otwórz nowy skrypt R
  5. (Zainstaluj i) wczytaj biblioteki
  6. Wczytaj dane
  7. Analizuj

Istniejący projekt

  1. Otwórz RStudio
  2. Otwórz istniejący skrypt R
  3. Wczytaj biblioteki
  4. Wczytaj dane
  5. Kontyuuj analizę
15 / 50

Zadanie

Wczytaj zbiór danych dotyczący wyników wyborów.

02:00
16 / 50

R base vs. tidyverse

Podstawowe funkcje R

widest_petals <- by(iris,
INDICES = iris$Species,
FUN = function(x){
x[x$Petal.Width == max(x$Petal.Width), ]
})
do.call(rbind, widest_petals)
17 / 50

R base vs. tidyverse

Podstawowe funkcje R

widest_petals <- by(iris,
INDICES = iris$Species,
FUN = function(x){
x[x$Petal.Width == max(x$Petal.Width), ]
})
do.call(rbind, widest_petals)

Funkcje pakietu tidyverse

iris %>%
group_by(Species) %>%
filter(Petal.Width == max(Petal.Width))

źródło

17 / 50
18 / 50

Przetwarzanie potokowe

Sekwencja zdarzeń - w życiu

obudź się %>%
wyjdź z łóżka %>%
skorzystaj z łazienki %>%
zjedź śniadanie %>%
ubierz się %>%
idź do pracy

źródło

19 / 50

Przetwarzanie potokowe

Użycie operatora pipe: %>% (łącznik) ułatwia zarządzanie kodem i pisanie czytelnej składni poprzez wykorzystanie istniejących struktur danych:

Nowe obiekty

iris_3kol <- select(iris, Petal.Length, Petal.Width, Species)
iris_3kol_wymiar <- mutate(iris_3kol, petal_wymiar=Petal.Length+Petal.Width)
iris_3kol_wymiar_setosa <- filter(iris_3kol_wymiar, Species=="setosa")
20 / 50

Przetwarzanie potokowe

Użycie operatora pipe: %>% (łącznik) ułatwia zarządzanie kodem i pisanie czytelnej składni poprzez wykorzystanie istniejących struktur danych:

Nowe obiekty

iris_3kol <- select(iris, Petal.Length, Petal.Width, Species)
iris_3kol_wymiar <- mutate(iris_3kol, petal_wymiar=Petal.Length+Petal.Width)
iris_3kol_wymiar_setosa <- filter(iris_3kol_wymiar, Species=="setosa")

Zagnieżdżanie

iris_setosa <- filter(mutate(select(iris, Petal.Length, Petal.Width, Species),
petal_wymiar=Petal.Length+Petal.Width),
Species=="setosa")
20 / 50

Przetwarzanie potokowe

Przetwarzanie potokowe

iris_setosa <- iris %>%
select(Petal.Length, Petal.Width, Species) %>%
mutate(petal_wymiar=Petal.Length+Petal.Width) %>%
filter(Species=="setosa")
21 / 50

Przetwarzanie potokowe

Przetwarzanie potokowe

iris_setosa <- iris %>%
select(Petal.Length, Petal.Width, Species) %>%
mutate(petal_wymiar=Petal.Length+Petal.Width) %>%
filter(Species=="setosa")

Znak %>% oznacza, że jako argument wejściowy data w kolejnej funkcji zostanie wpisany wynik działania wcześniejszej funkcji.

Skrót klawiszowy: ctrl + shift + m

21 / 50

Wybrane funkcje

  • select() - wybór zmiennych

  • filter() - wybór obserwacji

  • mutate() - tworzenie/modyfikacja zmiennej

  • rename() - zmiana nazwy zmiennej

  • count() - zliczanie obserwacji

  • summarise() - podsumowania danych

  • group_by() - operowanie na grupach

  • arrange() - sortowanie

22 / 50

Filtrowanie - filter()

Porównywanie:

  • = symbol przypisania (nie jest używany w filtrowaniu)

  • == symbol porównania (jest równe)

  • != symbol negacji (jest różne)

  • > i < większe i mniejsze

  • >= i <= większe lub równe i mniejsze lub równe

Operatory:

  • & - i

  • | - lub (alternatywa)

  • %in% - wartość ze zbioru

  • ! - negacja

23 / 50

Zadanie

Utwórz zbiór danych zawierający filmy, które są filmami akcji, miały swoją premierę po 2010 roku i trwały co najmniej 120 minut lub miały ocenę powyżej 8.0. Alternatywa ma dotyczyć tylko dwóch ostatnich warunków.

05:00
24 / 50

Braki danych

Brak danych jest oznaczany jako NA. Jest to wartość nieliczbowa i nie można jej porównywać w następujący sposób:

  • zmienna == NA

  • zmienna != NA

  • zmienna == "NA"

  • zmienna != "NA"

tylko z wykorzystaniem funkcji is.na():

  • is.na(zmienna)

  • !is.na(zmienna)

Funkcja complete.cases() lub drop_na() służy do identyfikacji obserwacji, które nie zawierają braków danych w całym zbiorze danych.

25 / 50

Zadanie

Ile obwodów głosowania znajduje się w Poznaniu?

05:00
26 / 50

Wybieranie kolumn - select()

Wybór kolumn, które mają się znaleźć w nowym zbiorze:

iris2 <- iris %>%
select(Species, Petal.Length, Petal.Width)

Które nie mają się znaleźć w nowym zbiorze:

iris2 <- iris %>%
select(-Petal.Length, -Petal.Width)

Które mają znaleźć się w nowym zbiorze z nową nazwą:

iris2 <- iris %>%
select(gatunek=Species, Petal.Length, Petal.Width)
27 / 50

Kolejność w przetwarzaniu potokowym

DOBRZE

iris %>%
filter(Petal.Width < 0.5) %>%
select(Species, Sepal.Length, Sepal.Width)
## Species Sepal.Length Sepal.Width
## 1 setosa 5.1 3.5
## 2 setosa 4.9 3.0
## 3 setosa 4.7 3.2
## 4 setosa 4.6 3.1
## 5 setosa 5.0 3.6
## 6 setosa 5.4 3.9
28 / 50

Kolejność w przetwarzaniu potokowym

DOBRZE

iris %>%
filter(Petal.Width < 0.5) %>%
select(Species, Sepal.Length, Sepal.Width)
## Species Sepal.Length Sepal.Width
## 1 setosa 5.1 3.5
## 2 setosa 4.9 3.0
## 3 setosa 4.7 3.2
## 4 setosa 4.6 3.1
## 5 setosa 5.0 3.6
## 6 setosa 5.4 3.9

ŹLE

iris %>%
select(Species, Sepal.Length, Sepal.Width) %>%
filter(Petal.Width < 0.5)
## Error in `filter()`:
## ℹ In argument: `Petal.Width < 0.5`.
## Caused by error:
## ! object 'Petal.Width' not found
28 / 50

Zmiana nazwy - rename()

Zapis w konwencji rename(nowa_nazwa=stara_nazwa)

Można także wykorzystać funkcję select() - zmieniając nazwę podczas wybierania zmiennych

Funkcja rename_with() umożliwia zmianę nazw z wykorzystaniem funkcji np. zamieniając nazwy kolumn na zapisane wielkimi literami.

29 / 50

Zadanie

Sprawdź jak działa funkcja rename - zmień nazwę kolumny w zbiorze danych z siedziba na siedziba_komisji.

03:00
30 / 50

Nowa zmienna/modyfikacja - mutate()

iris <- iris %>%
mutate(petal=Petal.Length+Petal.Width,
sepal=Sepal.Length+Sepal.Width,
iloraz=petal/sepal)

Funkcje:

  • mutate_all - modyfikacja wszystkich zmiennych według podanej formuły

  • mutate_if - modyfikacja wszystkich zmiennych spełniających warunek

  • mutate_at - modyfikacja wszystkich wskazanych zmiennych

są zastępowane przez jedną funkcję across.

31 / 50

Zadanie

W zbiorze dotyczącym wyborów stwórz nowe zmienne, które będą zawierały procentowy wynik kandydatów. Gdzie była największa różnica pomiędzy wybranymi kandydatami?

08:00
32 / 50

Warunkowe tworzenie zmiennej

Funkcje pozwalające na warunkowe tworzenie nowej zmiennej:

  • if_else(condition, true, false)

  • case_when(condtion1 ~ value1, condition2 ~ value2, .default = value3)

33 / 50

Zadanie

Ile obwodów głosowania miało frekwencję powyżej 80%?

03:00
34 / 50

Podsumowanie - summarise() i summarize()

iris %>%
summarise(liczebnosc=n(),
srednia_pl=mean(Petal.Length),
mediana_sl=median(Sepal.Length))
## liczebnosc srednia_pl mediana_sl
## 1 150 3.758 5.8
35 / 50

Zadanie

Ile wynosiła średnia, mediana i odchylenie standardowe wartości frekwencji?

05:00
36 / 50

Grupowanie - group_by()

Najlepiej działa w połączeniu z summarise():

iris %>%
group_by(Species) %>%
summarise(liczebnosc=n(),
srednia_pl=mean(Petal.Length))
## # A tibble: 3 × 3
## Species liczebnosc srednia_pl
## <fct> <int> <dbl>
## 1 setosa 50 1.46
## 2 versicolor 50 4.26
## 3 virginica 50 5.55
37 / 50

Liczebności - count()

Jeżeli chcemy tylko wyznaczyć liczebności grup to wystarczy funkcja count():

iris %>%
count(Species)
## Species n
## 1 setosa 50
## 2 versicolor 50
## 3 virginica 50
38 / 50

Sortowanie - arrange()

Sortuje podane kolumny w porządku rosnącym.

iris %>%
arrange(Sepal.Length, Sepal.Width) %>%
head()
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 4.3 3.0 1.1 0.1 setosa
## 2 4.4 2.9 1.4 0.2 setosa
## 3 4.4 3.0 1.3 0.2 setosa
## 4 4.4 3.2 1.3 0.2 setosa
## 5 4.5 2.3 1.3 0.3 setosa
## 6 4.6 3.1 1.5 0.2 setosa

Posortowanie w porządku malejącym wymaga użycia funkcji desc() w odniesieniu do wybranej kolumny.

39 / 50

Zadanie

Oblicz liczbę komisji w poszczególnych województwach oraz średnią liczbę nieważnych głosów.

05:00
40 / 50

Zadanie

10:00

W jakich krajach i miastach za granicą utworzono najwięcej obwodów głosowania?

41 / 50

Łączenie danych

źródło

42 / 50

Zadanie

Po wczytaniu zbioru danych gus.RData połącz ze sobą zbiory danych zawierające informacje o liczbie przedsiębiorstw na 10 tys. mieszkańców (zbiór pod_10tys), stopie bezrobocia (zbiór bezrobocie) oraz wynagrodzeniu (zbiór wyn).

10:00
43 / 50

Szeroka i długa reprezentacja danych

źródło

44 / 50

Animacja

źródło

45 / 50

Zbiór iris

head(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
46 / 50

Wide -> long - pivot_longer()

iris_long <- iris %>%
mutate(id=1:nrow(iris)) %>%
pivot_longer(Sepal.Length:Petal.Width)
head(iris_long)
## # A tibble: 6 × 4
## Species id name value
## <fct> <int> <chr> <dbl>
## 1 setosa 1 Sepal.Length 5.1
## 2 setosa 1 Sepal.Width 3.5
## 3 setosa 1 Petal.Length 1.4
## 4 setosa 1 Petal.Width 0.2
## 5 setosa 2 Sepal.Length 4.9
## 6 setosa 2 Sepal.Width 3
47 / 50

Long -> wide - pivot_wider()

iris_wide <- iris_long %>%
pivot_wider()
head(iris_wide)
## # A tibble: 6 × 6
## Species id Sepal.Length Sepal.Width Petal.Length Petal.Width
## <fct> <int> <dbl> <dbl> <dbl> <dbl>
## 1 setosa 1 5.1 3.5 1.4 0.2
## 2 setosa 2 4.9 3 1.4 0.2
## 3 setosa 3 4.7 3.2 1.3 0.2
## 4 setosa 4 4.6 3.1 1.5 0.2
## 5 setosa 5 5 3.6 1.4 0.2
## 6 setosa 6 5.4 3.9 1.7 0.4
48 / 50

Zadanie

Stwórz zbiór danych, który będzie zawierał średni wynik kandydatów w przekroju województw, na następnie zamień reprezentację tego zbioru na reprezentację długą.

10:00
49 / 50

Pytania?

50 / 50

Zestaw analityka - tidyverse

install.packages("tidyverse")
  • readxl - wczytywanie plików Excela
  • haven - wczytywanie plików SAS, SPSS, Stata
  • jsonlite - wczytywanie JSON
  • xml2 - wczytywanie XML
  • httr - dostęp do stron html
  • rvest - web scraping
  • DBI - dostęp do baz danych
  • hms - operacje na czasie dnia
  • blob - przechowywanie danych binarnych
  • magrittr - przetwarzanie potokowe %>%
  • glue - łączenie tekstów
library("tidyverse")
  • dplyr - przetwarzanie danych tabelarycznych
  • forcats - operacje na czynnikach
  • ggplot2 - wykresy
  • lubridate - operacje na datach
  • purrr - programowanie funkcyjne
  • readr - wczytywanie plików tekstowych
  • stringr - operacje na tekstach
  • tibble - nowoczesny data.frame
  • tidyr - porządkowanie danych

Strona projektu Tidyverse

2 / 50
Paused

Help

Keyboard shortcuts

, , Pg Up, k Go to previous slide
, , Pg Dn, Space, j Go to next slide
Home Go to first slide
End Go to last slide
Number + Return Go to specific slide
b / m / f Toggle blackout / mirrored / fullscreen mode
c Clone slideshow
p Toggle presenter mode
t Restart the presentation timer
?, h Toggle this help
Esc Back to slideshow