Rの基本操作

1ページ 2ページ 3ページ

記述統計:データの特徴を確認する

データの中心やばらつきなどを、数値や図で分かりやすくまとめることを「記述統計」と呼びます。

数値データをまとめて確認する:summary()


summary() を使うと、数値ベクトルの最小値、第1四分位数、中央値、平均値、第3四分位数、最大値をまとめて確認できます。

例えば、歩行練習前の血圧を確認するには、次のように入力します。

R
summary(pre)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  112.0   121.0   130.0   128.7   137.5   142.0 

第1四分位数、中央値、第3四分位数は、データを小さい順に並べたときの、およそ25%、50%、75%の位置にあたる値です。

名義尺度の列だけを取り出して表にする
表 data から、曜日・時間帯・場所の3列を取り出し、meigi という名前で保存します。

R
meigi <- data[ , c("day", "time", "place")]
print(meigi)
     day time place
1 月曜日   AM  屋外
2 火曜日   PM  室内
3 水曜日   AM  室内
4 木曜日   AM  室内
5 金曜日   PM  屋外
6 土曜日   PM  室内

名義変数の場合は、lapply関数を用いて要約しておくと便利である。これにより、それぞれのデータに該当する件数(サイズ)を求めることができる。

R
summary_meigi <- lapply(meigi, table)
print(summary_meigi)

data[行, 列] の形で、取り出す行と列を指定できます。

  • カンマの前を空欄にする:すべての行を取り出します。
  • カンマの後に列名を指定する:指定した列だけを取り出します。
  • c() で列名をまとめる:複数の列を指定できます。

この例では、6日分すべての記録から、day、time、place の3列を取り出しています。

分割表(クロス表):組み合わせごとの件数を数える
分割表は、二つの変数の組み合わせごとに、データの件数をまとめた表です。2種類の値をとる変数だけでなく、3種類以上の値をとる変数にも使えます。ここでは、時間帯(AM・PM)と場所(屋外・室内)の組み合わせが、それぞれ何回あったかを確認します。

R
table_data <- table(data$time, data$place)
print(table_data)
> print(table_data)
    
     屋外 室内
  AM    1    2
  PM    1    2

table() は、組み合わせごとの件数を数える関数です。この例では、行に時間帯、列に場所が表示されます。

R
table_data <- table(data$time, data$place)
View(as.data.frame.matrix(table_data))


分割表を使って検定する:fisher.test()

作成した分割表を使って、「フィッシャーの正確確率検定」を実行できます。二つのカテゴリ変数に関連があるかを調べる方法で、件数が少ない場合にも使われます。

R
fisher.test(table_data)
> fisher.test(table_data)

        Fisher's Exact Test for Count Data

data:  table_data
p-value = 1
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 8.534046e-03 1.171777e+02
sample estimates:
odds ratio 
         1 

実行結果の p-value が「p値」です。

※ 今回は同じ患者さんを6日間測定したデータです。各日の記録が互いに独立しているとは限らないため、ここでは操作の練習として実行します。実際の分析では、データの集め方に合った検定方法を選ぶ必要があります。

層別解析:グループに分けて集計する

データをグループに分けて、それぞれの特徴を調べることを「層別解析」と呼びます。ここでは、午前(AM)と午後(PM)に分けて、歩行練習前後の血圧の平均値と標準偏差を求めます。

グループごとに計算する:tapply()
tapply() には、「計算するデータ」「グループ分けに使う変数」「計算に使う関数」を順に指定します。

R
# AMとPMごとに平均値を計算
pre_means <- tapply(data$pre, data$time, mean)
post_means <- tapply(data$post, data$time, mean)

# AMとPMごとに標準偏差を計算
pre_sds <- tapply(data$pre, data$time, sd)
post_sds <- tapply(data$post, data$time, sd)

# 小数第1位までに丸めて表示
print(round(pre_means, 1))
print(round(post_means, 1))
print(round(pre_sds, 1))
print(round(post_sds, 1))
> print(round(pre_means, 1))
   AM    PM 
118.7 138.7 
> print(round(post_means, 1))
   AM    PM 
134.7 140.7 
> print(round(pre_sds, 1))
 AM  PM 
6.1 3.1 
> print(round(post_sds, 1))
 AM  PM 
4.2 2.1 

例えば、tapply(data$pre, data$time, mean) は、「練習前の血圧を、AMとPMに分けて、それぞれの平均値を求める」という意味です。

mean を sd に変えると、グループごとの標準偏差を求められます。

平均値と標準偏差をまとめて求める

同じ計算を繰り返すときは、自分で関数を作ると便利です。ここでは、平均値と標準偏差を求め、それぞれ小数第1位までに丸める関数を作ります。

R
# 平均値と標準偏差をまとめて求める関数を作成
calculate_stats <- function(x) {
  c(mean = round(mean(x), 1), sd = round(sd(x), 1))
}

# AMとPMごとに、練習前の血圧を集計
pre_stats <- tapply(data$pre, data$time, calculate_stats)

# AMとPMごとに、練習後の血圧を集計
post_stats <- tapply(data$post, data$time, calculate_stats)

# 結果を表示
print("練習前の血圧")
print(pre_stats)
print("練習後の血圧")
print(post_stats)
> print("練習前の血圧")
[1] "練習前の血圧"
> print(pre_stats)
$AM
 mean    sd 
118.7   6.1 

$PM
 mean    sd 
138.7   3.1 

> print("練習後の血圧")
[1] "練習後の血圧"
> print(post_stats)
$AM
 mean    sd 
134.7   4.2 

$PM
 mean    sd 
140.7   2.1 

function(x) は、「データを x として受け取る関数を作る」という意味です。{ } の中に、行いたい計算を書きます。

この関数では、mean(x) で平均値、sd(x) で標準偏差を求め、c() で二つの結果をまとめて返します。結果には、それぞれ mean と sd という名前を付けています。

tapply() にこの関数を指定すると、AMとPMのそれぞれについて、平均値と標準偏差をまとめて求められます。

タイトルとURLをコピーしました