19章 モデル構築

19.0 ライブラリの読み込み

library("tidyverse")
library("modelr")
library("lubridate")
library("broom")
library("nycflights13")
library("splines")

ダイアモンドデータセットの練習問題に必要なコードを先に準備しておきます。

diamonds2 <- diamonds %>%
  filter(carat <= 2.5) %>%
  mutate(
    lprice = log2(price),
    lcarat = log2(carat)
  )

mod_diamond2 <- lm(lprice ~ lcarat + color + cut + clarity, data = diamonds2)

diamonds2 <- add_residuals(diamonds2, mod_diamond2, "lresid2")

フライトデータセットの練習問題に必要なコードを先に準備しておきます。

19.1 はじめに

練習問題はありません。

19.2 低品質のダイヤモンドはなぜ高価なのか。

練習問題1 lcaratlpriceのプロットの縦の明るい縦の縞は何か。

これはある閾値で値が丸められるため、このように縞模様が現れます。

lcaratのヒストグラムはこんな感じです。

練習問題2 log(price) = a_0 + a_1 * log(carat)は何を示すのか。

これはlogに変換した回帰分析、log-level回帰、log-log回帰とか呼ばれる回帰分析の表現式かと思います。caratが1%増えると、priceが 1.67%増える。目的変数、説明変数ともにlogを取る場合、xが1%変化したときに、yが何%変化するかを示します。経済学では弾力性とか呼ばれているものです。

log(y)=a+blog(x)y=eaxblog(y) = a + b・log(x)⇔y = e^{a}・x^b

ここでは自然対数を使っています。

視覚化してみると、こんな感じです。

練習問題3 大きい残差と小さい残差を持っているダイヤモンドを抽出しなさい。これらのダイヤモンドについて何か変わったことはあるか?特に悪いのか、それとも良いのか、価格の間違いなのか。

ここでは残差の絶対値が2よりも大きいものを抽出します。予測値と実際のデータが大きく異なるので、これらは、priceのつけ間違いにも見えますが、データの他の値も間違っているかもしれないので、実物と照らし合わせるなどが必要かもしれません。

練習問題4 最終的なモデルmod_diamonds2は、ダイヤモンドの価格を予測するのに役立つか。

これはlacaratと残差の分布です。このようにいくつかの外れ値の予測という点では難しいかもしれませんが、一般的なダイアモンドの価格を予測する上で役立つモデルかと思われます。

実際にビジネスの予測モデルとして使うには、特徴量エンジニアリングや検証方法は工夫する必要はあるかもしれません。

19.3 何が1日の便数に影響するか。

練習問題1 1月20日、5月26日、9月1日のフライト数が予想より少なかった理由をGoogleのスキルを駆使してブレインストーミングしなさい。

これらは、キング牧師の日、戦没将兵追悼記念日、勤労感謝の日です。

練習問題2 正の残差が高い3日間は何を表していますか?これらの日はどのようにして別の年と一般化できるのか。

上位の3日間は、感謝祭の後の土曜日(11月30日)、感謝祭の後の日曜日(12月1日)、およびクリスマスの後の土曜日(12月28日)に対応しています。休日の日付を使用すれば、他の年に一般化することができます。

練習問題3 wdayを土曜日だけ学期ごとに区切る。ThursFriSat-summerSat-springSat-fallを作成しなさい。このモデルは、wdaytermの組み合わせをしたモデルと比較してどうか。

これらを組み合わせモデルを作成します。term*wdayのモデルは、交互作用を含むモデルよりも秋の残差が高く、春の残差が少なくなります。

mod2のほうがAICが低く、予測する上では、有用かもしれません。

練習問題4 曜日、学期、祝日を組み合わせた新しい変数を作成しなさい。そのモデルの残差はどうか。

まずは祝日をデータ化します。

さきほど作成した祝日データを使い、その日付に該当するものはholidayとし、それ以外は土曜を区切ります。

練習問題5 月によって変動する曜日効果にモデルを合わせた場合(つまりn ~ wday * month)、どうなるのか?なぜこれはあまり役に立たないのか?

モデルにはパラメタが84個あります。毎月は4〜5週間しかないので、推定値は大きな標準誤差を持ち、少数の観測値からしか推定されないため、サンプルデータを超えて一般化することはできません。

練習問題6 モデルn ~ wday + ns(date, 5)はどのようだと期待するか。なぜこれはあまり役に立たないのか?

ns()はスプライン回帰で使用される関数です。詳細はこちらを御覧ください。自然な3次スプラインに対するベース行列を生成する関数です。

曜日と時間で相互作用しないmod7の残差は、mod8よりも大きくなります。モデルmod7は、夏の間は週末を過小評価し、秋の間は週末を過大評価します。

練習問題7 日曜日に出発する人々は、月曜日のどこかにいる必要があるビジネスマンである可能性が高いと仮定する。その仮説を、距離と時間に基づいてどのように分解するかを見ることによって調べなさい。それが本当なら、遠くの場所へもっと日曜日の夕方のフライトを見ることを期待できるか。

曜日によるフライトの平均距離を比較してみます。ここでは曜日ごとのバイオリンプロットで視覚化してみます。バイオリンプロットでは、比較しづらいので、平均と誤差を計算し、プロットします。

日曜日のフライトが2番目に長いです。土曜日のフライトは平均で最長です。

練習問題8 日曜日と土曜日がプロットの別々の端にあることは少し煩わしい。月曜日に始まるように因子のレベルを設定する関数を書きなさい。

日曜日が一番最初に来るように因子のレベルが決定されているので、最初の要素を落とす関数を作ることで、自動的に日曜日最後に来るようにします。

19.4 モデルについてもっと知る

練習問題はありません。

最終更新

役に立ちましたか?