多変量解析_04_予備的な分析と信頼性・妥当性

2K Views

July 25, 23

スライド概要

神戸大学経営学研究科で2022年度より担当している「統計的方法論特殊研究(多変量解析)」の講義資料「04_予備的な分析と信頼性・妥当性」です。
2025/2/5: 全体的に内容に手を入れました。RmarkdownからQuartoに変更しました。

profile-image

神戸大学経営学研究科准教授 分寺杏介(ぶんじ・きょうすけ)です。 主に心理学的な測定・教育測定に関する研究を行っています。 講義資料や学会発表のスライドを公開していきます。 ※スライドに誤りを見つけた方は,炎上させずにこっそりお伝えいただけると幸いです。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

4.1 分布の可視化 1 Chapter 4 予備的な分析と信頼性・妥当性 収集したデータを問題なく分析にかけられるかを評価するための方法として,項目分析(I-T 相 関・トレースライン)を紹介しています。また,使用した尺度(項目)に問題がなかったかを判 断するために,信頼性や妥当性の考え方について説明しています。 本資料は,神戸大学経営学研究科で 2022 年度より担当している「統計的方法論特殊研究(多 変量解析) 」の講義資料です。CC BY-NC 4.0 ライセンスの下に提供されています。 作成者連絡先 神戸大学大学院経営学研究科 分寺杏介(ぶんじ・きょうすけ) mail: [email protected] website: https://www2.kobe-u.ac.jp/~bunji/ 前回までで,データを読み込み,転記ミスなどの異常が無いかを確認しました。また,適当回 答や欠測値の処理を行い,ようやく分析ができる「きれいな」データを用意することが出来まし た。今回は本格的な分析に入る前の前段階として,項目や尺度の性質・性能を簡単に確認してい きます。この段階で,明らかに良くない項目は事前に削除しておくことによって,その先の分析 でより安定した結果が得られるようになるはずです。 .rds ファイルを読み込む 1 dat <- readRDS("chapter03.rds") 4.1 分布の可視化 データ内のゴミをある程度取り除けたところで,各変数の分布を見てみましょう。量的変数の 場合,要約統計量だけではなく分布を可視化するのも大事です。心理尺度の場合,合計点だけで なく各項目のレベルで,できるだけ回答が正規分布に近い形でばらついている方が都合が良い事

2.

4.1 分布の可視化 2 が多いです。例えば「毎日睡眠をとっている」や「ここ 1 ヶ月人と会話していない」のように, ほぼすべての人に当てはまりすぎる・全く当てはまらないような項目は,ほぼすべての人が同じ 回答になるため,その項目に対する回答が個人の特性値に対して何の情報も与えない可能性があ ります。分析の前に,このような天井効果や床効果と呼ばれる状態が発生していないかを確認し たり,分布のピークが一つになっているかを確認しておきましょう。また余裕があれば,2 変数 の散布図を書いたりして,項目間の相関関係について想像したりするのも良いでしょう。 なお,ここから先では「とりあえず図を出す」レベルの話だけします。論文に載せるようなき れいなグラフを描きたい場合には色々引数をいじりまくる必要がありますが,それだけで 1 コマ くらいは潰れると思うので…*1 4.1.1 1 変数の棒グラフ リッカート尺度の項目反応など,取る値のパターンがせいぜい数個(離散変数や名義変数)の 場合は,棒グラフが良いでしょう。棒グラフは barplot() と table() を組み合わせることで描 けます。 離散変数の棒グラフ barplot(table(dat$Q1_1)) ​ ​ ​ 0 200 600 1 1 2 3 4 5 6 図 4.1: 1 変数の棒グラフ barplot() は,与えられたベクトルの一つ一つの値を棒の長さで表現する関数です。そのた め,barplot(dat$Q1_1) というように直接データを与えてしまうと,図 4.2 のように左から長 さが 2, 2, 5, 4, 2, …という感じで 2800 本の棒グラフが誕生してしまいます。 *1 本気できれいな図を作りたい場合は,ggplot2 というパッケージがおすすめです。ただ,この授業で紹介する方 法とは設計の基本理念から異なっているので,紹介しているヒマがありません。論文用の図を作りたい時が来た ら個別に質問してください。

3.

4.1 分布の可視化 3 table() を噛ませないとダメ barplot(dat$Q1_1) ​ ​ ​ 0 1 2 3 4 5 6 1 図 4.2: table() を噛ませないと大変なことに 4.1.2 天井効果と床効果 天井効果(床効果)は,回答が一番上(下)の選択肢に偏っている傾向のことです。図 4.1 く らいの多少の効果は気にする必要がないのですが,極端な天井・床効果が生じている項目は除外 したほうが良いとされます。極端な天井・床効果が生じているということは,その項目ではほと んどの人が同じ選択肢を選んでいる,ということです。通常,心理尺度の項目に対しては 図 4.3 の横軸のように,背後に連続量としての潜在特性を仮定し,各人の回答からその潜在特性の強さ を推定します。つまり各回答者 (A,B,C さん) は自分の潜在特性の強さがどの程度かに応じて, 適切な選択肢 (1 から 4) を選択しているはず,と考えます。これに対して,例えば床効果が生じ ている状態は図 4.4 のような状態です。図 4.3 と比較して,各回答者の位置は変わっていないで すが全員が 1 と回答しています。実際に私達が観測できるのは回答結果としての「1」のみなの で,この項目に「1」と回答したことはその回答者の潜在特性を推定する上でなんの情報も持っ ていないということになってしまいます。もちろんごく少数の「極端な人」を識別し「どの程度 極端か」を評価する上では有用な項目なので,項目数の制約がなければ入れておいても良いので すが,項目数をなるべく少なくしたいなら,こういった項目は削除したほうが良さそう,と判断 できます。Section 4.3 では,天井効果・床効果が生じている可能性のある項目に「あたり」をつ ける簡便な方法を紹介します。 また,項目反応理論などの方法では,こういった極端な項目が含まれていると他の項目の特性 の推定にもあまり良くない影響を及ぼしたり,推定自体が不安定になってしまうケースがありま す。そういった観点からも,極端な天井効果や床効果が見られる項目は除外したほうが良いの です。

4.

4.1 分布の可視化 4 図 4.3: ふつうの項目の背後に 図 4.4: 床効果が生じている項目の背後に 4.1.3 1 変数のヒストグラム 年齢など,連続変数の場合は棒グラフよりもヒストグラムのほうが良いでしょう。ヒストグラ ムは hist() 関数で描くことが出来ます。 ヒストグラムを描く 1 hist(dat$age) ​ ​ ​ ヒストグラムでは,区切り幅が重要な役割を果たします。デフォルトでは,スタージェスの公 式(Sturges, 1926)と呼ばれるものに基づいて区切り幅が決定されています。これは,データの 総数を 𝑛 と置いた場合に,データの値が取る全範囲を 1 + log2 𝑛 個に等分割する方法です。した がって,2432 人分のデータがある dat では 1 + log2 2432 からおよそ 12 個に等分割された結果 が図 4.5 に表れています。基本的にはデータの数にあわせていい感じに調整してくれるので良い のですが,場合によっては「年齢を 10 刻みで区切る」など,区切り幅をきっちり指定したいこ ともあるでしょう。これを実現するためには,hist() の引数 breaks を指定してあげます。

5.

4.1 分布の可視化 5 0 200 400 Frequency 600 Histogram of dat$age 0 20 40 60 80 dat$age 図 4.5: 1 変数のヒストグラム 区切り幅を変える 1 2 3 4 hist(dat$age, breaks = 20) # 左上 ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ hist(dat$age, breaks = c(0, 10, 20, 40, 50, 100)) # 左下 hist(dat$age, breaks = seq(0, 100, by = 10)) # 右上 hist(dat$age, breaks = seq(0, 100, length = 10)) # 右下 ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ hist() の引数 breaks の指定方法は,大きく分けると単一の整数を与える方法と,区切り位 置のベクトルを与える方法の2種類があります。前者の場合は,データの値が取る全範囲をその 個数で等分割してくれます。後者の場合は,等分割以外の区切り方も指定可能( 図 4.6 の左下) ですが,上限と下限がデータの値が取る全範囲を含んでいないとエラーが返ってくるのでご注意 ください。 ちなみに breaks の指定で使用した seq() 関数は,等差数列(ベクトル)を作成してくれる 関数です。 seq(): 等差数列を作る 1 2 3 4 5 # 最初の2つの引数が「どこからどこまで」 # 次に引数byを与えた場合,「いくつ刻み」 seq(0, 100, by = 10) # 次に引数lengthを与えた場合,「長さいくつ」 seq(0, 100, length = 10) 1 2 3 [1] [1] [8] 0 10 20 30 40 50 60 70 80 90 100 0.00000 11.11111 22.22222 33.33333 44.44444 77.77778 88.88889 100.00000 55.55556 66.66667

6.

4.1 分布の可視化 6 breaks = seq(0,100,by=10) 600 400 Frequency 300 0 0 100 200 200 Frequency 400 500 800 600 breaks = 20 40 60 80 0 20 40 60 dat$age dat$age breaks = c(0,10,20,40,50,100) breaks = seq(0,100,length=10) 100 80 100 400 200 Frequency 600 800 80 0 Density 20 0.000 0.005 0.010 0.015 0.020 0.025 0 0 20 40 60 80 100 0 20 dat$age 40 60 dat$age 図 4.6: 区切り幅を変えたヒストグラム INFO スタージェスの公式はどこから来たのか Sturges(1926)の説明によれば,スタージェスの公式は「二項定理の係数の和」をもとに 考えられた値のようです。ここでは,なぜ二項定理が出てくるのかを簡単に説明してみま しょう。 まず,ヒストグラムを作りたい変数が正規分布に従っているとします。このとき,正 規分布は二項分布で近似することが可能です(二項分布の正規近似の逆)。とりあえず 左右対称な二項分布を作るために,成功確率 50% の二項分布 𝐵𝑖𝑛𝑜𝑚(𝑛,̃ 12 ) で近似し てみましょう。例えば 𝑛̃ = 4 とした場合には, 𝑃 (𝑥 = 𝑘|𝑘 = 0, 1, 2, 3, 4) はそれぞれ, 1 4 1 4 𝑛̃ C𝑘 × ( 2 ) = 𝑐(1, 4, 6, 4, 1) × ( 2 ) となり,左右対称な確率分布になります。この 𝑛̃ C𝑘 の 総和が, 「二項定理の係数の和」です。 上の (1, 4, 6, 4, 1) は,もとのデータがきれいな正規分布に従うとき,それを 5 等分した各 区切りの中に含まれるデータの割合が (1, 4, 6, 4, 1) になることを意味しています。つまり, もしデータが 16 個だった場合には,ヒストグラムは左から順に (1, 4, 6, 4, 1) と並ぶだろ う,ということです。言い換えると,データが 16 個だった場合には,データを 5 等分して あげたらいい感じのヒストグラムになりそうだ,と言えるわけです。 ここで一つ重要なポイントがあります。それは,「二項定理の係数」は必ず 𝑛̃ + 1 個にな

7.

4.1 分布の可視化 7 り,その総和が 2𝑛̃ になる,ということです。したがって,データの数が 2𝑛 個のときには, ヒストグラムを 𝑛 + 1 個に区切ってあげたらよいだろう,という感じで提案されたのがス タージェスの公式です(たぶん) 。 ちなみに,スタージェスの公式はヒストグラムの最適な区切り幅を計算するための公式で す。実際のヒストグラムでは,区切り幅は意味のある(または解釈上都合の良い)値とし て,5 や 10 などキリの良い値になることも多いです。そのため,スタージェスは「意味の ある区切り幅のうち,この公式で算出された値を超えない最大の値」にすることを提案し ています。 ただし心理尺度の得点などはそもそも値の単位に絶対的な意味がないため,こうした変数 に対して用いるような場合にはスタージェスの公式にとりあえずそのまま乗っかってし まっても良い気がします。 4.1.4 2 変数の散布図 2変数の散布図を描く場合には,plot() 関数が使えます。なお,plot() 関数は他にもデータ の形式などに合わせて何かしらの図を出してくれたりするので,色んなところでお世話になると 思います。 散布図を描く # 1問目(Q1_1)と年齢(age)の散布図 # 2変数なので2列指定してあげる plot(dat[, c("Q1_1", "age")]) 40 0 20 age 60 80 1 2 3 1 2 3 4 5 6 Q1_1 図 4.7: 2 変数の散布図 図 4.7 では Q1_1 の取りうる値が 6 通りしかないため散布図感が薄いですが,一つ一つのマル が各レコードを表しています。

8.

4.1 分布の可視化 8 また,2変数の table() を用いるとクロス表が得られるのですが,これを plot() に与える と違った形の図が得られます。 table を plot 1 table(dat[, c("Q1_1", "Q1_2")]) 1 2 3 4 5 6 7 8 Q1_2 Q1_1 1 1 10 2 6 3 6 4 3 5 7 6 7 1 2 # そのままplot()に入れると plot(table(dat[, c("Q1_1", "Q1_2")])) 2 13 26 21 19 25 9 3 4 5 6 5 7 15 22 15 46 61 38 33 97 86 49 39 104 128 56 39 152 333 163 7 73 273 439 table(dat[, c("Q1_1", "Q1_2")]) 2 3 4 5 6 4 3 5 6 Q1_2 2 1 1 Q1_1 図 4.8: いわゆるモザイク図 図 4.8 では,それぞれの四角形および行・列の幅が,各選択肢を選んだ人の割合をそれぞれ表 しています。 変数の分布をプロットする方法は,他にも色々ありますが(例えば箱ひげ図やバイオリンプ ロットなど),必要に応じて適切な方法を選べるようになりましょう。本講義では,あくまでも 基本的なプロットの方法のみの紹介にとどめて次に進んでしまいます。

9.

