Habrastatistics: kuchunguza sehemu nyingi na zisizotembelewa sana za tovuti

Habari Habr.

Π’ sehemu iliyopita Trafiki ya Habr ilichambuliwa kulingana na vigezo kuu - idadi ya vifungu, maoni yao na makadirio. Walakini, suala la umaarufu wa sehemu za tovuti lilibaki bila kuchunguzwa. Ilikuwa ya kuvutia kuangalia hili kwa undani zaidi na kupata vibanda maarufu zaidi na visivyojulikana zaidi. Hatimaye, nitaangalia athari za geektimes kwa undani zaidi, na kumalizia na uteuzi mpya wa makala bora kulingana na nafasi mpya.

Habrastatistics: kuchunguza sehemu nyingi na zisizotembelewa sana za tovuti

Kwa wale ambao wana nia ya kile kilichotokea, kuendelea ni chini ya kukata.

Acha nikukumbushe tena kwamba takwimu na makadirio sio rasmi, sina habari yoyote ya ndani. Pia haijahakikishiwa kuwa sikufanya makosa mahali fulani au kukosa kitu. Lakini bado, nadhani iligeuka kuvutia. Tutaanza na msimbo kwanza; wale ambao hawapendi hii wanaweza kuruka sehemu za kwanza.

Mkusanyiko wa data

Katika toleo la kwanza la kichanganuzi, ni idadi tu ya maoni, maoni na makadirio ya makala yalizingatiwa. Hii tayari ni nzuri, lakini haikuruhusu kufanya maswali magumu zaidi. Ni wakati wa kuchambua sehemu za mada za tovuti; hii itawawezesha kufanya utafiti wa kuvutia kabisa, kwa mfano, angalia jinsi umaarufu wa sehemu ya "C ++" imebadilika zaidi ya miaka kadhaa.

Kichanganuzi cha makala kimeboreshwa, sasa kinarejesha vibanda ambavyo makala hiyo ni mali, pamoja na jina la utani la mwandishi na ukadiriaji wake (mambo mengi ya kuvutia yanaweza kufanywa hapa, pia, lakini hiyo itakuja baadaye). Data imehifadhiwa katika faili ya csv ambayo inaonekana kama hii:

2018-12-18T12:43Z,https://habr.com/ru/post/433550/,"ΠœΠ΅ΡΡΠ΅Π½Π΄ΠΆΠ΅Ρ€ Slack β€” ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ Π²Ρ‹Π±ΠΎΡ€Π°, косяки ΠΏΡ€ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠΈ ΠΈ особСнности сСрвиса, ΠΎΠ±Π»Π΅Π³Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ Тизнь",votes:7,votesplus:8,votesmin:1,bookmarks:32,
views:8300,comments:10,user:ReDisque,karma:5,subscribers:2,hubs:productpm+soft
...

Tutapokea orodha ya vitovu vya mada kuu vya tovuti.

def get_as_str(link: str) -> Str:
    try:
        r = requests.get(link)
        return Str(r.text)
    except Exception as e:
        return Str("")

def get_hubs():
    hubs = []
    for p in range(1, 12):
        page_html = get_as_str("https://habr.com/ru/hubs/page%d/" % p)
        # page_html = get_as_str("https://habr.com/ru/hubs/geektimes/page%d/" % p)  # Geektimes
        # page_html = get_as_str("https://habr.com/ru/hubs/develop/page%d/" % p)  # Develop
        # page_html = get_as_str("https://habr.com/ru/hubs/admin/page%d" % p)  # Admin
        for hub in page_html.split("media-obj media-obj_hub"):
            info = Str(hub).find_between('"https://habr.com/ru/hub', 'list-snippet__tags') 
            if "*</span>" in info:
                hub_name = info.find_between('/', '/"')
                if len(hub_name) > 0 and len(hub_name) < 32:
                    hubs.append(hub_name)
    print(hubs)

Find_between kazi na darasa la Str chagua kamba kati ya vitambulisho viwili, nilitumia mapema. Vituo vya mada vimewekwa alama ya "*" ili viweze kuangaziwa kwa urahisi, na unaweza pia kutoa maoni kwa mistari inayolingana ili kupata sehemu za aina zingine.

Matokeo ya kitendakazi cha get_hubs ni orodha ya kuvutia, ambayo tunaihifadhi kama kamusi. Ninawasilisha orodha kwa ukamilifu ili uweze kukadiria kiasi chake.

