Diagnoza, Wataha czy Belfer?

Który jesienny serialowy hit był najczęściej komentowany w 2017 roku? Jakie to były komentarze? Dzisiaj, w ostatnim poście w tym roku, zajmiemy się polskimi serialami z jesiennej ramówki. Na warsztat weźmiemy trzy tytuły: Diagnozę od TVN, Belfra od Canal+ oraz Watahę od HBO. Zobaczymy jak wyglądała obsługa seriali na Facebooku i jakie towarzyszyły im komentarze. Uwaga: post (lub informacje na wykresach) mogą zdradzać fabułę seriali! Kod jest na tyle uniwersalny, że wystarczy podać inne nazwy fanpage’y w części wczytującej dane aby uzyskać podobną analizę dla innych facebookowych stron - na przykład dla partii politycznych.

Pobranie danych

Skorzystamy z pakietu Rfacebook do pobrania danych. Skrypt nie jest długi, ale też niezbyt ciekawy jeśli chodzi o analizę - znajdziecie go w moim repo. To co się tam dzieje to pobranie po maksymalnie 2000 postów i komentarzy do nich z trzech fanpage’y: Diagnoza TVN, Belfer oraz Wataha, a następnie zapisanie danych do plików lokalnych (znajdziecie je również w repo). W dalszym kroku wczytamy odpowiednie pakiety:

rm(list = ls())

library(tidyverse)
library(lubridate)
library(tidytext)
library(forcats)

# to niżej na potrzeby ładniejszych tabelek :)
library(knitr)
library(kableExtra)
options(knitr.table.format = "html")

oraz same dane:

fb_posts <- readRDS("fb_posts.RDS")
fb_comments <- readRDS("fb_comments.RDS")

Przed przystąpieniem do analizy złączymy sobie obie tabele (będzie taka suma potrzebna):

fb_data <- left_join(fb_comments,
                     fb_posts %>% select(id, created_time),
                     by = c("post_id" = "id")) %>%
   rename(post_created_time = created_time) %>%
   mutate(comment_created_time = ymd_hms(comment_created_time) %>% with_tz(tzone = "Europe/Warsaw")) %>%
   mutate(post_created_time = ymd_hms(post_created_time) %>% with_tz(tzone = "Europe/Warsaw"))

Na początek zobaczmy jak wyglądała aktywność operatorów stron - ile postów było publikowanych w kolejnych dniach?

fb_posts %>%
   filter(year(created_time) == 2017) %>%
   mutate(day = date(created_time)) %>%
   count(from_name, day) %>%
   ggplot() +
   geom_point(aes(day, n, color = from_name), alpha = 0.5, show.legend = FALSE) +
   geom_smooth(aes(day, n, color = from_name), se = FALSE) +
   labs(title = "Liczba postów publikowanych na fanpage seriali,\ndzień po dniu",
        x = "Data", y = "Liczba postów", color = "") +
   theme(legend.position = "bottom")

Widzimy, że najwięcej produkowała strona poświęcona serialowi TVNu. Wyraźnie widać kiedy miała miejsce emisja serialu (od 5 września do 28 listopada, we wtorki o 21:30). Dla porządku - druga seria Watahy miała emisję od 15 października do 19 listopada (niedziele wieczorem), przy czym w HBO GO odcinki były dostępne o tydzień wcześniej (pierwszy weekend to 2 odcinki, w telewizorze - tylko jeden). Drugi sezon Belfra emitowany zaś był przez Canal+ od 22 października do 10 grudnia. Widać to na powyższym wykresie: szczyt Diagnozy i Watahy przypada na okres emisji, Belfer przyspieszył z liczbą postów zbliżając się do finału sezonu. Zobaczmy czy terminy publikacji postów łączą się z momentami emisji?

fb_posts %>%
   filter(year(created_time) == 2017) %>%
   by(.$from_name,
      function(x) {
         x %>%
            count(created_weekday, created_hour) %>%
            ggplot() +
            geom_tile(aes(created_weekday, created_hour, fill = n), color = "gray50") +
            scale_y_continuous(breaks = seq(0, 23, 3), trans = "reverse") +
            scale_fill_distiller(palette = "RdYlGn") +
            labs(title = paste(unique(x$from_name), "- kiedy publikowane są posty?"),
                 x = "Dzień tygodnia", y = "Godzina", fill = "Liczba postów") +
            theme(legend.position = "bottom")
      }
   )

