С момента своего создания в 2012 году сериал CW «Стрела» стал одним из самых популярных и революционных телесериалов в мире. «Стрела» запустила вселенную DC CW, получившую название Arrowverse, которая разделяет историю с «Флэшем», «Супергёрл», «Легендами завтрашнего дня», «Бэтвумен» и «Виксен».

Сериал, основанный на одном из самых популярных персонажей комиксов DC, произвел революцию в современных телевизионных сериалах о супергероях благодаря своей верности исходным материалам, обоснованным последовательностям действий, смешанным временным рамкам, сочетанию нео-нуара с фантастикой о супергероях и черпая вдохновение из книги Кристофера Нолана «The The New York Times». Трилогия Темного рыцаря. «Стрела» сделала главного актера Стивена Амелла одним из самых высокооплачиваемых и популярных актеров на телевидении.

Теперь пришло время использовать подход Data Science в шоу, чтобы узнать, насколько он хорош и что люди говорят о нем.

Отказ от ответственности. Используемые здесь сценарии R могут быть расширены для некоторых читателей. Вы должны знать основы R. Вы можете иметь представление об API Twitter, чтобы понимать его и работать с ним.

Примечания для читателей, не имеющих знаний в области программирования. Пожалуйста, не стесняйтесь игнорировать R-скрипты и другие аспекты программирования. Графики с описаниями и отчетами для всех.

Ресурсы

R советы

  • Если возможно, используйте Microsoft R Open. Он поставляется с многопоточной математической библиотекой (MKL) и пакетом checkpoint.
  • Но не стесняйтесь переключаться на обычный R, если у вас возникнут проблемы. Microsoft R Open может иметь некоторые странные проблемы в мой личный опыт. Не тратьте слишком много времени на их исправление. Переключение на обычный R часто решает проблему.
  • Установить обычный R через CRAN (Инструкция для Ubuntu). Установите контрольную точку для обеспечения воспроизводимости (это не эксклюзив Microsoft R Open).
  • Используйте RStudio и эффективно используйте его окно Console. Некоторые люди сильно настроены против R из-за некоторой его уникальности по сравнению с другими основными языками программирования. Многие недоразумения можно решить с помощью простых запросов в Консоли. Не уверены, начинается ли индекс вектора с нуля или с единицы? c(1,2,3)[1] говорит вам, что это один. Запрос 1:10 говорит вам, что результат включает 10 (в отличие от Python).

Язвы на тухлых помидорах

Rotten Tomatoes — один из самых популярных веб-сайтов с обзорами кино и телевидения. «Стрела» недавно завершила восьмой сезон, который стал последним. Для каждого сезона у Rotten Tomatoes есть томатометр (средняя оценка критиков) и оценка аудитории «Стрела». Все это общедоступно и легкодоступно.

library(plotly)
Rotten_Tomatoes_Performence <- c("Tomatometer", "Audience Score")
Season_1 <- c(85, 87)
Season_2 <- c(95, 91)
Season_3 <- c(89, 72)
Season_4 <- c(85, 43)
Season_5 <- c(88, 73)
Season_6 <- c(64, 55)
Season_7 <- c(88, 65)
Season_8 <- c(91, 85)
data <- data.frame(Rotten_Tomatoes_Performence, Season_1, Season_2, Season_3, Season_4, Season_5, Season_6, Season_7, Season_8)
fig <- plot_ly(data, x = ~Rotten_Tomatoes_Performence, y = ~Season_1, type = 'bar', name = 'Season 1')
fig <- fig %>% add_trace(y = ~Season_2, name = 'Season 2')
fig <- fig %>% add_trace(y = ~Season_3, name = 'Season 3')
fig <- fig %>% add_trace(y = ~Season_4, name = 'Season 4')
fig <- fig %>% add_trace(y = ~Season_5, name = 'Season 5')
fig <- fig %>% add_trace(y = ~Season_6, name = 'Season 6')
fig <- fig %>% add_trace(y = ~Season_7, name = 'Season 7')
fig <- fig %>% add_trace(y = ~Season_8, name = 'Season 8')
fig <- fig %>% layout(yaxis = list(title = 'Scores'), barmode = 'group')
fig <- fig %>% layout(title = "Arrow on Rotten Tomatoes")
fig

Сериал был очень популярен среди критиков, но мы видим, что 6-й сезон имеет низкий рейтинг, но оценки улучшились по мере продолжения 7-го сезона. С другой стороны, мы видим, что зрители дали 4 сезону низкую оценку, но с тех пор оценки зрителей также улучшились.

