Habrastatistika: kako Habr živi brez geektimes

Hej Habr.

Ta članek je logično nadaljevanje ocene Najboljši članki Habra za leto 2018. In čeprav leta še ni konec, a kot veste, so se poleti pravila spremenila, zato je postalo zanimivo videti, ali to kaj vpliva.

Habrastatistika: kako Habr živi brez geektimes

Poleg dejanske statistike bo na voljo tudi posodobljena ocena člankov, pa tudi nekaj virov za tiste, ki jih zanima, kako deluje.

Za tiste, ki jih zanima, kaj se je zgodilo, nadaljevanje pod rezom. Tisti, ki jih zanima podrobnejša analiza razdelkov spletnega mesta, si lahko ogledate tudi naslednji del.

Surovi podatki

Ta ocena je neuradna in nimam notranjih podatkov. Kot lahko vidite, če pogledate naslovno vrstico brskalnika, imajo vsi članki na Habréju neprekinjeno oštevilčenje. Potem je stvar tehnike, samo v ciklu preberemo vse članke po vrsti (v eni niti in s premori, da ne obremenjujemo strežnika). Same vrednosti so bile pridobljene s preprostim razčlenjevalnikom Python (obstajajo viri tukaj) in shrani v datoteko csv, kot je ta:

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

Predelava

Za razčlenjevanje bomo uporabili Python, Pandas in Matplotlib. Kogar statistika ne zanima, lahko ta del preskoči in gre naravnost k člankom.

Najprej morate naložiti nabor podatkov v pomnilnik in izbrati podatke za želeno leto.

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)

Izkazalo se je, da je bilo za letošnje leto (čeprav še ni končano) v času pisanja objavljenih 12715 člankov. Za primerjavo, za celotno leto 2018 - 15904. Na splošno veliko - to je približno 43 člankov na dan (in to samo s pozitivno oceno, koliko člankov je skupno naloženih, ki so postali negativni ali izbrisani, po izpustih med identifikatorji lahko samo ugibamo ali približno ocenjujemo).

Iz nabora podatkov izberite zahtevana polja. Kot meritve bomo uporabili število ogledov, komentarjev, vrednosti ocen in število zaznamkov.

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

Zdaj so podatki dodani v nabor podatkov in jih lahko uporabimo. Združimo podatke po dnevih in vzemimo povprečne vrednosti.

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

Zdaj pa zabavni del, lahko pogledamo lestvice.

Poglejmo si število objav na Habréju v letu 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()

Rezultat je zanimiv. Kot vidite, je Habr med letom rahlo "klobasal". Ne poznam razloga.

Habrastatistika: kako Habr živi brez geektimes

Za primerjavo, leto 2018 izgleda nekoliko "bolj gladko":

Habrastatistika: kako Habr živi brez geektimes

Na splošno na lestvici nisem opazil drastičnega zmanjšanja števila objavljenih člankov v letu 2019. Še več, nasprotno, zdi se, da je od poletja celo nekoliko zrasel.

Me pa naslednja dva grafa malo bolj potrta.

Povprečno število ogledov na članek:

Habrastatistika: kako Habr živi brez geektimes

Povprečna ocena na članek:

Habrastatistika: kako Habr živi brez geektimes

Kot lahko vidite, se povprečno število ogledov med letom nekoliko zmanjša. To je mogoče razložiti z dejstvom, da iskalniki še niso indeksirali novih člankov in jih ni tako pogosto najti. Bolj nerazumljivo pa je znižanje povprečne ocene na članek. Občutek je, da bralci preprosto nimajo časa za ogled toliko člankov ali pa se ne ozirajo na ocene. Z vidika programa spodbujanja avtorjev je ta trend zelo neprijeten.

Mimogrede, v letu 2018 ni bilo tako in urnik je bolj ali manj izenačen.

Habrastatistika: kako Habr živi brez geektimes

Na splošno imajo lastniki virov o čem razmišljati.

A da ne govorimo o žalostnih stvareh. Na splošno lahko rečemo, da je Habr precej uspešno "preživel" poletne spremembe, število člankov na spletnem mestu pa se ni zmanjšalo.

Ocena

Zdaj pa pravzaprav ocena. Čestitke tistim, ki so se vključili. Naj vas še enkrat spomnim, da je ocena neuradna, morda sem kaj spregledal, in če bi kakšen članek vsekakor moral biti tukaj, pa ni, napišite, dodal ga bom ročno. Kot oceno uporabljam izračunano metriko, ki se mi zdi precej zanimiva.

Najboljši članki po številu ogledov

Najboljši članki glede na razmerje med ocenami in ogledi

Najbolj priljubljeni članki glede na razmerje med komentarji in ogledi

Najbolj kontroverzni članki

Najboljši članki po ocenah

Najboljši članki po številu zaznamkov

Najboljše po razmerju med zaznamki in ogledi

Najboljši članki po številu komentarjev

In končno, zadnji Antitop po številu nevšečkov

Uff. Imam še nekaj zanimivih izborov, a ne bom dolgočasil bralcev.

Zaključek

Pri oblikovanju ocene sem bil pozoren na dve točki, ki sta se zdeli zanimivi.

Prvič, navsezadnje je 60% vrha člankov žanra "geektimes". Ali jih bo naslednje leto manj in kako bo izgledal Habr brez člankov o pivu, vesolju, medicini in tako naprej - ne vem. Vsekakor bodo bralci kaj pogrešali. Pa poglejmo.

Drugič, zgornji del zaznamkov se je izkazal za nepričakovano visoke kakovosti. To je psihološko razumljivo, bralci morda ne bodo pozorni na oceno in če članek je potrebno, potem bo dodan med zaznamke. In tukaj je največja koncentracija uporabnih in resnih člankov. Mislim, da bi morali lastniki spletnih mest nekako razmisliti o povezavi med številom zaznamkov in programom nagrajevanja, če želijo povečati to posebno kategorijo člankov tukaj na Habréju.

Nekaj ​​podobnega. Upam, da je bilo informativno.

Seznam člankov se je izkazal za dolgega, no, verjetno je tako najboljše. Prijetno branje vsem.

Vir: www.habr.com

Dodaj komentar