【統計学】Q-Qプロットの仕組みをアニメーションで理解する。

今回は前回の[ROC曲線](http://qiita.com/kenmatsu4/items/550b38f4fa31e9af6f4f)に続き、統計学検定2級の公式教科書に掲載されている、**Q-Qプロット**の意味についてアニメーショングラフを用いて解説する記事を書きます。これもちょっとクセのあるグラフといいますか、理解にコツが必要と思いますので解説を試みたいと思います。
RでもqqnormでQ-Qプロットが書けますが、なんだかブラックボックスでその仕組みがイマイチわからないので、Pythonで自力で書いてみました。

#1. 今回利用するデータについて#
ということで利用するデータは同教科書にあるマンションの家賃データを使います。
こんなデータです。

**Mansion2.data**

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>Walk_min</th>
      <th>distance</th>
      <th>Price</th>
      <th>Type</th>
      <th>Area</th>
      <th>Direction</th>
      <th>Year</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>8</td>
      <td>B</td>
      <td>7900</td>
      <td>1K</td>
      <td>30.03</td>
      <td>南</td>
      <td>3</td>
    </tr>
    <tr>
      <th>1</th>
      <td>9</td>
      <td>B</td>
      <td>8500</td>
      <td>1K</td>
      <td>21.9</td>
      <td>南</td>
      <td>5</td>
    </tr>
    <tr>
      <th>2</th>
      <td>10</td>
      <td>B</td>
      <td>10800</td>
      <td>1K</td>
      <td>27.05</td>
      <td>南</td>
      <td>4</td>
    </tr>
    <tr>
      <th>3</th>
      <td>10</td>
      <td>B</td>
      <td>10800</td>
      <td>1K</td>
      <td>29.67</td>
      <td>南</td>
      <td>4</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>

    <tr>
      <th>185</th>
      <td>11</td>
      <td>B</td>
      <td>8600</td>
      <td>1K</td>
      <td>20.79</td>
      <td>北東</td>
      <td>0</td>
    </tr>
    <tr>
      <th>186</th>
      <td>8</td>
      <td>B</td>
      <td>7100</td>
      <td>1K</td>
      <td>22</td>
      <td>西</td>
      <td>17</td>
    </tr>
    <tr>
      <th>187</th>
      <td>9</td>
      <td>B</td>
      <td>18400</td>
      <td>1LDK</td>
      <td>54.68</td>
      <td>西</td>
      <td>10</td>
    </tr>
  </tbody>
</table>


このデータのダウンロードは[こちら](http://www.tokyo-tosho.co.jp/books/ISBN978-4-489-02122-0.html)の統計学検定2級の公式教科書のページ中程にある「ダウンロード用データ」のリンクより行えます。ダウンロードしたzipファイルを解凍し[第２章]-[本文]フォルダにある**Mansion2.data**が今回使用するデータです。

そしてデータを手に入れたらやはり、まずはグラフを書いてデータのイメージをつけたいと思います:blush: 

![mansion-plot-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/5fe19771-aa70-ad9e-34e2-f315f2757db2.png)
**Fig.1**

価格帯は左側に寄っていて、右に裾が長いタイプのヒストグラムになってます。また、価格と広さには相関がありそうなことが読み取れます。

今回のQ-Qプロットは価格に着目して進めるので、価格についてもう一歩踏み込んでグラフを解釈を試みます。
それは、「この分布が正規分布に従っているか否か」、です。

まぁ実は下記の通りこのデータから得られた平均、標準偏差を元に正規分布の密度関数を当てはめてみると明らかに合っていないのですが、それは気にせず進めますw


![qq-_02-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/6bd0f266-3212-a5e6-6523-059f1dbee548.png)
**Fig.2**

![cum_hist_norm-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/06c380bc-8057-f17c-844b-3890b74ce432.png)
**Fig.3**

上記の一連のグラフを描画するPythonコードは[こちら](https://gist.github.com/matsuken92/acff9fc19b680531792c#file-02_plot_graphs-py)です。

#2. Q-Qプロットとは何か? #

まぁ何はともあれ、Q-Qプロットのグラフそのものを見てみます。

![Q-Q_plot-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/490c43a7-f948-9edd-0451-c52d22cc1910.png)
**Fig.4**

はい、これが今回の対象とするデータ"Price"、つまり家賃のデータに対してQ-Qプロットを作図したものです。ぱっと見、何を示しているグラフかよくわからないですね。
教科書的な説明をすると、「Q-Qプロットとは得られたデータと理論分布を比較し、その類似度を調べるためのグラフ」となります。**類似していればプロットした点が直線に並ぶ**、そうです。

では、上記のグラフはどう解釈すれば良いのでしょう？
上記のFig.4は、Fig.2の形を変えたものと考えられます。つまり、得られた家賃のデータと、理論分布である正規分布密度関数がどれくらい類似しているかを、直線になっているかどうかの具合で視覚的に理解できるグラフなのです。

#3. Q-Qプロットの成り立ち#
さて、このグラフは直線具合で理論分布との類似度を図るということなのですが、なぜそのように言えるかは、このグラフの書き方を理解しないとならないと思いますので、その説明をします。

それではまた家賃データを使って説明していきます。分布の形はこれですね。
![price_hist-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/fe838906-904e-a38a-9adf-90713ae622e6.png)
**Fig.5**

ここからQ-Qプロットを作成するにあたり中間生成物的なグラフを2つ用います。

1つめに使うのが、この家賃データを1つ1つ小さい順に並べて点を打ってグラフを描きます。全部で188個のデータであり、それを0から1の間に均等に並べています。
![House_price_sorted-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/d4dec698-f873-f64c-e1e2-614d85aacf58.png)
**Fig.6**

2つめのグラフとして、今回、理論分布として正規分布を仮定するので、正規累積分布関数のグラフを書いて使います。これも、家賃データと同数の188個の点で累積密度関数を表現します。
![cumulative_norm-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/a0749ea7-406a-81b3-7736-ef7a123a9492.png)
**Fig.7**

この2つのグラフを組み合わせることで、Q-Qプロットのグラフが書けるのです。それをアニメーショングラフで見てみましょう。

![Q-Q_plot_House_price-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/50670/2407ee62-6c55-3d79-07b3-ee812d3a19b1.gif)
**Fig.8**

先ほどの中間生成物グラフFig.6が右上, Fig.7が左下のグラフにあたります。左上がターゲットとなるQ-Qプロットです。まず右上の家賃データのグラフの横軸は分位数を表しており、同じく左下の正規累積分布関数の縦軸も分位数を表しています。右上、左下それぞれの、この分位数を同時に0から1に向かってスライドさせます。それを黒い線が表しています。黒い線と交わっている点を赤い点で表示しています。この赤い点同士を同時にプロットしたものがQ-Qプロットなのです。点線がそれを表しています。
このQ-Qプロットの"Q"とはQuantile"（分位数）を表しており、右上、左下のグラフの分位数を同時に動かしていることからこの名前が付いているのだと思います。

(Pythonコードは[こちら](https://gist.github.com/matsuken92/acff9fc19b680531792c#file-05_q-qplot_animation-py))

#4.正規分布に従う乱数のQ-Qプロット#
さて、データと理論分布が同じ場合Q-Qプロットは直線になるということでしたので、これも試してみたいと思います。ということは、正規分布に従う乱数を使うということですね。
正規分布に従う乱数188個をヒストグラムにしたものがこちらです。
![Norm_hist-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/f0283131-36d8-3ee0-3310-87480174c29d.png)

さらにQ-Qプロットを描いてみると・・・
確かに直線になっていますね :relaxed: 
![Q-Q_plot_Norm-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/50670/27623f96-9555-aea9-68a8-6a770a39ec4d.gif)


#5.指数分布に従う乱数のQ-Qプロット#
次は指数分布です。右に裾が長い分布ですね。
![Exp_hist-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/3de3b47e-4d1a-d6dc-0f26-ebb90078a407.png)

このような形状の場合、正規Q-Qプロットは右下に凸な形になります。
![Q-Q_plot_Exp_Dist-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/50670/f17e72df-c5fa-613d-8eb2-6061b1411077.gif)


#6.F分布に従う乱数のQ-Qプロット#
ちょっとだけ右に裾が長いタイプのF分布です。
![F_hist-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/f6a5e644-b72f-cb0d-0cc2-3144f1b47532.png)
これも、ちょっとだけ、右下に凸なQ-Qプロットが描けています。
![Q-Q_plot_F_Dist-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/50670/3e848be8-1ad0-2977-d4fd-d869bae61cd0.gif)


#6.β分布に従う乱数のQ-Qプロット#
次に左に裾が長いタイプの分布、$\alpha=6, \beta=2$のベータ分布を用いてQ-Qプロットを書いてみます。
![Beta_hist-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/7861ce16-b687-230f-7d04-88bee13227f0.png)
今度は逆に左上に凸なQ-Qプロットが描けています。
![Q-Q_plot_Beta_Dist-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/50670/1a88da91-63b6-9039-cb87-ddfccad5aac2.gif)

ちょっと変わりどころだと、$\alpha=0.5, \beta=0.5$のベータ分布で、両サイドに頂点があるような分布です。この場合途中まで右下に凸、後半は左上に凸、というQ-Qプロットが描けています。
![Beta_hist2-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/3efe564e-bc53-94f5-88a8-60ed23c11984.png)
![Q-Q_plot_Beta_Dist2-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/50670/9a780134-3ba5-adcc-4411-845c7ecc276b.gif)


このページで記載しているグラフを描画するPythonコードの全文は[こちら](https://gist.github.com/matsuken92/acff9fc19b680531792c)