Python
データ分析
Jupyter

Qiita Advent Calendar 2018をデータで振り返る(はてブ数ランキングなど)

2018年もAdvent Calendarお疲れ様でした

2018-12-25-mecab.png

  • 今日でAdvent Calendar最終日ということで、Pythonでデータを可視化してみました。
    • 上の図は2018年の全てのQiita投稿記事の本文で作ったWordCloudです。
  • また2015年〜2018年のAdvent Calendarで最もはてブ数がついた記事などもまとめています。
  • Advent Calendar TOP: https://qiita.com/advent-calendar/2018
  • 公式のいいね数ランキング: https://qiita.com/advent-calendar/2018/ranking/feedbacks
  • 「カレンダーごとのいいね数のランキング」は公式が出しているのでそれ以外の情報を出してみたいと思います。

データ

  • 2015年-2017年: 2018/12/23に取得
  • 2018年: 本日(2018/12/25 15時~18時頃取得)
    • ということでそれ以降に投稿/紐付けされた記事に関してはカウントできていませんのであしからず

データの取得

データの取得は requests-html を用いて行いました。
コードの1部をこちらに貼ります。

ls_article = []

for i, row in tqdm(df_calendar.iterrows(), 'calendar'):
    url = row['url']
    category_name = row['category']
    year = row['year']
    calendar_name = row['name']

    resp = session.get(url, headers=headers)
    time.sleep(1)

    articles = resp.html.find('.adventCalendarCalendar_comment')
    for article in articles:
        url = article.find('a', first=True).attrs.get('href')
        resp = session.get(url, headers=headers)
        time.sleep(1)

        title = resp.html.find('.it-Header_title', first=True).text
        author = resp.html.find('.it-Header_authorName', first=True).text
        n_like = resp.html.find('.it-Actions_likeCount', first=True).text
        n_comment = resp.html.find('.it-Actions_commentCount', first=True).text
        content = resp.html.find('.it-MdContent', first=True).text

        dic_article = {
            'url': url, 'title': title, 'author': author, 'n_like': n_like, 'n_comment': n_comment, 'content': content,
            'year': year, 'category': category_name, 'calendar': calendar_name
        }
        ls_article.append(dic_article)

df_article = pd.DataFrame(ls_article)

全記事数/いいね数/はてなブックマーク数

まず全体の傾向を見ていきましょう。

image.png

2015 2016 2017 2018
記事数 6687 9061 10866 11469
いいね数 172396 144690 150965 86743
はてブ数 79984 89651 88385 50440

総記事数は順調に増えていることがわかります。
2018年は2015年の2倍近くの記事が書かれていることに驚きました。
その一方で、いいね数/はてブ数は去年・一昨年に達していていないですね。
これは書かれてからジワジワ稼いでいくものだからかもしれません。

はてブ数のランキング

カレンダーごと

はてブ数

image.png

はてブ数
モチベーションクラウド 2379
Python その2 1852
はてなエンジニア 1799
Yahoo! JAPAN Tech 1797
Mercari 1704
NewsPicks 1579
エムスリー 1356
Engineering Manager 1156
dely 1144
Gunosy 1017

モチベーションクラウドさんがトップでした。全体的に企業のAdvent Calendarですね。
数少ない企業でないAdvent Calendarは「Python その2」は自分が作ったカレンダーなので嬉しいです💪

いいね数

ちなみにQiitaいいね数と比べると全然違って面白いです。

image.png

順位 calendar いいね数
1 闇の魔術に対する防衛術 2969
2 クソアプリ2 2480
3 クソアプリ 2384
4 ディップ 2224
5 モチベーションクラウド 2034
6 NewsPicks 1864
7 グロービス 1407
8 JavaScript 1330
9 TIS 1165
10 BrainPad 1144

Advent_Calendar_2018ランキング_-_Qiita.png

あっ… 1つ存在を隠されているカレンダーがあったことを知ってしまいました。

記事ごと

image.png

