Explorando o Universo Fascinante do Sucesso no YouTube: Uma Análise Detalhada

Descubra as estatísticas dos maiores canais de YouTube e desvende os padrões de sucesso na Era Digital

Edson Junior
Data Hackers
14 min readSep 25, 2023

--

Photo by Shubham Dhage on Unsplash

Introdução

Bem-vindo ao empolgante universo do estrelato do YouTube, onde cada clique e inscrição são moedas de um reino digital em constante expansão. Neste artigo, embarcaremos em uma jornada para desvendar os segredos e insights por trás das estatísticas dos canais do YouTube mais renomados. Imagine este artigo como um mapa que o levará a um tesouro de informações meticulosamente selecionadas sobre os gigantes da plataforma. Com detalhes abrangentes sobre o número de inscritos, visualizações de vídeos, frequência de upload, país de origem, ganhos e muito mais, você está prestes a desvendar os mistérios do sucesso no YouTube.

Conteúdo:

→ Importando as bibliotecas e o dataset
→ Dicionário dos dados
→ Visão geral do dataset
→ Detecção de outliers
→ Valores nulos
→ Linhas duplicadas
→ Valores diferentes por coluna
→ Os 10 maiores canais em número de inscritos
→ Os 10 maiores canais em número de uploads
→ Quais são os países que mais possuem canais de sucesso no YouTube?
→ Qual a relação entre o número de inscritos e de visualizações?
→ Quais são os canais mais bem sucedidos do Brasil?
→ Conclusões

Importando as bibliotecas e o dataset

Nesta análise exploratória foram utilizadas as seguintes bibliotecas:

# Bibliotecas para tratar dados
import pandas as pd
import numpy as np
import locale

# Bibliotecas para EDA
import seaborn as sns
import matplotlib.pyplot as plt
import plotly.express as px
import plotly.graph_objects as go
import missingno
import pycountry_convert as pc

# Configurar para não exibir warnings
import warnings
warnings.filterwarnings("ignore")

# Configurar para exibir todas as colunas de um DataFrame do Pandas
pd.set_option("display.max_columns", None)

Assim, foi possível impotar a base de dados:

# Carregando o dataset
df = pd.read_csv("Global_YouTube_Statistics.csv", encoding='latin-1')

Dicionário dos dados

Esta seção contém o significado de cada variável presente no conjunto de dados:

Fonte: Kaggle

Visão geral do dataset

Primeiramente, mostramos apenas as 5 primeiras linhas da base, para uma rápida verificação em cada uma das colunas.

# Primeiras linhas do dataset
df.head()

Esta é a visão parcial das primeiras linhas:

Fonte: Próprio autor

A visão geral da quantidade de linhas e colunas:

Fonte: Próprio autor

Com o comando df.info(), é possível verificar o tipo de cada uma das colunas da base:

Fonte: Próprio autor

Foram também obtidas as estatísticas descritivas de todas as colunas numéricas do dataset, através do comando df.describe():

Fonte: Próprio autor

O comando df.describe() apresenta estatísticas como média, desvio padrão, primeiro quartil (25%), mediana (50%) e terceiro quartil (75%). Estas medidas já dão uma ideia inicial da distribuição de cada uma destas variáveis.

Detecção de outliers

Outliers, ou valores atípicos, são pontos de dados em um conjunto de dados que se afastam significativamente da maioria dos outros valores. Eles podem ser observações extremamente altas ou baixas em relação ao restante dos dados e têm o potencial de afetar adversamente análises estatísticas e modelos. Portanto, é importante identificar e tratar outliers adequadamente ao analisar dados.

Uma das maneiras mais comuns de identificar outliers é usando o método do Intervalo Interquartil (IQR). O IQR é uma medida de dispersão que descreve a variação entre os quartis de um conjunto de dados. Ele é calculado da seguinte maneira:

  1. Calcule o primeiro quartil (Q1), que é o valor abaixo do qual está 25% dos dados.
  2. Calcule o terceiro quartil (Q3), que é o valor abaixo do qual está 75% dos dados.
  3. Calcule o IQR como a diferença entre Q3 e Q1: IQR = Q3 — Q1.

