Habrastatistics: como Habr vive sem geektimes

Oi Habr.

Este artigo é uma continuação lógica do ranking dos artigos da Best Habr para 2018 . E, embora o ano ainda não tenha terminado, mas como você sabe, no verão houve mudanças nas regras, consequentemente, ficou interessante ver se isso afetava alguma coisa.



Além das estatísticas em si, será fornecida uma classificação atualizada dos artigos, bem como alguns códigos-fonte para quem estiver interessado em como isso funciona.

Para aqueles que estão interessados ​​no que aconteceu, continuaram sob o corte. Quem estiver interessado em uma análise mais detalhada das seções do site também poderá ver a próxima parte .

Dados de origem


Esta classificação não é oficial e não tenho dados internos. Como é fácil ver, tendo consultado a barra de endereços do navegador, todos os artigos em Habré têm numeração de ponta a ponta. A seguir, é uma questão técnica, apenas lemos todos os artigos seguidos em um ciclo (em um thread e com pausas para não carregar o servidor). Os próprios valores foram obtidos por um simples analisador em Python (o código-fonte está aqui ) e armazenados em um arquivo csv aproximadamente deste tipo:

2019-08-11T22:36Z,https://habr.com/ru/post/463197/,"Blazor + MVVM = Silverlight , ",votes:11,votesplus:17,votesmin:6,bookmarks:40,views:5300,comments:73
2019-08-11T05:26Z,https://habr.com/ru/news/t/463199/," NASA ",votes:15,votesplus:15,votesmin:0,bookmarks:2,views:1700,comments:7


Processamento


Para análise, usaremos Python, Pandas e Matplotlib. Aqueles que não estão interessados ​​em estatística, podem pular esta parte e ir imediatamente aos artigos.

Primeiro, você precisa carregar o conjunto de dados na memória e selecionar os dados para o ano desejado.

 import pandas as pd import datetime import matplotlib.dates as mdates from matplotlib.ticker import FormatStrFormatter from pandas.plotting import register_matplotlib_converters df = pd.read_csv("habr.csv", sep=',', encoding='utf-8', error_bad_lines=True, quotechar='"', comment='#') dates = pd.to_datetime(df['datetime'], format='%Y-%m-%dT%H:%MZ') df['datetime'] = dates year = 2019 df = df[(df['datetime'] >= pd.Timestamp(datetime.date(year, 1, 1))) & (df['datetime'] < pd.Timestamp(datetime.date(year+1, 1, 1)))] print(df.shape) 

Acontece que, para este ano (embora ainda não tenha terminado), no momento da redação, 12715 artigos foram publicados. Para comparação, em todo o ano de 2018 - 15904. Em geral, muito - isso é cerca de 43 artigos por dia (e isso é apenas com uma classificação positiva, quantos artigos são baixados negativos ou excluídos, é possível adivinhar ou descobrir as omissões entre os identificadores).

Selecione os campos necessários no conjunto de dados. Como métricas, usaremos o número de visualizações, comentários, valores de classificação e o número de favoritos adicionados.

 def to_float(s): # "bookmarks:22" => 22.0 num = ''.join(i for i in s if i.isdigit()) return float(num) def to_int(s): # "bookmarks:22" => 22 num = ''.join(i for i in s if i.isdigit()) return int(num) def to_date(dt): return dt.date() date = dates.map(to_date, na_action=None) views = df["views"].map(to_int, na_action=None) bookmarks = df["bookmarks"].map(to_int, na_action=None) votes = df["votes"].map(to_float, na_action=None) votes_up = df["up"].map(to_float, na_action=None) votes_down = df["down"].map(to_float, na_action=None) comments = df["comments"].map(to_int, na_action=None) df['date'] = date df['views'] = views df['votes'] = votes df['bookmarks'] = bookmarks df['up'] = votes_up df['down'] = votes_down 

Agora, os dados foram adicionados ao conjunto de dados e podemos usá-los. Agrupe os dados por dia e calcule os valores médios.

 g = df.groupby(['date']) days_count = g.size().reset_index(name='counts') year_days = days_count['date'].values grouped = g.median().reset_index() grouped['counts'] = days_count['counts'] counts_per_day = grouped['counts'].values counts_per_day_avg = grouped['counts'].rolling(window=20).mean() view_per_day = grouped['views'].values view_per_day_avg = grouped['views'].rolling(window=20).mean() votes_per_day = grouped['votes'].values votes_per_day_avg = grouped['votes'].rolling(window=20).mean() bookmarks_per_day = grouped['bookmarks'].values bookmarks_per_day_avg = grouped['bookmarks'].rolling(window=20).mean() 

