静粛に、只今統計勉強中

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

Excel VBAでケンドールの順位相関係数を求める関数を作ってみた

『マンガ統計学入門』を読んでいたら、こんな一文が目に留まりました。

ケンドールの {τ} は、スピアマンの {ρ}よりもサイズが大きい標本に対してよく使用されます。*1
『マンガ統計学入門』アイリーン・マグネロ,ボリン・V・ルーン(講談社)158ページ

マンガ 統計学入門―学びたい人のための最短コース (ブルーバックス)

マンガ 統計学入門―学びたい人のための最短コース (ブルーバックス)

余談になりますが、この本、Amazonの書評にもあるとおり、コマを割った日本の「マンガ」ではなく、いわゆる「ポンチ絵」です。新聞の政治欄とかに載ってる1コマの風刺漫画の趣(おもむき)。内容も、裏表紙にあるような「現代人に必須の統計思考力が身につく!」といったものではなく、統計学史をつまみ食い的に紹介した雑学本ですね。

いろんな統計学者の似顔絵が拝めるので、統計学への親近感が増す、かも?

 

さて、本題です。

スピアマンの {ρ} を求めるユーザー定義関数は以前作ってみましたが、

よく使われるということなら、是非ケンドールの {τ} を求める関数も作ってみましょう。 

計算のしかたはこちらで学ばせていただきました。

こりゃ簡単。てことで、さっそく実装。

'ケンドールの順位相関係数を求める
Function Kendall(参照1, 参照2)

    Dim n, Tmp1, Tmp2, i, j, k
    
    If 参照1.Rows.Count = 参照2.Rows.Count And _
        参照1.Columns.Count = 1 And 参照2.Columns.Count = 1 Then
        n = 参照1.Rows.Count
        For i = 1 To n - 1
            For j = i + 1 To n
                Select Case (参照1(i) - 参照1(j)) * (参照2(i) - 参照2(j))
                    Case Is > 0: Tmp1 = Tmp1 + 1
                    Case Is < 0: Tmp2 = Tmp2 + 1
                End Select
                k = k + 1
            Next
        Next
        Kendall = (Tmp1 - Tmp2) / k
    Else
        Kendall = CVErr(xlErrNA)
    End If

End Function

ペアの組み合わせ数はワークシート関数のCOMBINで求めてもよかったのですが、ソースの見た目スッキリ感を選んで、ループの回数を数えることにしました。

 

実行結果は以下のとおり。

f:id:cyclo-commuter:20180122160039j:plain

サンプルサイズが小さいせいか、スピアマンの {ρ} とは、随分値が違っていますね。

*1:ちなみに、{τ} は「タウ」、{ρ} は「ロー」と読みます。