QiitaAPIで各プログラミング言語のタグの記事とフォロワーの数を調べて纏めたりする（pythonとrubyを使う）

今どのプログラミング言語がどれくらい人気なのか気になるので、qiitaで書かれた記事のタグを調べて見ましたが、一々調べるよりもコードを書いてQiitaAPIからデータを取得して分析する方が楽なので、書いてみました。この記事では試してみたこととその結果を纏めてみます。


# QiitaAPIについて

QiitaAPIにアクセスしたらタグの記事の数とフォローしている人数を調べることができます。

例えばc++のタグ https://qiita.com/api/v2/tags/c++

このような[json](https://ja.wikipedia.org/wiki/JavaScript_Object_Notation)データが出ます

```json
{"followers_count":24875,"icon_url":"https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/fe7df47710bdae8b8565b323841a6b89e2f66b89/medium.jpg?1515774066","id":"C++","items_count":5919}
```

QiitaAPIについて詳しくは https://qiita.com/api/v2/docs


# 使うプログラミング言語

基本的にQiitaAPIのようなAPIは色んな言語で簡単に扱えるようですが、今回は[ruby](https://ja.wikipedia.org/wiki/Ruby)と[python](https://ja.wikipedia.org/wiki/Python)を使ってQiitaAPIを通じて色んなプログラミング言語のタグの記事とフォロワーの数を調べて纏めてみます。

最初は全部rubyでやってみたいと思っていたのですが、データの分析やグラフを描くことがやはりpythonの[pandas](https://ja.wikipedia.org/wiki/pandas)と[matplotlib](https://ja.wikipedia.org/wiki/matplotlib)を使ったほうがずっと楽です。

なのでrubyでデータをcsvに保存して、pythonでグラフを描くという形になります。

ここで挙げるのは自分が知っている言語だけです。それ以外知らない言語もあるかもしれないです。その他に、私の知っている言語の中にも [IDL](https://ja.wikipedia.org/wiki/Interactive_Data_Language)などqiitaで全然記事が見つからない言語もあります。

[プログラミング言語](https://ja.wikipedia.org/wiki/プログラミング言語)だけ比べるので、[html](https://ja.wikipedia.org/wiki/HyperText_Markup_Language)や[xml](https://ja.wikipedia.org/wiki/Extensible_Markup_Language)みたいな[マークアップ言語](https://ja.wikipedia.org/wiki/マークアップ言語)や、[css](https://ja.wikipedia.org/wiki/Cascading_Style_Sheets)みたいな[スタイルシート言語](https://ja.wikipedia.org/wiki/スタイルシート)などは含まれません。


# rubyでタグのデータをcsvに保存する

rubyでは標準モジュールとしてopen-uriというスクレイピング用のモジュールがあるので、簡単にQiitaAPIからデータを取得できます。

csvの扱いも簡単にcsvモジュールが使えます。これも標準モジュールなので個別にインストールする必要がありません。

```ruby
require "open-uri"
require "json"
require "csv"

gengo = %w!c c++ csharp cobol clojure delphi elm
erlang fortran golang haskell java javascript julia
kotlin lisp lua objective-c pascal perl php prolog
python r ruby rust scala swift typescript vb.net!

col = %w!id items_count followers_count!

CSV.open('qiitaprogramming.csv','w'){|csv|
  gengo.each{|gg|
    data = JSON.parse(open('https://qiita.com/api/v2/tags/'+gg).read)
    csv << col.map{|c|data[c]}
  }
}
```

こういうcsvファイルが出来ます。左の方が記事の数で、右の方がフォロワーの数です。

```idlang
C,2632,21744
C++,5919,24875
C#,7427,23077
cobol,56,45
Clojure,619,550
Delphi,347,148
Elm,452,463
Erlang,524,446
Fortran,255,196
golang,2886,2025
Haskell,1904,9497
Java,12165,39527
JavaScript,26386,59733
Julia,570,620
Kotlin,2576,2243
lisp,267,358
Lua,452,320
Objective-C,3946,17766
Pascal,82,14
Perl,1469,12188
PHP,16169,37330
Prolog,207,96
Python,28671,55570
R,2727,1912
Ruby,21943,34065
Rust,1298,1527
Scala,2830,10363
Swift,11791,6603
TypeScript,3036,2325
VB.Net,359,322
```


# pythonでデータを並べて棒グラフを描く

pythonにもスクレイピング用のモジュールがたくさんあります。ここではrequestsというモジュールを使います。

データを数によって並べるにはpandasでは一番やりやすいです。

グラフを描くにはmatplotlibが一番です。

どれでも標準モジュールではないからインストールする必要がありますが、anacondaとか使っていたら最初から含まれているはずです。

```
pip install requests pandas matplotlib
```

ちなみに、rubyにもdaruというpandasと似ているモジュールが存在します。https://github.com/SciRuby/daru/wiki/pandas-vs-daru

```python
import requests
import matplotlib.pyplot as plt
import pandas as pd

lis_tagid = '''c c++ csharp cobol clojure delphi elm
erlang fortran golang haskell java javascript julia
kotlin lisp lua objective-c pascal perl php prolog
python r ruby rust scala swift typescript vb.net
'''.split()

gengo = []
n_follow = []
n_item = []
for tagid in lis_tagid:
    r = requests.get('https://qiita.com/api/v2/tags/'+tagid)
    r.raise_for_status()
    data = r.json()
    gengo.append(data['id'])
    n_follow.append(data['followers_count'])
    n_item.append(data['items_count'])

df = pd.DataFrame(index=gengo)
df['記事'] = n_item
df['フォロワー'] = n_follow
print(df)
y = range(len(df))

plt.figure(figsize=[6,6])
plt.gca(ylim=[min(y)-0.5,max(y)+0.5])
df.sort_values('フォロワー',inplace=True)
plt.yticks(y,['%s: %6s'%x for x in df['フォロワー'].iteritems()])
plt.barh(y,df['フォロワー'],color='#882244')
plt.title(u'フォロワㄧ',family='AppleGothic')
plt.tight_layout()

plt.figure(figsize=[6,6])
plt.gca(ylim=[min(y)-0.5,max(y)+0.5])
df.sort_values('記事',inplace=True)
plt.yticks(y,['%s: %6s'%x for x in df['記事'].iteritems()])
plt.barh(y,df['記事'],color='#337744')
plt.title(u'記事',family='AppleGothic')
plt.tight_layout()
plt.show()
```

結果

```idlang
                記事  フォロワー
C             2632  21744
C++           5919  24875
C#            7427  23077
cobol           56     45
Clojure        619    550
Delphi         347    148
Elm            452    463
Erlang         524    446
Fortran        255    196
golang        2886   2025
Haskell       1904   9497
Java         12165  39527
JavaScript   26386  59733
Julia          570    620
Kotlin        2576   2243
lisp           267    358
Lua            452    320
Objective-C   3946  17766
Pascal          82     14
Perl          1469  12188
PHP          16169  37330
Prolog         207     96
Python       28671  55570
R             2727   1912
Ruby         21943  34065
Rust          1298   1527
Scala         2830  10363
Swift        11791   6603
TypeScript    3036   2325
VB.Net         359    322
```

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/23494e91-1931-68cf-4772-004e62191ab2.png)
![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/5eefbae9-1fd6-452a-3849-1a857bd83544.png)



# 纏め

結果から見ると、フォロワーの数はjavascriptの方が一番ですが、記事の数はpythonの方が一番です。

javascriptはウェブ開発に欠かせない言語ですし、データサイエンスや機械学習のおかげでこの数年の間にpythonはどんどん人気な言語になってきたようです。

二年前のこの記事を調べてみたら https://qiita.com/ty-edelweiss/items/b8172c2e22726bc08aeb
あの時pythonの記事はrubyよりも少なかったようです。

javaとphpとrubyもその次に人気のようです。

C言語などはフォロワーが多い割には記事が少ないです。

結果としてフォロワーと記事の数を見ると、この数年間のプログラミング言語の使う傾向をある程度示せるはずです。

# 追記

2019年6月28日に、Rustを追加しました

2024年1月20日に、新しい纏めの記事を書きました

https://qiita.com/phyblas/items/356f12004674620587fe