【VBA】データ分析(統計量計算、移動平均など)

VBA

はじめに

第4回では外部ファイルからデータをExcelシートに取り込む方法を学び、分析のための準備が整いました。ここからはいよいよ、取り込んだデータを使って意味のある情報を引き出す「データ分析」の領域に踏み込みます。

今回は、データ分析の基本である基本的な統計量の計算と、時系列分析の代表格である移動平均の算出をVBAで自動化する方法をマスターします。これらの分析は、材料データの品質評価や株価のトレンド分析など、様々な場面で応用できます。

1. なぜ分析をVBAで行うのか?

ExcelにはAVERAGEMAXといった便利なワークシート関数が既に備わっています。それでもVBAで分析処理を記述するメリットは大きいのです。

  • プロセスの自動化: データ取り込み → データ整形 → 分析 → レポート作成という一連の流れを完全に自動化できる。
  • 複雑なロジック: ワークシート関数だけでは表現が難しい、複雑な条件や独自の計算式を組み込める。
  • 大量データの処理: 分析対象のデータ範囲が毎回変わるような場合でも、VBAなら動的に範囲を特定して分析を実行できる。

2. 基本的な統計量の計算

まずは、指定した範囲のデータから最大値、最小値、平均値、標準偏差を計算するコードを作成してみましょう。ここでは、Excelのワークシート関数をVBAから呼び出すWorksheetFunctionオブジェクトを利用するのが最も簡単で効率的です。

例:A列に並んだ材料強度データの統計量を計算する

Sub CalculateStatistics()
    Dim targetRange As Range
    Dim lastRow As Long

    ' 分析対象の範囲を動的に取得
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    Set targetRange = Range("A1:A" & lastRow)

    ' WorksheetFunctionオブジェクトを使って計算
    Dim maxValue As Double
    Dim minValue As Double
    Dim avgValue As Double
    Dim stdevValue As Double

    maxValue = WorksheetFunction.Max(targetRange)
    minValue = WorksheetFunction.Min(targetRange)
    avgValue = WorksheetFunction.Average(targetRange)
    stdevValue = WorksheetFunction.StDev(targetRange) ' サンプル標準偏差

    ' 結果をC列とD列に出力
    Range("C1").Value = "最大値"
    Range("D1").Value = maxValue
    Range("C2").Value = "最小値"
    Range("D2").Value = minValue
    Range("C3").Value = "平均値"
    Range("D3").Value = avgValue
    Range("C4").Value = "標準偏差"
    Range("D4").Value = stdevValue

    MsgBox "統計量の計算が完了しました。"
End Sub
  • Set targetRange = ...Rangeのようなオブジェクト型の変数に値を設定する場合は、Setキーワードを使います。
  • WorksheetFunction.Max(targetRange): VBAの中からExcelのMAX関数を呼び出しています。AVERAGESTDEVなども同様に利用できます。

3. 移動平均の計算 – 時系列データのトレンドを読む

移動平均は、株価や売上といった時系列データの大まかなトレンドを把握するために用いられる、最もポピュラーな分析手法の一つです。過去N日間のデータの平均値を、日付を一つずつずらしながら計算していきます。

例:B列の株価(終値)から、5日単純移動平均(5MA)を計算し、C列に出力する

Sub CalculateMovingAverage()
    Dim lastRow As Long
    Dim i As Long
    Dim period As Integer
    Dim sumPrice As Double

    ' 移動平均の期間を設定
    period = 5

    ' B列の最終行を取得
    lastRow = Cells(Rows.Count, "B").End(xlUp).Row

    ' 移動平均を計算できる最初の行から最終行までループ
    ' (5日移動平均なので、5行目からスタート)
    For i = period To lastRow
        ' 合計値を初期化
        sumPrice = 0
        
        ' 直近period日間の株価を合計するためのミニループ
        Dim j As Integer
        For j = 0 To period - 1
            ' i行目からj行遡ったセルの値を合計
            sumPrice = sumPrice + Cells(i - j, "B").Value
        Next j

        ' 合計を期間で割り、移動平均をC列に書き出す
        Cells(i, "C").Value = sumPrice / period
    Next i

    ' C列のヘッダーを設定
    Range("C1").Value = period & "日移動平均"

    MsgBox "移動平均の計算が完了しました。"
End Sub

このコードは、ループの中にさらにループが入る「二重ループ」構造になっています。

  • 外側のループ (For i = ...): 移動平均を計算する対象の行を、上から下へ一つずつずらしていきます。
  • 内側のループ (For j = ...): 各行で、移動平均の計算対象となる過去N日間のデータを合計するために使います。

このロジックを理解すれば、様々な期間の移動平均や、加重移動平均(直近の価格に重みをつける)といった、より高度な分析にも応用できます。

まとめ

今回は、VBAを使って本格的なデータ分析を行う第一歩を踏み出しました。

  • WorksheetFunctionオブジェクトを使えば、Excelの強力な関数をVBAから簡単に利用できる。
  • VBAで分析処理を記述することで、データ範囲の変動に強い、柔軟な自動化プロセスを構築できる。
  • 二重ループなどのロジックを組むことで、移動平均のような複雑な時系列分析も可能になる。

データから数値を計算するだけでは、その意味を直感的に理解するのは難しい場合があります。次回は、これらの分析結果をグラフとして「見える化」し、一目で傾向がわかるレポートを自動生成する方法を学びます。

コメント