静粛に、只今統計勉強中

仕事でデータ分析をすることになったバリバリ文系アラフィフのおっさんが、独学で統計の勉強を始めました。

Excel VBAでスピアマンの順位相関係数を求める関数を作ってみた 補

前々回参考にさせていただいたサイトにこうありました。

なお数式どおりに手続きを踏むのが面倒な場合,いずれのケースも順位づけした後,PearsonまたはCorrel関数でより簡素な手続きに代えることも可能です。

BDAstyle

というわけで、おまけでワークシート関数PEARSONを使った関数も作ってみました。

ソースコードは以下のとおりです。*1

'スピアマンの順位相関係数を求める2
Function Spearman2(参照1, 順序1, 参照2, 順序2)

    Dim n, tmp1, tmp2, i

    If 参照1.Rows.Count = 参照2.Rows.Count And 参照1.Columns.Count = 1 And 参照2.Columns.Count = 1 Then
        n = 参照1.Rows.Count
        ReDim tmp1(1 To n)
        ReDim tmp2(1 To n)
        For i = 1 To n
            tmp1(i) = WorksheetFunction.Rank_Avg(参照1(i), 参照1, 順序1)
            tmp2(i) = WorksheetFunction.Rank_Avg(参照2(i), 参照2, 順序2)
        Next
        Spearman2 = WorksheetFunction.Pearson(tmp1, tmp2)
    Else
        Spearman2 = CVErr(xlErrNA)
    End If
End Function

ぐっとシンプルになりましたね。 使い方は前回作成したSpearman関数と同じです。
架空のデータで計算結果を確認してみましょう。

f:id:cyclo-commuter:20171215104700j:plain
計算間違いがないか確認するため、ワークシート上でも同じ計算をしてみましたが、正しく計算されているようです。SpearmanSpearman2も同じ結果になりましたね。順位でピアソンの積率相関係数を計算するとスピアマンの順位相関係数になることが確認できました。
なぜ正規分布を仮定する(パラメトリックな)ピアソンの積率相関係数の数式で正規分布を仮定しない(ノンパラメトリックな)スピアマンの順位相関係数が計算できてしまうのか、謎はつきませんが、順位相関係数についてはひとまずここまで。

 

※ 2018/1/22 ケンドールの順位相関係数を求める関数も作りました。

*1:2017/12/23 コード個所をpre記法に直しました