Oczywiście, że tak. Belfer i Wataha to niedziele wieczorem, Diagnoza to wtorkowe wieczory. Ciekawostkę widać w postach Watahy - sporo postów zostało opublikowanych w poniedziałki. Te posty to live-chat z aktorami lub podgrzewanie atmosfery pytaniami jak Wam się podobało?:

fb_posts %>%
   filter(year(created_time) == 2017, from_name=="Wataha", created_weekday == "Pn") %>%
   select(created_time, type, message) %>%
   arrange(created_time) %>%
   kable() %>%
   kable_styling(bootstrap_options =c("striped", "hover", "condensed"), full_width = F)
Data postuTyp postuTreść postu
2017-08-07 18:00:00videoWataha powraca w #MagiczneBieszczady w zimowej odsłonie. 15 października tylko w HBO i online w HBO GO.
2017-08-21 17:00:00video#MagiczneBieszczady zimą są jeszcze bardziej tajemnicze i niedostępne. Będą wyzwaniem czy raczej sprzymierzeńcem dla ukrywającego się w nich Rebrowa? Wataha powraca 15 października, tylko w HBO i HBO GO.
2017-09-11 13:16:37videoBędziemy w śniegu po kolana, po pas, po szyję - obiecuje Leszek Lichota w nowym materiale z planu drugiego sezonu serialu Wataha. Zobacz przepiękne zimowe Bieszczady już 15 października w HBO i HBO GO.
2017-09-25 13:55:36photoTak pięknie napisali o drugim sezonie Watahy Kaja i Janusz z Jakbyniepaczec v 2.0. - bardzo nam miło, dziękujemy :-* I nie możemy doczekać się Waszej opinii, opinii naszych Widzów :) Premiera już za 3 tygodnie!
2017-09-25 18:30:01video“Oficjalnie różnica między Polską a Ukrainą to godzina. Tak naprawdę to 25 lat.” Poznajcie wrażenia ekipy serialu ze zdjęć za naszą wschodnią granicą. http://www.hbo.pl/wataha/
2017-10-02 11:18:54videoNajchętniej oglądany serial HBO powraca.
2017-10-02 18:00:00linkZnów nas chwalą :) Tym razem Antyweb bardzo wysoko ocenił nowy sezon Watahy - niezmiernie nam miło, bardzo dziękujemy! A na premierę sezonu zapraszamy już za 2 tygodnie :)
2017-10-09 10:04:20videoOdkodowany weekend w HBO! Zobacz premierę Watahy i wiele innych filmów i seriali.
2017-10-09 14:06:30videoWataha, sezon 2 - już za 6 dni w HBO i HBO GO.
2017-10-09 18:30:00link“Podczas zdjęć próbnych z Leszkiem porwałam mu koszulę, a on prawie złamał mi nogę” - czyli jak zaczęła się przygoda Anny Donchenko z serialem Wataha.
2017-10-16 14:42:27photoNA
2017-10-16 16:15:00photoBelfer + Wataha = <3 Dzięki za gratulacje CANAL+ Polska Trzymamy kciuki za premierę Belfra!
2017-10-16 20:02:19videoZapraszamy na Live Chat z Agą i Markowskim!
2017-10-23 15:57:32videoGrzywa żyje! Zobacz ciąg dalszy jego konfrontacji z Rebrowem. Bartłomiej Topa zaprasza na odc. 3 już teraz online w HBO GO. http://www.hbo.pl/wataha/
2017-10-23 16:22:11photoNA
2017-10-23 20:05:57videoDołączcie do Live Chatu z Łuczakiem, Świtalskim i reżyserką Kasią Adamik.
2017-10-30 10:00:00videoLeszek Lichota jeszcze na planie serialu powiedział “W drugim sezonie będzie na pewno więcej akcji, niż było w pierwszym”. Zgadzacie się? :)
2017-11-06 14:19:34photoTo już dziś! :)
2017-11-06 20:18:09videoAnita Jancia-Prokopowicz & Jan P. Matuszynski są z nami.
2017-11-13 14:13:11photoMamy pytanie do wszystkich, którzy widzieli już cały drugi sezon Watahy: jak wam się podobało? Co było największym zaskoczeniem, a co przewidzieliście już wcześniej? Jakie alternatywne zakończenia obstawialiście? Czekamy na wasze komentarze :) UWAGA: BĘDĄ SPOILERY!!! ;)
2017-11-13 20:09:03videoRebrow, Dobosz, Zięba i Boczarska już tu są!
2017-11-20 16:16:57photoA kto by nie chciał?<8a>