Uma vez que o IQR seja calculado, você pode usar essa medida para identificar os outliers:

  1. Defina um limite inferior como Q1–1,5 * IQR.
  2. Defina um limite superior como Q3 + 1,5 * IQR.

Qualquer valor de dados que esteja abaixo do limite inferior ou acima do limite superior é considerado um outlier.

Em python, este procedimento foi realizado para todas as variáveis numéricas, da seguinte forma:

# Função para identificar outliers em uma variável
def detect_outliers(column):
Q1 = column.quantile(0.25)
Q3 = column.quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = column[(column < lower_bound) | (column > upper_bound)]
return outliers

# Dicionário para armazenar os outliers de cada variável
outliers_dict = {}

# Loop através das variáveis numéricas
for col in df.select_dtypes(include=['float64', 'int64']):
if col not in ['Longitude', 'Latitude']:
outliers = detect_outliers(df[col])
outliers_dict[col] = outliers

# Cria um DataFrame com os outliers
outliers_df = pd.DataFrame(outliers_dict)

# Conta quantos outliers cada variável possui
contagem_outliers = outliers_df.count()

# Exibe a contagem de outliers para cada variável
contagem_outliers_df = pd.DataFrame({'Variavel': contagem_outliers.index, 'Quantidade de Outliers': contagem_outliers.values})
contagem_outliers_df

O resultado deste código é a tabela a seguir:

Fonte: Próprio autor

Também é possível inserir estes dados em um gráfico de barras, da seguinte forma:

# Criação do gráfico de barras
fig = px.bar(contagem_outliers_df, x='Variavel', y='Quantidade de Outliers', color='Variavel', text='Quantidade de Outliers',
title='Distribuição dos Outliers nas Colunas do DataFrame', height=600)

# Criação dos valores exibidos em cima das barras
fig.update_traces(textposition='outside')

# Mostrando a figura
fig.show()

O que gera o seguinte visual:

Fonte: Próprio autor

No caso acima foi utilizada biblioteca plotly, que permite criar gráficos interativos e dinâmicos. É uma ótima ferramenta para visualização de dados em diversos formatos (barra, dispersão, mapas geográficos, etc).

Como a coluna ‘Population’ não é uma medida que diz respeito à canais e ‘video_views_rank’ é um ranking, a variável que mais apresentou outliers foi ‘uploads’, com 132. Ou seja, há 132 canais que fazem uma quantidade extremamente alta de uploads. Aí vem o questionamento: “Que tipo de canal faria quantidades exorbitantemente altas de uploads de vídeos na plataforma?” Continue lendo que você descobrirá!

Valores Nulos

Também é possível obter os valores nulos de cada variável.

# fazendo a soma de valores nulos por coluna
df.isnull().sum()

O que originou a seguinte tabela:

Fonte: Próprio autor

Da mesma forma que na seção de outliers, é possível uma representação mais visual deste resultado.

Fonte: Próprio autor

Nesta visualização, cada barra representa uma coluna e quanto mais a barra possui riscos brancos horizontais, significa que mais valores nulos aquela variável correspondente possui. Trata-se de mais um recurso que pode ser utilizado quando se trata de valores nulos.

Linhas duplicadas

A verificação de linhas duplicadas é uma importante análise para atestar a qualidade dos dados. Podem ocorrer devido à erros de entrada, falhas no armazenamento dos dados, o que pode distorcer as análises e as métricas estatísticas. Se alguma linha aparecer duplicada, será considerada mais de uma vez. Portanto, remover registros repetidos é essencial para evitar conclusões errôneas.

Em python, linhas duplicadas podem ser verificadas da seguinte forma:

# verificando se há linhas duplicadas
df[df.duplicated()]

