連続値データの離散化(R Advent Calendar 2013)

これは,R Advent Calendar 2013の8日目の記事です.

2013年を振り返ってみると,Tokyo.Rの"シリーズ前処理"をたったの2回で途絶えさせてしまったことは大いに反省すべき点の一つです(^^;

そんなわけで,残り少なくなった2013年,シリーズ前処理の続きを書いてみたいと思います.

今回のテーマは「連続値データの離散化」です.データ分析を行っていると,連続値のデータを離散化して,いくつかのグループに分けたい場面がしばしば発生します.例えば,健康診断の項目に対して「高・中・低」の3段階に分けたい場合などです.

高次元のデータに対する離散化の手法もいくつか提案されていますが,ここでは1次元のデータの離散化についてのみ扱います.

離散化手法の分類

離散化手法として,非常に多くのものが提唱されています.ここでは,離散化手法を次の2つの観点

から分類してみましょう*1

最初の観点については,離散化するときにデータ全体を1つの区間として逐次分割していくのがトップダウンアプローチ,細かい区間を作成して併合していくのがボトムアップアプローチです.

また,2番目の観点は,区間を併合したり分割するときに教師データが必要かどうかというものです.

これらの2つの観点から,離散化の代表的な手法を下表のように整理できます.

教師データなし 教師データあり
トップダウン 等間隔区間による離散化(EWD),等頻度区間による離散化(EFD) CAIM, CACC, Ameva, 最小記述長原理による離散化(MDLP)
ボトムアップ k-means(?) カイマージ, カイ2

以下,各手法の概要とRでの実行方法について説明します.

等間隔区間による離散化(Equal Width Discretization, EWD)

等間隔区間は,各数値属性を単純に等間隔な区間に分割する手法です.

Rでは,infotheoパッケージのdiscretize関数を用いて実行できます.

> install.packages("infotheo")
> library(infotheo)
> # 米国の犯罪のデータセット(USArrests)
> data(USArrests)
> head(USArrests)
           Murder Assault UrbanPop Rape
Alabama      13.2     236       58 21.2
Alaska       10.0     263       48 44.5
Arizona       8.1     294       80 31.0
Arkansas      8.8     190       50 19.5
California    9.0     276       91 40.6
Colorado      7.9     204       78 38.7
> # 各属性の等間隔区間への離散化(区間数を指定する引数nbinsは,デフォルトではデータのレコード数の平方根)
> ew.data <- discretize(USArrests, disc="equalwidth")
> # 各データの各属性の区間(番号)の確認(各属性に対して7つの区間)
> head(ew.data)
  Murder Assault UrbanPop Rape
1      6       5        4    3
2      4       6        2    7
3      4       6        6    5
4      4       4        3    3
5      4       6        7    7
6      3       4        6    6
> # 各属性に対して各区間に属するサンプル数の集計
> apply(ew.data, 2, table)
  Murder Assault UrbanPop Rape
1      8      10        2   10
2      9      10        6   12
3     11       7        7   11
4      7       7        7    9
5      6       5       13    3
6      5       8        8    2
7      4       3        7    3

等頻度区間(Equal Frequency Discretization, EFD)

等頻度区間は,各区間がほぼ同数のデータを含むように境界値を決定する手法です.EWDと同様に,discretize関数を用いて実行できます.

> # 各属性の等頻度区間への離散化(区間数を指定する引数nbinsは,デフォルトではデータのレコード数の平方根)
> ef.data <- discretize(USArrests, disc="equalfreq")
> # 各データの各属性の区間(番号)の確認(各属性に対して7つの区間)
> head(ef.data)
  Murder Assault UrbanPop Rape
1      7       5        3    5
2      5       7        1    7
3      5       7        6    7
4      5       5        2    4
5      5       7        7    7
6      4       5        6    7
> # 各属性に対して各区間に属するサンプル数の集計
> apply(ef.data, 2, table)
  Murder Assault UrbanPop Rape
1      8       8        8    8
2      6       6        6    6
3      7       7        7    7
4      7       7        7    7
5      7       7        7    7
6      7       7        7    7
7      8       8        8    8

カイマージ(Chi-merge)

カイマージは,データが属するクラスの情報を用いて,ボトムアップにデータを分割する区間を決定する離散化手法です.まずデータをいくつかの区間に分けた後に隣り合う区間のクラスの分布に対してχ2乗検定を用いて区間の結合の判断をしながら併合していきます.

このように書くと非常に難しく感じますが,カイマージのアイディアは非常に簡単です.例として,Sepal.Lengthを取り上げて説明しましょう.

Sepal.Lengthの値ごとに,各クラスのサンプル数を集計すると次のようになります.

> # Sepal.Lengthの値と各クラスのサンプル数のクロス集計表
> tbl.sl.sp <- table(iris[, c("Sepal.Length", "Species")])
> head(tbl.sl.sp, 20)
            Species
Sepal.Length setosa versicolor virginica
         4.3      1          0         0
         4.4      3          0         0
         4.5      1          0         0
         4.6      4          0         0
         4.7      2          0         0
         4.8      5          0         0
         4.9      4          1         1
         5        8          2         0
         5.1      8          1         0
         5.2      3          1         0
         5.3      1          0         0
         5.4      5          1         0
         5.5      2          5         0
         5.6      0          5         1
         5.7      2          5         1
         5.8      1          3         3
         5.9      0          2         1
         6        0          4         2
         6.1      0          4         2
         6.2      0          2         2

カイマージでは,これらの区間(例えば,値が4.3は区間としては[4.25, 4.35)と考える)に対して,隣り合う区間の間でχ二乗検定を行い,クラスの分布に有意な差がないと判断されればそれらの区間を併合します.

例えば,次のように2つの区間 [5.65, 5.75) と [5.75, 5.85) を取り上げ,χ二乗検定を行ってみましょう.

> tbl.sl.sp[c("5.7", "5.8"), ]
            Species
Sepal.Length setosa versicolor virginica
         5.7      2          5         1
         5.8      1          3         3
> chisq.test(tbl.sl.sp[c("5.7", "5.8"), ])

        Pearson's Chi-squared test

data:  tbl.sl.sp[c("5.7", "5.8"), ]
X-squared = 1.7746, df = 2, p-value = 0.4118

 警告メッセージ: 
In chisq.test(tbl.sl.sp[c("5.7", "5.8"), ]) :
   カイ自乗近似は不正確かもしれません

χ二乗検定の結果,p-値が0.05を超えているのでこの2つの区間に関係はないと判断されます.

このように全ての隣り合う区間に対してχ二乗検定を行い,最も関係がないと判断された2つの区間を併合します.そして,その後も同じ処理を繰り返していきます.

カイマージは,RではdiscretizationパッケージのchiM関数を用いて実行できます.

> library(discretization)
> # カイマージの実行(alphaは有意水準,データが属するクラスは最終列に指定すること)
> chiM.iris <- chiM(iris, alpha=0.05)
> # 区分点の確認
> chiM.iris$cutp
[[1]]
[1] 5.45 5.75 7.05

[[2]]
[1] 2.95 3.35

[[3]]
[1] 2.45 4.75 5.15

[[4]]
[1] 0.80 1.75

CAIM, CACC, Ameva

CAIM, CACC, Amevaは,教師ありトップダウンアプローチの代表的なアルゴリズムです.

Rでは,discretizationパッケージのdisc.Topdown関数を用いて実行できます.

> # トップダウンアルゴリズムの実行(method引数 1:CAIM 2:CACC 3:Ameva)
> cm <- disc.Topdown(iris, method=1)
> # 区分点の確認
> cm$cutp
[[1]]
[1] 4.30 5.55 6.25 7.90

[[2]]
[1] 2.00 2.95 3.05 4.40

[[3]]
[1] 1.00 2.45 4.75 6.90

[[4]]
[1] 0.10 0.80 1.75 2.50

> # 各データの区分の確認
> head(cm$Disc.data)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1            1           3            1           1  setosa
2            1           2            1           1  setosa
3            1           3            1           1  setosa
4            1           3            1           1  setosa
5            1           3            1           1  setosa
6            1           3            1           1  setosa

最小記述長原理を用いた離散化(Minimum Description Length Principle, MDLP)

Rではdiscretizationパッケージのmdlp関数を用いて実行できます.

> mdlp.iris <- mdlp(iris)
> # 区分点の確認
> mdlp.iris$cutp
[[1]]
[1] 5.55 6.15

[[2]]
[1] 2.95 3.35

[[3]]
[1] 2.45 4.75

[[4]]
[1] 0.80 1.75
> # 各属性の区分の確認
> head(mdlp.iris$Disc.data)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1            1           3            1           1  setosa
2            1           2            1           1  setosa
3            1           2            1           1  setosa
4            1           2            1           1  setosa
5            1           3            1           1  setosa
6            1           3            1           1  setosa


2013年も残り3週間半となりました.今年もRを通して多くの方々に出会い,多くのことを学ばせていただきました.2014年も良い年でありますように!

参考文献

データマイニングの基礎 (IT Text)

データマイニングの基礎 (IT Text)

Data Mining: Concepts and Techniques (The Morgan Kaufmann Series in Data Management Systems) (English Edition)

Data Mining: Concepts and Techniques (The Morgan Kaufmann Series in Data Management Systems) (English Edition)

*1:この方法以外にも,手法の分類方法として様々なものがあるようです.