# dplyr w praktyce: analizowanie danych na temat lotów
# Wczytywanie pakietu nycflights13 w celu uzyskania dostępu do ramki danych flights.
install.packages("nycflights13") # Raz w każdym komputerze.
library("nycflights13")          # W każdym skrypcie.
library("dplyr")                 # Wczytywanie biblioteki dplyr.
library("ggplot2")               # Na potrzeby tworzenia wykresów.
# Zapoznawanie się ze zbiorem danych flights.
?flights          # Wyświetlanie dostępnej dokumentacji.
dim(flights)      # Sprawdzanie liczby wierszy i kolumn.
colnames(flights) # Sprawdzanie nazw kolumn.
View(flights)     # Wyświetlanie ramki danych w przeglądarce w środowisku RStudio.
# Znajdowanie linii lotniczych (carrier) z największą liczbą
# opóźnionych lotów.
has_most_delays <- flights %>%            # Zaczynamy od ramki danych fligths.
group_by(carrier) %>%                   # Grupowanie według linii lotniczych (carrier).
filter(dep_delay > 0) %>%               # Wyszukiwanie samych opóźnień.
summarize(num_delay = n()) %>%          # Zliczanie obserwacji.
filter(num_delay == max(num_delay)) %>% # Znajdowanie grupy z największą liczbą obserwacji.
select(carrier)                         # Pobieranie nazwy linii lotniczych.
# Pobieranie nazwy linii lotniczych z największą liczbą opóźnień.
most_delayed_name <- has_most_delays %>%  # Rozpoczynanie od uzyskanej wcześniej odpowiedzi.
left_join(airlines, by = "carrier") %>% # Złączanie na podstawie identyfikatora linii.
select(name)                            # Pobieranie nazwy linii lotniczych.
print(most_delayed_name$name) # Dostęp do wartości z ramki tibble.
# Obliczanie średniego opóźnienia przylotów (arr_delay)
# dla każdego docelowego lotniska (dest).
most_early <- flights %>%
group_by(dest) %>%                 # Grupowanie na podstawie docelowego lotniska.
summarize(delay = mean(arr_delay)) # Obliczanie średniego opóźnienia.
# Obliczanie średniego opóźnienia dla docelowych lotnisk z pominięciem wyników NA.
most_early <- flights %>%
group_by(dest) %>%                               # Grupowanie według docelowych lotnisk.
summarize(delay = mean(arr_delay, na.rm = TRUE)) # Obliczanie średniego opóźnienia.
# Identyfikowanie lokalizacji, gdzie loty średnio docierają najwcześniej względem planu.
most_early <- flights %>%
group_by(dest) %>% # Grupowanie według lokalizacji docelowej.
summarize(delay = mean(arr_delay, na.rm = TRUE)) %>% # Obliczanie średniego opóźnienia.
filter(delay == min(delay, na.rm = TRUE)) %>% # Filtrowanie pod kątem najmniejszego opóźnienia.
select(dest, delay) %>% # Pobieranie lokalizacji docelowej (i opóźnienia w celu zapisania go).
left_join(airports, by = c("dest" = "faa")) %>% # Złączanie z ramką danych airports.
select(dest, name, delay) # Pobieranie szukanych zmiennych wyjściowych.
print(most_early)
# Identyfikowanie miesiąca, w którym loty mają zwykle największe opóźnienia.
flights %>%
group_by(month) %>% # Grupowanie na podstawie odpowiedniego atrybutu.
summarize(delay = mean(arr_delay, na.rm = TRUE)) %>% # Podsumowanie na podstawie opóźnień.
filter(delay == max(delay)) %>% # Filtrowanie pod kątem szukanego rekordu.
select(month) %>% # Pobieranie kolumny z odpowiedzią na pytanie.
print() # Bezpośrednie wyświetlanie ramki tibble.
# Obliczanie opóźnień według miesięcy i dodawanie nazw miesięcy na potrzeby wizualnej prezentacji wyników.
# Zauważ, że month.name to zmienna wbudowana w języku R.
delay_by_month <- flights %>%
group_by(month) %>%
summarize(delay = mean(arr_delay, na.rm = TRUE)) %>%
select(delay) %>%
mutate(month = month.name)
# Tworzenie wykresu za pomocą pakietu ggplot2 (opisanego w rozdziale 17.).
ggplot(data = delay_by_month) +
geom_point(
mapping = aes(x = delay, y = month),
color = "blue",
alpha = .4,
size = 3
) +
geom_vline(xintercept = 0, size = .25) +
xlim(c(-20, 20)) +
scale_y_discrete(limits = rev(month.name)) +
labs(title = "Średnie opóźnienie w poszczególnych miesiącach",
y = "", x = "Opóźnienie (w minutach)")
register_google(key = AIzaSyCddEv8JWp9Eh750lBq9SDKvRXBr9zISUo)
# Wczytywanie danych z serwisu GitHub.
data_url <- "https://raw.githubusercontent.com/washingtonpost/data-police-shootings/master/fatal-police-shootings-data.csv"
shootings <- read.csv(data_url, stringsAsFactors = F) %>%
mutate(
address = paste0(city, ", ", state)
) %>%
filter(as.Date(date) >= as.Date("2018-01-01"))
# Pobieranie adresĂłw.
shootings[, c("long", "lat")] <- geocode(shootings$address)
# ZastÄ™powanie wartoĹ›ci.
shootings$race[shootings$race == "W"] <- "BiaĹ‚a (nielatynoska)"
shootings$race[shootings$race == "B"] <- "Czarna nielatynoska"
shootings$race[shootings$race == "A"] <- "Azjatycka"
shootings$race[shootings$race == "N"] <- "Rdzenno-ameryka?ska"
shootings$race[shootings$race == "H"] <- "Latynoska"
shootings$race[shootings$race == "O"] <- "Inna"
shootings$race[shootings$race == ""] <- "Nieznana"
shootings$gender[shootings$gender == "M"] <- "MÄ™ĹĽczyzna"
shootings$gender[shootings$gender == "F"] <- "Kobieta"
shootings$gender[shootings$gender == ""] <- "Nieznana"
# Zapisywanie pliku CSV zawierajÄ…cego dane.
write.csv(shootings, "police-shootings.csv", row.names = FALSE)
# UĹĽyj rozwojowej wersji pakietu ggmaps, aby moĹĽna byĹ‚o podaÄ‡ klucz API Map Google.
# devtools::install_github("dkahle/ggmap")
library(ggmap)
library(dplyr)
register_google(key = AIzaSyCddEv8JWp9Eh750lBq9SDKvRXBr9zISUo)
# Wczytywanie danych z serwisu GitHub.
data_url <- "https://raw.githubusercontent.com/washingtonpost/data-police-shootings/master/fatal-police-shootings-data.csv"
shootings <- read.csv(data_url, stringsAsFactors = F) %>%
mutate(
address = paste0(city, ", ", state)
) %>%
filter(as.Date(date) >= as.Date("2018-01-01"))
# Pobieranie adresĂłw.
shootings[, c("long", "lat")] <- geocode(shootings$address)
# ZastÄ™powanie wartoĹ›ci.
shootings$race[shootings$race == "W"] <- "BiaĹ‚a (nielatynoska)"
shootings$race[shootings$race == "B"] <- "Czarna nielatynoska"
shootings$race[shootings$race == "A"] <- "Azjatycka"
shootings$race[shootings$race == "N"] <- "Rdzenno-ameryka?ska"
shootings$race[shootings$race == "H"] <- "Latynoska"
shootings$race[shootings$race == "O"] <- "Inna"
shootings$race[shootings$race == ""] <- "Nieznana"
shootings$gender[shootings$gender == "M"] <- "MÄ™ĹĽczyzna"
shootings$gender[shootings$gender == "F"] <- "Kobieta"
shootings$gender[shootings$gender == ""] <- "Nieznana"
# Zapisywanie pliku CSV zawierajÄ…cego dane.
write.csv(shootings, "police-shootings.csv", row.names = FALSE)
#register_google(key = google_key)
register_google(key = "AIzaSyCddEv8JWp9Eh750lBq9SDKvRXBr9zISUo")
data_url <- "https://raw.githubusercontent.com/washingtonpost/data-police-shootings/master/fatal-police-shootings-data.csv"
shootings <- read.csv(data_url, stringsAsFactors = F) %>%
mutate(
address = paste0(city, ", ", state)
) %>%
filter(as.Date(date) >= as.Date("2018-01-01"))
# Pobieranie adresĂłw.
shootings[, c("long", "lat")] <- geocode(shootings$address)
# ZastÄ™powanie wartoĹ›ci.
shootings$race[shootings$race == "W"] <- "BiaĹ‚a (nielatynoska)"
shootings$race[shootings$race == "B"] <- "Czarna nielatynoska"
shootings$race[shootings$race == "A"] <- "Azjatycka"
shootings$race[shootings$race == "N"] <- "Rdzenno-ameryka?ska"
shootings$race[shootings$race == "H"] <- "Latynoska"
shootings$race[shootings$race == "O"] <- "Inna"
shootings$race[shootings$race == ""] <- "Nieznana"
shootings$gender[shootings$gender == "M"] <- "MÄ™ĹĽczyzna"
shootings$gender[shootings$gender == "F"] <- "Kobieta"
shootings$gender[shootings$gender == ""] <- "Nieznana"
# Zapisywanie pliku CSV zawierajÄ…cego dane.
write.csv(shootings, "police-shootings.csv", row.names = FALSE)
# `tidyr` w praktyce: eksplorowanie statystyk z obszaru edukacji
# Wczytywanie potrzebnych pakietów
library(tidyr) # Na potrzeby przekształcania danych
library(dplyr) # Na potrzeby przekształcania danych
library(ggplot2) # Na potrzeby generowania wykresów
library(ggrepel) # Na potrzeby generowania wykresów
library(scales) # Na potrzeby generowania wykresów
# Wczytywanie danych; pierwsze cztery (zbędne) wiersze są pomijane.
wb_data <- read.csv(
"data/world_bank_data.csv",
stringsAsFactors = F,
skip = 4
)
# Wizualne porównanie wydatków w latach 1990 i 2014.
# Rozpoczęcie od przefiltrowania wierszy pod kątem analizowanego wskaźnika.
indicator <- "Government expenditure on education, total (% of GDP)"
expenditure_plot_data <- wb_data %>%
filter(Indicator.Name == indicator)
# Tworzenie wykresu wydatków w latach 1990 i 2014 za pomocą pakietu ggplot2.
# Więcej informacji znajdziesz w rozdziale 16.
expenditure_chart <- ggplot(data = expenditure_plot_data) +
geom_text_repel(
mapping = aes(x = X1990 / 100, y = X2014 / 100, label = Country.Code)
) +
scale_x_continuous(labels = percent) +
scale_y_continuous(labels = percent) +
labs(
title = "Wydatki rządowe na edukację w sumie (% PKB)",
x = "Wydatki w 1990 r.", y = "Wydatki w 2014 r."
)
# Zmiana kształtu danych, aby utworzyć nową kolumnę year.
long_year_data <- wb_data %>%
gather(
key = year,    # year będzie nową kolumną z kluczem.
value = value, # value będzie nową kolumną z wartościami.
X1960:X        # Zbierane są wszystkie kolumny od X1960 do X.
)
# Filtrowanie wierszy pod kątem wskaźnika i kraju.
indicator <- "Government expenditure on education, total (% of GDP)"
spain_plot_data <- long_year_data %>%
filter(
Indicator.Name == indicator,
Country.Code == "ESP" # Hiszpania
) %>%
mutate(year = as.numeric(substr(year, 2, 5))) # Usuwanie "X" przed każdym rokiem.
# Wyświetlanie wydatków na edukację w kolejnych latach.
chart_title <- paste("Wydatki rządowe na edukację w sumie (% PKB)", " - Hiszpania")
spain_chart <- ggplot(data = spain_plot_data) +
geom_line(mapping = aes(x = year, y = value / 100)) +
scale_y_continuous(labels = percent) +
labs(title = chart_title, x = "Rok", y = "Wydatki (% PKB)")
# Zmiana kształtu danych w celu utworzenia kolumny dla każdego wskaźnika.
wide_data <- long_year_data %>%
select(-Indicator.Code) %>% # Należy pominąć kolumnę Indicator.Code.
spread(
key = Indicator.Name, # Nazwy nowych kolumn to wartości z kolumny Indicator.Name.
value = value # Zapełnianie nowych kolumn wartościami z kolumny value.
)
# Przygotowywanie danych i filtrowanie pod kątem roku.
x_var <- "Literacy rate, adult female (% of females ages 15 and above)"
y_var <- "Unemployment, female (% of female labor force) (modeled ILO estimate)"
lit_plot_data <- wide_data %>%
mutate(
lit_percent_2014 = wide_data[, x_var] / 100,
employ_percent_2014 = wide_data[, y_var] / 100
) %>%
filter(year == "X2014")
# Wyświetlanie zależności między poziomem piśmienności a stopą bezrobocia.
lit_chart <- ggplot(data = lit_plot_data) +
geom_point(mapping = aes(x = lit_percent_2014, y = employ_percent_2014)) +
scale_x_continuous(labels = percent) +
scale_y_continuous(labels = percent) +
labs(
x = "Wskaźnik piśmienności wśród dorosłych kobiet (% kobiet powyżej 15 roku życia)",
y = "Bezrobocie wśród kobiet (% kobiet w wieku produkcyjnym)",
title = "Zależność między poziomem piśmienności a stopą bezrobocia wśród kobiet"
)
getwd()
setwd("C:/tłumaczenia/DataScience/kod/wpraktyce/tidyr")
# Wczytywanie danych; pierwsze cztery (zbędne) wiersze są pomijane.
wb_data <- read.csv(
"data/world_bank_data.csv",
stringsAsFactors = F,
skip = 4
)
# Wizualne porównanie wydatków w latach 1990 i 2014.
# Rozpoczęcie od przefiltrowania wierszy pod kątem analizowanego wskaźnika.
indicator <- "Government expenditure on education, total (% of GDP)"
expenditure_plot_data <- wb_data %>%
filter(Indicator.Name == indicator)
# Tworzenie wykresu wydatków w latach 1990 i 2014 za pomocą pakietu ggplot2.
# Więcej informacji znajdziesz w rozdziale 16.
expenditure_chart <- ggplot(data = expenditure_plot_data) +
geom_text_repel(
mapping = aes(x = X1990 / 100, y = X2014 / 100, label = Country.Code)
) +
scale_x_continuous(labels = percent) +
scale_y_continuous(labels = percent) +
labs(
title = "Wydatki rządowe na edukację w sumie (% PKB)",
x = "Wydatki w 1990 r.", y = "Wydatki w 2014 r."
)
# Zmiana kształtu danych, aby utworzyć nową kolumnę year.
long_year_data <- wb_data %>%
gather(
key = year,    # year będzie nową kolumną z kluczem.
value = value, # value będzie nową kolumną z wartościami.
X1960:X        # Zbierane są wszystkie kolumny od X1960 do X.
)
# Filtrowanie wierszy pod kątem wskaźnika i kraju.
indicator <- "Government expenditure on education, total (% of GDP)"
spain_plot_data <- long_year_data %>%
filter(
Indicator.Name == indicator,
Country.Code == "ESP" # Hiszpania
) %>%
mutate(year = as.numeric(substr(year, 2, 5))) # Usuwanie "X" przed każdym rokiem.
# Wyświetlanie wydatków na edukację w kolejnych latach.
chart_title <- paste("Wydatki rządowe na edukację w sumie (% PKB)", " - Hiszpania")
spain_chart <- ggplot(data = spain_plot_data) +
geom_line(mapping = aes(x = year, y = value / 100)) +
scale_y_continuous(labels = percent) +
labs(title = chart_title, x = "Rok", y = "Wydatki (% PKB)")
# Zmiana kształtu danych w celu utworzenia kolumny dla każdego wskaźnika.
wide_data <- long_year_data %>%
select(-Indicator.Code) %>% # Należy pominąć kolumnę Indicator.Code.
spread(
key = Indicator.Name, # Nazwy nowych kolumn to wartości z kolumny Indicator.Name.
value = value # Zapełnianie nowych kolumn wartościami z kolumny value.
)
# Przygotowywanie danych i filtrowanie pod kątem roku.
x_var <- "Literacy rate, adult female (% of females ages 15 and above)"
y_var <- "Unemployment, female (% of female labor force) (modeled ILO estimate)"
lit_plot_data <- wide_data %>%
mutate(
lit_percent_2014 = wide_data[, x_var] / 100,
employ_percent_2014 = wide_data[, y_var] / 100
) %>%
filter(year == "X2014")
# Wyświetlanie zależności między poziomem piśmienności a stopą bezrobocia.
lit_chart <- ggplot(data = lit_plot_data) +
geom_point(mapping = aes(x = lit_percent_2014, y = employ_percent_2014)) +
scale_x_continuous(labels = percent) +
scale_y_continuous(labels = percent) +
labs(
x = "Wskaźnik piśmienności wśród dorosłych kobiet (% kobiet powyżej 15 roku życia)",
y = "Bezrobocie wśród kobiet (% kobiet w wieku produkcyjnym)",
title = "Zależność między poziomem piśmienności a stopą bezrobocia wśród kobiet"
)
expenditure_chart
lit_chart
spain_chart
