Podstawowe operacje w R - część 3.

Eksploracja danych

Patryk Dunajewski

2022-11-23

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
## Warning: pakiet 'tidyverse' został zbudowany w wersji R 4.2.2
## ── 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
## Warning: pakiet 'tibble' został zbudowany w wersji R 4.2.2
## Warning: pakiet 'tidyr' został zbudowany w wersji R 4.2.2
## Warning: pakiet 'readr' został zbudowany w wersji R 4.2.2
## Warning: pakiet 'purrr' został zbudowany w wersji R 4.2.2
## Warning: pakiet 'dplyr' został zbudowany w wersji R 4.2.2
## Warning: pakiet 'stringr' został zbudowany w wersji R 4.2.2
## Warning: pakiet 'forcats' został zbudowany w wersji R 4.2.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(tidyverse)

if(!require('dplyr')) install.packages('dplyr')
library(dplyr)

if(!require('stringr')) install.packages('stringr')
library(stringr)

if(!require('lubridate')) install.packages('lubridate')
## Ładowanie wymaganego pakietu: lubridate
## Warning: pakiet 'lubridate' został zbudowany w wersji R 4.2.2
## Ładowanie wymaganego pakietu: timechange
## Warning: pakiet 'timechange' został zbudowany w wersji R 4.2.2
## 
## Dołączanie pakietu: 'lubridate'
## 
## Następujące obiekty zostały zakryte z 'package:base':
## 
##     date, intersect, setdiff, union
library(lubridate)

if(!require('readr')) install.packages('readr')
library(readr)

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 <- dane %>%
#   rename(Title = X.U.FEFF.Title)

CHALLENGE 1: Jaki jest najstarszy film Woody’ego Allena dostępny na Netflixie?

dane %>%
  select(Title, Release.Date, Series.or.Movie, Netflix.Link, Director) %>%
  filter((str_detect(Director, 'Woody Allen')) & !(is.null(Netflix.Link)) & (Series.or.Movie == "Movie")) %>%
  arrange(Release.Date)%>%
  head(1)
##                                Title Release.Date Series.or.Movie
## 1 You Will Meet a Tall Dark Stranger   10/22/2010           Movie
##                             Netflix.Link    Director
## 1 https://www.netflix.com/watch/70136072 Woody Allen

CHALLENGE 2: Jakie są trzy najwyżej oceniane komedie dostępne w języku polskim?

dane %>%
  select(Title, IMDb.Score, Languages, Genre) %>%
  filter(str_detect(Languages, 'Polish') & str_detect(Genre, 'Comedy'))%>%
  arrange(-IMDb.Score)%>%
  head(3)
##                    Title IMDb.Score                            Languages
## 1                   Rake        8.5 English, Polish, Indonesian, Turkish
## 2             Teddy Bear        8.2                      Polish, English
## 3 Trois Couleurs - Blanc        7.6              Polish, French, English
##                    Genre
## 1          Comedy, Drama
## 2                 Comedy
## 3 Comedy, Drama, Romance
dane %>%
  rowwise() %>%
  mutate(avg_score = mean(c(IMDb.Score * 10
                            ,Hidden.Gem.Score * 10
                            ,Rotten.Tomatoes.Score
                            ,Metacritic.Score)
                          ,na.rm = TRUE) %>%
           round(2)) %>%
  select(Title, avg_score, Languages, Genre) %>%
  filter(str_detect(Languages, 'Polish') & str_detect(Genre, 'Comedy'))%>%
  arrange(-avg_score)%>%
  head(3)
## # A tibble: 3 × 4
## # Rowwise: 
##   Title                              avg_score Languages       Genre            
##   <chr>                                  <dbl> <chr>           <chr>            
## 1 Teddy Bear                              81.3 Polish, English Comedy           
## 2 Bogdan Boner: Egzorcysta                78   Polish          Comedy, Animation
## 3 Drunk History - Pó? litra historii      76.5 Polish          Comedy

CHALLENGE 3: Dla produkcji z lat 2019 oraz 2020 jaki jest średni czas między premierą a pojawieniem się na Netflixie?

dane = dane %>%
  mutate(
    Release.Date = Release.Date %>% as.Date(format = '%m/%d/%Y')
    ,Netflix.Release.Date = Netflix.Release.Date %>% as.Date(format = '%m/%d/%Y')
  )
dane_3 = dane %>%
  select(Title, Release.Date, Netflix.Release.Date)%>%
  drop_na(Release.Date)%>%
  drop_na(Netflix.Release.Date)%>%
  filter(between(year(Release.Date),2019,2020))%>%
  mutate(roznica = (Netflix.Release.Date - Release.Date))

