猫も杓子も構造化

発達障害、特別支援などについて書いています。最近は心理学関係の内容が多めです。

続・クロンバックのα

前回の記事で全ての折半法の平均がクロンバックのαであるということについて書いた。

nekomosyakushimo.hatenablog.com


今回は、内的整合性の意味をより理解するためにデータをいじって遊んでみる。

内的整合性とは乱暴に言えば、テストの中の項目がどれだけ同じ方向を向いているかを表している数値であるので、例えばテストの項目を逆転処理をすると信頼性係数は下がるはずだし、全部逆転処理すれば元の値と一致するはずである。

早速やってみる。

まず、逆転する項目を一つずつ増やしていくデータセットを作る。5件法なので6を引いて絶対値をとれば逆転される。

dat1 <- dat
dat1[,2] <- abs(dat[,2] - 6)  # 項目1を逆転したデータセット
dat2 <- dat1
dat2[ ,3] <- abs(dat[,3] - 6)  # 項目12を逆転したデータセット
dat3 <- dat2
dat3[ ,4] <- abs(dat[,4] - 6)  # 項目123を逆転したデータセット
dat4 <- dat3
dat4[ ,5] <- abs(dat[,5] - 6)  # 項目1234を逆転したデータセット

前回は計算式を直接書いたが、面倒なので信頼性係数を一発で出す関数を使う。ltmというパッケージに含まれる、cronbach.alpha()というのは信頼性係数を算出してくれる。(※データセットの1列目は氏名なので[,-1]で読み込まないようにしている)

cronbach.alpha(dat[,-1])  # オリジナルの信頼性係数
# alpha: 0.847
cronbach.alpha(dat1[,-1])  # 項目1だけ逆転
# alpha: 0.046
cronbach.alpha(dat2[,-1])  # 項目12を逆転
# alpha: -1.821
cronbach.alpha(dat3[,-1])  # 項目123を逆転
# alpha: 0.039
cronbach.alpha(dat4[,-1])  # 項目1234を逆転
# alpha: 0.847

項目を一つひっくり返しただけで大惨事である。まぁ項目が4つしかないわけだから言って見れば、全兵力の4分の1が一気に離反したようなもので、そりゃあ数値は下がるでしょう。項目の半分をひっくり返した場合だともはや訳のわからない数字になっている。しかし、全ての項目をひっくり返すと元の信頼性係数の値に戻る。

このことから、信頼性が妥当性を保証しないということの意味がよく分かる。というのは、オリジナルのデータセットと項目全てを逆転したデータセットでは、信頼性係数自体は一緒であるが、測定している概念は180度逆のものである。信頼性は何を計っているかについては何も教えてくれないのだ。

ちなみに、信頼性係数を算出する関数は他にもあり、psychパッケージに含まれるalpha()はより正確に情報を教えてくれる。例として、項目1だけ逆転したデータセットを読ませてみる。

library (psych)
alpha(dat1[,-1])  # 項目1だけ逆転

f:id:nekomosyakushimo:20171126104900p:plain

結果を見ると、「逆転項目の処理忘れてない?」という警告が出たり、SPSSの出力と同じように項目が削除された場合にα係数が出力される(図中の赤枠)。項目1が削除されるということは、離反した兵士たちが全員処分されたということであるので、軍に秩序が戻り信頼性係数が再び回復することを示している。

クロンバックのαについて

友人からクロンバックのαについて質問を受けてあれこれ調べたことの記録。

クロンバックのαとは信頼性係数の一つで内的整合性を表すものだとされている。テキストなどには信頼性係数の推定には(1)再テスト法、(2)平行テスト法、(3)内的整合性などがあるとされている。再テスト法には練習効果があるとか、平行テスト法は2つの検査が同じものであるという保証がないとか、それらの欠点も合わせて紹介されることが多い。

内的整合性の一つに折半法というものがあり、これは一つの検査の項目を半分に分けてそれらの相関係数をもとに信頼性係数を求める方法だと説明されるが、これも折半の仕方によって値が変わってしまうなど、その欠点が合わせて紹介されることが多い。そして、その欠点をカバーできるものとして、全ての折半法の組み合わせでの信頼性係数を計算しその平均を求めたものがクロンバックのαであり、古典的テスト理論の枠組みではよく使われると紹介される。

さて、クロンバックのαの計算式を見ると、

 \displaystyle

