👻

クラメールの連関係数を関数で一発で計算する

2023/12/06に公開

はじめに

この記事ではGoogle Sheetsを使ってクラメールの連関係数を計算する方法を紹介します。

巷のサイトでは、シート上で期待度数を計算して、検定統計量\chi ^2を計算して、、、と手順を踏んでいます。
ここでは、GASで関数を定義し、それをシートで使うことで、簡単にクラメールの連関係数を計算します。

Excel?VBA?知らない子ですね。。。

準備

  1. メニューの拡張機能Apps ScriptからGASプロジェクトを開く

  1. コード.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
}
  1. プロジェクトを保存する

使い方

クロス集計した表から範囲を指定して関数に渡します。
データはこちらからお借りしました。ライセンス違反だったらすみません。
https://corvus-window.com/excel_cramers-v/

総計を範囲に含めないことに注意してください。

Discussion