【ベイズモデリング】中古車価格をstanを使ってモデリング [データサイエンス、統計モデル]
中古車データをサイトから取得してどのような要因になっているかモデルを作りました。
簡単に作るなら、線形回帰モデルとなります。
データの例
Price(目的変数):中古車価格
Yr(説明変数):経過年数
KM(説明変数):走行距離
その他の説明変数
lm.out <- lm(Price~., data=dat)
summary(lm.out)
この時、Yrは想定通りの符号となりましたが、KMは想定とは逆に符号となりました。
つまり、普通は、走行距離が増えると中古車価格は落ちるのですが、線形回帰の結果だと、走行距離が増えると中古車価格が高くなるという結果になってしまいます。
符号が逆転する理由はすぐに分かったのですが、ベイズモデルを使えば、想定通りの結果になるのでは?という疑問があり、ベイズモデルで中古車価格を予測しました。
使ったツールは、R stanです。
結果は、stanの結果もlm(線形回帰)の結果もほぼ同じでした。
扱っているデータが一点尤度なので、得られる結果もほぼ同じ…なのかもしれません。
簡単に作るなら、線形回帰モデルとなります。
データの例
Price(目的変数):中古車価格
Yr(説明変数):経過年数
KM(説明変数):走行距離
その他の説明変数
lm.out <- lm(Price~., data=dat)
summary(lm.out)
この時、Yrは想定通りの符号となりましたが、KMは想定とは逆に符号となりました。
つまり、普通は、走行距離が増えると中古車価格は落ちるのですが、線形回帰の結果だと、走行距離が増えると中古車価格が高くなるという結果になってしまいます。
符号が逆転する理由はすぐに分かったのですが、ベイズモデルを使えば、想定通りの結果になるのでは?という疑問があり、ベイズモデルで中古車価格を予測しました。
使ったツールは、R stanです。
結果は、stanの結果もlm(線形回帰)の結果もほぼ同じでした。
扱っているデータが一点尤度なので、得られる結果もほぼ同じ…なのかもしれません。
### Rのコード ###
library("rstan")
# データの準備
dat <- read.table("./data/SecondhandCar.csv", header=T, sep=",")
dat_mcmc <- list(N=nrow(dat), P=dat$P, TM=dat$TM, Yr=dat$Yr
, CT=dat$CT, NP=dat$NP, DEAL=dat$DEAL, KM=dat$KM)
## MCMCの実行 1
mcmc_out <- stan(file="SecondhandCar.stan", data=dat_mcmc, seed=1234)
### stanのコード ###
// SecondhandCar
data{
int N;
int P[N];
int TM[N];
int Yr[N];
int CT[N];
int NP[N];
int DEAL[N];
real KM[N];
}
parameters{
real b0;
real b1;
real b2;
real b3;
real b4;
real b5;
real b6;
real sigma;
}
transformed parameters{
real reg_mean_P[N];
for(n in 1:N){
reg_mean_P[n] = b0 + b1*TM[n] + b2*Yr[n] + b3*CT[n] + b4*NP[n] + b5*DEAL[n] + b6*KM[n];
}
}
model{
for(n in 1:N){
P[n] ~ normal(reg_mean_P[n], sigma);
}
// Leave out prior distribution. Uninformative prior will be used.
}
コメント 0