количество просмотров

Создадим график и сравним среднюю посещаемость для каждого сезона. Данные были получены из нескольких источников за 2012–2020 годы для каждого сезона.

library(plotly)
Season <- c(1, 2, 3, 4, 5, 6, 7, 8)
AVG_Viewers_in_millions <- c(3.68, 3.28, 3.52, 2.90, 2.21, 1.76, 1.58, 1.52)
data <- data.frame(Season, AVG_Viewers_in_millions)
fig <- plot_ly(data, x = Season , y = AVG_Viewers_in_millions, type = 'scatter', mode = 'lines')
fig <- fig %>% layout(title = "Average Viewers for Each Season of Arrow", xaxis = list(title = 'Seasons'), yaxis = list (title = 'AVG Viewer(Millions)'))
fig

Средняя аудитория резко упала по мере продвижения сериала. Тем не менее, один важный фактор, на который следует обратить внимание, заключается в том, что после окончания каждого сезона он становился доступным на Netflix. Возможно, зрители предпочли бы дождаться, когда сезон станет доступен на Netflix, вместо того, чтобы смотреть его в прямом эфире на CW.

Рейтинги по демографии

IMDb — это онлайн-база данных, содержащая информацию о фильмах, телесериалах, домашнем видео, видеоиграх и потоковом онлайн-контенте. Он также включает актерский состав, съемочную группу, личные биографии, краткое изложение сюжета, мелочи, рейтинги, а также отзывы фанатов и критические отзывы.

Демографические данные (возрастная группа и пол) избирателей на IMDb для определенного шоу или фильма всегда общедоступны.

library(plotly)
# Ratings of Arrow by Sex
age_group <- c("<18", "18-29", "30-44", "45+")
male_rating <- c(7.6, 7.7, 7.4, 7.2)
female_rating <- c(7.8, 7.8, 7.5, 7.6)
data <- data.frame(age_group, male_rating, female_rating)
fig <- plot_ly(data, x = ~age_group, y = ~male_rating, type = 'bar', name = 'Males Rating')
fig <- fig %>% add_trace(y = ~female_rating, name = 'Female Rating')
fig <- fig %>% layout(yaxis = list(title = 'Score (1-10)'), barmode = 'group')
fig <- fig %>% layout(title = "Rating of Arrow on IMDb")
fig
#Votings of Arrrow by Sex
age_group <- c("<18", "18-29", "30-44", "45+")
male_votes <- c(345, 90036, 85361, 19341)
female_votes <- c(93, 23507, 23471, 6655)
data <- data.frame(age_group, male_votes, female_votes)
fig <- plot_ly(data, x = ~age_group, y = ~male_votes, type = 'bar', name = 'Males Rating')
fig <- fig %>% add_trace(y = ~female_votes, name = 'Female Rating')
fig <- fig %>% layout(yaxis = list(title = 'Votes'), barmode = 'group')
fig <- fig %>% layout(title = "IMDb Votes for Arrow")
fig

Что люди говорят в Твиттере?

Теперь мы получаем данные самостоятельно. Мы проанализируем твиты о Стреле CW. Мы проанализируем последние 10 000 публичных твитов с хэштегом #Arrow.

Облако слов и частота

Получение данных и распространение твитов

Прежде всего, следуйте инструкциям из этой статьи, чтобы получить собственный ключ API и токен доступа, и установите пакет twitteR:



Вам нужны эти четыре переменные:

consumer_key <- "FILL HERE"
consumer_secret <- "FILL HERE"
access_token <- "FILL HERE"
access_secret <- "FILL HERE"

Основной точкой доступа для этого поста является searchTwitter. Он будет искать 10 000 последних общедоступных твитов на английском языке с помощью «#Arrow».

