静粛に、只今統計勉強中

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

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
続きを読む

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

前回は、 

統計学入門 (基礎統計学Ⅰ)

統計学入門 (基礎統計学Ⅰ)

 

と 

現場ですぐ使える時系列データ分析 ~データサイエンティストのための基礎知識~

現場ですぐ使える時系列データ分析 ~データサイエンティストのための基礎知識~

 

で自己相関係数を求める計算式が違って吃驚! というところで終わりました。

前者が

 自己相関係数=\dfrac{偏差積和/(n-h)}{偏差平方和/n}

としていたのに対し、後者は

 自己相関係数=\dfrac{偏差積和}{偏差平方和}

としていたのです。

続きを読む

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

2019年11月実施の統計検定2級試験の問題が公式WEBサイトに公開されていたので、ダウンロードして解いてみたのですが、またしてもコレログラムの問題で間違ってしまいました。

2015年11月に初登場してこれで4回目の出題になりますが、4回とも一度で正解できたことがありません。

コレログラムについては、手持ちの本でもGoogleで検索しても、詳しくてしかもとっつきやすい解説に巡り合えなかったので、主に公式問題集の解説を読んでなんとなくわかった気になっていました。

しかし実は全くわかっていなかったのだという現実を、そろそろ直視しないといけないようです。トホホ。

しかたがないので、一からきちんと学ぶとしましょう。

続きを読む

統計検定準1級の過去問で台風の上陸数がポアソン分布に従うと知った2

前回は、2016年6月実施の統計検定準1級試験の問題に沿って適合度検定をしたところ、帰無仮説「H0:台風上陸数の観測度数はλ=2.84のポアソン分布に従う」が棄却されてしまった、というところまでお話ししました。

 

今回は、やっぱり試験問題の内容に沿って、それでも台風上陸数はポアソン分布に従うというところから、最新のデータを使うとどうなるか、まで進めたいと思います。

続きを読む

統計検定準1級の過去問で台風の上陸数がポアソン分布に従うと知った1

現在、大型で猛烈な台風19号が日本列島に接近中です。

ウェザーニュース社が発表した予報円の真ん中を進んだ場合、13日(日)あたりに関東を直撃するコースになっていて、また大きな被害が生じてしまうことが心配されます。

それにつけても、近年日本に上陸する台風が多い気がするなあ、などとぼんやり思っていたら、タイムリーなことに2016年6月実施の統計検定準1級の論述問題 問1で、台風の上陸数に関する問題が出題されていました。

続きを読む