5
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Jupyterでデータ分析を全力で楽しむ!(2)最小二乗法

Posted at

 お疲れ様です。
 今回は第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)

 これで実行すると、次のように出力されました。
 今回使うデータセットの内容です。

jupyter005.png

 ここで記載されている各カラムの意味を記載しておきます。
 下記から引用しました。
 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$軸が犯罪発生数ですね、なんだか反比例の傾向が見えそうですね。

jupyter006.png

最小二乗法を使って関係性を出してみよう

 まずは簡単な最小二乗法を使って、線形的な関係性を出してみます。

# 最小二乗法で誤差が最も少なくなる直線を得る
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()

jupyter007.png

 おお、犯罪発生数の増加とともに家の価格が下がるのが表現できてます。
 これは直感と合致してますね。

 ただ、線形で表現するにはここまでが限界っぽいですね、
 反比例で表現するにはどうしたらいいのかな…?

 今回はここまで。

5
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?