Habrastatistika: kuidas Habr elab ilma geektimeesita

Tere Habr.

See artikkel on reitingu loogiline jätk Habri parimad artiklid 2018. aastal. Ja kuigi aasta pole veel läbi, aga teatavasti toimusid suvel reeglite muudatused, nii et huvitav oli vaadata, kas see ka midagi mõjutas.

Habrastatistika: kuidas Habr elab ilma geektimeesita

Lisaks tegelikule statistikale on seal ka artiklite uuendatud reiting ja mõned allikad neile, kes selle toimimise vastu huvi tunnevad.

Keda juhtunust huvitab, jätkus lõike all. Kes on huvitatud saidi osade täpsemast analüüsist, võib ka vaadata järgmine osa.

Toorandmed

See hinnang on mitteametlik ja mul ei ole siseringi andmeid. Nagu brauseri aadressiribalt vaadates on lihtne näha, on kõigil Habré artiklitel pidev nummerdamine. Siis on asi tehnikas, lihtsalt tsüklis loeme kõik artiklid järjest läbi (ühes lõimes ja pausidega, et serverit mitte koormata). Väärtused ise saadi lihtsa Pythoni parseri abil (allikad on olemas siin) ja salvestatakse sellisesse csv-faili:

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

Töötlemine

Parsimiseks kasutame Pythonit, Pandast ja Matplotlibi. Need, keda statistika ei huvita, võivad selle osa vahele jätta ja minna otse artiklite juurde.

Esmalt tuleb andmestik mällu laadida ja valida soovitud aasta andmed.

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)

Selgub, et käesoleval aastal on ilmunud 12715 2018 artiklit (kuigi see pole veel lõppenud) kirjutamise hetkel. Võrdluseks kogu 15904. aasta kohta - 43. Üldiselt palju - see on umbes XNUMX artiklit päevas (ja see on ainult positiivse hinnanguga, kui palju artikleid kokku laaditakse, mis on läinud negatiivseks või on kustutatud, saab ainult oletada või umbkaudselt hinnata identifikaatorite väljajätmise põhjal).

Valige andmekogumist nõutavad väljad. Mõõdikutena kasutame vaatamiste arvu, kommentaare, hinnangute väärtusi ja järjehoidjate arvu.

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

Nüüd on andmed andmekogumisse lisatud ja saame neid kasutada. Rühmitame andmed päevade kaupa ja võtame keskmised väärtused.

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

Nüüd on lõbus osa, saame vaadata graafikuid.

Vaatame Habré väljaannete arvu 2019. aastal.

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

Tulemus on huvitav. Nagu näha, oli Habr aasta jooksul kergelt "vorst". Ma ei tea põhjust.

Habrastatistika: kuidas Habr elab ilma geektimeesita

Võrdluseks, 2018. aasta näeb veidi "siledam" välja:

Habrastatistika: kuidas Habr elab ilma geektimeesita

Üldiselt ei näinud ma 2019. aastal avaldatud artiklite arvu drastilist langust edetabelis. Pealegi, vastupidi, tundub, et see on suvest saadik isegi veidi kasvanud.

Kuid järgmised kaks graafikut masendavad mind veidi rohkem.

Keskmine vaatamiste arv artikli kohta:

Habrastatistika: kuidas Habr elab ilma geektimeesita

Keskmine hinnang artikli kohta:

Habrastatistika: kuidas Habr elab ilma geektimeesita

Nagu näha, väheneb aasta keskmine vaatamiste arv veidi. Seda võib seletada sellega, et uusi artikleid pole otsingumootorid veel indekseerinud ja neid ei leita ka nii sageli. Aga arusaamatum on keskmise hinnangu langus artikli kohta. Selline tunne on, et lugejatel kas lihtsalt pole aega nii palju artikleid vaadata või ei pööra nad hinnangutele tähelepanu. Autori ergutusprogrammi seisukohalt on see trend väga ebameeldiv.

Muide, 2018. aastal see nii ei olnud ja graafik on enam-vähem ühtlane.

Habrastatistika: kuidas Habr elab ilma geektimeesita

Üldiselt on ressursside omanikel, mille üle mõelda.

Aga kurbadest asjadest ärme räägi. Üldjoontes võib öelda, et Habr elas suvised muudatused päris edukalt üle ning artiklite arv saidil pole vähenenud.

Hinnang

Nüüd tegelikult hinnang. Õnnitlused neile, kes sinna sattusid. Tuletan veel kord meelde, et hinnang on mitteametlik, võib-olla jäi mul midagi kahe silma vahele ja kui mõni artikkel peaks kindlasti siin olema, aga ei ole, siis kirjutage, lisan käsitsi. Hindamiseks kasutan arvutatud mõõdikuid, mis osutusid minu arvates päris huvitavaks.

Populaarseimad artiklid vaatamiste arvu järgi

Populaarseimad artiklid hinnangute ja vaatamiste suhte järgi

Populaarseimad artiklid kommentaaride ja vaatamiste suhte järgi

Kõige vastuolulisemad artiklid

Populaarseimad artiklid reitingu järgi

Populaarseimad artiklid järjehoidjate arvu järgi

Üleval järjehoidjate ja vaatamiste suhte järgi

Populaarseimad artiklid kommentaaride arvu järgi

Ja lõpuks viimane Antitop mittemeeldimiste arvu järgi

Uff. Mul on veel paar huvitavat valikut, aga ma ei tüüta lugejaid.

Järeldus

Reitingut koostades pöörasin tähelepanu kahele punktile, mis tundusid huvitavad.

Esiteks on ju 60% tippudest "geektimesi" žanri artiklid. Kas neid on järgmisel aastal vähem ja kuidas hakkab Habr välja nägema ilma õlle, kosmose, meditsiini jms artikliteta - ma ei tea. Kindlasti jäävad lugejad millestki ilma. Vaatame.

Teiseks osutus ootamatult kvaliteetseks järjehoidja top. See on psühholoogiliselt arusaadav, lugejad ei pruugi reitingule ja artiklile tähelepanu pöörata on vaja, siis lisatakse see järjehoidjatesse. Ja siin on kõige suurem kasulike ja tõsiste artiklite kontsentratsioon. Arvan, et saidiomanikud peaksid kuidagi mõtlema järjehoidjate arvu ja preemiaprogrammi vahelisele seosele, kui nad soovivad seda konkreetset artiklite kategooriat siin Habré lehel suurendada.

Midagi sellist. Loodan, et see oli informatiivne.

Artiklite nimekiri osutus pikaks, noh, see on ilmselt parim. Head lugemist kõigile.

Allikas: www.habr.com

Lisa kommentaar