[R]度数分布表を作る方法

サイト移転のお知らせ

移転先はこちらです。
[R]度数分布表を作る方法
新たな記事は移転先に掲載しておりますので、そちらをご確認ください。

スポンサードリンク

簡単に度数分布表を作るための関数を作りました

Rには度数分布表を作成するための関数が用意されていません。

 

しかし、度数分布表を実際に作る方法の通りに毎回同じ作業を行うのはとても面倒なので、データから直接度数分布表を作成できる関数を作りました。

 

freqtab <- function(
		x,					# データのベクタ
		cn=1+log2(length(x)),			# 階級数cnはスタージェスの公式
		wid=FALSE )				# 階級幅を指定する
{
	x <- x[!is.na(x)]					# 欠損値を除く
	min <- min(x)						# データの最小値
	max <- max(x)						# データの最大値
	ran <- max - min					# データが含まれる範囲
	if(!wid){ wid <- round(abs(ran/cn), 3) }		# 階級幅を自動計算
	cla <- floor(x/wid)					# 階級に分ける
	mnc <- min(cla)						# 階級の最小値
	mxc <- max(cla)						# 階級の最大値
	cla <- factor(cla, levels=mnc:mxc)			# 度数0でも数える
	freq <- table(cla)					# 度数を数える
	names(freq) <- paste(mnc:mxc*wid, "-", mnc:mxc*wid+wid)	# 階級名を付け直す
	percent <- freq/sum(freq)*100				# 相対度数
	cum.pcnt <- cumsum(percent)				# 累積相対度数
	return(cbind(freq, percent, cum.pcnt))			# 度数分布表
}

 

読み込むと、例えばxというデータがあったら

freqtab(x)

とするだけで度数分布表を出力してくれるようになります。

 

これを読み込むには、上記の入力コードをコピーして、Rの入力画面でペーストすればOKです。

 

使い方はデータベクタを入力するとスタージェスの公式から自動で階級数と階級幅を計算して暫定的な度数分布表を作成します。

x <- rnorm(50, mean=30, sd=5)
freqtab(x)
                freq percent cum.pcnt
16.09 - 19.308     2       4        4
19.308 - 22.526    3       6       10
22.526 - 25.744    9      18       28
25.744 - 28.962   12      24       52
28.962 - 32.18    10      20       72
32.18 - 35.398     6      12       84
35.398 - 38.616    5      10       94
38.616 - 41.834    3       6      100

 

このままではわかりにくいので、階級の値から読み取って階級幅を設定して再度作成し直します。

 

この場合は階級幅 widを4とします。

freqtab(x, wid=4)
        freq percent cum.pcnt
16 - 20    3       6        6
20 - 24    5      10       16
24 - 28   13      26       42
28 - 32   15      30       72
32 - 36    6      12       84
36 - 40    8      16      100

 

度数分布表を作る上で最も重要なのは階級の設定です。

 

そのため、階級の設定だけはユーザー入力ができるようにしました。

 

逆に、小さい順に並べたりするのはユーザーの操作性を考慮したものなので、Rの関数には必要のないものとなります。

 

新たに作成した freqtab関数を使うことで度数分布表は簡単に作ることができます。

手動で度数分布表を作る方法

まずはデータをRの変数として読み込みます。

 

今回はあくまでやり方なので、正規分布の乱数としてデータを用意してから行います。

 

正規分布の乱数が何なのかわからない方はとりあえず同じように実行してみて下さい。

x <- rnorm(50, mean=30, sd=5)
x

 

データxから度数分布表を作るために、小さい順に並べ替えをしたデータxsを作成します。

xs <- sort(x)
xs
 [1] 16.12573 16.87518 18.98290 20.43412 20.86345 21.18184 21.80025
 [8] 23.62226 23.64775 23.68226 24.91418 25.67506 25.74723 26.07269
