Goodな生活

INTP型コンサルタントが好奇心の受け皿を探す

【R】分位数を決めてデータをカテゴリー化する[quantile][cut]

f:id:good_na_life:20210524102921p:plain

分位数に従ってデータのカテゴリー化(連続値→離散値)する方法。データの情報量を落とす操作なので使う場面は相当限られる(なんらかの理由で表ではなくグラフを作成する場合など?)

[quantile]を使ったデータのカテゴリー化

RのデフォルトデータセットirisのSepal.Length(がく片の長さ)を四分位数で区切ってみる。quantile関数で分位数を決める。

> data(iris)
> qa <- quantile(iris$Sepal.Length,c(0,0.25,0.5,0.75,1.0))
> qa
  0%  25%  50%  75% 100% 
 4.3  5.1  5.8  6.4  7.9 

0%は最小値、100%は最大値。
次にqaと定義した分位数に従ってデータをカテゴリー化する。cut関数を使う。

> iris$Sepal.Length_q <- cut(iris$Sepal.Length,qa,
+                            labels = c("0-25%","25-50%","50-75%","75-100%"))
> summary(iris$Sepal.Length_q)
  0-25%  25-50%  50-75% 75-100%    NA's 
     40      39      35      35       1

4つの区間に含まれるサンプル数が表示される。NAが1となっているのは左側が開区間(左開右閉区間)となっているため。include.lowestオプションを使えばよい。

> iris$Sepal.Length_q <- cut(iris$Sepal.Length,qa,
+               labels = c("0-25%","25-50%","50-75%","75-100%"),
+               include.lowest = TRUE)
> summary(iris$Sepal.Length_q)
  0-25%  25-50%  50-75% 75-100% 
     41      39      35      35

[quantile]を使わずに開・閉区間の違いをみてみる

あらかじめ分位数を決めておくとquantileを使わなくてもよい。

> breaks = c(4.3,5.1,5.8,6.4,7.9)
> br <- cut(iris$Sepal.Length,breaks) 
> summary(br)
(4.3,5.1] (5.1,5.8] (5.8,6.4] (6.4,7.9]      NA's 
       40        39        35        35         1 

最初の区間の左側が開区間になっている。

> br2 <- cut(iris$Sepal.Length,breaks,include.lowest = TRUE)
> summary(br2)
[4.3,5.1] (5.1,5.8] (5.8,6.4] (6.4,7.9] 
       41        39        35        35 

include.lowestオプションを有効にすると閉区間となるため、NAも分位数の範囲に含まれる。

参考文献

p.352 第13章「さまざまなグラフ」