4.2 相関関係のチェック 9 4.2 相関関係のチェック Chapter 2 では 1 変数レベルでの記述統計量をチェックする関数として summary() などを紹 介しました。ここでは,同じようにして 2 変数の関係の記述統計量である相関係数を確認する方 法を紹介しておきます。相関係数は cor() に2つのベクトルを与えることによって計算可能で す。これも欠測値がある場合 NA を返してくるので,きちんと相関係数を出してほしい場合には 適切な引数を与えます。ただし,mean() などの時に使用する na.rm ではなく use という引数を 使用します。 (説明は後ほど) 2変数の相関係数 1 2 # "pairwise"は"pairwise.complete.obs"の略 cor(dat[, "Q1_1"], dat[, "Q1_2"], use = "pairwise") 1 [1] 0.3527771 cor() には上のように2つのベクトルを与える他に,データフレームをまるごと与えること も可能です。データフレームを一つだけ与えた場合にはそのデータフレーム内の全ての列の相関 行列が,データフレームを2つ与えた場合にはデータフレーム同士の全ての列の組み合わせの相 関行列が得られます。 データフレーム内のすべての相関係数 1 2 # 量が多いので省略しています cor(dat, use = "pairwise") 1 2 3 4 5 6 ID Q1_1 Q1_2 Q1_3 Q1_4 ID 1.00000000 -0.0442558 -0.04853408 -0.01340771 0.01208236 Q1_1 -0.04425580 1.0000000 0.35277706 0.27444894 0.16169504 Q1_2 -0.04853408 0.3527771 1.00000000 0.49741109 0.35019071 Q1_3 -0.01340771 0.2744489 0.49741109 1.00000000 0.38480054 Q1_4 0.01208236 0.1616950 0.35019071 0.38480054 1.00000000 第1因子と第2因子の項目間相関行列 1 cor(dat[, 2:6], dat[, 7:11], use = "pairwise") 1 2 3 4 5 6 Q1_6 Q1_7 Q1_8 Q1_9 Q1_10 Q1_1 -0.01132405 -0.01088135 0.02365191 0.1161066 0.03943949 Q1_2 0.09785479 0.12411971 0.18509733 0.1523665 0.12848202 Q1_3 0.10989033 0.14186345 0.12557243 0.1261299 0.16038337 Q1_4 0.08963104 0.22389063 0.12966842 0.1739516 0.25181181 Q1_5 0.13115144 0.11412746 0.12906468 0.1290221 0.17094545

10.

4.2 相関関係のチェック 10 引数 use は,計算に使用するデータを決定します。デフォルトでは "everything",つまり全 部使用します。"complete.obs"は,与えたデータフレーム内で欠測値が一つも無いレコードだ けを使用して相関を計算します。"pairwise.complete.obs"では各相関を計算する際に,その 2変数において欠測値が無いレコードを使用して相関を計算します。つまり相関行列の要素ごと に計算に使用するレコードの数・内容が異なる可能性がある,ということです。 4.2.1 (おまけ)相関関係も可視化してみる 心理尺度に対する多変量解析では,複数の質問項目が同じ構成概念を反映しているかが分析手 法のキーとなります。これを確認する方法の一つとして,後半では信頼性のお話が出てくるわけ ですが,ここでも少しだけ,相関関係を可視化することでその感覚を掴んでみましょう。 相関行列を可視化するためのパッケージとして,corrplot というパッケージが用意されてい ます。 1 2 # install.packages("corrplot") library(corrplot) インストールできたら,早速プロットしてみましょう。 相関行列を可視化する cols <- paste0("Q1_", 1:25) # 25項目だけ使う corrplot(cor(dat[, cols])) Q1_1 Q1_2 Q1_3 Q1_4 Q1_5 Q1_6 Q1_7 Q1_8 Q1_9 Q1_10 Q1_11 Q1_12 Q1_13 Q1_14 Q1_15 Q1_16 Q1_17 Q1_18 Q1_19 Q1_20 Q1_21 Q1_22 Q1_23 Q1_24 Q1_25 1 2 Q1_1 Q1_2 Q1_3 Q1_4 Q1_5 Q1_6 Q1_7 Q1_8 Q1_9 Q1_10 Q1_11 Q1_12 Q1_13 Q1_14 Q1_15 Q1_16 Q1_17 Q1_18 Q1_19 Q1_20 Q1_21 Q1_22 Q1_23 Q1_24 Q1_25 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 図 4.9: 相関行列の可視化 この図では,相関係数が高い変数の組のところほど濃い色(プラスなら青,マイナスなら赤) で表されています。ざっと眺めるだけでも,いくつかのまとまりがあるのが見て取れる気がしま す( Q1_16 から Q1_20 など) 。質問項目間に正の相関が見られるということは,これらの項目の

11.

4.3 項目分析 11 背後には,何か共通の要因があるのかもしれません。後半で紹介する因子分析では,このような 変数間の相関関係をもとに,その背後にあると考えられる要因に迫っていきます。 ちなみに,引数 method を指定することで,プロットの形を変えることも可能です。 相関行列を可視化する (2) # 個人的にはこちらのほうがまとまりが見やすい気がします corrplot(cor(dat[, cols]), method = "shade") Q1_1 Q1_2 Q1_3 Q1_4 Q1_5 Q1_6 Q1_7 Q1_8 Q1_9 Q1_10 Q1_11 Q1_12 Q1_13 Q1_14 Q1_15 Q1_16 Q1_17 Q1_18 Q1_19 Q1_20 Q1_21 Q1_22 Q1_23 Q1_24 Q1_25 1 2 Q1_1 Q1_2 Q1_3 Q1_4 Q1_5 Q1_6 Q1_7 Q1_8 Q1_9 Q1_10 Q1_11 Q1_12 Q1_13 Q1_14 Q1_15 Q1_16 Q1_17 Q1_18 Q1_19 Q1_20 Q1_21 Q1_22 Q1_23 Q1_24 Q1_25 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 図 4.10: 相関行列の可視化 (2) 4.3 項目分析 まずはじめに,項目単位での「変なやつ」がいないかをチェックしていきます。 4.3.1 天井効果・床効果について検討する 天井効果または床効果が発生しているかの判断について,一発で見抜ける方法というものはあ りません。あくまでも一つの基準としてですが,よく言われているのは「平均値 ± 標準偏差が, 取りうる値の範囲(今回の例では 1 から 6)を超えている場合」というものらしいです(要出 典) 。特に変数の数が多くて全ての棒グラフを作って見るのも骨が折れる,という場合には,ま ずこの判別方法であたりを付けてみるのも良いかもしれません。 とりあえず上述の基準にのっとって天井効果または床効果を確認するためには,各変数(列) ごとに平均値や標準偏差を計算する必要があります。普通に考えると次のようなコードによって 実現可能です。

12.

4.3 項目分析 12 1 問目の平均値と標準偏差を足すと 1 2 # 欠測値があるため,na.rm=TRUEを引数に追加している mean(dat[, "Q1_1"], na.rm = TRUE) + sd(dat[, "Q1_1"], na.rm = TRUE) 1 [1] 5.998918 1 問目の平均値から標準偏差を引くと 1 2 # 欠測値があるため,na.rm=TRUEを引数に追加している mean(dat[, "Q1_1"], na.rm = TRUE) - sd(dat[, "Q1_1"], na.rm = TRUE) 1 [1] 3.18776 ただ,今回は 25 項目もあります。上の計算をそれぞれの列にやっても良いのですが効率が悪 いので,apply() を使って 列ごとの平均値 1 2 3 # 本当はQ1_1からQ1_25のところだけに適用したら良いが, # 今回は全ての列がnumericかinteger型なので気にせず進めます。 apply(dat, 2, mean, na.rm = TRUE) 1 2 3 4 5 6 7 8 9 10 11 12 ID 1396.945312 Q1_5 4.548931 Q1_10 3.692434 Q1_15 4.394326 Q1_20 2.972451 Q1_25 4.528783 Q1_1 4.593339 Q1_6 4.527138 Q1_11 4.020148 Q1_16 2.944901 Q1_21 4.814967 gender 1.670230 Q1_2 4.801398 Q1_7 4.374178 Q1_12 3.846217 Q1_17 3.519737 Q1_22 4.314556 education 3.190860 Q1_3 4.602385 Q1_8 4.301398 Q1_13 3.987253 Q1_18 3.226151 Q1_23 4.454359 age 28.582237 Q1_4 4.691612 Q1_9 4.449013 Q1_14 4.414474 Q1_19 3.203947 Q1_24 4.927632 とすればよいわけです*2 。したがって,各列の平均値 ± 標準偏差をまとめて計算したい場合は それぞれ以下のようになります。 列ごとの平均値 +SD 1 apply(dat, 2, mean, na.rm = TRUE) + apply(dat, 2, sd, na.rm = TRUE) *2 実は,apply(dat, 2, mean) と同じ挙動をする,つまり列ごとの平均を出す関数として colMeans(dat) とい うものもあります。そして rowMeans() や colSums() という関数もあります。

13.

4.3 項目分析 1 2 3 4 5 6 7 8 9 10 11 12 ID 2207.424918 Q1_5 5.812634 Q1_10 5.323572 Q1_15 5.733057 Q1_20 4.594638 Q1_25 5.852550 13 Q1_1 5.998918 Q1_6 5.758867 Q1_11 5.650285 Q1_16 4.519407 Q1_21 5.936672 gender 2.140456 Q1_2 5.974081 Q1_7 5.690390 Q1_12 5.458144 Q1_17 5.050856 Q1_22 5.866132 education 4.302853 Q1_3 5.908401 Q1_8 5.589267 Q1_13 5.335440 Q1_18 4.819228 Q1_23 5.654409 age 39.550527 Q1_4 6.172146 Q1_9 5.825444 Q1_14 5.876204 Q1_19 4.771938 Q1_24 6.116027 列ごとの平均値-SD 1 apply(dat, 2, mean, na.rm = TRUE) - apply(dat, 2, sd, na.rm = TRUE) 1 2 3 4 5 6 7 8 9 10 11 12 ID 586.465707 Q1_5 3.285227 Q1_10 2.061297 Q1_15 3.055594 Q1_20 1.350264 Q1_25 3.205016 Q1_1 3.187760 Q1_6 3.295409 Q1_11 2.390011 Q1_16 1.370395 Q1_21 3.693263 gender 1.200004 Q1_2 3.628715 Q1_7 3.057966 Q1_12 2.234291 Q1_17 1.988618 Q1_22 2.762979 education 2.078867 Q1_3 3.296368 Q1_8 3.013529 Q1_13 2.639066 Q1_18 1.633075 Q1_23 3.254308 age 17.613946 Q1_4 3.211077 Q1_9 3.072583 Q1_14 2.952743 Q1_19 1.635957 Q1_24 3.739236 天井効果が出ている可能性がある(平均値 +SD が 6 を超えている)変数は Q1_4,Q1_24 の 2 つです。また,床効果が出ている可能性のある項目はなさそうでした。 ということで,天井効果が出ている可能性のある変数についてプロットしたものが図 4.11 です。 天井効果はあるのか? 1 2 barplot(table(dat[, "Q1_4"])) barplot(table(dat[, "Q1_24"])) 実際に天井効果および床効果が生じていると思われる項目を分析から除外するかについては, 定量的な基準(平均 ± 標準偏差)だけで決めるべきではありません。実際には,この後紹介する 妥当性などの観点から項目の内容を吟味したりして,構成概念の定義的に削除しても問題ないか を判断する必要があります。ちなみに今回の程度であれば,分布が多少偏っているとはいえ,除

14.

14 0 0 200 400 600 200 400 600 800 800 4.3 項目分析 1 2 3 4 5 6 (a) Q1_4 1 2 3 4 5 6 (b) Q1_24 図 4.11: 天井効果が疑われる項目の棒グラフ 外するほどの大きな問題とはいえないでしょう。 INFO (私見)天井・床効果で除外することはほぼ無い? 私が 図 4.11 のようなレベルの天井効果について除外しなくても良いと考えている理由は, こうした項目は少なくとも特性値の低い人を区別する力は持っているためです。 心理尺度への回答は,その背後にある心理特性(社交性や誠実さなど)の強さを反映して 決まっていると考えられます。つまり天井効果(床効果)が起きているような項目では, 「その心理特性が一定レベル以上(以下)の強さの人はみんな端の選択肢を選んでいる」状 態なわけです。その「一定レベル」の閾値を仮に 30 とすると,天井効果が起きている項目 は,レベル 80 の人とレベル 90 の人はどちらも最大値の選択肢を選ぶために区別ができな いわけですが,少なくともレベル 10 の人とレベル 20 の人は区別できるだろう,というわ けです。したがって,多少の天井/床効果が起きている程度で,その項目には全く意味が ない,ということにはならないだろう,というのが私の考えです。 ただし,天井/床効果が起きていない項目と比べると,1 項目が持つ「高低を区別する総 合力」は低い可能性が高いので,例えば尺度を新規作成する際や,質問票にいれることの できる項目数に厳しい制限があるならば,どちらかといえば天井/床効果が起きていない 項目を選んだほうが良いと思います。一方で,上述の理由から,既存の尺度を使って,し かも既に取った後のデータの分析を行う段階ならば,そこでわざわざ多少の天井/床効果 での項目削除はしなくても良いのではないか,と思っています。 また,除外するかを判断する場合に重要となるのは,天井/床効果が生じているかよりも, 回答が一箇所に集中しすぎていないかだと思っています。もしも全ての人がちょうど中間 の選択肢を選んでいた場合,天井/床効果はいずれも生じていなくても項目としては明ら かにおかしなものになっているはずです。そう考えると,単に標準偏差が異様に小さい項 目が無いかを見ておけば良いような気がしています。

15.

