ボストン住宅価格と諸要因の相関分析

作成: 日大生産工 MA 大前

  • これは、学部3, 4年生向けた、相関分析を体験するためのコードです。
  • Google Collaborately環境での使用を想定しています。何それという場合は、大前に聞いてください。

これは、大前研究室の卒業研究テーマの学習資料として作成されたものです。他のゼミ生がこのページを参考にして卒業研究を行う場合は、必ず事前に相談してください。異なる研究室なのに、同じテーマが卒業研究概要集に並んでいると、問題になるかもしれません。

0. 前準備

おまじないとして、以下を実行しておいてください。

In [1]:
import numpy as np
from sklearn.datasets import load_boston
import matplotlib.pyplot as plt
import scipy.stats as st

1. ボストン住宅価格データセットの取得

まずは、今回分析に使うデータセットをロードします。これは、ボストン住宅価格に関するデータセットで、どのような地域だと、住宅価格が安いのか、高いのかなど、分析することができます。

In [2]:
Boston_dataset = load_boston(return_X_y=False)
Boston_dataset.keys() # key一覧取得
Out[2]:
dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename'])

Boston_datasetの中には、['data', 'target', 'feature_names', 'DESCR', 'filename'] というデータがあることがわかりました。

まずは、targetとラベルづけられたデータを取り出し、BD_Yに代入してみます。

In [3]:
BD_Y = Boston_dataset["target"]
print("BD_Yのデータサイズ: ", np.shape(BD_Y))
print("・54番目: ", BD_Y[54])
print("・80番目: ", BD_Y[80])
BD_Yのデータサイズ:  (506,)
・54番目:  18.9
・80番目:  28.0

targetというデータは、506個の数字の集まりであることがわかりました。また、54番目のデータは18.9、80番目のデータは28であることがわかりました。これは、

  • 54番目の地域の住宅価格(中央値): 18.9 * 1000 [USD(米ドル)]
  • 80番目の地域の住宅価格(中央値): 28.0 * 1000 [USD(米ドル)]

ということを意味しています。イメージとしては、

  • ボストンが506区画に細かく分けられている。
  • 1区画ごとに住宅がたくさんある
  • その区画の住宅価格の中央値が、BD_Yに保存されている。
  • BD_Y[54]と書けば、54番目の地域の住宅価格を見ることができる

となります。

続いて、dataとラベルづけられたデータを取り出してみます。

In [4]:
BD_X = Boston_dataset["data"]
print("BD_Xのデータサイズ: ", np.shape(BD_X))
BD_Xのデータサイズ:  (506, 13)

取り出したデータは、506行、13列のサイズを有していることがわかりました。

  • 行: 上から下へ、縦に数えていくもの
  • 列: 左から右へ、横に数えていくもの

です。つまり、縦506、横13サイズの変数ということになります。506とは、ボストンを細かく分けたそれぞれの区画のどれかを意味していることは、想像しやすいと思います。それ一つ一つに、13個の情報が付与されていることになります。この情報は、以下の並びで保存されています。

In [5]:
print(Boston_dataset["feature_names"])
['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']

13個の英語が出てきました。これだけみてもよくわかりませんので、以下にまとめておきます。

  • 0番目: CRIM 犯罪の発生のしやすさ
  • 1番目: ZN 住居の密集具合
  • 2番目: INDUS 非小売業(サービス業)に与えられた土地の割合
  • 3番目: CHAS チャールズ川に接しているかどうか(0: No, 1: Yes)
  • 4番目: NOX 窒素濃度(空気の汚さ)
  • 5番目: RM 住居の部屋数
  • 6番目: AGE 1940年以前に建てられた住宅の割合
  • 7番目: DIS 雇用センターまでの距離
  • 8番目: RAD 大きな道路へのアクセスのしやすさ
  • 9番目: TAX 固定資産税の大きさ
  • 10番目: PTRATIO 教師あたりの生徒数
  • 11番目: B 黒人の比率が、63%から離れている度合い。Bkを黒人の比率としたとき、B = 1000(Bk – 0.63)^2 という定義
  • 12番目: LSTAT 低所得者の比率(← 差別につながらないように、十分注意してください)

ざっくり書いています。詳しく知りたい場合は、調べてみてください。

例えば、BD_X[54. 3]と記載すると、区画54の、3番目の情報(チャールズ川に接しているかどうか)が取り出されます。

In [6]:
print("区画54はチャールズ川に接しているか: ", BD_X[54, 3])
print("区画54の犯罪の起こりやすさ: ", BD_X[54, 0])

print("\n区画142はチャールズ川に接しているか: ", BD_X[142, 3])
print("区画142の犯罪の起こりやすさ: ", BD_X[142, 0])
区画54はチャールズ川に接しているか:  0.0
区画54の犯罪の起こりやすさ:  0.0136

区画142はチャールズ川に接しているか:  1.0
区画142の犯罪の起こりやすさ:  3.32105

このように、

  • 区画54は川に接しておらず、犯罪が少ない。
  • 区画142はチャールズ川に接しており、犯罪が多い。

などの情報が見て取れます。 ここからわかるように、BD_Xには、506区画に対する13個の情報がまとめられています。

2. 散布図による解析

データが得られたところで、いくつかの分析を行ってきます。分析は、何かしらの仮説を調べるために行うことが普通です。このため、以下の仮説を考えてみましょう。

  • 犯罪が発生しやすい地域は、住宅価格が低い
  • 犯罪が発生しにくい地域は、住宅価格が高い

