前回, 収集した中古マンション販売価格と賃貸物件家賃のデータを使って, Lasso回帰と Stan によるベイジアンモデリングを行ってみます。
Lasso回帰モデル
賃貸住宅家賃と中古マンション販売価格について Lasso で変数選択, モデル選択を行ってみます。
賃貸住宅家賃
3市区の家賃価格分布は下記となります。
習志野市で選択された変数と回帰係数は下記です。
> 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 .
中古マンション販売価格
3市区の販売価格分布は下記となります。
川口市で選択された変数と回帰係数は下記です。
> 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 .
ベイジアンモデリング
続いて, 賃貸住宅家賃と中古マンション販売価格について 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してみました。
中古マンション販売価格
賃貸住宅家賃予測と同様に正規線形モデルを指定, 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してみました。
家賃予測モデル, 中古マンション価格予測モデルともに切片の信用区間の幅が広くなっています。モデルとしてはいまいちで改善の余地ありのようです。
階層ベイズモデル [1] までやらないと Stan を使う意味は薄かったと痛感しました。ただ, 無理やり階層化してみましたが s_r が収束しませんでした。
おわりに
所感ですが, Stanを使ってみて計算or収束までの時間が長い場合には以下を試してみると良いかもと思いました。
- 取り得る値域が広いデータに対しては予めデータを標準化すること
- まずは簡単なモデルでシミュレーションすること
- 重回帰/RFなどで特徴量やパラメータに当たりをつけて, その結果を踏まえStanモデルについて再考すること
Stan実行時にErrorが発生する時は大抵, RからStanに渡すデータとData定義が一致していない等の単なるコーディングミスがほとんどでした。
[1] 未知パラメータの確率分布におけるパラメータがまた別のある確率分布に従っており階層的構造になっているモデル