4.3 項目分析 15 4.3.2 I-T 相関 ここでは大前提として,心理尺度では複数の項目が同じ構成概念を測定しようとしているはず だというところから出発して考えます。このとき,ある項目が,同じ尺度内の他の項目と確かに 同じ構成概念を測定しているならば,他の項目の得点との相関は高いはずです。ということは当 然,合計点との相関も高いだろうという予測が立ちます。この考えに基づいて算出される指標 が,各項目の値と,尺度の合計点の相関である I-T 相関 (Item-Test または Item-Total) で す。他の項目との一貫性という点では,後述する信頼性の分析の一部という見方もできます*3 。 I-T 相関を出すためには,まず合計点を出す必要があります。これは apply() を使えば簡単に 出来ます。最も簡便な尺度得点としてそのまま他の変数との関係を見る分析にも使えたりするの で,ここで各因子ごとに合計点を作成して dat に追加しておきましょう。なお R ではほとんどの 場合,データフレームの存在しない列名を指定して代入すると,新しい列を追加してくれます*4 。 合計点の算出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 # 列の指定の仕方はいろいろありました # ↑復習を兼ねて,わざと異なる方法で列を指定しています # Agreeableness dat[, "Q1_A"] <- apply(dat[, paste0("Q1_", 1:5)], 1, sum) # Conscientious dat$Q1_C <- apply(dat[, paste0("Q1_", 6:10)], 1, sum) # Extraversion dat[, "Q1_E"] <- apply(dat[, paste0("Q1_", 11:15)], 1, sum) # Neuroticism dat["Q1_N"] <- apply(dat[, paste0("Q1_", 16:20)], 1, sum) # Openness dat$Q1_O <- apply(dat[, paste0("Q1_", 21:25)], 1, sum) ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ # 一旦確認 head(dat) ID Q1_1 Q1_2 Q1_3 Q1_4 Q1_5 Q1_6 Q1_7 Q1_8 Q1_9 Q1_10 Q1_11 Q1_12 1 5 4 3 4 4 2 3 3 3 3 4 4 2 5 4 5 2 5 5 4 4 4 3 6 6 3 2 4 5 4 4 4 5 4 5 2 5 3 4 3 4 6 5 5 4 4 3 2 2 2 4 5 5 3 3 4 5 4 4 5 4 5 5 5 6 1 6 5 6 5 6 6 6 6 4 5 6 Q1_13 Q1_14 Q1_15 Q1_16 Q1_17 Q1_18 Q1_19 Q1_20 Q1_21 Q1_22 Q1_23 1 3 4 4 3 4 2 2 3 3 1 3 1 2 3 4 5 6 *3 一般的に信頼性(および妥当性)は尺度全体の性質(または尺度全体 × 母集団の組み合わせに対する性質)とし *4 て考えられるものなので,項目ごとの性質の分析である I-T 相関の確認は信頼性とは別枠で紹介しています。 ncol(dat)+1 列目を指定して代入することも可能ですが,この場合列の名前を決められないのでやめたほうが 良いでしょう。

16.

4.3 項目分析 10 11 12 13 14 15 16 17 18 19 20 21 16 2 3 4 5 6 6 4 3 3 3 3 5 5 4 5 4 4 5 4 5 4 2 3 4 5 4 4 4 2 5 2 4 1 3 4 5 4 5 2 3 4 4 3 3 4 6 5 6 3 5 2 2 3 4 4 Q1_24 Q1_25 gender education age Q1_A Q1_C Q1_E Q1_N Q1_O 1 4 4 1 NA 16 20 14 19 14 15 2 3 4 2 NA 18 21 20 25 19 20 3 5 5 2 NA 17 19 20 21 18 24 4 3 2 2 NA 17 23 15 18 14 16 5 3 4 1 NA 17 20 22 24 16 18 6 6 6 2 3 21 23 28 28 15 25 4 5 4 4 5 合計点が出来たら,後は相関係数を計算するだけです。ですが,ここで計算するべき相関係数 は,普通の(ピアソンの積率)相関係数ではありません。 カテゴリカル変数の相関 各項目への回答は,本来連続量である潜在変数(因子)の強さによって規定されます。実際に 観測できる項目反応(5 件法なら 1 から 5 の数字)は,この潜在変数を適当なところで打ち切っ てカテゴリ化された値とみなせるわけです。図 4.12 はその関係を表した図です。潜在変数は通 常,正規分布に従うと仮定されます。心理尺度への回答データを考える際には,正規分布の仮定 のもとで,潜在変数の強さの程度に応じて,回答者は自分にあった強さの選択肢を選んでいる, というように考えます*5 。 1 2 3 4 5 図 4.12: 5 件法に対する潜在変数と回答の関係 ということは,合計点*6 との相関係数を計算する場合,本来は項目への回答そのものではな く,背後にある潜在変数の値で計算したほうが良いのです。むしろそうしないと,連続量をカテ ゴリに落とし込むことで失われる情報のせいで,本来の相関係数よりも低い値が算出されてしま います。 今回はポリシリアル相関 (polyserial correlation) というものを使います。これは, (多値) *5 もちろん,回答者自身が自分の潜在特性の強さと項目の閾値の関係を考えて回答を選んでいるわけではありませ ん。あくまでも「こう考えたらしっくり来るよね」というイメージ的なものです。 *6 それなりの項目数があれば,合計点は連続変数とみなしても良いのでそのまま使います。

17.

4.3 項目分析 17 カテゴリカル変数の背後にあると想定される連続量と,連続変数との相関係数です。他にも,同 じような考え方の特殊な相関係数がいくつかあり,それらは表 4.1 のようにまとめられます。 表 4.1: カテゴリカル変数との相関係数 連続 連続 多値 二値 ピアソンの積率相関 ポリシリアル相関 点双列相関(バイシリ アル相関) 多値 ポリシリアル相関 ポリコリック相関 ポリコリック相関 二値 点双列相関(バイシリ ポリコリック相関 テトラコリック相関 アル相関) これらの特殊な相関係数を計算するためのパッケージとしては,polycor パッケージというも のがあります。 1 2 3 # まだパッケージをインストールしていない場合は # install.packages("polycor") library(polycor) 今回はポリシリアル相関を計算するため,polyserial() を使用しましょう*7 。少し注意が必 要な点として,polyserial() 関数では • 第 1 引数 ( x) に入れた変数は自動的に連続変数として扱われる • 第 2 引数 ( y) に入れた変数は自動的にカテゴリカル変数として扱われる つまり引数の順番が変わると計算結果が変わってしまいます。そして,このように引数の順 番が重要な関数は,apply() 関数と組み合わせて使用する場合にやや面倒なことが起こりま す。図 4.13 に,簡単な概要をまとめたものを用意しました。apply(X, MARGIN, FUN) では, MARGIN の方向に分割された X を,それぞれ FUN で指定した関数の第一引数に与えるという挙動 をします。つまり FUN に polyserial を指定した場合,X で与えたものは自動的に連続変数とし て扱われざるを得ないのです。 こればっかりは apply() 関数の仕様のため,たぶんどうしようもありません。そこでやや面 倒ですが,回避策として polyserial() 関数の引数の順番を入れ替えたものを別の関数として 先に定義しておくことにします。 *7 polyserial() 関数は,「カテゴリカル変数と連続変数の相関を出す」関数です。したがって,ポリシリアル 相関の特殊なケース(カテゴリカル変数が二値)である点双列相関もこの関数で対応可能です。これとは別に, polychoric() 関数というものも用意されています。こちらは「カテゴリカル変数同士の相関を出す」関数で, ポリコリック相関とテトラコリック相関係数を出すことができます。

18.
[beta]
4.3 項目分析

18

図 4.13: polyserial() 関数を apply() 関数の中で呼んだとき

polyserial() 関数の引数を入れ替えただけの関数を定義
1
2
3
4
5

# x: I-T相関を出したい項目
# total: 合計点
itcor <- function(x, total) {
polycor::polyserial(total, x)
}

I-T 相関の計算 (1)
1
2
3
4
5
6

# apply()の第一引数xは,FUNに与えた関数(itcor)の第一引数になる
# 第二引数以降は引数FUNより後ろに明示的に与える

1
2

Q1_1
Q1_2
Q1_3
Q1_4
Q1_5
0.6343893 0.8006811 0.8320099 0.7379408 0.7392092

1
2

# Conscientious
apply(dat[, paste0("Q1_", 6:10)], 2, itcor, dat[, "Q1_C"])

1
2

Q1_6
Q1_7
Q1_8
Q1_9
Q1_10
0.6980845 0.7432043 0.7076029 0.7993942 0.7615535

# 因子ごとに,計算に使用する合計点(total)が変わるので,5項目ごとにそれぞれ書く
# Agreeableness
apply(dat[, paste0("Q1_", 1:5)], 2, itcor, dat[, "Q1_A"])

19.
[beta]
4.3 項目分析

1
2

# Extraversion
apply(dat[, paste0("Q1_", 11:15)], 2, itcor, dat[, "Q1_E"])

1
2

Q1_11
Q1_12
Q1_13
Q1_14
Q1_15
0.7650335 0.8265158 0.7100692 0.8071135 0.6899571

1
2

# Neuroticism
apply(dat[, paste0("Q1_", 16:20)], 2, itcor, dat[, "Q1_N"])

1
2

Q1_16
Q1_17
Q1_18
Q1_19
Q1_20
0.8495472 0.8190185 0.8462378 0.7489533 0.7173007

1
2

# Openness
apply(dat[, paste0("Q1_", 21:25)], 2, itcor, dat[, "Q1_O"])

1
2

Q1_21
Q1_22
Q1_23
Q1_24
Q1_25
0.6689789 0.7160443 0.7168503 0.5418518 0.7209368

I-T 相関という場合,実は 2 種類の相関係数が考えられます。一つはいま計算した「合計点と
の相関」です。しかし今回のように項目数が少ない場合,「合計点」はその項目自身の影響を結
構強く受けていると考えられます。そこで,「合計点から自身の得点を引いたものとの相関」I-T
相関として考えることもあります。例えば Q1_1 の I-T 相関であれば,Q1_2 から Q1_5 までの 4
項目の合計点との相関を見る,ということです。
「合計点から自身の得点を引いたものとの相関」を見る場合,先程よりはやや難しくなります。
これもやり方はいくつかあると思いますが,ここでは関数を定義してやってみましょう。
関数の定義を少し変える
1
2
3
4
5

# 先程定義したitcor()関数をベースに
# 引数totalを「合計点から自身の得点を引いたもの」にしたら良いので
itcor2 <- function(x, sum) {
polyserial(sum - x, x)
}

I-T 相関の計算 (2)
1
2
3
4
5

# あとは先程と同じ
# 因子ごとに,計算に使用する合計点(total)が変わるので,5項目ごとにそれぞれ書く
# Agreeableness
apply(dat[, paste0("Q1_", 1:5)], 2, itcor2, dat[, "Q1_A"])

19

20.

4.3 項目分析 1 2 Q1_1 Q1_2 Q1_3 Q1_4 Q1_5 0.3497715 0.6254912 0.6506640 0.4597522 0.5309969 1 2 # Conscientious apply(dat[, paste0("Q1_", 6:10)], 2, itcor2, dat[, "Q1_C"]) 1 2 Q1_6 Q1_7 Q1_8 Q1_9 Q1_10 0.4966869 0.5445442 0.5033232 0.6130345 0.5143994 1 2 # Extraversion apply(dat[, paste0("Q1_", 11:15)], 2, itcor2, dat[, "Q1_E"]) 1 2 Q1_11 Q1_12 Q1_13 Q1_14 Q1_15 0.5473676 0.6487321 0.5260702 0.6280941 0.4922296 1 2 # Neuroticism apply(dat[, paste0("Q1_", 16:20)], 2, itcor2, dat[, "Q1_N"]) 1 2 Q1_16 Q1_17 Q1_18 Q1_19 Q1_20 0.7127767 0.6793635 0.7088856 0.5709521 0.5129809 1 2 # Openness apply(dat[, paste0("Q1_", 21:25)], 2, itcor2, dat[, "Q1_O"]) 1 2 Q1_21 Q1_22 Q1_23 Q1_24 Q1_25 0.4291648 0.3812691 0.4836023 0.2386248 0.4531874 当然ですが,自身の得点を引いたものとの I-T 相関のほうが低くなりました。ただ今回はい ずれの項目も問題ないレベルの I-T 相関を示しています。(当然と言えば当然ですが)サンプル データなのでかなりきれいです*8 。 ちなみに I-T 相関が低いということは,それすなわち項目が悪い,というわけではありませ ん。あくまでも他の項目との相関が低いだけです。ただ,I-T 相関が低い項目が入っている場合, 因子分析をしても思った通りに因子がまとまらなかったり,項目反応理論でもうまくパラメータ 推定ができない可能性が高くなります。そのため,内容次第ではありますが I-T 相関が低い項 目があればこの段階で分析から除外する,ということもあります。実際のところどの程度低かっ *8 現実のデータで,これだけきれいに I-T 相関が高く出て(今後やりますが)きれいな因子構造が得られることは まずありません。この授業ではかなり理想に近いデータを扱っていたんだということは,みなさんもいずれ痛感 するときが来るかもしれません。 20

21.