[15] 26.14283 26.83260 27.24148 27.91812 27.92150 27.94538 28.40071
[22] 28.42062 28.55614 28.62282 28.96879 29.29494 29.36226 29.60626
[29] 29.69723 30.30294 30.44722 30.80457 31.00066 31.40968 31.49864
[36] 31.83541 32.57012 32.57645 32.82467 33.42864 33.53444 33.76987
[43] 34.34040 34.62027 34.70027 35.01380 35.05974 35.32916 37.18049
[50] 37.37363

 

このデータに関しては16から38の間に全てのデータが収まっていることがわかったので、これをおよそ10個の階級に分けて階級幅を決めます。

 

最大と最小の幅が22なので、階級幅を3とすれば8個の階級、階級幅を2とすれば11個の階級となります。

 

ここでは階級幅を3として8個の階級にしたいと思うので、全てのデータを3で割った整数部分を取り出します。

xsf <- floor(xs/3)
xsf
 [1]  5  5  6  6  6  7  7  7  7  7  8  8  8  8  8  8  9  9  9  9  9  9  9
[24]  9  9  9  9  9  9 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11
[47] 11 11 12 12

 

floor関数は与えられたデータの整数部分のみを取り出す関数です。

 

あとは数えるだけなので table関数を使ってRに数えてもらいます。

 

table関数については最頻値のページに記載があるので、そちらを参考にして下さい。

xsft <- table(xsf)
xsft
xsf
 5  6  7  8  9 10 11 12 
 2  3  5  6 13 10  9  2 

 

これを度数分布表の形に整形していきます。

 

まずは階級をちゃんと設定する必要があります。

 

階級は xsfに階級幅を掛けた値からこれに階級幅を足した値の区間ということになるので、この2つの数値の中央値を求めれば階級値とすることができます。

 

xsfに記憶された数値を階級値に直すには次のようにします。

kaikyuti <- (xsf*3 + (xsf*3 + 3))/2
> kaikyuti
 [1] 16.5 16.5 19.5 19.5 19.5 22.5 22.5 22.5 22.5 22.5 25.5 25.5 25.5 25.5
[15] 25.5 25.5 28.5 28.5 28.5 28.5 28.5 28.5 28.5 28.5 28.5 28.5 28.5 28.5
[29] 28.5 31.5 31.5 31.5 31.5 31.5 31.5 31.5 31.5 31.5 31.5 34.5 34.5 34.5
[43] 34.5 34.5 34.5 34.5 34.5 34.5 37.5 37.5

 

全て整数値でなく小数点以下の数値になっていますが、3ずつ区切っているので中央値をとったときに0.5ずつ端数になってしまっているだけです。

 

冒頭の度数分布表は整数値でしたが、小数点が入ってもなんの問題もありません。

 

これを再度、 table関数を使って数えた結果を保存します。

kt <- table(kaikyuti)
kt
kaikyuti
16.5 19.5 22.5 25.5 28.5 31.5 34.5 37.5 
   2    3    5    6   13   10    9    2 

 

この状態で、もうすでに度数分布表になっていることがわかるでしょうか?

 

これを縦表示にすると冒頭で示した度数分布表と同じようなものが出来上がります。

 

このままでも十分利用できる許容範囲ないですが、後々相対度数や累積相対度数を追加して表示できるようにするためにデータフレームの形で保存します。

 

データフレームに変化するには data.frame関数を使います。

ktdf <- data.frame(kt)
ktdf
  kaikyuti Freq
1     16.5    2
2     19.5    3
3     22.5    5
4     25.5    6
5     28.5   13
6     31.5   10
7     34.5    9
8     37.5    2

 

Freqは頻度、つまり度数を表します。

 

ここまでで度数分布表の作成がほぼ完了しました。

 

これを完全に度数分布表として作成するためには、相対度数と累積相対度数を求めて、表に追加する必要があります。

 

相対度数は1つの階級の度数がデータの全要素数のうちどれくらいの割合を占めているかというもので、累積相対度数はこの相対度数の累積値のことでした。

 

まずは相対度数を求めます。

 

データの全要素数が50とわかっているので、50で度数分布表のそれぞれの階級を割れば求められます。

 

