Executando verificação de segurança...
23

Análise de conteúdo tabnews (fevereiro de 2023)

Salve povo!

Fiz uma análise das postagens do mês de fevereiro do tabnews, pra me familiarizar com a API e entender melhor alguns padrões de postagem aqui do fórum.

Todo o código desenvolvido nessa postagem está nesse notebook do kaggle: link.

Eu também fiz um post no meu blog no qual eu explico o passo a passo pra reproduzir os gráficos e valores que eu vou expor aqui.

Vamos abordar os seguintes tópicos:

Entendendo a API e buscando os dados

Pra coletar os dados, busquei uma forma de evitar fazer um consumo excesivo da API, e me baseei no cabeçalho x-pagination-total-rows que a API do tabnews retorna em todas as requisições.

No meu caso, utilizei o endpoint /api/v1/contents, pra pegar apenas as postagens, sem os comentários.

$ curl -I "https://www.tabnews.com.br/api/v1/contents?strategy=new"
HTTP/2 200
...
..
link: <https://www.tabnews.com.br/api/v1/contents?strategy=new&page=1&per_page=1>; rel="first", <https://www.tabnews.com.br/api/v1/contents?strategy=new&page=2&per_page=1>; rel="next", <https://www.tabnews.com.br/api/v1/contents?strategy=new&page=8153&per_page=1>; rel="last"
x-pagination-total-rows: 8153

O total de resultados (no dia que eu rodei esse script) eram 8153!

Esse cabeçalho sempre retorna o total de resultados, dado que os endpoints da API são todos paginados, com um máximo de 100 resultados por página.

Combinei essa quantidade de resultados com o retorno do endpoint de analytics, que dá a quantidade de posts feitos por dia num intervalo de dois meses.

$ curl https://www.tabnews.com.br/api/v1/analytics/root-content-published
[
    {"date":"13/01","conteudos":38},
    {"date":"14/01","conteudos":29},
    {"date":"15/01","conteudos":30},
    {"date":"16/01","conteudos":50},
    {"date":"17/01","conteudos":37},
    {"date":"18/01","conteudos":44},
    ..
]

Com isso, selecionei apenas os posts do início de fevereiro até o dia atual, e fiz descobri "a quantos posts atrás" foi feito o primeiro post de fevereiro.

$ echo '[{"date":"01/02","conteudos":46},{"date":"02/02","conteudos":66},{"date":"03/02","conteudos":43},{"date":"04/02","conteudos":43},{"date":"05/02","conteudos":31},{"date":"06/02","conteudos":55},{"date":"07/02","conteudos":51},{"date":"08/02","conteudos":46},{"date":"09/02","conteudos":47},{"date":"10/02","conteudos":39},{"date":"11/02","conteudos":18},{"date":"12/02","conteudos":19},{"date":"13/02","conteudos":40},{"date":"14/02","conteudos":29},{"date":"15/02","conteudos":45},{"date":"16/02","conteudos":54},{"date":"17/02","conteudos":48},{"date":"18/02","conteudos":21},{"date":"19/02","conteudos":18},{"date":"20/02","conteudos":27},{"date":"21/02","conteudos":27},{"date":"22/02","conteudos":37},{"date":"23/02","conteudos":38},{"date":"24/02","conteudos":41},{"date":"25/02","conteudos":10},{"date":"26/02","conteudos":13},{"date":"27/02","conteudos":51},{"date":"28/02","conteudos":38},{"date":"01/03","conteudos":21},{"date":"02/03","conteudos":35},{"date":"03/03","conteudos":35},{"date":"04/03","conteudos":21},{"date":"05/03","conteudos":15},{"date":"06/03","conteudos":28},{"date":"07/03","conteudos":27},{"date":"08/03","conteudos":40},{"date":"09/03","conteudos":37},{"date":"10/03","conteudos":31},{"date":"11/03","conteudos":29},{"date":"12/03","conteudos":23},{"date":"13/03","conteudos":34}]' \
| jq "[.[].conteudos] | add"
1417

1417! Esse foi o número de postagens criadas des do início de fevereiro, até o dia atual. Isso dá mais ou menos 15 páginas (1417 / 100 ≈ 14).

Como o total de resultados do endpoint eram 8153, eles estavam distribuidos em 82 páginas (8153 / 100 ≈ 82).

Com isso, sei que precisava começar minhas requisições ali pela página 68 (82 - 14).

Automatizando as requisições com `requests` do python

