Habrastatistics: كيف يعيش Habr بدون geektimes

يا هبر.

هذه المقالة هي استمرار منطقي للتصنيف أفضل مقالات الهبر لعام 2018. وعلى الرغم من أن العام لم ينته بعد، كما تعلمون، فقد حدثت تغييرات في القواعد في الصيف، وبالتالي، أصبح من المثير للاهتمام معرفة ما إذا كان هذا يؤثر على أي شيء.

Habrastatistics: كيف يعيش Habr بدون geektimes

بالإضافة إلى الإحصائيات الفعلية، سيتم توفير تصنيف محدث للمقالات، بالإضافة إلى بعض كود المصدر لأولئك المهتمين بكيفية عمله.

بالنسبة لأولئك الذين يهتمون بما حدث، فإن الاستمرار قيد الخفض. يمكن لأولئك المهتمين بتحليل أكثر تفصيلاً لأقسام الموقع الاطلاع أيضًا الجزء التالي.

البيانات الأولية

هذا التصنيف غير رسمي، وليس لدي أي معلومات داخلية. كما يمكنك أن ترى بسهولة من خلال النظر إلى شريط العناوين في متصفحك، فإن جميع المقالات الموجودة على حبري لها ترقيم مستمر. ثم إنها مسألة تقنية، فنحن ببساطة نقرأ جميع المقالات المتتالية في دورة (في موضوع واحد ومع توقفات مؤقتة، حتى لا يتم تحميل الخادم). تم الحصول على القيم نفسها بواسطة محلل بسيط في بايثون (المصادر متاحة هنا) وحفظها في ملف CSV بشيء من هذا القبيل:

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

تحويل

للتحليل سوف نستخدم Python وPandas وMatplotlib. يمكن لأولئك الذين لا يهتمون بالإحصائيات تخطي هذا الجزء والانتقال مباشرة إلى المقالات.

تحتاج أولاً إلى تحميل مجموعة البيانات في الذاكرة وتحديد البيانات للسنة المطلوبة.

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

والنتيجة مثيرة للاهتمام. كما ترون، كان الهبر عبارة عن "نقانق" صغيرة طوال العام. لا أعرف السبب.

Habrastatistics: كيف يعيش Habr بدون geektimes

وعلى سبيل المقارنة، يبدو عام 2018 أكثر سلاسة قليلاً:

Habrastatistics: كيف يعيش Habr بدون geektimes

بشكل عام، لم أرى أي انخفاض كبير في عدد المقالات المنشورة عام 2019 على الرسم البياني. علاوة على ذلك، على العكس من ذلك، يبدو أنها زادت قليلاً منذ الصيف.

لكن الرسمين البيانيين التاليين يضايقني أكثر قليلاً.

متوسط ​​عدد المشاهدات لكل مقال:

Habrastatistics: كيف يعيش Habr بدون geektimes

متوسط ​​التقييم لكل مقالة:

Habrastatistics: كيف يعيش Habr بدون geektimes

كما ترون، فإن متوسط ​​عدد مرات المشاهدة ينخفض ​​قليلاً على مدار العام. يمكن تفسير ذلك من خلال حقيقة أن المقالات الجديدة لم تتم فهرستها بعد بواسطة محركات البحث، ولا يتم العثور عليها كثيرًا. لكن الانخفاض في متوسط ​​التصنيف لكل مقالة أمر غير مفهوم. الشعور هو أن القراء إما ببساطة ليس لديهم الوقت لتصفح العديد من المقالات أو لا يهتمون بالتقييمات. من وجهة نظر برنامج مكافأة المؤلف، فإن هذا الاتجاه غير سار للغاية.

بالمناسبة، هذا لم يحدث في عام 2018، والجدول الزمني أكثر أو أقل.

Habrastatistics: كيف يعيش Habr بدون geektimes

بشكل عام، أصحاب الموارد لديهم شيء للتفكير فيه.

لكن دعونا لا نتحدث عن الأشياء المحزنة. بشكل عام، يمكننا القول أن حبر "نجا" من تغييرات الصيف بنجاح كبير، ولم ينخفض ​​عدد المقالات على الموقع.

تصنيف

الآن، في الواقع، التصنيف. هنيئاً لمن دخلها. اسمحوا لي أن أذكرك مرة أخرى أن التصنيف غير رسمي، ربما فاتني شيء ما، وإذا كان من المؤكد أن بعض المقالات يجب أن تكون هنا، ولكنها ليست كذلك، فاكتب، سأضيفها يدويا. كتقييم، أستخدم المقاييس المحسوبة، والتي أعتقد أنها كانت مثيرة للاهتمام للغاية.

أهم المقالات حسب عدد المشاهدات

أهم المقالات حسب التصنيف إلى نسبة المشاهدات

أهم المقالات حسب نسبة التعليقات إلى المشاهدات

أعلى المقالات الأكثر إثارة للجدل

أهم المقالات حسب التصنيف

أهم المقالات حسب عدد الإشارات المرجعية

الأعلى حسب نسبة الإشارات المرجعية إلى المشاهدات

أهم المقالات حسب عدد التعليقات

وأخيرا، الأخير Antitop حسب عدد مرات عدم الإعجاب

قرف. لدي بعض الاختيارات الأكثر إثارة للاهتمام، لكنني لن أضجر القراء.

اختتام

عند إنشاء التصنيف، انتبهت إلى نقطتين بدت مثيرة للاهتمام.

أولاً، 60% من المقالات الأعلى عبارة عن مقالات من نوع "geektimes". لا أعرف ما إذا كان سيكون هناك عدد أقل منها في العام المقبل، وكيف ستبدو حبر بدون مقالات عن البيرة والفضاء والطب وما إلى ذلك. من المؤكد أن القراء سيخسرون شيئًا ما. دعنا نرى.

ثانيا، تبين أن الإشارات المرجعية العليا ذات جودة عالية بشكل غير متوقع. وهذا أمر مفهوم من الناحية النفسية، فقد لا ينتبه القراء إلى التصنيف، ولكن إذا كان المقال هناك حاجة، ثم ستتم إضافته إلى إشاراتك المرجعية. وهنا على وجه التحديد أكبر تركيز للمقالات المفيدة والخطيرة. أعتقد أنه يجب على مالكي الموقع أن يفكروا بطريقة ما في العلاقة بين عدد الإشارات المرجعية وبرنامج المكافآت إذا كانوا يريدون زيادة هذه الفئة المحددة من المقالات هنا على حبري.

شيء من هذا القبيل. آمل أن تكون مفيدة.

تبين أن قائمة المقالات طويلة، حسنًا، ربما تكون للأفضل. قراءة سعيدة للجميع.

المصدر: www.habr.com

إضافة تعليق