計算の方法は至って簡単なので、Rで実行してみます。

Relative.Freq <- as.numeric(kt)/length(kaikyuti)
Relative.Freq
[1] 0.04 0.06 0.10 0.12 0.26 0.20 0.18 0.04

 

この方法が計算を全て自動化できる一番便利な入力方法です。

 

データの全要素数は元データの長さを測ればいいので length関数を使って入力します。

 

as.numeric関数はテーブル型のデータをベクタの数値型に直す作業を行なっています。

 

これをしないとちゃんとした度数分布表が作れないのでそういうものだと思って下さい。

 

気になる方は as.numeric関数を使わずに行なってみるとこの先どうなるかわかりますのでやってみて下さい。

 

このデータ Relative.Freqを先ほど作ったデータフレーム型の度数分布表に cbind関数を使ってつなげます。

ktdf <- cbind(ktdf, Relative.Freq)
ktdf
  kaikyuti Freq Relative.Freq
1     16.5    2          0.04
2     19.5    3          0.06
3     22.5    5          0.10
4     25.5    6          0.12
5     28.5   13          0.26
6     31.5   10          0.20
7     34.5    9          0.18
8     37.5    2          0.04

 

ほとんど冒頭で示した度数分布表になっているのがわかりますね。

 

cbind関数は一つ一つのベクタを縦方向に並べて、ベクタ同士を横向きにつなげていく関数です。

 

データフレームは縦の列1つが1つのベクタという扱いなので、ここではベクタを3つつなげた状態になったということになります。

 

では次に累積相対度数を求めます。

 

累積相対度数は相対度数の累積値といいました。

 

累積値の計算は言葉だけではピンと来ないので結果から説明します。

 

計算するには cumsum関数を使います。

Cumulative.Rela.Freq <- cumsum(Relative.Freq)
Cumulative.Rela.Freq
[1] 0.04 0.10 0.20 0.32 0.58 0.78 0.96 1.00

 

これを度数分布表に先ほどのように cbind関数でつなげます。

ktdf <- cbind(ktdf, Cumulative.Rela.Freq)
> ktdf
  kaikyuti Freq Relative.Freq Cumulative.Rela.Freq
1     16.5    2          0.04                 0.04
2     19.5    3          0.06                 0.10
3     22.5    5          0.10                 0.20
4     25.5    6          0.12                 0.32
5     28.5   13          0.26                 0.58
6     31.5   10          0.20                 0.78
7     34.5    9          0.18                 0.96
8     37.5    2          0.04                 1.00

 

これで度数分布表は完成しました。

 

累積相対度数と相対度数の数値を見比べてみて下さい。

 

2番目の累積相対度数は1番目と2番目の相対度数を足した値になっているのがわかりますか?

 

これと同じように3番目は1番目と2番目と3番目の相対度数を足したものになっています。

 

つまり、累積相対度数はその階級までのすべての相対度数を足した値ということです。

スポンサードリンク

「[R]度数分布表を作る方法」と同じカテゴリーのページ

[R]無作為抽出をする
無作為抽出とはなにか? Rで無作為抽出をするにはsample関数を使う
[R]統計学的なデータの種類の扱い
Rで統計的(数学的)なデータの種類をどのように扱うかという話。
[R]ヒストグラムを描くhist関数
Rでは標準でヒストグラムを描くためのhist関数が用意されている。 ヒストグラムの書き方とヒストグラムを描くときの注意点について。
[R]代表値を求める
Rで代表値を求めるための方法。 平均値はmean、中央値はmedian、最頻値はtableを使って求めることができます。 基本的な使い方と補足説明を入れてあります。
[R]散布度を求める
散布度をRで求める方法。 散布度にはいろいろな基準があるが、Rはほとんどすべてを網羅している。
[R]箱ひげ図を描く
Rではboxplot関数を使って、箱ひげ図を直接綺麗に描くことができる。 Rで箱ひげ図を描くための方法を説明する。
[R]正規分布に従う2次元データの作り方
Rで擬似データとして、正規分布に従う2次元データを作成する方法