いいねが欲しけりゃコードを書くな

分析適当なので，面白半分で読んでください．タイトルは興味を持ってもらえるうように強い書き方をしました．

# いいね数が多い記事ってコード少ないな？🤔
暇なときにQiitaのトレンドを見ることが多いのですが，ふとしたときに，記事に与えられたいいね数と掲載されているソースコード数は正の相関関係にないのでは？という疑問がわきました．Qiitaには実装上のテクニックを教わったりもするので，実装中心の記事が埋もれているのはかわいそうだなあという思いも多少あったりもします．

気になったら分析したくなっちゃうのが研究職の性，年末年始に寝て起きるだけの体たらくにならないためにも，この仮定をざっくりとでも検証してすっきりしたいところ．

そんなわけで，Qiitaに投稿された記事をAPIを使用して取得し，記事に掲載されているソースコード数と与えられたいいね数の相関を確認してみることにしました．ここでソースコード数とは，コードブロック（<code>&#096;&#096;&#096;</code>からはじまり<code>&#096;&#096;&#096;</code>で終わる区間）の数として定義します．

# ざっくり結論

![fig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319806/72d09106-0238-c6c4-07a1-7f9806a7055b.png)

いいね数とコードブロック数は反比例の関係に見える．使用したデータは2019/12/15～2019/12/31の，9,500件．

# 詳細な手続き
- QiitaAPIを使用し，記事9,500件を取得
- 各記事に対して，いいね数とコードブロックの数をカウント
- いいね数 - コードブロック数の散布図を描画
- 簡単に考察

## 投稿された記事の取得
各所を参考にさせていただき，以下のコードにより記事を取得しました．筆者はなんでもかんでもC#で書きたがります．

```cs:KijiWoDownloadSuruTokoro.cs
const int DocumentPerPage = 100;
const string token = "Your Token";

using( var client = new WebClient() ) {
  client.Headers.Add(
    HttpRequestHeader.Authorization,
    $"Bearer {token}"
  );

  for( int i = 5; i < 100; i++ ) {
    var results = client.DownloadString( $@"https://qiita.com:443/api/v2/items?page={(i+1)}&per_page={DocumentPerPage}" );
    System.Threading.Thread.Sleep( 500 );
  }
}
```

このソースコードにより，記事が9,500件取得できました．範囲は2019/12/31の10時から2019/12/15の11時までのようです．ちなみに変数`i`を0スタートにしなかったのは，`i=0`の時点では，スパム記事がかなり多いように見えたため．