hubs_profile = {'infosecurity', 'programming', 'webdev', 'python', 'sys_admin', 'it-infrastructure', 'devops', 'javascript', 'open_source', 'network_technologies', 'gamedev', 'cpp', 'machine_learning', 'pm', 'hr_management', 'linux', 'analysis_design', 'ui', 'net', 'hi', 'maths', 'mobile_dev', 'productpm', 'win_dev', 'it_testing', 'dev_management', 'algorithms', 'go', 'php', 'csharp', 'nix', 'data_visualization', 'web_testing', 's_admin', 'crazydev', 'data_mining', 'bigdata', 'c', 'java', 'usability', 'instant_messaging', 'gtd', 'system_programming', 'ios_dev', 'oop', 'nginx', 'kubernetes', 'sql', '3d_graphics', 'css', 'geo', 'image_processing', 'controllers', 'game_design', 'html5', 'community_management', 'electronics', 'android_dev', 'crypto', 'netdev', 'cisconetworks', 'db_admins', 'funcprog', 'wireless', 'dwh', 'linux_dev', 'assembler', 'reactjs', 'sales', 'microservices', 'search_technologies', 'compilers', 'virtualization', 'client_side_optimization', 'distributed_systems', 'api', 'media_management', 'complete_code', 'typescript', 'postgresql', 'rust', 'agile', 'refactoring', 'parallel_programming', 'mssql', 'game_promotion', 'robo_dev', 'reverse-engineering', 'web_analytics', 'unity', 'symfony', 'build_automation', 'swift', 'raspberrypi', 'web_design', 'kotlin', 'debug', 'pay_system', 'apps_design', 'git', 'shells', 'laravel', 'mobile_testing', 'openstreetmap', 'lua', 'vs', 'yii', 'sport_programming', 'service_desk', 'itstandarts', 'nodejs', 'data_warehouse', 'ctf', 'erp', 'video', 'mobileanalytics', 'ipv6', 'virus', 'crm', 'backup', 'mesh_networking', 'cad_cam', 'patents', 'cloud_computing', 'growthhacking', 'iot_dev', 'server_side_optimization', 'latex', 'natural_language_processing', 'scala', 'unreal_engine', 'mongodb', 'delphi',  'industrial_control_system', 'r', 'fpga', 'oracle', 'arduino', 'magento', 'ruby', 'nosql', 'flutter', 'xml', 'apache', 'sveltejs', 'devmail', 'ecommerce_development', 'opendata', 'Hadoop', 'yandex_api', 'game_monetization', 'ror', 'graph_design', 'scada', 'mobile_monetization', 'sqlite', 'accessibility', 'saas', 'helpdesk', 'matlab', 'julia', 'aws', 'data_recovery', 'erlang', 'angular', 'osx_dev', 'dns', 'dart', 'vector_graphics', 'asp', 'domains', 'cvs', 'asterisk', 'iis', 'it_monetization', 'localization', 'objectivec', 'IPFS', 'jquery', 'lisp', 'arvrdev', 'powershell', 'd', 'conversion', 'animation', 'webgl', 'wordpress', 'elm', 'qt_software', 'google_api', 'groovy_grails', 'Sailfish_dev', 'Atlassian', 'desktop_environment', 'game_testing', 'mysql', 'ecm', 'cms', 'Xamarin', 'haskell', 'prototyping', 'sw', 'django', 'gradle', 'billing', 'tdd', 'openshift', 'canvas', 'map_api', 'vuejs', 'data_compression', 'tizen_dev', 'iptv', 'mono', 'labview', 'perl', 'AJAX', 'ms_access', 'gpgpu', 'infolust', 'microformats', 'facebook_api', 'vba', 'twitter_api', 'twisted', 'phalcon', 'joomla', 'action_script', 'flex', 'gtk', 'meteorjs', 'iconoskaz', 'cobol', 'cocoa', 'fortran', 'uml', 'codeigniter', 'prolog', 'mercurial', 'drupal', 'wp_dev', 'smallbasic', 'webassembly', 'cubrid', 'fido', 'bada_dev', 'cgi', 'extjs', 'zend_framework', 'typography', 'UEFI', 'geo_systems', 'vim', 'creative_commons', 'modx', 'derbyjs', 'xcode', 'greasemonkey', 'i2p', 'flash_platform', 'coffeescript', 'fsharp', 'clojure', 'puppet', 'forth', 'processing_lang', 'firebird', 'javame_dev', 'cakephp', 'google_cloud_vision_api', 'kohanaphp', 'elixirphoenix', 'eclipse', 'xslt', 'smalltalk', 'googlecloud', 'gae', 'mootools', 'emacs', 'flask', 'gwt', 'web_monetization', 'circuit-design', 'office365dev', 'haxe', 'doctrine', 'typo3', 'regex', 'solidity', 'brainfuck', 'sphinx', 'san', 'vk_api', 'ecommerce'}

