jnobuyukiのブログ

JavaScriptとR言語を中心に研究活動に役立つwebアプリケーション技術について考えていきます。twitter ID: @j_nobuyuki

R言語における最頻値の求め方

ある数値データの集団の代表性を示す方法には、(加算)平均、中央値、最頻値の3つがあります。
今回は最頻値の求め方を紹介します。

平均、中央値、最頻値

3つの代表値の違いをまとめておきます。

  • 平均: すべてのデータの数値を加えた合計をデータの数で割ったもの。
  • 中央値: データを大きい順、または小さい順に並べて数えたときの中央に来る値。データ数が偶数の場合には、もっとも中央にある二つの値の平均を取る。
  • 最頻値: データの各値の出現頻度を調べて、もっとも頻度の高い値。

R言語における平均と中央値

R言語では、平均を求めるための関数mean()がbaseパッケージにあります。また、中央値を求める関数median()はstatsパッケージに含まれています。なので、これを使えばいいでしょう。

#数値データの定義
dat <- c(1,2,3,4,5,6,7,8,9)

#平均
mean(dat)

#中央値
median(dat)

しかし、最頻値は元から使える関数がありません。少し工夫をすることで、最頻値を求める方法を2つ紹介します。

最頻値の求め方その1

データのそれぞれの値の頻度を求めるにはtable()関数を用います。

#データの定義
oridata <- c(1,3,2,5,2,5,3,4,4,3,3,3,3,2,4)

#頻度を数える
table(oridata)

#出力
1 2 3 4 5
1 3 6 3 2

頻度が分かったら、頻度が最大のものをwhich.max()関数で求めます。which.max()は、最頻値とそれが頻度表の何番目にあるのかを出力します。なので、最頻値だけが知りたい場合にはnames()関数で最頻値だけを取り出します。

#最頻値
names(which.max(table(oridata)))

最頻値の求め方その2

もう一つ方法があります*1。こちらは頻度表を頻度に基づいて並べ替えをするところがポイントです。

#データの定義
oridata <- c(1,3,2,5,2,5,3,4,4,3,3,3,3,2,4)

#頻度を数える
table(oridata)

#頻度に基づいて表を並べ替える。頻度の高い順にするため並べ替えを逆転させる。
rev(sort(table(oridata)))

#最頻値はこの並べ替えた表の最初の値
rev(sort(table(oridata)))[1]

#最頻値の値のみ
names(rev(sort(table(oridata))))[1]

*1:この方法は、豊田秀樹(編著)『共分散構造分析R編』のp.8に紹介されていました