Podstawowe operacje w R - część 5.

Wizualizacja danych

Patryk Dunajewski

2022-12-07

Wizualizacja danych z biblioteką ggplot2
- Wykresy zmiennej ilościowej
- Wykresy zmiennej jakościowej
- Wykresy dwóch zmiennych ilościowych
- Wykresy dwóch zmiennych jakościowych
- Wykresy zmiennej ilościowej vs zmiennej jakościowej
- Wykresy bąbelkowe (3x Challenge)
- Kilka wykresów na jednym panelu (2x Challenge).

Przydatne materiały:
- ggplot2 cheatsheet
- A. Kassambara - Guide to Create Beautiful Graphics in R.

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 Netlix.

CHALLENGE 6: Stwórz analogiczny wykres pokazujący aktorów grających w najpopularniejszych produkcjach (score i votes).

n_productions = 50
n_actors = 25
dane_aktorzy <- dane %>%
  select(c(Title, Actors, IMDb.Votes, IMDb.Score)) %>%
  arrange(-IMDb.Votes) %>%
  head(n_productions)

aktorzy <- dane_aktorzy %>% 
  select(Actors) %>% 
  unlist() %>% 
  strsplit(',') %>%
  unlist() %>% 
  trimws() %>% 
  table() %>% 
  as.data.frame()

aktorzy <- data.frame(
  Actors = aktorzy$.
  ,`Count` = aktorzy$Freq
  ,`IMDb Score Average` = NA
  ,`IMDb Votes Average` = NA
)

for (i in 1:nrow(aktorzy)) {
  aktorzy$IMDb.Score.Average[i] <- dane_aktorzy %>% 
    filter(str_detect(Actors, aktorzy$Actors[i] %>%
                        as.character() %>% eval())) %>%
    select(IMDb.Score) %>% unlist() %>% mean(na.rm = TRUE)
  
  aktorzy$IMDb.Votes.Average[i] <- dane_aktorzy %>% 
    filter(str_detect(Actors, aktorzy$Actors[i] %>%
                        as.character() %>% eval())) %>%
    select(IMDb.Votes) %>% unlist() %>% mean(na.rm = TRUE)
}

aktorzy%>%
  # arrange(desc(IMDb.Votes.Average))%>%
  arrange(-Count, -IMDb.Votes.Average)%>%
  head(n_actors)%>%
  ggplot(aes(IMDb.Score.Average, IMDb.Votes.Average, label = Actors)) +
    geom_point(aes(color = Actors, size = Count)) +
    geom_text_repel() +
    theme(legend.position = 'none') +
    labs(title = sprintf('Top %i aktorow pod wzgledem liczby wystapien oraz sredniej liczby glosow \n imdb dla top %i produkcji', n_actors, n_productions))

CHALLENGE 7: Stwórz analogiczny wykres pokazujący w jakich latach powstawały najpopularniejsze produkcje

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')
  )
# miejsce na kod
n=100
dane %>%
  select(c(Title, Release.Date, IMDb.Votes)) %>%
  arrange(-IMDb.Votes) %>%
  head(n) %>%
  mutate(Dekada = floor(year(Release.Date)/10)*10)%>%
  count(Dekada)%>%
  arrange(Dekada)%>%
  mutate(Dekada = as.character(Dekada))%>%
  rename(Ilosc = n)%>%
  ggplot(aes(x=Dekada,y=Ilosc))+
    geom_col(aes(fill=Dekada))+
    scale_fill_brewer(palette="Set1")+
    labs(title = sprintf('Ilosc wyprodukowanych produkcji w danej dekadzie dla top %i \nnajpopularniejszych produkcji', n))+
  geom_text(aes(label = Ilosc), vjust = 1.5)

CHALLENGE 8: Jakie są najpopularniejsze języki dostępne na Netflixie? Podpowiedź: wykres kolumnowy.

n_jezyki = 10
dane%>%
  pull(Languages) %>%
    paste0(collapse = ', ') %>%
    str_extract_all('[A-Za-z]+') %>%
    unlist() %>%
    table() %>%
    as.data.frame()%>%
  rename(Jezyk = ".", Ilosc = Freq)%>%
  arrange(-Ilosc)%>%
  head(n_jezyki)%>%
  ggplot(aes(x=Jezyk,y=Ilosc))+
    geom_col(aes(fill=Jezyk))+
    labs(title = sprintf('%i najpopularniejszych jezykow', n_jezyki))+
    geom_text(aes(label = Ilosc), vjust = 1)

Kilka wykresów na jednym panelu

CHALLENGE 9: Dla filmów i seriali stwórz wykresy ocen z poszczególnych portali (Hidden Gem, IMDb, Rotten Tomatoes, Metacritic). Podpowiedź: warto odpiwotować dane do formatu long.

n_top = 5
p_movies<-dane %>%
  select(Title, Series.or.Movie, Hidden.Gem.Score, IMDb.Score, Rotten.Tomatoes.Score, Metacritic.Score)%>%
  filter(Series.or.Movie == "Movie")%>%
  drop_na()%>%
  mutate(Rotten.Tomatoes.Score=Rotten.Tomatoes.Score/10, Metacritic.Score=Metacritic.Score/10, SredniaOcena = (Hidden.Gem.Score + IMDb.Score + Rotten.Tomatoes.Score + Metacritic.Score)/4)%>%
  arrange(-SredniaOcena)%>%
  head(n_top)%>%
  pivot_longer(Hidden.Gem.Score:Metacritic.Score)%>%
  rename(Ocena = value, Witryna = name )%>%
  ggplot(aes(x=Title, y = Ocena, fill=Witryna))+
    geom_bar(stat="identity", position="dodge")+
    labs(title = sprintf("Oceny filmow z roznych witryn dla %i najlepszych filmow na podstawie \nsredniej oceny ze wszystkich witryn", n_top))+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.8))+
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

