住宅価格予想 statsmodels

住宅価格予想 statsmodels

Pythonのstatsmodelsライブラリを使用して、現実的なデータ分析の問題を解決する例を提供します。

以下に、住宅価格のデータセットを使用して、価格を予測するための線形回帰モデルを構築する例を示します。

例題

問題: 住宅の面積、部屋数、築年数を使って、住宅価格を予測する線形回帰モデルを構築してください。

ステップ

  1. データを読み込む
  2. データの前処理を行う
  3. モデルを構築する
  4. モデルを評価する

必要なライブラリのインストール

まず、必要なライブラリをインストールします。これにはpandasstatsmodelsが必要です。

1
pip install pandas statsmodels

コード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import pandas as pd
import statsmodels.api as sm

# データの読み込み
# 例として、以下のようなCSVファイルを使うとします
# 面積 (平方フィート), 部屋数, 築年数, 価格 (USD)
data = {
'area': [1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400],
'rooms': [3, 3, 3, 4, 4, 4, 5, 5, 5, 5],
'age': [10, 15, 20, 25, 5, 10, 15, 20, 25, 5],
'price': [300000, 320000, 340000, 360000, 380000, 400000, 420000, 440000, 460000, 480000]
}

df = pd.DataFrame(data)

# 独立変数 (特徴量) と従属変数 (ターゲット) の設定
X = df[['area', 'rooms', 'age']]
y = df['price']

# 定数項を追加
X = sm.add_constant(X)

# モデルの構築
model = sm.OLS(y, X).fit()

# モデルの概要を表示
print(model.summary())

# 新しいデータで予測
new_data = pd.DataFrame({'const': 1, 'area': [2500], 'rooms': [4], 'age': [10]})
prediction = model.predict(new_data)

print(f"予測された価格: ${prediction[0]:,.2f}")

説明

  1. データの読み込み: データは辞書として定義され、pandasのデータフレームに変換します。
  2. 特徴量とターゲットの設定: 面積、部屋数、築年数を特徴量として、価格をターゲットとします。
  3. 定数項の追加: statsmodelsでは、定数項(切片)を明示的に追加する必要があります。
  4. モデルの構築: OLS (最小二乗法) を使用して回帰モデルを構築し、モデルをフィッティングします。
  5. モデルの評価: summary メソッドでモデルの概要を表示します。
  6. 予測: 新しいデータポイントで予測を行います。

この例では、住宅価格のデータを基にして線形回帰モデルを構築し、モデルの概要を出力します。また、新しいデータポイントに基づいて住宅価格を予測します。

これにより、statsmodelsを使った基本的な回帰分析の方法が理解できます。

ソースコード解説

以下のPythonコードは、statsmodelsライブラリを使用して線形回帰モデルを構築し、住宅価格を予測するプロセスを示しています。

コードの各章立てについて詳しく説明します。

1. 必要なライブラリのインポート

1
2
import pandas as pd
import statsmodels.api as sm

ここでは、データ操作のためにpandasライブラリ、統計モデリングのためにstatsmodelsライブラリをインポートしています。

2. データの読み込み

1
2
3
4
5
6
7
data = {
'area': [1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400],
'rooms': [3, 3, 3, 4, 4, 4, 5, 5, 5, 5],
'age': [10, 15, 20, 25, 5, 10, 15, 20, 25, 5],
'price': [300000, 320000, 340000, 360000, 380000, 400000, 420000, 440000, 460000, 480000]
}
df = pd.DataFrame(data)

ここでは、住宅の面積、部屋数、築年数、および価格に関するデータを持つ辞書を定義し、それをpandasのデータフレームに変換しています。

3. 独立変数 (特徴量) と従属変数 (ターゲット) の設定

1
2
X = df[['area', 'rooms', 'age']]
y = df['price']

この部分では、住宅価格を予測するために使用する特徴量(面積、部屋数、築年数)をXとして、ターゲット変数(価格)をyとして設定しています。

4. 定数項を追加

1
X = sm.add_constant(X)

statsmodelsの線形回帰モデルでは、データに定数項(バイアス)を追加する必要があります。add_constant関数を使用して、特徴量データフレームに定数項を追加しています。

5. モデルの構築

1
model = sm.OLS(y, X).fit()

ここでは、OLS(Ordinary Least Squares: 最小二乗法)を使用して線形回帰モデルを構築し、データにフィットさせています。

6. モデルの概要を表示

1
print(model.summary())

model.summary()を使って、回帰モデルの詳細な結果を表示しています。この結果には、決定係数(R-squared)、回帰係数、p値などの統計情報が含まれています。

7. 新しいデータで予測

1
2
3
4
new_data = pd.DataFrame({'const': 1, 'area': [2500], 'rooms': [4], 'age': [10]})
prediction = model.predict(new_data)

print(f"予測された価格: ${prediction[0]:,.2f}")

最後に、新しいデータポイント(面積: 2500平方フィート、部屋数: 4、築年数: 10)を使って価格を予測しています。
この新しいデータには、前に追加した定数項も含める必要があります。
model.predictを使って価格を予測し、その結果をフォーマットして表示しています。

