住宅価格の予測は、不動産業界や金融機関にとって重要な課題です。本記事では、Kaggleの「House Prices: Advanced Regression Techniques」コンペティションのデータセットを使用して、Pythonで住宅価格を予測するモデルの作成方法を解説します。初心者の方でも理解しやすいように、データの前処理からモデルの評価まで、ステップバイステップで説明します。
データの取得と概要
まずは、Kaggleの「House Prices: Advanced Regression Techniques」コンペティションのページからデータをダウンロードします。データセットには、訓練データ(train.csv)とテストデータ(test.csv)が含まれており、訓練データには住宅の特徴量と販売価格が含まれています。
import pandas as pd
# データの読み込み
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
# データの形状を確認
print(f"訓練データの形状: {train.shape}")
print(f"テストデータの形状: {test.shape}")
訓練データには1460件、テストデータには1459件のサンプルが含まれています。各サンプルには、住宅の特徴量(例:面積、築年数、部屋数など)が含まれています。
データの前処理
次に、データの前処理を行います。これは、欠損値の処理やデータ型の変換などを含みます。
欠損値の確認
# 欠損値の数を確認
missing_values = train.isnull().sum()
missing_values = missing_values[missing_values > 0]
print(missing_values)
欠損値が存在する特徴量には、適切な処理が必要です。例えば、数値データであれば中央値で補完し、カテゴリデータであれば最頻値で補完することが一般的です。
データ型の変換
一部の数値データは、実際にはカテゴリデータとして扱うべき場合があります。例えば、‘MSSubClass’は建物のクラスを表す数値ですが、これはカテゴリデータとして扱うべきです。
# 'MSSubClass'をカテゴリ型に変換
train['MSSubClass'] = train['MSSubClass'].astype(str)
test['MSSubClass'] = test['MSSubClass'].astype(str)
特徴量の選択とエンジニアリング
モデルの性能を向上させるためには、重要な特徴量を選択し、新たな特徴量を作成することが重要です。
相関係数の確認
まず、各特徴量と目的変数(SalePrice)との相関係数を確認します。
import seaborn as sns
import matplotlib.pyplot as plt
# 数値データの相関係数を計算
corr_matrix = train.corr()
# 相関係数が高い特徴量を表示
top_corr_features = corr_matrix.index[abs(corr_matrix["SalePrice"]) > 0.5]
plt.figure(figsize=(10,10))
sns.heatmap(train[top_corr_features].corr(), annot=True, cmap="RdYlGn")
plt.show()
このようにして、目的変数と強い相関を持つ特徴量を特定できます。
新たな特徴量の作成
例えば、地下室の面積(TotalBsmtSF)と地上の居住面積(GrLivArea)を合計して、住宅の総面積を表す新たな特徴量を作成できます。
# 総面積の特徴量を作成
train['TotalSF'] = train['TotalBsmtSF'] + train['1stFlrSF'] + train['2ndFlrSF']
test['TotalSF'] = test['TotalBsmtSF'] + test['1stFlrSF'] + test['2ndFlrSF']
モデルの構築と評価
前処理と特徴量エンジニアリングが完了したら、モデルの構築と評価を行います。ここでは、線形回帰モデルを使用します。
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np
# 目的変数と特徴量を定義
X = train.drop(['SalePrice', 'Id'], axis=1)
y = train['SalePrice']
# 訓練データと検証データに分割
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=42)
# モデルの訓練
model = LinearRegression()
model.fit(X_train, y_train)
# 検証データで予測
y_pred = model.predict(X_valid)
# RMSEを計算
rmse = np.sqrt(mean_squared_error(y_valid, y_pred))
print(f"RMSE: {rmse}")
RMSE(Root Mean Squared Error)は、予測値と実際の値の差の二乗平均平方根であり、モデルの精度を評価する指標です。
予測と提出ファイルの作成
最終的に、テストデータに対して予測を行い、Kaggleに提出するためのファイルを作成します。
# テストデータで予測
test_predictions = model.predict(test.drop('Id', axis=1))
# 提出ファイルの作成
submission = pd.DataFrame({
'Id': test['Id'],
'SalePrice': test_predictions
})
# CSVファイルとして保存
submission.to_csv('submission.csv', index=False)
このCSVファイルをKaggleのコンペティションページにアップロードすることで、モデルの性能を評価できます。
まとめ
本記事では、Kaggleの「House Prices: Advanced Regression Techniques」コンペティションのデータを使用して、Pythonで住宅価格を予測するモデルの作成方法を解説しました。データの前処理、特徴量エンジニアリング、モデルの構築と評価、予測と提出ファイルの作成といった一連の流れを学ぶことで、機械学習の基本的なプロセスを理解できます。今後は、より高度なモデル(例:XGBoostやLightGBM)を試すことで、予測精度の向上を目指しましょう。
※本記事は、以下のKaggleノートブックを参考にしています: