【初心者向け】対応のある?対応のない?ノンパラ?R studioで2つの数値を比較する方法

  • URLをコピーしました!

こんにちは。ほしのはやしです。
統計って聞くだけでアレルギーが出て、本や画面をそっ閉じ…ありますよね。

細かいことが気になり始めると手につかなかったりするので、まずはパターン事に理解するのが大事です。

このページでは、対応のあるなし、正規分布かどうかに基づいて2つの数値を比較する場合の統計手法を一気に解説します!

R studioでの使用を想定して、簡単なスクリプトも紹介します。
R studioのインストール方法は下記を参考にしてください!

目次

対応のあるデータとは?

対応のあるデータとは、同じ対象について異なる条件下で測定されたデータのことです。
文字通り、データ同士にペアの関係がある(対応している)ということです。

例1:ダイエットの効果測定

  • 対象: ある会社の社員
  • 測定項目: 体重
  • 異なる条件: ダイエット前、ダイエット後

この場合、ダイエット前後の体重を比較することで、ダイエットの効果を評価することができます。
ダイエット前とダイエット後は、同じ人が測定対象なので、対応のあるデータとなります。

例2:新薬の効果測定

  • 対象: 心筋梗塞の患者
  • 測定項目: 血圧
  • 異なる条件: 新薬服用前、新薬服用後

新薬服用前後の血圧を比較することで、新薬の効果を評価することができます。
この場合も、同じ患者が測定対象なので、対応のあるデータとなります。

例3:学習方法の効果測定

  • 対象: ある特定の学生
  • 測定項目: テストの点数
  • 異なる条件: 従来の学習法、新しい学習法

同じ学生が異なる学習法でテストを受けた場合、それぞれのテストの点数を比較することで、学習方法の効果を評価することができます。

このようなケース以外の場合を「対応がない」として、2つの数値を比較することになります!

正規分布、非正規分布とは?

正規分布は、自然界や社会現象において最もよく見られる確率分布の一つです。
「釣鐘型分布」とも呼ばれ、データの多くが平均値の近くに集まり、両側に裾野が広がるような形をしています。

一方で、正規分布以外の確率分布を総称して、非正規分布といいます。
正規分布と異なり、データの分布が左右対称でない、裾野が極端に長いなど、様々なパターンがあります。

非正規分布の場合は、以下の図のようにどちらかに偏っていたり、バラバラの分布だったりします。

星柴くん

対応のある・なし、正規分布についてイメージがついたのだ!

黒星柴くん

まずはここを抑えないとどの統計使ったらよいかわからんでな

2つ数値を比較(対応のないt検定:正規分布:パラメトリック)

まずはオーソドックスな、対応のない・正規分布のケースについてご説明します!

3年B組(それぞれ15人ずつ)の男子と女子の身長が統計的に差があるか調べたい!
こんなときに使うパターンです。

他には、血圧の薬を飲んでる人と飲んでない人で血圧に差があるか、などに使えます。

R studioのコードの例

【男子と女子の身長の統計差を調べたい】

テーブル名:datasheet1

HightSex
155Male
160Male
140Female
145Female
158Male

t.test(Hight~Sex, data = datasheet1, var.equal = FALSE)

【構文の形】

t.test(数値の列名~グループの列名, data = 読み込んだテーブルの名前, var.equal = FALSE)

という構文が基本になります。
ここでは「Hight」=「身長」, 「Sex」=「性別」としています。