p_series<-dane %>%
  select(Title, Series.or.Movie, Hidden.Gem.Score, IMDb.Score, Rotten.Tomatoes.Score, Metacritic.Score)%>%
  filter(Series.or.Movie == "Series")%>%
  drop_na()%>%
  mutate(Rotten.Tomatoes.Score=Rotten.Tomatoes.Score/10, Metacritic.Score=Metacritic.Score/10, SredniaOcena = (Hidden.Gem.Score + IMDb.Score + Rotten.Tomatoes.Score + Metacritic.Score)/4)%>%
  arrange(-SredniaOcena)%>%
  head(n_top)%>%
  pivot_longer(Hidden.Gem.Score:Metacritic.Score)%>%
  rename(Ocena = value, Witryna = name )%>%
  ggplot(aes(x=Title, y = Ocena, fill=Witryna))+
    geom_bar(stat="identity", position="dodge")+
    labs(title = sprintf("Oceny serialow z roznych witryn dla %i najlepszych serialow na podstawie \nsredniej oceny ze wszystkich witryn", n_top))+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.8))+
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

grid.arrange(p_movies, p_series, nrow = 2)

p_movies

p_series

CHALLENGE 10: Jakie wytwórnie filmowe produkują najwięcej i jak się to zmieniało na przestrzeni ostatnich lat?

dekady<-sort(as.numeric(na.omit(unique(floor(year(dane$Release.Date)/10)*10))))
 
top_prodhouse<-dane%>%
  select(Production.House, Series.or.Movie)%>%
  filter(Series.or.Movie == "Movie" & Production.House!="")%>%
  count(Production.House)%>%
  arrange(-n)%>%
  head(10)

dane%>%
  select(Production.House, Series.or.Movie, Release.Date)%>%
  filter(Series.or.Movie == "Movie" & Production.House %in% top_prodhouse$Production.House)%>%
  mutate(Dekada = floor(year(Release.Date)/10)*10)%>%
  count(Production.House, Dekada)%>%
  arrange(-n)%>%
  rename(Wytwornia=Production.House, Ilosc = n)%>%
  ggplot(aes(x = Dekada, y = Ilosc, label=Wytwornia))+
    geom_point(aes(color = Wytwornia, size = Ilosc))+
    labs(title=sprintf("Najpopularniejsze wytwornie w poszczegolnych \ndekadach"))

top_prodhouse%>%
  rename(Wytwornia=Production.House, Ilosc = n)%>%
  ggplot(aes(x=Wytwornia, y=Ilosc, fill=Wytwornia))+
    geom_col()+
    theme(axis.text.x = element_text(angle = 90, vjust = 0.8))+
    scale_x_discrete(labels = function(x) str_wrap(x, width = 10))+
    geom_text(aes(label = Ilosc), vjust = 1)+
    labs(title=sprintf("Najpopularniejsze wytwornie"))

dane%>%
  select(Production.House, Series.or.Movie, Release.Date)%>%
  filter(Series.or.Movie == "Movie" & Production.House =="Netflix")%>%
  mutate(Rok = year(Release.Date))%>%
  count(Production.House, Rok)%>%
  arrange(-n)%>%
  rename(Wytwornia=Production.House, Ilosc = n)
##   Wytwornia  Rok Ilosc
## 1   Netflix 2017    15
## 2   Netflix 2019    12
## 3   Netflix 2016    10
## 4   Netflix 2018     8
## 5   Netflix 2014     3
## 6   Netflix 2015     3
## 7   Netflix 2013     2
dane%>%
  select(Production.House, Series.or.Movie, Release.Date)%>%
  filter(Series.or.Movie == "Movie" & Production.House =="Paramount")%>%
  mutate(Rok = year(Release.Date))%>%
  count(Production.House, Rok)%>%
  arrange(-n)%>%
  rename(Wytwornia=Production.House, Ilosc = n)
##    Wytwornia  Rok Ilosc
## 1  Paramount 1960     2
## 2  Paramount 1982     2
## 3  Paramount 1986     2
## 4  Paramount 2003     2
## 5  Paramount 1979     1
## 6  Paramount 1980     1
## 7  Paramount 1988     1
## 8  Paramount 1990     1
## 9  Paramount 2002     1
## 10 Paramount 2004     1
## 11 Paramount 2011     1
dane%>%
  select(Production.House, Series.or.Movie, Release.Date)%>%
  filter(Series.or.Movie == "Movie" & Production.House =="Universal Pictures")%>%
  mutate(Rok = year(Release.Date))%>%
  count(Production.House, Rok)%>%
  arrange(-n)%>%
  rename(Wytwornia=Production.House, Ilosc = n)
##             Wytwornia  Rok Ilosc
## 1  Universal Pictures 1996     5
## 2  Universal Pictures 1985     3
## 3  Universal Pictures 2005     3
## 4  Universal Pictures 1995     2
## 5  Universal Pictures 2003     2
## 6  Universal Pictures 2006     2
## 7  Universal Pictures 1978     1
## 8  Universal Pictures 1980     1
## 9  Universal Pictures 1982     1
## 10 Universal Pictures 1983     1
## 11 Universal Pictures 1989     1
## 12 Universal Pictures 1992     1
## 13 Universal Pictures 1993     1
## 14 Universal Pictures 1998     1
## 15 Universal Pictures 1999     1
## 16 Universal Pictures 2001     1
## 17 Universal Pictures 2008     1
## 18 Universal Pictures 2010     1
## 19 Universal Pictures 2015     1
## 20 Universal Pictures 2016     1