🙆‍♀️

重回帰分析の勉強に使えそうなダミーデータを生成したい

2024/08/14に公開

はじめに

重回帰分析の勉強に使えそうなダミーデータを作ってみました。また、このダミーデータが期待したデータになっているか確認するスクリプトも作りました。

モジュール

スクリプト実行環境のモジュール情報です。

$ pip list
Package         Version
--------------- ------------
numpy           1.26.3
pandas          2.2.2
statsmodels     0.14.2

ダミーデータを作るスクリプト

コンソールでpython createDummyDate.pyと実行するとdummy_data.csvを出力します。

createDummyDate.py
import numpy as np
import pandas as pd

# データのサイズを設定
np.random.seed(0)
n_samples = 1000

# 説明変数とその係数を設定
elements = [
    {"Name": "X1", "Coef": 3},
    {"Name": "X2", "Coef": 5},
    {"Name": "X3", "Coef": -2}
]

# 説明変数の辞書を作成
X_dict = {}
for element in elements:
    X_dict[element["Name"]] = np.random.rand(n_samples)

# 目的変数(Y)を生成
noise = np.random.randn(n_samples)
Y = noise
for element in elements:
    Y += element["Coef"] * X_dict[element["Name"]]

# データフレームにまとめる
data = pd.DataFrame(X_dict)
data['Y'] = Y

# データを表示
print(data.head())

# CSVファイルとして保存
data.to_csv('dummy_data.csv', index=False)
  • 補足
    • X1,X2,X3が説明変数で、以下のように増やすこともできます。
# 説明変数とその係数を設定
elements = [
    {"Name": "X1", "Coef": 3},
    {"Name": "X2", "Coef": 5},
    {"Name": "X3", "Coef": -2},
    {"Name": "X4", "Coef": 1},
    {"Name": "X5", "Coef": 0.5}
]

出力されたダミーデータ

このようなダミーデータが出力されます。

dummy_data.csv
X1,X2,X3,Y
0.5488135039273248,0.5928802707811576,0.8115184706218832,4.7882676869042236
0.7151893663724195,0.01006369565609333,0.476083985968232,0.04861483199778527
 :

ダミーデータを検証するスクリプト

ダミーデータを重回帰分析し期待した結果になるか確認するスクリプトです。
モジュールをインストールが必要です。

  • インストールコマンド
    • pip install pandas
    • pip install statsmodels
analyzCorrelation.py
import pandas as pd
import statsmodels.api as sm

# データを読み込む
data = pd.read_csv('dummy_data.csv')

# 目的変数(Y)のカラム名を指定
Y_column = 'Y'

# 説明変数(X)のカラム名を自動的に取得
X_columns = data.columns.drop(Y_column)
X = data[X_columns]
Y = data[Y_column]

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

# 重回帰分析を実行
model = sm.OLS(Y, X).fit()

# 結果を表示
print(model.summary())

ダミーデータの検証

ダミーデータを検証してみます。

$ python .\analyzCorrelation.py
                            OLS Regression Results
==============================================================================
Dep. Variable:                      Y   R-squared:                       0.785
Model:                            OLS   Adj. R-squared:                  0.785
Method:                 Least Squares   F-statistic:                     1215.
Date:                Wed, 14 Aug 2024   Prob (F-statistic):               0.00
Time:                        07:17:03   Log-Likelihood:                -1391.3
No. Observations:                1000   AIC:                             2791.
Df Residuals:                     996   BIC:                             2810.
Df Model:                           3
Covariance Type:            nonrobust
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         -0.0843      0.098     -0.864      0.388      -0.276       0.107
X1             3.0094      0.106     28.361      0.000       2.801       3.218
X2             5.1010      0.103     49.473      0.000       4.899       5.303
X3            -2.0683      0.108    -19.231      0.000      -2.279      -1.857
==============================================================================
Omnibus:                        1.446   Durbin-Watson:                   1.842
Prob(Omnibus):                  0.485   Jarque-Bera (JB):                1.444
Skew:                           0.093   Prob(JB):                        0.486
Kurtosis:                       2.982   Cond. No.                         6.20
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

以下の左がダミーデータ作成時に設定した各説明変数の係数で、右がダミーデータを解析して算出した各説明変数の係数です。統計知識が乏しいので統計的な見方はできないのですが、それっぽい数値になったようです。


さいごに

商品の売り上げとか、家賃相場とか、リアルっぽいダミーデータの作り方について気が向いたら調べてみようと思います。

Discussion