Habrastatistics: jak Habr žije bez geektimes

Čau Habr.

Tento článek je logickým pokračováním hodnocení Nejlepší habrovské články za rok 2018. A ačkoli rok ještě neskončil, jak víte, v létě došlo ke změnám v pravidlech, proto bylo zajímavé sledovat, zda to něco ovlivnilo.

Habrastatistics: jak Habr žije bez geektimes

Kromě skutečných statistik bude poskytnuto aktualizované hodnocení článků a také nějaký zdrojový kód pro ty, které zajímá, jak to funguje.

Pro ty, které zajímá, co se stalo, je pokračování pod střihem. Kdo má zájem o podrobnější rozbor sekcí webu, může se také podívat další díl.

Počáteční data

Toto hodnocení je neoficiální a nemám žádné zasvěcené informace. Jak snadno zjistíte při pohledu do adresního řádku vašeho prohlížeče, všechny články na Habré mají průběžné číslování. Pak už jde o techniku, prostě čteme všechny články za sebou v cyklu (v jednom vlákně a s pauzami, abychom nezatížili server). Samotné hodnoty byly získány jednoduchým parserem v Pythonu (zdroje jsou k dispozici zde) a uložit do souboru csv něco takového:

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

Zpracování

Pro analýzu použijeme Python, Pandas a Matplotlib. Koho statistiky nezajímají, může tuto část přeskočit a přejít rovnou k článkům.

Nejprve je třeba načíst soubor dat do paměti a vybrat data pro požadovaný rok.

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)

Ukazuje se, že v letošním roce (ač ještě není dokončen) v době psaní tohoto článku vyšlo 12715 2018 článků. Pro srovnání za celý rok 15904 - 43. Obecně hodně - to je asi XNUMX článků za den (a to pouze s kladným hodnocením; kolik je celkem staženo článků, které byly negativní nebo byly smazány, lze jen hádat nebo hrubý odhad z mezer mezi identifikátory).

Vyberme potřebná pole z datové sady. Jako metriky použijeme počet zobrazení, komentáře, hodnoty hodnocení a počet záložek.

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

Nyní byla data přidána do datové sady a můžeme je používat. Seskupíme data podle dnů a vezmeme průměrné hodnoty.

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

Nyní je zajímavé, že se můžeme podívat na grafy.

Podívejme se na počet publikací o Habrém v roce 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()

Výsledek je zajímavý. Jak je vidět, Habr byl celý rok tak trochu „klobásem“. Důvod neznám.

Habrastatistics: jak Habr žije bez geektimes

Pro srovnání, rok 2018 vypadá trochu hladší:

Habrastatistics: jak Habr žije bez geektimes

Obecně jsem na grafu nezaznamenal žádný razantní pokles počtu publikovaných článků v roce 2019. Navíc se naopak zdá, že od léta dokonce mírně vzrostla.

Další dva grafy mě ale deprimují o něco víc.

Průměrný počet zobrazení na článek:

Habrastatistics: jak Habr žije bez geektimes

Průměrné hodnocení na článek:

Habrastatistics: jak Habr žije bez geektimes

Jak vidíte, průměrný počet zhlédnutí v průběhu roku mírně klesá. To lze vysvětlit tím, že nové články ještě nebyly indexovány vyhledávači a nenacházejí se tak často. Pokles průměrného hodnocení na článek je ale nepochopitelnější. Pocit je takový, že čtenáři buď prostě nemají čas procházet tolik článků, nebo nevěnují pozornost hodnocení. Z pohledu programu odměn pro autory je tento trend velmi nepříjemný.

To se mimochodem v roce 2018 nestalo a harmonogram je víceméně vyrovnaný.

Habrastatistics: jak Habr žije bez geektimes

Obecně platí, že majitelé zdrojů mají o čem přemýšlet.

Ale nemluvme o smutných věcech. Obecně lze říci, že Habr letní změny „přežil“ vcelku úspěšně a počet článků na webu neubýval.

Hodnocení

A teď vlastně hodnocení. Gratuluji těm, kteří se do toho pustili. Ještě jednou připomenu, že hodnocení je neoficiální, možná mi něco uniklo a pokud by tu nějaký článek určitě měl být, ale není, napište, doplním ručně. Jako hodnocení používám kalkulované metriky, což se myslím ukázalo jako docela zajímavé.

Nejlepší články podle počtu zobrazení

Nejlepší články podle poměru hodnocení a počtu zobrazení

Nejlepší články podle poměru komentářů a zobrazení

Top nejkontroverznější články

Nejlepší články podle hodnocení

Nejlepší články podle počtu záložek

Nahoru podle poměru záložek a zobrazení

Nejlepší články podle počtu komentářů

A nakonec poslední Antitop podle počtu nelíbí se mi

Fuj. Mám několik dalších zajímavých výběrů, ale nebudu čtenáře nudit.

Závěr

Při konstrukci hodnocení jsem věnoval pozornost dvěma bodům, které se mi zdály zajímavé.

Za prvé, 60 % top jsou články žánru „geektimes“. Jestli jich bude příští rok méně a jak bude Habr vypadat bez článků o pivu, vesmíru, medicíně atd., nevím. Rozhodně čtenáři o něco přijdou. Uvidíme.

Za druhé, nejlepší záložky se ukázaly být nečekaně vysoké kvality. To je psychologicky pochopitelné, čtenáři nemusí věnovat pozornost hodnocení, ale pokud článek je potřeba, pak bude přidán do vašich záložek. A právě zde je největší koncentrace užitečných a seriózních článků. Myslím, že by si majitelé stránek měli nějak promyslet souvislost mezi počtem záložek a programem odměn, pokud chtějí tuto konkrétní kategorii článků zde na Habré rozšířit.

Něco takového. Doufám, že to bylo informativní.

Seznam článků se ukázal být dlouhý, no, je to pravděpodobně k lepšímu. Příjemné čtení všem.

Zdroj: www.habr.com

Přidat komentář