順位 著者 タイトル はてブ数 いいね数
1 hirokidaichi 心理的安全性ガイドライン(あるいは権威勾配に関する一考察) 2102 1187
2 shinyorke Python本まとめ・2019年版 - Webとデータ分析を初心者が仕事にするまで 1247 0
3 sakito ヤフー株式会社におけるWebフロントエンドの技術選定 758 0
4 yumetodo C++標準化委員会、ついに文字とは何かを理解する: char8_t 729 635
5 papix 「手順書」のススメ 712 0
6 junichiro 2018年版もっとも参考になった機械学習系記事ベスト10 639 571
7 gonshi_com 今年、JavaScriptでの仕事の幅を広げた技術6選 609 343
8 akaneyoshikawa 非美大卒でも1年半でNewsPicksのデザイナーになれる本16冊 602 0
9 mugi_uno マルチカーソルを使わないVSCodeはただのVSCodeだ! 561 0
10 ikedaosushi 人間のためのWeb Framework「responder」、そして作者のKenneth Reitzについて 526 0
11 saboyutaka 未経験からRuby on Railsを学んで仕事につなげるまでの1000時間メニュー 516 465
12 papanda コミュニティは2回集まると死ぬ。 471 0
13 tattn 個人アプリ開発を支える技術と開発フロー 468 500
14 watson1978 バッチ処理の一部で 30 分以上かかっていた処理を 14 秒で終わるようにした話 423 0
15 ajido@github ありがとう、MYM 安らかに眠れ 415 0
16 kotarot 量子アニーリングがチョットワカルようになる記事 381 0
17 rotomx 一休における「情シス」の取り組み 368 0
18 kishiyama pandasで1000万件のデータの前処理を高速にするTips集 365 220
19 takapy0210 機械学習初心者が約10ヶ月でメダルより大切なものを獲得できた話 342 0
20 nus_miz 「小説家になろう」の小説を自動生成するマンになろう 327 0

モチベーションクラウドカレンダーを1位にしたhirokidaichiさんの記事が1位でした。
その他の記事も毎日タイムラインで見た記事ばかりで総決算感がありました。
ちなみに自分の書いた人間のためのWeb Framework「responder」、そして作者のKenneth Reitzについても10位にランクインしました!

ちなみに2015年〜2018年

image.png

順位 著者 タイトル はてブ数 いいね数
1 2016 seki_uk 質問は恥ではないし役に立つ 2389 2960
2 2018 hirokidaichi 心理的安全性ガイドライン(あるいは権威勾配に関する一考察) 2102 1187
3 2017 shinyorke Pythonの学び方と,読むべき本を体系化しました2018〜初心者から上級者まで 1927 0
4 2016 aerith7 宇宙電気電子な話をしたいです。GPSとか人工衛星とか。 1718 0
5 2016 sifue 高校生にWeb上でプログラミングを教え始めたエンジニアがこの8ヶ月間で得た気づき 1590 1555
6 2017 sheepland 11ヶ月間でTOEICスコアを300点から835点に上げた英語学習法 1557 1176
7 2017 tmknom Webアプリケーションフレームワーク導入時に考慮すべき22の観点 1334 1673
8 2016 piroor プログラマーの君! 騙されるな! シェルスクリプトはそう書いちゃ駄目だ!! という話 1334 1969
9 2018 shinyorke Python本まとめ・2019年版 - Webとデータ分析を初心者が仕事にするまで 1247 0
10 2016 YudaiTsukamoto プログラミング勉強を加速させる7つの習慣 1242 2352

カテゴリーごと

 分布

カテゴリーごとに分布を出してみます。

image.png

image.png

TOP3まとめ

ジャンルごとのはてブ数TOP3の記事をまとめました。