Swoją drogą - okrągłe godziny publikacji wskazują na planowanie postów ;) Na fanpage’u Dane i Analizy też planuję posty, ale godziny są losowe. A czy w komentarzach widać odzwierciedlenie terminu emisji?

fb_data %>%
   filter(year(post_created_time) == 2017) %>%
   mutate(day = date(comment_created_time)) %>%
   count(post_from_name, day) %>%
   ggplot() +
   geom_point(aes(day, n, color = post_from_name), alpha = 0.5, show.legend = FALSE) +
   geom_smooth(aes(day, n, color = post_from_name), se = FALSE) +
   scale_y_log10() +
   labs(title = "Liczba komentarzy publikowanych na fanpage seriali,\ndzień po dniu",
        x = "Data", y = "Liczba komentarzy (skala logarytmiczna)", color = "") +
   theme(legend.position = "bottom")

Widać :) Ciekawostką jest aktywność komentujących Watahę wiosną - czyżby zapowiedzi serialu? Jeśli przejrzymy dane to właśnie to widać:

fb_posts %>%
   filter(year(created_time) == 2017, from_name=="Wataha", month(created_time) >= 4, month(created_time) <= 7) %>%
   select(created_time, message) %>%
   arrange(created_time) %>%
   kable() %>%
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = F)
Data postuTreść postu
2017-04-15 18:00:00Wataha wraca jesienią. Zobacz pierwszy zwiastun!
2017-06-01 21:35:32Aleksandra Popławska i Leszek Lichota opowiedzą o nadchodzącym sezonie Watahy na Warsaw Comic Con. Możecie ich spotkać już w sobotę o 13.00. Będą niespodzianki ;)
2017-06-02 10:28:21W strefie HBO na Warsaw Comic Con znajdziecie serialowe auto Watahy :) A już jutro spotkanie z Aleksandrą Popławską i Leszkiem Lichotą!
2017-06-03 15:00:00Ucieczka nigdy się nie kończy. Wataha, sezon 2, jesień 2017. Tylko w HBO i HBO GO.
2017-06-04 11:25:26Z dzikich Bieszczad na Żelazny Tron! Aleksandra Popławska, Leszek Lichota oraz producenci serialu spotkali się wczoraj z fanami na Warsaw Comic Con.
2017-07-12 14:21:28Leszek Lichota (Wiktor Rebrow) zdradza kilka informacji o nowym sezonie Watahy!
2017-07-28 13:25:36Najchętniej oglądany serial HBO powraca. Wataha, sezon 2 - premiera 15 października tylko w HBO i online w HBO GO.

Sprawdźmy czy w czasie trwania sezonu zmieniała się aktywność (rozumiana jako liczba komentarzy na post) widzów?

fb_posts %>%
   filter(year(created_time) == 2017, month(created_time) >= 9) %>%
   mutate(day = date(created_time)) %>%
   group_by(from_name, day) %>%
   summarise(p = sum(comments_count)/n()) %>%
   ungroup() %>%
   ggplot() +
   geom_point(aes(day, p, color = from_name), alpha = 0.5, show.legend = FALSE) +
   geom_smooth(aes(day, p, color = from_name), se = FALSE) +
   labs(title = "Liczba komentarzy/post publikowanych na fanpage seriali,\ndzień po dniu",
        x = "Data", y = "Liczba komentarzy/post", color = "") +
   theme(legend.position = "bottom")

Nie widać znaczącej zmiany dla seriali TVNu i Canal+, ale Wataha zanotowała spory wzrost - czyżby zakończenie wywołało takie dyskusje?