変数`results`には，json形式で記事データが格納されていますので，適当にパースしてください．筆者は[Json.Net](https://www.newtonsoft.com/json)を使いました．また，パースされたJsonデータを受け付けるクラスの定義は，[https://quicktype.io/](https://app.quicktype.io/#l=cs&r=json2csharp)を使用し自動生成してもらいました．便利な世の中ですね．

ちなみに，jsonデータをパースしたコードは以下です．パースされたjsonデータはクラス`Item`に変換しています．`DeserializeObject`の第二引数は，jsonデータ中に含まれる時刻のデータをうまくパースするためのテクニックです．便利ですね．

```cs:JsonNoParse.cs
var items = JsonConvert.DeserializeObject<Item[]>(
 results,
 new IsoDateTimeConverter { DateTimeFormat = @"yyyy-MM-ddTHH:mm:ss+09:00" }
);

```

## 記事ごとのいいね数とコードブロック数のカウント
記事に与えられたいいね数はjsonデータ中に含まれているので，jsonをパースした段階で取得可能です．一方コードブロックの数は，記事のデータからうまくカウントする必要があります．以下のコードで実現しました．

```cs:CodeBlockNoKazu.cs
var document = items[0].body;
var matches = Regex.Matches( document, @"```[\w|\W]*?```" );
var countOfCodeBlock = matches.Count;
```

やり口はシンプルで，任意の記事における，<code>&#096;&#096;&#096;</code>から始まり<code>&#096;&#096;&#096;</code>で終わる箇所を数えただけです．<code>&#096;&#096;&#096;</code>と<code>&#096;&#096;&#096;</code>の間には改行文字も含めるいかなる文字が入るため，`.*`にせず`[\w|\W]*`にしました．ださいけどまあいいや．`?`は最短一致．

## いいね数 - コードブロック数の散布図を描画，考察
後はエクセルにでも持ち込んで散布図にします．結果は下の図です．横軸はいいね数，縦軸はコードブロック数です．

![fig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319806/72d09106-0238-c6c4-07a1-7f9806a7055b.png)

いいね数とコードブロック数は反比例の関係に見えます．

## 簡単な考察
まず初めに断っておくべきこととして，今回使用したデータは2019/12/15～2019/12/31の，9,500件だけです．データは偏っているかもしれません．

今回この結果からは，コードをたくさん書くことといいねが付くことには正の相関関係にないことが示唆されましたが，ある種当然の結果なのかもしれません．ここで以下の表に，今回の収集したデータのうち，いいねが多くついた上位10の記事と，そのいいね数を示します．

|記事名|いいね数（2019/12/31時点）|
|:--|:--|
|[同じチームにいて最高に心強かったエンジニアの特徴をまとめてみた](https://qiita.com/jofuku/items/6420097fd5ff4c44c24d)|1595|
|[なんとなくで書かないで！HTML5を書く時に気にしてみたいタグごとのお約束](https://qiita.com/jofuku/items/05b303d932093eb4c0d1)|1400|
|[[和訳] Dropboxアカウントのせいで胃潰瘍になった](https://qiita.com/jofuku/items/a4729e11b465c8f65478)|1386|
|[君はまだ平成のアーキテクチャを使ってるのか？僕はFirebaseと令和の時代に行くぞ。](https://qiita.com/jofuku/items/c55b6811835923fb9574)|1285|
|[【数学】NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党](https://qiita.com/jofuku/items/da7dade622770a04d8f7)|1084|
|[エンジニア採用面接での「質問項目」と「意図」を公開する](https://qiita.com/jofuku/items/fc8242f7c395b828f650)|976|
|[ラーメンで理解するasync/await](https://qiita.com/jofuku/items/6d5a27ffe9143b35defe)|966|
|[Unity臭さを消す方法10連発](https://qiita.com/jofuku/items/014d9751e0e63c11db39)|871|
|[研究室を IoT 化したら守衛さんを監禁してしまった話](https://qiita.com/jofuku/items/b623cb17a2352767ace1)|708|
|[数値計算の研究をしている学生が"数値計算に潜むとんでもないリスク"について話してみる](https://qiita.com/jofuku/items/26a18fe01c8ad221f0ba)|699|

これら記事はどちらかというと技術解説のための記事や，読み物として興味深い記事が多く，テクノロジーに興味がある多くの読者から評価されたのだと考えられます．

一方でコードが記述された記事は読者を限定することが多く，その特定の技術に興味がない読者からは見向きもされないのでは？と思われます（筆者の主観）．またそのような記事は掲載されているコードだけそっとコピペされ，いいねされずに閉じられているのかもしれません．かわいそう．

ちなみにタイトル，`いいねが欲しけりゃコードを書くな`は，まるでコードを書くことといいねが付くことが因果関係にあるような書き方ですが，当然その因果関係などわかるはずはなく，実際に確認できたのは，記事についたいいねの数と掲載されたコードブロックの数は反比例の関係にある，だけです．

# 結論
- 記事についたいいねの数と掲載されたコードブロックの数は反比例の関係にあることが示唆された
- 多くいいねがつく記事は多くの読者を対象にした，解説記事や読みもの？
- 多くのコードブロックを持つ記事は，特定の読者を対象にする？

雑魚い感想ですが，技術的に参考にできる記事はちゃんといいねしようと思いました．