未設定 著者 タイトル はてブ数 いいね数
1 Ghana 高専生が24時間で「格闘技の動画を格闘ゲーム風に自動編集するシステム」を作った話 35 31
2 ikedaosushi rebuild.fmの統計学 2 0
プログラミング言語 著者 タイトル はてブ数 いいね数
1 shinyorke Python本まとめ・2019年版 - Webとデータ分析を初心者が仕事にするまで 1247 0
2 yumetodo C++標準化委員会、ついに文字とは何かを理解する: char8_t 729 635
3 ikedaosushi 人間のためのWeb Framework「responder」、そして作者のKenneth Reitzについて 526 0
ライブラリ・フレームワーク 著者 タイトル はてブ数 いいね数
1 po3rin 「Vue.js + Go言語 + Docker」で作る!画像アップロード機能実装ハンズオン 273 303
2 potato4d Vuexによる状態管理を含む最高に快適な Vue.js + TypeScript の開発環境を目指す話 260 444
3 howdy39 Nuxt, netlify, Firebase を使ったWebサービス開発と個人開発における技術選定のポイント 242 270
Webテクノロジー 著者 タイトル はてブ数 いいね数
1 piacere_ex BASIC以来、35年間プログラミングしてないIT企業社長が、ElixirでWebアプリを作った 73 256
2 yamamanx AWS LambdaでChrome HeadlessドライバをAWS Lambda Layersから使う 38 0
3 DesignChips フロントエンドに明るくない人のためのPWAざっくり解説 26 0
モバイル 著者 タイトル はてブ数 いいね数
1 tattn 個人アプリ開発を支える技術と開発フロー 468 500
2 superman9387 Flutter 1.0がリリースされたので概要から、環境構築、実装方法、アーキテクチャ、情報収集方法まで全部書く 17 202
3 yyokii FolioのイケてるWalkthrough画面のソースを読み解く 9 24
DevOps・インフラ 著者 タイトル はてブ数 いいね数
1 kenjiszk SRE風のインフラエンジニアにならないために 292 0
2 jin_yokoyama Elastic Stackで簡単!Dockerコンテナ監視ダッシュボード作成 86 0
3 sugitk Ansibleをとりまくさまざまな技術について 71 0
IoT・ハードウェア 著者 タイトル はてブ数 いいね数
1 ikwzm 一体いつから FPGA はハードウェアだと錯覚していた? 46 72
2 kazuph 大きくなってきたIoTプロダクトのログ活用について 〜Elasticsearch篇〜 36 0
3 bohemian916 SSIDで隣人とコミュニケーションする 33 0
OS 著者 タイトル はてブ数 いいね数
1 micchie あなたのネットワークスタック正しく設定されていますか? 140 82
2 masami256 Linuxカーネルをgdbでデバッグ(またはディストリビューションのカーネルを使うときは当たってるパッチにも注意しよう) 65 0
3 xoxyuxu linux systemにおけるinitの最期 54 0
エディタ 著者 タイトル はてブ数 いいね数
1 swfz VSCodeでなるべくマウスを触らない設定 304 0
2 ujihisa vimconfのujihisaさんの発表を解説します 254 0
3 blux2 vimが苦手でもOnivimカッコいいのでおすすめしたい 178 140
学術 著者 タイトル はてブ数 いいね数
1 kishiyama pandasで1000万件のデータの前処理を高速にするTips集 365 220
2 blackenedgold JITあれこれ 201 0
3 animegazer 制御理論としての動的計画法 137 122
サービス・アプリケーション 著者 タイトル はてブ数 いいね数
1 takapy0210 機械学習初心者が約10ヶ月でメダルより大切なものを獲得できた話 342 0
2 lain21 GCPとDockerでKaggle用計算環境構築 168 108
3 1amageek Cloud Firestoreを実践投入するにあたって考えたこと 52 241
企業・学校・団体 著者 タイトル はてブ数 いいね数
1 hirokidaichi 心理的安全性ガイドライン(あるいは権威勾配に関する一考察) 2102 1187
2 sakito ヤフー株式会社におけるWebフロントエンドの技術選定 758 0
3 papix 「手順書」のススメ 712 0
その他 著者 タイトル はてブ数 いいね数
1 ngsw エンジニアリングマネージャを退いた話 289 131
2 dskst エンジニアリング組織の文化ができるまでの3年間の軌跡 289 0
3 masartz 研修中に爆睡して学んだ 1on1 で「待つ」ことの大事さ(How I learned the importance of patience in one-on-one MTGs from sleeping) 281 0
スポンサー 著者 タイトル はてブ数 いいね数
1 xkumiyu Gitブランチをきれいにするワンライナー 45 0
2 unotovive 研究室にUX最高な無人販売機を設置する話 3 0
3 Cj-bc 個人的によく使う(ベタな)bash alias 2 4

