Хабрастатистика: як живе Хабр без 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. Загалом, чимало — це приблизно XNUMX статті на день (і це тільки з позитивним рейтингом, скільки завантажується всього статей, які пішли в мінус або були видалені, можна тільки ворожити або приблизно прикинути за перепустками серед ідентифікаторів).

Виділимо з датасету потрібні поля. Як метрик ми будемо використовувати кількість переглядів, коментарів, значення рейтингу та кількості додавань до закладок.

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

Додати коментар або відгук