fb_posts %>%
   filter(year(created_time) == 2017, month(created_time) >= 11, from_name == "Wataha") %>%
   mutate(day = date(created_time)) %>%
   group_by(day) %>%
   mutate(p = sum(comments_count)/n()) %>%
   ungroup() %>% 
   select(day, message, p) %>% 
   arrange(day) %>%
   # kolorowanie kolumny p
   mutate(p = cell_spec(p, "html", color = ifelse(p > 200, "red", "black"))) %>%
   kable() %>%
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = F)
Data postuTreść postuWskaźnik p
2017-11-01Kobieca twarz Watahy, Aleksandra Popławska opowiada o swojej roli w serialu i o tym, jak zmieniła się jej postać w stosunku do pierwszego sezonu.17
2017-11-05Sytuacja się zagęszcza, czy odcinek 5 przyniesie odpowiedzi na coraz więcej pojawiających się pytań?224
2017-11-06Anita Jancia-Prokopowicz & Jan P. Matuszynski są z nami.5
2017-11-06To już dziś! :)5
2017-11-08Takie BHP ;) Finałowy odcinek Watahy już w niedzielę w HBO GO! http://www.hbo.pl/wataha/164
2017-11-11NA54
2017-11-12Kto stoi za morderstwami w Bieszczadach? Zobacz już teraz finałowy odcinek Watahy! Cały sezon online w HBO GO.395.5
2017-11-12Dziś o 20:10 w HBO premiera 5 odcinka nowego sezonu Watahy, a niecierpliwi już teraz w HBO GO mogą oglądać cały sezon serialu. hbogo.pl/redirect/-93620395.5
2017-11-13Rebrow, Dobosz, Zięba i Boczarska już tu są!367.5
2017-11-13Mamy pytanie do wszystkich, którzy widzieli już cały drugi sezon Watahy: jak wam się podobało? Co było największym zaskoczeniem, a co przewidzieliście już wcześniej? Jakie alternatywne zakończenia obstawialiście? Czekamy na wasze komentarze :) UWAGA: BĘDĄ SPOILERY!!! ;)367.5
2017-11-19Finałowy odcinek Watahy już za chwilę w HBO, cały sezon dostępny w HBO GO.174
2017-11-20A kto by nie chciał?<8a>63
2017-11-22Złotousty Łuczak, będziecie za nim tęsknić? ;) Cały drugi sezon Watahy w HBO GO!296
2017-11-24NA31.5
2017-11-24Jeśli ktoś jeszcze nie widział 2 sezonu Watahy, ta recenzja Krzysztofa Połaskiego z Telemagazyn.pl będzie istotnym argumentem za obejrzeniem serialu :)31.5

Moje przypuszczenia wydają się być prawdziwe. Co ciekawe - po zakończeniu emisji HBO zaprzestało komunikacji z fanami (ostatni post jest z 24.11), zupełnie inaczej niż TVN i Canal+. Zobaczmy w którym dniu tygodnia i o jakiej godzinie pojawiają się komentarze - czy ma to związek z emisją? Czy popularne jest oglądanie serialu z jednoczesnym komentowaniem go na Facebooku?

fb_data %>%
   mutate(comment_created_hour = hour(comment_created_time),
          comment_created_weekday = wday(comment_created_time, label = TRUE) %>%
             factor(levels = c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"),
                    labels = c("Pn", "Wt", "Śr", "Cz", "Pt", "Sb", "Nd"))) %>%
   by(.$post_from_name,
      function(x) {
         x %>%
            count(comment_created_weekday, comment_created_hour) %>%
            ungroup() %>%
            ggplot() +
            geom_tile(aes(comment_created_weekday, comment_created_hour, fill = n), color = "gray50", show.legend = FALSE) +
            scale_fill_distiller(palette = "RdYlGn") +
            scale_y_reverse() +
            labs(title = paste(unique(x$post_from_name), "- kiedy pojawiają się komentarze?"),
                 x = "", y = "Godzina")
      }
   )

Sprawdza się idealnie, a w przypadku Watahy mamy dodatkowo sporą aktywność w poniedziałki (to już rozszyfrowaliśmy wyżej). Sprawdźmy jak szybko pojawiaja sie komentarze?

fb_data %>%
   mutate(delta_time = as.numeric(comment_created_time - post_created_time)/3600) %>%
   filter(delta_time > 0) %>%
   ggplot() +
   geom_density(aes(delta_time, fill = post_from_name), alpha = 0.5) +
   scale_x_continuous(breaks = c(1/60, 5/60, 1/4, 1/2, 1, 2, 3, 6, 12, 24, 2*24, 5*24, 10*24, 30*24),
                      labels = c("1m", "5m", "15m", "30m", "1h", "2h", "3h", "6h", "12h", "1d", "2d", "5d", "10d", "30d"),
                      trans = "log10") +
   labs(title = "Czas jaki mija od publikacji posta do publikacji komentarza",
        x = "", y = "Gestość prawdopodobieństwa", fill = "Fanpage") +
   theme(legend.position = "bottom")

