👻
クラメールの連関係数を関数で一発で計算する
はじめに
この記事ではGoogle Sheetsを使ってクラメールの連関係数を計算する方法を紹介します。
巷のサイトでは、シート上で期待度数を計算して、検定統計量
ここでは、GASで関数を定義し、それをシートで使うことで、簡単にクラメールの連関係数を計算します。
Excel?VBA?知らない子ですね。。。
準備
- メニューの拡張機能のApps ScriptからGASプロジェクトを開く
-
コード.gs
に以下のコードを貼り付ける
/**
* クラメールの連関係数を計算する
* @param {number[][]} observedTable 観測度数のクロス集計表の範囲の値
* @return {number} クラメールの連関係数
*/
function CRAMERSV(observedTable) {
if (!Array.isArray(observedTable)) {
throw Error('Specify range')
}
const numRows = observedTable.length
if (numRows === 0) {
throw Error('No selection row')
}
const numCols = observedTable[0].length
if (numCols === 0) {
throw Error('No selection column')
}
const k = Math.min(numCols, numRows) - 1
if (k < 1) {
throw Error('Selection range must have more than 1 rows or columns')
}
// 観測度数の総和を計算する
const sumOfRows = Array(numRows).fill(0)
const sumOfCols = Array(numCols).fill(0)
let sumOfAll = 0
for (let i = 0; i < numRows; i++) {
for (let j = 0; j < numCols; j++) {
const value = observedTable[i][j]
sumOfRows[i] += value
sumOfCols[j] += value
sumOfAll += value
}
}
// 各セルの期待度数を求める
const expectedTable = []
for (let i = 0; i < numRows; i++) {
const row = []
for (let j = 0; j < numCols; j++) {
const expectedValue = sumOfRows[i] * sumOfCols[j] / sumOfAll
row.push(expectedValue)
}
expectedTable.push(row)
}
// 検定統計量Χ2を求める
let chiSquare = 0
for (let i = 0; i < numRows; i++) {
for (let j = 0; j < numCols; j++) {
chiSquare += Math.pow(observedTable[i][j] - expectedTable[i][j], 2) / expectedTable[i][j]
}
}
// 連関係数vを求める
const v = Math.sqrt(chiSquare / (sumOfAll * k))
return v
}
- プロジェクトを保存する
使い方
クロス集計した表から範囲を指定して関数に渡します。
データはこちらからお借りしました。ライセンス違反だったらすみません。
総計を範囲に含めないことに注意してください。
Discussion