a係数 = \frac{項目数}{項目数-1} \times (1 - \frac{各項目の分散の合計}{合計点の分散})

のように書いてある。
妥当性と信頼性

この記事では、この式で求めた値が折半法の全ての組み合わせで求めた信頼性係数の平均に本当に一致するのか調べてみることとする。

サンプルとして扱うデータは、『外国語教育研究ハンドブック(松柏社)』の2章に乗っているデータで次のサイトに置いてあるのを使用した。

http://mizumot.com/handbook/wp-content/uploads/ch02motivation.csv

5件法の4つ質問項目からなる質問紙で15人から回答を得た仮想的なデータである。



まず、下準備として計算に必要になる折半した部分得点を計算しておく。

dat <- read.table(pipe("pbpaste"), header = T)

goukei <- apply(dat[,2:5], 1, sum) # 合計得点

col12 <- dat[,2] + dat[,3]  # 項目(12)の部分得点
col13 <- dat[,2] + dat[,4]  # 項目(13)の部分得点
col14 <- dat[,2] + dat[,5]  # 項目(14)の部分得点
col23 <- dat[,3] + dat[,4]  # 項目(23)の部分得点
col24 <- dat[,3] + dat[,5]  # 項目(24)の部分得点
col34 <- dat[,4] + dat[,5]  # 項目(34)の部分得点

一つのテストに含まれる項目を折半したそれぞれの部分得点を X_1, X_2とする。それらの相関係数 Cor (X_1, X_2)とすると、折半法による信頼性係数は次のように表せ、この式をSpearman-Brownの公式という(岡田, 2015)。※shはsplit-halfで折半の意味。

 \displaystyle

\rho_{sh} = \frac{2Cor(X_1, X_2)}{1 + Cor(X_1, X_2)}

この式に基づいてそれぞれの折半の信頼性係数を計算し、その後平均を求める。項目数が4つでありその折半の全ての方法は {}_n C_{n/2} ÷2 = {}_4 C_2 ÷ 2 = 3通りであるので3つの信頼性係数を求めて、その平均を算出する。

rho_sh =numeric(3)
soukan1 <- cor(col12, col34)  #項目(12)(34)での折半による相関係数
rho_sh[1] <- (2 * soukan1) / ( 1 + soukan1)
# [1] 0.8488912
soukan2 <- cor(col13, col24)  #項目(13)(24)での折半による相関係数
rho_sh[2] <- (2 * soukan2) / ( 1 + soukan2)
# [1] 0.8295949
soukan3 <- cor(col14, col23)  #項目(14)(23)での折半による相関係数
rho_sh[3] <- (2 * soukan3) / ( 1 + soukan3)
# [1]  0.8744027

mean(rho_sh)
 # [1]0.8509629

結果を見ると、確かに折半の方法によって信頼性係数は高くなったり低くなったりしていることが分かる。折半法の欠点として挙げられていた通りである。

次に、クロンバックのαの計算式で信頼性係数を求めてみる。

bunbo <- var(goukei)  # 合計得点の分散を計算
bunshi <- sum(apply(dat[,2:5], 2, var)) # 項目得点の分散を合計
(4/3) * (1 - (bunshi/bunbo))
# [1] 0.8472642

あれ、合わないじゃないですか。

よくよく調べて見ると、Spearman-Brownによる折半法の公式で求めた信頼性係数の平均が、αと一致するのは部分得点の分散が等しい時のようである。分散が等しくない時にはSpearmanとBrownの公式を一般化したFlanaganとRulonによる次の公式を用いて計算した信頼性係数の平均がαと一致するらしい(岡田, 2015)。(※ここでXはテストの合計得点。)

 \displaystyle
\rho_{sh2} = \frac{4Cor(X_1, X_2)\sqrt{Var(X_1)Var(X_2)}}{Var(X)}

この式に従って、全ての折半法による信頼性係数の平均を再度計算してみる。

new_rho_sh <- numeric(3)
new_rho_sh[1] <- (4 * soukan1) * (sqrt(var(col12) * var(col34))) / var(goukei)
new_rho_sh[2] <- (4 * soukan2) * (sqrt(var(col13) * var(col24))) / var(goukei)
new_rho_sh[3] <- (4 * soukan3) * (sqrt(var(col14) * var(col23))) / var(goukei)

mean(new_rho_sh)
 # [1] 0.8472642

結果を見れば分かる通り、無事にαの値と一致した。

ということで、統計のテキストとかだとざっとの説明で流されてしまう、「クロンバックのαが、全ての折半法による信頼性係数の平均である」ということの簡単な確認でした。

【参考】
岡田謙介(2015) 心理学と心理測定における信頼性についてーCronbachのα係数とは何なのか、何でないのかー 教育心理学年報, 54 , 71-83

Pythonの環境整理

色々な記事を参考にパッチワークのようにしていじっていたら、バージョン違いのPythonのどこに何が入っているのか訳が分からなくなったので整理することにした。その覚え書き。

そもそも、今のところ自分に必要なのは、実験をプログラミングするための2系のpython一つと、画像処理とかをやるための3系のpython一つなのでこの2つだけ使い分けができれば良いのである。

macにはデフォルトでPythonが入っているが、このPythonの環境をあれこれいじるのはあまり良くないようなので、デフォルトとは別に2系、3系を一つずつ導入ことにする。

OSはHigh Sierra

まず、anacondaによって自分は混乱しているっぽくよく分からんので全部消した。次のサイトを参考にした。

ai-coordinator.jp

で、次に2系、3系の最新を入れようと思いHomebrewを導入した。次のサイトを参考にした。

vdeep.net

oki2a24.com

ここまでで、デフォルトとは違った2系、3系のpythonがインストールされた。ターミナル上で動かしたいときは、python2とpython3でそれぞれのpythonが動く。デフォルトのはそのままpythonで動く。

$ python
Python 2.7.10 (default, Jul 15 2017, 17:16:57) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

$ python2
Python 2.7.14 (default, Sep 25 2017, 09:54:19) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

$ python3
Python 3.6.3 (default, Oct  4 2017, 06:09:38) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

新たに導入したPythonのパッケージ管理はpip2とpip3のコマンドで入れる。3の方に入れても、2の方では使えない。逆もまた然り。

 pip3 install numpy

こんな感じで、3系に入れても2系ではエラーを吐き出す

$ python2
Python 2.7.14 (default, Sep 25 2017, 09:54:19) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named numpy


とりあえずこれでやってみて不具合が出たらまた考えることにする。

Python版OpenCVによるpng画像と透過処理について

必要があって画像処理の技術に入門している。その覚書。

f:id:nekomosyakushimo:20171115120827p:plain
(出所:いらすとや)

このタヌキが今回の実験台である。かわいい。

opencvを使って画像を読み込む際はimreadを使う。

# coding:utf-8

import cv2
import numpy as np

src = "test.png"

img = cv2.imread(src, 0)

第1引数にファイル、第2引数には読み込みのオプションを指定する。0だとグレースケール、1だとカラー、-1だとアルファチャンネル等の追加のチャンネルを含んだまま読み込むらしい。読み込まれた画像はndarray、つまりN次元の配列データとして扱われる。

各次元の要素数を調べるためにnumpy.shapeのメソッドを使うと読み込みによって得られる配列の違いが分かる。

f:id:nekomosyakushimo:20171115121303p:plain

グレースケールだと2次元の配列として行列が得られる。カラーだと3次元の配列として色情報次元のデータもRGBで得られるが、追加チャンネルを含んだ読み込みだとこの次元の要素数が一つ増える。この場合では、不透明度を決定する4つ目の要素が得られる。(RGBA)

このような形で配列情報を得ると特定の画素値にアクセスすることも可能である。例えば、上から100ピクセル目、左から100ピクセル目の画素値へアクセスすると以下のようになる。

f:id:nekomosyakushimo:20171115122239p:plain

グレースケールでは、画素値は0を最小値、255を最大値とする値が一つ格納されている、カラーだとRGBの画素値が、追加チャンネル込みだと、そこにアルファチャンネルを追加した値が得られる。

ちなみにアルファチャンネルは0から255までの値をとりうるようで、0だと透明、255だと完全な不透明になる。ここの数字を変えると透明度合いをいじることができる。例えば、先ほどの画像を半透明にするには、すべての画素のアルファチャンネルに真ん中ぐらいの128の数字を代入すれば良い。

newimg = img3
newimg[:, :, 3] = 128

結果の画像は次の通り。

f:id:nekomosyakushimo:20171115134840p:plain

もともと透明だった背景の黒が透明じゃなくなり、透明でなかったタヌキが半透明化している。