Kwa kulinganisha, sehemu za geektimes zinaonekana kuwa za kawaida zaidi:

hubs_gt = {'popular_science', 'history', 'soft', 'lifehacks', 'health', 'finance', 'artificial_intelligence', 'itcompanies', 'DIY', 'energy', 'transport', 'gadgets', 'social_networks', 'space', 'futurenow', 'it_bigraphy', 'antikvariat', 'games', 'hardware', 'learning_languages', 'urban', 'brain', 'internet_of_things', 'easyelectronics', 'cellular', 'physics', 'cryptocurrency', 'interviews', 'biotech', 'network_hardware', 'autogadgets', 'lasers', 'sound', 'home_automation', 'smartphones', 'statistics', 'robot', 'cpu', 'video_tech', 'Ecology', 'presentation', 'desktops', 'wearable_electronics', 'quantum', 'notebooks', 'cyberpunk', 'Peripheral', 'demoscene', 'copyright', 'astronomy', 'arvr', 'medgadgets', '3d-printers', 'Chemistry', 'storages', 'sci-fi', 'logic_games', 'office', 'tablets', 'displays', 'video_conferencing', 'videocards', 'photo', 'multicopters', 'supercomputers', 'telemedicine', 'cybersport', 'nano', 'crowdsourcing', 'infographics'}

Vituo vilivyobaki vilihifadhiwa kwa njia ile ile. Sasa ni rahisi kuandika chaguo za kukokotoa ambazo hurejesha matokeo ikiwa makala ni ya geektimes au kitovu cha wasifu.

def is_geektimes(hubs: List) -> bool:
    return len(set(hubs) & hubs_gt) > 0

def is_geektimes_only(hubs: List) -> bool:
    return is_geektimes(hubs) is True and is_profile(hubs) is False

def is_profile(hubs: List) -> bool:
    return len(set(hubs) & hubs_profile) > 0

Kazi zinazofanana zilifanywa kwa sehemu nyingine ("maendeleo", "utawala", nk).

Matayarisho

Ni wakati wa kuanza kuchambua. Tunapakia seti ya data na kuchakata data ya kitovu.

def to_list(s: str) -> List[str]:
    # "user:popular_science+astronomy" => [popular_science, astronomy]
    return s.split(':')[1].split('+')

def to_date(dt: datetime) -> datetime.date:
    return dt.date()

df = pd.read_csv("habr_2019.csv", sep=',', encoding='utf-8', error_bad_lines=True, quotechar='"', comment='#')
dates = pd.to_datetime(df['datetime'], format='%Y-%m-%dT%H:%MZ')
dates += datetime.timedelta(hours=3)
df['date'] = dates.map(to_date, na_action=None)
hubs = df["hubs"].map(to_list, na_action=None)
df['hubs'] = hubs
df['is_profile'] = hubs.map(is_profile, na_action=None)
df['is_geektimes'] = hubs.map(is_geektimes, na_action=None)
df['is_geektimes_only'] = hubs.map(is_geektimes_only, na_action=None)
df['is_admin'] = hubs.map(is_admin, na_action=None)
df['is_develop'] = hubs.map(is_develop, na_action=None)

Sasa tunaweza kupanga data kwa siku na kuonyesha idadi ya machapisho ya vitovu tofauti.

g = df.groupby(['date'])
days_count = g.size().reset_index(name='counts')
year_days = days_count['date'].values
grouped = g.sum().reset_index()
profile_per_day_avg = grouped['is_profile'].rolling(window=20, min_periods=1).mean()
geektimes_per_day_avg = grouped['is_geektimes'].rolling(window=20, min_periods=1).mean()
geektimesonly_per_day_avg = grouped['is_geektimes_only'].rolling(window=20, min_periods=1).mean()
admin_per_day_avg = grouped['is_admin'].rolling(window=20, min_periods=1).mean()
develop_per_day_avg = grouped['is_develop'].rolling(window=20, min_periods=1).mean()

Tunaonyesha idadi ya nakala zilizochapishwa kwa kutumia Matplotlib:

Habrastatistics: kuchunguza sehemu nyingi na zisizotembelewa sana za tovuti

Niligawanya makala "nyakati za kijiografia" na "nyakati za geektiki pekee" kwenye chati, kwa sababu Makala yanaweza kuwa ya sehemu zote mbili kwa wakati mmoja (kwa mfano, "DIY" + "microcontrollers" + "C++"). Nilitumia jina la "wasifu" kuangazia makala ya wasifu kwenye tovuti, ingawa pengine neno wasifu la Kiingereza kwa hili si sahihi kabisa.

