【Python演習】線形単回帰・線形重回帰

# データの読み込み

* 家賃のデータを使ってみましょう。
    * https://raw.githubusercontent.com/maskot1977/Statistics2017/master/home.txt

* 注意！ 以下のコードでは、Python 2 のノートブックでは正しく動きません。必ず、Python 3 のノートブックを使ってください。

```python
# URL によるリソースへのアクセスを提供するライブラリをインポートする。
import urllib.request 
```


```python
# 図やグラフを図示するためのライブラリをインポートする。
import matplotlib.pyplot as plt
%matplotlib inline
```

```python
# ウェブ上のリソースを指定する
url = 'https://raw.githubusercontent.com/maskot1977/Statistics2017/master/home.txt'
# 指定したURLからリソースをダウンロードし、名前をつける。
urllib.request.urlretrieve(url, 'home.txt') 
```

```python
# ファイル読み込みと出力
for line in open("home.txt"):
  print(line)
```

```python
Y = []
X = []
for line in open("home.txt"):
  c = line.split()
  print(c)
```

```python
Y = []
X = []
for line in open("home.txt"):
  c = line.split()
  Y.append(c[0])
  X.append(c[1])
```

```python
print(X)
print(Y)
```

```python
Y = []
X = []
for index, line in enumerate(open("home.txt")):
  if index == 0:
    continue
  c = line.split()
  Y.append(float(c[0]))
  X.append(float(c[1]))
```

```python
print(X)
print(Y)
```

## データの図示

```python
%matplotlib inline
plt.scatter(X, Y)
```

```python
%matplotlib inline
plt.scatter(X, Y)
plt.xlabel("Walking distance (min)")
plt.ylabel("Rent (yen)")
plt.grid()
plt.show()
```

* 参考資料（Pythonのインデントについて）
  * https://snowtree-injune.com/2018/08/19/indent/

# 線形単回帰

## 平均値


```python
# 平均値を求める関数を作ろう
def mean(list_):

```


```python
print(mean(X))
print(mean(Y))
```



## 分散


```python
# 分散を求める関数を作ろう
def variance(list_):

```


```python
print(variance(X))
print(variance(Y))
```



## 標準偏差


```python
# 標準偏差を求める関数を作ろう
import math
def standard_deviation(list_):

```


```python
print(standard_deviation(X))
print(standard_deviation(Y))
```



## 共分散


```python
# 共分散 = 偏差積の平均 （偏差値、ではありません。偏差積、です）を作ろう
def covariance(list1, list2): 

```


```python
print(covariance(X, Y))
```



## 相関係数


```python
# 相関係数 = 共分散を list1, list2 の標準偏差で割ったものを作ろう
def correlation(list1, list2):

```


```python
print(correlation(X, Y))
```



## 回帰直線


```python
# 回帰直線の傾き＝相関係数＊（（yの標準偏差）／（xの標準偏差））を求める関数を作ろう
def a_fit(xlist, ylist):

```


```python
print(a_fit(X, Y))
```




```python
# y切片＝yの平均－（傾き＊xの平均）を求める関数を作ろう
def b_fit(xlist, ylist):

```


```python
print(b_fit(X, Y))
```

```python
# 回帰直線の式を表示
print("y = f(x) = {0} x + {1}".format(a_fit(X, Y), b_fit(X, Y)))
```


# 線形重回帰

線形単回帰では、「徒歩何分」から「家賃」を求めました。 <b>線形重回帰</b>では、「徒歩何分」と「広さ何m2」から「家賃」を求めてみましょう。

```python
Y = []
X1 = []
X2 = []
for index, line in enumerate(open("home.txt")):
  if index == 0:
    continue
  c = line.split()
  Y.append(float(c[0]))
  X1.append(float(c[1]))
  X2.append(float(c[2]))
```


* a の影響を除いた、b と y の <b>偏回帰係数</b> = （__r__<sub>by</sub> - (__r__<sub>ay</sub> __r__<sub>ab</sub>)) __σ__<sub>y</sub> /  ((1 - __r__<sub>ab</sub><sup>2</sup>) __σ__<sub>b</sub>)
    * ただし __r__ は相関係数、 __σ__ は標準偏差とする。

```python
# a の影響を除いた、b と y の偏回帰係数 partial regression coefficient を求める関数を作ろう
def partial_regression(A, B, Y):

```


```python
# 定数 w1 = （x2 の影響を除いた、x1 と y の偏回帰係数）
w1 = partial_regression(X2, X1, Y)
```


```python
# 定数 w2 = （x1 の影響を除いた、x2 と y の偏回帰係数）
w2 = partial_regression(X1, X2, Y)
```


```python
# 定数 t　＝　yの平均　－　w1*「x1の平均」　－　w2*「x2の平均」
```


```python
# 回帰直線の式を表示
print("y = f(x) = {0} X1 + {1} X2 + {2}".format(w1, w2, t))
```