Rを使って一通りのデータマイニングを行う その１ - 相関をみる・回帰分析

# はじめに
## 対象読者
* 統計やAIについてほとんどわかっていないけど、これから必要だろうなぁ、と思ってる人
* R がほとんどはじめてだけど、統計とかやるなら使っておかないとなぁ、と思ってる人

## 書いた人
* 統計についてもほとんどわかっていないww
* R がはじめてw

# やってみよう
## データをCSVで準備する
まず、ここが重要です。 本当です。
出来るだけ自分の身近なデータをCSVで用意しましょう。 標準で用意されているサンプルデータをもとにいろいろ分析している例がよくありますが、サンプルを使ってしまうとなんだか結果がわかってるものでの出来レース的な……あと、やっぱりそれだと自分事に感じません。
ということで、ECサイトをやってる方なら自分のサイトの売上など、ぜひ自分に身近なものをお使いください。

といいながら、ここで出してもいい身近なデータがないので、適当にデータを作ってみました。 朝のテレビの占いの順位です。 なーんとなくですが、おとめ座の順位が良いときはしし座の順位が低いとかいつも思ってたんです。それを調べてみましょう！！

ということでCSVです。 ポイントはちゃんと文字列をダブルクォートでくくることです。 Excelはそこまでやってくれないのでエディタで頑張るかそういうツールをさがすかして頑張って作ってください。

日付と、その日の各星座の順位です。

```
"日付","さそり","おうし","しし","うお","おひつじ","ふたご","いて","やぎ","みずがめ","おとめ","かに","てんびん"
"2017/2/1","1","2","3","4","5","6","7","8","9","10","11","12"
"2017/2/2","11","12","6","9","3","1","4","10","2","8","7","5"
"2017/2/3","6","9","4","5","2","7","8","12","3","11","10","1"
"2017/2/4","5","1","10","6","8","9","11","3","12","2","4","7"
"2017/2/6","9","6","4","11","5","1","7","10","2","12","8","3"
"2017/2/7","12","11","3","8","4","7","10","5","1","9","6","2"
"2017/2/8","1","8","10","7","11","2","6","9","4","3","5","12"
"2017/2/9","3","4","7","1","12","10","11","6","9","2","5","8"
"2017/2/10","7","12","2","10","3","4","1","8","6","11","9","5"
```

これを``uranai.csv``とか適当な名前で保存しておきます。

## R を起動します
インストール方法は略。 調べたらいくらでも出てきます。 R の使い方も省略しますが、とりあえず、

```
> 1+2
[1] 3
```

が出るくらいまで進めてください。
（ちなみに、わたしはお手軽にフリーで使える``Microsoft R Open``を使ってます）

## CSVを読み込む
なにはともあれ、まずは、データを読み込ませます。 準備した csvファイル を読み込みます。
今回用意したものもそうですが、ほとんどのCSVは1行目がヘッダのカンマ区切りだと思いますので下記コマンドでいけます。

```
> d <- read.table("C:\\...\\uranai.csv", header=T, sep=",")
> d
       日付 さそり おうし しし うお おひつじ ふたご いて やぎ みずがめ おとめ かに てんびん
1  2017/2/1      1      2    3    4        5      6    7    8        9     10   11       12
2  2017/2/2     11     12    6    9        3      1    4   10        2      8    7        5
3  2017/2/3      6      9    4    5        2      7    8   12        3     11   10        1
4  2017/2/4      5      1   10    6        8      9   11    3       12      2    4        7
5  2017/2/6      9      6    4   11        5      1    7   10        2     12    8        3
6  2017/2/7     12     11    3    8        4      7   10    5        1      9    6        2
7  2017/2/8      1      8   10    7       11      2    6    9        4      3    5       12
8  2017/2/9      3      4    7    1       12     10   11    6        9      2    5        8
9 2017/2/10      7     12    2   10        3      4    1    8        6     11    9        5
```

``header=T`` で1行目がヘッダであること、``sep=","`` でカンマ区切りの指定です。 あと細かいところですがWindowsであればフォルダの区切りが``\``だと思うのですがエスケープが必要なので``\\``と2つつなげる必要あります。

## 最初の一歩の summary を使う
今後なにかとお世話になるのが``summary``です。 データをよきにはからってサマリーしてくれます。

