【VBAリファレンス】VBAで描く統計学の美学 第5回 茎葉図を自動生成するロジックの構築 1/3

スポンサーリンク

概要:データ分析の原点としての茎葉図

統計学やデータ分析の現場において、生データからその分布の形状を直感的に把握するための最も強力かつシンプルなツールの一つが「茎葉図(Stem-and-Leaf Plot)」です。Excelにはヒストグラムや箱ひげ図を作成する機能が標準で備わっていますが、VBAを用いて独自の茎葉図生成エンジンを構築することは、単なる可視化の手段を超え、データの「桁」や「分布の密度」をアルゴリズムとして捉え直す貴重な学習体験となります。

本連載の第5回となる本稿では、全3回の構成で、VBAを用いて動的な茎葉図を描画するための基礎理論と実装方法を解説します。第1回となる今回は、データの前処理から、茎(Stem)となる桁の切り出し、そして葉(Leaf)となる数値の整列に至るまでの「データ構造の解釈」に焦点を当てます。

詳細解説:茎と葉の数学的定義とVBA的アプローチ

茎葉図をVBAで構築する際、最も重要なのは「数値をどのように分解するか」というロジックです。一般的な整数データや小数データに対し、VBAは以下の手順で処理を行います。

1. データの正規化:入力された数値集合の最大値と最小値を特定し、茎の単位(10の位なのか、100の位なのか)を決定します。
2. 茎の抽出:各数値から「茎」となる部分を切り出します。これは整数除算演算子「\」を用いることで、特定の桁を効率的に抽出可能です。
3. 葉の抽出:数値から茎の部分を差し引き、残りの「葉」となる一桁(あるいは特定の単位)を抽出します。
4. 辞書オブジェクト(Scripting.Dictionary)の活用:茎の値をキーとし、葉のリストを値として格納することで、効率的なデータ保持が可能になります。

このプロセスにおいて、特に注意すべきは「ソート」の概念です。茎葉図は、葉の部分が昇順に並んでいることがルールです。VBAでは配列を一度ソートしてから辞書に格納するのか、あるいは格納後にソートするのかによってパフォーマンスが大きく変わります。実務レベルでは、データ量が増えることを想定し、辞書に格納する前にクイックソート等のアルゴリズムを適用しておくのが定石です。

サンプルコード:データ解析エンジンの骨格

以下のコードは、指定された範囲の数値から茎と葉を抽出し、イミディエイトウィンドウに簡易的な構成を出力する基本ロジックです。


Sub GenerateStemLeafStructure()
    ' 必要なオブジェクトの宣言
    Dim dataRange As Range
    Dim cell As Range
    Dim stemDict As Object
    Set stemDict = CreateObject("Scripting.Dictionary")
    
    ' データ範囲の設定(例: A列の数値)
    Set dataRange = Range("A1:A20")
    
    Dim val As Double
    Dim stem As Long
    Dim leaf As Long
    
    ' データの走査と茎葉の抽出
    For Each cell In dataRange
        If IsNumeric(cell.Value) And cell.Value <> "" Then
            val = Int(cell.Value) ' 小数点以下は切り捨ての例
            stem = val \ 10       ' 10の位を茎とする
            leaf = val Mod 10     ' 1の位を葉とする
            
            ' 辞書に格納(葉はカンマ区切りで文字列化)
            If Not stemDict.Exists(stem) Then
                stemDict.Add stem, leaf
            Else
                stemDict(stem) = stemDict(stem) & "," & leaf
            End If
        End If
    Next cell
    
    ' 結果の出力(イミディエイトウィンドウ)
    Dim s As Variant
    For Each s In stemDict.Keys
        Debug.Print s & " | " & stemDict(s)
    Next s
End Sub

このコードは、茎葉図作成の心臓部となる「分類と整理」を担っています。ここから先、実際のワークシート上に図を描画する際には、セルの幅調整や罫線の描画といったUI側の制御が重要になります。

実務アドバイス:なぜ今、茎葉図なのか

現代のExcelには高度なチャート機能がありますが、茎葉図には「元の数値を維持したまま分布を見ることができる」という唯一無二のメリットがあります。実務において、顧客の購買データや製造ラインの誤差データを分析する際、グラフだけでは「どの数値が外れ値なのか」を特定するのに手間がかかります。しかし、茎葉図であれば、葉の並びを見た瞬間に「特定の数値が異常に多い」といった傾向を即座に視認できます。

また、VBAでこのロジックを組む最大の利点は「再現性」にあります。一度このツールを作成してしまえば、データソースが入れ替わっても、ボタン一つで瞬時に最新の分布状況をレポートとして出力できるからです。これは、レポート作成時間を劇的に短縮する「資産」となります。

まとめ:次回のステップへ

本稿では、茎葉図の数学的な考え方と、VBAによるデータ構造化の基礎を解説しました。今回作成したDictionaryオブジェクトによるデータ管理は、次回以降の「動的な描画」および「レイアウトの最適化」において、すべての基盤となります。

茎葉図を描くということは、単に絵を描くことではありません。それは、混沌とした数値の中に秩序を見出し、意味のある情報へと昇華させる「データ分析の哲学的プロセス」そのものです。次回は、今回抽出した茎と葉を、いかにしてExcelシート上のセルへ美しく配置するか、その描画エンジン部分を深掘りしていきます。VBAの可能性を信じ、次のステップへ共に進みましょう。

タイトルとURLをコピーしました