Todo mundo é viciado em música pop, ou conhece alguém, ou tem uma prima/o ou tia/o que é! Seja você fã ou apenas um curioso, já se perguntou quem é a maior diva pop de todos os tempos? Muitos diriam que a resposta é simples e pode ser encontrada nas listas divulgadas pelas rádios ou revistas de música, mas dai nos questionamos, e como esses rankings são montados? e de onde vem esses dados?
Analisando os últimos lançamento do mundo pop, fiquei curioso para tentar encontrar uma boa resposta para essa pergunta, e para isso decidi analisar os dados da maior plataforma de vídeos da internet, o YouTube. A ideia é coletar os dados dos canais dessas artistas e comparar os resultados com alguns desses rankings divulgados pelas rádios e revistas. Mas calma, e como saber quem são as artistas mais badaladas do mundo? Escolhi a listas da Billboard: Top Artists Female e da Forbes: Highest-Paid Women in Music, dos últimos três anos para embasar minha pesquisa. Analisei quem são as divas que aparece nas duas listas e montei um conjunto com as 21 divas pop que estiveram presentes nesses rankings.
Desde 2014 a Billboard lança um ranking anual das Top Artists Female, que resume as divas pop do determinado ano. A classificação deles é montada a partir da audiência que os artistas coletados pela Nielsen Music ( para saber mais sobre eles clique aqui ) e dados dos streaming de música on-line. Já a Forbes, lança anualmente um ranking das artistas mais bem pagas. (Its about money!) O papo agora é se a fortuna das divas refletem sua popularidade no YouTube.
Mesmo sendo um little monster fiel, tenho que ser um analista imparcial e procurar a melhor forma de descobrir qual a maior diva pop de todos os tempos. Para isso, a partir da lista que montei, fiz um scraper de informações dos seus canais oficiais, e fiz algumas análises e montei umas visualizações que me ajudaram a ter uma resposta mais elaborada para essa pergunta.
Para capturar os dados do YouTube utilizei o pacote tuber. Segui alguns tutorais de como extrair esses dados, como a análise disponível no site curso-r.com sobre o canal Porta dos Fundos.
Minha análise está divida em duas partes, o processo de captura dos dados e sua análise.
Para montarmos nosso dataset precisamos dos dados dos canais das artistas. O pacote tuber que permite acessar a API do YouTube utilizando o R/RStudio. Assim, teremos acesso a estatíticas que precisamos como número de likes, quantidade de views, comentários e etc.
##Instale o pacote ‘devtools’ para obter a versão mais atual do tuber disponível no GitHub.
#install.packages('devtools')
library(devtools)
#versão mais recente do pacote
devtools::install_github("soodoku/tuber", build_vignettes = TRUE)
#carregando bibliotecas necessarias
library(tuber) # Acesso a API do YouTube
Agora, precisamos agora fazer a autenticação com o YouTube, é necessário um id e um secret. Para saber como fazer isso, siga o passo a passo disponível em Configurando API YouTube Com seu id e secret em mão, agora vamos configurar o acesso do tuber à API.
#autenticando com youtube
yt_oauth(app_id = "id_secret",
app_secret = "toke_secret")
Se tudo ocorrer bem, após rodar o código acima, uma janela será aberta no seu navegador confirmando a autenticação, após isso você pode voltar para o RStudio e iniciar os trabalhos.
#carregando biblitotecas extras
library(dplyr) # Manipulação de dados
library(tibble) # Criação de dataframes
library(lubridate) # Manipulação de datas
library(purrr) # Funcionais
library(plotly) # Gráficos
library(streamgraph) # Gráficos
Precisamos do id do canal de cada cantora, conseguimos essa informação na url do youtube www.youtube.com/channel/<channel_id>.
A Função tuber:: yt_search() pesquisa por videos e sua informações. Mais detalhes sobre a biblioteca tuber. Por default, a função yt_search() possui um número máximo de requisições, 50 no total. Mas não desanime, podemos configurá-la setando seus parâmetros type = “video” e channel_id = “id_de_algum_canal”, o número de requisições passa para 500 resultados. Para facilitar e automatizar nosso trabalho, adaptei a função get_videos() que recebe como parâmetro um dataset contendo datas de início e de término (em um dataframe com apenas uma linha) e o id_do_canal (em formtato de string) e devolve todos os vídeos do canal nesse período.
get_videos <- function(dates, id_channel) {
yt_search(term = "",
type = "video",
channel_id = id_channel,
published_after = dates$start,
published_before = dates$end)
}
Cada linha do dataframe de datas representa períodos de um ano, de 2009 a 2017. (2009 porque foi o ano em que a primeira cantora (Katy Perry) ingressou no YouTube). O mutate formata as datas no padrão exigido pela função yt_search(). Veja help(yt_search) para mais informações.
dates <- tibble(start = seq(ymd("2008-01-01"), ymd("2017-01-01"), by = "years"),
end = seq(ymd("2008-12-31"), ymd("2017-12-31"), by = "years")) %>%
mutate(start = paste(start, "T0:00:00Z", sep = ""),
end = paste(end, "T0:00:00Z", sep = ""))
Por fim, atribuímos ao objeto videos as informações de todos os vídeos do canal da cantora de 2008 até 2017. (Caso não possua vídeos nesse perído uma lista vazia será retornada). Por exemplo, vamos pegar as informações dos vídeos das cantoras, Lady Gaga. O mesmo passo será realizado para as demais artistas.
videos_gaga <- by_row(.d = dates, "UC07Kxew-cMIaykMOkzqHtBQ", ..f = get_videos, .to = "videos_info")
Precisamos das estatísticas dos vídeos, para isso utilizei a função get_videos_stats() que recebe um dataframe de uma linha contendo uma coluna $video_id e usando a função tuber::get_stats(), faço o scrape das estatísticas do vídeo.
#pegando estatísticas dos vídeos
get_videos_stats <- function(df_row) {
get_stats(video_id = df_row$video_id)
}
Hora de montar os datasets. Cada elemento da coluna video_info contém um dataframe com as informações dos vídeos de um determinado ano. Utilizando a função dplyr::bind_rows(), junteo esses dataframes em um só. Selecionamentos apenas as colunas de nosso interesse: title, publishedAt e video_id. Por fim, utilizei os id’s para baixar as estatítisca de cada vídeo usando a função get_videos_stats(). As estatísticas são salvas na coluna $vídeos_stats do dataframe resultado.
dados_gaga <- bind_rows(videos_gaga$videos_info) %>%
select(title, publishedAt, video_id) %>%
by_row(..f = get_videos_stats, .to = "videos_stats")
O pacote tuber possui diversas funções disponíveis no pacote, porém outras funções úteis estão disponíveis separadamente. Para conhecer esse conjunto de funções extras acesse <>. Para essa etapa, vamos precisar implementar 4 funções que pertencem ao pacote tuber, porém estão disponíveis separadamente. Para mais informações <>
Primeiro iremos precisar que verifica se o nosso token de acesso é válido. Utilizei a biblioteca httr para requisições HTTP.
#channel info
library(httr) # funções de requisições http
yt_check_token <- function() {
app_token = getOption('google_token')
if (is.null(app_token)) stop("Please get a token using yt_oauth().\n")
}
A função tuber_GET faz a requisição GET a aplicação YouTube e retorna uma lista com a resposta da consulta.
tuber_GET <- function(path, query, ...) {
yt_check_token()
req <- GET("https://www.googleapis.com", path=paste0("youtube/v3/", path), query=query, config(token = getOption("google_token")), ...)
tuber_check(req)
res <- content(req)
res
}
A função tuber_check solicita a confirmação da resposta da requisição feita na função anterior, em caso de falha uma mensagem de erro é exibida.
tuber_check <- function(req) {
if (req$status_code < 400) return(invisible())
stop("HTTP failure: ", req$status_code, "\n", call. = FALSE)
}
Por fim, temos a função que retorna as informações referentes ao canal. O parâmentro principal é o id do canal. O escopo da função é o seguinte: verifica-se se o id é um id válido, em caso positivo a requisição a aplicação do YouTube é feita. A resposta é uma lista contendo as informações do canal. Escolhemos as informações que necessitamos, título do canal, números de views, de comentários, de inscritos e de vídeos, e armazenamos em um dataframe.
get_channel_stats <- function (channel_id = NULL, ...) {
if (!is.character(channel_id)) stop("Must specify a channel ID.")
querylist <- list(part = "statistics,snippet", id = channel_id)
raw_res <- tuber_GET("channels", querylist, ...)
if (length(raw_res$items) ==0) {
cat("No channel stats available. Likely cause: Incorrect channel_id. \n")
return(list())
}
res <- raw_res$items[[1]]
res1 <- res$statistics
res2 <- res$snippet
res <- tibble(title = as.factor(res2$title),
nViews = as.numeric(res1$viewCount),
nComments = as.numeric(res1$commentCount),
nSubscribers = as.numeric(res1$subscriberCount),
nVideos = as.numeric(res1$videoCount))
}
Com as configurações necessárias para capturar as estatísticas referentes aos canais das cantoras, vamos utilizar as funções descritas acima para realizar a coleta dos dados..
Criamos um dataset com as informações do canal da Lady Gaga.
ladyGaga_info_channel <- channel_info_f("UC07Kxew-cMIaykMOkzqHtBQ"), # LadyGaga_VEVO
Agora que todas as ferramentas para a coleta dos dados estão prontas, vamos utilizá-las para montar nossos dataset com os dados das cantoras pop do YouTube.
# informações sobre os canais
summary(info_geral_channels)
## title nViews nComments
## AdeleVEVO : 1 Min. :3.671e+08 Min. : 0.0
## AlessiaCaraVEVO : 1 1st Qu.:1.853e+09 1st Qu.: 814.8
## ArianaGrandeVevo : 1 Median :3.866e+09 Median : 7193.0
## beyonceVEVO : 1 Mean :4.237e+09 Mean : 25267.4
## BritneySpearsVEVO : 1 3rd Qu.:5.100e+09 3rd Qu.: 32923.8
## carrieunderwoodVEVO: 1 Max. :1.140e+10 Max. :194011.0
## (Other) :18
## nSubscribers nVideos
## Min. : 989954 Min. : 16.00
## 1st Qu.: 3061470 1st Qu.: 50.75
## Median : 7469622 Median : 76.00
## Mean : 8756711 Mean : 80.67
## 3rd Qu.:11978234 3rd Qu.:106.25
## Max. :24459124 Max. :154.00
##
# informações sobre os vídeos
summary(info_geral_videos)
## Nome ano total_views
## Katty Perry : 10 Min. :2008 Min. :1.364e+05
## Beyonce : 9 1st Qu.:2011 1st Qu.:4.882e+07
## Celine Dion : 9 Median :2014 Median :2.496e+08
## Mariah Carey: 9 Mean :2013 Mean :6.109e+08
## Pink : 9 3rd Qu.:2015 3rd Qu.:9.027e+08
## Selena Gomez: 9 Max. :2017 Max. :4.104e+09
## (Other) :108
Finalmente concluímos o processo de captura organização e montagem dos dados, agora é a hora da análise propriamente dita. Vamos lá.
Muitas pessoas não confiam nos rankins divulgados pelas revistas, acreditam que é uma colocação arquitetada pela indústria da música e empresários e teorias da conspiração, pensando nisso resolvi utilizar os dados do YouTube para tentar aumentar (ou diminuir) a confiança nessas revistas. Criarei um ranking anual do YouTube e farei a comparação com os rankings da Billboard e Forbes.
No gráfico abaixo, podemos ver o comportamento/mudanças de um ranking para o outro, segundo os dados o YouTube só da match com o ranking da Forbes em 20% casos, já o da Billboard em 60% ocorrências.
#funcao que filtra os dados pelo ano e retorna as 10 maiores cantoras em numero de views
get_top_10 <- function(data, year){
res <- data %>%
filter(ano == year)
}
info_2014 <- get_top_10(listas, 2014)
#plot 2014
plot_ly(info_2014, y = ~ranking, x = ~ano_lista, type = 'scatter', color = info_2014$nome, mode = 'line+markers',
hoverinfo = 'text',
text = ~paste('Diva: ', info_2014$nome,
'</br> Ranking: ', info_2014$ranking,
'</br> nViews: ', info_2014$nViews)) %>%
layout(title = "2014: Billboard, Youtube e Forbes ",
xaxis = list(title=""),
yaxis = list(title="Ranking", autotick=F, tick0 = 0, autorange = "reversed"))
As comparações referentes a 2015 se mantêm constante em relação a 2014, sem muitos acertos/erros entre os rankings.
Em 2016 o cenário se altera um pouco, para mais acertos em relação ao YouTube e os outros. YouTube e Forbes 40% de acerto, YouTube e Billboard 70% de acerto.
Analisando os três cenários descritos acima, cheguei a conclusão que estar dentre as artistas que mais faturaram durante o ano (no caso da Forbes), não implica dizer que ela será a mais popular no YouTube, já os resultados referentes a Billboard vemos que se assemelham bastante com os do YouTube. Sobre a confiança nesses rankings, o da Forbes não tem muita discussão, já que é montado com base nos lucros das cantoras, já o da Billboard é bastante semelhante com o do YouTube, o que nos passa uma confiança maior.
Utilizei uma estatística simples, a média de views por número de vídeos. Iremos ver quem, dentre as maiores divas da música pop, é que possui mais views por vídeo.
info_geral_channels <- info_geral_channels %>%
mutate(ViewsPorVideo = nViews/nVideos)
#ordenando dataset
info_geral_channels$title <- factor(info_geral_channels$title, levels = unique(info_geral_channels$title)[order(info_geral_channels$ViewsPorVideo, decreasing = TRUE)])
m <- list(l=60, r=60, b=100, t=100, pad=4) #margens do gŕafico
plot_ly(info_geral_channels,
x = ~title,
y = ~ViewsPorVideo,
type = "bar",
color = ~title,
text = ~paste('Diva: ', info_geral_channels$title)) %>%
layout(title = "Media de Views por Video no YouTube - 2008 até 2017",
showlegend = FALSE,
xaxis = list(title="Divas", tickangle = 30),
yaxis = list(title="nº views"),
margin=m)
Segundo os dados, as colocações no nosso ranking mudaram, dentre os 21 canais das 21 maiores divas de todos os tempos (2008-2017), Adele possui uma média de, quase 183 milhões, views em seus 33 vídeos, seguida pela Taylor Swift com quase 145 milhões de views em cada um dos seus 77 videos. Essa métrica não é muito confiável, visto que a quantidade de vídeos é diferente entre os canais. Por isso, analisei outras informações para tentar encontrar a maior ou as maiores divas do YouTube.
#ordenando
info_geral_channels$title <- factor(info_geral_channels$title, levels = unique(info_geral_channels$title)[order(info_geral_channels$nViews, decreasing = TRUE)])
#plot nViews
m <- list(l=60, r=60, b=100, t=100, pad=4) #margens do gŕafico
plot_ly(info_geral_channels,
x = ~title,
y = ~nViews,
type = "scatter",
color = ~title,
size = ~nViews,
text = ~paste('Diva: ', info_geral_channels$title)) %>%
layout(title = "Número de Views do canal - 2008 até 2017",
showlegend = FALSE,
xaxis = list(title="", tickangle = 30),
yaxis = list(title="nº views"),
autosize=F,
margin=m)
Algumas mudanças aconteceram, mas o cenário continua parecido. Dessa vez, a maior diva do YouTube, segundo a quantidade de views, é Katy Perry com quase 11,5 bilhão de views em seu canal, seguida pela Taylor Swift com 11B de views e depois a Rihanna com 11B de views e logo depois a Beyoncé com quase 7 B de views em seu canal.
Temos agora outra visualização mostrando a quantidade de views por ano. Utilizamos um streamgraph para melhor exibir as mudanças que ocorreram. No eixto x temos os anos e o y é relacionado com a quantidade de views.
streamgraph(info_geral_videos, "Nome", "total_views", "ano")%>%
sg_axis_x(1, "year", "%Y") %>%
sg_axis_y(1, 5) %>%
sg_legend(TRUE, "Diva: ")
O interessante de usar esse tipo de gráfico, é que temos uma visão geral da história das cantoras, quando maior (mais grossa) a linha, maior foi o número de views naquele determinado ano, conseguimos abstrair mais ainda e ver quais foram os anos em que houve mais consumo de conteúdo, por exemplo, 2012 é onde temos o menor número de views no geral, já 2014 o consumo é o maior registrado. Podemos ainda selecionar apenas uma cantora e observar o comportamento dela.
No gŕafico abaixo, é possível visualizar todo o histórico de das 21 maiores cantoras pops da história do YouTube.
#visualizações
plot_ly(info_geral_videos , x = ~ano, y = ~total_views, name = 'Nome', type = 'scatter', color = info_geral_videos$Nome, mode = 'lines+markers', text = paste(info_geral_videos$Nome)) %>%
layout(title = "Resumo Divas Pop - Nº views no YouTube por Ano",
xaxis = list(title="Ano", autotick=F),
yaxis = list(title="Nº de Views"))
É possível marcar ou desmarcar o nome da artista, o que ajuda a fazer comparações.
Temos agora outra visualização sobre o histórico dos canais das Divas no YouTube.
plot_ly(info_geral_videos, x = ~ano, y = ~total_views, size= ~total_views, type = 'scatter', color = info_geral_videos$Nome, mode = 'markers', text = paste(info_geral_videos$Nome)) %>%
layout(title = "Resumo Divas Pop - Nº views no YouTube por Ano",
xaxis = list(title="Ano", autotick=F),
yaxis = list(title="Nº de Views"))
O interessante desse trabalho é aprender a mexer nessa ferramenta incrível que é o RStudio, utilizando bibliotecas fantásticas e aprendendo a integrar com a API de uma plataforma mundialmente conhecida e acessada por todos nós. O tema não é nenhuma tese de doutorado (ou é), mas para quem gosta de música pop e tem sua diva preferida, agora possui novos argumentos para as intermináveis discussões sobre quem é a melhor de todas.
O código está disponível e você pode aprender a utilizar as bibliotecas aqui usadas e brincar com os dados dos seus canais favoritos, fazendo análises, comparações e descobrindo fatos curiosos.
E se sua diva não apareceu aqui, não fique triste, futuramente ela aparecerá nos rankings mundiais :)