```
> summary(d)
        日付       さそり           おうし            しし             うお           おひつじ          ふたご            いて             やぎ       
 2017/2/1 :1   Min.   : 1.000   Min.   : 1.000   Min.   : 2.000   Min.   : 1.000   Min.   : 2.000   Min.   : 1.000   Min.   : 1.000   Min.   : 3.000  
 2017/2/10:1   1st Qu.: 3.000   1st Qu.: 4.000   1st Qu.: 3.000   1st Qu.: 5.000   1st Qu.: 3.000   1st Qu.: 2.000   1st Qu.: 6.000   1st Qu.: 6.000  
 2017/2/2 :1   Median : 6.000   Median : 8.000   Median : 4.000   Median : 7.000   Median : 5.000   Median : 6.000   Median : 7.000   Median : 8.000  
 2017/2/3 :1   Mean   : 6.111   Mean   : 7.222   Mean   : 5.444   Mean   : 6.778   Mean   : 5.889   Mean   : 5.222   Mean   : 7.222   Mean   : 7.889  
 2017/2/4 :1   3rd Qu.: 9.000   3rd Qu.:11.000   3rd Qu.: 7.000   3rd Qu.: 9.000   3rd Qu.: 8.000   3rd Qu.: 7.000   3rd Qu.:10.000   3rd Qu.:10.000  
 2017/2/6 :1   Max.   :12.000   Max.   :12.000   Max.   :10.000   Max.   :11.000   Max.   :12.000   Max.   :10.000   Max.   :11.000   Max.   :12.000  
 (Other)  :3                                                                                                                                          
    みずがめ          おとめ            かに           てんびん     
 Min.   : 1.000   Min.   : 2.000   Min.   : 4.000   Min.   : 1.000  
 1st Qu.: 2.000   1st Qu.: 3.000   1st Qu.: 5.000   1st Qu.: 3.000  
 Median : 4.000   Median : 9.000   Median : 7.000   Median : 5.000  
 Mean   : 5.333   Mean   : 7.556   Mean   : 7.222   Mean   : 6.111  
 3rd Qu.: 9.000   3rd Qu.:11.000   3rd Qu.: 9.000   3rd Qu.: 8.000  
 Max.   :12.000   Max.   :12.000   Max.   :11.000   Max.   :12.000  
```

それぞれの項目に対して、``最小値(Min.)`` ``最大値(Max.)`` ``平均値(Mean)`` ``中央値(Median)`` などが出てきます。``1st Qu.``とかも出てますが……そういう難しいものはみなかったことにしましょう。
平均だけで見てもけっこうばらつきがありますね。 最少値（つまり一番運勢が良い）が"ふたご座"の"5.2"で、最大が"7.8"の"やぎ座"でした。

## 相関を見る
分析の一歩目は"相関"です。 たとえば、おとめ座が上位の時にはしし座がいっつも低い、とか、そんな風に思うことありませんか？？ というのをデータで見てみましょう。（今回はたかだか10件程度なのでデータなので結果も怪しいものですがとりあえずやってみましょう）

相関を見るためには対象が"数値"のデータの必要があります。今回のデータは1列目が日付（数値以外）になっているのでまずはその列を削除してあたらしいテーブルを作成します。

```
> d0 <- d[,-c(1)]
> d0
  おうし しし うお おひつじ ふたご いて やぎ みずがめ おとめ かに てんびん
1      2    3    4        5      6    7    8        9     10   11       12
2     12    6    9        3      1    4   10        2      8    7        5
3      9    4    5        2      7    8   12        3     11   10        1
4      1   10    6        8      9   11    3       12      2    4        7
5      6    4   11        5      1    7   10        2     12    8        3
6     11    3    8        4      7   10    5        1      9    6        2
7      8   10    7       11      2    6    9        4      3    5       12
8      4    7    1       12     10   11    6        9      2    5        8
9     12    2   10        3      4    1    8        6     11    9        5
```

``d[,-c(1)]``でdのテーブルから1列目を削除 ``d0 <-`` が d0 への代入です。 ちなみにもし 1列目と2列目 を削除したいなら ``d0 <- d[,-c(1,2)]`` です。 逆に 3列目と4列目を残したいなら ``d0 <- d[,c(3,4)]`` です。 慣れない記述だと思いますが慣れましょう。 慣れたらこの ``[x,y]`` や ``c(1,2)`` などの意味を調べてみましょう。
では、全てのデータが数値になったところで、``cor`` という関数を使って相関を見てみます。

```
> cor(d0)
             おうし       しし       うお   おひつじ       ふたご        いて       やぎ   みずがめ     おとめ       かに     てんびん
おうし    1.0000000 -0.4043956  0.5695839 -0.5316158 -0.495810126 -0.61479863  0.4368989 -0.7877264  0.4417356  0.1530283 -0.512476952
しし     -0.4043956  1.0000000 -0.2785098  0.7404322  0.112045281  0.37866006 -0.3198430  0.3831215 -0.8858894 -0.7830175  0.461805073
うお      0.5695839 -0.2785098  1.0000000 -0.5278946 -0.768124990 -0.60574770  0.2513363 -0.5867881  0.5333247  0.1047731 -0.412574459
おひつじ -0.5316158  0.7404322 -0.5278946  1.0000000  0.298198974  0.46145990 -0.4323076  0.4842961 -0.8633988 -0.6906478  0.645998789
ふたご   -0.4958101  0.1120453 -0.7681250  0.2981990  1.000000000  0.72102350 -0.6164676  0.6233068 -0.4249803 -0.2189061  0.007159875
いて     -0.6147986  0.3786601 -0.6057477  0.4614599  0.721023497  1.00000000 -0.5360579  0.3251968 -0.4991515 -0.4718083 -0.020918854
やぎ      0.4368989 -0.3198430  0.2513363 -0.4323076 -0.616467626 -0.53605790  1.0000000 -0.5947478  0.5829152  0.6257785 -0.209803008
みずがめ -0.7877264  0.3831215 -0.5867881  0.4842961  0.623306768  0.32519680 -0.5947478  1.0000000 -0.5568161 -0.1941512  0.560178799
おとめ    0.4417356 -0.8858894  0.5333247 -0.8633988 -0.424980285 -0.49915151  0.5829152 -0.5568161  1.0000000  0.8372230 -0.528824870
かに      0.1530283 -0.7830175  0.1047731 -0.6906478 -0.218906099 -0.47180829  0.6257785 -0.1941512  0.8372230  1.0000000 -0.143341021
てんびん -0.5124770  0.4618051 -0.4125745  0.6459988  0.007159875 -0.02091885 -0.2098030  0.5601788 -0.5288249 -0.1433410  1.000000000
```

