Spis treści:
Eksploracja danych z bibliotekami dplyr, tidyr oraz
stringr
- Podzbiory kolumn
- Filtrowanie wierszy
- Operatory logiczne, algebra Boola, prawa de Morgana
- Tworzenie nowych kolumn (1x Challenge)
- Wartości brakujące
- Manipulowanie tekstem (3x Challenge)
- Agregacja danych (1x Challenge)
- Tabele przestawne, dane w formacie long oraz wide
- Łączenie tabel
Przydatne materiały:
- dplyr
cheatsheet
- tidyr
cheatsheet
- stringr
cheatsheet
- ggplot2
cheatsheet
- A.
Kassambara - Guide to Create Beautiful Graphics in R.
if(!require('tidyverse')) install.packages('tidyverse')
## Ładowanie wymaganego pakietu: tidyverse
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.0 ✔ purrr 0.3.5
## ✔ tibble 3.1.8 ✔ dplyr 1.0.10
## ✔ tidyr 1.2.1 ✔ stringr 1.4.1
## ✔ readr 2.1.3 ✔ forcats 0.5.2
## Warning: pakiet 'ggplot2' został zbudowany w wersji R 4.2.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
library(tidyverse)
Dane pochodzą ze strony https://flixgem.com/ (wersja zbioru danych z dnia 12 marca 2021). Dane zawierają informacje na temat 9425 filmów i seriali dostępnych na Netlixie.
dane$Release.Date <- as.Date(dane$Release.Date, format = "%d/%m/%Y")
dane$Netflix.Release.Date <- as.Date(dane$Netflix.Release.Date, format = "%d/%m/%Y")
CHALLENGE 1: Jaki jest najstarszy film Woody’ego Allena dostępny na Netflixie?
dane %>%
filter(Director == 'Woody Allen') %>%
arrange(Release.Date) %>%
select(Title, Release.Date) %>%
group_by(Release.Date)
## # A tibble: 18 × 2
## # Groups: Release.Date [9]
## Title Release.…¹
## <chr> <date>
## 1 Everything You Always Wanted to Know About Sex But Were Afraid to… 1972-06-08
## 2 Alice 1991-10-01
## 3 Whatever Works 2009-03-07
## 4 Midnight in Paris 2011-10-06
## 5 To Rome with Love 2012-06-07
## 6 Irrational Man 2015-07-08
## 7 Café Society 2016-05-08
## 8 A Rainy Day in New York 2020-10-11
## 9 Sleeper NA
## 10 Wonder Wheel NA
## 11 A Midsummer Nights Sex Comedy NA
## 12 Love and Death NA
## 13 Manhattan Murder Mystery NA
## 14 Magic in the Moonlight NA
## 15 Blue Jasmine NA
## 16 Scoop NA
## 17 Vicky Cristina Barcelona NA
## 18 You Will Meet a Tall Dark Stranger NA
## # … with abbreviated variable name ¹Release.Date
#odp Everything You Always Wanted to Know About Sex But Were Afraid to Ask
CHALLENGE 2: Jakie są trzy najwyżej oceniane komedie dostępne w języku polskim?
dane %>%
filter(Genre %>% str_detect("Comedy")) %>%
filter(Languages %>% str_detect('Polish')) %>%
arrange(-IMDb.Score) %>%
select(Title, IMDb.Score) %>%
top_n(3)
## Selecting by IMDb.Score
## Title IMDb.Score
## 1 Rake 8.5
## 2 Teddy Bear 8.2
## 3 Trois Couleurs - Blanc 7.6
#odp"Rake","Teddy Bear",'Trois Couleurs Blanc"
CHALLENGE 3: Dla produkcji z lat 2019 oraz 2020 jaki jest średni czas między premierą a pojawieniem się na Netflixie?
dane %>%
drop_na(Release.Date ,Netflix.Release.Date) %>%
mutate(rok = lubridate::year(Release.Date), roznica = Netflix.Release.Date - Release.Date) %>%
filter(rok %>% between(2019,2020)) %>%
group_by(rok) %>%
summarize(srednia = mean(roznica) %>% round(0))
## # A tibble: 2 × 2
## rok srednia
## <dbl> <drtn>
## 1 2019 97 days
## 2 2020 8 days
#odp 2019-97days, 2020-8days
CHALLENGE 4: Jakie są najpopularniejsze tagi dla produkcji dostępnych w języku polskim?
dane %>%
filter(Languages %>% str_detect('Polish')) %>%
pull(Tags) %>%
str_c(collapse = ",") %>%
str_split(",") %>%
table() %>%
as.data.frame() %>%
arrange(- Freq) %>%
top_n(5)
## Selecting by Freq
## . Freq
## 1 Dramas 50
## 2 Polish Movies 29
## 3 Polish Dramas 17
## 4 TV Dramas 15
## 5 International Dramas 14
## 6 Movies Based on Books 14
Agregacja danych
Za pomocą funkcji group_by() oraz summarize() wykonujemy operacje na zagregowanych danych.
dane %>%
group_by(Series.or.Movie) %>%
summarize(
count = n()
,avg_imdb_score = mean(IMDb.Score, na.rm = TRUE) %>% round(2)
,avg_imdb_votes = mean(IMDb.Votes, na.rm = TRUE) %>% round(0)
,sum_awards = sum(Awards.Received, na.rm = TRUE)
)
## # A tibble: 2 × 5
## Series.or.Movie count avg_imdb_score avg_imdb_votes sum_awards
## <chr> <int> <dbl> <dbl> <int>
## 1 Movie 7010 6.75 73010 42708
## 2 Series 2415 7.54 22844 8172
dane %>%
group_by(Series.or.Movie, Runtime) %>%
summarize(n = n()) %>%
arrange(-n)
## `summarise()` has grouped output by 'Series.or.Movie'. You can override using
## the `.groups` argument.
## # A tibble: 6 × 3
## # Groups: Series.or.Movie [2]
## Series.or.Movie Runtime n
## <chr> <chr> <int>
## 1 Movie "1-2 hour" 5230
## 2 Series "< 30 minutes" 2414
## 3 Movie "> 2 hrs" 1551
## 4 Movie "30-60 mins" 136
## 5 Movie "< 30 minutes" 93
## 6 Series "" 1
CHALLENGE 5: Jakie są średnie oceny filmów wyprodukowanych w poszczególnych dekadach (tzn. lata 60, 70, 80, 90 etc.)?
dane$Release.Date <- as.Date(dane$Release.Date, format = "%m/%d/%Y")
dane %>%
mutate(rok = lubridate::year(Release.Date), decade = floor(rok/10)*10) %>%
group_by(decade) %>%
summarize(count = n(),
avg_imdb_score = mean(IMDb.Score, na.rm = TRUE) %>% round(2))
## # A tibble: 11 × 3
## decade count avg_imdb_score
## <dbl> <int> <dbl>
## 1 1930 5 7.24
## 2 1940 4 7.88
## 3 1950 8 7.59
## 4 1960 30 7.48
## 5 1970 43 7.29
## 6 1980 121 7.24
## 7 1990 239 6.88
## 8 2000 678 6.91
## 9 2010 2483 7
## 10 2020 241 7.05
## 11 NA 5573 6.93