Habrastatistika: kako Habr živi bez geektimea

Hej Habr.

Ovaj članak je logičan nastavak ocjene Najbolji članci Habra za 2018. I iako godina još nije gotova, ali kao što znate, na ljeto je došlo do promjena u pravilima, pa je postalo zanimljivo vidjeti hoće li to utjecati na nešto.

Habrastatistika: kako Habr živi bez geektimea

Pored stvarne statistike, biće i ažurirana ocjena članaka, kao i neki izvori za one koje zanima kako to funkcionira.

Za one koje zanima šta se desilo, nastavak ispod. Oni koji su zainteresovani za detaljniju analizu sekcija sajta takođe mogu pogledati sljedeći dio.

Sirovi podaci

Ova ocjena je nezvanična i nemam insajderske podatke. Kao što je lako vidjeti ako pogledate adresnu traku pretraživača, svi članci na Habréu imaju kontinuiranu numeraciju. Onda je stvar tehnike, samo u ciklusu čitamo sve članke redom (u jednoj temi i sa pauzama da ne učitavamo server). Same vrijednosti su dobijene jednostavnim Python parserom (postoje izvori ovdje) i sačuvan u csv fajlu ovako:

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

Obrada

Za raščlanjivanje ćemo koristiti Python, Pandas i Matplotlib. Oni koje ne zanimaju statistike mogu preskočiti ovaj dio i preći direktno na članke.

Prvo morate učitati skup podataka u memoriju i odabrati podatke za željenu godinu.

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)

Ispostavilo se da je ove godine (iako još nije završena) u vrijeme pisanja objavljeno 12715 članaka. Poređenja radi, za cijelu 2018. - 15904. Generalno, puno - ovo je oko 43 članka dnevno (i to samo uz pozitivnu ocjenu, koliko je ukupno učitano članaka koji su postali negativni ili su izbrisani, može se samo nagađati ili grubo procjenjivati ​​po propustima među identifikatorima).

Izaberite potrebna polja iz skupa podataka. Kao metriku koristit ćemo broj pregleda, komentara, vrijednosti ocjena i broj oznaka.

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

Sada su podaci dodani u skup podataka i možemo ih koristiti. Grupirajmo podatke po danima i uzmimo prosječne vrijednosti.

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

Sada zabavni dio, možemo pogledati grafikone.

Pogledajmo broj publikacija na Habréu u 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 zanimljiv. Kao što vidite, Habr je tokom godine bio malo "kobasican". Ne znam razlog.

Habrastatistika: kako Habr živi bez geektimea

Poređenja radi, 2018. izgleda malo "glađe":

Habrastatistika: kako Habr živi bez geektimea

Generalno, nisam vidio drastičan pad broja objavljenih članaka u 2019. na grafikonu. Štaviše, naprotiv, čak se čini da je malo porastao od ljeta.

Ali sljedeća dva grafikona me malo više deprimiraju.

Prosječan broj pregleda po članku:

Habrastatistika: kako Habr živi bez geektimea

Prosječna ocjena po članku:

Habrastatistika: kako Habr živi bez geektimea

Kao što vidite, prosječan broj pregleda tokom godine je neznatno smanjen. To se može objasniti činjenicom da novi članci još nisu indeksirani od strane pretraživača i ne nalaze se tako često. Ali smanjenje prosječne ocjene po članku je više neshvatljivo. Osjećaj je da čitatelji ili jednostavno nemaju vremena da pogledaju toliko članaka ili ne obraćaju pažnju na ocjene. Sa stanovišta programa ohrabrivanja autora, ovaj trend je vrlo neprijatan.

Inače, 2018. godine to nije bio slučaj, a raspored je manje-više ujednačen.

Habrastatistika: kako Habr živi bez geektimea

Generalno, vlasnici resursa imaju o čemu razmišljati.

Ali hajde da ne pričamo o tužnim stvarima. Generalno, možemo reći da je Habr prilično uspješno “preživio” ljetne promjene, a broj članaka na stranici se nije smanjio.

Ocena

Sada, zapravo, rejting. Čestitam onima koji su se uključili u to. Još jednom da podsjetim da je ocjena nezvanična, možda sam nešto propustio, a ako bi neki članak svakako trebao biti ovdje, ali nije, napišite, dodaću ga ručno. Kao ocjenu koristim izračunate metrike za koje mislim da su se pokazale prilično interesantne.

Najpopularniji članci po broju pregleda

Najpopularniji članci prema omjeru ocjena i pregleda

Najbolji članci prema omjeru komentara i pregleda

Najkontroverzniji članci

Najbolji članci po rejtingu

Najpopularniji članci po broju oznaka

Vrh prema omjeru oznaka i pregleda

Najpopularniji članci po broju komentara

I konačno, posljednje Antitop po broju dislajkova

Uff. Imam još nekoliko zanimljivih izbora, ali neću dosaditi čitaocima.

zaključak

Prilikom konstruisanja rejtinga, obratio sam pažnju na dve tačke koje su se činile interesantnim.

Prvo, na kraju krajeva, 60% topova su članci žanra “geektimes”. Da li će ih sledeće godine biti manje i kako će Habr izgledati bez tekstova o pivu, svemiru, medicini i tako dalje - ne znam. Definitivno, čitaocima će nešto nedostajati. da vidimo.

Drugo, vrh bookmarka se pokazao neočekivano visokog kvaliteta. Ovo je psihološki razumljivo, čitaoci možda neće obratiti pažnju na ocjenu, a ako i članak je potrebno, tada će biti dodan u markere. A ovdje je samo najveća koncentracija korisnih i ozbiljnih članaka. Mislim da bi vlasnici sajtova trebali nekako razmisliti o vezi između broja oznaka i programa nagrađivanja ako žele povećati ovu konkretnu kategoriju članaka ovdje na Habréu.

Ovako nešto. Nadam se da je bilo informativno.

Lista članaka se pokazala dugačkom, pa, vjerovatno je tako i najbolje. Sretno čitanje svima.

izvor: www.habr.com

Dodajte komentar