Qiitaいいな〜自分のいいね分析

5年くらいQiitaにお世話になっています。Twitterでふぁぼをするくらいの気軽さで、読んだ記事をいいね！していました。

いいねした記事も6,928件にもなっていたと気づかせてくれた下記記事に触発され、自分のいいねした記事を雑に分析してみました。

[Qiitaいいな〜ランキング](https://qiita.com/tag1216/items/b4ae76328989947ac216)

# データ取得方法

例によってQiita APIにはユーザがいいねしている記事を取得するモノはありません。
(Stockしている記事の一覧取得はありますが)
[Qiita API v2ドキュメント](https://qiita.com/api/v2/docs)

そのため、ユーザのいいねした記事の一覧画面をスクレイピングし情報を取得します。
https://qiita.com/snona/like

スクレイピングの実装は、RubyからSeleniumを利用しています。

## 取得するデータ

<img width="1229" alt="ユーザのいいねした記事一覧画面" src="https://qiita-image-store.s3.amazonaws.com/0/84376/fda55ba6-d968-87d7-5db0-0e392c3c2a66.png">

とりあえず取れそうなデータとして以下があります。

- タイトル
- タグ
- いいね数
- コメント数

記事ごとのStock数も取得したかったですが、残念ながらいいねした記事の一覧には表示がないです。

ざくっとタグ, いいね数を集計することにしました。

タグからは良く読む記事の技術傾向が　, いいね数からはミーハー具合がわかるのではないかという考えです。

# 結果

## タグ
全タグは3,628個でしたが、そのうち1回のみ出現したタグは2,166個と60%近くが1度のみの出現でした。
原因としては名前の揺れが多く、まじめにするのであればクレンジングが必要そうです。

いいねした記事のタグTop10をみると確かに興味のある, あった, 業務で利用する内容が多いです。
(YouTubeとresasがなぜこんなに高いのか不明ですが。。。)
![いいねした記事のタグ（Top10）](https://qiita-image-store.s3.amazonaws.com/0/84376/806ab06b-9fdc-62f2-9242-24269de26882.png)

以下トップ100です。Reactとreactjsなどでタグが別れています。

|タグ名|出現数|
|:--|--:|
|JavaScript|1143|
|React|567|
|Java|402|
|gas|379|
|Elixir|363|
|Ruby|359|
|YouTube|358|
|resas|351|
|Python|336|
|reactjs|300|
|Node.js|299|
|新人プログラマ応援|292|
|Rails|257|
|iOS|238|
|CSS|236|
|Git|234|
|HTML|223|
|ポエム|218|
|GitHub|193|
|Electron|187|
|Android|174|
|機械学習|173|
|Swift|170|
|PHP|165|
|HTML5|138|
|Qiita|135|
|DeepLearning|133|
|初心者|125|
|Unity|124|
|AWS|121|
|spring-boot|118|
|spring|98|
|Linux|94|
|redux|88|
|Mac|88|
|docker|87|
|jQuery|86|
|Markdown|85|
|AngularJS|84|
|Slack|80|
|Windows|79|
|Firebase|79|
|プログラミング|78|
|Go|77|
|C#|73|
|TensorFlow|73|
|CSS3|72|
|api|70|
|エンジニア|67|
|GoogleAppsScript|65|
|vue.js|62|
|bootstrap|62|
|Web|59|
|TypeScript|58|
|Twitter|58|
|es6|57|
|webpack|57|
|C++|56|
|MachineLearning|55|
|react.js|53|
|MySQL|52|
|Redmine|50|
|npm|48|
|プロジェクト管理|44|
|Bash|43|
|コミュニケーション|42|
|CentOS|42|
|Apache|42|
|フロントエンド|41|
|RubyOnRails|41|
|プロジェクトマネジメント|41|
|マネジメント|40|
|人工知能|40|
|勉強会|40|
|Heroku|39|
|IoT|38|
|データ分析|38|
|golang|37|
|canvas|37|
|RPGツクールMV|37|
|gulp|37|
|google|36|
|アジャイル|36|
|reactnative|36|
|Xcode|36|
|babel|36|
|flux|35|
|ATOM|35|
|セキュリティ|35|
|Vim|34|
|JSON|34|
|WebAPI|34|
|Ubuntu|34|
|GitLab|33|
|Excel|33|
|rest|33|
|gradle|33|
|VisualStudioCode|32|
|AdventCalendar|32|
|AI|32|


## いいね数
いいね数10以下の記事は20%近くありますが、この中には良記事と思うものも多々あり、少々残念に思います。

![いいねした記事のいいね数](https://qiita-image-store.s3.amazonaws.com/0/84376/f205a36c-1bfa-dc3b-777b-a2af187def1f.png)

|いいね数|記事数|
|:--|--:|
|1|138|
|2~10|1549|
|11~50|2831|
|51~100|974|
|101~1000|1615|
|1001~|196|

トレンドの記事ばかりを読んでいるかや、自分だけがいいねしている記事が多いかなどを期待していましたが、記事の大部分はいいねが50以下ということや、いいね数が多い記事は限られているため、いいね数の集計にはあまり意味はなかったかもしれません。

[みなさん「いいね」は欲しいですか？Qiitaにて「いいね」を頂ける記事とは？を分析してみたよ](https://qiita.com/phigasui/items/4ff61cfa3a6a32fd2121#%E7%B5%90%E6%9E%9C)


# ソース

```ruby
require 'selenium-webdriver'

# 対象ユーザのQiitaID
id = 'snona'

driver = Selenium::WebDriver.for :chrome

# いいねの記事一覧ページに移動
driver.navigate.to "https://qiita.com/#{id}/like"

# いいね, タグの集計
likes = Hash.new(0)
tags = Hash.new(0)

loop do
  # いいね数を取得
  driver.find_elements(:class, 'fa-like').each{|like| likes[like.find_element(:xpath, '..').text] += 1}

  # タグを取得
  driver.find_elements(:class, 'TagList__label').each{|tag| tags[tag.text] += 1}

  # 次ページへ遷移
  begin
    driver.find_element(:class, 'js-next-page-link').click
  rescue
    # 見つからない場合は終了
    break
  end
end

driver.quit

# いいねの結果を出力
puts 'likes'
likes.sort{|(k1, v1), (k2, v2)| v2 <=> v1}.each{|key, value| puts "#{key},#{value}"}

# タグの集計を出力
puts 'tags'
tags.sort{|(k1, v1), (k2, v2)| v2 <=> v1}.each{|key, value| puts "#{key},#{value}"}
```

次のページが見つからない場合をrescueで抜けるなど全体的に雑に実装しております。おすすめの書き方等がありましたらご指摘をお願いします。

350ページ程度を集計するのに30分程度かかりました。ヘッドレスにするともう少し早いんでしょうか？

# Qiitaの使い方
自分のQiitaの使い方は大きく3種類です。
1. トレンドの一覧から見る
2. タグの新着一覧から見る
3. 知りたいことをGoogle検索して見る

トレンドは良記事が多いと思いますが、タグの新着にもいいねは少なくとも良記事が見れる気がします。

ザクッと過去のいいねした記事を分析し、自分の興味がある（あった）技術傾向のタグから良記事にであってもらえればと思います。

# 最後に
ユーザのいいねした記事一覧からいいね数とタグだけを集計して抽出しましたが、いいねが多い記事を確認したかったりする場合に面倒なため、抽出できるデータ（記事タイトルとか）は全て抽出し、あとから集計するべきでした。