これは確かにそんな関係がありそうです。しかし、正しいかはわかりません。この仮説が正しいのか誤っているのか、調べてみましょう。調べる方法にはいくつかありますが、今回は散布図を使用してみます。具体的には、

  • 横軸: 犯罪の発生のしやすさ
  • 縦軸: 住宅価格

として、図を作るわけです。これを行うには、「犯罪の発生のしやすさ」と「住宅価格」がどこに保存されているのか知らねばなりません。これは、

  • BD_X[:, 0] → BD_Xにある0列目のすべてのデータ → 506地区の「犯罪の発生のしやすさ」
  • BD_Y → 506地区の住宅価格

となります。この2つの情報で散布図を書くには、plt.scatter関数を利用します。

In [7]:
plt.scatter(BD_X[:, 0], BD_Y) # 横軸, 縦軸の順番
plt.xlabel("CRIM") # 横軸の名前
plt.ylabel("House price") # 縦軸の名前
plt.grid()
plt.show()

この散布図を見ると、犯罪の発生のしやすさ(CRIM)が大きいと、住宅価格(House price)が安いことがわかります。

3. 相関係数による解析

散布図を見ることで、視覚的に傾向を把握することが可能となりました。これを、定量的な数字でチェックしてみます。この方法の一つに、相関係数というものがあります。この特徴は以下の通りです。

  • 2つの要因(A, B)に、比例の関係があるかどうかを調べる方法
  • -1 から 1の範囲を取る。
  • +1に近いほど、「要因Aが高いほど要因Bも高い」、「要因Aが低いほど要因Bも低い」という傾向が強い
  • -1に近いほど、「要因Aが高いほど要因Bが低い」、「要因Aが低いほど要因Bが高い」という傾向が強い
  • 0に近いほど、要因Aと要因Bに上述の関係がないことを意味する
  • マイナスの値をとるとき、「負の相関関係がある」という
  • プラスの値をとるとき「正の相関関係がある」という
  • 相関係数が -0.2 〜 0.2 程度の範囲のとき、「相関関係はない」という(この基準は人の趣味や課題によります)

これを考えますと、先ほどの散布図で示した「住宅価格」と「犯罪の発生のしやすさ」は、相関係数がマイナスになりそうです。実際にこうなるのか、チェックしてみます。相関係数を算出するには、st.pearsonr関数を利用します。

In [8]:
cor = st.pearsonr(BD_X[:, 0], BD_Y)[0]
print(cor)
-0.38830460858681154

小数点以下の桁数が大きすぎるので、3桁くらいに調整してみましょう。

In [9]:
cor3 = np.round(cor, 3) # corにある値の小数点以下を、3桁に調整
print("犯罪の発生のしやすさと住宅価格の相関係数: ", cor3)
犯罪の発生のしやすさと住宅価格の相関係数:  -0.388

-0.4くらいの相関係数があることがわかりました。定量的にみても、

  • 犯罪が発生しやすい地域は、住宅価格が低い
  • 犯罪が発生しにくい地域は、住宅価格が高い

ということが言えることがわかりました。

4. 演習問題

(1)「犯罪の発生のしやすさ」だけではなく、他の12個の要因と「住宅価格」について、

  • 散布図
  • 相関係数

を出してください。

(2) 「住宅価格が高い」とは、お金がある人がその地域に住むことを意味しています。 どのような地域に、お金がある人が住む傾向があるのか、考察してください。

(3) (2)以外の観点から、自由に考察してください。

5. 卒業研究概要集への手引き

  • このテーマを卒業研究のテーマにしたい場合は、ここの対応をお願いします(必ず事前に相談してください)。
  • 以下、すべて含めて、A4用紙2枚にまとめてください。
  • 厳密に守る必要はありませんが、文章量の比率を目安にしてください(15%とは、A4用紙2枚分の15%という意味)。

1章 はじめに:(文章量の比率: 15%)

  • 相関係数、散布図とは何か、それを用いたどのような先行研究があるか、まとめてください。
  • 先行研究は、簡単にで良いので、2, 3個紹介してください。

2章 データセットについて:(文章量の比率: 30%)

  • ボストン住宅価格データの概要(どのような数値がまとめられたデータなのか?)について説明してください。

3章 実験:(文章量の比率: 40%)

3.1節 概要:

  • 自分が、何のために、どんな分析を行うのか、記載してください。

3.2節 結果と考察:

  • (結果)散布図、相関係数を示してください(図表があると良い)。
  • (考察)その結果から読み取れることを記載してください。
  • 結果は得られたものを淡々と説明し、個人の感想はいれない。逆に、考察は、自分の考えを書く。
  • 必要に応じて、図・表を作成してください。

人種差別や、低所得者への差別などにつながらないように、十分に注意してください。

4章 おわりに:(文章量の比率: 15%)

  • 今回の分析に対する感想などを記載してください。

参考文献:

参考にした資料を、2〜3件記載してください。以下、書き方の例です。

  • [1] 大前ほか, XXXに関する分析, XXX学会論文誌, 2020.
  • [2] XXXに関する情報, http://xxx.ddd.ttt.com, 2020年4月20日閲覧

本文中で引用する場合は「大前らはXXXを実施している [1]。また、〜」のように、どこで引用したのか明白にしてください。