Һабрастатистика: како Һабр живи без геектимеа

Хеј Хабр.

Овај чланак је логичан наставак рејтинга Најбољи Хабр чланци за 2018. И иако година још није готова, као што знате, у лето је дошло до промена у правилима, па је постало занимљиво видети да ли је ово на било шта утицало.

Һабрастатистика: како Һабр живи без геектимеа

Поред стварне статистике, биће обезбеђена ажурирана оцена чланака, као и неки изворни код за оне које занима како то функционише.

За оне које занима шта се десило, наставак је испод реза. Они који су заинтересовани за детаљнију анализу делова сајта такође могу погледати следећи део.

Необрађени подаци

Ова оцена је незванична, а ја немам инсајдерске информације. Као што можете лако да видите гледајући у адресну траку вашег претраживача, сви чланци на Хабреју имају континуирано нумерисање. Онда је ствар технике, ми једноставно читамо све чланке редом у петљи (у једној нити и са паузама, да не бисмо учитавали сервер). Саме вредности су добијене једноставним парсером у Питхон-у (извори су доступни овде) и сачували у цсв датотеци отприлике овако:

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

Прерада

За рашчлањивање користићемо Питхон, Пандас и Матплотлиб. Они које не занима статистика могу прескочити овај део и прећи директно на чланке.

Прво морате учитати скуп података у меморију и одабрати податке за жељену годину.

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

Резултат је занимљив. Као што видите, Хабр је био мала "кобасица" током целе године. Не знам разлог.

Һабрастатистика: како Һабр живи без геектимеа

Поређења ради, 2018. изгледа мало глаткије:

Һабрастатистика: како Һабр живи без геектимеа

Генерално, на графикону нисам видео драстичан пад броја објављених чланака у 2019. Штавише, напротив, чини се да се чак и незнатно повећао од лета.

Али следећа два графикона ме мало више депримирају.

Просечан број прегледа по чланку:

Һабрастатистика: како Һабр живи без геектимеа

Просечна оцена по чланку:

Һабрастатистика: како Һабр живи без геектимеа

Као што видите, просечан број прегледа се незнатно смањује током године. Ово се може објаснити чињеницом да нови чланци још нису индексирани од стране претраживача и не налазе се тако често. Али пад просечне оцене по чланку је више несхватљив. Осећај је да читаоци или једноставно немају времена да прегледају толико чланака или не обраћају пажњу на оцене. Са становишта програма награђивања аутора, овај тренд је веома непријатан.

Иначе, 2018. године то се није догодило, а распоред је мање-више уједначен.

Һабрастатистика: како Һабр живи без геектимеа

Генерално, власници ресурса имају о чему да размишљају.

Али да не причамо о тужним стварима. Генерално, можемо рећи да је Хабр прилично успешно „преживео“ летње промене, а број чланака на сајту се није смањио.

Оцењивање

Сада, заправо, рејтинг. Честитам онима који су у то ушли. Још једном да вас подсетим да је оцена незванична, можда сам нешто пропустио, а ако би неки чланак свакако требало да буде овде, а није, напишите, додаћу ручно. Као оцену користим израчунате метрике, за које мислим да су се показале прилично интересантне.

Најпопуларнији чланци по броју прегледа

Најпопуларнији чланци према односу оцена и прегледа

Најбољи чланци према односу коментара и прегледа

Најконтроверзнији чланци

Најбољи чланци по рејтингу

Најпопуларнији чланци по броју обележивача

Врх према односу обележивача и приказа

Најпопуларнији чланци по броју коментара

И коначно, последњи Антитоп по броју несвиђања

Уф. Имам још неколико занимљивих избора, али нећу досадити читаоцима.

Закључак

Приликом конструисања рејтинга, обратио сам пажњу на две тачке које су се чиниле интересантним.

Прво, 60% врха су чланци жанра „геектимес“. Да ли ће их следеће године бити мање и како ће Хабр изгледати без чланака о пиву, свемиру, медицини итд., не знам. Дефинитивно ће читаоци нешто изгубити. Хајде да видимо.

Друго, испоставило се да су врхунски обележивачи неочекивано високог квалитета. Ово је психолошки разумљиво, читаоци можда не обраћају пажњу на оцену, али ако је чланак нужна, онда ће бити додат у ваше обележиваче. И ту је управо највећа концентрација корисних и озбиљних чланака. Мислим да би власници сајтова требало некако да размисле о вези између броја обележивача и програма награђивања ако желе да повећају ову конкретну категорију чланака овде на Хабреу.

Овако нешто. Надам се да је било информативно.

Испоставило се да је списак чланака дугачак, па, вероватно је на боље. Срећно читање свима.

Извор: ввв.хабр.цом

Додај коментар