setup_twitter_oauth(consumer_key, consumer_secret, access_token, access_secret)
cw.tweets<- searchTwitter("#arrow",n=10000,lang="en")
tweet=cw.tweets[[1]]
tweet$getScreenName()
tweet$getText()
cw.text=laply(cw.tweets,function(t)t$getText())
length(cw.text)
#performing data cleaning and store in csv.file
cw.text = gsub("(RT|via)((?:\\b\\W*@\\w+)+)", "", cw.text)
cw.text = gsub("@\\w+", "", cw.text)
cw.text = gsub("[[:punct:]]", "", cw.text)
cw.text = gsub("[[:digit:]]", "", cw.text)
cw.text = gsub("http\\w+", "", cw.text)
cw.text = gsub("[ \t]{2,}", "", cw.text)
cw.text = gsub("^\\s+|\\s+$", "", cw.text)
cw.text <- str_replace_all(cw.text," "," ")
cw.text <- str_replace_all(cw.text,"#[a-z,A-Z]*","")
cw.text <- str_replace_all(cw.text,"@[a-z,A-Z]*","")  
cw.text <- tolower(cw.text)
write(cw.text, "arrow.csv",ncolumn=1)

Теперь у нас есть CSV-файл со всеми очищенными твитами Arrow. Теперь создадим из него облако слов.

# Load
library("tm")
library("SnowballC")
library("wordcloud")
library("RColorBrewer")
text <- readLines(file.choose()) # This let us choose the file of tweets. Remember, we created a file of all tweets and named the file arrow.csv
# Load the data as a corpus
docs <- Corpus(VectorSource(text))
inspect(docs)
toSpace <- content_transformer(function (x , pattern ) gsub(pattern, " ", x))
docs <- tm_map(docs, toSpace, "/")
docs <- tm_map(docs, toSpace, "@")
docs <- tm_map(docs, toSpace, "\\|")
# Convert the text to lower case
docs <- tm_map(docs, content_transformer(tolower))
# Remove numbers
docs <- tm_map(docs, removeNumbers)
# Remove english common stopwords
docs <- tm_map(docs, removeWords, stopwords("english"))
# Remove your own stop word
# specify your stopwords as a character vector
docs <- tm_map(docs, removeWords, c("blabla1", "blabla2")) 
# Remove punctuations
docs <- tm_map(docs, removePunctuation)
# Eliminate extra white spaces
docs <- tm_map(docs, stripWhitespace)
# Text stemming
# docs <- tm_map(docs, stemDocument)
dtm <- TermDocumentMatrix(docs)
m <- as.matrix(dtm)
v <- sort(rowSums(m),decreasing=TRUE)
d <- data.frame(word = names(v),freq=v)
set.seed(1234)
wordcloud(words = d$word, freq = d$freq, min.freq = 1,
          max.words=300, random.order=FALSE, rot.per=0.35, 
          colors=brewer.pal(8, "Dark2"))

Мы можем заметить, что имя Стивена Амелла часто появляется в твитах, как и слово «Олисити», романтического партнера Оливера. Мы также можем видеть, что появляется недавний кроссовер Arrowverse, Crisis on Infinite Earths.

Теперь мы можем пойти немного дальше. Мы можем посмотреть на частоту слов, чтобы узнать, какие слова встречаются чаще всего.

par(mar = c(9, 5, 5, 5)) # Set the margin on all sides
barplot(d[1:30,]$freq, las = 2, names.arg = d[1:30,]$word,
        col ="green", main ="Most frequent words in Tweets about Arrow",
        ylab = "Word frequencies")

Анализ настроений

Теперь мы можем пойти дальше. У нас 10 000 твитов. У нас есть облако слов и частоты слов. Мы можем сделать более точные выводы, если проведем анализ настроений.

#perform sentimental analysis 
sentiment <- get_nrc_sentiment(cw.text)
cw.text <- cbind(cw.text, sentiment)
#use the graphic to present the findings
#set up y = count
Totals<- data.frame(colSums(cw.text[,c(11:10)]))
names(Totals) <- "score"
#set up x = sentiment
Totals <- cbind("sentiment" = rownames(Totals), Totals)
rownames(Totals) <- NULL
ggplot(Totals, aes(x = sentiment, y = score)) +
  geom_bar(aes(fill = sentiment), stat = "identity", position = "dodge", width = 1) +
  xlab("Sentiment") + ylab("Sentiment Scores") + ggtitle("Arrow's Sentiment Scores for All Tweets")

Теперь можно утверждать, что большинству зрителей нравится «Стрела».

Анализ сети персонажей

Может ли наш подход пойти дальше? Можем ли мы визуализировать что-то еще? Ответ положительный. Мы определенно можем сделать что-то действительно интересное, визуализируя отношения между главными героями шоу.

Сетевой анализ — это набор методов, используемых для визуализации сетей и описания конкретных характеристик общей сетевой структуры. Здесь мы проанализируем сеть персонажей в Стреле.

