Хабрастатыстыка: як жыве Хабр без geektimes

Прывітанне, Хабр.

Дадзены артыкул з'яўляецца лагічным працягам рэйтынгу Лепшых артыкулаў Хабра за 2018 год. І хоць год яшчэ не скончыўся, але як вядома, улетку адбыліся змены ў правілах, адпаведна стала цікава паглядзець, ці паўплывала гэта на што-небудзь.

Хабрастатыстыка: як жыве Хабр без geektimes

Акрамя ўласна статыстыкі, будзе прыведзены і абноўлены рэйтынг артыкулаў, а таксама крыху зыходнікаў для тых каму цікава, як гэта працуе.

Для тых, каму цікава што атрымалася, працяг пад катом. Тыя, каму цікавы больш падрабязны аналіз раздзелаў сайта, могуць таксама паглядзець наступную частку.

Зыходныя дадзеныя

Гэты рэйтынг неафіцыйны, і ніякіх інсайдэрскіх дадзеных у мяне няма. Як няцяжка бачыць, паглядзеўшы ў адрасны радок браўзэра, усе артыкулы на Хабры маюць скразную нумарацыю. Далей справа тэхнікі, проста ў цыкле чытаем усе артыкулы запар (у адну плынь і з паўзамі, каб не нагружаць сервер). Самі значэнні былі атрыманы нескладаным парсерам на Python (зыходнікі ёсць тут) і захаваны ў csv-файле прыкладна такога выгляду:

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

Апрацоўка

Для парсінгу мы будзем выкарыстоўваць Python, Pandas і Matplotlib. Тыя каму статыстыка нецікавая, гэтую частку могуць прапусціць і адразу перайсці да артыкулаў.

Спачатку трэба загрузіць датасет у памяць і вылучыць дадзеныя за патрэбны год.

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)

Аказваецца, за гэты год (хоць ён яшчэ не скончаны) на момант напісання тэксту было апублікавана 12715 артыкулаў. Для параўнання, за ўвесь 2018-ы — 15904. Увогуле, нямала — гэта прыкладна 43 артыкулы ў дзень (і гэта толькі са станоўчым рэйтынгам, колькі загружаецца ўсяго артыкулаў, якія пайшлі ў мінус або былі выдалены, можна толькі гадаць ці прыкладна прыкінуць па пропусках сярод ідэнтыфікатараў).

Вылучым з датасета неабходныя палі. У якасці метрык мы будзем выкарыстоўваць колькасць праглядаў, каментароў, значэнні рэйтынгу і колькасці дадання ў закладкі.

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

Цяпер дадзеныя дададзены ў датасет, і мы можам іх выкарыстоўваць. Згрупуем дадзеныя па днях і возьмем асераднёныя значэнні.

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

Цяпер самае цікавае, мы можам паглядзець на графікі.

Паглядзім колькасць публікацый на Хабры ў 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()

Вынік цікавы. Як можна бачыць, Хабр на працягу года злёгку «каўбасіла». Прычыны я не ведаю.

Хабрастатыстыка: як жыве Хабр без geektimes

Для параўнання, 2018 выглядае некалькі «раўнейшым»:

Хабрастатыстыка: як жыве Хабр без geektimes

У цэлым, якога-небудзь кардынальнага памяншэння колькасці артыкулаў, якія публікуюцца ў 2019-м, я на графіцы не ўбачыў. Больш за тое, наадварот, яно з лета падобна нават крыху вырасла.

Але вось наступныя два графікі засмучаюць мяне крыху больш.

Сярэдняя колькасць праглядаў на артыкул:

Хабрастатыстыка: як жыве Хабр без geektimes

Сярэдні рэйтынг на артыкул:

Хабрастатыстыка: як жыве Хабр без geektimes

Як можна бачыць, сярэдняя колькасць праглядаў на працягу года крыху зніжаецца. Гэта можна растлумачыць тым, што новыя артыкулы яшчэ не праіндэксаваныя пашукавікамі, і іх знаходзяць не так часта. А вось зніжэнне сярэдняга рэйтынгу на артыкул больш незразумелае. Адчуванне такое, што чытачы ці проста не паспяваюць праглядаць такую ​​колькасць артыкулаў ці не зважаюць на рэйтынгі. З пункту гледжання праграмы заахвочвання аўтараў, гэтая тэндэнцыя вельмі непрыемная.

Дарэчы, у 2018 г. такога не было, і графік больш-менш роўны.

Хабрастатыстыка: як жыве Хабр без geektimes

Увогуле, уладальнікам рэсурса ёсць над чым падумаць.

Але не будзем аб сумным. У цэлым можна сказаць, што летнія змены Хабр "перажыў" цалкам паспяхова, і колькасць артыкулаў на сайце не скарацілася.

Рэйтынг

Цяпер уласна, рэйтынг. Віншую тых, хто ў яго патрапіў. Яшчэ раз нагадаю, што рэйтынг неафіцыйны, магчыма я нешта выпусціў, і калі нейкі артыкул тут сапраўды павінен быць, а яго няма, пішыце, дадам уручную. У якасці рэйтынгу я выкарыстоўваю разлічаныя метрыкі, якія як мне здаецца, атрымаліся дастаткова цікавымі.

Топ артыкулаў па колькасці праглядаў

Топ артыкулаў па суадносінах рэйтынгу да праглядаў

Топ артыкулаў па суадносінах каментароў да праглядаў

Топ самых спрэчных артыкулаў

Топ артыкулаў па рэйтынгу

Топ артыкулаў па колькасці дадання ў закладкі

Топ па суадносінах дадання ў закладкі да праглядаў

Топ артыкулаў па колькасці каментароў

І нарэшце, апошні Антытоп па колькасці дызлайкаў

Уф. У мяне ёсць яшчэ некалькі цікавых выбарак, але не буду стамляць чытачоў.

Заключэнне

Пры пабудове рэйтынгу я звярнуў увагу на два моманты, якія падаліся цікавымі.

Па-першае, усё ж такі 60% топа - гэта артыкулы жанру «geektimes». Ці будзе іх менш у наступным годзе, і як будзе Хабр выглядаць без артыкулаў пра піва, космас, медыцыну і іншае - я не ведаю. Вызначана, чытачы нешта страцяць. Пабачым.

Па-другое, нечакана якасным аказаўся топ па закладках. Гэта псіхалагічна зразумела, на рэйтынг чытачы могуць і не звярнуць увагу, а калі артыкул патрэбна, то ў закладкі яе дададуць. І тут якраз найбольшая канцэнтрацыя карысных і сур'ёзных артыкулаў. Думаю, уладальнікам сайта варта неяк прадумаць сувязь колькасці даданняў у закладкі з праграмай заахвочвання, калі яны жадаюць павелічэнні менавіта гэтай катэгорыі артыкулаў тут на Хабры.

Неяк так. Спадзяюся, было пазнавальна.

Спіс артыкулаў атрымаўся доўгі, ну яно напэўна і да лепшага. Усім прыемнага чытання.

Крыніца: habr.com

Дадаць каментар