A lógica pra recuperar as postagens dentro do intervalo é simples:

  • Começo buscando na página 68, e iterando sobre os resultados de cada página;
  • Se um resultado for anterior a fevereiro, eu pulo pro próximo;
  • Se o resultado for de fevereiro, salvo em uma lista;
  • Vou passando de página em página, sempre adicionando +1 à página atual;
  • Quando eu chegar no primeiro post de março, posso parar o algoritmo;

A implementação dessa lógica é extremamente simples se usarmos as libs requests e json do python.

Clique aqui para visualizar o script inteiro (40 linhas, ❤️ python)
import json
import requests

from datetime import datetime as dt
from time import sleep


def published_before_february(request_body):
    """Returns whether the given post was `published_at` before 01/02/2023"""
    published_at = dt.strptime(request_body["published_at"], "%Y-%m-%dT%H:%M:%S.%fZ")
    return dt.strptime("2023-02-01", "%Y-%m-%d") > published_at


def published_after_february(request_body):
    """Returns whether the given post was `published_at` after 28/02/2023"""
    published_at = dt.strptime(request_body["published_at"], "%Y-%m-%dT%H:%M:%S.%fZ")
    return published_at > dt.strptime("2023-02-28T23:59:59", "%Y-%m-%dT%H:%M:%S")


base_url = "https://www.tabnews.com.br/api/v1"
current_page = 68

request_loop = True

february_posts = []
while request_loop:
    request_url = f"{base_url}/contents?strategy=old&page={current_page}&per_page=100"
    r = requests.get(request_url)
    posts = r.json()
    for post in posts:
        if published_before_february(post):
            continue
        if published_after_february(post):
            request_loop = False
            break
        february_posts.append(post)
    current_page = current_page + 1
    sleep(1)  # prevent abuse :')

with open("february.json", "w") as outfile:
    json.dump(february_posts, outfile)

Análise inicial dos dados

Foram criados 935 posts em fevereiro.

Eu optei por remover os posts da newsletter do conjunto de dados, o que me deixou com 795 postagens criadas por usuários do fórum.

tabcoinscomments
count795.000000795.000000
mean3.3735855.596226
std7.52293313.093704
min-12.0000000.000000
25%1.0000001.000000
50%1.0000003.000000
75%3.0000006.000000
max82.000000301.000000
  • A metade das postagens (50%) não atinge mais de três comentários.
  • Três quartos das postagens (75%) não atinge 3 tabcoins!
  • Total de tabcoins recebidos: 2682
  • Total de comentários realizados: 4449

Distribuição dos comentários

80% das postagens receberam ao menos um comentário.

Eu queria entender como ocorre essa distribuição, porque a média de comentários é relativamente alta (~5.6 por post), mas o desvio padrão é bem alto (~13).

Como não podemos ter posts negativos, isso indica que poucos posts recebem muitos comentários.

A forma que eu achei de entender essa relação foi agrupando os posts por número de comentários. Depois, multiplicando o número de posts agrupado pelo número de comentários, conseguimos ver quantos porcento do total esses posts representam.

Exemplo:

commentsnum_poststotal_commentspercent_postspercent_comments
30113010.136.77
841840.131.89
761760.131.71
711710.131.60
441440.130.99
431430.130.97

Aqui podemos ver que posts com 301 comentários ocorreram 1 única vez, e representam 6.7% do total de comentários realizados no mês todo.

Posts com muitos comentários ocorrem poucas vezes, por exemplo, apenas 1 post teve 84, 76, 71, 44, 43 comentários.

Vamos agrupar pela ocorrência pra entender como os posts populares impactam o conteúdo do site.

num_poststotal_postspercent_postspercent_commentscommentstotal_comments
1121.5618.20809809
2162.009.61214428
360.763.3750150
481.003.6040160
5101.264.2738190
18364.527.6919342
660.752.161696

Podemos interpretar essa tabela da seguinte forma: um total de doze posts teve um numero de comentários que ocorreu uma única vez (301 comentários, 84 comentários, 76 comentários..), o que representa 1.56% de todos os posts criados no mês.

Esses posts juntos somaram 18.20% dos comentários do mês, num total de 809 comentários.

Ou seja, 18.2% dos comentários ficaram acumulados em menos de 2% das postagens.

Esse acumulo de comentários pode ser visualizado plotando o percentual de posts pelo percentual de comentários.

Percentual de posts pelo percentual de comentários

Encontrando tags nas postagens