Katika sehemu iliyotangulia tuliuliza kuhusu "athari za nyakati za geektime" zinazohusiana na mabadiliko ya sheria za malipo ya makala za nyakati za geektime kuanzia msimu huu wa kiangazi. Wacha tuonyeshe nakala za nyakati za geek kando:

df_gt = df[(df['is_geektimes_only'] == True)]
group_gt = df_gt.groupby(['date'])
days_count_gt = group_gt.size().reset_index(name='counts')
grouped = group_gt.sum().reset_index()
year_days_gt = days_count_gt['date'].values
view_gt_per_day_avg = grouped['views'].rolling(window=20, min_periods=1).mean()

Matokeo yake ni ya kuvutia. Uwiano wa takriban wa maoni ya makala za geektimes kwa jumla ni mahali fulani karibu 1:5. Lakini ingawa jumla ya mara ambazo maoni yalitazamwa ilibadilika-badilika, utazamaji wa makala za "burudani" ulisalia katika takriban kiwango sawa.

Habrastatistics: kuchunguza sehemu nyingi na zisizotembelewa sana za tovuti

Unaweza pia kutambua kwamba jumla ya idadi ya maoni ya makala katika sehemu ya "geektimes" bado ilipungua baada ya kubadilisha sheria, lakini "kwa jicho", kwa si zaidi ya 5% ya jumla ya maadili.

Inafurahisha kuangalia wastani wa idadi ya maoni kwa kila makala:

Habrastatistics: kuchunguza sehemu nyingi na zisizotembelewa sana za tovuti

Kwa makala za "burudani" ni takriban 40% juu ya wastani. Labda hii haishangazi. Kushindwa mwanzoni mwa Aprili haijulikani kwangu, labda ndivyo ilivyotokea, au ni aina fulani ya makosa ya kuchanganua, au labda mmoja wa waandishi wa geektimes alikwenda likizo;).

Kwa njia, grafu inaonyesha kilele mbili zinazoonekana zaidi katika idadi ya maoni ya vifungu - likizo ya Mwaka Mpya na Mei.

Vitovu

Wacha tuendelee kwenye uchambuzi ulioahidiwa wa vibanda. Wacha tuorodheshe vituo 20 vya juu kwa idadi ya maoni:

hubs_info = []
for hub_name in hubs_all:
    mask = df['hubs'].apply(lambda x: hub_name in x)
    df_hub = df[mask]

    count, views = df_hub.shape[0], df_hub['views'].sum()
    hubs_info.append((hub_name, count, views))

# Draw hubs
hubs_top = sorted(hubs_info, key=lambda v: v[2], reverse=True)[:20]
top_views = list(map(lambda x: x[2], hubs_top))
top_names = list(map(lambda x: x[0], hubs_top))

plt.rcParams["figure.figsize"] = (8, 6)
plt.bar(range(0, len(top_views)), top_views)
plt.xticks(range(0, len(top_names)), top_names, rotation=90)
plt.ticklabel_format(style='plain', axis='y')
plt.tight_layout()
plt.show()

Matokeo:

Habrastatistics: kuchunguza sehemu nyingi na zisizotembelewa sana za tovuti

Kwa kushangaza, kitovu maarufu zaidi katika suala la maoni kilikuwa "Usalama wa Habari" viongozi wa juu wa 5 pia walijumuisha "Programu" na "Sayansi Maarufu".

Antitop inamiliki Gtk na Cocoa.

Habrastatistics: kuchunguza sehemu nyingi na zisizotembelewa sana za tovuti

Nitakuambia siri, vibanda vya juu vinaweza pia kuonekana hapa, ingawa idadi ya maoni haijaonyeshwa hapo.

Upimaji

Na hatimaye, rating iliyoahidiwa. Kwa kutumia data ya uchanganuzi wa kituo, tunaweza kuonyesha makala maarufu zaidi kwa vitovu maarufu kwa mwaka huu wa 2019.

Usalama wa Habari

Programu

Sayansi Maarufu

kazi

Sheria katika IT

Maendeleo ya wavuti

GTK

Na mwishowe, ili hakuna mtu anayekasirika, nitatoa rating ya kitovu kisichotembelewa zaidi "gtk". Ndani ya mwaka mmoja ilichapishwa moja Nakala, ambayo pia "moja kwa moja" inachukua mstari wa kwanza wa ukadiriaji.

Hitimisho

Hakutakuwa na hitimisho. Furaha kusoma kila mtu.

Chanzo: mapenzi.com

Kuongeza maoni