Agora, a parte divertida, podemos ver os gráficos.

Vamos ver o número de publicações sobre Habré em 2019.

 import matplotlib.pyplot as plt plt.rcParams["figure.figsize"] = (16, 8) fig, ax = plt.subplots() plt.bar(year_days, counts_per_day, label='Articles/day') plt.plot(year_days, counts_per_day_avg, 'g-', label='Articles avg/day') plt.xticks(rotation=45) ax.xaxis.set_major_formatter(mdates.DateFormatter("%d-%m-%Y")) ax.xaxis.set_major_locator(mdates.MonthLocator(interval=1)) plt.legend(loc='best') plt.tight_layout() plt.show() 

O resultado é interessante. Como você pode ver, Habr ligeiramente "salsicha" durante o ano. Eu não sei o motivo.



Para comparação, 2018 parece um pouco mais suave:



Em geral, não vi nenhuma redução drástica no número de artigos publicados em 2019 no gráfico. Além disso, pelo contrário, parece ter crescido um pouco desde o verão.

Mas os dois gráficos a seguir me deprimem um pouco mais.

Média de visualizações por artigo:



Classificação média por artigo:



Como você pode ver, o número médio de visualizações durante o ano é ligeiramente reduzido. Isso pode ser explicado pelo fato de que novos artigos ainda não foram indexados pelos mecanismos de pesquisa e não são encontrados com tanta frequência. Mas a diminuição na classificação média por artigo é mais incompreensível. A sensação é de que os leitores simplesmente não têm tempo para navegar por tantos artigos ou não prestam atenção às classificações. Do ponto de vista do programa de recompensa dos autores, essa tendência é muito desagradável.

A propósito, esse não foi o caso em 2018 e o cronograma é mais ou menos uniforme.



Em geral, os proprietários de recursos têm algo em que pensar.

Mas não vamos falar sobre coisas tristes. Em geral, podemos dizer que Habr "sobreviveu" ao verão muda com bastante sucesso e o número de artigos no site não diminuiu.

Classificação


Agora, na verdade, a classificação. Parabéns para quem o acertou. Deixe-me lembrá-lo mais uma vez de que a classificação não é oficial, talvez eu tenha perdido alguma coisa, e se algum artigo definitivamente estiver aqui, mas não estiver escrito, eu a adicionarei manualmente. Como classificação, uso métricas calculadas que, ao que me parece, se mostraram bastante interessantes.

Artigos mais vistos


Artigos principais sobre a proporção de classificações e visualizações


Artigos principais sobre a proporção de comentários e visualizações


Artigos mais controversos


Artigos mais votados


Top Bookmark Artigos


Relação de Favoritos de Topo por Vista


Artigos mais comentados


E, finalmente, o último anti-stop pelo número de antipatias


Uff. Tenho algumas amostras mais interessantes, mas não vou aborrecer os leitores.

Conclusão


Ao criar a classificação, chamei a atenção para dois pontos que pareciam interessantes.

Em primeiro lugar, afinal, 60% dos principais são artigos do gênero geektimes. Se haverá menos deles no próximo ano e como o Habr ficará sem artigos sobre cerveja, espaço, remédios e assim por diante - eu não sei. Os leitores definitivamente perderão algo. Vamos ver

Em segundo lugar, o topo dos favoritos acabou sendo inesperadamente de alta qualidade. Isso é psicologicamente compreensível, os leitores podem não prestar atenção à classificação e, se um artigo for necessário , eles o adicionarão aos favoritos. E aqui está apenas a maior concentração de artigos úteis e sérios. Penso que os proprietários do site devem considerar de alguma forma a relação entre o número de favoritos e o programa de incentivos, se quiserem aumentar essa categoria específica de artigos aqui no Habré.

Algo assim.Espero que tenha sido informativo.

A lista de artigos é longa, mas provavelmente é a melhor. Gostam de ler para todos.

Source: https://habr.com/ru/post/pt466963/


All Articles