O Tabnews utiliza um sistema onde o pessoal taggeia seus posts manualmente, usando colchetes ou categoria: título do post.

Quais foram as tags mais utilizadas?

Pra responder essa pergunta, usei dois parâmetros.

  1. Tags com até duas palavras.

    Nesse caso, achei melhor usar um gráfico de barras para a visualização.

    Ocorrência de tags com até duas palavras

  2. Tags com apenas uma palavra

    Aqui foi interessante usar uma nuvem de palavras.

    Wordcloud com tags de uma palavra

Distribuição temporal das postagens

Primeiro, podemos visualizar a distribuição dos posts em função do dia da semana.

Distribuição dos posts por dia da semana

Temos um aumento nas postagens no meio da semana, e uma acalmada no fds... é como se a galera gostasse de usar o tabnews em horário de trabalho. Será?

Distribuição por dias da semana ao longo do mês

O user rafael comentou que uma boa forma de visualizar a interação na plataforma ao longo dos dias da semana é pela página de status.

Como ficaria esse gráfico sem as contribuições da Newsletter?

Quantidade de posts por dia do mês

Distribuição por horário do dia

No gráfico abaixo, eu separei apenas posts realizados em dia de semana, e fiz a distribuição em função da hora da postagem.

Distribuição dos posts por horário do dia

Conclusão

O post acabou ficando meio comprido :P Mas eu queria mostrar como uma quantidade limitada de dados (apenas um mês, contendo só títulos e horários) pode nos dar bastante informação sobre o perfil de postagem de uma comunidade.

Uma análise mais profunda pode estimar valores como:

  • o melhor horário para postagens (em termos de comentários recebidos)
  • as tags com maior receptividade pelos usuários
  • os assuntos com maior engajamento na plataforma

que são métricas poderosas e podem qualificar a audiência pra quem busca expandir seu público através do fórum.

Muito obrigado!

Carregando publicação patrocinada...
2

Sensacional o seu trabalho. Conseguiu mostrar diversas informações interessantes. Acredito ser comum um pequeno conjunto de posts obter a maior parte da atenção do público.

É interessante ver, todavia, que o número de posts tem sido bastante relevante!

2

Que trabalho legal. Essa distribuição que apresentou aqui não tem nada de anormal, na verdade é o esperado nesse tipo de plataforma, aonde o comportamento dos atores é independente (power-law). É o que o Taleb chama de "extremistão". Inclusive recomendo a leitura da "Lógica do Cisne Negro".
Se você fizer uma análise parecida no YouTube, ou em qualquer rede social, vai notar que os gráficos de distribuição serão bem parecidos com os que você apresentou aqui.

2

O horário do dia é interessante, mas pessoas que moram fora do pais postam e comentam em horários diferentes.
Ajuda, duvida e discussão sendo palavras que mostram existir uma série de juniors. Também um público alvo.
Ja o dia da semana me lembra os dados do LinkedIn.
De qqr forma espero que continue a nos mostrar essas análises, pois vai ser interessante ver im comparativo entres os meses.

1

Realmente fiquei na dúvida quanto ao horário das postagens por causa desse fator, mas do ponto de vista do "público tabnews" me pareceu fazer sentido.

Quanto ao dia da semana, achei interessante pois imaginava que fosse ter um pico no sábado, por exemplo. Acho que no fds a galera quer dar uma desintoxicada na tecnologia :).

Vou dar uma olhada nos dados do linkedin pra ver como eles apresentam, valeu.

2
1

Boa! Chegando em casa vou tentar mapear esses gráficos pros dia da semana, acho que vai agregar um panorama maneiro na distribuição horária dos posts.

2
2
2

Incrível! Antes de abrir tabnews hoje eu estava com o pensamento "como será que está indo o tabnews?" e por incrível que parece é o primeiro post que me aparece como se estivesse respondendo a pergunta que eu tinha me feito!

1

Muito boa análise, uma questão sou novo aqui e não encontrei onde realizar uma busco dentro do próprio site de conteúdos ?

Não sei se não tem ou ainda não foi implementado, ou esse não é o objetivo.

1

Boa tarde, Eliel!

Hoje ainda não é possível realizar uma busca dentro do próprio site, mas você pode pesquisar no Google seguindo esse padrão:
site:tabnews.com.br tema que você quer pesquisar

dessa forma, apenas páginas do TabNews irão aparecer. Funciona muito bem, já que a maioria das páginas são indexadas lá 👍

1
1
0