読者です 読者をやめる 読者になる 読者になる

カイマージによる連続データの離散化

 カイマージは、カイ二乗検定を用いて、連続データを離散化するための手法です。*1 具体的には、「属性の離散化方法とクラスの確率は独立である」という帰無仮説に基づき、その仮説が棄却される場合は隣接する区間を統合し、棄却されない場合は統合しないという手続きを繰り返します。
 Rでカイマージを行うには、discretizationパッケージのchiM関数を用います。以下の例では、irisデータに対して、有意水準を0.05とするカイマージを行っています。

# パッケージの読み込み
library(discretization)
# カイマージ
cm <- chiM(iris, alpha = 0.05)
# 分割点の確認
cm$cutp
# 離散化したデータの確認
head(cm$Disc.data)

 上記のスクリプトを実行すると、以下のような結果が得られます。この結果を見ると、例えば、Sepal.Lengthの分割点が5.45、5.75、7.05であることが分かります。

# 分割点
[[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

# 離散化したデータ
  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

 また、discretizationパッケージを使えば、カイマージ以外にも、様々な離散化手法を実行することができます。*2

# 情報エントロピー (CAIM) による離散化
caim <- disc.Topdown(iris, method = 1)
# 分割点の確認
caim$cutp
# 離散化したデータの確認
head(caim$Disc.data)

# 最小記述長原理による離散化
mdlp <- mdlp(iris)
# 分割点の確認
mdlp$cutp
# 離散化したデータの確認
head(mdlp$Disc.data)

 上記のスクリプトを実行すると、以下のような結果が得られます。

# 分割点(情報エントロピー)
[[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

# 離散化したデータ(情報エントロピー)
  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

# 分割点(最小記述長原理)
[[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

# 離散化したデータ(最小記述長原理)
  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

 そして、infotheoパッケージを使うと、等間隔区間や等頻度区間によるシンプルな離散化を行うこともできます。

# パッケージの読み込み
library(infotheo)
# 等間隔区間による離散化
ew <- discretize(iris[, -5], disc = "equalwidth")
# 離散化したデータの確認(等間隔区間)
head(ew)

# 等頻度区間による離散化
ef <- discretize(iris[, -5], disc = "equalfreq")
# 離散化したデータの確認(等頻度区間)
head(ef)

 上記のスクリプトを実行すると、以下のような結果が得られます。

# 離散化したデータ(等間隔区間)
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1            2           4            1           1
2            1           3            1           1
3            1           3            1           1
4            1           3            1           1
5            1           4            1           1
6            2           4            1           1

# 離散化したデータ(等頻度区間)
> head(ef)
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1            2           5            1           1
2            1           2            1           1
3            1           4            1           1
4            1           3            1           1
5            1           5            1           1
6            2           5            2           2