mean(dane_3$roznica)
## Time difference of 107.0268 days

CHALLENGE 4: Jakie są najpopularniejsze tagi dla produkcji dostępnych w języku polskim?

dane%>%
  select(Tags, Title, Languages) %>%
  filter(str_detect(Languages, 'Polish'))%>%
  pull(Tags) %>%
    paste0(collapse = ', ') %>%
    str_extract_all('[A-Za-z]+') %>%
    unlist() %>%
    table() %>%
    as.data.frame()%>%
  rename(Tag = ".", Ilosc = Freq)%>%
  arrange(-Ilosc)
##                Tag Ilosc
## 1           Dramas   195
## 2           Movies   142
## 3               TV    73
## 4           Polish    68
## 5               on    55
## 6            Films    51
## 7            Crime    41
## 8        Thrillers    40
## 9         Comedies    37
## 10   International    35
## 11        Romantic    35
## 12           Based    30
## 13           Shows    29
## 14          Action    25
## 15           based    25
## 16           Books    23
## 17         Classic    21
## 18       Adventure    20
## 19      Historical    15
## 20        Military    14
## 21          Period    11
## 22          Pieces    11
## 23    Biographical    10
## 24          Horror    10
## 25     Independent    10
## 26            life    10
## 27            Life    10
## 28            real    10
## 29            Real    10
## 30        European     9
## 31               a     8
## 32            book     8
## 33         British     8
## 34          French     8
## 35           Issue     8
## 36       Political     8
## 37          Social     8
## 38         Century     7
## 39           Music     7
## 40              th     7
## 41              US     7
## 42        Musicals     6
## 43        Thriller     6
## 44      Critically     5
## 45   Documentaries     5
## 46       Mysteries     5
## 47       Acclaimed     4
## 48            Cult     4
## 49            Dark     4
## 50      Favourites     4
## 51              Fi     4
## 52      literature     4
## 53      Programmes     4
## 54             Sci     4
## 55          Sports     4
## 56     Tearjerkers     4
## 57           Award     3
## 58         Chinese     3
## 59     Documentary     3
## 60         Fantasy     3
## 61          German     3
## 62        Japanese     3
## 63            Kids     3
## 64   Psychological     3
## 65    Supernatural     3
## 66      Adventures     2
## 67     Blockbuster     2
## 68        Cartoons     2
## 69         classic     2
## 70          Comedy     2
## 71    contemporary     2
## 72           Czech     2
## 73        Gangster     2
## 74             Gay     2
## 75         Lesbian     2
## 76          Police     2
## 77         Satires     2
## 78          Spoofs     2
## 79            Teen     2
## 80             War     2
## 81         winning     2
## 82         Winning     2
## 83       acclaimed     1
## 84         African     1
## 85        American     1
## 86             and     1
## 87      Australian     1
## 88    Blockbusters     1
## 89            Book     1
## 90       Classical     1
## 91        Classics     1
## 92           Comic     1
## 93       Courtroom     1
## 94            Docs     1
## 95           Dutch     1
## 96         Eastern     1
## 97       Education     1
## 98       Favorites     1
## 99             for     1
## 100          Globe     1
## 101         Golden     1
## 102           Gory     1
## 103           Late     1
## 104          Latin     1
## 105       Mainland     1
## 106        Mexican     1
## 107 Mockumentaries     1
## 108         Modern     1
## 109         Nature     1
## 110          Night     1
## 111          Oscar     1
## 112        Romance     1
## 113        Russian     1
## 114        Satanic     1
## 115        Science     1
## 116        Screams     1
## 117        Showbiz     1
## 118         Steamy     1
## 119        Stories     1
## 120      Superhero     1
## 121         Zombie     1

CHALLENGE 5: Jakie są średnie oceny filmów wyprodukowanych w poszczególnych dekadach (tzn. lata 60, 70, 80, 90 etc.)?

dane%>%
  mutate(Dekada = floor(year(Release.Date)/10)*10)%>%
  drop_na(Dekada)%>%
  group_by(Dekada)%>%
  summarize(SredniaOcena = mean(IMDb.Score, na.rm = TRUE) %>% round(2)) %>%
  # arrange(-SredniaOcena)
  arrange(Dekada)
## # A tibble: 10 × 2
##    Dekada SredniaOcena
##     <dbl>        <dbl>
##  1   1930         7.46
##  2   1940         7.43
##  3   1950         7.37
##  4   1960         7.46
##  5   1970         7.33
##  6   1980         7.11
##  7   1990         6.88
##  8   2000         6.85
##  9   2010         6.94
## 10   2020         7.04