これまでに解説した SCAN や REDUCE
などの動的配列ヘルパー関数は、主に「上から下(時系列やレコード方向)」へと計算を積み上げ、あるいは凝縮していくための強力な武器でした。
しかし、実務の多変量解析やデータマイニングにおいては、ベクトルをもう1軸拡張し、「縦 × 横の2次元マトリックス」を総当たりで計算しなければならない局面に何度も直面します。変数同士の結びつきを見る「相関行列」や、顧客・店舗間の類似度を測る「距離行列」の生成がその代表例です。
従来のExcelでこれらを作ろうとすると、$(絶対参照)
を縦横に複雑に組み合わせた数式を組み、十字方向に必死にオートフィルで引き伸ばすか、あるいは「データ分析アドイン」を叩いて静的な表を生成するしかありませんでした。アドインが吐き出した表はただの数値の塊にすぎないため、ローデータが1行でも更新されれば、再びアドインを実行し直さなければならない(リアルタイムに連動しない)という苦行を避けられませんでした。
Excel 365から実装されたMAKEARRAY関数は、指定した行数・列数の「2次元の空間」を数式内に仮想的に創造します。
| 構文 | =MAKEARRAY( 行数, 列数, LAMBDA(行インデックス, 列インデックス, 計算ルール) ) |
|---|
左上のセルに「たった1マス」数式を記述するだけで、指定したサイズのマトリックスが縦横にドバッとスピル展開されます。本稿では、手動生成の手間とデータ破損のリスクを完全に撲滅し、ローデータとリアルタイムに同期する動的マトリックスの構築ロジックを追跡します。
実践例1 ― 多変量解析の出発点:1マスから広がる「動的相関行列」
アンケートの回答項目や、商品のスペックデータ(価格、重量、満足度、売上高など)、複数の変数(カラム)が存在するとき、多変量解析の最初のステップは「どの変数とどの変数に相関があるか」のチェックです。
しかし、Excelの標準関数 CORREL は、引数に「2つの列」しか指定できません。変数が4つあれば 4×4=16マス、10個あれば
10×10=100マスのクロス表を手作業で用意し、各交点に `=CORREL(項目A, 項目B)`
と数式を並べる必要があります。「コピペするたびに対象列がズレていくイライラ」は、実務経験者なら誰もが身に覚えがあるはずです(例えばこのページ)。
シートのA列~D列(A1:D10)に、商品ごとの4つの評価基準データが入っているローデータ(テーブル)があるとします。 この右側の「J1セル」を起点として、4×4の相関行列を一発で出力します。数式を入力する前、行列の展開エリアは完全に空欄です。
| A | B | C | D | ... | J | K | L | M | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 価格感 | デザイン | 機能性 | 売上高 | (価格) | (デザ) | (機能) | (売上) | |
| 2 | 3 | 5 | 4 | 520 | |||||
| 3 | 2 | 3 | 2 | 210 | |||||
| 4 | 5 | 4 | 5 | 680 | |||||
| 5 | 4 | 2 | 3 | 310 | |||||
| 6 | 1 | 4 | 3 | 450 |
縦4行×横4列の相関行列空間を全自動生成するため、交点の始点となる「J2セル」にのみ、以下の数式を入力します。
| J2 | =MAKEARRAY(4, 4, LAMBDA(r, c, CORREL(INDEX(A2:D6, 0, r), INDEX(A2:D6, 0, c)))) |
|---|
J2セルに入力した瞬間、対角線上に「1.00(自分自身との相関)」が並ぶ、整然とした4×4の相関行列がスピル展開されます。
この数式のキモは、MAKEARRAY がループ処理の過程で吐き出す現在の行位置 r と列位置 c
を、INDEX(データ, 0, 列番号) に流し込んでいる点にあります。
Excelの INDEX 関数は、行番号に `0` を指定すると、「その列(カラム)を丸ごと縦ベクトルの配列として切り出す」という仕様を持っています。
MAKEARRAYが3行目(r=3)、4列目(c=4)を計算するとき:INDEX(A2:D6, 0, 3)がC列(機能性)のデータを丸ごと取得。INDEX(A2:D6, 0, 4)がD列(売上高)のデータを丸ごと取得。- その2つの配列がそのまま
CORRELに食わされ、交点の数値(相関係数)を算出。
この2次元スキャンが全16マスに対して負荷なく実行されます。ローデータが1行でも追加・更新されれば、すべての相関係数がリアルタイムに追従します。
| A | B | C | D | E | J | K | L | M | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 価格感 | デザイン | 機能性 | 売上高 | ... | (価格) | (デザ) | (機能) | (売上) |
| 2 | 3 | 5 | 4 | 520 | ... | 1.00 | -0.14 | 0.69 | 0.48 |
| 3 | 2 | 3 | 2 | 210 | ... | -0.14 | 1.00 | 0.54 | 0.67 |
| 4 | 5 | 4 | 5 | 680 | ... | 0.69 | 0.54 | 1.00 | 0.96 |
| 5 | 4 | 2 | 3 | 310 | ... | 0.48 | 0.67 | 0.96 | 1.00 |
実践例2 ― データマイニングの前処理:総当たり「ユークリッド距離行列」の創造
顧客のセグメンテーション(クラスタリング分析)や、競合店舗間の類似度分析を行う際、すべての要素(レコード)が「お互いにどれくらい似ているか・離れているか」を測る「ユークリッド距離行列」が必要になります。
もしサンプルが5つあれば、必要な交点は 5×5=25マスです。これを従来のExcelで計算しようとすると、各セルの位置に合わせて「数式内の列固定と行固定のドルマーク
$」をパズルのように配置してオートフィルするか、裏側に巨大な計算用の作業列を何十列も展開するしかありませんでした。データの数が増えた瞬間にシートがスパゲティ化し、処理が激重になる絶望的な作業です。
A列(顧客ID)、B列(来店頻度)、C列(平均客単価)のデータが5顧客分(2行目~6行目)並んでいます。 この顧客同士のすべての組み合わせ(5行×5列)に対する距離マトリックスを、E2セルを起点として一発で創造します。入力前、E列~I列は完全に空欄です。
| A | B | C | ... | E | F | G | H | I | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 顧客ID | 来店頻度 (回) | 客単価 (千円) | (C001) | (C002) | (C003) | (C004) | (C005) | |
| 2 | C001 | 12 | 5.0 | ||||||
| 3 | C002 | 2 | 1.2 | ||||||
| 4 | C003 | 14 | 4.5 | ||||||
| 5 | C004 | 3 | 8.0 | ||||||
| 6 | C005 | 9 | 2.8 |
作業列ゼロで5×5の総当たり距離空間を組み上げるため、E2セルに以下の数式を入力します。
| E2 | =MAKEARRAY(5, 5, LAMBDA(r, c, ROUND(SQRT((INDEX(B2:B6, r) - INDEX(B2:B6, c))^2 + (INDEX(C2:C6, r) - INDEX(C2:C6, c))^2), 2))) |
|---|
数式を入力すると、対角線上(自分自身との距離)がすべて `0` になり、それ以外の交点に計算済みの幾何学的距離(ユークリッド距離)がスピル展開されます。
数式内の SQRT((x1 - x2)^2 + (y1 - y2)^2) は、統計学や数学で2点間の直線距離を求める公式そのものです。
MAKEARRAY の現在の行番号 r が「起点となる顧客の行」、列番号 c が「比較対象となる顧客の行」を指し示します。
- 例:5行目(r=4:顧客C004)と 2列目(c=1:顧客C001)の交点を計算するとき:
INDEX(B2:B6, 4)でC004の来店頻度「3」を取得。INDEX(B2:B6, 1)でC001の来店頻度「12」を取得。- 同様にC列(客単価)から「8.0」と「5.0」をピンポイントで取得し、その差の二乗和の平方根を
SQRTで計算。
この縦横マトリックスの全自動走査により、作業列を1列も並べることなく、クラスタリングやk近傍法(k-NN)などの多変量解析にそのまま放り込める機能的な「距離行列」が完成します。
| A | B | C | ... | E | F | G | H | I | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 顧客ID | 来店頻度 (回) | 客単価 (千円) | (C001) | (C002) | (C003) | (C004) | (C005) | |
| 2 | C001 | 12 | 5.0 | 0 | 10.70 | 2.06 | 9.49 | 3.72 | |
| 3 | C002 | 2 | 1.2 | 10.70 | 0 | 12.45 | 6.87 | 7.18 | |
| 4 | C003 | 14 | 4.5 | 2.06 | 12.45 | 0 | 11.54 | 5.28 | |
| 5 | C004 | 3 | 8.0 | 9.49 | 6.87 | 11.54 | 0 | 7.94 | |
| 6 | C005 | 9 | 2.8 | 3.72 | 7.18 | 5.28 | 7.94 | 0 |
まとめ ―― MAKEARRAY関数を使いこなすための3箇条
- 縦横ヘッダーの「要素数」と引数のサイズを完全に一致させる:
MAKEARRAYに指定する行数・列数は、展開先のクロス表の見出しの件数と厳密に一致させる必要があります。動的に変動させたい場合は、ROWS関数やCOLUMNS関数を第1・第2引数に組み込むのが堅牢です。 - INDEXの「0」指定によるベクトル切り出しを習得する: 実践例1のように、
INDEX(範囲, 0, c)を使うことで、2次元データを1列ずつの縦ベクトルとしてCORREL等の多変量関数に流し込むことができます。この「面から列への変換」がマトリックス構築の最大の鍵です。 - 数式を「左上の1マス」に集約して破損リスクをゼロにする: 縦横に数式をコピーする必要が一切ないため、運用の途中で「一部のセルだけ数式が書き換わっていた」というデータ分析上の大事故が構造上発生しなくなります。