差分
このページの2つのバージョン間の差分を表示します。
| 次のリビジョン | 前のリビジョン | ||
| mselab:2012:stat:week2:r2 [2012/12/11 10:28] – created watalu | mselab:2012:stat:week2:r2 [不明な日付] (現在) – 外部編集 (不明な日付) 127.0.0.1 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ===== 統計工学 2週目 ===== | ||
| + | ==== はじめに ==== | ||
| + | === 連絡 2012.12.11 === | ||
| + | |||
| + | * 自分で頑張って、とお願いした、回帰分析と決定木分析のコードを追記しました。 | ||
| + | * このページを実験時間中に改訂しましたが、[[http:// | ||
| + | * TICデータの[[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
| + | |||
| === 概要 === | === 概要 === | ||
| 行 5: | 行 16: | ||
| * データマイニング:保険のデータのV86の予測モデルの構築 | * データマイニング:保険のデータのV86の予測モデルの構築 | ||
| * 回帰分析 | * 回帰分析 | ||
| - | * ロジスティック回帰 | ||
| * 決定木 | * 決定木 | ||
| + | * ロジスティック回帰 (オプション) | ||
| である。3週間の流れがデータ分析(第1週)を行って、回帰分析等によるモデル構築(第2週)、そして第3週の他の手法も組み合わせたモデル構築と結論へと繋がるため、今週は[[http:// | である。3週間の流れがデータ分析(第1週)を行って、回帰分析等によるモデル構築(第2週)、そして第3週の他の手法も組み合わせたモデル構築と結論へと繋がるため、今週は[[http:// | ||
| * 先週に続いてデータの把握、特にV86を中心に。 | * 先週に続いてデータの把握、特にV86を中心に。 | ||
| - | * Rコマンダーを用いた回帰分析の2つの課題(自習、練習に相当) | + | * 回帰分析の2つの課題、同じ課題を決定木も(自習、練習に相当) |
| * 解析データを用いた1つの課題(本番) | * 解析データを用いた1つの課題(本番) | ||
| に取り組んで貰う。 | に取り組んで貰う。 | ||
| + | ==== 実験の流れ ==== | ||
| - | === 実験の流れ === | + | 時間内課題:回帰分析(のたぶん復習)と決定木分析 |
| - | | + | |
| + | * 配付資料とこのページにあるコードを参考に、単回帰(説明変数1つ)と重回帰(説明変数2つ)の場合を自習して、回帰分析の結果の読み方について学ぶ。(時間内は少なくとも、分析結果やグラフをすべて得て、Wordに貼るなどしてお持ち帰りするところまで) | ||
| + | * 重回帰(説明変数2つ)の場合で、さらに変数を分類尺度に変換し、分類尺度の説明変数を含む場合の回帰分析の結果の読み方(特に推定値Estimateの意味や解釈)について考える。 | ||
| + | * 決定木分析 | ||
| + | * 回帰分析と同じデータを、決定木分析にかけてみて、どのようなモデルかを考える。 | ||
| + | |||
| + | 課題:保険会社の顧客データのデータマイニング (時間内はできるところまで) | ||
| + | |||
| + | * まずは分類数の多い変数(V1とV5)の数を減らす。 | ||
| + | * 回帰分析と決定木分析を行う。 | ||
| + | * 得たモデルを考察する。 | ||
| + | |||
| + | 本実験に関係するメモ | ||
| + | |||
| + | - 配付資料とRの実行結果を見比べながら、lm関数を用いた回帰分析で出力される情報のどれが、配付資料のどれに対応するのかを把握する | ||
| * 回帰係数の推定値: | * 回帰係数の推定値: | ||
| * 切片: Intercept | * 切片: Intercept | ||
| * 寄与率: R-Squared | * 寄与率: R-Squared | ||
| - | * 自由度調整済み寄与率 | + | * 自由度調整済み寄与率: Adjusted R-squared |
| - | * てこ比 | + | * F値: F-statistic |
| - | * 標準化残差 | + | * 自由度: DF, degrees of freedom |
| - | * 変数増減法 | + | * t値: t value |
| + | * P値: Pr(> | ||
| + | * 標準誤差: | ||
| + | * 残差: Residuals | ||
| + | * (回帰)係数: | ||
| + | * てこ比: Leverage | ||
| + | * 標準化残差: Studentized Residuals | ||
| + | - rpart関数を用いた決定木分析の出力を見ながら、決定木分析はどのようなモデルを構築するのかを検討する | ||
| - 保険データの回帰分析、に取り組む (保険データの回帰分析) | - 保険データの回帰分析、に取り組む (保険データの回帰分析) | ||
| - 回帰係数の推定 | - 回帰係数の推定 | ||
| + | - 変数の加工(今回初) | ||
| - 分散分析によるモデルの有意性の検討や回帰係数の有意性の検討 | - 分散分析によるモデルの有意性の検討や回帰係数の有意性の検討 | ||
| - てこ比や標準化残差などの検討 | - てこ比や標準化残差などの検討 | ||
| - | - 変数の増減 | + | - 変数の増減 |
| - 以上を繰り返す | - 以上を繰り返す | ||
| - | - 回帰分析の結果に基づいて、訪問する顧客層を絞り込む | + | |
| - | - 必要に応じて、保険データの回帰分析と訪問ルールの作成を繰り返す | + | - オプション課題 |
| + | | ||
| + | - 手動でP値を見ながらの変数減少法 | ||
| + | - AICを用いた変数増減法 stepAIC() | ||
| + | - 決定木の学習パラメータの調整 | ||
| + | |||
| + | |||
| + | ==== 時間内課題1:回帰分析の自習 ==== | ||
| + | === 単回帰分析 === | ||
| + | |||
| + | 配付資料の表4.1のデータの入力は次の通り。 | ||
| + | < | ||
| + | x <- c(2.2, | ||
| + | y <- c(71, | ||
| + | table.4.1 <- data.frame(x=x, | ||
| + | </ | ||
| + | |||
| + | 回帰分析の実行にはlm関数を用いる。 | ||
| + | < | ||
| + | lm(y~x, data=table.4.1) | ||
| + | </ | ||
| + | 「y~x」は、変数yを変数xで説明する回帰分析を行うための表現。これは | ||
| + | < | ||
| + | Y = \beta_0+\beta_1 X+\epsilon | ||
| + | </ | ||
| + | という回帰式を推定せよ、という意味である。 | ||
| + | |||
| + | 回帰分析の詳細を示すには、lm関数の実行結果を別の変数lm.4.1などに代入してから、詳細を出力させるsummary関数を用いる。 | ||
| + | |||
| + | < | ||
| + | lm.4.1 <- lm(y~x, data=table.4.1) | ||
| + | print(lm.4.1) | ||
| + | summary(lm.4.1) | ||
| + | </ | ||
| + | |||
| + | **問1:このsummary関数の出力結果を、配付資料と対比させて理解せよ。** | ||
| + | |||
| + | 回帰分析の結果を診断するために、幾つかのグラフを出力する機能がある。lm関数の実行結果をplot関数にかければ、そのようなグラフが4枚、順次出力される。 | ||
| + | < | ||
| + | plot(test.lm) | ||
| + | </ | ||
| + | |||
| + | **問2:このplot関数の出力結果を、配付資料と対比させて理解せよ。** | ||
| + | |||
| + | === 重回帰分析 === | ||
| + | |||
| + | 表5.1のデータは次のように入力する。 | ||
| + | |||
| + | < | ||
| + | x.1 <- c(51, | ||
| + | x.2 <- c(16, | ||
| + | y <- c(3.0, | ||
| + | table.5.1 <- data.frame(x.1=x.1, | ||
| + | </ | ||
| + | |||
| + | 回帰分析の実行には、説明変数が複数あっても(重回帰でも)lm関数を用いる。 | ||
| + | < | ||
| + | lm(y~x.1+x.2, data=table.5.1) | ||
| + | </ | ||
| + | 今度は説明変数が2つあるので、「y~x.1+x.2」となる。これは | ||
| + | < | ||
| + | Y = \beta_0+\beta_1 X_1 + \beta_2 X_2+\epsilon | ||
| + | </ | ||
| + | という回帰式を推定せよ、という意味である。 | ||
| + | |||
| + | 回帰分析の詳細を示すには、lm関数の実行結果を別の変数lm.5.1などに代入してから、詳細を出力させるsummary関数を用いる。 | ||
| + | |||
| + | < | ||
| + | lm.5.1 <- lm(y~x.1+x.2, | ||
| + | print(lm.5.1) | ||
| + | summary(lm.5.1) | ||
| + | </ | ||
| + | |||
| + | **問4:このplot関数の出力結果を、配付資料と対比させて理解せよ。** | ||
| + | |||
| + | === 重回帰応用(水準変数が説明変数に含まれる場合) === | ||
| + | |||
| + | 上のデータを、広さを「広め(w)」「狭め(n)」とし、築年数も「新しめ(new)」「古め(old)」にする | ||
| + | < | ||
| + | x.1 <- c(" | ||
| + | x.2 <- c(" | ||
| + | y <- c(3.0, | ||
| + | table.5.1.c <- data.frame(x.1=x.1, | ||
| + | </ | ||
| + | |||
| + | **問5:このデータで、回帰分析を行い、グラフも作成して、先のモデルと何が異なるか、検討せよ。** | ||
| + | |||
| + | < | ||
| + | lm.5.1.c <- lm(y~x.1+x.2, | ||
| + | print(lm.5.1.c) | ||
| + | summary(lm.5.1.c) | ||
| + | plot(lm.5.1.c) | ||
| + | </ | ||
| + | |||
| + | ==== 時間内課題2:決定木分析の自習 ==== | ||
| + | |||
| + | まず、次の一行を実行しておく。 | ||
| + | |||
| + | < | ||
| + | library(mvpart) | ||
| + | </ | ||
| + | |||
| + | 上の実行例で「lm」とあるところをすべて「rpart」で置き換える。 | ||
| + | |||
| + | < | ||
| + | rpart.4.1 <- rpart(y~x, data=table.4.1) | ||
| + | print(rpart.4.1) | ||
| + | summary(rpart.4.1) | ||
| + | plot(rpart.4.1) | ||
| + | text(rpart.4.1) | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | rpart.5.1 <- rpart(y~x.1+x.2, | ||
| + | print(rpart.5.1) | ||
| + | summary(rpart.5.1) | ||
| + | plot(rpart.5.1) | ||
| + | text(rpart.5.1) | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | rpart.5.1.c <- rpart(y~x.1+x.2, | ||
| + | print(rpart.5.1.c) | ||
| + | summary(rpart.5.1.c) | ||
| + | plot(rpart.5.1.c) | ||
| + | text(rpart.5.1.c) | ||
| + | </ | ||
| + | |||
| + | **問6:これらがどのようなモデルか、データと出力に照らして検討せよ。** グラフと画面出力の比較をまず行うとよい。またlm.5.1、lm.5.1.c、rpart.5.1、rpart.5.1.cの間の違いは考察せよ。 | ||
| + | ==== 課題:保険会社の顧客データのデータマイニング ==== | ||
| + | |||
| + | * TICデータは、V65からV86までが22種類の保険商品の契約件数である。今回はV86の契約に漕ぎ着けるためのモデル構築、を目的とする。 | ||
| + | * 重回帰分析を行い、分析結果を考察せよ。 | ||
| + | * 重回帰分析の結果を用いて、指定された保険商品の契約に関する予測式を構築せよ。 | ||
| + | * 線形モデルと重回帰分析を用いて、このデータをデータマイニングすることについて、考察せよ。 | ||
| + | * 余裕があったら、[[http:// | ||
| + | |||
| + | 前の班との違い | ||
| + | |||
| + | * モデルの学習(推定、構築)は、学習用データのみでいい | ||
| + | * 分類変数のグループ化はできるだけ、行った方がいい | ||
| + | * モデルを得るだけでいい | ||
| + | やらなくて良いこと。 | ||
| + | * 検証用データでの検証 | ||
| + | * 訪問対象の明確化 (モデルのみでいいから) | ||
| === データの説明 === | === データの説明 === | ||
| 行 50: | 行 228: | ||
| [[http:// | [[http:// | ||
| - | |変数|分類|メモ| | + | ^変数^分類^メモ^ |
| |V1|顧客分類2|L0でコード化されている、数字の大きさに意味なし| | |V1|顧客分類2|L0でコード化されている、数字の大きさに意味なし| | ||
| |V2|住居数|大きいほど住む箇所が多い| | |V2|住居数|大きいほど住む箇所が多い| | ||
| 行 83: | 行 261: | ||
| </ | </ | ||
| + | == 変数詳細 == | ||
| + | |||
| + | ^Nr^Name^Description Domain^ | ||
| + | |V1|MOSTYPE|Customer Subtype see L0| | ||
| + | |V2|MAANTHUI|Number of houses 1 - 10| | ||
| + | |V3|MGEMOMV|Avg size household 1 - 6| | ||
| + | |V4|MGEMLEEF|Avg age see L1| | ||
| + | |V5|MOSHOOFD|Customer main type see L2| | ||
| + | |V6|MGODRK|Roman catholic see L3| | ||
| + | |V7|MGODPR|Protestant ...| | ||
| + | |V8|MGODOV|Other religion| | ||
| + | |V9|MGODGE|No religion (無宗教)| | ||
| + | |V10|MRELGE|Married (既婚)| | ||
| + | |V11|MRELSA|Living together (同居)| | ||
| + | |V12|MRELOV|Other relation (その他)| | ||
| + | |V13|MFALLEEN|Singles (独身)| | ||
| + | |V14|MFGEKIND|Household without children (子供のいない世帯)| | ||
| + | |V15|MFWEKIND|Household with children (子供のいる世帯)| | ||
| + | |V16|MOPLHOOG|High level education (高等教育)| | ||
| + | |V17|MOPLMIDD|Medium level education (中等教育)| | ||
| + | |V18|MOPLLAAG|Lower level education (初等教育)| | ||
| + | |V19|MBERHOOG|High status| | ||
| + | |V20|MBERZELF|Entrepreneur| | ||
| + | |V21|MBERBOER|Farmer (農業)| | ||
| + | |V22|MBERMIDD|Middle management (中間管理職)| | ||
| + | |V23|MBERARBG|Skilled labourers (熟練労働者)| | ||
| + | |V24|MBERARBO|Unskilled labourers (非熟練労働者)| | ||
| + | |V25|MSKA|Social class A| | ||
| + | |V26|MSKB1|Social class B1| | ||
| + | |V27|MSKB2|Social class B2| | ||
| + | |V28|MSKC|Social class C| | ||
| + | |V29|MSKD|Social class D| | ||
| + | |V30|MHHUUR|Rented house| | ||
| + | |V31|MHKOOP|Home owners| | ||
| + | |V32|MAUT1|1 car (保有車1台)| | ||
| + | |V33|MAUT2|2 cars (保有車2台)| | ||
| + | |V34|MAUT0|No car (保有車なし)| | ||
| + | |V35|MZFONDS|National Health Service| | ||
| + | |V36|MZPART|Private health insurance| | ||
| + | |V37|MINKM30|Income < 30.000| | ||
| + | |V38|MINK3045|Income (収入) 30-45.000| | ||
| + | |V39|MINK4575|Income (収入) 45-75.000| | ||
| + | |V40|MINK7512|Income (収入) 75-122.000| | ||
| + | |V41|MINK123M|Income (収入) > | ||
| + | |V42|MINKGEM|Average income (平均収入)| | ||
| + | |V43|MKOOPKLA|Purchasing power class| | ||
| + | |V44|PWAPART|Contribution (契約高) private third party insurance see L4| | ||
| + | |V45|PWABEDR|Contribution (契約高) third party insurance (firms) ...| | ||
| + | |V46|PWALAND|Contribution (契約高) third party insurane (agriculture)| | ||
| + | |V47|PPERSAUT|Contribution (契約高) car policies| | ||
| + | |V48|PBESAUT|Contribution (契約高) delivery van policies| | ||
| + | |V49|PMOTSCO|Contribution (契約高) motorcycle/ | ||
| + | |V50|PVRAAUT|Contribution (契約高) lorry policies| | ||
| + | |V51|PAANHANG|Contribution (契約高) trailer policies| | ||
| + | |V52|PTRACTOR|Contribution (契約高) tractor policies| | ||
| + | |V53|PWERKT|Contribution (契約高) agricultural machines policies | | ||
| + | |V54|PBROM|Contribution (契約高) moped policies| | ||
| + | |V55|PLEVEN|Contribution (契約高) life insurances| | ||
| + | |V56|PPERSONG|Contribution (契約高) private accident insurance policies| | ||
| + | |V57|PGEZONG|Contribution (契約高) family accidents insurance policies| | ||
| + | |V58|PWAOREG|Contribution (契約高) disability insurance policies| | ||
| + | |V59|PBRAND|Contribution (契約高) fire policies| | ||
| + | |V60|PZEILPL|Contribution (契約高) surfboard policies| | ||
| + | |V61|PPLEZIER|Contribution (契約高) boat policies| | ||
| + | |V62|PFIETS|Contribution (契約高) bicycle policies| | ||
| + | |V63|PINBOED|Contribution (契約高) property insurance policies| | ||
| + | |V64|PBYSTAND|Contribution (契約高) social security insurance policies| | ||
| + | |V65|AWAPART|Number of (契約口数) private third party insurance 1 - 12| | ||
| + | |V66|AWABEDR|Number of (契約口数) third party insurance (firms) ...| | ||
| + | |V67|AWALAND|Number of (契約口数) third party insurane (agriculture)| | ||
| + | |V68|APERSAUT|Number of (契約口数) car policies| | ||
| + | |V69|ABESAUT|Number of (契約口数) delivery van policies| | ||
| + | |V70|AMOTSCO|Number of (契約口数) motorcycle/ | ||
| + | |V71|AVRAAUT|Number of (契約口数) lorry policies| | ||
| + | |V72|AAANHANG|Number of (契約口数) trailer policies| | ||
| + | |V73|ATRACTOR|Number of (契約口数) tractor policies| | ||
| + | |V74|AWERKT|Number of (契約口数) agricultural machines policies| | ||
| + | |V75|ABROM|Number of (契約口数) moped policies| | ||
| + | |V76|ALEVEN|Number of (契約口数) life insurances| | ||
| + | |V77|APERSONG|Number of (契約口数) private accident insurance policies| | ||
| + | |V78|AGEZONG|Number of (契約口数) family accidents insurance policies| | ||
| + | |V79|AWAOREG|Number of (契約口数) disability insurance policies| | ||
| + | |V80|ABRAND|Number of (契約口数) fire policies| | ||
| + | |V81|AZEILPL|Number of (契約口数) surfboard policies| | ||
| + | |V82|APLEZIER|Number of (契約口数) boat policies| | ||
| + | |V83|AFIETS|Number of (契約口数) bicycle policies| | ||
| + | |V84|AINBOED|Number of (契約口数) property insurance policies| | ||
| + | |V85|ABYSTAND|Number of (契約口数) social security insurance policies| | ||
| + | |V86|CARAVAN|Number of (契約口数) mobile home policies 0 - 1| | ||
| == 各変数のコーディング == | == 各変数のコーディング == | ||
| 行 88: | 行 355: | ||
| L0: | L0: | ||
| - | |Value|Label| | + | ^Value^Label^ |
| |1|High Income, expensive child| | |1|High Income, expensive child| | ||
| |2|Very Important Provincials| | |2|Very Important Provincials| | ||
| 行 178: | 行 445: | ||
| |8|f 10.000 - 19.999| | |8|f 10.000 - 19.999| | ||
| |9|f 20.000 - ?| | |9|f 20.000 - ?| | ||
| + | |||
| + | == データのダウンロードと読み込み == | ||
| + | |||
| + | 演習で用いる保険データは、大学内からであれば、Rに次の命令を実行すれば読み込める。 | ||
| + | < | ||
| + | Sys.setenv(" | ||
| + | tic.learn <- read.table(" | ||
| + | tic.eval <- read.table(" | ||
| + | tic.test <- read.table(" | ||
| + | tic.eval <- cbind(tic.eval, | ||
| + | colnames(tic.eval)[86] <- " | ||
| + | rm(tic.test) | ||
| + | </ | ||
| + | |||
| + | 学外もしくは自宅等であれば、最初の1行(Sys.setenvで始まる行)は不要。 | ||
| == 参考 == | == 参考 == | ||
| 行 188: | 行 470: | ||
| tic.eval <- ticdata[5823: | tic.eval <- ticdata[5823: | ||
| </ | </ | ||
| + | === 準備 === | ||
| - | === 今回の課題 | + | 上のデータの読み込みを実行済みであれば、この課題ではMASSライブラリを使う可能性があるので、それを読み込んでおく。 |
| - | == 概要 == | + | |
| - | * 回帰分析について学ぶ。 | ||
| - | * TICデータは、V65からV86までが22種類の保険商品の契約件数である。今回はV86の契約に漕ぎ着けるためのモデル構築、を目的とする。 | ||
| - | * 重回帰分析を行い、分析結果を考察せよ。 | ||
| - | * 重回帰分析の結果を用いて、指定された保険商品の契約に関する予測式を構築せよ。 | ||
| - | * 線形モデルと重回帰分析を用いて、このデータをデータマイニングすることについて、考察せよ。 | ||
| - | |||
| - | === 時間内課題1:回帰分析の自習 === | ||
| - | == 単回帰分析 == | ||
| - | |||
| - | 配付資料の表4.1のデータの入力は次の通り。 | ||
| < | < | ||
| - | x <- c(2.2, | + | library(MASS) |
| - | y <- c(71, | + | |
| - | table.4.1 <- data.frame(x=x, | + | |
| </ | </ | ||
| - | 回帰分析の実行にはlm関数を用いる。 | + | === 回帰分析 |
| + | == 回帰分析をするだけ == | ||
| + | |||
| + | V1からV85を説明変数にして、V86を予測するだけなら、次の命令をコピーして貼り付けたら、パラメータの最小二乗推定値は得られる。 | ||
| < | < | ||
| - | lm(y~x, data=table.4.1) | + | lm(V86~V1 +V2 +V3 +V4 +V5 +V6 +V7 +V8 +V9 +V10 |
| + | +V11+V12+V13+V14+V15+V16+V17+V18+V19+V20 | ||
| + | +V21+V22+V23+V24+V25+V26+V27+V28+V29+V30 | ||
| + | +V31+V32+V33+V34+V35+V36+V37+V38+V39+V40 | ||
| + | +V41+V42+V43+V44+V45+V46+V47+V48+V49+V50 | ||
| + | +V51+V52+V53+V54+V55+V56+V57+V58+V59+V60 | ||
| + | +V61+V62+V63+V64+V65+V66+V67+V68+V69+V70 | ||
| + | +V71+V72+V73+V74+V75+V76+V77+V78+V79+V80 | ||
| + | +V81+V82+V83+V84+V85, data=tic.learn) | ||
| </ | </ | ||
| - | 「y~x」は、変数yを変数xで説明する回帰分析を行うための表現。これは | ||
| - | < | ||
| - | Y = \beta_0+\beta_1 X+\epsilon | ||
| - | </ | ||
| - | という回帰式を推定せよ、という意味である。 | ||
| - | 回帰分析の詳細を示すには、lm関数の実行結果を別の変数lm.4.1などに代入してから、詳細を出力させるsummary関数を用いる。 | + | 先ほどと同様に、と回帰分析を実行するには、次のようにすれば、各種統計量も診断用のグラフも出力される。 |
| < | < | ||
| - | lm.4.1 <- lm(y~x, data=table.4.1) | + | lm.learn.0 <- lm(V86~V1 +V2 +V3 +V4 +V5 +V6 +V7 +V8 +V9 +V10 |
| - | print(lm.4.1) | + | +V11+V12+V13+V14+V15+V16+V17+V18+V19+V20 |
| - | summary(lm.4.1) | + | +V21+V22+V23+V24+V25+V26+V27+V28+V29+V30 |
| + | +V31+V32+V33+V34+V35+V36+V37+V38+V39+V40 | ||
| + | +V41+V42+V43+V44+V45+V46+V47+V48+V49+V50 | ||
| + | +V51+V52+V53+V54+V55+V56+V57+V58+V59+V60 | ||
| + | +V61+V62+V63+V64+V65+V66+V67+V68+V69+V70 | ||
| + | +V71+V72+V73+V74+V75+V76+V77+V78+V79+V80 | ||
| + | +V81+V82+V83+V84+V85, data=tic.learn) | ||
| + | print(lm.learn.0) | ||
| + | summary(lm.learn.0) | ||
| + | plot(lm.learn.0) | ||
| </ | </ | ||
| - | **問1:このsummary関数の出力結果を、配付資料と対比させて理解せよ。** | + | ただ、これではV1やV5の扱いを「数値」としてしまっているし、有意でない(*や**や***がついてない)変数も多くモデルに取り込まれてしまっている。 |
| + | そこで、データマイニング手法を「線形モデル」に限るならば、モデルに対して次の2つの対応をとることが必要になる。 | ||
| + | |||
| + | - 予測の役に立たない不要な変数を削る | ||
| + | - 本来は「分類コード」として扱うべき変数を、「数値データ」として扱っている現状を解消する | ||
| + | |||
| + | それぞれ順に説明する。 | ||
| + | |||
| + | == 予測に不要な変数を削る == | ||
| + | |||
| + | 変数増減法という方法がある。上で得たlm.learn.0という「すべての変数を説明変数に加えた回帰モデル」に対して、 | ||
| - | 回帰分析の結果を診断するために、幾つかのグラフを出力する機能がある。lm関数の実行結果をplot関数にかければ、そのようなグラフが4枚、順次出力される。 | ||
| < | < | ||
| - | plot(test.lm) | + | lm.learn.AIC <- stepAIC(lm.learn.0, direction=" |
| </ | </ | ||
| - | **問2:このplot関数の出力結果を、配付資料と対比させて理解せよ。** | + | との1行を実行すると、AICという基準に照らして、不要な変数を1つずつ取り除か加えるか、検討してくれて、一番不要な変数から順に出し入れすることで、最適なモデルに到達するよう頑張ってくれる。 |
| - | == 重回帰分析 == | + | === 分類コード(水準, |
| - | 表5.1のデータは次のように入力する。 | + | V1とV5の中身は、前述のように分類コードである。前回の課題で、ヒストグラムを描こうとすると、エラーが発生したかもしれない。 |
| + | Rでは、中身が分類コードや水準である変数のことを、因子変数(factor)と呼ぶ。 | ||
| + | V1とV5を因子変数に変換するには、次の2行を実行して、V1とV5を「分類尺度」に変換した変数をそれぞれ、V1fおよびV5fと名付ける。 | ||
| < | < | ||
| - | x.1 <- c(51, | + | tic.learn$V1f |
| - | x.2 <- c(16, | + | tic.learn$V5f |
| - | y <- c(3.0, | + | |
| - | table.5.1 <- data.frame(x.1=x.1, | + | |
| </ | </ | ||
| - | 回帰分析の実行には、説明変数が複数あっても(重回帰でも)lm関数を用いる。 | + | 通常の数値変数(numeric)と因子変数(factor)の違いは、以下、幾つかのグラフを描いているので、1行ずつ貼って実行していくと、違いが分かる。 |
| + | |||
| + | V1やV5のヒストグラムは、hist関数を用いて | ||
| < | < | ||
| - | lm(y~x.1+x.2, data=table.5.1) | + | hist(tic.learn$V1) |
| + | hist(tic.learn$V5) | ||
| + | </ | ||
| + | などで描ける。一方、V1fやV5fのヒストグラムは | ||
| + | < | ||
| + | hist(tic.learn$V1f) | ||
| + | hist(tic.learn$V5f) | ||
| </ | </ | ||
| - | 今度は説明変数が2つあるので、「y~x.1+x.2」となる。これは | + | を実行するとエラーになる。これを得るには、table関数で集計してから、barplot関数で棒グラフを描く。 |
| - | <jsmath> | + | <code> |
| - | Y = \beta_0+\beta_1 X_1 + \beta_2 X_2+\epsilon | + | barplot(table(tic.learn$V1f)) |
| - | </jsmath> | + | barplot(table(tic.learn$V5f) |
| - | という回帰式を推定せよ、という意味である。 | + | </code> |
| - | + | 更にカテゴリごとの契約の有無の割合を見るには | |
| - | 回帰分析の詳細を示すには、lm関数の実行結果を別の変数lm.5.1などに代入してから、詳細を出力させるsummary関数を用いる。 | + | < |
| + | barplot(table(tic.learn$V86, | ||
| + | barplot(table(tic.learn$V86, | ||
| + | </ | ||
| + | とする。色の濃い部分が契約無、色の薄い部分が契約有である。 | ||
| + | 参考までに、因子変数を用いた回帰分析を実行するには、 | ||
| < | < | ||
| - | lm.5.1 <- lm(y~x.1+x.2, data=table.5.1) | + | lm.learn.1 <- lm(V86~V1f+V2 +V3 +V4 +V5f+V6 +V7 +V8 +V9 +V10 |
| - | print(lm.5.1) | + | +V11+V12+V13+V14+V15+V16+V17+V18+V19+V20 |
| - | summary(lm.5.1) | + | +V21+V22+V23+V24+V25+V26+V27+V28+V29+V30 |
| + | +V31+V32+V33+V34+V35+V36+V37+V38+V39+V40 | ||
| + | +V41+V42+V43+V44+V45+V46+V47+V48+V49+V50 | ||
| + | +V51+V52+V53+V54+V55+V56+V57+V58+V59+V60 | ||
| + | +V61+V62+V63+V64+V65+V66+V67+V68+V69+V70 | ||
| + | +V71+V72+V73+V74+V75+V76+V77+V78+V79+V80 | ||
| + | +V81+V82+V83+V84+V85, data=tic.learn) | ||
| + | print(lm.learn.1) | ||
| + | summary(lm.learn.1) | ||
| + | plot(lm.learn.1) | ||
| </ | </ | ||
| - | **問4:このplot関数の出力結果を、配付資料と対比させて理解せよ。** | + | とすればよい。ただ、これではV5fについての推定ができず、まだまだ問題があることがわかる。 |
| - | == 重回帰応用(水準変数が説明変数に含まれる場合) == | ||
| - | 上のデータを、広さを「広め(w)」「狭め(n)」とし、築年数も「新しめ(new)」「古め(old)」にする | + | |
| + | == 分類変数のグループ化 == | ||
| + | |||
| + | 推定に問題が発生したり、カテゴリが多すぎることを解消するには、V1とV86のtable関数による集計結果や、V5とV86の集計結果を参考に、V1とV5について「幾つかのカテゴリをまとめてしまうグルーピング」という操作を行うことが1案である。 | ||
| + | 回帰分析でも決定木分析でも数千のサンプルで40以上の分類は、これだけ変数があると細かすぎる。 | ||
| + | |||
| + | まず集計方法を再掲する。 | ||
| < | < | ||
| - | x.1 <- c(" | + | library(mvpart) |
| - | x.2 <- c(" | + | table(tic.learn$V1f, tic.learn$V86) |
| - | y <- c(3.0,3.2, | + | table(tic.learn$V5f, tic.learn$V86) |
| - | table.5.1.c <- data.frame(x.1=x.1,x.2=x.2,y=y) | + | |
| </ | </ | ||
| - | **問5:このデータで、回帰分析を行い、グラフも作成して、先のモデルと何が異なるか、検討せよ。** | + | これらをグラフに描くには |
| < | < | ||
| - | lm.5.1.c <- lm(y~x.1+x.2, data=table.5.1.c) | + | barchart(table(tic.learn$V1f, tic.learn$V86)) |
| - | print(lm.5.1.c) | + | barchart(table(tic.learn$V5f, tic.learn$V86)) |
| - | summary(lm.5.1.c) | + | |
| - | plot(lm.5.1.c) | + | |
| </ | </ | ||
| + | とする。 | ||
| - | === 時間内課題2:決定木分析の自習 === | + | さて、V86の予測にV1のどのカテゴリが不要かを見るために、決定木分析を行ってみる。 |
| + | 決定木(実際には回帰木)を用いて、V86の増加に寄与しそうなカテゴリのみを残す。 | ||
| + | 目論見は次の2点。 | ||
| - | まず、次の一行を実行しておく。 | + | * 契約にあまり寄与しないカテゴリには、コード0を割り当ててしまおう。 |
| + | * 契約にしそうなカテゴリは残そう。 | ||
| < | < | ||
| library(mvpart) | library(mvpart) | ||
| + | rpart(V86~V1f, | ||
| </ | </ | ||
| - | 上の実行例で「lm」とあるところをすべて「rpart」で置き換える。 | + | 剪定せずにそのまま出力した回帰樹は次の通り。 |
| < | < | ||
| - | rpart.4.1 <- rpart(y~x, data=table.4.1) | + | n= 5822 |
| - | print(rpart.4.1) | + | |
| - | summary(rpart.4.1) | + | node), split, n, deviance, yval |
| - | rpart.5.1 <- rpart(y~x.1+x.2, data=table.5.1) | + | * denotes terminal node |
| - | print(rpart.5.1) | + | |
| - | summary(rpart.5.1) | + | 1) root 5822 327.1989000 0.05977327 |
| - | rpart.5.1.c <- rpart(y~x.1+x.2, data=table.5.1.c) | + | 2) V1f=2,4, |
| - | print(rpart.5.1.c) | + | 4) V1f=4, |
| - | summary(rpart.5.1.c) | + | 8) V1f=15, |
| + | 16) V1f=15, | ||
| + | 17) V1f=23, | ||
| + | 34) V1f=23 251 | ||
| + | 35) V1f=25, | ||
| + | 70) V1f=26,27 98 1.9591840 0.02040816 | ||
| + | 140) V1f=27 50 | ||
| + | 141) V1f=26 48 | ||
| + | 71) V1f=25,29,41 373 | ||
| + | 142) V1f=29 86 1.9534880 0.02325581 * | ||
| + | 143) V1f=25,41 287 | ||
| + | 9) V1f=4, | ||
| + | 18) V1f=24, | ||
| + | 36) V1f=24,31 385 10.6857100 0.02857143 | ||
| + | 72) V1f=24 180 4.8611110 0.02777778 * | ||
| + | 73) V1f=31 205 | ||
| + | 37) V1f=30 118 3.8644070 0.03389831 * | ||
| + | 19) V1f=4,5,9,22,35 687 26.8588100 0.04075691 | ||
| + | 38) V1f=4,35 266 | ||
| + | 76) V1f=35 214 | ||
| + | 77) V1f=4 52 1.9230770 0.03846154 * | ||
| + | 39) V1f=5,9,22 421 17.2304000 0.04275534 | ||
| + | 78) V1f=22 98 3.8367350 0.04081633 * | ||
| + | 79) V1f=5,9 323 13.3931900 0.04334365 | ||
| + | 158) V1f=9 278 11.4820100 0.04316547 * | ||
| + | 159) V1f=5 45 1.9111110 0.04444444 * | ||
| + | 5) V1f=2,7, | ||
| + | 10) V1f=10, | ||
| + | 20) V1f=34 182 | ||
| + | 21) V1f=10, | ||
| + | 42) V1f=10 165 | ||
| + | 43) V1f=11, | ||
| + | 86) V1f=32,33 951 50.9337500 0.05678233 | ||
| + | 172) V1f=32 141 7.5460990 0.05673759 * | ||
| + | 173) V1f=33 810 43.3876500 0.05679012 * | ||
| + | 87) V1f=11,39 481 26.3700600 0.05821206 | ||
| + | 174) V1f=39 328 17.8993900 0.05792683 * | ||
| + | 175) V1f=11 153 | ||
| + | 11) V1f=2,7, | ||
| + | 22) V1f=7,38 383 24.2349900 0.06788512 | ||
| + | 44) V1f=38 339 21.4395300 0.06784661 * | ||
| + | 45) V1f=7 44 | ||
| + | 23) V1f=2, | ||
| + | 46) V1f=2,13,36 486 32.4794200 0.07201646 | ||
| + | 92) V1f=36 225 14.8622200 0.07111111 * | ||
| + | 93) V1f=2,13 261 17.6168600 0.07279693 | ||
| + | 186) V1f=13 179 12.0558700 0.07262570 * | ||
| + | 187) V1f=2 82 5.5609760 0.07317073 * | ||
| + | 47) V1f=20,37 157 11.0828000 0.07643312 | ||
| + | 94) V1f=37 132 | ||
| + | 95) V1f=20 25 1.8400000 0.08000000 * | ||
| + | 3) V1f=1, | ||
| + | 6) V1f=1,3,6 492 44.9187000 0.10162600 | ||
| + | 12) V1f=3,6 368 33.2798900 0.10054350 | ||
| + | 24) V1f=3 249 22.4899600 0.10040160 * | ||
| + | 25) V1f=6 119 10.7899200 0.10084030 * | ||
| + | 13) V1f=1 124 11.6371000 0.10483870 * | ||
| + | 7) V1f=8,12 450 57.0244400 0.14888890 | ||
| + | 14) V1f=12 111 13.6936900 0.14414410 * | ||
| + | 15) V1f=8 339 43.3274300 0.15044250 * | ||
| </ | </ | ||
| - | **問6:これらがどのようなモデルか、データと出力に照らして検討せよ。** 特にlm.5.1、lm.5.1.c、rpart.5.1、rpart.5.1.cの間の違いは考察せよ。 | + | 上の決定木の結果を見るなどして、下の「V1の値をV1grに代入するだけのコード」の右辺をいろいろ変えてみて、「V1の値の種類を減らす工夫」(グルーピング)をする。 |
| + | これをメモ帳に貼り付けて幾つかを0にしたり、幾つかの変数に同じ値を割り振るなど、が実際の作業となる。 | ||
| + | 勿論、グルーピングの結果はレポートに記すこと。 | ||
| - | === レポート課題 | + | < |
| + | tic.learn$V1gr <- 0 | ||
| + | tic.learn$V1gr[tic.learn$V1==1] <- 1 | ||
| + | tic.learn$V1gr[tic.learn$V1==2] <- 2 | ||
| + | tic.learn$V1gr[tic.learn$V1==3] <- 3 | ||
| + | tic.learn$V1gr[tic.learn$V1==4] <- 4 | ||
| + | tic.learn$V1gr[tic.learn$V1==5] <- 5 | ||
| + | tic.learn$V1gr[tic.learn$V1==6] <- 6 | ||
| + | tic.learn$V1gr[tic.learn$V1==7] <- 7 | ||
| + | tic.learn$V1gr[tic.learn$V1==8] <- 8 | ||
| + | tic.learn$V1gr[tic.learn$V1==9] <- 9 | ||
| + | tic.learn$V1gr[tic.learn$V1==10] <- 10 | ||
| + | tic.learn$V1gr[tic.learn$V1==11] <- 11 | ||
| + | tic.learn$V1gr[tic.learn$V1==12] <- 12 | ||
| + | tic.learn$V1gr[tic.learn$V1==13] <- 13 | ||
| + | # | ||
| + | tic.learn$V1gr[tic.learn$V1==15] <- 15 | ||
| + | tic.learn$V1gr[tic.learn$V1==16] <- 16 | ||
| + | tic.learn$V1gr[tic.learn$V1==17] <- 17 | ||
| + | tic.learn$V1gr[tic.learn$V1==18] <- 18 | ||
| + | tic.learn$V1gr[tic.learn$V1==19] <- 19 | ||
| + | tic.learn$V1gr[tic.learn$V1==20] <- 10 | ||
| + | tic.learn$V1gr[tic.learn$V1==21] <- 21 | ||
| + | tic.learn$V1gr[tic.learn$V1==22] <- 22 | ||
| + | tic.learn$V1gr[tic.learn$V1==23] <- 23 | ||
| + | tic.learn$V1gr[tic.learn$V1==24] <- 24 | ||
| + | tic.learn$V1gr[tic.learn$V1==25] <- 25 | ||
| + | tic.learn$V1gr[tic.learn$V1==26] <- 26 | ||
| + | tic.learn$V1gr[tic.learn$V1==27] <- 27 | ||
| + | tic.learn$V1gr[tic.learn$V1==28] <- 28 | ||
| + | tic.learn$V1gr[tic.learn$V1==29] <- 29 | ||
| + | tic.learn$V1gr[tic.learn$V1==30] <- 30 | ||
| + | tic.learn$V1gr[tic.learn$V1==31] <- 31 | ||
| + | tic.learn$V1gr[tic.learn$V1==32] <- 32 | ||
| + | tic.learn$V1gr[tic.learn$V1==33] <- 33 | ||
| + | tic.learn$V1gr[tic.learn$V1==34] <- 34 | ||
| + | tic.learn$V1gr[tic.learn$V1==35] <- 35 | ||
| + | tic.learn$V1gr[tic.learn$V1==36] <- 36 | ||
| + | tic.learn$V1gr[tic.learn$V1==37] <- 37 | ||
| + | tic.learn$V1gr[tic.learn$V1==38] <- 38 | ||
| + | tic.learn$V1gr[tic.learn$V1==39] <- 39 | ||
| + | tic.learn$V1gr[tic.learn$V1==40] <- 40 | ||
| + | tic.learn$V1gr[tic.learn$V1==41] <- 41 | ||
| + | tic.learn$V1gr <- as.factor(tic.learn$V1gr) | ||
| + | </ | ||
| - | この課題ではMASSライブラリのみ、使う可能性がある。 | + | V5についても同様。 |
| < | < | ||
| - | library(MASS) | + | rpart(V86~V5f, data=tic.learn, |
| </ | </ | ||
| - | 1つ目のデータは、Rに次の命令を実行させておく。 | + | V5の値も幾つかのグループにまとめる。 |
| < | < | ||
| - | x <- c(2.2,4.1,5.5,1.9,3.4,2.6,4.2,3.7,4.9,3.2) | + | tic.learn$V5gr |
| - | y <- c(71, | + | tic.learn$V5gr[tic.learn$V5==1] <- 1 |
| - | data.1 <- data.frame(x=x,y=y) | + | tic.learn$V5gr[tic.learn$V5==2] <- 2 |
| - | rm(x,y) | + | tic.learn$V5gr[tic.learn$V5==3] <- 3 |
| + | tic.learn$V5gr[tic.learn$V5==4] <- 4 | ||
| + | tic.learn$V5gr[tic.learn$V5==5] <- 5 | ||
| + | tic.learn$V5gr[tic.learn$V5==6] | ||
| + | tic.learn$V5gr[tic.learn$V5==7] | ||
| + | tic.learn$V5gr[tic.learn$V5==8] <- 8 | ||
| + | tic.learn$V5gr[tic.learn$V5==9] <- 9 | ||
| + | tic.learn$V5gr[tic.learn$V5==10] <- 10 | ||
| + | tic.learn$V5gr <- as.factor(tic.learn$V5gr) | ||
| </ | </ | ||
| - | 2つ目のデータは、Rに次の命令を実行させておく。 | + | 参考までに、V1とV5で回帰樹を作ってみると・・・。 |
| < | < | ||
| - | x1 <- c(51,38, | + | rpart(V86~V1f+V5f, data=tic.learn, control=rpart.control(cp=0)) |
| - | x2 <- c(16, | + | |
| - | y <- c(3.0,3.2, | + | |
| - | data.2 <- data.frame(x1=x1, | + | |
| - | rm(x1,x2,y) | + | |
| </ | </ | ||
| - | 演習で用いる保険データは、Rに次の命令を実行させておく。 | + | 保険データへの決定木分析の適用に際しては、[[http:// |
| + | |||
| + | ここまで行うと、回帰分析を実行する関数は、次のようになる。(V1grとV5grを定義していなければエラーが表示されるだけ) | ||
| < | < | ||
| - | Sys.setenv(" | + | lm.learn.2 <- lm(V86~V1gr+V2 +V3 +V4 +V5gr+V6 +V7 +V8 +V9 +V10 |
| - | tic.learn | + | +V11+V12+V13+V14+V15+V16+V17+V18+V19+V20 |
| - | tic.eval <- read.table(" | + | +V21+V22+V23+V24+V25+V26+V27+V28+V29+V30 |
| - | tic.test <- read.table(" | + | |
| - | tic.eval <- cbind(tic.eval, tic.test) | + | +V41+V42+V43+V44+V45+V46+V47+V48+V49+V50 |
| - | colnames(tic.eval)[86] <- " | + | +V51+V52+V53+V54+V55+V56+V57+V58+V59+V60 |
| - | rm(tic.test) | + | +V61+V62+V63+V64+V65+V66+V67+V68+V69+V70 |
| + | +V71+V72+V73+V74+V75+V76+V77+V78+V79+V80 | ||
| + | +V81+V82+V83+V84+V85, | ||
| + | print(lm.learn.2) | ||
| + | summary(lm.learn.2) | ||
| + | plot(lm.learn.2) | ||
| </ | </ | ||
| - | あとはRコマンダーで、data.1、data.2、tic.learnそれぞれについて、回帰分析を進める。 | + | === 決定木分析 === |
| + | == とりあえず決定木分析を実行してみる == | ||
| < | < | ||
| - | library(Rcmdr) | + | rpart.learn.0 <- rpart(V86~V1f+V2 +V3 +V4 +V5f+V6 +V7 +V8 +V9 +V10 |
| + | +V11+V12+V13+V14+V15+V16+V17+V18+V19+V20 | ||
| + | +V21+V22+V23+V24+V25+V26+V27+V28+V29+V30 | ||
| + | +V31+V32+V33+V34+V35+V36+V37+V38+V39+V40 | ||
| + | +V41+V42+V43+V44+V45+V46+V47+V48+V49+V50 | ||
| + | +V51+V52+V53+V54+V55+V56+V57+V58+V59+V60 | ||
| + | +V61+V62+V63+V64+V65+V66+V67+V68+V69+V70 | ||
| + | +V71+V72+V73+V74+V75+V76+V77+V78+V79+V80 | ||
| + | +V81+V82+V83+V84+V85, | ||
| + | print(rpart.learn.0) | ||
| + | summary(rpart.learn.0) | ||
| + | plot(rpart.learn.0) | ||
| + | text(rpart.learn.0) | ||
| </ | </ | ||
| - | === Rコマンダーで回帰分析をする際に用いるメニュー | + | == 決定木分析をいろいろチューニングする (オプション課題) |
| - | Rコマンダーでの回帰分析の手順は、次の通り。 | + | rpart関数の分割を決める制御変数には |
| + | ^rpart.controlの引数^意味^デフォルト値^ | ||
| + | |minsplit|ノードの分割を試みる最小のレコード数|20| | ||
| + | |minbucket|終端ノードのレコード数の最小値|round(minsplit/ | ||
| + | |cp|決定木の複雑さを調整するパラメータ|0.05| | ||
| + | |maxdepth|決定木の最大の深さ|30| | ||
| + | などがある.他にも, | ||
| + | |||
| + | ^rpart.controlの引数^意味^デフォルト値^ | ||
| + | |maxcompete|the number of competitor splits retained in the output|4| | ||
| + | |maxsurrogate|the number of surrogate splits retained in the output|5| | ||
| + | |usesurrrogate|how to use surrogates in the splitting process|2| | ||
| + | |xval|number of cross-validations|10| | ||
| + | |surrogatestyle|controls the selection of a best surrogate|0| | ||
| + | |||
| + | などがあるが,このデータの分析では使わない. | ||
| + | |||
| + | 例えば次のように、分割する際のノードの最小データ数minsplitを5、複雑さの最小値cpを0.001とすると、結構、複雑な決定木に成長する。 | ||
| < | < | ||
| - | [統計量] | + | rpart.learn.1 <- rpart(V86~V1f+V2 +V3 +V4 +V5f+V6 +V7 +V8 +V9 +V10 |
| - | [モデル] -> [モデルを要約] | + | |
| - | [モデル] -> [逐次モデル選択] | + | |
| - | [モデル] -> [部分モデル選択] | + | |
| - | [モデル] -> [仮説検定] -> [分散分析] | + | |
| - | [モデル] -> [グラフ] -> [基本的診断プロット] | + | |
| - | [モデル] -> [グラフ] -> [影響プロット] | + | |
| + | +V71+V72+V73+V74+V75+V76+V77+V78+V79+V80 | ||
| + | +V81+V82+V83+V84+V85, | ||
| + | control=c(minsplit=5, | ||
| + | print(rpart.learn.1) | ||
| + | summary(rpart.learn.1) | ||
| + | plot(rpart.learn.1) | ||
| + | text(rpart.learn.1) | ||
| </ | </ | ||
| - | この手順で分析を進めながら、参考資料の解析ストーリーと対比させよ。 | + | これはきっと、成長させすぎ・・・。複雑さの下限cpをさらに0.0001と小さくすると,より複雑な木が得られる。 |
| - | 「モデル選択」は、添付の資料に従うなら、変数増減法だが、その他のことも考えてよいし、 | + | グラフもノード数が増えるので,字が小さくなる。 |
| - | 必ずしも選択されたモデルが最適であることもないので、少し変えても構わない。 | + | |
| - | === レポート === | + | |
| + | ==== レポート提出について ==== | ||
| レポート提出要領: | レポート提出要領: | ||
| ^項目^指定^ | ^項目^指定^ | ||
| - | |提出期限|実験実施の翌週の火曜日の午前10時30分まで| | + | |提出期限|実験実施の翌週の月曜日の午後7時0分まで |
| |提出方法|電子メールに添付 (宛先は配付資料に記載)| | |提出方法|電子メールに添付 (宛先は配付資料に記載)| | ||
| |ファイル形式|Wordファイル (LaTeXで作成する場合は、dvipdfmxでPDFに変換すること)| | |ファイル形式|Wordファイル (LaTeXで作成する場合は、dvipdfmxでPDFに変換すること)| | ||
| 行 380: | 行 861: | ||
| |提出部数|レポートは各自1通ずつ。{{: | |提出部数|レポートは各自1通ずつ。{{: | ||
| - | === 参考文献 === | + | ==== 参考文献 |
| * 永田・棟近 (2001) [[http:// | * 永田・棟近 (2001) [[http:// | ||
| + | |||
| + | |||
| + | ==== 練習課題(参考) ==== | ||
| + | |||
| + | 決定木について、理解が難しい人は、この部分の決定木の箇所だけでも実行して考えてみるといい。この箇所は今回の課題ではない。 | ||
| + | |||
| + | === タイタニック号 === | ||
| + | |||
| + | タイタニック号の乗客の生死のデータがある。Rで | ||
| + | < | ||
| + | Titanic | ||
| + | </ | ||
| + | と実行すると、表示される。 | ||
| + | |||
| + | これを個別のレコードに展開し、更に救出の優先順位を高く設定された女性もしくは子供と、低めに設定された成人男性という変数も加える。 | ||
| + | < | ||
| + | data(" | ||
| + | titanic <- as.data.frame(Titanic) | ||
| + | titanic <- titanic[rep(1: | ||
| + | names(titanic)[2] <- " | ||
| + | titanic <- transform(titanic, | ||
| + | Gender == " | ||
| + | levels = c(FALSE, TRUE), | ||
| + | labels = c(" | ||
| + | )) | ||
| + | </ | ||
| + | |||
| + | さらに、数値に変換したデータも用意する。これは、線形学習機械とロジスティック学習機械のために用いる。 | ||
| + | < | ||
| + | titanic.2 <- data.frame(Gender=(titanic$Gender==" | ||
| + | Age=(titanic$Age==" | ||
| + | Survived=(titanic$Survived==" | ||
| + | Class=(titanic$Class==" | ||
| + | </ | ||
| + | |||
| + | |変数|数値化情報| | ||
| + | |性別(Gender)|女性(Female)=1, | ||
| + | |年齢(Age)|子供(Child)=1, | ||
| + | |客室等級(Class)|1等(1st)=4, | ||
| + | |生存(Survived)|生存(Yes)=1, | ||
| + | |||
| + | === 先週の課題と同等の課題 === | ||
| + | |||
| + | 先週の課題は、タイタニック号で、生存率が高くなる条件を求めよ、という問題と同等。 | ||
| + | まず titanic というデータに含まれる変数の一覧を | ||
| + | < | ||
| + | names(titanic) | ||
| + | </ | ||
| + | で取り出す。すると | ||
| + | < | ||
| + | [1] " | ||
| + | </ | ||
| + | のように5個の変数があることが分かる。 | ||
| + | |||
| + | これを用いて、生存(Survived)についての集計を、客室等級(Class)、性別(Gender)、年齢層(Age)の組み合わせで行うには、次の1行を実行する。 | ||
| + | 「$」の前がデータ名、「$」の後ろに変数名(フィールド名)を付ける。 | ||
| + | < | ||
| + | ftable(titanic$Gender, | ||
| + | </ | ||
| + | すると | ||
| + | < | ||
| + | No Yes | ||
| + | | ||
| + | Male Child 1st | ||
| + | | ||
| + | | ||
| + | | ||
| + | Adult 1st | ||
| + | | ||
| + | | ||
| + | | ||
| + | Female Child 1st | ||
| + | | ||
| + | | ||
| + | | ||
| + | Adult 1st 4 140 | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | と出力されるのを、各自確認せよ。 | ||
| + | |||
| + | 同じことは、数値化したデータを用いても得られる。 | ||
| + | < | ||
| + | ftable(titanic.2$Gender, | ||
| + | </ | ||
| + | |||
| + | 上の出力と下の出力を見比べて、各変数の値の数値化を確認せよ。 | ||
| + | < | ||
| + | | ||
| + | | ||
| + | 0 0 1 670 192 | ||
| + | 2 387 75 | ||
| + | 3 154 14 | ||
| + | 4 118 57 | ||
| + | 1 1 0 0 | ||
| + | 2 | ||
| + | 3 0 11 | ||
| + | 4 0 5 | ||
| + | 1 0 1 3 20 | ||
| + | 2 | ||
| + | 3 | ||
| + | 4 4 140 | ||
| + | 1 1 0 0 | ||
| + | 2 | ||
| + | 3 0 13 | ||
| + | 4 0 1 | ||
| + | </ | ||
| + | |||
| + | === 線形学習機械 === | ||
| + | |||
| + | 上のデータ(titanic.2)に対して | ||
| + | < | ||
| + | lm(Survived~., | ||
| + | </ | ||
| + | を実行すると、全変数を用いた線形学習機械が最小二乗法により、学習される。学習結果のみなら、この一行で | ||
| + | < | ||
| + | Call: | ||
| + | lm(formula = Survived ~ ., data = titanic.2) | ||
| + | |||
| + | Coefficients: | ||
| + | (Intercept) | ||
| + | 0.11725 | ||
| + | </ | ||
| + | と出力される。 | ||
| + | |||
| + | この結果に、統計的推測の結果を付与するなら | ||
| + | < | ||
| + | summary(lm(Survived~., | ||
| + | </ | ||
| + | を実行すればよい。summary()の出力は次のように得られる。 | ||
| + | < | ||
| + | Call: | ||
| + | lm(formula = Survived ~ ., data = titanic.2) | ||
| + | |||
| + | Residuals (残差の分布): | ||
| + | Min 1Q Median | ||
| + | -0.7833 -0.2178 -0.1675 | ||
| + | |||
| + | Coefficients (回帰係数): | ||
| + | Estimate Std. Error t value Pr(> | ||
| + | (Intercept) 0.117252 | ||
| + | Gender | ||
| + | Age | ||
| + | Class | ||
| + | --- | ||
| + | Signif. codes (有意水準の表示法): | ||
| + | |||
| + | Residual standard error (残差の標準偏差): | ||
| + | Multiple R-squared (決定係数): | ||
| + | F-statistic (F統計量、分散分析の結果): | ||
| + | </ | ||
| + | |||
| + | == 線形学習機械のチューニング == | ||
| + | |||
| + | AICを用いた説明変数の選択を行うのであれば、 | ||
| + | < | ||
| + | library(MASS) | ||
| + | </ | ||
| + | とMASSパッケージを読み込んでから使える関数stepAIC()を用いて、 | ||
| + | < | ||
| + | stepAIC(lm(Survived~., | ||
| + | </ | ||
| + | を実行する。 | ||
| + | < | ||
| + | Start: | ||
| + | Survived ~ Gender + Age + Class | ||
| + | |||
| + | Df Sum of Sq RSS AIC | ||
| + | < | ||
| + | - Age | ||
| + | - Class | ||
| + | - Gender | ||
| + | |||
| + | Call: | ||
| + | lm(formula = Survived ~ Gender + Age + Class, data = titanic.2) | ||
| + | |||
| + | Coefficients: | ||
| + | (Intercept) | ||
| + | 0.11725 | ||
| + | </ | ||
| + | これはAICを変数増減法で最適化する関数であり、最終的に採用するモデルを出力してくれる便利な関数である。 | ||
| + | |||
| + | == 関係するグラフ == | ||
| + | < | ||
| + | titanic.lm <- lm(Survived~., | ||
| + | par(mfrow=c(2, | ||
| + | plot(titanic.lm) | ||
| + | par(mfrow=c(1, | ||
| + | </ | ||
| + | |||
| + | == 学習結果の解釈 == | ||
| + | |||
| + | 上の回帰分析から | ||
| + | < | ||
| + | Survived = 0.11725 + 0.46493 * Gender + 0.09655 * Age + 0.05029 * Class | ||
| + | </ | ||
| + | という学習結果が得られた。Survivedを大きくする(=生存する)ために、Genderが0よりは1の方が良いことは、回帰係数 0.46493 を見れば分かる。 | ||
| + | 同様に Age も0よりは1の方が良く、Classも1よりは4の方が良い。 | ||
| + | そしてどの変数も有意であることから、生存するためには、 | ||
| + | |||
| + | * 男性よりは女性 | ||
| + | * 大人よりは子供 | ||
| + | * 客室等級は高めの部屋を選ぶ | ||
| + | |||
| + | のが好条件となることが分かる。 | ||
| + | |||
| + | === ロジスティック線形学習機械 === | ||
| + | |||
| + | 生存確率をpとして | ||
| + | < | ||
| + | log(p/1-p) | ||
| + | </ | ||
| + | を与える学習機械が、ロジスティック回帰モデルである。Rではglm()という関数を用いて | ||
| + | < | ||
| + | glm(Survived~., | ||
| + | </ | ||
| + | で、ロジスティック回帰モデルを最尤推定で学習させることができる。 | ||
| + | 結果は | ||
| + | < | ||
| + | Call: glm(formula = Survived ~ ., family = " | ||
| + | |||
| + | Coefficients: | ||
| + | (Intercept) | ||
| + | -1.8622 | ||
| + | |||
| + | Degrees of Freedom: 2200 Total (i.e. Null); | ||
| + | Null Deviance: | ||
| + | Residual Deviance: 2299 AIC: 2307 | ||
| + | </ | ||
| + | と、lm()と似た出力を得る。 | ||
| + | これもsummary()を加えて | ||
| + | < | ||
| + | summary(glm(Survived~., | ||
| + | </ | ||
| + | を実行すると、 | ||
| + | < | ||
| + | Call: | ||
| + | glm(formula = Survived ~ ., family = " | ||
| + | |||
| + | Deviance Residuals: | ||
| + | Min | ||
| + | -1.7597 | ||
| + | |||
| + | Coefficients: | ||
| + | Estimate Std. Error z value Pr(> | ||
| + | (Intercept) -1.86224 | ||
| + | Gender | ||
| + | Age 0.51147 | ||
| + | Class 0.27834 | ||
| + | --- | ||
| + | Signif. codes: | ||
| + | |||
| + | (Dispersion parameter for binomial family taken to be 1) | ||
| + | |||
| + | Null deviance: 2769.5 | ||
| + | Residual deviance: 2299.2 | ||
| + | AIC: 2307.2 | ||
| + | |||
| + | Number of Fisher Scoring iterations: 4 | ||
| + | </ | ||
| + | と、種々の検定統計量が一緒に出力される。 | ||
| + | |||
| + | == ロジスティック学習機械のチューニング == | ||
| + | |||
| + | AICを用いた説明変数の選択を行うのであれば、 | ||
| + | < | ||
| + | library(MASS) | ||
| + | </ | ||
| + | とMASSパッケージを読み込んでから使える関数stepAIC()を用いて、 | ||
| + | < | ||
| + | stepAIC(glm(Survived~., | ||
| + | </ | ||
| + | を実行する。 | ||
| + | < | ||
| + | Start: | ||
| + | Survived ~ Gender + Age + Class | ||
| + | |||
| + | Df Deviance | ||
| + | < | ||
| + | - Age | ||
| + | - Class | ||
| + | - Gender | ||
| + | |||
| + | Call: glm(formula = Survived ~ Gender + Age + Class, family = " | ||
| + | data = titanic.2) | ||
| + | |||
| + | Coefficients: | ||
| + | (Intercept) | ||
| + | -1.8622 | ||
| + | |||
| + | Degrees of Freedom: 2200 Total (i.e. Null); | ||
| + | Null Deviance: | ||
| + | Residual Deviance: 2299 AIC: 2307 | ||
| + | </ | ||
| + | これはAICを変数増減法で最適化する関数であり、最終的に採用するモデルを出力してくれる便利な関数である。 | ||
| + | |||
| + | == 関係するグラフ == | ||
| + | |||
| + | < | ||
| + | titanic.glm <- glm(Survived~., | ||
| + | par(mfrow=c(2, | ||
| + | plot(titanic.glm) | ||
| + | par(mfrow=c(1, | ||
| + | </ | ||
| + | |||
| + | == 学習結果の解釈 == | ||
| + | |||
| + | 上の回帰分析から | ||
| + | < | ||
| + | log(Pr[Survived]/ | ||
| + | </ | ||
| + | という学習結果が得られた。Pr[Survived](生存する確率)を大きくするために、Genderが0よりは1の方が良いことは、回帰係数 2.050802 を見れば分かる。 | ||
| + | 同様に Age も0よりは1の方が良く、Classも1よりは4の方が良い。 | ||
| + | そしてどの変数も有意であることから、生存するためには、 | ||
| + | |||
| + | * 男性よりは女性 | ||
| + | * 大人よりは子供 | ||
| + | * 客室等級は高めの部屋を選ぶ | ||
| + | |||
| + | のが好条件となることが分かる。 | ||
| + | |||
| + | === 決定木 === | ||
| + | |||
| + | 決定木は生存確率pの高低を際立たせるような、データの分割を表現するモデルである。Rではrpartパッケージの中のrpart()、もしくはmvpartパッケージの中のmvpart()という関数を用いて | ||
| + | < | ||
| + | library(mvpart) | ||
| + | rpart(Survived~., | ||
| + | </ | ||
| + | で、決定木を学習させることができる。 | ||
| + | 結果は | ||
| + | < | ||
| + | n= 2201 | ||
| + | |||
| + | node), split, n, loss, yval, (yprob) | ||
| + | * denotes terminal node | ||
| + | |||
| + | 1) root 2201 711 No (0.6769650 0.3230350) | ||
| + | 2) Gender=Male 1731 367 No (0.7879838 0.2120162) | ||
| + | 4) Age=Adult 1667 338 No (0.7972406 0.2027594) * | ||
| + | 5) Age=Child 64 29 No (0.5468750 0.4531250) | ||
| + | 10) Class=3rd 48 13 No (0.7291667 0.2708333) * | ||
| + | 11) Class=1st, | ||
| + | 3) Gender=Female 470 126 Yes (0.2680851 0.7319149) | ||
| + | 6) Class=3rd 196 90 No (0.5408163 0.4591837) * | ||
| + | 7) Class=1st, | ||
| + | </ | ||
| + | と、これまでとは違ったものになる。各行はノードと呼ばれる分割単位を表し、 | ||
| + | たとえば | ||
| + | < | ||
| + | 1) root 2201 711 No (0.6769650 0.3230350) | ||
| + | </ | ||
| + | は、 | ||
| + | * データ全体(root)はレコード数が2201 | ||
| + | * このノードの代表値(一番多い値)はNo | ||
| + | * 2201のうち711はNoでない | ||
| + | * YesとNoの比は0.6769650: | ||
| + | を意味する。これを性別で分割すると | ||
| + | < | ||
| + | 2) Gender=Male 1731 367 No (0.7879838 0.2120162) | ||
| + | 3) Gender=Female 470 126 Yes (0.2680851 0.7319149) | ||
| + | </ | ||
| + | を得た、とある。これは | ||
| + | * データ全体を性別で分割すると、生存確率がもっとも差が開く | ||
| + | * 男性の代表値はNo(死亡)、0.7879838は死亡確率を意味するので、生存確率は0.2120162 | ||
| + | * 女性の代表値はYes(生存)、0.7319149は生存確率 | ||
| + | と読み取ることができる。 | ||
| + | 生存確率の高いノードを探すと | ||
| + | < | ||
| + | 7) Class=1st, | ||
| + | </ | ||
| + | が目に付く。これは、 | ||
| + | - Gender=Female | ||
| + | - Class=1st, | ||
| + | と条件がふたつついたノードであり、「女性かつ1等客室の乗客、2等客室の乗客、または乗組員」となる。 | ||
| + | この属性を持つ人々は、生存確率が0.9270073と最も高い。 | ||
| + | 逆に最も生存確率が低いのは | ||
| + | < | ||
| + | 10) Class=3rd 48 13 No (0.7291667 0.2708333) * | ||
| + | </ | ||
| + | であり、このノードまでを | ||
| + | - Gender=Male | ||
| + | - Age=Adult | ||
| + | - Class=3rd | ||
| + | と辿れることから、「男性で成人で3等客室の乗客」は生存確率が0.2708333と最も低かったことが分かる。 | ||
| + | |||
| + | これもsummary()を加えて | ||
| + | < | ||
| + | summary(rpart(Survived~., | ||
| + | </ | ||
| + | を実行すると、 | ||
| + | < | ||
| + | Call: | ||
| + | rpart(formula = Survived ~ ., data = titanic) | ||
| + | n= 2201 | ||
| + | |||
| + | CP nsplit rel error xerror | ||
| + | 1 0.30661041 | ||
| + | 2 0.02250352 | ||
| + | 3 0.01125176 | ||
| + | 4 0.01000000 | ||
| + | |||
| + | Node number 1: 2201 observations, | ||
| + | predicted class=No | ||
| + | class counts: | ||
| + | | ||
| + | left son=2 (1731 obs) right son=3 (470 obs) | ||
| + | Primary splits: | ||
| + | Gender | ||
| + | Treatment splits as LR, | ||
| + | Class | ||
| + | Age | ||
| + | Surrogate splits: | ||
| + | Treatment splits as LR, agree=0.971, | ||
| + | |||
| + | Node number 2: 1731 observations, | ||
| + | predicted class=No | ||
| + | class counts: | ||
| + | | ||
| + | left son=4 (1667 obs) right son=5 (64 obs) | ||
| + | Primary splits: | ||
| + | Age | ||
| + | Treatment splits as LR, | ||
| + | Class | ||
| + | Surrogate splits: | ||
| + | Treatment splits as LR, agree=1, adj=1, (0 split) | ||
| + | |||
| + | Node number 3: 470 observations, | ||
| + | predicted class=Yes | ||
| + | class counts: | ||
| + | | ||
| + | left son=6 (196 obs) right son=7 (274 obs) | ||
| + | Primary splits: | ||
| + | Class splits as RRLR, improve=50.015320, | ||
| + | Age | ||
| + | Surrogate splits: | ||
| + | Age splits as LR, agree=0.619, | ||
| + | |||
| + | Node number 4: 1667 observations | ||
| + | predicted class=No | ||
| + | class counts: | ||
| + | | ||
| + | |||
| + | Node number 5: 64 observations, | ||
| + | predicted class=No | ||
| + | class counts: | ||
| + | | ||
| + | left son=10 (48 obs) right son=11 (16 obs) | ||
| + | Primary splits: | ||
| + | Class splits as RRL-, improve=12.76042, | ||
| + | |||
| + | Node number 6: 196 observations | ||
| + | predicted class=No | ||
| + | class counts: | ||
| + | | ||
| + | |||
| + | Node number 7: 274 observations | ||
| + | predicted class=Yes | ||
| + | class counts: | ||
| + | | ||
| + | |||
| + | Node number 10: 48 observations | ||
| + | predicted class=No | ||
| + | class counts: | ||
| + | | ||
| + | |||
| + | Node number 11: 16 observations | ||
| + | predicted class=Yes | ||
| + | class counts: | ||
| + | | ||
| + | </ | ||
| + | と、分割の経緯が一緒に出力される。 | ||
| + | == 決定木のチューニング == | ||
| + | |||
| + | 上のsummary()の出力の中に「complexity param」という項目が見られる。 | ||
| + | rpart()では、この値の下限を指定することで、生成する決定木の深さを選択できる。 | ||
| + | |||
| + | 次の3行による学習結果の違いを観察してみよ。 | ||
| + | < | ||
| + | print(rpart(Survived~., | ||
| + | print(rpart(Survived~., | ||
| + | print(rpart(Survived~., | ||
| + | </ | ||
| + | |||
| + | |||
| + | == 関係するグラフ == | ||
| + | < | ||
| + | titanic.rpart <- rpart(Survived~., | ||
| + | plot(titanic.rpart) | ||
| + | text(titanic.rpart) | ||
| + | </ | ||
| + | |||
| + | == 学習結果の解釈 == | ||
| + | |||
| + | 上の決定木の結果から、生存確率が高い条件は | ||
| + | - 1等・2等客室の女性乗客、または女性の乗組員 | ||
| + | - 1等・2等客室の子供乗客 | ||
| + | であり、生存確率が特に低いのは | ||
| + | - 3等客室の男性乗客 | ||
| + | であったことが分かる。 | ||
| + | |||
| + | === 練習課題についての課題 === | ||
| + | |||
| + | * 3つの分析手法を適用せよ。(時間内課題) | ||
| + | * 3つの分析手法の結果をまとめ、比較検討せよ。(レポート課題) | ||
| + | * これら以外に、Rで2値判別を行う手法を探し、適用して、比較に加えてみよ。(課外課題) | ||
| === サポート欄 === | === サポート欄 === | ||
| 行 415: | 行 1402: | ||
| |V84|5777|44|1| | | | | | |V84|5777|44|1| | | | | | ||
| - | === 参考 === | + | ==== 参考 |
| - | == 少し加工する == | + | === V86も因子変数にしてみると == |
| - | 以下の6行は、実行しない方がいい場合もある。 | + | V86まで因子変数に変えると、glm関数の挙動が少し変わるかも。 |
| < | < | ||
| - | tic.learn$V1 <- as.factor(tic.learn$V1) | + | tic.learn$V86f <- as.factor(tic.learn$V86) |
| - | tic.learn$V5 <- as.factor(tic.learn$V5) | + | |
| - | tic.learn$V86 <- as.factor(tic.learn$V86) | + | |
| - | tic.eval$V1 <- as.factor(tic.eval$V1) | + | |
| - | tic.eval$V5 <- as.factor(tic.eval$V5) | + | |
| - | tic.eval$V86 <- as.factor(tic.eval$V86) | + | |
| </ | </ | ||
| - | あとはそのまま。 | + | === 訪問客リストを作成したい場合 === |
| == 考えたルールに基づく対象限定 == | == 考えたルールに基づく対象限定 == | ||
| 行 512: | 行 1493: | ||
| で38.275%となる。 | で38.275%となる。 | ||
| - | == 想定される困難 == | + | === TICデータでロジスティック回帰を行う場合のメモ === |
| + | == 想定される困難 | ||
| 次の1行を実行すると、かなり時間がかかってエラーになる。 | 次の1行を実行すると、かなり時間がかかってエラーになる。 | ||
| 行 559: | 行 1541: | ||
| V61+V62+V63+V64, | V61+V62+V63+V64, | ||
| </ | </ | ||
| + | |||