Мы определим отношения между каждым из главных героев шоу. Например, Оливер и Фелисити женаты. Диггл — друг Оливера и Фелисити. Оливер и Рой — лучники, борющиеся с преступностью в качестве дружинников, но Рой также встречается с сестрой Оливера Теей. Следовательно, есть сеть. По мере того, как мы добавляем больше персонажей и больше отношений, мы получаем все более и более сложную сеть.

library(igraph)
library(readr)
characters <- data.frame(character = c("Oliver", "Laurel", "Diggle", "Felicity", "Thea", "Roy", "Quentin", "Sara", "Rene", "Dinah", "Lyla"),
                         sex = c("male", "female", "male", "female", "female", "male", "male", "female", "male", "female", "female"))
relations <- data.frame(character_1 = c("Oliver", "Laurel", "Diggle", "Felicity", "Thea", "Roy", "Quentin", "Oliver", "Laurel", "Sara", "Rene", "Lyla", "Dinah", "Laurel", "Roy", "Rene", "Felicity", "Diggle", "Dinah"), 
                        character_2 = c("Laurel", "Quentin", "Oliver", "Oliver", "Roy", "Diggle", "Oliver", "Thea", "Sara", "Quentin", "Dinah", "Diggle", "Oliver", "Dinah", "Oliver", "Oliver", "Thea", "Rene", "Diggle"), 
      relationship = c("Friends", "Father-Daughter", "Friends", "Couple", "Couple", "Friends", "Friends", "Siblings", "Siblings", "Father-Daughter", "Friends", "Couple", "Friends", "Canaries", "Archers", "Friends", "Sisters-In-Law", "Friends", "Friends"))
characterNetwork <- graph_from_data_frame(d=relations, vertices=characters, directed=F)
plot(characterNetwork)
E(characterNetwork)$color <- ifelse(E(characterNetwork)$relationship == "Couple", "red", 
                             ifelse(E(characterNetwork)$relationship == "Friends", "purple",
                             ifelse(E(characterNetwork)$relationship == "Siblings", "orange", 
                             ifelse(E(characterNetwork)$relationship == "Father-Daughter", "yellow", "black"))))
V(characterNetwork)$color <- ifelse(V(characterNetwork)$sex == "male", "lightblue", "pink")
plot(characterNetwork)
legend("topleft", c("Male","Female"), pch=21,
       col="#777777", pt.bg=c("lightblue","pink"), pt.cex=2, cex=.8)
legend("bottomright", c("Couple","Friends", "Siblings", "Father-Daughter"), 
       col=c("red","purple","orange","yellow"), lty=1, cex=.8)

Хотя в этом исследовании рассматривается один хэштег в Твиттере (#Arrow) и анализируется его, мы можем провести более глубокий анализ. Мы можем использовать другие хэштеги Twitter, такие как #CWArrow, #CWOliverQueen, #CWGreenArrow и другие, используя тот же код R с небольшими изменениями. Мы можем собрать все это вместе, чтобы сделать более точные выводы.

Мы можем добавить больше символов и отношений в наш сетевой анализ и сделать более сложную сеть. Мы можем добавить злодеев, персонажей кроссовера, гостевых персонажей и многое другое.

Мы также можем анализировать отзывы критиков о Rotten Tomatoes с помощью Text Mining. Есть много способов применить подход науки о данных к шоу, фильму или спортивному событию.

Конец

«Стрела» — потрясающее шоу за последние восемь лет. Очень грустно, что серия недавно закончилась, но закончилась на высокой ноте, внося свой вклад в кроссовер Кризис на Бесконечных Землях. Поклонники очень взволнованы продолжением сериала «Зеленая стрела и Канарские острова», в котором основное внимание уделяется новой Зеленой стреле и Канарским островам (Лорел Лэнс и Дина Дрейк). Тем временем Стивен Амелл продолжит свою актерскую карьеру в драматическом сериале о борьбе под названием «Каблуки».



Спин-офф «Стрелы Зеленая стрела и Канарейки все еще может выйти на CW
Зеленая стрела и Канарейки, женский спин-офф Стрелы, все еще имеет шансы выйти на канале CW. на…screenrant.com»





Стивен Амелл из «Стрелы возглавит 8-серийную драму о борьбе на каблуках на Starz
Стивен Амелл нацелился на свое первое пост-концерт — и это прямо в яблочко его рулевой рубки . У актера…tvline.com»