4.3 項目分析 21 たら問題視されるかの明確な基準は多分無いのですが,経験的には自身の得点を引いたものとの I-T 相関が 0.2 から 0.1 を下回ると,相当厳しいケースが多いです。 カテゴリカルな相関係数の計算方法の考え方 上述したようなカテゴリ変数に対する相関係数では,図 4.12 に示したように,各項目への回 答の背後に正規分布に従う連続量があると仮定します。ここで,2 つの二値項目(当てはまる/ 当てはまらない)への回答 𝑥𝑖 , 𝑥𝑗 について,(点双列)相関係数の出し方を説明します。もちろ ん多値項目に対する相関係数も原理は同じです。 二値項目その背後にある連続量をそれぞれ 𝑢𝑖 , 𝑢𝑗 としておきます。カテゴリカルな相関係数で は,連続量が閾値を超えていたら 1, 超えなければ 0 と回答している,と考えるので,各項目に ついての閾値をそれぞれ 𝜏𝑖 , 𝜏𝑗 と置くと,項目への回答と連続量の関係性を以下のように表すこ とができます。 𝑥𝑖 = { 0 1 𝑢𝑖 < 𝜏 𝑖 𝑢𝑖 ≥ 𝜏 𝑖 𝑥𝑗 = { 0 1 𝑢𝑗 < 𝜏 𝑗 𝑢𝑗 ≥ 𝜏 𝑗 𝑢𝑖 に関して,ここまでの関係を表したものが図 4.14 です。同様の関係が 𝑢𝑗 についても存在 しているとします。 xi = 0 xi = 1 ti ui 図 4.14: 2 件法に対する潜在変数と回答と閾値の関係 いま知りたいのは,2 つの回答そのものの相関係数 𝑟𝑥𝑖 ,𝑥𝑗 よりも,その背後にある連続量同士 の相関係数 𝑟𝑢𝑖 ,𝑢𝑗 です。これを計算するためには,2 つの項目についての図 4.14 に 2 変量正規 分布の図を組み合わせて,実際に得られる回答の割合を考えます。図 4.15 の2つの図は,いず れも (𝜏𝑖 , 𝜏𝑗 ) = (0.2, −0.8) として作図したものです。 周辺尤度(各図の上と右にある正規分布)にはいずれも標準正規分布を仮定して,それぞれ 𝜏𝑖 = 0.2 以上および 𝜏𝑗 = 0.8 のところが塗りつぶされています。いま,各図の中の楕円は 2 変量 正規分布の確率密度(左:相関弱め,右:相関強め)を表しています。したがって楕円のうち塗 りつぶされている箇所(右上)は,2 変量正規分布において 𝜏𝑖 = 0.2 以上かつ 𝜏𝑗 = 0.8 となる確 率= 2 項目の両方に「当てはまる」と回答する確率を表しています。図からもわかるように,2 変量正規分布の形は相関係数によって変化するため,2 つの閾値(𝜏𝑖 = 0.2 と 𝜏𝑗 = 0.8)で区切 られた 4 つの区間の面積は相関係数によって変わります。 そして観測されたデータにも,2 つの二値項目に対する回答の組み合わせが 4 パターン存在し うるので,それぞれの出現割合 (0 ≤ 𝜋⋅⋅ ≤ 1) を表 4.2 のようにまとめておきます。

22.

4.3 項目分析 22 2 2 3 X>t 3 X>t X>t Y>T Y>T X>t Y>T X>t Y<T X<t Y<T X<t Y<T T -2 X>t Y<T -3 -3 -2 Y>T rho = 0.8 phi = 0.41 0 T -1 0 rho = 0.3 phi = 0.17 -1 X<t Y>T 1 1 X<t Y>T -3 -2 -1 0 1 2 3 -3 -2 (a) 相関係数 0.3 -1 0 1 2 3 (b) 相関係数 0.8 図 4.15: 2 つの潜在変数の相関関係と回答 表 4.2: 2 項目への回答のパターンとその割合 𝑥𝑗 = 0 𝑥𝑗 = 1 𝑥𝑖 = 0 𝜋00 𝜋01 𝑥𝑖 = 1 𝜋10 𝜋11 これで材料が出揃いました。カテゴリ変数に対する相関係数では,図 4.15 の楕円の 4 つの 領域の確率と 表 4.2 の 4 つの 𝜋 の割合が一致するように各項目の閾値 𝜏𝑖 , 𝜏𝑗 および相関係数 𝑟𝑢𝑖 ,𝑢𝑗 を求めます。例えば「100 人中 25 人が (1, 1) と回答した」という場合には 𝜋11 = 0.25 と なるので,図 4.15 の楕円のうち塗りつぶされている部分(右上)の確率も 0.25 になるように, (𝜏𝑖 , 𝜏𝑗 , 𝑟𝑢𝑖 ,𝑢𝑗 ) の 3 つを計算し,得られた 𝑟𝑢𝑖 ,𝑢𝑗 の値が(点双列)相関係数となるわけです。 実際のアルゴリズムでは,これをもう少し簡便にした二段階推定法が用いられることが多いよ うです。二段階推定法では,まず第一段階で閾値 𝜏𝑖 , 𝜏𝑗 を各回答の出現割合から決定してしまい ます。例えば「100 人中 30 人が 𝑥𝑖 = 1 と回答した」という場合には,標準正規分布のなかで上 位 30% の人が 𝑢𝑖 ≥ 𝜏𝑖 であったと考えられます。したがって,閾値 𝜏𝑖 は,標準正規分布におけ る上側 30% の(図 4.14 において点線より右側の面積が 30% になる)点となり,これを計算す るとおよそ 0.524 と求めることが出来ます。そして第二段階では,第一段階で得られた閾値を固 定して,相関係数 𝑟𝑢𝑖 ,𝑢𝑗 のみを計算します。 4.3.3 G-P 分析・トレースライン Good-Poor 分析とは,特に学力テストの文脈で用いられることのある分析方法です。テストの 場合,合計点が高い人ほど Good,低い人ほど Poor とされるわけですが,仮にある項目がテスト 全体と同じものを測定しているならば,合計点が高い人ほど正答率が高く,低い人ほど正答率が

23.

4.3 項目分析 23 低い,ということが言えそうです。…この考え方,先程の I-T 相関と非常に良く似ていますね。 G-P 分析では,合計点によって全回答者を 3 群程度に分け,上位(Good)群と下位(Poor) 群での正答率の差をチェックします。もしも正答率に差があれば,たしかにその項目はそのテス ト全体が言うところの上位と下位を弁別できていそうだぞ,ということになるわけです。 トレースラインは,G-P 分析のときと同じように,合計点によって全回答者をいくつかの群 に分け,各群での各選択肢の選択率をプロットしていきます。一番左から順に,得点の低い群か ら並べていった時に,誤答選択肢の選択率は右肩下がりに,正答選択肢の選択率が右肩上がりに なっていれば,たしかにその項目はそのテスト全体が言うところの上位と下位を弁別できていそ うだぞ,ということになるわけです。 図 4.16 は,仮想的な 5 件法の項目に対するトレースラインの例です。この例では,データを 合計点で 5 等分しています。したがって,各プロットの一番左は「合計点の下位 20% の人たち の,この項目への回答の平均点」を表しているわけです。では一つずつ図を見ていきましょう。 高得点者だけ識別できる 5 4 4 回答の平均値 回答の平均値 良い項目 5 3 2 1 3 2 1 低い やや低い 平均 合計点 やや高い 高い 低い 平均 合計点 やや高い 高い 平均 合計点 やや高い 高い たぶん逆転項目 5 5 4 4 回答の平均値 回答の平均値 悪い項目 やや低い 3 2 1 3 2 1 低い やや低い 平均 合計点 やや高い 高い 低い やや低い 図 4.16: トレースラインの例 図 4.16 の左上の図は,合計点が高い人ほどこの項目にも高い点をつけているため,良い項目 だと判断できます。言い換えると,この項目に対して何と回答したかによって,その人の合計点 (その背後にある潜在特性)の高低を正しく評価できている,ということです。このような項目 では,I-T 相関も高く出ることでしょう。 図 4.16 の右上の図は,合計点の最上位層のみが高い点をつけていて,他の人達は軒並み低い 点をつけている項目です。このような項目は,床効果が出ている項目と見ることが出来ます。一 方で,この項目は「高得点か否か」を識別できる項目としてはよく機能しているため,この程度 の床効果では削除する必要はない可能性が高いでしょう。I-T 相関はちょっと低くなるかもしれ ませんが,G-P 分析を行えば問題ない結果が出るはずです。

24.

4.3 項目分析 24 図 4.16 の左下の図は,合計点の高低にかかわらず平均値が概ね同じ値になっています。一般 的には,このような項目が悪い項目と判断されます。この項目に何と回答するかが,その人の合 計点(その背後にある潜在特性)の高低と無関係になっているということは,この項目への回答 が潜在特性の高低の推定に役立っていないということです。このような項目では I-T 相関は低 く,G-P 分析もダメダメになると思われるので,事前に削除を検討しても良いと思います。 図 4.16 の右下の図は,これまでと違って右下りになっています。ふつう心理尺度では,すべ ての項目は同じ特性を反映していると考えているため,単一項目への回答と合計点は正の相関に なるはずなので,ちょっとおかしいです。最もありえるのは「逆転項目の処理忘れ」でしょう。 一方で,もしも逆転項目のつもりではない項目でこのような関係が見られた場合は,ワーディン グなどに問題を抱えている可能性が考えられるので,使用を慎重に検討したほうが良いかもしれ ません。 ここからは,実際に平均点のトレースラインを作成してみたいと思います。トレースライン作 成のために必要な工程は以下のとおりです。 1. 合計点を用いてデータをいくつかのグループに分ける 2. 各グループについて,特定の項目への回答の平均値を出す 3. X 軸を 1. で求めたグループ(小さい順),Y 軸を 2. で求めた平均値としてプロットする 工程 1. では新しい材料として,cut() 関数を使用します。この関数は,与えられたベクトル の中身を小さい順に並び替えて breaks 等分したときに,各レコードが下から何番目のグループ に入るかを教えてくれる関数です。 cut(): データを等分する 1 2 3 # まずはやってみる # labelsにbreaksと同じ長さのベクトルを与えると表示がわかりやすい cut(dat$Q1_A, breaks = 10, labels = 1:10) 1 2 3 4 5 6 7 [1] 6 7 6 8 6 8 8 4 9 8 7 8 4 7 7 7 6 8 3 8 10 9 [23] 8 8 6 10 6 8 9 10 9 8 5 9 6 10 8 9 8 6 10 10 5 8 [45] 6 10 10 9 7 6 10 8 5 6 8 7 7 7 6 10 7 3 8 9 8 6 [67] 8 8 9 10 8 5 8 8 6 8 10 8 7 9 9 9 9 8 8 9 8 6 [89] 3 9 6 6 6 7 8 6 10 1 9 8 [ reached getOption("max.print") -- omitted 2332 entries ] Levels: 1 2 3 4 5 6 7 8 9 10 ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ 試しに,89-100 行目の人(上の出力で一番下の行に表示されている人たち)の dat$Q1_A の 値と cut() 関数の返り値を見比べてみると,確かに dat$Q1_A が大きい ID=106 番の人の cut が 10 になっており,またその次の( dat$Q1_A が小さい)108 番の人の cut は確かに小さな値 ( 1)になっていることがわかります(表 4.3 )。

25.

4.3 項目分析 25 表 4.3: 89-100 行目の人の合計値( Q1_A)と cut() の返り値 1 2 ID Q1_A cut 89 97 11 3 90 98 26 9 91 99 19 6 92 100 20 6 93 102 18 6 94 103 22 7 95 104 23 8 96 105 18 6 97 106 29 10 98 108 6 1 99 109 27 9 100 110 25 8 # これをデータにくっつけておく dat$group_A <- cut(dat$Q1_A, breaks = 10, labels = 1:10) ​ ​ ​ ​ ​ ​ ​ ​ 工程 2. において便利なのが aggregate() 関数です。この関数は,指定した変数の値ごとに グルーピングしたうえで,それぞれのグループに対して計算を行ってくれる関数です。ちょっと わかりにくいと思うので,以下のコード例を見てみてください。 aggregate(): 指定した変数の値でグルーピングしてから関数を適用する 1 aggregate(Q1_1 ~ education, dat, mean, na.rm = TRUE) 1 2 3 4 5 6 1 2 3 4 5 education Q1_1 1 4.419192 2 4.296000 3 4.581395 4 4.832370 5 4.953168 aggregate() 関数には何通りかの記法があるのですが,ここでは formula を使った記法で 紹介します*9 。もともと formula は回帰分析の式(𝑦 = 𝑏1 𝑥 + 𝑏0 )に合わせた形で,左辺に被 説明変数,右辺に説明変数を書くという R 特有の記法の一つです。aggregate() 関数では,こ の記法を利用して左辺に計算対象の変数名,右辺にグルーピング対象の変数名を書き,その後 *9 formula 記法は回帰分析や SEM のところでガンガン使用するので,少しでも慣れておくと良いでしょう。

26.

4.3 項目分析 ろに「どのデータについて実行するか」「どの関数を実行するか」をそれぞれ書いていきます。 したがって先程のコードは,「 dat について,education の値ごとにグループを作り,Q1_1 の mean(na.rm=TRUE) を計算してくれ」という指示になっていたわけです。 ちなみに aggregate() では,複数の属性について同時にグルーピングを行い関数を適用する ことも出来ます。この場合,回帰分析の説明変数を追加する要領で,右辺に変数名を足していく だけで OK です。ここでは使いませんが,以下のように「 gender× education ごとの平均点」 といった計算も可能です。 複数属性で aggregate() 1 aggregate(Q1_1 ~ education + gender, dat, mean, na.rm = TRUE) 1 2 3 4 5 6 7 8 9 10 11 1 2 3 4 5 6 7 8 9 10 education gender Q1_1 1 1 4.146341 2 1 4.195652 3 1 4.184818 4 1 4.475000 5 1 4.577778 1 2 4.612069 2 2 4.354430 3 2 4.737047 4 2 5.022124 5 2 5.175439 話を戻すと,今やりたいことは「 Q1_A の値によって分割された各グループについて,特定の 項目への回答の平均値を出す」でした。aggregate() を使えば,以下のように実装することが出 来ます。 グループ平均値を出す 1 2 group_mean <- aggregate(Q1_1 ~ group_A, dat, mean, na.rm = TRUE) group_mean 1 2 3 4 5 6 7 8 9 10 11 1 2 3 4 5 6 7 8 9 10 group_A Q1_1 1 1.250000 2 2.476190 3 2.937500 4 3.154545 5 3.412281 6 3.801858 7 4.271084 8 4.527216 9 5.262295 10 5.821596 26

27.
[beta]
4.3 項目分析

27

あとはこれをプロットするだけです。
平均値のトレースラインの作成
1

4
3
2

Q1_1

5

6

plot(group_mean)

1

2

3

4

5

6

7

8

9

10

group_A

図 4.17: トレースラインに見える?

group_mean には 2 つの変数が入っているので,これで散布図が書けると思ったのですが,な
んだか思ってたのとはちょっと違う図(図 4.17 )が出てきました。実はこれは,aggregate()
関数によってグルーピングされた変数の列が numeric 型ではなく factor 型になってしまって
いるためです。
1

str(group_mean)

1
2
3

'data.frame':
10 obs. of 2 variables:
$ group_A: Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10
$ Q1_1
: num 1.25 2.48 2.94 3.15 3.41 ...
​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

R ではこのように,関数の挙動によって想定していたものと異なる型の変数に勝手に置き換
わってしまうことがちょくちょくあるので,ここは逃げずにきちんと変数の型を変更してから再
度プロットしましょう*10 。
型を修正してから再度プロット
1
2

group_mean$group_A <- as.numeric(group_mean$group_A)
plot(group_mean)
​

​

​

​

​

​

​

​

​

​

あとは 図 4.18 の点どうしを線で繋げば,図 4.16 で見たようなトレースラインの完成です。
そのためには,以下のように引数 type を与えてあげると良いでしょう(図 4.19 )。
*10 そして関数の挙動が思った通りにならない場合は,変数の型の間違いを疑うのも一つの手だということです。

28.

28 4 3 2 Q1_1 5 6 4.3 項目分析 2 4 6 8 10 group_A 図 4.18: トレースラインっぽくなってきた plot() の引数 type plot(group_mean, type = "b") 4 3 2 Q1_1 5 6 1 2 4 6 8 10 group_A 図 4.19: トレースラインの完成 引数 type として良く用いられるのは,p(点をうつ),l(線で結ぶ),b( p と l を両方) ,n (何も表示しない)あたりでしょうか。他にも plot() には「線の太さ・色・形」「点の大きさ・ 色・形」 「軸の名前」 「図の上部に表示する名前」 「目盛りの大きさ」を始めとして様々な設定が可 能ですが,ここでは取り上げません*11 。 完成した Q1_1 についてのトレースライン(図 4.19 )は,図 4.16 でいえば左上のように,い い感じに右上がりの線になっています。したがって,Q1_1 の回答は,因子 A の他の項目 Q1_2 から Q1_5 と同じ傾向にある,言い換えると,これらの項目と概ね同じような因子について尋ね *11 以前も紹介しましたが,発表や論文用に図を作る場合は,ggplot2 というパッケージがおすすめです。plot() はあくまでもサッと図を作る用,と思っておくと良いと思います。とはいえもちろん plot() を駆使してきれい な図を作ることも可能です。お好きな方法を選んでください。

29.

4.3 項目分析 29 ている項目であると言えそうです。 …ということで余裕があれば,この調子で全ての項目についてトレースラインを描いてみてく ださい。 【おまけ 1】こういうときこそ関数化 トレースラインを作成する方法はわかりましたが,実際にはこの作業を項目の数だけ行う必要 があります。一つ一つの工程はシンプルですが,いちいち複数の工程をこなす必要があり,結構 面倒ですよね。こういったときこそ,同じ作業を関数化することを考えてみましょう。以下に, トレースライン作成のコードを関数化するための(私なりの)手順を紹介しておきます。「関数 化」というのは,基本的に同じ作業を何回も書くのが面倒だという面倒くさがりを救済するため の技術なので, 「われこそは面倒くさがりだ」という人は是非習得してください。 関数化する場合も,最初は普通にコードを作成します。ということで,先程紹介したトレース ライン作成のコードを以下にまとめて示しておきます。 トレースラインの作り方まとめ 1 2 3 4 5 6 7 8 # 1. 合計点で10個にグルーピングしたものをdatに追加する dat$group <- cut(dat$Q1_A, breaks = 10, labels = 1:10) # 2. ある項目について,グループ平均値を出す group_mean <- aggregate(Q1_1 ~ group, dat, mean, na.rm = TRUE) # 3.1 factor型になっているところをnumericまたはinteger型に修正する group_mean$group <- as.numeric(group_mean$group) # 3.2 プロットする plot(group_mean, type = "b") ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ きちんと目的を果たせるコードが書けたら,このコードのうち変わる部分はどこかを考えま す*12 。上記のコードでいえば, 「どの項目についてトレースプロットを描くか」と「 cut() でど の合計点 ( A,C,E,N,O) を使うか」の 2 点が変わるところです。そこで,この「変わる部分」を 一旦変数に代入します。 変数に置き換える 1 2 3 4 5 # データフレームの中の変数(列)名を指定したい場合はchr型が一般的 # トレースプロットを描きたい変数 x <- "Q1_1" # 合計点 total <- "Q1_A" そして,作成した変数 x, total を使って先程のコードを置き換えていきます。 *12 もちろん,慣れてきたら「 cut() でいくつのグループに分けるか」や「プロットの色・太さ」なども変えられる ようにもできます。

30.
[beta]
4.3 項目分析

30

変数 x, total に置き換えたバージョン
1
2
3
4
5
6
7
8
9

# 列をdat$の代わりにchr型で指定する
# 1. 合計点で10個にグルーピングしたものをdatに追加する
​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

dat$group <- cut(dat[, total], breaks = 10, labels = 1:10)
# 2. ある項目について,グループ平均値を出す
group_mean <- aggregate(x ~ group, dat, mean, na.rm = TRUE)
# 3.1 factor型になっているところをnumericまたはinteger型に修正する
group_mean$group <- as.numeric(group_mean$group)
# 3.2 プロットする
plot(group_mean, type = "b")
​

​

​

​

​

​

​

​

​

​

​

​

ただ,実際にやってみるとわかりますが,実はこのままではうまくいきません。
1

Error in model.frame.default(formula = x ~ group, data = dat): variable
lengths differ (found for 'group')

エラーメッセージを見てもわからないと思いますが,実は aggregate() 関数の第一引数
を formula として与える場合,「 Q1_1 ~ group」のように " "でくくらない(character 型
ではない)必要があります*13 。しかし,x <- "Q1_1"を用いて x ~ group を書き換えると,
「 "Q1_1" ~ group」となってしまうために,正しく formula として解釈されないのです。
この場合の対処法は,formula() 関数を用いることです。例えば以下のように,第一引数に

formula() 関数を噛ませた character 型(文字列)として与えることで,文字列のまま正しく
機能させることが出来ます。

formula() 関数を使う
1
2

# 同じ結果になる
aggregate(formula("Q1_1 ~ group"), dat, mean, na.rm = TRUE)

1
2
3
4
5
6
7
8
9
10

1
2
3
4
5
6
7
8
9

group
Q1_1
1 1.250000
2 2.476190
3 2.937500
4 3.154545
5 3.412281
6 3.801858
7 4.271084
8 4.527216
9 5.262295

*13 一応,エラーメッセージには variable

lengths differ と表示されています。formula 記法では,回帰分析
のように左辺と右辺のデータの数は同じになっている必要があるのですが,"Q1_1" ~ group となった場合に,
右辺は dat$group つまり dat の行数の長さのデータがある一方で,左辺は( dat$Q1_1 ではなく)"Q1_1"と
いう長さ 1 の文字列になっているために,「変数の長さが違うよ」というエラーが出ているわけです。

31.
[beta]
4.3 項目分析

31

11

10

1
2

# 元のコード
aggregate(Q1_1 ~ group, dat, mean, na.rm = TRUE)

1
2
3
4
5
6
7
8
9
10
11

1
2
3
4
5
6
7
8
9
10

10 5.821596

group
Q1_1
1 1.250000
2 2.476190
3 2.937500
4 3.154545
5 3.412281
6 3.801858
7 4.271084
8 4.527216
9 5.262295
10 5.821596

ということで,先程のコードを更に書き換えていきます。

formula() 関数を使って修正
1
2

# 列をdat$の代わりにchr型で指定する
# 1. 合計点で10個にグルーピングしたものをdatに追加する
​

​

3
4
5
6
7
8
9
10
11

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

dat$group <- cut(dat[, total], breaks = 10, labels = 1:10)
# 2.1 formulaの文字列を作る
fml <- paste0(x, " ~ group")
# 2.2 ある項目について,グループ平均値を出す
group_mean <- aggregate(formula(fml), dat, mean, na.rm = TRUE)
# 3.1 factor型になっているところをnumericまたはinteger型に修正する
group_mean$group <- as.numeric(group_mean$group)
# 3.2 プロットする
plot(group_mean, type = "b")
​

​

​

​

​

​

​

​

​

​

​

​

これでようやく完成です。うまくできていれば,図 4.19 と同じトレースラインができるはず
です。
最後に,
「変わる部分」を引数として,このコードをまるごと関数に入れてしまいましょう。コ
メントは残しておくとあとあと見返したときにわかりやすいのでおすすめです。
全体を自作関数として定義
1
2
3
4

traceline <- function(x, total) {
# 1. 合計点で10個にグルーピングしたものをdatに追加する
dat$group <- cut(dat[, total], breaks = 10, labels = 1:10)
# 2.1 formulaの文字列を作る
​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

32.
[beta]
4.3 項目分析

5
6
7
8
9
10
11
12
​

​

​

​

​

​

​

​

​

​

​

​

​

​

32

fml <- paste0(x, " ~ group")
# 2.2 ある項目について,グループ平均値を出す
group_mean <- aggregate(formula(fml), dat, mean, na.rm = TRUE)
# 3.1 factor型になっているところをnumericまたはinteger型に修正する
group_mean$group <- as.numeric(group_mean$group)
# 3.2 プロットする
plot(group_mean, type = "b")
​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

}
​

​

自作関数を使うぞ
traceline("Q1_16", "Q1_N")

4
3
1

2

Q1_16

5

6

1

2

4

6

8

10

group

図 4.20: traceline() 関数の出力
関数化する必要があるのは,トレースラインの作成のように,同じような処理を繰り返す必要
がある場合です。同じ処理を何度も書いてしまうと,あとから修正を加えた際に一部だけ修正し
て,残りを修正し忘れる,といって面倒が発生してしまいます。コードの保守や可読性の観点か
ら,同じような処理はなるべく繰り返し記述しないようにすることが望ましいわけです。この
ルールは,プログラミングの世界では,よく DRY(Don’t Repeat Yourself) 原則と呼ばれたりし
ています。
ということで,関数化の手順をまとめると,以下のようになります。

Exclamation 関数化の手順(諸説あり)
1. まずは愚直にコードを書く
2. 繰り返しにおいて変わる場所を変数に置き換える
3. うまく動くように必要に応じてコードを修正する
4. function() 関数を使って関数を作成する
特に 3. の部分に関しては,毎回どのようなエラーが発生するかは分かりません。したがって,

33.
[beta]
4.3 項目分析

33

R の経験値が重要になってきます。同じ結果をもたらす処理の書き方が複数通り存在するとい
うことを知っていることで,解決策が見いだせるかもしれないのです( traceline() の例の場
合,データフレームの列名指定は $ではなく character 型を使った方法の可能であることや,

formula の指定時に character 型に formula() を噛ませる方法もあるいうこと)。
【おまけ 2】選択肢ごとのトレースライン
一応,以下に「選択肢ごとの選択率のトレースライン」のコード例を載せておきます*14 。ただ
これは,多肢選択形式の(つまり誤答選択肢の間には順序関係が無い)問題について誤答選択肢
を分析するような場合には有効ですが,心理尺度の項目分析の場合はここまでやらなくても良い
かもしれません。
選択肢ごとのトレースラインの作成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 今回は10群に分けてやってみる
group_A <- cut(dat[, "Q1_A"], breaks = 10)
# グループごとに合計点の平均値を出す(X軸用)
group_mean <- aggregate(Q1_A ~ group_A, dat, mean, na.rm = TRUE)
# 各選択肢のグループごとの選択率を出すために関数を作る
# ↓ベクトルの中で値がkの割合を計算する関数
prop_k <- function(vec, k) {
mean(vec == k)
}
# 選択肢1のグループごとの選択率を出す
# 一時的な(無名)関数の定義を利用する
group_prop1_item <- aggregate(Q1_3 ~ group_A, dat, prop_k, 1)
# 他の選択肢についても
group_prop2_item <- aggregate(Q1_3 ~ group_A, dat, prop_k, 2)
group_prop3_item <- aggregate(Q1_3 ~ group_A, dat, prop_k, 3)
group_prop4_item <- aggregate(Q1_3 ~ group_A, dat, prop_k, 4)
group_prop5_item <- aggregate(Q1_3 ~ group_A, dat, prop_k, 5)
group_prop6_item <- aggregate(Q1_3 ~ group_A, dat, prop_k, 6)
# X軸はグループごとの「合計点」の平均値
# Y軸は各選択肢のグループごとの選択率
# type="n"とすると,何も表示しない=枠だけ作る
plot(x = c(min(group_mean$Q1_A), max(group_mean$Q1_A)), y = c(0, 1), type =
"n", xlab = "グループ平均値", ylab = "選択率")
# 選択肢ごとに線と点を別々に描き足していく
# 選択肢1
lines(x = group_mean$Q1_A, y = group_prop1_item$Q1_3) # 線
points(x = group_mean$Q1_A, y = group_prop1_item$Q1_3, pch = "1") # 点
# 選択肢2
lines(x = group_mean$Q1_A, y = group_prop2_item$Q1_3) # 線
​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

​

*14 【おまけ 1】の考え方からすると,もっと関数化してシンプルに書くことも可能です。もし暇なら,どのくらい

コード量で作成できるか挑戦してみてください。

34.

4.4 信頼性と妥当性の考え方 29 30 31 32 33 34 35 36 37 38 39 40 41 34 points(x = group_mean$Q1_A, y = group_prop2_item$Q1_3, pch = "2") # 点 # 選択肢3 lines(x = group_mean$Q1_A, y = group_prop3_item$Q1_3) # 線 points(x = group_mean$Q1_A, y = group_prop3_item$Q1_3, pch = "3") # 点 # 選択肢4 lines(x = group_mean$Q1_A, y = group_prop4_item$Q1_3) # 線 points(x = group_mean$Q1_A, y = group_prop4_item$Q1_3, pch = "4") # 点 # 選択肢5 lines(x = group_mean$Q1_A, y = group_prop5_item$Q1_3) # 線 points(x = group_mean$Q1_A, y = group_prop5_item$Q1_3, pch = "5") # 点 # 選択肢6 lines(x = group_mean$Q1_A, y = group_prop6_item$Q1_3) # 線 points(x = group_mean$Q1_A, y = group_prop6_item$Q1_3, pch = "6") # 点 ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ 図 4.21: 選択肢ごとのトレースラインの例( Q1_3) 心理尺度項目では,各選択肢は順序変数になっています。ということは良い項目の場合,図 4.21 のように,各選択肢のピークが順番に並ぶはずです。もしも X 軸の値に関係なく「どちらでもな い」の選択率が高い,といった事があれば,その項目では潜在特性以外の何かしらの理由で「ど ちらでもない」を選択している人が一定数いそうだ,ということを確認したりはできると思い ます。 学力テストの場合は,ふつう選択肢に順序関係はありません。したがって,「どの選択肢が誤 答として良く働いているか」や「下位層が特に引っかかりやすい誤答選択肢がないか」など,選 択肢レベルでの詳細な検討を行うことが出来るわけです。 4.4 信頼性と妥当性の考え方 デジタル体重計を開発する場合には,必ず出荷前に品質チェックを行うでしょう。その内容は きっと「10kg のおもりを載せた時にきちんと 10kg と表示するか」や「様々な環境下で測定して

35.

4.4 信頼性と妥当性の考え方 も安定して同じ重さを表示できるか」といったものだと推測されます。 これと同じように心理尺度の開発においても品質チェックが重要になります。構成概念という 目に見えないものを測定しようとする心理尺度の場合,そのチェックは難解を極めます。例えば 「10kg のおもり」のように客観的にみて正しいと証明されている基準がないことや,通常複数の 項目の集合で単一の構成概念を測定すること,測定の安定性を脅かす要因が多様であることなど があるために,完全な形での品質チェックはほぼ不可能と言っても過言ではありません。 測定の質は,大きく分けると妥当性 (validity) と信頼性 (reliability) という 2 つの概念のも とで議論されます。簡単に言うと,妥当性は「測定値が,測定しようとしている構成概念を正し く表した値か」の程度です。例えば「デジタル体重計」という名前で身長を測定する機械があっ たとすると,これは明らかに妥当性がありません。さすがに体重計と身長計を間違えることは無 いでしょうが,心理尺度の場合,なにせ構成概念が目に見えないので, 「外向性」のつもりで作っ た尺度が実は「攻撃性」を測定していた,ということが起こる可能性はゼロとは言えないのです。 一方,信頼性は「測定値が,一貫して同じ値を表しているか」の程度です。例えば同じ人なの に乗るたびに表示される値が変わる体重計や,同じメーカーの同じ型番の体重計なのに物によっ て表示される値が変わる体重計があっても,その結果を信頼することは出来ません。心理尺度で も同じことが言えます。 妥当性と信頼性は完全に独立した概念ではありません。これらの関係性は,良く図 4.22 のよ うなダーツのアナロジーによって説明されます。赤いマル一つ一つがダーツの刺さった場所を表 していると考えてください。ダーツ本来の目的である「真ん中に当てる」ということが,心理尺 度でいう「測定しようとしている構成概念を測定する」に相当します。真ん中に近いほど測定し ようとしているものに近い,ということですね。 図 4.22: ダーツのアナロジー(信頼性と妥当性の関係) 図 4.22 の一番左は,信頼性も妥当性も低いパターンです。毎回あっちへ行ったりこっちへ行っ たりで,測定が全く安定していません。毎回ぜんぜん違う結果が出てくるので,特定の回で見れ ばたまたま測定したい真の値に近い結果が出ることもあるかもしれませんが,結局いつ当たった かがわからない以上使い物にはならないでしょう。 図 4.22 の真ん中は,信頼性は高いが妥当性は低いパターンです。 「デジタル体重計」という名 前で身長を測定する機械があれば,これに該当するでしょう。毎回ほぼ同じ値を返してくるが, 35

36.

4.5 妥当性の検証 36 毎回「測定しようとしているもの」とは異なる値を返している,という状態です。この場合は, 元々想定していた名前の尺度としては使えないかもしれませんが,もしこの尺度が本当は何を測 定していたかがわかれば,(マト自体をうごかしてやることで)別の尺度としては使えるように なるかもしれません。 図 4.22 の一番右は,信頼性も妥当性も高いパターンです。この状態に持っていくことができ れば,いつどこで測定しても安定して「測定しようとしている構成概念」を測定できるため,安 心して心理尺度を利用することが出来ますね。 ということで,心理尺度を作成・利用する際には,信頼性も妥当性も高くないといけないとい うことがわかりました。また,ダーツのアナロジーからは信頼性は妥当性の必要条件だというこ とがわかります。つまり「妥当性が高いのに信頼性が低い」というケースはあり得ない,という ことです。 また,妥当性・信頼性を考える際に注意しなければいけないのは,妥当性・信頼性は尺度自体が 持つ性質ではなく,尺度得点に関する性質として評価されるという点です(Streiner & Norman, 2008)。Chapter 1 では,心理尺度が翻訳や時代の変化によって変質してしまう危険性を指摘し ました。つまり,ある集団において「良い」と判断された尺度があったとしても,それが自分の 集めたサンプルについても「良い」尺度であるかどうかはわからない,ということです。した がって,先行研究ですでに妥当性や信頼性が検証済みの尺度を利用する場合でも,基本的には自 分で集めたデータにおける妥当性・信頼性は改めて評価する必要があると言えるでしょう。もち ろん,先行研究で検証に使用されたサンプルの母集団と,自分が利用するデータの母集団が(測 定したい内容に関して)概ね同じであることが示せるならばいちいち再評価する必要はありませ ん。まとめると,どこかから尺度を探して利用する場合には,妥当性・信頼性は改めて評価する 必要があるかよく考える必要があるということです。 それでは,ここからは具体的に妥当性・信頼性を検証するための方法について見ていきま しょう。 4.5 妥当性の検証 妥当性の考え方は,未だにちょくちょく変化しています。その歴史的な変遷については例えば 村山(2012)や Streiner & Norman(2008)などが詳しいですが,妥当性の考え方自体にトレン ドのようなものがあり,「これぞ」という万人が納得できる答えはまだ見つかっていません。そ してこのあたりの話には科学哲学も入り込んでくるかなり複雑な話になるため,ここでは深く取 り上げないことにして,まずは現代の妥当性の主流となっていると思われる Messick(1995)の 考え方を紹介します*15 。 *15 妥当性に関する議論については他にも,Borsboom et al.(2004)や Borsboom(2005 仲嶺監訳 2022)など も参考になると思います。

37.

4.5 妥当性の検証 4.5.1 妥当性の考え方 もともと心理学界隈では,妥当性にはいくつかのタイプが存在すると考えられていました (村山,2012) 。 1つ目は基準連関妥当性 (Criterion-related Validity) です。これは,ある尺度によって測 定された得点が,すでにその効果を認められている外的な基準とどの程度相関しているかによっ て評価されます。何かを測定するための方法が確立しているが測定自体が大変(お金や時間がか かる,などの)ときに,それよりも簡便な方法で同じものが測定できたら嬉しい,という考えが 背景にあります。例えば認知症の診断を行う場合には,MRI を撮って脳の萎縮度を見ればほぼ確 実な診断ができますが,これには相当なお金がかかってしまいます。もしもこれが,認知機能を 測るいくつかの質問項目でほぼ同等の診断ができるとしたら,とても嬉しいわけです。つまり, 基準連関妥当性では,尺度を別の測定の代理変数 (proxy) として考えている節がありそうです。 2つ目は構成概念妥当性 (Construct Validity) です。基準連関妥当性の考え方と比べると, 構成概念妥当性では,ある尺度によって測定された得点を,その背後にある構成概念の顕在化し た指標という感じで考えます。そして,構成概念の世界において理論的に導出される仮説に合致 する結果が得られた場合に,「確かにその尺度は想定していた構成概念を測定する尺度なんだ」 と言えるわけです。例えば「きょうだいの数」が多いほど大人になったときの「外向性」が高い, というナントカ理論が存在したとします。このとき,「外向性」を測定するために作成した(が まだ本当に外向性を測定できているかわからない)尺度の得点と「きょうだいの数」に強い正の 相関が見られたとしたら,この尺度はたしかに「外向性」を測定出来ている気がしてきます。も ちろん,このたった一つの結果だけで尺度の妥当性が示せるわけではないですが,このような要 領で,構成概念の世界において理論的に導出される様々な仮説を一つ一つ検証していくことで, その尺度が「もともと測定したかったもの」を表している可能性が高められていくわけです。俗 に「収束的妥当性 (Convergent validity)」や「弁別的妥当性 (Discriminant validity)」と呼ばれ るものは,「相関が高い(低い)構成概念の間では,それらを測定する尺度同士の得点も相関が 高い(低い)はず」という構成概念妥当性の考え方にもとづいたものです。 3つ目は内容的妥当性 (Content Validity) です。これは,構成概念妥当性と同様に,ある尺 度は特定の構成概念を測定するためのものとして考えます。ですが,内容的妥当性では「他の構 成概念との関係」などではなく,その尺度自体の内容から妥当性を判断します。具体的には尺度 の項目セットが,構成概念が指し示すあらゆる現象の全体からまんべんなく・過不足なくサンプ リングされたものであれば「内容的妥当性が高い」と判断することが出来ます。例えば「高校数 学の理解度」を評価するための(大学入試の)数学のテストでひたすら連立方程式問題ばかりが 出題されたとしたら,これは「高校数学の理解度」と言うよりは「連立方程式の理解度」になっ てしまいます。このような場合には,内容的妥当性が低いと判断されてしまうわけです。 以上のように,妥当性には基準連関妥当性,構成概念妥当性,内容的妥当性の3つのタイプが ある,と長らく考えられてきました。しかしこの考え方は一方で「この3つの妥当性をそれぞれ クリアしたら良いんだな」というように,妥当性検証のプロセスをスタンプラリー化してしまっ た(Landy, 1986)といった批判を生み出してしまいます。 こうした批判を踏まえて Messick(1995)は,妥当性とは「構成概念妥当性」そのものである 37

38.

4.5 妥当性の検証 という主張をしました。つまり妥当性を「尺度得点の意味や解釈に関する様々な証拠を統合した もの」と定義したわけです。ここで重要なのは,妥当性が尺度得点をつかって行う解釈や推論が どれだけ信頼できるものかを表すための指標として考えられている点です。そしてこの定義に従 うと,基準連関妥当性や内容的妥当性はいずれも,(構成概念)妥当性を示す傍証の一つとして 考えることが出来ます。その意味で,これらは妥当性の「基準連関的証拠」や「内容的証拠」と 呼ばれることがあります。 Messick の考え方では,妥当性の証拠としてどのようなものが重要視されるかは,尺度の目的 などによって変わります。例えば「同じ構成概念を少ない項目数で測定したい」という短縮版尺 度の目的からすると,元の尺度との相関によって示される「基準連関的証拠」が重要になるで しょう。一方で,学力テストのように総合的な能力を評価したい尺度では,専門家などによって 内容的側面の評価が重要になるはずです。このように,本来妥当性の評価は「お決まりのパター ン」があるわけではなく,目的と対象に応じて必要な証拠を収集していく作業です*16 。 といった議論を踏まえて,ここからはアメリカ心理学会が発行している「テストスタンダー ド*17 」(American Educational Research Association et al., 2011)に掲載されている妥当性の 証拠のパターンについて紹介したいと思います。 内容について 内容に関する証拠 (Evidence based on test content,内容的妥当性とも呼ばれる) は,データ から確認するというよりも,尺度作成時の手続きに関する話です。構成概念および下位概念の定 義を明確にした上で,その定義を満たすと考えられる内容に関する項目をきちんと用意する必要 があり,その手続きに関して論文などの中での説明が求められます。いわゆる「複数の専門家に よって議論した」であったり,項目案を先行研究から引用したり,という話は,この点をクリア するために必要な記述,というわけですね。 認知的なこと 回答過程に関する証拠 (Evidence based on response processes) は,回答者が各項目に対して, 作成者の想定していた通りに「測定しようとしている構成概念」のことを考えていたか,といっ た側面のことです。テストスタンダード内でもこの点に関する記述はかなり少なく,また実際の 論文などでこの側面に関して妥当性検証を行っているものは見たことが無い(かなり少ない?) のですが,検証する方法として Cognitive interview(e.g., Beatty & Willis, 2007; Peterson et al., 2017)といった方法があるようです。例えば「回答中に, (構成概念)についてどのようなこ とを考えていましたか?」と言った内容を事後的にインタビューする方法のようです。かなり大 変そうですね… *16 まあそんなものは理想論なのかもしれません。妥当性の定義についても未だに議論は尽きません。重要なのは, 先行研究のやり方が常に正しいと思うな,もっと良い妥当性の証拠はあるかもしれないぞと常に考え続けること なのかもしれません…。 *17 2024 年現在,改訂作業が進んでいるとのことなので,数年後にはまた変わっているかもしれません。 38

39.

4.5 妥当性の検証 内部構造 内部構造に関する証拠 (Evidence based on internal structure,因子妥当性とも呼ばれる) は, いわゆる「因子構造」のことを指していると思われます。事前に因子の構造(下位概念)につい て仮定を置いて項目を作成した場合には,因子分析をした結果,項目が想定通りの分かれ方をし ていれば良さそうな気がする,ということです。この視点に関連する分析(因子分析)の結果を 「妥当性の証拠」という位置づけで提示する研究は心理学ではあまり見られないですが,マーケ ティング系などでは割と用いられている気もします*18 。「構成概念をこう定義して,下位概念と してこれとこれがあると考える」という仮定のもとで,項目が実際に下位概念と適合する形で分 かれるようであれば,妥当性の傍証にはなりそうです*19 。 また,もしも特定の属性の人では異なる挙動を示す項目(特異項目機能: DIF, Differential Item Functioning)や尺度があったとすると,これは妥当性を脅かす要因の一つになりえます。 DIF の対象となりうる属性の例としては,年齢や性別,人種や宗教など様々なものが考えられま す。DIF が発生しそうな項目の例も挙げておきましょう。例えば「他者に助けを求める傾向」と いう尺度の中に「苦しいときには神に祈る」という項目があったとします。項目作成者としては 「他者に助けを求める傾向が強いほど,神にもすがるようになるだろう」という感覚で項目を作 成したとしても,実際にはたぶん宗教観によってその回答は大きく変わるでしょう。本来,尺度 項目への回答は想定される構成概念(因子)の強さのみによって規定されるべきですが,DIF が ある場合にはこれに加えて特定の属性が影響を与えていると考えられます。すなわち,その特定 の属性が意図していなかった因子として因子構造に混ざってしまっている,という状態です。先 程の例で言えば,その項目だけが「他者に助けを求める傾向」と「宗教観」という 2 つの因子の 影響を受けてしまっている,ということになり,これは当初想定していた因子構造から逸脱して しまっている状態です。こういったことがないかを確認するために,分析の際にはデータを属性 ごとに分割してそれぞれで分析を行ったり,SEM の枠組みの中で多母集団同時分析を行ったり するわけですね。 他の変数との関係 他の変数との関係に関する証拠 (Evidence based on relations to other variables,基準連関妥 当性とも呼ばれる) は,たぶん妥当性検証の中では最もよく提示される証拠です。概念的に関連 があると考えられる別の尺度や指標との相関が高いこと(収束的証拠)や,概念的に関連がない と考えられるものとの相関が低いこと(弁別的証拠)をもって,妥当性の証拠とします。 先程説明した通り,比較対象の変数は,心理尺度に限りません。例えば「外向性」の妥当性検 証であれば,「SNS の友だちの数」や「直近 1 年で何回パーティーに行ったか」といった行動指 標なども考えられるでしょう。むしろ心理尺度どうしの相関では,両方の変数の誤差項には共通 の「自己申告によるバイアス」が含まれることで,誤差項同士が相関してしまう可能性があり ます。その結果,本当の相関よりも過大に推定されてしまうかもしれません(common method *18 因子分析や SEM の結果から CR や AVE と言われる指標を算出し,これが所定の値より高いことをもって「収 束的妥当性が示された」という書き方をしているものがちょくちょく見られます。 *19 もちろん,下位概念の構造を含めてそっくりそのままコピーしたような別の構成概念が存在している可能性は否 定できません。つまり CR や AVE だけで満足しているものは正直言うと「不十分」だと思っています。 39

40.

4.6 信頼性の検証 40 bias, Podsakoff et al., 2003)。そういった意味で,心理尺度以外の変数(特に行動指標)との関 連を考えてみるのも良いでしょう。 また,「予測」という観点でもこの妥当性は重要な意味を持ちます(予測的妥当性)。例えば入 社試験での性格検査は,「外向的な性格のひとだから営業に配属しよう」的な意思決定を行うた めに利用されているかもしれません。言い換えると,この性格検査には,最もパフォーマンスが 良くなる配属先を予測する機能が求められていることになります。この場合,性格検査が「測定 しようとしている構成概念を測定できている」ことよりも,「それによって将来のパフォーマン スが予測できている」ことのほうが重要になります。この場合,やることとしては尺度得点と「1 年後の営業成績」の相関を見るということで,やることは先程と同じですが妥当性の観点は異 なっていたりします。 4.5.2 まとめ 妥当性を検証する最良の方法,というものは見つかっていません。というか多分一つに決める のは不可能です。したがって,上に紹介したような妥当性検証の方法についても,お決まりの ルーティーン実行したら十分(スタンプラリー)というわけではなく,可能であれば複数の観点 から検証した上で「これだけ証拠が出揃ってるんだからいいだろう」的なスタンスで行くことが 望ましいですね。 4.6 信頼性の検証 信頼性は,妥当性よりは統計的に評価することが出来ます。そのために,古典的テスト理論 (Classical Test Theory [CTT]: Lord & Novick, 1968)に基づく以下のモデルを考え ます。 𝑥=𝑡+𝑒 (4.1) (4.1) 式において,𝑥 は実際に観測される得点を,𝑒 は測定誤差を表します。そして 𝑡 は真値と呼 ばれます。言い換えると 𝑡 こそが「測定しようとしている構成概念」を直接的に反映した値であ る,ということです。理想的には,真値 𝑡 のみによって回答値が決まれば良いのですが,それに 対して何らかの測定誤差が混ざることで,実際に観測される得点が決まる,という状況を仮定し ています。 このモデルにおける重要な(そして自然に受け入れられる)仮定として,真値と測定誤差は無 相関ということが置かれます。したがって,観測値 𝑥 の分散は 𝜎𝑥2 = 𝜎𝑡2 + 𝜎𝑒2 (4.2) というように,真値と測定誤差の分散の単純な和として表すことができます。このとき,信頼性 係数 𝜌 は 𝜌= 𝜎𝑡2 𝜎𝑒2 = 1 − 𝜎𝑥2 𝜎𝑥2 (4.3)

41.

4.6 信頼性の検証 41 と表すことができます。つまり,観測変数の分散に占める真値の分散の割合ということです。も ちろん実際に知ることができるのは観測値の分散 𝜎𝑥2 だけであり,真値の分散 𝜎𝑡2 を知ることは できません。 以下で紹介する信頼性係数の求め方は,このような仮定のもとで,信頼性係数 𝜌 を直接求めよ うとしています。いくつかの方法があるのですが,測定誤差として何を取り上げているかが方法 によって異なるので,その点には少し注意が必要です。なお,ここから先の説明については岡田 (2015)を拝借しています。 INFO 妥当性の定式化 4.2 式の要領で妥当性を定式化する方法も一応存在しています。CTT では,観測得点を 「真値」と「誤差」に分解していましたが,このうち「誤差」をより詳細に見ていくと, 「系統誤差 (systematic error)」と「偶然誤差 (random error)」に分けることが出来ます (Maruyama & Ryan, 2014) 。 系統誤差とは,繰り返し測定を行った場合に測定値を常に一定方向に動かすような誤差で す。例えば体重計が壊れていて常に実際の体重よりも 5% 大きな値を表示してしまう場合 を考えてみます。この体重計では,同じ人が何回乗っても必ず実際の体重より少し大きな 値が出てしまっているわけなので,これは系統誤差にあたります。 一方偶然誤差とは,繰り返し測定を行った場合に測定値が毎回ランダムに変動してしまう ような誤差です。体重計で言えば,「乗るたびに表示される値が変わる」程度を指してい ます。 ポイントは,真値と偶然誤差が無相関であるように,系統誤差と偶然誤差も無相関である 2 という点です。これを踏まえると観測値の分散は,系統誤差による分散 𝜎𝑆𝐸 と偶然誤差に 2 よる分散 𝜎𝑅𝐸 を用いて (4.2) 式からさらに以下のように分解することが出来ます。 𝜎𝑥2 = 𝜎𝑡2 + 𝜎𝑒2 2 2 = 𝜎𝑡2 + 𝜎𝑆𝐸 + 𝜎𝑅𝐸 ここで信頼性の定義に立ち返ってみると,信頼性とは「測定値が,一貫して同じ値を表し ているか」の程度でした。この観点から言うと,常に同じだけ値をずらす系統誤差は信頼 性に影響がないことがわかります。したがって,信頼性は 𝜌= 2 𝜎𝑡2 + 𝜎𝑆𝐸 𝜎2 = 1 − 𝑅𝐸 2 𝜎𝑥 𝜎𝑥2 と表すことが出来ます。一方で,妥当性は「測定値が,測定しようとしている構成概念を 正しく表した値か」の程度なので,系統誤差であってもそのズレは許容されません。した がって,妥当性は 𝜌= 𝜎2 + 𝜎2 𝜎𝑡2 = 1 − 𝑆𝐸 2 𝑅𝐸 2 𝜎𝑥 𝜎𝑥 と表すことができるわけです。 4.3 式では,信頼性を観測変数の分散に占める真値の分散の割合として表しました。しかし

42.

4.6 信頼性の検証 42 実際には真値と系統誤差は区別できないことが多いのです。例えば体重の真値がわからな いときに,ある体重計が「乗るたびに値が変わる」ことはわかっても, 「常に 5% 大きな値 を示している」ことを証明するのはかなり難しいでしょう。なのですが,信頼性の定義か らすると,系統誤差の有無は実用上問題ではありません。そのため,この後紹介する信頼 性の評価方法においても,系統誤差は無視して扱っています。 4.6.1 (平行テスト法) はじめに,真の信頼性係数 𝜌 を求めるための「理想」のお話を少しだけしておきます。真の信 頼性係数 𝜌 を求めるためには,真値と誤差分散が同じ 2 つのテスト(平行テストと呼ぶ)を独立 に実施する必要があります。平行テストがある場合,2 つのテスト得点 𝑥1 および 𝑥2 はそれぞれ 𝑥1 = 𝑡 + 𝑒1 𝑥2 = 𝑡 + 𝑒2 (4.4) と置くことが出来ます。この 2 つのテスト得点の共分散 𝜎𝑥1 𝑥2 は,真値と測定誤差は無相関で あり,また独立に実施しているならば異なるテストの真値と測定誤差も無相関 (𝜎𝑡,𝑒2 = 𝜎𝑒1 ,𝑡 = 𝜎𝑒1 ,𝑒2 = 0) になるはずなので, 𝜎𝑥1 ,𝑥2 = 𝜎(𝑡+𝑒1 ),(𝑡+𝑒2 ) = 𝜎𝑡,𝑡 + 𝜎𝑡,𝑒2 + 𝜎𝑒1 ,𝑡 + 𝜎𝑒1 ,𝑒2 (4.5) = 𝜎𝑡2 となり,結果的に真値の分散に一致します。また,誤差分散が同じであれば,2 つのテストの 得点の分散は一致する(𝜎𝑥2 1 = 𝜎𝑥2 2 = 𝜎𝑥2 )ため,真の信頼性 𝜌 は 𝜎𝑡2 𝜎𝑥2 𝜎𝑥1 ,𝑥2 = 𝜎𝑥1 𝜎𝑥2 𝜌= (4.6) = 𝑟𝑥1 ,𝑥2 ということで,2 つのテスト得点の相関係数に一致するため,理論上は計算可能となるわけです。 4.6.2 再テスト法 ただ,真値と誤差分散が同じ 2 つのテスト・心理尺度なんていうものは,言い換えると内容は 異なるが平均点および分散が全く同じテスト・尺度ということであり,そう簡単には作れませ ん。そこで,同じテスト・尺度を 2 回実施するという考えが浮かんできます。これならば,当然 内容は全く同じなので平行テスト法の条件は満たされているといえます。 心理尺度の場合,この再テスト法でもそれなりに妥当に信頼性を測定できるような気がしま す。しいて言えば,2 回間隔をあけて同じ人に実施することのコストがかかりますが,それさえ クリアできれば…という感じです。

43.

4.6 信頼性の検証 43 学力テストの場合,同じ問題のテストを 2 回実施するのはほぼ不可能です。出題がネタバレし ているテストならば,事前準備が容易なため 2 回目の方がほぼ確実に得点が高くなってしまうで しょう。ということで再テスト法もできそうにない,ときました。さてどうしようか… 4.6.3 折半法 1 回のテストで平行テストみたいなものを 2 つ用意するために,大昔には 1 つのテストを 2 つ に分けるという考え方が用いられていました。1 つの尺度ならば,うまいこと半分に分ければ平 行テストに見えなくもない気がします。この折半法では,2 つに分けたときのそれぞれの得点の 相関 𝑟𝑥1 ,𝑥2 について,スピアマン・ブラウンの公式にもとづいて,信頼性を 𝜌𝑠ℎ = 2𝑟𝑥1 ,𝑥2 1 + 𝑟𝑥1 ,𝑥2 (4.7) と計算します。 平行テスト法および再テスト法では,真値 𝑡 は尺度全体の真値を,誤差分散 𝑒 には尺度の外側 にある余計なものを想定していました。これに対して折半法での信頼性は,真値 𝑡 は尺度の半分 の真値(尺度の中で共通の成分)を,誤差分散 𝑒 には尺度の中の項目間(前半と後半)で異なる 成分を表している,と見ることが出来ます*20 。その意味では真の信頼性 𝜌 とはちょっと意味合 いが異なるのですが,ひとまず折半法によって,1 回のテストから信頼性係数が求められるよう になった,ということでこの方法が一時期スタンダードだったわけです。ちなみに,折半法的な 意味での信頼性は内的一貫(整合)性などと呼ばれたりします。 ただ,当然ですが折半法では尺度の分け方によって信頼性係数の値が変わってしまいます。こ れは Science としてはあまりよろしくないですね。特に現代のコンピュータを使えば,全ての分 け方を試した上で最も高い値を示す分け方で信頼性を主張してしまうことも可能でしょう。これ は良くないということで,全ての分け方で算出される 𝜌𝑠ℎ の平均値として,KR-20(Kuder & Richardson, 1937)と呼ばれる公式が提案されました。これならば分け方の恣意性は無視できる ようになります。ただし KR-20 は二値項目にしか適用できない公式だったため,このままでは リッカート式の尺度などには使えません。 4.6.4 クロンバックの 𝛼 係数 現在最も広く用いられている 𝛼 係数(Cronbach, 1951)は,KR-20 を多値項目でも使えるよ うにクロンバックが一般化したものです。𝑛 項目の尺度に対する 𝛼 係数の計算式は 𝑛 2 ∑ 𝜎𝑥 𝑛 𝛼= (1 − 𝑖=12 𝑖 ) 𝑛−1 𝜎𝑥 (4.8) となっており,これが KR-20 と同様に全ての分け方で算出される 𝜌𝑠ℎ の平均値になっています。 𝛼 係数は今でも様々な論文で利用されているものですが,様々な批判もあります。 *20 なおスピアマン・ブラウンの公式は,尺度の半分に対する信頼性 𝑟 𝑥1 ,𝑥2 を補正することで,尺度全体での信頼 性を求めようとしています。その点はちゃんと気をつけています。

44.

4.6 信頼性の検証 44 • 𝜌 の下界の一つであるため,ほぼ確実に 𝜌 を過小推定する*21 • 項目数が多いほど大きな値になりやすい=項目数の影響を受ける • 一次元性の指標とはいえない側面がある 3 点目については,図 4.23 にあるように,実際には尺度が一次元ではなさそうな場合でも,𝛼 係数だけを見ていては判断できないケースがある,ということです。現在でも多くの論文が 𝛼 係 数だけを見て「一次元性が確認された」などと供述していますが,実際には 𝛼 係数は一次元性の 必要条件にすぎず,もうすこし詳細な確認をすべきだと言えます。 図 4.23: 𝛼 係数と一次元性(岡田,2015, Table 1) そんな 𝛼 係数に変わって,現在では 𝜔 係数などの信頼性係数や,SEM に基づく方法,一般化 可能性理論と呼ばれる理論に基づく方法が提案されています。ただここで説明している余裕と事 前知識が不足しているため,後ほど因子分析の回において 𝜔 係数を紹介します。 *21 一応,尺度全体において,項目レベルで (本質的) タウ等価(タウ,つまり真値が同じか,個人によらず一定の ズレがある状態)であれば,𝛼 係数は真値 𝜌 に一致するのですが,そうでない場合は,𝜌 を過小推定することが 知られています。

45.

4.6 信頼性の検証 とはいえ 𝛼 係数はまだ現役で使われている方法なので,ここでも 𝛼 係数の使い方を紹介して おきます。R では psych::alpha() という関数があります。今回のように一因子ではなく複数 の因子がある尺度の場合は,25 項目全てではなく各因子ごとに alpha() 関数を適用し,それぞ れで出た値を報告するようにしましょう。 alpha 係数を計算する 1 2 3 4 5 6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 # もしまだ読み込んでいなければ # library(psych) # 第一因子の5項目についてalpha() # 残りの因子についても,コードは省略していますがチェックしておいてください。 alpha(dat[, paste0("Q1_", 1:5)]) Reliability analysis Call: alpha(x = dat[, paste0("Q1_", 1:5)]) raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r 0.71 0.72 0.69 0.34 2.6 0.0092 4.6 0.91 0.35 95% confidence boundaries lower alpha upper Feldt 0.7 0.71 0.73 Duhachek 0.7 0.71 0.73 Reliability if an item is dropped: raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r Q1_1 0.73 0.74 0.68 0.41 2.8 0.009 0.0061 0.39 Q1_2 0.63 0.64 0.59 0.31 1.8 0.012 0.0167 0.30 Q1_3 0.61 0.63 0.57 0.30 1.7 0.013 0.0089 0.34 Q1_4 0.69 0.70 0.66 0.37 2.4 0.010 0.0155 0.37 Q1_5 0.66 0.67 0.62 0.34 2.0 0.011 0.0126 0.35 Item statistics n raw.r std.r r.cor r.drop mean sd Q1_1 2432 0.59 0.58 0.39 0.32 4.6 1.4 Q1_2 2432 0.73 0.75 0.67 0.57 4.8 1.2 Q1_3 2432 0.77 0.77 0.72 0.60 4.6 1.3 Q1_4 2432 0.67 0.64 0.49 0.41 4.7 1.5 Q1_5 2432 0.69 0.70 0.60 0.50 4.5 1.3 Non missing response frequency for each item 1 2 3 4 5 6 miss Q1_1 0.03 0.08 0.12 0.14 0.30 0.33 0 45

46.

4.6 信頼性の検証 32 33 34 35 Q1_2 0.02 0.05 0.06 0.20 0.37 0.32 Q1_3 0.03 0.06 0.07 0.20 0.36 0.27 Q1_4 0.05 0.08 0.06 0.16 0.24 0.41 Q1_5 0.02 0.07 0.09 0.22 0.35 0.25 46 0 0 0 0 出力を上から見ていきましょう。 2-6 行目 ( Reliability analysis) 各種信頼性係数の指標です。基本的には最初の 2 つの alpha を見ておけば OK です。 raw_alpha データの共分散行列から普通に計算した 𝛼 係数です。本来的な定義(4.8 式)はこ ​ ​ れなので,基本的にはこれを報告しておけば OK です。 std.alpha 共分散行列の代わりに相関行列を用いて計算した 𝛼 係数です。例えば特に項目ご ​ ​ とに最大値・最小値が一定ではないような場合,取りうる値の幅が大きい項目のほうが分 散も大きくなるため,𝛼 係数にかかる重みが極端に大きくなってしまいます。このような 場合には,項目の重みを揃えるため,相関行列を用いたこちらの 𝛼 係数を報告するほう が良いかもしれません。ただしリッカート尺度の場合はふつう最小値・最大値は同じなの で,raw_alpha と極端に異なるケースは,天井・床効果が発生している場合を除けばほぼ 無いと思います。 INFO その他の出力の解説 気になる人もいるかもしれないので解説しておきます。左から G6(SMC) 俗にガットマンの 𝜆6(Guttman, 1945)と呼ばれる指標です。各項目について ​ ​ 「それ以外の項目で重回帰分析した際の重相関係数」をもとに計算する指標です。重 相関係数が高いということは,その項目が「他の項目との相関が高い」ことを意味 するため,これも内的一貫性の指標になっています。が,𝛼 係数を報告しておけば 十分です。 average_r 項目間相関の平均値です。5 項目ならば 5 𝐶2 = 10 通りの相関があり,その ​ ​ 平均値です。 Signal/Noise 比です。上の average_r を 𝑟 とすると,𝑛𝑟/(1 − 𝑟) で計算されてい s/n ​ ​ ます。 𝛼 係数の漸近標準誤差 (asymptotic standard error) だと思われます。 ase ​ ​ mean 項目レベルでの平均値です。 ​ ​ sd ​ ​ 項目レベルでの標準偏差です。 median_r 項目間相関の中央値です。 ​ ​ 8-11 行目 ( 95% confidence boundaries) raw_alpha の 95% 信頼区間です。どちらの方法でも別にかまわないですが,余裕があればい ずれかの信頼区間を報告するようにしましょう。 13-19 行目( Reliability if an item is dropped)

47.

4.6 信頼性の検証 47 1 項目を除外した時に各種指標がどう変化するかを表しています。今回の場合,raw_alpha を 見ると Q1_1 だけは 5 行目に表示されているものよりも高い値を示しています。つまりこの場 合,統計的には Q1_1 は除外したほうが内的一貫性は高まる,ということです。ただ,実際には これを見て機械的に項目を除外するのではなく,内容面などを吟味した上で削除するかを決定し ましょう。図 4.24 のように,特定の項目が他の項目と相関が低いとしても,内容的にその項目 が無いと構成概念の全要素をカバーしているとは言えなくなるような項目であれば,除外せず残 したほうが妥当性は高い可能性があります*22 。今回の場合は,raw_alpha も大した改善ではな いので,このまま残して分析を進めることにします。 図 4.24: 項目と構成概念の関係 21 行目以降( Item statistics および Non missing response frequency for each item) 項目ごとの要約統計量および各カテゴリの選択率です。まあ,説明することも無いでしょう。 ちなみに,23-27 行目の一番左の raw.r はピアソンの積率相関係数として計算した場合の I-T 相 関を指しています。 4.6.5 信頼性係数の基準 信頼性係数は,その定義から 0 ≤ 𝜌 ≤ 1 の値を取ります。直感的には,1 に近いほどよい感じ がしますね。実際に,平行テスト法や再テスト法的な意味での 𝜌 は,1 に近いほど良い指標です。 一方で,内的一貫性としての信頼性係数は,1 に近すぎるとかえって良くないとされています。 というのも,「内的一貫性」という言葉から想像できるように,𝛼 係数が 1 になるのは全ての項 目が全く同じものを測定しているような場合です。言い換えると,全ての項目間の相関係数が 1 の場合になります。相関係数が 1 ということは,一方の値によってもう一方の値が完全に説明可 能な状態にあるため,実質的に 1 項目の回答だけわかれば尺度内の残りの全項目の回答が分かっ てしまう状態です。つまり 1 項目だけあれば十分であり,尺度として何項目も用意した意味がな くなってしまうことになります。本来,構成概念の多くは普通に 1 項目で聞いただけでは十分に 測定できないために,その構成概念を表す様々な側面に関する質問を重ねることによって,その 共通成分としてあぶり出そうとしています。それなのに 1 項目分しか機能していないとしたら, それは尺度の失敗と言っても良いでしょう。 *22 たぶんその場合は,下位概念を導入して複数因子の構造を考えるのが良いかもしれませんね。

48.

4.6 信頼性の検証 一方,最低でもどの程度の信頼性が欲しいかですが,これも一貫した答えはまだありません。 𝛼 係数について言えば,項目数の影響を受けるため,一概にどれだけあれば良い,という話は出 来ないはずです。世間では 0.7 だの 0.8 だの 0.9 だの言っている人がいるようですが,最終的に は信頼性も連続的な指標のため,明確な閾値を考えるよりは,ありのままの値を報告するくらい の気持ちでいたほうが健全だと思います。…とはいいつつ「少なくとも 0.7 くらいは欲しいか なぁ」という個人的な気持ちもあったりしますが… ということで,各項目の分析および尺度の信頼性(・妥当性)のチェックが無事完了したら, いよいよ分析の本編に進むことができます。次の Chapter では,まずその先で紹介する因子分 析・構造方程式モデリング・項目反応理論に通底する「回帰分析」の考え方についておさらいし ながら,記法の導入などをしていきます。 最後に保存 1 saveRDS(dat, "chapter04.rds") 48

49.

49 参考文献 参考文献 American Educational Research Association, American Psychological Association, & National Council on Measurement in Education (Eds.). (2011). Standards for educational and psychological testing. American Educational Research Association. Beatty, P. C., & Willis, G. B. (2007). Research synthesis: the practice of cognitive interviewing. Public Opinion Quarterly, 71(2), 287–311. https://doi.org/10.1093/poq/nf m006 Borsboom, D. (2005). Measuring the mind: conceptual issues in contemporary psychometrics. Cambridge University Press. (ボースブーム,D. 仲嶺 真(監訳)仲嶺 真・下司 忠大・三枝高大・須藤 竜之介・武藤 拓 之(訳) (2022) .心を測る: 現代の心理測定における諸問題 金子書房) Borsboom, D., Mellenbergh, G. J., & van Heerden, J. (2004). The concept of validity. Psychological Review, 111(4), 1061–1071. https://doi.org/10.1037/0033-295X.111.4.1061 Cronbach, L. J. (1951). Coefficient alpha and the internal structure of tests. Psychometrika, 16(3), 297–334. https://doi.org/10.1007/BF02310555 Guttman, L. (1945). A basis for analyzing test-retest reliability. Psychometrika, 10(4), 255–282. https://doi.org/10.1007/BF02288892 Kuder, G. F., & Richardson, M. W. (1937). The theory of the estimation of test reliability. Psychometrika, 2(3), 151–160. https://doi.org/10.1007/BF02288391 Landy, F. J. (1986). Stamp collecting versus science: Validation as hypothesis testing. American Psychologist, 41(11), 1183–1192. https://doi.org/10.1037/0003-066X.41.11.1183 Lord, F. M., & Novick, M. R. (1968). Statistical theories of mental test scores. AddisonWesley series in behavioral science quantitative methods. Addison-Wesley. Maruyama, G., & Ryan, C. S. (2014). Research methods in social relations (8th ed.). John Wiley & Sons Inc. Messick, S. (1995). Validity of psychological assessment. American Psychologist, 50(9), 741–749. https://doi.org/10.1037/0003-066X.50.9.741

50.

参考文献 村山航(2012) .妥当性:概念の歴史的変遷と心理測定学的観点からの考察 教育心理学年報, 51, 118–130. https://doi.org/10.5926/arepj.51.118 岡田謙介(2015) .心理学と心理測定における信頼性について――Cronbach のα係数とは何な のか,何でないのか―― 教育心理学年報,54, 71–83. https://doi.org/10.5926/arepj.54.71 Peterson, C. H., Peterson, N. A., & Powell, K. G. (2017). Cognitive interviewing for item development: validity evidence based on content and response processes. Measurement and Evaluation in Counseling and Development, 50(4), 217–223. https://doi.org/10.108 0/07481756.2017.1339564 Podsakoff, P. M., MacKenzie, S. B., Lee, J.-Y., & Podsakoff, N. P. (2003). Common method biases in behavioral research: A critical review of the literature and recommended remedies. Journal of Applied Psychology, 88(5), 879–903. https://doi.org/10.1037/00219010.88.5.879 Streiner, D. L., & Norman, G. R. (2008). Health measurement scales: a practical guide to their development and use (4th ed). Oxford University Press. Sturges, H. A. (1926). The choice of a class interval. Journal of the American Statistical Association, 21(153), 65–66. https://doi.org/10.1080/01621459.1926.10502161 50