統計分析のRでの実現ガイド

Rを用いた統計分析では、記述統計量の計算、クロス集計、各種検定、グラフ描画などを行うことができる。baseパッケージによる基本的な統計処理から、momentsパッケージによる分布解析まで、多様な分析手法が提供されている。データフレーム構造を基盤とし、データ処理と結果の可視化が可能である。

【目次】

  1. 記述統計量
  2. 統計処理の比較
  3. Rプログラム例
  4. 用語説明

記述統計量

記述統計量は、データセットの特徴を数値的に要約する統計指標である。データ全体の特性を把握し、適切な分析手法の選択を支援する。

基本的な統計量として以下が挙げられる。

統計処理の比較

以下の表は、SPSS、Python、Rにおける主要な統計処理の対応関係を示す。

処理内容 SPSS Python (pandas/scipy) R
記述統計量 FREQUENCIES df.describe()stats.skew()stats.kurtosis() summarysdskewnesskurtosis
頻度表 FREQUENCIES value_counts() table
クロス集計表 CROSSTABS pd.crosstab() table
集約 AGGREGATE groupby().agg() aggregate
Welchのt検定 T-TEST stats.ttest_ind(equal_var=False) t.test
一元配置分散分析 ONEWAY stats.f_oneway() oneway.test
Wilcoxon検定 NPAR TESTS /M-W= stats.mannwhitneyu() wilcox.test

Rプログラム例

以下のデータセットを使用する。

科目 受講者 得点
国語 A 90
国語 B 80
算数 A 95
算数 B 90
理科 A 80

データフレームの作成

ベクトルでデータを定義し、data.frame関数でデータフレームに変換する。

# データの作成
科目 <- c('国語', '国語', '算数', '算数', '理科')
受講者 <- c('A', 'B', 'A', 'B', 'A')
得点 <- c(90, 80, 95, 90, 80)

# データフレームの作成
df <- data.frame(科目 = 科目, 受講者 = 受講者, 得点 = 得点)
print(df)

個別の統計量計算

baseパッケージの関数を使用して、基本統計量を個別に算出する。必要な統計量のみを選択的に計算できる。

scores <- df$得点

print(paste("平均値:", mean(scores)))
print(paste("標準偏差:", sd(scores)))
print(paste("中央値:", median(scores)))
print(paste("最大値:", max(scores)))
print(paste("最小値:", min(scores)))
print(paste("第1四分位数:", quantile(scores, 0.25)))
print(paste("第3四分位数:", quantile(scores, 0.75)))

summary関数とaggregate関数による集計

summary関数は複数の統計量を一括で算出する。データの概要把握に有用である。aggregate関数を用いると、カテゴリ別の集計が可能である。

# 総合的な統計量
print(summary(df$得点))

# 科目別の統計量
print(aggregate(得点 ~ 科目, data = df, FUN = summary))

グラフによる可視化

baseパッケージのグラフィック機能でデータの分布を可視化する。箱ひげ図は分布の概要を、ヒストグラムは頻度分布を表示する。png関数で画像ファイルへの出力を開始し、dev.off関数で出力を終了する。

# 日本語フォントの設定(macOSの場合)
par(family = "HiraKakuProN-W3")

# 箱ひげ図
png("score_distribution.png", width = 800, height = 600)
boxplot(得点 ~ 科目, data = df, main = "科目別得点分布", ylab = "得点")
dev.off()

# ヒストグラム
png("score_histogram.png", width = 800, height = 600)
hist(df$得点, breaks = 5, main = "得点分布", xlab = "得点", ylab = "頻度")
dev.off()

歪度と尖度

momentsパッケージを使用して、分布の形状特性を計算する。歪度が0に近いほど左右対称、尖度が3に近いほど正規分布に近い形状を示す。

library(moments)

# 乱数シードの設定(結果の再現性を確保)
set.seed(42)
# 正規分布に従う乱数を10000個生成
normal_data <- rnorm(10000)

print(paste("歪度:", round(skewness(normal_data), 3)))
print(paste("尖度:", round(kurtosis(normal_data), 3)))

クロス集計表

table関数で2変数間の関係を集計する。カテゴリ変数間の関連性確認に使用する。

グループ1 <- c('a', 'b', 'c', 'a', 'b')
グループ2 <- c('d', 'd', 'e', 'e', 'e')
df <- data.frame(グループ1 = グループ1, グループ2 = グループ2)

print(table(df$グループ1, df$グループ2))

検定手法の選択

統計的検定では、データの特性に応じて適切な手法を選択する。以下に選択の指針を示す。

正規性の検定

shapiro.test関数でデータの正規性を検定する。p値が有意水準(通常0.05)より大きい場合、正規性を仮定できる。検定結果に基づき、パラメトリック検定またはノンパラメトリック検定を選択する。

# 乱数シードの設定(結果の再現性を確保)
set.seed(42)
data <- rnorm(100)

result <- shapiro.test(data)
print(paste("検定統計量:", round(result$statistic, 3)))
print(paste("p値:", round(result$p.value, 3)))

Welchのt検定

t.test関数で2群間の平均値の差を検定する。Welchのt検定は等分散を仮定しないため、2群の分散が異なる場合に適している。Rのt.test関数は既定でWelchのt検定を実行する。

# 乱数シードの設定(結果の再現性を確保)
set.seed(42)
group1 <- rnorm(100)
group2 <- rnorm(100, 0.5)

test_result <- t.test(group1, group2)
print(paste("t値:", round(test_result$statistic, 3)))
print(paste("p値:", round(test_result$p.value, 3)))

一元配置分散分析

oneway.test関数で3群以上の平均値の差を検定する。有意差が認められた場合、事後検定(多重比較)でどの群間に差があるかを特定する。

group_a <- c(3.42, 3.84, 3.96, 3.76)
group_b <- c(3.17, 3.63, 3.47, 3.44, 3.39)
group_c <- c(3.64, 3.72, 3.91)

data <- data.frame(
  値 = c(group_a, group_b, group_c),
  グループ = factor(c(rep("A", 4), rep("B", 5), rep("C", 3)))
)

result <- oneway.test(値 ~ グループ, data = data)
print(paste("F値:", round(result$statistic, 3)))
print(paste("p値:", round(result$p.value, 3)))

用語説明