今度は、タヌキの部分だけ半透明にしたい場合を考える。タヌキの部分の画素のインデックスを取得することができれば、今と同じ手順でアルファチャンネルをいじることができる。そこで、条件を満たす要素のインデックスを取得するnp.whereというものを使って、中身のインデックスを取得して、中身のアルファチャンネルのみ変更をする。

newimg2 = img3
hutomei = np.where(img3[:, :, 3] != 0)  #アルファチャンネルが透明でないインデックスを取得
three = np.ones((len(hutomei[1])), dtype="int8") * 3  # 3だけからなる配列を作成
index = tuple((hutomei[0], hutomei[1], three))  #合わせたインデックスを作成 
newimg2[index] = 128

なんか無駄が多いコードな気がするのだが、とりあえず試行錯誤の結果うまくいったのでよしとする。結果の出力画像は以下の通り。

f:id:nekomosyakushimo:20171115143940p:plain

背景は完全に透明なまま、中身のタヌキだけが無事に半透明化した。背景は画面上では白く見えているかもしれないが、画素値にアクセスするとさきほどまでの画像と同じように黒である。

【参考】
https://amzn.to/2Pp2qYQ

OpenCVによる画像処理入門 改訂第2版 (KS情報科学専門書)

OpenCVによる画像処理入門 改訂第2版 (KS情報科学専門書)

今まで読んできた統計本・数学本

今年は統計ネタの記事が多くなってきたので、記事を描く際に参考にしている本をまとめて紹介します。数学本も一緒に紹介するのは、統計関連の本を読む際に、数学が全然分からなくて勉強しなおした関係です。ただ並べるだけだとあれなので主観的なオススメ度合い(★3つで評価)と一言コメントを書いておきます(本当はしっかりとレビューを書こうと思ったのですがたくさんあって面倒+全部読みきっていなかったり、理解が半端だったりするのもあるので)。本の難易度は、基本的に後ろにいくほど難しいです。

統計本関係

推計学のすすめ―決定と計画の科学 (ブルーバックス)

推計学のすすめ―決定と計画の科学 (ブルーバックス)

★★★ 統計的な考え方の説明に重点。古い本だけど超良書。


完全独習 統計学入門

完全独習 統計学入門

★★ 確率をなるべく使わないという斬新な試み。分布の導出とかが結構丁寧。


Rによるやさしい統計学

Rによるやさしい統計学

★★ Rと統計どちらにも入門したい人には大変おすすめ。


心理統計学の基礎―統合的理解のために (有斐閣アルマ)

心理統計学の基礎―統合的理解のために (有斐閣アルマ)

★★★ 数式の展開とか丁寧。トータルで見てとてもバランスが良い。


心理統計学ワークブック―理解の確認と深化のために

心理統計学ワークブック―理解の確認と深化のために

★★ 実際に手を動かすと分かっていない部分が多くてびっくりする。ホントにびっくりする。


基本統計学 第4版

基本統計学 第4版

★★★ 数式の展開とか丁寧。確率とか基本の考え方に重きを置いている。


キーポイント確率統計 (理工系数学のキーポイント 6)

キーポイント確率統計 (理工系数学のキーポイント 6)

★★ 理系の人向けって感じでスッキリとした説明。著者のよくわからないギャグが随所に入っていて個人的にはお気に入り。


統計学入門 (基礎統計学?)

統計学入門 (基礎統計学?)

★★ 確率分布のあたりで急に難しくなる。説明が簡素。


★★ 基礎的な事項をより多面的に理解できる。分布間の関係の箇所を読んでかなり見通しが良くなった。


多変量解析法入門 (ライブラリ新数学大系)

多変量解析法入門 (ライブラリ新数学大系)

★★ 式の展開とか色分けされており分かりやすい。


心理学のためのデータ解析テクニカルブック

心理学のためのデータ解析テクニカルブック

★ 分析の際の疑問点とか実際的場面でのレファレンスとして。


Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによるデータサイエンス データ解析の基礎から最新手法まで

★ データ解析の手法の紹介。本当に色々な手法が乗っている。

数学本関係

数学入門〈上〉 (岩波新書)

数学入門〈上〉 (岩波新書)

数学入門〈下〉 (岩波新書 青版 396)

数学入門〈下〉 (岩波新書 青版 396)

★★ 数学の不思議さや魅力の紹介。数の拡張の歴史が学べる。教養として面白い。


統計学のための数学教室

統計学のための数学教室

★ 統計に必要なところだけ復習していくスタイル。数学と統計のつながりが学べる。


もう一度高校数学