著者ごと

yuzutas0さんのようにAdvent Calendarを書いている量がすごい人がいるので著者ごとのランキングも見てみたいと思いました。

はてブ数

image.png

いいね数

image.png

記事数

ちなみに記事数で見るとどうなのでしょうか。

image.png

なんと ohisama@githubさんが85記事書いていました。すごすぎる…。

ちなみに歴代だと

image.png

shinyorke | Twitterさんがトップでした!

いいね数/はてブ数の分布

次にいいね数/はてブ数の分布を見てみます。

相関

image.png

面白いことに、いいね数orはてブ数が少ないときは、いいね数の方が多くなる傾向があり、ある程度増えてくると線形の相関が見られるようです。はてブ数はホットエントリに入らないと全然増えないということかもしれません。

ヒストグラム

それぞれの分布をヒストグラムで可視化してみます。

image.png

image.png

0付近の値が多すぎて全然わからないですね…。どちらかというといいね数の方が多くなる傾向があるようです。

パレート図

一部の記事がどのくらいの割合を占めているのかパレート図を書いて確かめてみます。

s = df.groupby('いいね数').size().sort_values(ascending=False)
sum_ = s.sum()
tmp_df = pd.concat([s, s.cumsum(), 100*s.cumsum()/sum_], axis=1)
tmp_df.columns = ['number', 'cumsum', 'cumsum_percent']

fig = plt.figure(figsize=(16, 4))
ax = fig.add_subplot(1, 1, 1)

n = tmp_df.shape[0]
x = np.arange(0, n)
ax.plot(x, tmp_df['cumsum_percent'], linewidth=5)
ax.tick_params(axis='both', labelsize=20)
ax.set_xlabel('いいね数', fontsize=20)
ax.set_ylabel('いいね数の累積%', fontsize=20)
ax.set_title('いいね数のパレート図', fontsize=30)

image.png

image.png

2/8の法則どころかはてブ数に関しては1/9の法則ですね。

何日が一番いいね!/はてブされやすいか

日付に傾向があるのかを見てみます。

image.png

image.png

いいね数の方は顕著な結果にはなりませんでしたが、はてブ数は非常に面白い結果になりました。
「後半になるに連れてブックマークされやすい」かつ「土日の記事はブックマークされやすい」傾向が見られます。

ワードクラウド

最後に2015年〜2018年のワードクラウドをそれぞれ見てみましょう。
単語の分割はMecabを使い、stopワードとして一般的な言葉は手動で取り除いています。

mecab = MeCab.Tagger("-Ochasen -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd")
lines = mecab.parse(doc).splitlines()
words = []
for line in lines:
    chunks = line.split('\t')
    if len(chunks) > 3 and (chunks[3].startswith('名詞') and not chunks[3].startswith('名詞-数')):
        words.append(chunks[0])
years = [2015, 2016, 2017, 2018]
n = len(years)
fig = plt.figure(figsize=(16, 10*n))
fpath = "/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc"

for i, year in enumerate(years):
    wordcloud = WordCloud(
        background_color="white", width=900*10, height=500*10, font_path=fpath, stopwords=stop_words
    ).generate(" ".join(dic_words[year]))
    ax = fig.add_subplot(n, 1, i+1)
    ax.imshow(wordcloud)
    [spine.set_visible(False) for spine in ax.spines.values()]

    ax.set_yticklabels([])
    ax.set_xticklabels([])
    ax.grid(False)
    ax.set_title(f'{year}', fontsize=20)

image.png

Pythonの人気は凄まじいですね。また2018年は設計の話題が多い年だったようです。

最後に

  • 簡単ですが、Qiita Advent Calendar 2018の情報を可視化しました。
  • Advent Calendarのお祭り感は楽しいですね。終わったばかりですが、来年のAdvent Calendarが楽しみになってきました。笑
  • それでは皆さん良いお年を!