【VBAリファレンス】Excel VBAとSQLで解き明かすバスケット分析:ペア商品の出現回数を算出する実務テクニック

スポンサーリンク

概要:データ分析の登竜門「バスケット分析」とは

ビジネスの現場において、「どの商品とどの商品が一緒に買われているか」を把握することは、クロスセル戦略や棚割りの最適化において極めて重要です。これを専門用語で「マーケット・バスケット分析」と呼びます。Excel VBAのスキルセットの中にSQLの知識を組み込むことで、数百万行に及ぶ膨大なトランザクションデータから、瞬時に相関性の高い商品ペアを抽出することが可能になります。本稿では、SQLの基礎的な集計技術を応用し、同じ注文番号(オーダーID)内で発生した商品ペアの出現回数をカウントする方法を徹底解説します。単なる集計を超え、VBAからSQLを呼び出し、業務効率を劇的に向上させるための論理構成をマスターしましょう。

詳細解説:自己結合(Self Join)によるペア生成の論理

バスケット分析の核となるのは「同一トランザクション内の商品組み合わせ」をどうやって洗い出すかという点にあります。単純な集計では「商品Aが売れた数」しか分かりません。商品Aと商品Bが同時にカートに入っていた事実を抽出するには、同一のテーブルを自分自身と結合する「自己結合(Self Join)」という手法が不可欠です。

具体的には、注文テーブル(SalesTable)を「A」と「B」という2つの別名(エイリアス)で定義し、同じ注文ID(OrderID)で結合させます。ただし、これだけでは「商品Aと商品A」という無意味な組み合わせや、「商品Aと商品B」「商品Bと商品A」という重複が発生します。そこで、SQLの結合条件に「商品IDが異なること(A.ItemID < B.ItemID)」という不等号を加えることで、重複を排除し、かつユニークなペアのみを効率的に抽出する設計を行います。この論理は、VBAで多重ループを回して配列を処理するよりも、圧倒的に高速で保守性が高いという特徴があります。

サンプルコード:SQLによるペア集計の実装

以下のコードは、ADO(ActiveX Data Objects)を使用してExcelからSQLを実行し、商品ペアの出現回数を取得するVBAプロシージャです。


Sub GetProductPairAnalysis()
    Dim conn As Object
    Dim rs As Object
    Dim sql As String
    Dim dbPath As String
    
    ' データベースのパス(ここではExcelファイルをDBとして扱う想定)
    dbPath = ThisWorkbook.FullName
    
    Set conn = CreateObject("ADODB.Connection")
    conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath & ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
    
    ' SQLクエリ:自己結合を用いて商品ペアと出現回数をカウント
    sql = "SELECT T1.ItemID AS ItemA, T2.ItemID AS ItemB, COUNT(*) AS Frequency " & _
          "FROM [SalesData$] AS T1 " & _
          "INNER JOIN [SalesData$] AS T2 ON T1.OrderID = T2.OrderID " & _
          "WHERE T1.ItemID < T2.ItemID " & _
          "GROUP BY T1.ItemID, T2.ItemID " & _
          "ORDER BY COUNT(*) DESC"
          
    Set rs = conn.Execute(sql)
    
    ' 結果をシートに出力
    Sheet2.Range("A1").CopyFromRecordset rs
    
    rs.Close
    conn.Close
End Sub

このSQLのポイントは、FROM句で同じシート(SalesData$)を参照している点です。WHERE句の「T1.ItemID < T2.ItemID」が、重複と自己参照を防ぐためのフィルタリングとして機能しています。これにより、結果セットには「商品Aと商品Bの組み合わせが何回発生したか」という純粋な統計データだけが格納されます。

実務アドバイス:パフォーマンスとスケーラビリティ

実務においてバスケット分析を行う際、データ量が数万件を超えるとExcelの関数やピボットテーブルでは動作が極端に重くなります。ここでVBA×SQLの威力が発揮されます。

1. インデックスの活用:もしAccessデータベースやSQL Serverをバックエンドに使用している場合、OrderIDおよびItemIDには必ずインデックスを貼ってください。これにより、結合処理の速度が数倍から数十倍に跳ね上がります。
2. サブクエリの検討:ペアの出現回数だけでなく、全注文数に対する割合(支持度:Support)も算出したい場合は、総注文数をサブクエリで求め、それを割ることで指標化しましょう。
3. データの事前クリーニング:SQLを投げる前に、VBA側で不要なデータ(キャンセル注文や返品など)をフィルタリングし、メモリ上または一時テーブルでクリーンな状態を作っておくことが、分析の精度を高めるコツです。
4. 可視化への接続:SQLで算出した結果をヒートマップやネットワーク図(ノードとリンク)としてExcel上で可視化すると、経営層や現場への説得力が格段に増します。

まとめ:VBAエンジニアからデータアナリストへの飛躍

バスケット分析は、単なる「組み合わせのカウント」ではありません。顧客の購買心理を可視化し、次のアクションを導き出すための強力な意思決定ツールです。今回解説した自己結合のテクニックは、在庫管理や顧客セグメンテーションなど、他のあらゆる分析タスクに応用が利く「一生モノのスキル」です。

多くのVBAエンジニアは、Rangeオブジェクトを操作することに終始しがちですが、このようにSQLという強力な集合演算を組み合わせることで、処理能力は一気に拡張されます。Excelという閉じた環境から抜け出し、SQLというデータ操作言語を使いこなすことで、あなたの分析力は一段上のステージへと引き上げられるはずです。まずは手元の小さなデータセットから、このSQLコードを試してみてください。データの裏側にある「顧客の物語」が、数字となって見えてくるはずです。

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