var.equal = FALSEというのは、2つのグループの分散が等しいかわからないことを前提にしているということを示しています。(Welchのt検定
一方、分散が等しい場合はStudentのt検定(var.equal = TRUE)を用います。

分散とは、データが平均値からどれだけ散らばっているかを表す指標です。
分散が大きいほど、データは平均値から大きく離れた値を含んでいると言えます。

分散を調べる場合は「F検定」で評価しますが、N数が10以下など少ない実験系の場合は分散が等しいかわからないことを前提に統計するので問題ありません

2つの数値を比較(対応のあるt検定:正規分布:パラメトリック)

3年B組30人のテストの点の平均点が、キンパツ先生が来る前と後で違うか調べたい!
こんなときに使います。

同じ人や物で、数値が変化した前後を調べたいときに使う統計手法です。

R studioのコードの例

【コードの例:キンパツ先生の来る前後でクラスのテストの点の統計差を調べたい】

テーブル名:datasheet2

Test1Test2
7080
6570
8075
5090
7570

t.test(Test1, Test2, data = datasheet2, paired = TRUE)

【構文の形】

t.test(数値の列名1, 数値の列名2, data = 読み込んだテーブルの名前, paired = TRUE)

このpaired = TRUEで対応のあることを示しているわけですね!

もし表のパターンが以下のようなときは、別のコードで統計することができます!

テーブル名:datasheet3

NoScoreKinpatsu
170before
180after
265before
270after
380before
375after

t.test(Score~Kinpatsu, data = datasheet3, paired = TRUE)

【構文の形】

t.test(数値の列名1~タイミングの列名2, data = 読み込んだテーブルの名前, paired = TRUE)

通常はdatasheet2のようなパターンでエクセルファイルを作るのをオススメします。

さて、ここまで正規分布するパターンを前提に解説しました。
これらの統計手法をパラメトリック法といいます。
正規分布しない場合についての統計手法(ノンパラメトリック法)、次の項目で引き続き解説します。

正規分布かどうかは、過去の論文での扱われ方を調べたり、Shapiro-Wilk testというのを用いたりすることで、確認することができます。正規分布かわからなければノンパラメトリックにしておくと良いでしょう。

2つの数値を比較(対応のない:非正規分布:ノンパラメトリック検定:Wilcoxonの順位和検定)

正規分布しない(またはわからない)場合は、Wilcoxonの順位和検定を使用するのが最も簡単です。
先程の「datasheet1」の場合を想定してコードを示します。

テーブル名:datasheet1

HightSex
155Male
160Male
140Female
145Female
158Male

wilcox.test(Hight~Sex, data = datasheet1)

【構文の形】

wilcox.test(数値の列名~グループの列名, data = 読み込んだテーブルの名前)

マンホイットニーのU検定というのもありますが、実質Wilcoxonの順位和検定と同じ結果になるので、専門家以外は気にしなくていいでしょう

2つの数値を比較(対応のある:非正規分布:ノンパラメトリック検定:Wilcoxonの符号付き順位検定)

正規分布しないバージョンの「対応のあるt検定」が、Wilcoxonの符号付き順位検定です。
先程の「datasheet2」の場合を想定してコードを示します。

テーブル名:datasheet2

Test1Test2
7080
6570
8075
5090
7570

wilcox.test(Test1, Test2, data = datasheet2, paired = TRUE)

t.test(Test1, Test2, data = datasheet2, paired = TRUE)

これで数値比較の基本パターンは終了です!

Wilcoxon検定は少ない方の集団数が6未満のときは不適切で、その場合はt検定を使うことが示唆されています。

棒グラフとドットプロットを重ねてグラフを描く方法

練習用のデータをR studioを使って作成

group <- c(rep(“A”, 10), rep(“B”, 10))
value <- c(rnorm(10, mean = 10, sd = 2), rnorm(10, mean = 12, sd = 3))
data <- data.frame(group, value)

groupという列にAが10個、Bが10個。
valueという列にランダムに平均10, 標準偏差2となるように10個数値を作成し、続いて平均12, 標準偏差3となるように10個数値を作成しています。

データシート名:data

groupvalue
A9.790517
A5.379381
A9.374840
B7.708036
B12.356714

平均値と標準偏差を計算

library(tidyverse)

data_summary <- data %>%
group_by(group) %>%
summarise(
mean_value = mean(value),
sd_value = sd(value)
)

data_summaryという新しいテーブルに、グループ毎での平均値と標準偏差を出しています。

【基本コードの意味】
A <- B:Bの結果をAに代入する
A %>% B:Aの中でBを行う
group_by(列名):列名でグループ分けをする
summarise(計算式):計算式に基づいてサマリーを作成する
mean_value = mean(列名):列名の平均値を「mean_value」に代入する
sd_value = sd(列名):列名の標準偏差を「sd_value」に代入する

※中央値にしたい場合は、meanをmedianにする
※標準誤差にしたい場合は、sdをsemにする

グラフの作成

ggplot(data_summary, aes(x = group, y = mean_value)) +
geom_bar(stat = “identity”, fill = “gray”, colour = “black”) + # 棒グラフ
geom_errorbar(aes(ymin = mean_value – sd_value, ymax = mean_value + sd_value), width = 0.3) + # 誤差棒
geom_point(data = data, aes(x = group, y = value), size = 4, colour = “black”, fill = “black”, position = position_jitter(width = 0.2)) + # 黒いドット
geom_hline(yintercept = 0, color = “black”, size = 1) + # 0のラインを描画
labs(x = “グループ”, y = “値”, title = “2群の比較”) +
theme(
axis.line.x = element_blank(), # X軸の線を消す
axis.line.y = element_line(color = “black”, linewidth = 1), # Y軸の線を維持
axis.text = element_text(color = “black”, size = 18, face = “bold”), # 軸ラベルのスタイル
axis.title = element_text(size = 24), # 軸タイトルのスタイル
panel.background = element_blank(), # 背景を透明に
axis.ticks.length = unit(-2, “mm”), # 軸目盛りの長さ
axis.ticks = element_line(color = “black”, size = 1), # 軸目盛り線のスタイル
legend.position = “none” # 凡例を非表示
)

まとめ

2つの数値を統計的に比較する場合の基本4パターンについて解説しました。
少しでも統計について慣れていただけると幸いです!

正規分布対応のない対応のある
するt検定対応のあるt検定
しない(わからない)Wilcoxonの順位和検定Wilcoxonの符号付き順位検定
  • URLをコピーしました!

この記事を書いた人

柴犬をこよなく愛する読書家。
街歩きとお菓子作りを趣味にしています。
研究や論文に役立つ情報をわかりやすくお伝えします。

コメント

コメントする

目次