Neste caso, nada apareceu como resultado, significando que o dataset contém 995 linhas diferentes umas das outras, sem nenhuma repetição.

Valores diferentes por coluna

A quantidade de valores diferentes em cada uma das variáveis pode ajudar a levantar algumas questões de pesquisa durante a fase de análise exploratória.

Em python:

# Definindo quantos valores diferentes existem em cada variável

contagem = pd.DataFrame(columns=['Variavel','Contagens_Distintas'])

for coluna in df.columns:
dados = {'Variavel': coluna, 'Contagens_Distintas': df[coluna].value_counts().shape[0]}
contagem = contagem.append(dados, ignore_index = True)

contagem

O resultado para as 20 primeiras colunas pode ser verificado a seguir:

Fonte: Próprio autor

Com isso, pode ser verificado que há:

  • 995 canais diferentes na base de dados (linha
  • Há canais de 49 países diferentes
  • Há 18 categorias de canais
  • Os canais foram criados em 19 anos diferentes
  • Há 14 tipos de canais

Estas informações já revelam possíveis análises como: descobrir os maiores países para uma determinada métrica, encontrar as métricas para cada categoria em específico, verificar como é a distribuição da criação de canais ao longo do tempo, entre outras possibilidades.

Os 10 maiores canais em número de inscritos

Uma das primeiras análises a se pensar em fazer é a de descobrir quais são os maiores canais em número de inscritos existentes hoje. Para encontrar esta informação, pode-se seguir da seguinte forma:

  1. É realizado a montagem de um dataframe denominado “maiores_Canais_inscritos”, considerando apenas as variáveis “Youtuber”, “subscribers”, “Country” e “category”.
  2. Em seguida o dataframe pode ser ordenado com base no número de “subscribers
  3. Podem também ser exibidas apenas as 10 primeiras linhas, para saber os 10 primeiros canais
  4. Por fim, as colunas do dataframe podem ser renomeadas, para facilitar o entendimento
# Criando o dataframe "maiores_Canais_inscritos", ordenando com base no 
# número de inscritos e apresentando apenas as 10 primeiras linhas
maiores_Canais_inscritos = df[['Youtuber', 'subscribers', 'Country', 'category']].sort_values('subscribers', ascending=False).head(10).reset_index(drop=True)

# Renomeando algumas colunas do dataframe
maiores_Canais_inscritos.rename(columns={'Youtuber': 'Canal', 'subscribers': 'Inscritos'}, inplace=True)

# Apresentando o dataframe
maiores_Canais_inscritos

Desta forma, o dataframe “maiores_Canais_inscritos” terá a seguinte forma:

Fonte: Próprio autor

Assim, é possível a visualização também por meio da biblioteca plotly, da seguinte forma:

# Dividindo o número de inscritos por 1 milhão
maiores_Canais_inscritos['Inscritos_Milhoes'] = (maiores_Canais_inscritos['Inscritos'] / 1000000).round(2)

# Criação do gráfico de barras
fig = px.bar(maiores_Canais_inscritos, x='Canal', y='Inscritos', color='Canal', text='Inscritos_Milhoes',
title='10 Maiores Canais em Número de Inscritos', height=600)

# Criação dos valores exibidos em cima das barras
fig.update_traces(textposition='outside', texttemplate='%{text}M', textfont_size=12)

# Mostrando o gráfico
fig.show()

O código acima origina o seguinte gráfico:

Fonte: Próprio autor

No gráfico anterior, é possível observar a presença de um único canal no âmbito da Educação, denominado Cocomelon — Nursery Rhymes, que ocupa a quarta posição em termos de número de inscritos. Além disso, notamos que o renomado Mr.Beast figura em terceiro lugar na lista, o que justifica sua fama como “O maior Youtuber do mundo”, pessoa física. Essa distinção é destacada considerando que o primeiro lugar é ocupado pela T-Series, uma empresa indiana de produção cinematográfica, e o segundo lugar pertence ao Youtube Movies, uma seção do YouTube dedicada à exibição de filmes.

Os 10 maiores canais em número de uploads

Uma análise dos canais com maior número de uploads é, no mínimo, curiosa. Quem são os canais que mais postam conteúdo na plataforma? Para descobrir, podemos seguir o mesmo esquema apresentado para os canais com mais inscritos, ou seja, criar um dataframe que traga a informação de uploads e ordená-lo por esta mesma variável, conforme é mostrado a seguir.

# Criando o dataframe "maiores_Canais_uploads", ordenando com base no 
# número de uploads e apresentando apenas as 10 primeiras linhas

maiores_Canais_uploads = df[['Youtuber', 'uploads', 'Country', 'category']].sort_values('uploads', ascending=False).head(10).reset_index(drop=True)

# Renomeando algumas colunas do dataframe
maiores_Canais_uploads.rename(columns={'Youtuber': 'Canal', 'uploads': 'Uploads'}, inplace=True)

# Apresentando o dataframe
maiores_Canais_uploads

O dataframe maiores_Canais_uploads terá a seguinte forma:

Fonte: Próprio autor

Olhem só, parece que há um padrão nos canais de maior número de uploads, não é mesmo? Vamos colocar em um gráfico de barras novamente, para visualizar estas informações de uma outra perspectiva. Para isso, utiliza-se a dinamicidade do plotly a seguir.

# Dividindo o número de inscritos por 1 mil
maiores_Canais_uploads['Uploads_Milhares'] = (maiores_Canais_uploads['Uploads'] / 1000).round(2)

# Criação do gráfico de barras
fig = px.bar(maiores_Canais_uploads, x='Canal', y='Uploads', color='Canal', text = 'Uploads_Milhares',
title='10 Maiores Canais em Número de Uploads', height=600)

# Criação dos valores exibidos em cima das barras
fig.update_traces(textposition='outside', texttemplate='%{text}k', textfont_size=12)

# Mostrando o gráfico
fig.show()

O código acima origina o seguinte gráfico:

Fonte: Próprio autor

Dentre os canais que mais frequentemente atualizam seu conteúdo, é notável que a maioria deles está associada a Fontes de Notícias, uma vez que esses canais têm uma presença constante na plataforma, disseminando informações e notícias. Vale ressaltar que, dos dez canais mais proeminentes nessa lista, uma proporção significativa, ou seja, a metade, são de origem indiana. Isso destaca a influência e a presença considerável de criadores de conteúdo indianos nesse cenário.

Quais são os países que mais possuem canais de sucesso no YouTube?

Para descobrir os países que mais possuem canais de sucesso no YouTube é realizada uma contagem da frequência em que cada país aparece na lista, através do comando value_counts().

# Criando o dataframe "contagem", para contar a frequência em que cada
# país aparece na lista. São considerados os 10 primeiros

contagem = df['Country'].value_counts().reset_index()
contagem.columns = ['Country', 'Quantidade de Canais Totais']
contagem.head(10)

O dataframe contagem terá a seguinte forma:

Fonte: Próprio autor

Utilizando agora um gráfico de barras horizontal para visualizar esta informação:

# Criação do gráfico de barras
fig = px.bar(contagem.head(10), x='Quantidade de Canais Totais', y='Country', color='Country',
text = 'Quantidade de Canais Totais',
labels={'Quantidade de Canais Totais': 'Quantidade de Canais', 'Country': 'País'},
title='10 países que mais possuem canais na lista', height=600)

# Criação dos valores exibidos em cima das barras
fig.update_traces(textposition='outside', texttemplate='%{text}', textfont_size=12)

# Mostrando o gráfico
fig.show()

O código acima origina o seguinte gráfico:

Fonte: Próprio autor

O gráfico apresentado acima ilustra claramente a notável influência dos Estados Unidos e da Índia entre os canais mais proeminentes no YouTube. Os indicadores desses dois países desempenham um papel significativo na liderança global da América do Norte e da Ásia.

O conteúdo em inglês produzido nos Estados Unidos alcança uma audiência mundial devido à ampla difusão da língua inglesa, proporcionando uma vantagem competitiva para os criadores norte-americanos. Enquanto isso, o crescimento rápido do acesso à internet na Índia tem impulsionado a expansão global de canais indianos, tornando o país um polo de produção e consumo de conteúdo cada vez mais relevante no YouTube.

Qual a relação entre o número de inscritos e de visualizações?

Para descobrir se há uma relação ou associação entre o número de inscritos e o de visualizações, é válido a determinação da correlação. Esta medida indica se há uma conexão entre as variáveis e a natureza da relação.

A correlação pode ser positiva, negativa ou nula:

  1. Correlação positiva: Indica que quando uma variável aumenta, a outra também aumenta. A derivada da reta de regressão é positiva.
  2. Correlação Negativa: Neste caso, enquanto uma variável aumenta, a outra diminui. A derivada da reta de regressão é negativa.
  3. Correlação nula: Quando o índice é muito próximo de zero, não há uma relação aparente entre as variáveis.

Em python, a métrica pode ser obtida da seguinte forma:

# Criando a área do plot
plt.figure(figsize = (16, 9))

# Título do gráfico
plt.title('Correlação entre Visualização e Assinantes')

# Criação do gráfico em si
sns.heatmap(df[['subscribers', 'video views']].corr(), annot = True, vmin = -1, vmax = 1, cmap = 'RdBu')

# Plotando a figura
plt.show();

Desta forma o heatmap é mostrado a seguir:

Fonte: Próprio autor

O número de inscritos e de visualizações mantém uma correlação forte ente si, de 0.75. Isto pode ajudar a entender como o engajamento pode influenciar no crescimento do número de inscritos do canal.

Ainda é possível a visualização de um gráfico de dispersão com uma reta de regresão linear ajustada aos dados, através do regplot da biblioteca seaborn.

# Criando a área do plot
plt.figure(figsize = (16, 9))

# Título do gráfico
plt.title('Relação entre Assinantes e Visualizações em Vídeos')

# Criação do gráfico em si
sns.regplot(x = 'subscribers', y = 'video views', data = df)

# Mostrando a figura
plt.show();

O código acima origina o seguinte gráfico:

Fonte: Próprio autor

É fundamental ressaltar que a presença de correlação não estabelece uma relação causal direta. Mesmo quando duas variáveis demonstram correlação, essa associação não implica, automaticamente, que uma seja a causa da outra. Existem outros fatores ou variáveis que podem influenciar a relação observada, mas que não foram considerados na análise. Portanto, a interpretação da correlação deve ser realizada com cautela, e, quando necessário, é aconselhável conduzir análises adicionais para uma compreensão mais aprofundada da relação entre as variáveis em questão.

Quais são os canais mais bem sucedidos do Brasil?

Também é possível verificar os canais de maior influência no Brasil. Para isso, é necessário filtrar no dataframe original o país de origem, conforme indicado a seguir.

# Filtrando todos os registros de canais brasileiros

canais_Brasil = df[df['Country'] == 'Brazil']
canais_Brasil.head()

Em seguida, são criados dois dataframes auxiliares para definir os maiores canais em número de inscritos e número de visualizações.

# Dataframe com maiores canais em visualizações
canais_Brasil_visualizacoes = canais_Brasil[['Youtuber','video views']].sort_values('video views', ascending=False).head(10).reset_index(drop=True)

# Dataframe com maiores canais em inscritos
canais_Brasil_inscritos = canais_Brasil[['Youtuber','subscribers']].sort_values('subscribers', ascending=False).head(10).reset_index(drop=True)

Desta forma, são criados dois gráficos e expostos lado a lado:

# Cria uma figura com dois subplots lado a lado
fig, axs = plt.subplots(1, 2, figsize=(19, 9))

# Primeiro gráfico
sns.barplot(x=canais_Brasil_inscritos.Youtuber, y=canais_Brasil_inscritos.subscribers, data=canais_Brasil_inscritos,ax=axs[0])
axs[0].set_yticklabels([f'{int(label/1e6)}MM' for label in axs[0].get_yticks()])
axs[0].set_xlabel('Canal')
axs[0].set_ylabel('Inscritos')
axs[0].set_title('10 canais com mais inscritos do Brasil')
# Define os rótulos do eixo x inclinados em 60 graus
axs[0].set_xticklabels(axs[0].get_xticklabels(), rotation=60, ha='right')


# Adiciona os valores do eixo y em milhões acima das barras
for bar, value in zip(axs[0].containers[0], canais_Brasil_inscritos.subscribers):
axs[0].annotate(f'{int(value/1e6)}MM', xy=(bar.get_x() + bar.get_width() / 2, bar.get_height()),
xytext=(0, 3), textcoords='offset points', ha='center', fontsize=10)

# Segundo gráfico
sns.barplot(x=canais_Brasil_visualizacoes.Youtuber, y=canais_Brasil_visualizacoes['video views'], data=canais_Brasil_visualizacoes, ax=axs[1])
axs[1].set_yticklabels([f'{int(label/1e9)}B' for label in axs[1].get_yticks()])
axs[1].set_xlabel('Canal')
axs[1].set_ylabel('Visualizações')
axs[1].set_title('10 canais com mais visualizações do Brasil')
# Define os rótulos do eixo x inclinados em 60 graus
axs[1].set_xticklabels(axs[1].get_xticklabels(), rotation=60, ha='right')

# Adiciona os valores do eixo y em bilhões acima das barras
for bar, value in zip(axs[1].containers[0], canais_Brasil_visualizacoes['video views']):
axs[1].annotate(f'{int(value/1e9)}B', xy=(bar.get_x() + bar.get_width() / 2, bar.get_height()),
xytext=(0, 3), textcoords='offset points', ha='center', fontsize=10)

# Ajusta o espaçamento entre os subplots
plt.tight_layout()

# Mostra os gráficos
plt.show()

Com o código acima, os dois gráficos são apresentados a seguir:

Fonte: Próprio autor

No rol dos canais brasileiros mais bem-sucedidos, destaca-se o Kondzilla, que ocupa a posição de destaque tanto em termos de inscritos quanto de visualizações. O canal alcançou a liderança no cenário do YouTube Brasil devido à sua marcante presença na indústria musical brasileira, produzindo videoclipes para artistas renomados e cativando uma ampla audiência em busca de música e entretenimento.

Além disso, é notável a influência das crianças (e seus respectivos pais) nessa lista, contribuindo significativamente para os indicadores de canais como Enaldinho e Galinha Pintadinha.

Conclusões

  • No Brasil, o canal Kondzilla possui larga vantagem na quantidade de inscritos (cerca de 66 milhões) e visualizações (cerca de 36 bilhões)
  • Há um amplo domínio de canais dos Estados Unidos e India, em comparação com outros países do mundo.
  • A maioria dos canais com maiores índices de uploads na plataforma são de notícias, fontes de informação que precisam constantemente divulgar informações para seus inscritos.
  • As crianças contribuíram em peso na lista de maiores canais nacionais, sendo representadas por Enaldinho e Galinha Pintadinha.

Observações: Há muito mais perguntas no projeto. Para simplificar, coloquei apenas cinco aqui no Medium. Então, para um melhor entendimento dos dados, sugiro que leia o projeto completo no GitHub.

Link para o GitHub:
https://github.com/ejunior029/Analise-Exploratoria-YouTube

Ainda não me segue no Medium? Aproveite e me siga para ficar sabendo toda vez que sair um artigo novo do forninho!!

A base de dados para esta análise se encontra em:
https://www.kaggle.com/code/skv1436/global-youtube-statistics-eda

Referências

  1. Clube de assinatura do André Yukio
  2. Clube de assinatura do Anwar Hermuche

--

--