Największy pik jest dla wszystkich seriali w okolicach 6-12 godzin od publikacji postu. Czyżby dyskusje od rana, następnego dnia po emisji? Ciekawe są komcie w Belfrze zostawione po miesiącu od emisji - zobaczmy te posty, dla których średnia czasu reakcji użytkowników była największa:

fb_data %>%
   mutate(delta_time = as.numeric(comment_created_time - post_created_time)/3600) %>%
   filter(post_from_name == "Belfer") %>%
   group_by(post_id, post_created_time) %>%
   summarize(m_delta_time = round(mean(delta_time)/24)) %>%
   ungroup() %>%
   top_n(10, m_delta_time) %>%
   left_join(fb_posts %>% select(id, message), by = c("post_id"="id")) %>%
   select(-post_id) %>%
   arrange(desc(m_delta_time)) %>%
   kable() %>%
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = F)
Data postuŚrednia liczba godzin od publikacji postu do publikacji komentarzaTreść postu
2016-03-12 04:09:03188Odliczamy! https://www.youtube.com/watch?v=QJBo2ZAtWBA
2016-03-12 04:10:51187NA
2016-03-12 04:16:11180NA
2016-07-29 20:00:0062Czy wiesz, że: • aktorzy do ostatniego odcinka nie wiedzieli, kto popełnił morderstwo • serial prawie w całości nakręcony jest ze steadicamu (system stabilizacji kamery, mechanicznie izolujący ruch kamery od operatora. Pozwala uzyskać bardzo płynne ujęcia, nawet, gdy operator porusza się szybko po nierównym podłożu) • zdjęcia trwały blisko 100 dni i kręcone były równolegle przez dwie ekipy, m.in. w Chełmnie, Chełmży, Kwidzynie i Warszawie
2016-07-30 15:11:2049Przed Wami drugi teaser!
2017-03-20 11:30:0129Kilka zdjęć ze spotkania twórców z fanami serialu, przy okazji premiery “Belfra” na DVD. http://kulturalnipl.bloog.pl/id,359962785,title,Belfer-spotkanie-z-tworcami-filmu,index.html?smoybbtticaid=618d21
2016-09-02 20:17:4319Czy wiesz, że: • serial składa się z 10 odcinków, z których każdy trwa ok. 55 minut • CANAL+ rozpoczął już prace nad drugim sezonem serialu „Belfer”. Scenariusz piszą Monika Powalisz, Jakub Żulczyk i Bartek Ignaciuk, pod kierunkiem Wojciecha Bockenheima
2016-10-30 23:31:4715Kto według Ciebie zabił Asię?
2016-11-09 16:55:3613“- Co było dla pana najtrudniejsze w pracy nad „Belfrem”? * Tajemnica. Sam sobie tę pętlę założyłem na szyję. Przez cały okres zdjęciowy musiałem oszukiwać obsadę aktorską. Oszukać w taki sposób, żeby aktorzy dali mi to, czego od nich potrzebuję, ale nie domyślali się, co mi dają." http://www.wirtualnemedia.pl/artykul/lukasz-palkowski-niepewnosc-i-napiecie-na-planie-belfra-dobrze-wplynely-na-jakosc-serialu-wywiad
2017-02-21 18:37:1211Zapraszamy do śledzenia naszego profilu na Insta! :) https://www.instagram.com/belfer.serial/

Post, który żył najdłużej

fb_data %>%
   mutate(delta_time = as.numeric(comment_created_time - post_created_time)/3600) %>%
   filter(post_from_name == "Belfer") %>%
   group_by(post_id, post_created_time) %>%
   summarize(m_delta_time = mean(delta_time)) %>%
   ungroup() %>%
   top_n(1, m_delta_time) %>%
   select(post_id) %>%
   left_join(fb_data, by = "post_id") %>%
   select(post_created_time, comment_created_time, comment_message) %>%
   kable() %>%
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = F)
Data postuData komentarzaTreść komentarza
2016-03-12 04:09:032016-06-29 15:22:09Coś więcej o obsadzie? Koo zagra Magdalena Cielecka? :)
2016-03-12 04:09:032016-12-02 22:11:53The 1st post of The Belfer xd

…został pewnie gdzieś odkopany. Ma tylko dwa komentarze - jeden ponad 3 miesiące po publikacji, drugi - prawie 9 miesięcy. Stąd wysoka średnia. Przeanalizujmy treść - rozkład czasów jest ciekawy, ale dość przewidywalny:

  • posty pojawiają się wtedy, kiedy odcinek jest w telewizorze
  • ludzie reagują online na wydarzenia odcinków
  • często też dyskutują następnego dnia po emisji, od rana
