【Lasso】中古マンション販売価格と賃貸物件家賃の分析 (2)

前回, 収集した中古マンション販売価格と賃貸物件家賃のデータを使って, Lasso回帰と Stan によるベイジアンモデリングを行ってみます。

Lasso回帰モデル

賃貸住宅家賃と中古マンション販売価格について Lasso で変数選択, モデル選択を行ってみます。

賃貸住宅家賃

3市区の家賃価格分布は下記となります。

price-hist-20150419

習志野市で選択された変数と回帰係数は下記です。

> coef(acs.cv1, s='lambda.1se')
47 x 1 sparse Matrix of class "dgCMatrix"
                                   1
(Intercept)              31658.57804
area                      1025.68918
distance                  -117.16888
is_near_the_big_station   1222.20392
typeアパート                 .      
typeその他                   .      
typeテラス・タウンハウス     .      
typeマンション               .      
type一戸建て                 .      
space1DK                     .      
space1K                      .      
space1LDK                 1898.13578
space1SK                     .      
space1SLDK                   .      
space2DK                     .      
space2K                      .      
space2LDK                    .      
space2SLDK                   .      
space3DK                     .      
space3LDK                    .      
space3SLDK                   .      
space4LDK                    .      
space4SLDK                   .      
spaceワンルーム              .      
floor_type-                  .      
floor_type洋                33.53721
floor_type和                 .      
structure-                   .      
structureその他              .      
structureプレコン            .      
structure軽量鉄骨            .      
structure鉄筋コン            .      
structure鉄骨                .      
structure鉄骨鉄筋        11178.01859
structure木造                .      
year_built                -347.64453
sunshine                     .      
washer                       .      
balcony                      .      
drier                        .      
autolock                  5273.48062
floor_class                  .      
loft                         .      
delivery_box                 .      
separator                    .      
lpg                          .      
parking                      .      

lasso-narashino-20150419

中古マンション販売価格

3市区の販売価格分布は下記となります。

price-hist-20150504

川口市で選択された変数と回帰係数は下記です。

> coef(acs.cv1, s='lambda.1se') # var selection
39 x 1 sparse Matrix of class "dgCMatrix"
                                 1
(Intercept)             1102.59643
area                      27.32408
area_other                 .      
distance                 -21.82444
floor                     20.31631
year_built               -30.45418
space1DK                   .      
space1K                    .      
space1LDK                  .      
space1LDK+S(納戸)        .      
space1ワンルーム           .      
space2DK                   .      
space2DK+S(納戸)         .      
space2K                    .      
space2K+S(納戸)          .      
space2LDK                  .      
space2LDK+S(納戸)        .      
space3DK                   .      
space3DK+S(納戸)         .      
space3LDK                  .      
space3LDK+S(納戸)        .      
space4DK                   .      
space4LDK                  .      
spaceワンルーム            .      
structure                  .      
is_near_the_big_station  233.58250
nearly_stations            .      
green                      .      
renovation                 .      
reform                     .      
nearly_store              11.25431
security                   .      
pet                        .      
south                      .      
delivery_box               .      
parking                    .      
pet.1                      .      
silent                     .      
elevator                   .      

lasso-narashino-20150504

ベイジアンモデリング

続いて, 賃貸住宅家賃と中古マンション販売価格について Stan でベイジアンモデリングを行ってみます。

環境はOSX 10.10.2, R 3.1.1, RStan 2.6です。RStanはRからStanへのインターフェイスです。インストールについては【R】OSXでRStanの導入【MCMC】

賃貸住宅家賃

前回と全く同じでは面白くないので3市区のデータをマージし, 各市区のデータに”都内”or”郊外”を表す urban_area という特徴量を追加しています。
具体的には川口市と習志野市には 0 , 豊島区には 1 を設定しました。モデルは正規線形モデルとします。

stanコードは以下です。

 stan_code <- '
  data {
    int N; // サンプルサイズ
    real rent[N]; // 家賃
    int urban_area[N]; // 都心or郊外
    vector[N] area; // 床面積
    vector[N] built; // 築年数
    vector[N] dist; // 距離
    vector[N] autolock; // オートロック
  }

  parameters {
    real alpha;
    real beta;
    real gamma;
    real sigma;
    real zeta;
    real e;
    real s;
  }

  model {
    for(i in 1:N)
      rent[i] ~ normal((alpha*urban_area[i]) + (beta*area[i]) + (gamma*built[i]) + (sigma*dist[i]) + (zeta*autolock[i]) + e, s);
  }
