R {{category R}} {{category R.package}} !!!決定木分析 {{outline}} ---- !!概要 *決定木 ** 分類木:目的変数がカテゴリー ** 回帰木:目的変数が数値(連続) !分析のアルゴリズム * C4.5:カテゴリー * CART * CHAID ---- !サンプルデータとスクリプト サンプルデータ(各指標)から、 1)欠損値を含むデータ2つを除き、 2)ファイル名のカラムを削除したものを、 jpn.4cというデータフレームに入れているものとします。 {{pre > nrow(jpn.4b) [1] 287 > nrow(jpn.4c) [1] 285 > head(jpn.4c) Score Token Type NoS TTR GI MATTR AWL ASL 1 4 319 135 30 0.4231975 7.558549 0.5921317 4.304075 10.63333 2 4 356 161 29 0.4522472 8.532983 0.6649157 4.233146 12.27586 3 3 201 121 13 0.6019900 8.534682 0.7170149 4.746269 15.46154 4 4 260 140 27 0.5384615 8.682431 0.6877692 4.761538 9.62963 5 4 420 175 25 0.4166667 8.539126 0.6341905 3.995238 16.80000 6 3 261 124 20 0.4750958 7.675407 0.6390038 4.072797 13.05000 }} ! rpartでDecision Tree Analysis パッケージ rpart をインストール。 Scoreを目的変数(分類カテゴリー)として、残りの言語指標(説明変数)のどれがどのくらい分類に寄与するかを観察します。 式は: rpart(目的変数 ~ ., data = データフレーム) 結果を、モデルとして保存するようにします。 具体的には、まず、attachして使うデータフレーム名を決めておく。 {{pre > attach(jpn.4c) > jpn.DTmodel <- rpart(Score ~ ., data = jpn.4c) > jpn.DTmodel n= 285 node), split, n, deviance, yval * denotes terminal node 1) root 285 166.0491000 3.635088 2) Type< 130.5 152 45.8684200 3.118421 4) Token< 163.5 11 4.9090910 2.090909 * 5) Token>=163.5 141 28.4397200 3.198582 10) Token< 262 109 14.2568800 3.082569 20) AWL< 4.72274 91 6.9890110 3.010989 * 21) AWL>=4.72274 18 4.4444440 3.444444 * 11) Token>=262 32 7.7187500 3.593750 22) AWL< 4.229472 19 4.4210530 3.368421 * 23) AWL>=4.229472 13 0.9230769 3.923077 * 3) Type>=130.5 133 33.2330800 4.225564 6) Token< 398 96 10.9895800 4.010417 12) Token< 272.5 10 2.4000000 3.600000 * 13) Token>=272.5 86 6.7093020 4.058140 * 7) Token>=398 37 6.2702700 4.783784 14) ASL< 13.07619 7 1.4285710 4.285714 * 15) ASL>=13.07619 30 2.7000000 4.900000 * }} ! 結果のグラフ install.packages("rpart.plot", dependencies = T) library(rpart.plot) rpart.plot(jpn.DTmodel) {{ref_image DTmodel.png}} *上から順に、重要な指標と位置づけられる。 +一番重要な指標が Type 131以上あるか、 +次に Token が398 以上あるか +そのうえ、ASL(平均文長)が13以上あれば、評価は 4.9 になる。 *一番下のレベルで、AWL(平均語長)が基準として選ばれている。 *まったく図に表れない指標(各種語彙多様性指標や文の数)はスコアの決定には寄与しないといえる。 *どんな指標を入れるかにより、判断は変わってくるが、逆に、どんな指標を入れようが、重要でない指標は選ばれないし、それほど重要でない指標は下のほうに位置づけられる。常に上のほうに位置づけられる指標は、常に重要であると判断される。 *どんな指標の組み合わせで分析を行うかは、分析の目的しだい。 !!スコアをカテゴリー変数とみなして分析しなおしてみる {{pre > jpn.5c <- jpn.4c > jpn.5c$Score <- as.factor(jpn.5c$Score) > jpn.DTmodel2 <- rpart(Score ~ ., data = jpn.5c) > jpn.DTmodel2 n= 285 node), split, n, loss, yval, (yprob) * denotes terminal node 1) root 285 161 4 (0.007 0.032 0.4 0.44 0.12) 2) Token< 262 124 25 3 (0.016 0.073 0.8 0.11 0) 4) Token< 163.5 11 5 2 (0.18 0.55 0.27 0 0) * 5) Token>=163.5 113 17 3 (0 0.027 0.85 0.12 0) * 3) Token>=262 161 51 4 (0 0 0.099 0.68 0.22) 6) Token< 398 124 22 4 (0 0 0.13 0.82 0.048) 12) Type< 130.5 32 13 4 (0 0 0.41 0.59 0) 24) AWL< 4.229472 19 7 3 (0 0 0.63 0.37 0) * 25) AWL>=4.229472 13 1 4 (0 0 0.077 0.92 0) * 13) Type>=130.5 92 9 4 (0 0 0.033 0.9 0.065) * 7) Token>=398 37 8 5 (0 0 0 0.22 0.78) 14) ASL< 13.07619 7 2 4 (0 0 0 0.71 0.29) * 15) ASL>=13.07619 30 3 5 (0 0 0 0.1 0.9) * > rpart.plot(jpn.DTmodel2) }} {{ref_image DTmodel2.png}} !summary(モデル)で、詳しい結果が表示される !!partykitを使った別のグラフ表示 library(rpart) library(partykit) plot(as.party(jpn.DTmodel2)) {{ref_image as.party.png}} !結果の解釈(Criterionで高得点を取るには) *総語数が160語くらい書けないと評価3はもらえない。 *総語数が260語くらい書けると評価4がもらえる可能性が高くなる。 *総語数が400語以下の場合、語彙力が高ければ4がもらえる可能性が高くなる。 **多様な語彙(語彙タイプ数が130以上)もしくは **単語長の長い(平均単語長5文字以上)「難しい」語彙の使用 *総語数が400語以上で、平均的に長い文(13単語以上)を書くと評価5がもらえる可能性が高い。 !オプション * Nodeの出力をシンプルにする ** plotで、オプションをつける , type="simple" !!complex parameter (cp) によって剪定を行うことができる https://toukeier.hatenablog.com/entry/2018/09/03/080713 !printcp(モデル) !plotcp(モデル) !!rpart.control で詳細設定 {{pre rpart.control(minsplit = 20, minbucket = round(minsplit/3), cp = 0.01, maxcompete = 4, maxsurrogate = 5, usesurrogate = 2, xval = 10, surrogatestyle = 0, maxdepth = 30, ...) }} :minsplit:分岐に必要な最低データポイント数 :minbucket:端末の「葉」に必要な最低データポイント数 :cp:「complexity parameter」 :maxcompete :価値のない分岐を「剪定」する値。(価値がない=説明率が上がらない) :maxsurrogate :対立項「competitor 」の数 :usesurrogate : :xval :交差検証の数 :surrogatestyle : :maxdepth :最大の深さ、30まで