About connecting the dots.

data science related trivial things

中古マンション売買データを分析してみた(3.1) - 階層性を考慮したモデルのさらなる精緻化

今更感がだいぶただよう感じのネタではありますが,発表しようと思ってスライドまとめたものの,一向に予定が組まれないので,現状のモデリングがうまくいっていないので,ここで一旦公開しちゃおうというのが今回のエントリの主旨です.

モデルを精緻化するには

遥か前に,暫定版の完成形ということで,以下のようなモデルをMCMCで組みました.

価格_{i,j,k}=b_0+b_1 距離_i+b_2 築年_i+b_3 部屋数_i+b4 床面積_i+駅_j+路線_k

この時点では何も触れてはいないものの,実は薄々このモデルだとしっくりこないことに気がついてはいました.というのは,駅と路線の関係性を記述しない形でモデルに突っ込むべきではないのではないか,ということです.ありていにいうと,駅は路線に所属しているという関係性を,きちっとモデルに組み込むべきなのではないか,ということです.つまりは[物件→駅→路線]という関係性を,階層モデルとして表したいわけですね.

ということで,2段階の階層性をモデルにしてみると,以下のようになります*1

価格_{i,j,k}=b_0+b_1 距離_i+b_2 築年_i+b_3 部屋数_i+b4 床面積_i+駅_j,k
駅_{j,k}=r_0+路線_k

ということで,今回はこのモデルを実際にMCMCで回してみたいと思います.

モデルの記述とシミュレーション

モデル式

Stanコードは以下のようになります.それほど特筆することもないのですが,前回は並列で並んでいた線形モデル部分の駅,路線のランダム効果項について,駅だけのランダム効果項を入れています.その上で,駅のランダム効果項を,路線のランダム効果で予測する形となっています.

data {
    int<lower=1>            N;      # sample num
    int<lower=1>            M;      # independents' num
    int<lower=1>            N_T;    # train num
    int<lower=1>            N_S;    # station num
    matrix[N, M]            X;      # independents
    vector[N]               Y;      # dependent
    int<lower=1>, upper=N_T> T[N_S];     # station-train matrix
    int<lower=1, upper=N_S> S[N];   # station
}
parameters {
    real             a;
    vector[M]        b;
    real             as;
    real             r_t[N_T];
    real             r_s[N_S];
    real<lower=0>    s;
    real<lower=0>    s_rs;
    real<lower=0>    s_rt;
}
model {
    # regresion model with random effect
    for (i in 1:N)
        Y[i] ~ normal(a+X[i]*b+r_s[S[i]], s);
    # prior distributions
    s ~ uniform(0, 1.0e+4);
    a ~ normal(39, 1.0e+4);
    for (i in 1:M)
        b[i] ~ normal(0, 1.0e+4);
    for (i in 1:N_S)
        r_s[i] ~ normal(as+r_t[T[i]], s_rs);
    # hierarchical prior distribution
    s_rs ~ uniform(0, 1.0e+4);
    as   ~ normal(0, 1.0e+4);
    for (i in 1:N_T)
        r_t[i] ~ normal(0, s_rt);
    # 2 hierarchical prior distibution
    s_rt ~ uniform(0, 1.0e+4);
}

シミュレーションの結果

結論から先にいうと,全く収束せず大失敗ですね,という話でした.以下のtraceplotを見ていただければわかるように,ステップ数の経過とともに,発散に向かっていってしまっています.ステップ数をもっと少なくすればよさげに見えますが,ステップ数を減らしても単に縦軸のスケールがもう少し穏やかになるだけで,基本的に発散する方向にいく一方でした.これ以外にも,路線の係数は収束するものの,駅の係数が全く収束せず,という形なので上手くいかないですね...

http://f.st-hatena.com/images/fotolife/S/SAM/20141110/20141110225756_original.png

ということで

この形だと上手くモデリングできないということがわかりました,というお話でした.実はそもそもこのモデリング,かなりいけてない部分がひとつあります.というのは,このモデルではひとつの駅はひとつの路線にしか所属できないという結構大きな制約を持っているのです.例えば川崎駅や横浜駅のように,複数路線が乗り入れている駅の場合には,完全に綺麗な形での階層化はできません.このモデルでは,データで指定されている駅とその路線を,そのまま使っています.もしかしたらこのデータのノイズが収束を阻んでいるのかもしれないなぁとは思います.

ただ,それを除いても,やはり1つの駅が1つの路線にしか所属できないという仮定には無理があるため,これを解消するようなモデルを組み直さないといけませんね,というお話でした.ということでまだ次回に続きます,この話.

*1:これに事前分布の階層も加わるので,実際には3層のモデルになります.