Regression and decision-tree
- 2. ⽬次
• ⾃⼰紹介
• 今⽇のゴール
• Rのセットアップ
• 基礎⽂法
• データ分析プロセスの概要
• データ獲得
• データ選択
• 前処理・変換
• データマイニング1:回帰
• データマイニング2:決定⽊
• まとめ
2
- 19. 特殊なベクトル 因⼦
• カテゴリ変数や順序変数を扱う時に使う
• ラベルを定義し、それぞれの箱には数値を
格納することで、使⽤するメモリサイズが
減る。
• 扱い⽅
> use<-factor(c("住宅","事務所","店
舗"))
> use[1:2]
[1] 住宅 事務所
Levels: 事務所 住宅 店舗
19
[2]
3
[3]
2
[1]
1
use
(1:住宅、2:事務所、3:店舗)
[4]
2
実践
- 22. データフレームの基本
> df_house<-data.frame (place, price)
> # 必須ではないが、変数名の初めにデータの種類を識別できる⽂字をつけ
ると便利
> df_house$price # リストと同じように参照できる
[1] 1000 1500 2000
> df_house[1,2] # [⾏,列]で参照できる
[1] 1000
> df_house[1,] # ⾏全体を⾒たいときは列を空⽩にする
place price
1 新宿 1000
22
実践
- 28. データ分析プロセスの概要
KDD(Knowledge Discovery in Databases)のプロセス
1. データ獲得
対象領域の性質を理解し、事前知識と必要なデータ、ならびにデータマイニングの⽬標を設定する。
2. データ選択
データからマイニングに必要なものを選択する。
3. 前処理
データからノイズや異常値を除去し、意図した分析が実施可能なデータにする。
4. 変換
知識発⾒アルゴリズムを適⽤できるよにデータを変換する。属性⽣成や属性選択などの処理が含まれる。
5. データマイニング
統計解析や機械学習などの分析⼿法を⽤いて、データから治験を発⾒する。
6. 解釈・評価
抽出したパターンの解釈や評価を⾏って知識を得る。
28
福島真太郎『Useful R データ分析プロセス』p8参照
- 43. ⽋損値の対処⽅法(例)
• ⽋損があるデータを⾒る
>na_data<-est23[is.na(est23$floor_plan),]
>summary(na_data)
>#is.na()は空⽩ならTRUE、空⽩でなければFALSEを返す
• ⽋損があるデータとないデータを⽐べる。
(平均値で⽐べたり、plotで描画したり)
> no_na_data<-est23[!is.na(est23$floor_plan),]
> plot(na_data$total_price,col="blue",pch=2,ylim=c(0,1.5e+10))
> par(new=T) # 上書き指定
> plot(no_na_data$total_price,col=“red",pch=1,xlim=c(0,15000),ylim=c(0,1.5e+10))
> # 間取り(floor_plan)がNAのデータは取引価格が⾼い傾向にある。
> # 特別な間取りだから⾼いのか?そもそも住宅じゃないのか?などの仮説を⽴てながら、データを観察していく。
• ⽋損のあるデータを削除する
est23<-est23[!is.na(est23$floor_plan),]
43
- 52. 統計の基本知識
• (算術)平均:和を個数で割ったもの
• 分散:平均からのばらつき
• 標準偏差:分散の平⽅根
• 共分散:2変数間の関係性
• 相関係数:2変数間の関係性
52
E(X) =
N
i=1(xi)/N
V ar(X) =
N
i=1(xi − ¯x)2
/N − 1
sx = V ar(X)
Cov(X, Y ) =
N
i=1(xi − ¯x)(yi − ¯y
rxy = Cov(X, Y )/(N − 1)sxsy
E(X) =
N
i=1(xi)/N
V ar(X) =
N
i=1(xi − ¯x)2
/N − 1
sx = V ar(X)
Cov(X, Y ) =
N
i=1(xi − ¯x)(yi − ¯y)/N −
rxy = Cov(X, Y )/(N − 1)sxsy (−1
E(X) =
N
i=1(xi)/N
V ar(X) =
N
i=1(xi − ¯x)2
/N − 1
sx = V ar(X)
Cov(X, Y ) =
N
i=1(xi − ¯x)(yi −
rxy = Cov(X, Y )/(N − 1)sxsy
E(X) =
N
i=1(xi)/N
V ar(X) =
N
i=1(xi − ¯x)2
/N − 1
sx = V ar(X)
Cov(X, Y ) =
N
i=1(xi − ¯x)(yi − ¯y)/N − 1
rxy = Cov(X, Y )/(N − 1)sxsy (−1 ≤ rxy ≤
E(X) =
N
i=1(xi)/N
V ar(X) =
N
i=1(xi − ¯x)2
/N − 1
sx = V ar(X)
Cov(X, Y ) =
N
i=1(xi − ¯x)(yi − ¯y)/N
rxy = Cov(X, Y )/(N − 1)sxsy
(−1 ≤ rxy ≤ 1)
E(X) =
N
i=1(xi)/N
V ar(X) =
N
i=1(xi − ¯x)2
/N
sx = V ar(X)
Cov(X, Y ) =
N
i=1(xi − ¯x)(y
rxy = Cov(X, Y )/(N − 1)sxs
(−1 ≤ rxy ≤ 1)
- 57. Rでの回帰モデル構築⽅法
># モデルの構築
>model<- lm(dv~ev, data ) # dvは被説明変数、evは説明変数
># 住宅データにおける実⾏例
>m_lm <- lm(total_price ~ station_distance + area + next_use +
city_planning + age + renovation_flg + number_of_floor + kitchen_level
+ service_room,data=est23_train)
># dataに含まれる変数の1つを被説明変数、残りを全て説明変数として扱いた
い場合
>m_lm_rya <- lm(total_price ~ . ,data=est23_train) # ドットで代⽤でき
る
57
実践
- 59. 回帰モデルの解釈
> summary(m_lm)
Call:
lm(formula = total_price ~ station_distance + area + next_use + city_planning + age + renovation_flg + number_of_floor +
kitchen_level + service_room, data = est23_train)
Residuals:
Min 1Q Median 3Q Max
-469922877 -6636840 -995856 4919994 1330666943
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 12576470 1275901 9.857 < 2e-16 ***
station_distance -805193 54158 -14.867 < 2e-16 ***
area 1165188 17596 66.220 < 2e-16 ***
next_use事務所 3920091 1983995 1.976 0.048195 *
next_use住宅 2447322 713819 3.428 0.000609 ***
next_use店舗 -4666066 10581334 -0.441 0.659242
59
切⽚(α)
各変数が1単位増えた時に
住宅価格に与える影響(β)
各変数が被説明変数と
関係がある可能性。
可能性が⾼いと、*が多い
実践
- 60. 回帰モデルの解釈
> summary(m_lm)
Call:
lm(formula = total_price ~ station_distance + area + next_use + city_planning + age + renovation_flg + number_of_floor +
kitchen_level + service_room, data = est23_train)
Residuals:
Min 1Q Median 3Q Max
-469922877 -6636840 -995856 4919994 1330666943
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 12576470 1275901 9.857 < 2e-16 ***
station_distance -805193 54158 -14.867 < 2e-16 ***
area 1165188 17596 66.220 < 2e-16 ***
next_use事務所 3920091 1983995 1.976 0.048195 *
next_use住宅 2447322 713819 3.428 0.000609 ***
next_use店舗 -4666066 10581334 -0.441 0.659242
60
なにこれ??
実践
- 61. 線形回帰では因⼦型変数を
どうモデル化しているか
以下の2つの⼿順を経てモデル化している
1. 因⼦型の変数を0か1かの値をとる変数(ダミー変数)に分割する
例:next_use={事務所,住宅,店舗,その他}
→next_use事務所={0,1},next_use住宅={0,1},
next_use店舗{0,1},next_useその他={0,1}
2. 1つダミー変数を基準として、他のダミー変数はその基準と⽐べ
て、どの程度被説明変数に対して影響度があるかを計算する
例:next_useその他と⽐べて、next_use事務所の場合は3920091
円上がる。next_use住宅の場合は2447322円上がる。next_use
店舗の場合は、4666066円下がる。
61
- 66. (3)診断図
• Residuals vs Fitted:予測と実際の乖離を描画したもの
• NormalQ-Q:残差の正規性を確認できる。正規確率プ
ロットとも呼ぶ。
• Scale-Location:予測値と残差の⼤きさの関係性を描画
したもの。
• Residuals vs Leverage:モデル構築に影響⼒のあるデー
タを探すのに役⽴つ。
66
参考
- 67. Residuals vs Fitted
67
横軸 回帰モデルによる予測値
縦軸 残差e(予測値と実際の乖離)
読み取れ
ること
残差が0付近で均⼀分散していれば、うまく
モデルで説明できている。
⽬的変数の値が⼤きなるほど残差が⼤きいな
どの傾向が⾒られる場合は、
考慮できていない特徴量がある、もしくは、
単回帰・重回帰の関数形では説明できない可
能性がある。(⼀般化線形モデルへ)
参考
- 70. Residuals vs Leverage
70
横軸 作⽤点(梃⼦値)
縦軸 標準化残差
読み取れ
ること
横軸はX⽅向の外れ値、縦軸はY⽅向の外れ
値と読み替えることができる。
⾚線でクックの距離0.5を表している。
クックの距離0.5を超えると外れ値として扱
われる。
参考
- 80. どのようにして分割条件を⾒出すか
基本⽅針:
分割することで、データのごちゃ混ぜ度合い(不純度)が減ることを⽬指す。
ごちゃ混ぜ度合いを⼤きく減らせることを、情報利得が⼤きいという。
情報利得:
(分割前のノードにおける不純度)ー(分割後のノードにおける不純度)
80
【情報利得⼩さい】 【情報利得⼤きい】
p N(tp) l N(tp) r
= 0.66 − {0.33 + 0.33}
= 0
I(tp) = 1 − {(2
6 )2
+ (2
6 )2
+ (2
6 )2
} = 0.66
I(tl) = 1 − {(2
4 )2
+ (2
4 )2
} = 0.5
I(tr) = 1 − {(2
2 )2
} = 0
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0}
= 0.33
a
tp
tl
tr
I(tp) = 1 − {(2
6 )2
+ (2
6 )2
+ (2
6 )2
} = 0.66
I(tl) = 1 − {(1
3 )2
+ (1
3 )2
+ (1
3 )2
} = 0.66
I(tr) = 1 − {(1
3 )2
+ (1
3 )2
+ (1
3 )2
} = 0.66
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0.33}
= 0
I(tp) = 1 − {(2
6 )2
+ (2
6 )2
+ (2
6 )2
} = 0.66
I(tl) = 1 − {(2
4 )2
+ (2
4 )2
} = 0.5
I(tr) = 1 − {(2
2 )2
} = 0
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0}
= 0.33
a
tp
tl
tr
I(tl) = 1 − {(3 ) + (3 ) + (3 ) } = 0.66
I(tr) = 1 − {(1
3 )2
+ (1
3 )2
+ (1
3 )2
} = 0.66
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0.33}
= 0
I(tp) = 1 − {(2
6 )2
+ (2
6 )2
+ (2
6 )2
} = 0.66
I(tl) = 1 − {(2
4 )2
+ (2
4 )2
} = 0.5
I(tr) = 1 − {(2
2 )2
} = 0
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0}
= 0.33
a
tp
tl
tr
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0.33}
= 0
I(tp) = 1 − {(2
6 )2
+ (2
6 )2
+ (2
6 )2
} = 0.66
I(tl) = 1 − {(2
4 )2
+ (2
4 )2
} = 0.5
I(tr) = 1 − {(2
2 )2
} = 0
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0}
= 0.33
a
tp
tl
tr
I(tp) = 1 − {(2
6 )2
+ (2
6 )2
+ (2
6 )2
} = 0.66
I(tl) = 1 − {(1
3 )2
+ (1
3 )2
+ (1
3 )2
} = 0.66
I(tr) = 1 − {(1
3 )2
+ (1
3 )2
+ (1
3 )2
} = 0.66
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0.33}
= 0
I(tp) = 1 − {(2
6 )2
+ (2
6 )2
+ (2
6 )2
} = 0.66
I(tl) = 1 − {(2
4 )2
+ (2
4 )2
} = 0.5
I(tr) = 1 − {(2
2 )2
} = 0
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0}
= 0.33
a
tp
tl
tr
I(tl) = 1 − {(3 ) + (3 )
I(tr) = 1 − {(1
3 )2
+ (1
3 )2
= I(tp) − {
N(
N(
= 0.66 − {0.33 +
= 0
I(tp) = 1 − {(2
6 )2
+ (2
6 )2
I(tl) = 1 − {(2
4 )2
+ (2
4 )2
I(tr) = 1 − {(2
2 )2
} = 0
= I(tp) − {
N(
N(
= 0.66 − {0.33 +
= 0.33
a
tp
tl
tr
- 82. 情報利得と不純度の計算例
82
【情報利得⼩さい】 【情報利得⼤きい】
aa
t I(t)
t i Ni(t)
I(t) = 1 − {(N1(t)
N(t) )2
+ (N2(t)
N(t) )2
+ · · · + (Ni(t)
N(t) )2
}
I(tp) = 1 − {(2
6 )2
+ (2
6 )2
+ (2
6 )2
} = 0.66
I(tl) = 1 − {(1
3 )2
+ (1
3 )2
+ (1
3 )2
} = 0.66
I(tr) = 1 − {(1
3 )2
+ (1
3 )2
+ (1
3 )2
} = 0.66
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0.33}
= 0
t I(t)
t i Ni(t)
I(t) = 1 − {(N1(t)
N(t) )2
+ (N2(t)
N(t) )2
+ · · · + (Ni(t)
N(t) )
I(tp) = 1 − {(2
6 )2
+ (2
6 )2
+ (2
6 )2
} = 0.66
I(tl) = 1 − {(1
3 )2
+ (1
3 )2
+ (1
3 )2
} = 0.66
I(tr) = 1 − {(1
3 )2
+ (1
3 )2
+ (1
3 )2
} = 0.66
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0.33}
= 0
I(tp) = 1 − {(2
6 )2
+ (2
6 )2
+ (2
6 )2
} = 0.66
I(tl) = 1 − {(2
4 )2
+ (2
4 )2
} = 0.5
I(tr) = 1 − {(2
2 )2
} = 0
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0}
= 0.33
2
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0}
= 0.33
a
tp
tl
tr
1
I(tp) = 1 − {(2
6 )2
+ (2
6 )2
+ (2
6 )2
} = 0.66
I(tl) = 1 − {(2
4 )2
+ (2
4 )2
} = 0.5
I(tr) = 1 − {(2
2 )2
} = 0
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0}
= 0.33
a
tp
tl
tr
1
I(tl) = 1 − {(2
4 )2
+ (2
4 )2
} = 0.5
I(tr) = 1 − {(2
2 )2
} = 0
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0}
= 0.33
a
tp
tl
tr
1
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0}
= 0.33
a
tp
tl
tr
1
I(tp) = 1 − {(2
6 )2
+ (2
6 )2
+ (2
6 )2
} = 0.66
I(tl) = 1 − {(2
4 )2
+ (2
4 )2
} = 0.5
I(tr) = 1 − {(2
2 )2
} = 0
= I(tp) − {
N(tl)
N(tp) I(tl)+
N(tr)
N(tp) I(tr)}
= 0.66 − {0.33 + 0}
= 0.33
a
tp
tl
tr
1
I(tl) = 1 − {(2
4 )2
+ (2
4 )2
I(tr) = 1 − {(2
2 )2
} = 0
= I(tp) − {
N(
N(
= 0.66 − {0.33 +
= 0.33
a
tp
tl
tr
- 87. 決定⽊と回帰⽊
87
決定⽊ 回帰⽊
被説明変数
カテゴリ
(例:晴れ・曇り・⾬)
数値
(例:降⽔量)
基本⽅針 不純度が⼩さくなるように分割する
不純度 ジニ係数
平均からの距離
(分散や標準偏差)
不純度の数式
iはクラス番号
kはデータ番号
予測値 カテゴリ
終端ノードの
データの平均値
aa
t I(t)
t i Ni(t)
I(t) = 1 − {(N1(t)
N(t) )2
+ (N2(t)
N(t) )2
+ · · · + (Ni(t)
N(t) )2
}
1 − (Ni(t)
N(t) )2
1
N(t) (yi − ¯yi)2
aa
t I(t)
t i N
I(t) = 1 − {(N1(t)
N(t) )2
+ (N2(t)
N(t) )2
1 − (Ni(t)
N(t) )2
1
N(t) (yk − ¯yk)2
I(tp) = 1 − {(2
6 )2
+ (2
6 )2
+ (2
6 )2
} = 0.66
I(tl) = 1 − {(1
3 )2
+ (1
3 )2
+ (1
3 )2
} = 0.66
- 90. Rでの決定⽊・回帰⽊構築⽅法
># 基本形
>m <- rpart(dv~ev, data, method, control,…) #dvは被説明変数、evは説明変数
># 住宅データでの使⽤例
>install.packages(“rpart”) # パッケージをインストール
>library(rpart) # インストールしたパッケージを使える状態にする
>m_rpart<-rpart(total_price~.,data=est23_train) # m_rpart変数に構築した
回帰⽊を代⼊
># 引数の説明
・method:クラスへの分類問題ならclass、連続値で回帰⽊をつかたい場合はanovaを
指定。しかし、指定しなくても、勝⼿にデータを解釈して設定してくれる。
・control:パラメータチューニング時に使⽤。詳細は後述。
90
実践
- 92. 決定⽊・回帰⽊の解釈
# 構築されたモデルを⾒る
> print(m_rpart) # m_rpart と⼊⼒するだけでも可
n= 8000
node), split, n, deviance, yval
* denotes terminal node
1) root 8000 5.730641e+18 34827350
2) area< 57.5 5378 9.911319e+17 25237040
4) area< 32.5 3203 1.722265e+17 19269090
8) age>=21.5 982 3.886630e+16 12355700 *
9) age< 21.5 2221 6.567371e+16 22325800 *
92
終端ノードを⽰す
そのノードの平均値
実践
- 93. 決定⽊・回帰⽊の解釈
># 描画する
>install.packages(“rpart.plot”) # パッケージをインストール
>rpart.plot(model,type,extra,) # パッケージを使える状態にする
>rpart.plot(m_rpart)
93
rpart.plotの良く使う引数
引数 オプション
type
ノードラベルと分割情報のラベルの表⽰をコントロールする。
0: ノードに分割ラベルをつける(デフォルト)
1: 分割ラベルを上、ノードラベルを下に付ける。
2: ノードラベルを上、分割ラベルを下に付ける。
3: 枝に分割ラベルを付け、ノードにはラベルを付けない。
4: 3の結果にノードラベルを付ける。
extra
ノードに情報を表⽰する。
0: 何の情報も表⽰しない。
1: ノードに含まれる個体数を表⽰する。
2: 正しく分類された⽐率を分数で⽰す。
3: 誤分類された⽐を⽰す。
4: クラス内の確率を⽰す。
5: クラス内の確率のみを⽰す
cex ⽂字のサイズをコントロールする。デフォルトはcex=1
『[連載] フリーソフトによるデータ解析・マイニング 第19回』を参考に表を作成
https://www1.doshisha.ac.jp/~mjin/R/Chap_19/19.html
実践
- 99. 決定⽊・回帰⽊の
パラメータチューニング(例)
># ⽊の⼤きさ、cp、誤り率の関係性を観察する
># 数値だけでは分かりにくいので図⽰
> printcp(m_rpart_2)
># ⾚丸で囲んだあたりのcpを設定してみる
>m_rpart_3<-rpart(total_price~.,data=est23_train,cp=0.0018)
># 予測精度を検証
> p_total_price_rpart_3<-predict(m_rpart_3, est23_test)
> mean(abs(p_total_price_rpart_3 - est23_test$total_price))
[1] 9380502
# デフォルトでは10217137だったので、少し精度が上がった。
【1標準偏差ルール】
決定⽊では、cp の設定基準として、誤り率の最⼩値とその点の標準偏差を加えた値を超えない最⼤のcpを設定す
るという慣例がある。
ただし、回帰⽊では、誤り値の標準偏差は⼤きくなる傾向があるので、あまり参考にならない。
99
参考
- 102. 参考⽂献
• データ分析プロセス『⾦明哲』
• 蓑⾕千凰彦『回帰診断』
• BrettLantz(訳:⻑尾⾼弘)『Rによる機械学習』
• 平井有三『はじめてのパターン認識』
• 『[連載] フリーソフトによるデータ解析・マイニング 第19回』
https://www1.doshisha.ac.jp/~mjin/R/Chap_19/19.html
• 間瀬茂『R基本統計関数マニュアル』
https://cran.r-project.org/doc/contrib/manuals-jp/Mase-Rstatman.pdf
102