出た。 この数字が"相関係数"といわれるもので、1 または -1 がもっとも相関が強い状態です。 例えば、おとめ座としし座には -0.88 という -1 に近い強い相関があります。 つまり、おとめ座の順位が高いときには、しし座の順位が低いという”強い相関”が見ることが出来ます。 なので、おとめ座が上位に出てきたところでしし座の人は「わー今日は順位が低い……」とわかってしまうのです。 逆に、てんびん座とふたご座には``0.007159875``という限りなくゼロに近い相関があります、つまり、ほとんど相関がありません。 てんびん座が何位だろうとふたご座は気にする必要がないのです。

## 回帰分析・・・急にむずかしそう
「相関がある」くらいは統計とかじゃなくても普通にでてきそうな日本語ですが…… 回帰分析となると急に統計っぽくなってきます。 言葉の意味はいったん忘れて、これで何ができるか？です。 （わたしは学者じゃなくエンジニアなので、この意味や真理を一生懸命追うよりも、これで何ができるかの方が大事なのです）
簡単に言ってしまえばこれです。

* しし座が X 位のときに、おとめ座が何位かをあてることができる

もう少し使えそうな例で考えてみると、例えば明日の気温がわかるとだいたいの（例えばアイスの）販売数が予測できる、みたいなことです。 気温は天気予報で教えてくれるので、明日は、これだけ下ごしらえが必要だな、みたいな推測ができます。

さっそくやってみましょう。

```
> d.lm <- lm(しし~おとめ, data=d)
> summary(d.lm)

Call:
lm(formula = しし ~ おとめ, data = d)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.0546 -1.2061  0.7939  0.9454  1.5952 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  10.3543     1.0913   9.488 3.02e-05 ***
おとめ       -0.6498     0.1286  -5.053  0.00148 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.49 on 7 degrees of freedom
Multiple R-squared:  0.7848,    Adjusted R-squared:  0.7541 
F-statistic: 25.53 on 1 and 7 DF,  p-value: 0.001476
```

うん、でましたが、難しいです。 まず ``lm`` というので分析をしてくれるのでその結果を適当に代入しています。 それっぽく ``d.lm`` という名前にしてますが ``a`` でも ``hoge`` でもなんでもいいです。 そのあと結果を``summary``で表示しています。
細かいデータはいったん無視して、というかわたしもわからないので、見るべきポイントだけ見ます。
ポイントは1つだけ。 ``Coefficients`` の ``Pr(>|t|)`` の数字です。 ``Pr(>|t|)``の数字が小さければ小さいほど良いです。 今回は十分小さいです。（``Pr(>|t|)``が十分に小さいと横の数字が``***``と星三つになります、今回は星3つと2つなのでよしとしましょう）
で、
この結果が何かというと、つまりは、こういうことです。

* しし座の順位 = -0.6498 * おとめ座の順位 + 10.3543
（Interceptが切片でおとめが係数です）

で、おとめ座の順位からしし座の順位を計算できる、ということになります。 では実際に計算してみましょう。計算結果が以下です。まぁまぁ、いい感じですね。
*ここで慣れた方なら R で計算して、R でグラフを描いたりするのですが、Excelで数式書く方が慣れてたらそっちでやっちゃいましょう。 R もExcelも単なる道具ですので*

|おとめ座|しし座|計算したしし座の順位の予測結果|
|------:|-----:|-------------:|
|10|3|3.8563|
|8|6|5.1559|
|11|4|3.2065|
|2|10|9.0547|

そこそこいい線いってますね。 すごい。 明日の朝のテレビの占いがこれで少しだけ楽しみになると思います。

# 次回
回帰分析では、計算結果から順位や気温や販売数などの「数値」を予測することができました。 では、数値ではなく Yes/No や 赤/白/青/黒 や 晴/雨 などを予測するにはどうすればいいでしょう？

そこで使われるのは「ロジスティック分析」らしいです。
（「らしい」というのは、本当にこれから調べるくらい自信がないのです。。違ったらこの記事をなおしますｗ）

それではまた次回。