# słowniki
pl_stop_words <- read_lines("../!polimorfologik/polish_stopwords.txt")

# to smieci
pl_stop_words <- c(pl_stop_words,
                   "canal", "http", "https", "www.hbo.pl", "hbo", "diagnoza.tvn.pl", "html", "youtu.be", "bit.ly", "www.wirtualnemedia.pl", "magicznebieszczady")

# słowa które powtarzają się bardzo często w komentarzach, a niewiele wnoszą
seriale_slownik <- c("czekam", "doczekać", "serial", "odcinek", "mogę", "sezon", "już", "się", "pozdrawiam",
                     "czekamy", "super", "sie", "serialem", "serialu", "premiera", "juz", "odcinka", "oglądam",
                     "odcinki", "sezonu", "sezonie", "najlepszy", "gratulacje", "obejrzeć", "obejrzec", "niecierpliwością",
                     "odcinków", "oglądać", "odcinku", "czekać", "serii", "seria", "seriali", "the", "best")

Podzielmy posty na poszczególne słowa:

fb_posts_messages <- fb_posts %>%
   select(from_name, message) %>%
   unnest_tokens(word, message, token = "words", drop = FALSE) %>%
   select(-message) %>%
   filter(!is.na(word)) %>%
   filter(!word %in% pl_stop_words) %>%
   filter(is.na(as.numeric(word))) %>%
   filter(nchar(word) > 2)

i sprawdźmy jakie były najpopularniejsze na każdym z fanpage’y:

fb_posts_messages %>%
   count(from_name, word) %>%
   ungroup() %>%
   group_by(from_name) %>%
   top_n(20, n) %>%
   ungroup() %>%
   arrange(desc(word)) %>%
   mutate(word = fct_inorder(word)) %>%
   ggplot() +
   geom_tile(aes(from_name, word, fill = n), color = "gray50", show.legend = FALSE) +
   scale_fill_distiller(palette = "RdYlGn") +
   labs(title = "Najpopularniejsze słowa w postach",
        x = "", y = "")

Tutaj nie ma zaskoczenia - każdy z seriali ma swoje unikatowe słowa (głównie związane z imionami bohaterów lub aktorami grającymi w serialu). Wataha i Belfer zapraszają na premierę nowego odcinka serialu w drugim sezonie, Diagnoza zachęca do komentowania pytając o wrażenia. Kolory są wynikiem sumowania liczby wystąpień poszczególnych słów, lepszy obraz dałoby liczenie wartości względnych (na przykład dzieląc liczbę wystąpień słowa przez liczbę wszystkich postów). Zróbmy to samo z komentarzami. Rozbijamy je na pojedyncze słowa:

fb_comments_messages <- fb_comments %>%
   select(post_from_name, post_id, comment_message) %>%
   unnest_tokens(word, comment_message, token = "words", drop = FALSE) %>%
   select(-comment_message) %>%
   filter(!is.na(word)) %>%
   filter(!word %in% pl_stop_words) %>%
   filter(is.na(as.numeric(word))) %>%
   filter(nchar(word) > 2) %>%
   filter(!word %in% seriale_slownik)

i sprawdzamy, które są najpopularniejsze:

fb_comments_messages %>%
   count(post_from_name, word) %>%
   ungroup() %>%
   group_by(post_from_name) %>%
   top_n(20, n) %>%
   ungroup() %>%
   arrange(desc(word)) %>%
   mutate(word = fct_inorder(word)) %>%
   ggplot() +
   geom_tile(aes(post_from_name, word, fill = n), color = "gray50") +
   scale_fill_distiller(palette = "RdYlGn") +
   labs(title = "Najpopularniejsze słowa w komentarzach",
        x = "", y = "")

Mamy żal, że to koniec (szkoda), pochwałę serialu lub odcinka (świetny, mega) i oczekiwanie na kolejny. Plus standardowy zestaw związany z treścią. Przeanalizujmy te same dane w nieco innym ujęciu. Przygotujemy dla każdego słowa wskaźnik mówiący jak bardzo dane słowo jest popularne w komentarzach. Niech będzie to średnia wartość z iloczynu popularności słowa (jak często wystąpiło we wszystkich komentarzach na fanpage’u) i popularności przy danym poście. Tym razem rozdzielmy to dodatkowo na poszczególne seriale:

fb_comments_messages %>%
   # ile różnych słóW występuje przy komentarzach do konkretnego posta?
   group_by(post_id) %>%
   mutate(n_words_in_posts = n()) %>%
   ungroup() %>%
   # ile jest różnych słów w komciach dla danej strony?
   group_by(post_from_name, word) %>%
   mutate(n_times_word = n()) %>%
   ungroup() %>%
   # p = popularność słowa na stronie / ile słów przy komciu
   mutate(p = n_times_word/n_words_in_posts) %>%
   # średnia wartość p dla strony i słowa
   group_by(post_from_name, word) %>%
   summarise(p = mean(p)) %>%
   ungroup() %>%
   by(.$post_from_name,
      function(x) {
         x %>%
            top_n(20, p) %>%
            arrange(p) %>%
            mutate(word = fct_inorder(word)) %>%
            ggplot() +
            geom_col(aes(word, p), fill = "lightgreen", color = "gray50") +
            coord_flip() +
            labs(title = paste(unique(x$post_from_name), "- najpopularniejsze słowa w komentarzach"),
                 x = "", y = "")
      }
   )

Widać, że głównie grają tutaj słowa związane z treścią. W Belfrze& widzom brakowało w drugim sezonie Kusia (postać z pierwszego sezonu), porównywany jest sezon pierwszy z drugim. Bigramy (pary słów występujące obok siebie) dadzą lepszy obraz. Podzielmy więc komentarze na bigramy:

fb_comments_messages_bigrams <- fb_comments %>%
   select(post_from_name, comment_message) %>%
   unnest_tokens(word, comment_message, token = "ngrams", n = 2, drop = FALSE) %>%
   select(-comment_message) %>%
   separate(word, c("word1", "word2"), sep = " ") %>%
   filter(!word1 %in% pl_stop_words) %>%
   filter(!word1 %in% seriale_slownik) %>%
   filter(is.na(as.numeric(word1))) %>%
   filter(nchar(word1) > 2) %>%
   filter(!word2 %in% pl_stop_words) %>%
   filter(!word2 %in% seriale_slownik) %>%
   filter(is.na(as.numeric(word2))) %>%
   filter(nchar(word2) > 2) %>%
   mutate(word = paste(word1, word2, sep = " ")) %>%
   select(-word1, -word2)

Najpopularniejsze bigramy w komentarzach dla wszystkich seriali razem to:

fb_comments_messages_bigrams %>%
   count(post_from_name, word) %>%
   ungroup() %>%
   top_n(40, n) %>%
   arrange(n) %>%
   mutate(word = fct_inorder(word)) %>%
   ggplot() +
   geom_tile(aes(post_from_name, word, fill = n), color = "gray50") +
   scale_fill_distiller(palette = "RdYlGn") +
   labs(title = "Najpopularniejsze bigramy w komentarzach", x = "", y = "")

Oczywiście aktorzy i bohaterowie, pochwała gry aktorskiej. Najpopularniejsze bigramy w komentarzach w podziale na seriale:

fb_comments_messages_bigrams %>%
   count(post_from_name, word) %>%
   ungroup() %>%
   by(.$post_from_name,
      function(x) {
         x %>%
            top_n(40, n) %>%
            arrange(n) %>%
            mutate(word = fct_inorder(word)) %>%
            ggplot() +
            geom_col(aes(word, n), fill = "lightgreen", color = "gray50") +
            coord_flip() +
            labs(title = paste(unique(x$post_from_name), "- najpopularniejsze bigramy w komentarzach"), x = "", y = "")
      }
   )

Belfer: najpopularniejszy jest Partyk Pniewski (aktor grający w serialu). Widzowie widzą nawiązania do Twin Peaks (ale to chyba raczej w pierwszym sezonie niż w drugim). Narzekają na zbyt oczywiste słabe zakończenie (czy scenarzyści trzeciego sezonu to czytają?). Pojawia się Sebastian Fabijański (który w pierwszym sezonie grał Adriana Kusia). Z jednej strony to dobra robota, a z drugiej - szkoda czasu. Diagnoza: tutaj gwiazdą jest grająca główną bohaterkę Maja Ostaszewska. Nie wiem dlaczego pojawia się tytuł innego serialu TVN - Druga szansa (sprawdziłem, Ostaszewska gra tam), ale po zerknięciu w treść komentarzy widać obawy, aby Diagnoza nie okazała się tak nudna jak Druga szansa (albo wręcz przeciwnie - żeby właśnie taka była, bo to mój ulubiony serial). W komentarzach widać sugestie, że to Artman popełnił błąd lekarski i wrobił Annę Leśniewską. Co ciekawe - nie pojawia się w pierwszej 40 Maciej Zakościelny. Wataha: tutaj głównie zachwyty nad grą aktorską. Niesamowite na swój sposób. Które określenia występują przy wszystkich serialach?

