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.

##

Passo 1: instalar e configurar o pacote tuber

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

Passo 2: buscar os ids dos canais das cantoras

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")

Passo 3: pegar as estatísticas de cada vídeo do canal

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")

Passo 4: pegar as estatísticas do canal

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

Passo 5: As hipóteses

Hipótese I: usando o YouTube para confirmar os rankings da Billboard e Forbes

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.

Hipótese II: qual a maior diva pop do YouTube?

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.

Linha do tempo do YouTube em relação ao número de views de cada Diva Pop

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.

Panorama Geral histórico das divas no YouTube

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"))

Conclusões

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 :)