非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【ExcelVBA】t検定ツールをExcelマクロで作った

   

会社のPCのOffice365で突如分析ツールが消えてしまい、日ごろ使っている平均値の検定(t検定)が使えなくなったので急遽マクロで作成しました。

以下が結果です。A列、B列にデータを入れるとD〜F列に検定結果が展開されます。I〜K列に分析ツールで検定した結果も添えていますが、同じ値を出力していることが解ると思います。(この検定は自宅PCで行ったもの)

 

以下がプログラムになります。

Sub TTest_UnequalVarianceWithPTValues()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    
    ' データ範囲を定義
    Dim data1 As Range, data2 As Range
    Set data1 = ws.Range("A1", ws.Cells(ws.Rows.Count, 1).End(xlUp))
    Set data2 = ws.Range("B1", ws.Cells(ws.Rows.Count, 2).End(xlUp))
    
    ' 標本サイズ
    Dim n1 As Long, n2 As Long
    n1 = data1.Rows.Count
    n2 = data2.Rows.Count

    ' 平均と不偏分散を計算
    Dim mean1 As Double, mean2 As Double
    Dim var1 As Double, var2 As Double
    mean1 = Application.WorksheetFunction.Average(data1)
    mean2 = Application.WorksheetFunction.Average(data2)
    var1 = Application.WorksheetFunction.Var(data1)
    var2 = Application.WorksheetFunction.Var(data2)

    ' t値を計算(Welchのt検定)
    Dim tValue As Double
    tValue = (mean1 - mean2) / Sqr((var1 / n1) + (var2 / n2))
    
    ' 自由度を計算 (Welch?Satterthwaite equation)
    Dim df As Long
    df = data1.Count + data2.Count - 2

    ' p値を計算
    Dim pValueOneSide As Double, pValueTwoSide As Double
    pValueOneSide = Application.WorksheetFunction.T_Dist(Abs(tValue), df, True) ' 片側
    pValueTwoSide = Application.WorksheetFunction.T_Dist_2T(Abs(tValue), df)   ' 両側
    
    ' t分布の臨界値(片側・両側)
    Dim tCriticalOneSide As Double, tCriticalTwoSide As Double
    tCriticalOneSide = Application.WorksheetFunction.T_Inv(0.05, df) ' 片側5%有意水準
    tCriticalTwoSide = Application.WorksheetFunction.T_Inv_2T(0.05, df) ' 両側5%有意水準
    
    ' 結果をシートに出力
    ws.Cells(1, 4).Value = "t-検定: 分散が等しくないと仮定した2標本による検定"
    ws.Cells(2, 4).Value = ""
    ws.Cells(3, 5).Value = "変数 1"
    ws.Cells(3, 6).Value = "変数 2"
    ws.Cells(4, 4).Value = "平均"
    ws.Cells(4, 5).Value = mean1
    ws.Cells(4, 6).Value = mean2
    ws.Cells(5, 4).Value = "分散"
    ws.Cells(5, 5).Value = var1
    ws.Cells(5, 6).Value = var2
    ws.Cells(6, 4).Value = "観測数"
    ws.Cells(6, 5).Value = data1.Count
    ws.Cells(6, 6).Value = data2.Count
    ws.Cells(7, 4).Value = "自由度"
    ws.Cells(7, 5).Value = df
    ws.Cells(8, 4).Value = "t"
    ws.Cells(8, 5).Value = Abs(tValue)
    ws.Cells(9, 4).Value = "P(T<=t) 片側"
    ws.Cells(9, 5).Value = Abs(pValueOneSide)
    ws.Cells(10, 4).Value = "t 境界値 片側"
    ws.Cells(10, 5).Value = Abs(tCriticalOneSide)
    ws.Cells(11, 4).Value = "P(T<=t) 両側"
    ws.Cells(11, 5).Value = Abs(tCriticalOneSide)
    ws.Cells(12, 4).Value = "t 境界値 両側"
    ws.Cells(12, 5).Value = Abs(tCriticalTwoSide)
End Sub
 

 

スポンサーリンク

 - Excel, VBA