fb_comments_messages_bigrams %>%
   count(post_from_name, word) %>%
   ungroup() %>%
   spread(post_from_name, n) %>%
   na.omit() %>%
   mutate(s = Belfer + `Diagnoza TVN` + Wataha) %>%
   top_n(30, s) %>%
   arrange(s) %>%
   mutate(word = fct_inorder(word)) %>%
   select(-s) %>%
   gather(key, val, -word) %>%
   ggplot() +
   geom_tile(aes(key, word, fill = val), color = "gray50") +
   scale_fill_distiller(palette = "RdYlGn") +
   labs(title = "Najpopularniejsze bigramy w komentarzach\nwystępujace na wszystkich stronach", x = "", y = "")

Na koniec zobaczmy czy są osoby komentujące wszystkie trzy seriale:

fb_data %>%
   count(post_from_name, comments_from_name, sort = TRUE) %>%
   ungroup() %>%
   spread(post_from_name, n) %>%
   rowwise() %>%
   mutate(comm_sum = sum(Belfer, `Diagnoza TVN`, Wataha)) %>%
   ungroup() %>%
   filter(!is.na(comm_sum)) %>%
   arrange(comm_sum) %>%
   mutate(comments_from_name = fct_inorder(comments_from_name)) %>%
   select(-comm_sum) %>%
   gather(serial, val, -comments_from_name) %>%
   ggplot() +
   geom_tile(aes(serial, comments_from_name, fill = val), color = "gray50", show.legend = FALSE) +
   scale_fill_distiller(palette = "RdYlGn") +
   labs(title = "Komentujący wszystkie seriale", x = "", y = "")

Oczywiście że tak. Lista ułożona jest od największej sumy napisanych komentarzy - pani Agnieszka Aga napisała ich łącznie najwięcej, widać że wolała dyskusję związane z Diagnozą. Lucy Raźniak wybrała Belfra.

Jakie z tego wszystkiego płyną wnioski?

  • Stacje telewizyjne starają się prowokować dyskusje podczas emisji kolejnych odcinków seriali. To już naturalne, że oglądamy telewizję z komórką w ręku i na bieżąco komentujemy to co widać na ekranie (ciekawe byłoby dodanie do danych z Facebooka danych z Twittera)
  • Posty publikowane są głównie w chwili emisji serialu, ale też (robiło to HBO) jakiś czas po - takie podsumowanie odcinków, rozmowy z aktorami, zachęty (trailer, teaser) kolejnego odcinka
  • W trakcie sezonu zaangażowanie użytkowników (liczba komentarzy do postów) jest mniej więcej stałe
  • W dwóch przypadkach mamy prowadzenie fanpage po zakończeniu emisji (nie wiem dlaczego HBO tego nie robi z Watahą) - czyżby podprowadzenie pod kolejny sezon? Wiadomo już, że na wiosnę wróci Diagnoza, nie bardzo wiadomo co będzie z Belfrem
  • Posty żyją do 12 godzin od publikacji. Kiedy emisja jest wieczorem rozmowy w komentarzach trwają jeszcze rano kolejnego dnia
  • Treść postów jak i komentarzy jest skupiona głównie na bohaterach i aktorach odgrywających role w serialu. Co ciekawe - mało jest słów krytycznych, przeważają pochlebne słowa. A pewnie jest tak, że jak się komuś nie podoba serial to nie udziela się po prostu w dyskusji? Co innego mogłoby wystąpić w przypadku fanpage serwisów informacyjnych lub partii politycznych
  • Jeśli miałbym pisać serial kręcony z tygodnia na tydzień - bardzo dokładnie analizowałbym opinie pojawiające się w social mediach. Szczególnie w przypadku seriali z zagadką - z komentarzy można dowiedzieć się o tropach jakimi podążają widzowie i… je odpowiednio mylić ;-)
  • Oczywiście są osoby, które oglądają i komentują wszystkie seriale
  • Mając informacje o tym kto komentuje można zbudować profil widza, ale to już temat na oddzielną zabawę.