度数分布表とヒストグラム

Published

September 9, 2024

準備

プロジェクトの設定

使用するライブラリ: ggplot2

library(ggplot2)
# 日本語フォントを使用
theme_set( theme_bw(base_family = "HiraKakuProN-W3")) 

データの準備

# 男性の身長データ
set.seed(123)

# 男性の身長データ(平均172cm、標準偏差7cm)
male_height <- rnorm(50, mean = 172, sd = 7)

# データフレームに変換
df <- data.frame(PersonID = 1:50, Height = round(male_height, 1))

男性の身長を意識して適当なデータを作成しました.

> print(df)
   PersonID Height
1         1  168.1
2         2  170.4
3         3  182.9
.         .    .
.         .    .
.         .    .

度数分布

データをいくつかの範囲(階級)に分けて,その範囲に属するデータの数(度数)をまとめたもの.データの全体的な傾向を視覚的に把握するのに役立つ.

度数分布表

度数分布表は,各階級に属するデータの数を表した表で,一般的に以下の項目を含む.

  • 階級値

  • 度数

  • 相対度数

  • 累積度数

  • 累積相対度数

階級値 \(x_{n}\)

階級を代表する値であり階級の中央値をとる.

\[ x_{n} = \frac{a_{n-1} + a_{n}}{2} \]

代表的な階級数の求め方は後述する.

度数 \(f_{n}\)

階級に属するデータの個数

相対度数 \(p\)

全体に対し各度数が占める割合

\[ p = \frac{f_{n}}{N} \]

累積度数 \(F_{n}\)

その階級までの度数の総和

\[ F_{n} = f_{1} + f_{2} + ... + f_{n} \]

累積相対度数 \(P\)

全体に対し各累積度数が占める割合

\[ P = \frac{F_{n}}{N} \]

度数分布表の作り方

1. レンジ\(R\)と階級数\(n\)を求める

\[ R = Max - Min \]

\[ n = 1 + \log{N} \]

階級数の計算方法にはいくつかの方法がある.もっとも一般的に使われる方法は「スタージェスの公式」です.

\[ n = 1 + \frac{\log_{10}{N}}{\log_{10}{2}} = 1 + \log{N} \]

他には「鈴木の公式」などがあります.

\[ n = 1.7\sqrt[3]{N} \]

今回は「スタージェスの公式」を使用します.

# 最大値と最小値の取得
(max_value <- max(df$Height))
(min_value <- min(df$Height))

# 範囲の計算
r <- max_value - min_value

# データの個数を取得
n <- length(df$PersonID)

# スタージェスの公式で階級数を計算
k <- ceiling(1 + log2(n))

階級と階級値を決める

# 階級幅の計算
class_width <- ceiling(r / k)

# 階級用の値を作成(最小値から階級幅ごとの数列を生成)
class_vec <- seq(from = min_value, to = max_value + class_width, by = class_width)

# 階級値の計算(right=FALSEだと左側の境界を含み、右側は含まない)
cut_data <- cut(df$Height, breaks = class_vec, right = FALSE, include.lowest = TRUE)

度数を集計し,度数分布表を作成する

# 度数分布表を作成
freq_table <- table(cut_data)
> freq_table
cut_data
[158,163) [163,168) [168,173) [173,178) [178,183) [183,188] 
        2         9        16        12         7         4 

ここで作成した度数分布表は相対度数,累積度数,累積相対度数を含みません. それぞれについて後ほど計算します.

累積度数の計算

cumsum(freq_table)
> cumsum(freq_table)
[158,163) [163,168) [168,173) [173,178) [178,183) [183,188] 
        2        11        27        39        46        50 

相対度数の計算

# 相対度数の計算
relative_freq <- prop.table(freq_table)
> relative_freq
cut_data
[158,163) [163,168) [168,173) [173,178) [178,183) [183,188] 
     0.04      0.18      0.32      0.24      0.14      0.08 

累積相対度数の計算

# 累積相対度数を計算
cum_relative_freq <- cumsum(relative_freq)
> cum_relative_freq
[158,163) [163,168) [168,173) [173,178) [178,183) [183,188] 
     0.04      0.22      0.54      0.78      0.92      1.00 

ヒストグラム

# ヒストグラム
ggplot(df, mapping = aes(x = Height)) +
  geom_histogram(bins = 14) +
  labs(x = "身長", y = "度数", title = "ヒストグラム")

累積相対度数折線グラフ

# 累積相対度数折線
ggplot(cum_freq_df, aes(x = class, y = cum_relative_freq, group = 1)) +
  geom_line() +
  geom_point() +
  labs(x = "身長", y = "累積相対度数", 
       title = "累積相対度数折線グラフ")