もう一度高校数学

★★ 高校数学の内容が1冊にまとまっており便利。謎の語りかけ口調はややうっとおしい。


微分・積分30講 (数学30講シリーズ)

微分・積分30講 (数学30講シリーズ)

線形代数30講 (数学30講シリーズ)

線形代数30講 (数学30講シリーズ)

★★ 高校数学と大学初年度の数学の間のあたり。1講1講が短く取り組みやすい。


ゼロから学ぶ微分積分 (KS自然科学書ピ-ス)

ゼロから学ぶ微分積分 (KS自然科学書ピ-ス)

ゼロから学ぶ線形代数 (KS自然科学書ピ-ス)

ゼロから学ぶ線形代数 (KS自然科学書ピ-ス)

★★ イメージ重視。数学の魅力を伝えようという著者の書き方が良い。


キーポイント微分方程式 (理工系数学のキーポイント 5)

キーポイント微分方程式 (理工系数学のキーポイント 5)

★ とっつきづらい内容を平易な例で親しみやすく解説している。

バイク用ブーツカバーを買ってみた

ここのところ雨が多かった。わたしは平日はほぼ毎日バイクに乗る必要がある。となると防水対策をしないとQOLの低下は免れない。

ワークマンで昔買ったレインウェアはまだ防水性能を保っている。しかし、防水だったはずの靴に関してはもはやその機能が失われているようで、雨の日にバイクに乗るたびに中まで完全に浸水する。

毎日続く雨にかなりやられたので、これはいよいよ本格的に防水対策をしなければと思いブーツカバーたるものを導入してみた。

とりあえず、Amazonで安くて手頃なものにしたが、これはだいぶ快適である。装着もそこまで手間でないしハーフソールだから滑ったりもしない。

ただ、レインウェアの裾が短いとハイカットがウェアまで届かずに、すねのあたりから靴下を伝って浸水してくる。裾が長めのウェアと合わせて使うか、裾が短いウェアを使っている人はスネまで覆えるより高さのあるブーツカバーを導入すると良いと思う。

ともあれ、雨の日のバイクがだいぶ快適なったので値段の割には良い買い物だった気がする。あとは、この撥水と防水の機能がいつまで続くかが気になるところである。

川上康則編『通常学級でできる発達障害のある子の学習支援』

久々に臨床的なものの紹介でも。オールカラーでイラストたっぷりで薄い。モノクロでイラストなしでいいから半分ぐらいの値段にならなかったのだろうか、というのが初めに読んだ時の感想(笑)

内容としてはほぼタイトル通りで、小学校の通常学級内で学習につまづきがある児童・生徒への支援の事例が14例紹介されている。どの事例に対しても支援の方針として、行動の背景にある要因に注目すること、クラスワイドで学級への支援や授業の組み立てを考えることを基本としている。

各事例は、こどもの典型的なつまずきのケースが紹介され、まずその場で出来る対応および子供のふるまいをみとる視点が紹介されている。その後、氷山モデルを用いてつまずきの背景となる要因が説明されたあと、クラス全体にできる支援、個に応じてできる支援、長期的な視野での発達的(あるいは治療的)支援等が紹介されている。事例および支援は見開き3ページで収まるようになっており、コンパクトにまとまっている。

通常級での学習支援をテーマとした本なので、個を詳しく見るよりも、クラスの雰囲気づくりなどの学級経営的な側面への対応が書かれており、特別支援教育コーディネーターや指導主事、主幹教諭など学級へのコンサルテーションを行う立場の人が読むと得るものがあると思う。

本書で紹介される事例は以下の通り。

  1. 授業への集中が続かず違うことをする
  2. 不注意なまちがいが多い
  3. 音読がうまくできない
  4. 説明文を読み理解するのがむずかしい
  5. 中心人物の気持ちの変化の読み取りが苦手
  6. 文字を覚えられない、形がととのわない
  7. 感じが書けない、まちがいが多い
  8. 作文が苦手で書くのをいやがる
  9. 繰り上がり・繰り下がりの計算ができない
  10. 割り算ができない
  11. 文章題になるとわからない
  12. 図形の問題がわからない
  13. 不器用なため学習が進みにくい
  14. 体育の時間が嫌い

気になったことだが、編者の名前があるのに著者の情報が無いこういう本は、出版社の人が何かを参考に資料をまとめて、それを編者がチェックしてゴーサインを出すみたいな作られ方をしているのだろうか。