ギークなエンジニアを目指す男

基幹系SIerがWeb系とかネイティブ系の知識を蓄えようとするブログ

MENU

重回帰分析を行なってみたことのまとめ。その1(Python)

今回は重回帰分析で得た知識をつらつら書いていこうと思う。
私、機械学習初心者のため「何言ってんだこいつ」という箇所があるかもしれないが、そこはスルーせずにコメントいただけるととても嬉しい。

今回は賃貸データから家賃を導きだす、ということをモチベーションに機械学習を行なっていく。

CSVデータの読み込み

まずは分析対象のデータの読み込みを行なった。
Pythonには機械学習に必要なライブラリがとても多く(だからML = Pythonということなのだろう)、CSVデータの取り込みもサルでもできる。
(使用しているCSVファイルはこの記事の末尾にアップロード先を記載しています)

import numpy as np
import pandas as pd

# CSVファイルの読み込み
# xNが家賃を決定する項目、yが家賃($)のデータ
df = pd.read_csv('housing.csv')

ここでimportしているライブラリは2つ。
wikipediaから引用させてもらうと以下のようなもの。

  • numpy

    プログラミング言語Pythonにおいて数値計算を効率的に行うための拡張モジュールである。 効率的な数値計算を行うための型付きの多次元配列(例えばベクトルや行列などを表現できる)のサポートをPythonに加えるとともに、それらを操作するための大規模な高水準の数学関数ライブラリを提供する。

  • pandas

    プログラミング言語Pythonにおいて、データ解析を支援する機能を提供するライブラリである。特に、数表および時系列データを操作するためのデータ構造と演算を提供する。

説明が長くなったが、ライブラリさえimportしてしまえば、CSVファイルの取り込みなんぞ1行で書けてしまう。便利な時代だ。

データを見てみるとこんな感じ。

# データフレームの中身を表示
df.head()

f:id:taxa_program:20180516192730p:plain

ちなみに、取り込んだデータの統計情報なども一発で表示(取得)できる。
これは、取り込んだファイルにデータの不備がないかなどを確認するのとても便利だったりする。

# 統計量の算出
df.describe()

f:id:taxa_program:20180516192945p:plain

分布の確認

取り込んだデータの分布確認も行なってみた。
これは重回帰分析と直接の関係はないが、分布と相関関係の確認は毎回行う方が良いって偉い人が言っていた。
(相関関係の確認は次のセクションで)

まず、分布を視覚的に確認するためのライブラリのimportを行う。

# インライン表示するためのおまじない
%matplotlib inline
# Matplotlibのラッパー的存在のチャート描画ライブラリ
import seaborn as sns

以下ライブラリの説明。(seaborn はwikipediaがなかった・・・)

  • seaborn

    Pythonチャートを描く場合の定番は「matplotlib」ですが、その見た目のやや野暮ったい感じと、表記法のややこしさが指摘されています。 Matplotlibの機能をより美しく、またより簡単に実現するためのラッパー的存在が「Seaborn」である。

例えば、今回求めたい家賃のチャートを表示させてみる。

# 分布の確認
sns.distplot(df['y'], bins=20)

f:id:taxa_program:20180516194503p:plain 'y'の部分を変えることにより各入力項目(x1, x2 ... xN)の値分布を確認できたりする。ここで正規分布しているデータは学習に使えそうだな、などの確認が直感的に分かる。正規分布しているデータが使えそうな理由としては、今回求めたい家賃(y)の値が正規分布しているからである。

今回のデータは海外データのため、y軸の単位はドルなので、20ドル近辺の賃貸が多いことが分かる。 そしてやはり安すぎる or 高いすぎる家賃データは少ない。(正規分布

相関関係の確認

偉い人がやっておけと言ったことPART2
一般的に相関関数とは、2つの物理量の間の相関を表す量だと定義づけられている。

# 相関係数(correlation)の算出
df.corr()

f:id:taxa_program:20180516195723p:plain

値をしては、基本的に -1 ~ 1 の範囲をとる。0の場合は無関係。絶対値として1に近いものは相関があるデータといえるだろう。
今回の場合、x6、x13のyとの相関係数が約0.7なので、使えそうなデータではないかと判断できる。

数値で見ただけではどうしてもイメージできないよ、って人に朗報。
こんな感じで可視化できたりする。
seabornサマサマです。

# 相関関係を目視で確認
sns.pairplot(df)

f:id:taxa_program:20180516200125p:plain

yとの関係性のみ切り取って見てみる。

f:id:taxa_program:20180516200407p:plain

左からx1, x2, ... yとyの相関である。 この画像からもx6とx13は正規分布していることが分かる。

説明変数と目的変数の切り分け

さて、重回帰分析の本筋に戻ります。
一旦取り込んだデータのおさらい。 x1〜x13までが説明変数で、yが家賃でしたね。

# 引数の3は先頭3行だけ表示してねってこと
df.head(3)

f:id:taxa_program:20180516200941p:plain

ここで、説明変数に当たるのがx1〜x13で、目的変数に当たるのがyです。
yは教師データとして学習させることになります。

ここで説明変数をX, 目的変数をyと分割させてみます。

# ilocは [行, 列] を番号で指定し参照するpandasの関数
X = df.iloc[:, :-1] 
y = df.iloc[:, -1]

Xを表示してみます。

print(X)

f:id:taxa_program:20180516201439p:plain

同様にyはこんな感じ。

print(y)

f:id:taxa_program:20180516201533p:plain

このあと、実際にモデルを構築し、訓練データを与えて学習させていくわけですが、少し長くなってしまったので別記事としてまとめます。

解析に使用したデータはこちらです。 github.com

続きを書きました。
taxa-program.hatenablog.com