カリフォルニアの住宅価格のデータセットを準備します。
これらのデータは、線形回帰や重回帰分析のアルゴリズムのテストや実験に、非常に頻繁に用いられるデータセットです。今回は、Pythonで、カリフォルニアの住宅価格のデータセットを準備する方法をまとめます。
データセットを準備する方法はいくつかありますが、今回はPythonのscikit-learnを用いた方法を紹介します。
- California Housing(カリフォルニアの住宅価格)のデータセットの概要
- データセットの準備(ダウンロード)
- データセットの確認と可視化
カリフォルニアの住宅価格のデータセットの概要
California Housing、カリフォルニアの住宅価格のデータセットは、1990年に行われた米国国勢調査で得られた1990年のカフィフォルニアにおける住宅価格のデータセットです。
カリフォルニアはアメリは西海岸でロサンゼルスなどがある地区です。カリフォルニアはGoogleやApple本社ががあるシリコンバレーでも知られています。
似たようなデータセットに、Boston Housingなどがありますが、Boston Housingは、人種差別や所得差別的に問題のあるようなデータ系列がいくつか含まれていることから、利用を控えるような動きが出ており、scikit-learnでも利用が非推奨になっています。(scikit-learnでは、version1.12代からAPIが削除されることが告知されています)
今回扱うCalifornia Housingは、1990年におけるアメリカのカリフォルニアの住宅価格のデータセットです。データ数は20640件もあり、506件しかなかったBostonHousingと比較して多くのデータがあり、近年流行りのディープラーニング等でも十分利用できる量のデータセットがあります。
ちなみにCalifornia Housingでは、データ1つ1つが1世帯に対応しているわけではなく、カリフォルニアの1地区に対応しており、データ自体はこれらの平均や中央値が利用されています。
California Housingでは、データ数が20640件ありますが、これはカリフォルニアの20640地区に相当するデータになっています。実際にそれぞれの1世帯に対応しているわけではないことは留意してください。
California Housingデータセットの準備
California Housingのデータセットは、scikit-learnでAPIが準備されており、簡単に入手できます。
sklearn.datasetsモジュールに含まれる、fetch_california_housingメソッドを利用するだけです。このメソッドを利用するために、ライブラリを諸々インポートします。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
実際にデータを確認してみましょう。
data_housing = fetch_california_housing()
train_x = pd.DataFrame(data_housing.data, columns=data_housing.feature_names)
train_y = pd.Series(data_housing.target, name="target")
train_x.head()
説明変数が8個、あることがわかりました。
各説明変数の概要とその内容はこのようになっています。
Medlnc | 世帯所得の中央値 | 各地区における、世帯平均所得。単位は10,000ドル |
HouseAge | 家の築年数 | 各地区における、家の平均築年数。単位は年 |
AveRooms | 部屋の平均数 | 各地区における、平均の部屋数。 |
AveBedrms | 寝室の平均数 | 各地区における、平均の寝室数。 |
Population | 居住人数の合計 | 各地区における、合計の居住人数数。 |
AveOcuup | 世帯人数の平均 | 各地区における、平均の世帯人数。 |
Latitude | 平均緯度 | 各地区における、代表地区の緯度。 (各地区におけるすべての家の緯度の平均だと思われる) |
Longitude | 平均経度 | 各地区における、代表地区の経度。 (各地区におけるすべての家の緯度の平均だと思われる) |
続いて、目的変数$y$の中身はこのようになっています。
こちらは、単位は10万ドルです。上述の8つの目的変数を利用して、この住宅価格を推定するのが、California Housingのデータセットになります。
データセットの確認と可視化
データのヒストグラムを表示
簡単にデータセットを可視化してみましょう。まず、今回のデータセットのような表形式のデータセットがある場合は、私はまず最初にヒストグラムを表示して全体のデータの傾向を見ます。
ヒストグラムを表示する場合、pandasのDataFrameのメソッドであるhistメソッドが便利です。
fig, ax = plt.subplots(figsize=(10,8))
plt.tight_layout()
train_x.hist(bins=20, ax=ax)
このようなヒストグラムが表示できました。ざっくりとした傾向がわかりますね。
データの相関を確認する
続いて、多変量のデータなので、データの系列間でどのような傾向があるか確認してみます。
機械学習で何かしら初めてのデータセットを利用する場合には、よくこのような傾向をみることを先に行います。California Housingは説明変数が全部で8系列あるので、これを${8}_C_{2} = 56$通りの組み合わせでプロットし、相関関係を確認していきましょう。
相関を簡単に確認するためには、pythonのライブラリであるsns(seaborn)がよく利用されます。
sns.pairplot(train_x)
このようになりました。これだとよくわかりません。さらに厳密に相関係数を導出してみましょう。
相関係数を導出する場合は、次のようになります。今回は、目的変数との相関も確認したいので、説明変数と目的変数を結合させた、DataFrameをつくり、その後相関関係をヒートマップにしています。
df_all = pd.concat([train_x, train_y], axis=1)
sns.heatmap(df_all.corr(), square=True)
ヒートマップはこのようになりました。
色が明るいところは相関が強く、逆に色が暗いところは負の相関になっています。これを見ると、家の価格(target)と相関が強いのは、MedIncであり、地区の平均収入が高いほど、家の価格も高くなっていることが確認できます。
人口が多いのはどのあたりか可視化する
緯度と経度のデータがあるので、せっかくなので、カリフォルニアの人口分布を可視化してみましょう。
利用するのは、Population、Latitude、Longitudeのデータです。緯度と経度(つまり場所を示します)によって、人口がどのように変わるのかを散布図を書いて可視化してみましょう。
import matplotlib.cm as cm
fig, ax = plt.subplots(1, 1, figsize=(5, 5), dpi=100)
cmap = cm.Blues
norm = mpl.colors.Normalize(vmin=population.min(), vmax=population.max())
ax.set_xlabel("Lattitude")
ax.set_ylabel("Longitude")
ax.scatter(train_x["Latitude"], train_x["Longitude"], s=10,
color=mpl.cm.ScalarMappable(norm=norm, cmap=cmap).to_rgba(train_x["Population"]))
上記のコードを実行するとい、このようになりまます。濃い青色になるほど、人口が多い地区になります。いくつか人口が密集しているスポットがありますね。