静粛に、只今統計勉強中

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

Excel VBAでコレログラムを作成するマクロを作ってみた3

前回までの2回で、Excelで自己相関係数を計算し、コレログラムを作成するところまでできましたので、今回は、この一連の手順をVBAマクロで自動化したいと思います。

といっても、計算はたいしてややこしいものではありませんし、グラフ作成の自動化も前に何度もやってますから、これといって新機軸はありません。

ので、ソースコードを、さらっと。

'時系列データからコレログラムを作成する
Sub CORRELOGRAM()

    Dim Lag
    Dim n As Integer
    Dim Avg As Double
    Dim i As Integer, j As Integer
    Dim Mat1, Mat2
    Dim CLM As Integer
    Dim Acov
    
    Lag = InputBox("自己相関係数を計算するラグ(時間差)の数を整数で入力してください。" & vbCrLf & _
        vbCrLf & "ただし、下限を[2]、上限を[選択範囲の行数-1]とします。", "コレログラム")

    n = Selection.Rows.Count    'データ数をnに格納

    Select Case Lag
    Case 2 To n - 1
        Avg = WorksheetFunction.Average(Selection)  '平均値をAvgに格納
        
        ReDim Mat1(1 To n)  '動的配列変数Mat1を初期化
        ReDim Acov(Lag)     '動的配列変数Acovを初期化
        
        For j = 1 To n
            Mat1(j) = Selection(j).Value - Avg  'Mat1にラグ0の偏差を格納
        Next
        Acov(0) = WorksheetFunction.SumSq(Mat1) / n 'Acov(0)にラグ0の分散を格納
        
        'ワークシートに自己相関係数を記述する(見出しとラグ0)
        CLM = Selection.Column + 2
        Cells(1, CLM).Value = "ラグ(時間差)"
        Cells(1, CLM + 1).Value = "自己相関係数"
        Cells(2, CLM).Value = "'0"
        Cells(2, CLM + 1).Value = 1
        
        For i = 1 To Lag
            ReDim Mat2(1 To n)  '動的配列変数Mat2を初期化
            For j = 1 To n - i
                Mat2(j) = Selection(i + j).Value - Avg  'Mat2にラグiの偏差を格納
            Next
            Acov(i) = WorksheetFunction.SumProduct(Mat1, Mat2) / n  'Acov(i)にラグ0とラグiの自己共分散を格納
            'ワークシートに自己相関係数を記述する(ラグi)
            Cells(i + 2, CLM).Value = "'" & i
            Cells(i + 2, CLM + 1).Value = Acov(i) / Acov(0)
        Next
        
        '自己相関係数の表に基づき、棒グラフを作成する
        ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select
        With ActiveChart
            .SetSourceData Source:=Range(Cells(2, CLM), Cells(Lag + 2, CLM + 1))
            .ChartTitle.Delete
            .Axes(xlCategory).TickLabelPosition = xlLow
            .Axes(xlValue).MinimumScale = -1
            .Axes(xlValue).MaximumScale = 1
            .Axes(xlValue, xlPrimary).HasTitle = True
            .Axes(xlCategory, xlPrimary).HasTitle = True
            .Axes(xlValue, xlPrimary).AxisTitle.Text = "自己相関係数"
            .Axes(xlCategory, xlPrimary).AxisTitle.Text = "時間差"
        End With
    Case vbNullString
    Case Else
        MsgBox "自己相関係数を計算するラグの数を整数で入力してください。" & vbCrLf & _
            vbCrLf & "ただし、下限を[2]、上限を[選択範囲の行数-1]とします。", vbCritical, "コレログラム"
    End Select

End Sub

律儀に、分母も分子もデータ数nで割って分散と自己共分散にしてますが、余計な手間ではあります。まあ、勉強のためってことで・・・

 

使い方も毎度おなじみ、VBEにソースコードをコピペしたら、

  1. 計算する範囲(データのみ)を選択して、[開発]タブから【マクロ】をクリック

    f:id:cyclo-commuter:20200121105253p:plain

  2. 「CORRELOGRAM」を選択して、【実行】をクリック

    f:id:cyclo-commuter:20200121105621p:plain

  3. 入力ボックスに計算するラグの数を入力して【OK】をクリック

    f:id:cyclo-commuter:20200121105740p:plain

  4. 一瞬でコレログラムができあがります♪

    f:id:cyclo-commuter:20200121105921p:plain

 

下図は、時系列のグラフです。

f:id:cyclo-commuter:20200121111111p:plain

で、こちらがコレログラム。

f:id:cyclo-commuter:20200121111210p:plain

1年周期で金額が上下していることがわかりますね。

 

どうでもいいけど、我が家の冬の電気代、高すぎるなあ・・・