
Normal Q-Q プロットを理解する
重回帰で物件価格を予測する記事でNormal Q-Q プロットという図が出てきたと思います。初めて見られた方はなんの図か理解するのが難しかったのではないでしょうか?(わたしはさっぱりわからなかったです…。)
今回はこの図が意味するところを追っていきたいと思います。
Q-Q プロットの縦軸と横軸の関係
Q-Q プロットは2つの確率分布からなるデータを縦軸・横軸に持ち、プロットの結果を見ることでデータが理論的な確率分布に従っているか確認できます。
その中でも Normal Q-Q プロットはサンプルデータが正規分布に従う場合の期待値を横軸にとり、観測値そのものを縦軸にとったグラフです。
縦軸:実際得られたサンプルデータの標準化残差を小さい順に並べたデータ
横軸:理論分布から得られたデータ(当てはまりを確認したい分布から標本を取り小さい順に並べた時の各値の期待値、期待正規順序統計量)
なぜ Normal Q-Q プロットを見るのか
そもそも重回帰を行ったときになぜNormal Q-Q プロットを見る必要があったのか、まず 重回帰によって予測される値(非説明変数)の誤差の分布は平均0の正規分布に従っているという前提があり ます。
誤差が正規分布に従っているかをNormal Q-Q プロットで確認することで、モデルの妥当性を検討することができます。
※ 誤差とは用意した説明変数では説明されずに残ってしまった要因です。
Normal Q-Q プロットの仕組みを知る
実際コードを書くのが1番わかりやすいと思うので、仕組みを知るために今回自力でNormal Q-Q プロットを描いてみました。
理論分布データの用意とデータの描画
まずは理論分布(標準正規分布)からデータを取得し、物件価格の標準化残差と比較してみましょう。
# 物件価格の標準化残差サンプル数と同じ数、理論分布からデータを用意
# 横軸のデータとして使う
theoretical_data <- qnorm(ppoints(1:397))
# 理論分布のデータ(左)と物件価格の標準化残差(右)をヒストグラムに描画
hist(theoretical_data, col="lightblue")
hist(sort(scale(all_stations_res$表参道$residuals)), breaks=seq(-5,4,0.5), xlab="standardized residuals", col="lightblue", main="Histogram of omotesando houses price standardized residuals")
Normal Q-Q プロットを描く
# 物件価格の標準化残差データを小さい順に並べる
sorted_omote_data <- sort(scale(all_stations_res$表参道$residuals))
# 散布図としてプロット
plot(theoretical_data, sorted_omote_data, xlab="theoretical Quantiles", ylab="Standardized Residuals", main="self-made Normal Q-Q")
大体同じになりました。
データクリーニング前後でグラフどのように変化するか
データクリーニングをすると正規分布に近づくのか、表参道の価格予想に用いたデータ(データクリーニング前後)で重回帰をかけた結果で確認してみましょう。
データクリーニング前、赤丸で囲った大きくハズレている変数があります。
③ は ① に対応するクリーニング前のヒストグラムですが、残差がかなり低いデータが存在しておりいびつな形です。
外れ値を取り除くとヒストグラムも正規分布に近くなり、Normal Q-Q プロットも直線に近づいています。
最初この図を見たときは何を言いたいのかさっぱり分かりませんでしたが、こうして仕組みを知ると想定している分布に従っているかひと目で分かって非常に便利ですね。これからもどんどん使っていきたいと思います ( ˆoˆ )
いいなと思ったら応援しよう!
