お疲れ様です。
今回は第2弾、データセットを使って簡単なデータ分析をしてみたいと思います。
最小二乗法とは
測定で得られた数値の組を、適当なモデルから想定される1次関数、対数曲線など特定の関数を用いて近似するときに、想定する関数が測定値に対してよい近似となるように、残差の二乗和を最小とするような係数を決定する方法、あるいはそのような方法によって近似を行うことである。
(Wikipedia:https://ja.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95)
ライブラリを読み込む
まずはデータの読み込みや分析、グラフに必要なライブラリを読み込みます。
基本的なライブラリは下記のURLを参考にしてきましたので、今回もこれらのライブラリをまず読み込みます。
https://logics-of-blue.com/python-state-space-models/
他にライブラリが必要になってきた場合は、今回は適宜読み込むようにします。
# 基本のライブラリを読み込む
import numpy as np
import pandas as pd
from scipy import stats
from pandas.core import datetools
# グラフ描画
from matplotlib import pylab as plt
import seaborn as sns
%matplotlib inline
# グラフを横長にする
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 15, 6
# 統計モデル
import statsmodels.api as sm
データセットを読み込む
今回は、機械学習用ライブラリsckit-learnのデータセットである、Boston house-prices(ボストン市の住宅価格)を使って、簡単なデータ分析をしていきたいと思います。
# Boston house-prices (ボストン市の住宅価格)のデータセットを読み込む
from sklearn.datasets import load_boston
boston = load_boston()
# データの内容を表示する
pd.DataFrame(boston.data, columns=boston.feature_names)
これで実行すると、次のように出力されました。
今回使うデータセットの内容です。
ここで記載されている各カラムの意味を記載しておきます。
下記から引用しました。
http://pythondatascience.plavox.info/scikit-learn/scikit-learn%E3%81%AB%E4%BB%98%E5%B1%9E%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88
WORD | 意味 |
---|---|
CRIM | 人口 1 人当たりの犯罪発生数 |
ZN | 25,000 平方フィート以上の住居区画の占める割合 |
INDUS | 小売業以外の商業が占める面積の割合 |
CHAS | チャールズ川によるダミー変数 (1: 川の周辺, 0: それ以外) |
NOX | $NO_{x}$の濃度 |
RM | 住居の平均部屋数 |
AGE | 1940 年より前に建てられた物件の割合 |
DIS | 5 つのボストン市の雇用施設からの距離 (重み付け済) |
RAD | 環状高速道路へのアクセスしやすさ |
TAX | $10,000 ドルあたりの不動産税率の総計 |
PTRATIO | 町毎の児童と教師の比率 |
B | 町毎の黒人 ($Bk$) の比率を次の式で表したもの。$1000(Bk – 0.63)^{2}$ |
LSTAT | 給与の低い職業に従事する人口の割合 (%) |
関係性をグラフにプロットする
今回は犯罪発生数(CRIM)と家の価格の関係性を調べてみようと思います。
まずは生データの関係性をプロットしてみます。
# 犯罪発生数CRIMを取り出す
crime=boston.data[:,0]
# 家の値段を取り出す
prices=boston.target
# 犯罪発生率と家の値段の関係性をプロットする。
plt.scatter(prices,crime)
プロットした結果が下になります。
$x$軸が家の値段、$y$軸が犯罪発生数ですね、なんだか反比例の傾向が見えそうですね。
最小二乗法を使って関係性を出してみよう
まずは簡単な最小二乗法を使って、線形的な関係性を出してみます。
# 最小二乗法で誤差が最も少なくなる直線を得る
x = np.array([[v,1] for v in prices])
y = crime
(slope,bias), total_error, _, _ = np.linalg.lstsq(x, y)
この結果、得られた直線をプロットしてみます。
# グラフを表示する
plt.scatter(prices,crime,color='r')
plt.plot(x[:, 0], slope * x[:, 0] + bias)
plt.xlabel('crime')
plt.ylabel('price')
plt.grid()
plt.show()
おお、犯罪発生数の増加とともに家の価格が下がるのが表現できてます。
これは直感と合致してますね。
ただ、線形で表現するにはここまでが限界っぽいですね、
反比例で表現するにはどうしたらいいのかな…?
今回はここまで。