解説

  • 定数項の追加: 線形回帰モデルでは、バイアス項(定数項)を追加することで、モデルの予測が正確になることが多いです。
    これは、入力特徴量がすべてゼロの場合でも一定の予測値を出力するために必要です。
  • OLSの使用: OLSは、線形回帰モデルをフィットさせるための一般的な方法です。
    ターゲット変数と特徴量の関係を線形に近似します。
  • モデル評価: summary()関数は、モデルのパフォーマンスを評価するための詳細な統計情報を提供します。
    これにより、モデルの有効性や各特徴量の影響を評価できます。
  • 予測: 新しいデータポイントを使って予測を行う際には、モデルに適用したのと同じ前処理(定数項の追加など)を行う必要があります。

このコードは、基本的な線形回帰モデルの構築と予測のプロセスを示しています。
データの前処理からモデルの評価、そして新しいデータに対する予測までの一連の流れを学ぶのに役立ちます。

結果解説

[実行結果]

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  price   R-squared:                       1.000
Model:                            OLS   Adj. R-squared:                  1.000
Method:                 Least Squares   F-statistic:                 2.164e+30
Date:                Sat, 13 Jul 2024   Prob (F-statistic):           1.73e-90
Time:                        01:29:56   Log-Likelihood:                 222.01
No. Observations:                  10   AIC:                            -436.0
Df Residuals:                       6   BIC:                            -434.8
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const      -2.328e-10   1.99e-10     -1.171      0.286   -7.19e-10    2.54e-10
area         200.0000   2.43e-13   8.22e+14      0.000     200.000     200.000
rooms       5.821e-11   8.44e-11      0.690      0.516   -1.48e-10    2.65e-10
age        -1.819e-12    3.3e-12     -0.552      0.601   -9.89e-12    6.25e-12
==============================================================================
Omnibus:                        0.133   Durbin-Watson:                   0.667
Prob(Omnibus):                  0.936   Jarque-Bera (JB):                0.294
Skew:                           0.198   Prob(JB):                        0.863
Kurtosis:                       2.258   Cond. No.                     1.80e+04
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.8e+04. This might indicate that there are
strong multicollinearity or other numerical problems.
予測された価格: $500,000.00

この出力結果は、statsmodelsを用いて実行した線形回帰モデルの概要を示しています。

それぞれの項目について説明します。

モデル全体の評価

  1. R-squared (決定係数): 1.000

    • モデルがターゲット変数(価格)の分散をどれだけ説明しているかを示します。

    1.000は、モデルがデータを完全に説明していることを示します。

  2. Adj. R-squared (自由度調整済み決定係数): 1.000

    • 自由度を考慮して調整された決定係数です。
      これも1.000であり、モデルが非常に良くフィットしていることを示しています。
  3. F-statistic: 2.164e+30

    • モデル全体の有意性を検定するための統計量です。
      非常に大きな値であり、モデルが有意であることを示しています。
  4. Prob (F-statistic): 1.73e-90

    • F検定のp値です。
      非常に小さい値であり、モデル全体が有意であることを示しています。

個々の係数の評価

  1. const (定数項): -2.328e-10 (標準誤差: 1.99e-10, p値: 0.286)

    • 定数項の値です。
      p値が0.286であり、統計的に有意ではないことを示しています。
  2. area (面積): 200.0000 (標準誤差: 2.43e-13, p値: 0.000)

    • 面積の係数です。
      係数が200であり、非常に低い標準誤差と0.000のp値から、面積が価格に非常に強い影響を持つことが分かります。
  3. rooms (部屋数): 5.821e-11 (標準誤差: 8.44e-11, p値: 0.516)

    • 部屋数の係数です。
      p値が0.516であり、統計的に有意ではないことを示しています。
  4. age (築年数): -1.819e-12 (標準誤差: 3.3e-12, p値: 0.601)

    • 築年数の係数です。
      p値が0.601であり、統計的に有意ではないことを示しています。

モデルの統計量

  1. Omnibus: 0.133 (Prob Omnibus: 0.936)

    • 残差の正規性を検定するための統計量です。
      p値が0.936であり、残差が正規分布に従っていることを示しています。
  2. Durbin-Watson: 0.667

    • 残差の自己相関を検定するための統計量です。
      0に近いと正の自己相関があることを示し、2に近いと自己相関がないことを示します。
      ここでは0.667であり、正の自己相関がある可能性があります。
  3. Jarque-Bera (JB): 0.294 (Prob JB: 0.863)

    • 残差の正規性を検定するための統計量です。
      p値が0.863であり、残差が正規分布に従っていることを示しています。
  4. Skew: 0.198

    • 残差の歪度を示します。
      0に近い値は対称性を示します。
  5. Kurtosis: 2.258

    • 残差の尖度を示します。
      3に近い値は正規分布に近いことを示します。

注意点

  1. Condition Number (条件数): 1.8e+04
    • 高い条件数は、多重共線性やその他の数値的な問題がある可能性を示唆します。
      ここでは非常に高い値であり、多重共線性が存在する可能性があります。

予測された価格

最後に、モデルを使って新しいデータポイントの価格を予測しました。
結果として、予測された価格は$500,000.00でした。

この結果は、面積が価格に強く影響していることを示していますが、部屋数や築年数の影響は有意ではない可能性があります。
また、高い条件数はデータの多重共線性の問題を示唆しているため、注意が必要です。