RStudio - R言語の基礎 #04、データの回帰分析・相関分析(diamondsデータ)

Googleデータアナリティックスプロフェッショナルを受講しています。
今回はR言語のデータフレームの扱い、回帰分析・相関分析を通した視覚化と統計的仮説検定を行う方法について学習しました。

https://www.coursera.org

## データフレーム

R言語では、データはデータフレームという形式で処理されます。
今回は例題として、ggplot2に含まれるダイアモンドに関するデータを利用します。

```r
library(tidyverse)
library(ggplot2)

#ダイアモンドに関する売買データ
data("diamond")

#データフレームを表示
View(diamonds)

#基礎統計量
summary(diamonds)

#先頭5行
head(diamonds)

#データ型・カテゴリー数を表示
str(diamonds)

#格納されているデータを表示
glimpse(diamonds)

#データフレームに新しい行を追加 - カラットを100倍にした値を追加する
mutate(diamonds, carat_100 = carat*100)
```

![R010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/51e9bc1a-3e62-416d-70c6-6eee42e44b13.png)

## データの回帰分析
Rのパッケージを使えば変数の近似曲線を計算・相関行列の可視化ができる他、定量データの間に統計的に有意な関係があるかを検定できます。具体的には、重回帰分析した結果得られた係数の等平均性の検定（※係数＝0を帰無仮説とする）、無相関検定(※r=0)を行えます。因果関係・相関関係の有無が統計的に検証できるわけですね。相関行列の可視化には、corrplotというパッケージを使用しています。

```r
#facet機能を使って色ごとのカラット-価格の関係を分布図にする
ggplot(data=diamonds, aes(x=carat, y=price)) + geom_point(aes(color=cut))+facet_wrap(~cut)
```
![R011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/b6dea538-e845-fefd-e962-a1cbec4bd713.png)

```r
#近似直線を描き、95%信頼区間を描写する
ggplot(data=diamonds, aes(x=carat, y=price)) + geom_point(aes(color=cut))+facet_wrap(~cut) + stat_smooth(method=lm, level=0.95)
```
![R012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/3c877b72-5808-07d3-9ce5-418465f20ec6.png)

```r
#定量データを使って価格（price）を重回帰分析する。価格と定量データに有意な因果関係があるかを検定できる
diamonds_quantity <- diamonds[,c(1,5,6,7,8,9,10)]
View(diamonds_quantity)
result_mra <- lm(price ~ carat + depth + table + x + y + z, data = diamonds_quantity)
summary(result_mra)
```
![R013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/2a171134-3c2e-8dfd-72d6-6b303e58f271.png)

定量データを抽出して重回帰分析すると、カラット数が大きくなると価格が上昇するのに対し、x方向のサイズが大きくなると逆に価格が下がってしまうという傾向があることが分かります。これらが統計的に有意な値(p値 - 2* 10^-16以下)なのに対し、z方向のサイズは価格と有意な関係がないことが分かります。

## データの相関分析

corrplot・psychを使って相関係数を視覚化 + 無相関検定を行います。定量データに有意な相関関係があるかを検定できます。

```r
library(corrplot)
library(psych)

#相関係数を視覚化
result_corr <- cor(diamonds_quantity)
corrplot(result_corr, tl.col="black", method="number")
#相関係数に加え、分布とヒストグラムを描写する
psych::pairs.panels(diamonds_quantity)
```
![R014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/8309ff73-3d7a-a829-2a35-b5ea574cd76a.png)

![R015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/e3a15030-2baf-a529-97ff-c6a3caf051f1.png)


```r
#価格とカラット数を無相関検定(r=0とした際の等平均性をt検定する)
cor.test(diamonds$price, diamonds$carat,method="pearson")
```

![R016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/b6f83de3-c3be-1d11-3129-2a2133183c96.png)

価格・カラット数の相関係数が統計的に有意か否かは、t検定を用いると判定することができます。検証した結果、r=0である確率は極めて低いことが分かりましたので、対立仮説であるr≠0が採用されます。

今回はデータの回帰分析・相関分析をする方法を学んだおかげで本格的なデータ分析ができるようになりました。この調子で頑張りたいと思います。

## 使ったコード集

```r
library(tidyverse)
library(ggplot2)
library(corrplot)

#ダイアモンドに関する売買データ
data("diamond")
#データフレームを表示
View(diamonds)
#基礎統計量
summary(diamonds)
#先頭5行
head(diamonds)
#データ型・カテゴリー数を表示
str(diamonds)
#格納されているデータを表示
glimpse(diamonds)

#データフレームに新しい行を追加 - カラットを100倍にした値を追加する
mutate(diamonds, carat_100 = carat*100)

#色がEの場合のみを表示する
filtered_diamonds <- filter(diamonds, color=="E")
View(filtered_diamonds)

#facet機能を使って色ごとのカラット-価格の関係を分布図にする
ggplot(data=diamonds, aes(x=carat, y=price)) + geom_point(aes(color=cut))+facet_wrap(~cut)

#近似直線を描き、95%信頼区間を描写する
ggplot(data=diamonds, aes(x=carat, y=price)) + geom_point(aes(color=cut))+facet_wrap(~cut) + stat_smooth(method=lm, level=0.95)

#局所多項式による近似曲線を描く
ggplot(data=diamonds, aes(x=carat, y=price)) + geom_point(aes(color=cut))+facet_wrap(~cut) + stat_smooth(level=0.95)

#定量データを使って価格（price）を重回帰分析する。価格と定量データに有意な因果関係があるかを検定できる
diamonds_quantity <- diamonds[,c(1,5,6,7,8,9,10)]
View(diamonds_quantity)
result_mra <- lm(price ~ carat + depth + table + x + y + z, data = diamonds_quantity)
summary(result_mra)

#corrplotを使って相関係数を視覚化 + 無相関検定を行う。定量データに有意な相関検定があるかを検定できる

result_corr <- cor(diamonds_quantity)
corrplot(result_corr, tl.col="black", method="number")
psych::pairs.panels(diamonds_quantity)

#価格とカラット数を無相関検定(r=0とした際の等平均性をt検定する)
cor.test(diamonds$price, diamonds$carat,method="pearson")
```