'

パラメータの収束は問題なさそうです。

 mean se_mean     sd      2.5%       25%       50%       75%     97.5% n_eff Rhat
alpha  23601.77   14.45 459.29  22724.96  23279.76  23598.99  23929.80  24463.59  1011 1.00
beta    1231.07    0.44  13.02   1205.00   1222.10   1230.97   1240.33   1256.17   895 1.00
gamma   -365.80    0.55  17.75   -399.19   -377.93   -366.12   -354.06   -330.66  1026 1.00
sigma   -412.73    1.19  37.39   -485.39   -437.22   -413.44   -388.57   -336.76   988 1.00
zeta   10807.91   14.56 475.80   9910.70  10479.14  10806.44  11128.76  11703.72  1069 1.00
e      30213.37   30.17 800.78  28647.84  29662.25  30213.33  30736.07  31830.08   705 1.01
s      12080.60    3.49 133.42  11824.94  11990.41  12077.81  12170.53  12354.35  1458 1.00
lp__  -41814.63    0.06   1.74 -41818.75 -41815.61 -41814.35 -41813.37 -41812.07   772 1.00

95%信用区間をplotしてみました。

bayesian_rental

bayesian_rental_2

中古マンション販売価格

賃貸住宅家賃予測と同様に正規線形モデルを指定, urban_areaという特徴量を追加し川口市と習志野市には0, 豊島区には1を設定しました。

stanコードは以下です。

stan_code <- '
  data {
    int N; // サンプルサイズ
    vector[N] price; // 価格
    int urban_area[N]; // 都心or郊外
    vector[N] area; // 床面積
    vector[N] built; // 築年数
    vector[N] dist; // 距離
    vector[N] upstairs; // 階数
  }

  parameters {
    real alpha;
    real beta;
    real gamma;
    real sigma;
    real zeta;
    real e;
    real s;
  }

  model {
    for(i in 1:N) {
      price[i] ~ normal((alpha*urban_area[i]) + (beta*area[i]) + (gamma*built[i]) + (sigma*dist[i]) + (zeta*upstairs[i]) + e, s);
    }
  }
'

パラメータの収束は問題なさそうです。

 
mean se_mean     sd     2.5%      25%      50%      75%    97.5% n_eff Rhat
alpha  2165.97    1.93  67.04  2036.50  2120.25  2165.70  2209.88  2297.25  1209    1
beta     42.41    0.04   1.39    39.75    41.41    42.41    43.38    45.18   988    1
gamma   -41.86    0.07   2.48   -46.78   -43.57   -41.89   -40.14   -37.05  1273    1
sigma   -37.77    0.18   6.48   -50.52   -42.07   -37.65   -33.29   -25.37  1265    1
zeta     31.35    0.19   6.39    18.80    27.13    31.18    35.57    43.75  1182    1
e       342.12    4.92 133.67    68.44   253.90   340.08   434.94   603.69   738    1
s       878.30    0.55  21.00   838.51   864.16   878.47   892.17   920.47  1454    1
lp__  -6587.21    0.07   1.92 -6591.78 -6588.28 -6586.84 -6585.83 -6584.50   688    1

95%信用区間をplotしてみました。

bayesian_purchase

bayesian_purchase_2

家賃予測モデル, 中古マンション価格予測モデルともに切片の信用区間の幅が広くなっています。モデルとしてはいまいちで改善の余地ありのようです。

階層ベイズモデル [1] までやらないと Stan を使う意味は薄かったと痛感しました。ただ, 無理やり階層化してみましたが s_r が収束しませんでした。

おわりに

所感ですが, Stanを使ってみて計算or収束までの時間が長い場合には以下を試してみると良いかもと思いました。

  • 取り得る値域が広いデータに対しては予めデータを標準化すること
  • まずは簡単なモデルでシミュレーションすること
  • 重回帰/RFなどで特徴量やパラメータに当たりをつけて, その結果を踏まえStanモデルについて再考すること

Stan実行時にErrorが発生する時は大抵, RからStanに渡すデータとData定義が一致していない等の単なるコーディングミスがほとんどでした。

[1] 未知パラメータの確率分布におけるパラメータがまた別のある確率分布に従っており階層的構造になっているモデル