スプライン補間ExcelのVBA関数で滑らか曲線を自在に作る方法

ExcelにはスプライN補間の標準関数が存在しないことをご存じですか?医療データの血中濃度推移や体温変化をなめらかに可視化するためのVBA実装と関数の使い方を徹底解説します。

スプライン補間をExcel関数とVBAで実装する完全ガイド

Excelのグラフで「散布図(平滑線)」を描いたとき、あなたはその曲線の数値を1つも取り出せていません。


📋 この記事の3ポイント要約
⚠️
ExcelにはスプライN補間の標準関数が存在しない

Excelの「散布図(平滑線)」はグラフとして表示されるだけで、中間の補間値をセルに取り出す標準関数は搭載されていません。数値として使うにはVBAでのユーザー定義関数(UDF)が必要です。

🔬
3次スプライン補間が医療データに最適な理由

血中薬物濃度の推移や体温・心拍の経時変化など、医療現場の時系列データは急激な変曲を含むため、単純な線形補間では不自然な折れ線になりがちです。3次スプライン補間なら曲線が滑らかにつながります。

VBAのUDFで「=SPLINE()」を自作すれば完結

Excel VBAでユーザー定義関数を実装すると、セル上で「=SPLINE(x範囲, y範囲, 分割数)」を呼び出すだけで補間後の座標が一括出力されます。専用ソフト不要でExcelだけで完結できます。


スプライン補間Excelの基本概念と医療現場での必要性

スプライン補間とは、複数の離散的なデータ点(ノット)を滑らかな曲線でつなぐ数値計算手法のことです。簡単に言えば、いくつかの「通過点」を与えると、それを自然な曲線でつなぐ仕組みです。医療現場では、採血を2時間おきに行って血中薬物濃度を測定した場合、採血していない1時間後や3時間後の濃度値を推定したいというニーズが頻繁に生まれます。そういった場面で、スプライン補間は非常に大きな役割を果たします。


つまり「測定できない時点の値を、なるべく自然な形で埋める」のがスプライン補間の基本的な目的です。


医療現場でよく扱うデータとして、血中薬物濃度の推移(AUC・Cmax・Tmax解析)、患者の体温・心拍・血圧の経時変化、放射線治療での線量分布曲線、病院経営指標の月次トレンドなどが挙げられます。これらは測定ポイントが限られており、かつデータの「形」が重要な意味を持ちます。折れ線グラフでは点と点の間が直線になるため、現実には起こらない急激な変化に見えてしまうことがあります。スプライン補間を使えば、実際の生理的な変化により近い滑らかな曲線が得られます。


医療データは「自然で滑らかな変化」が基本です。


一方で、Excelを日常的に使っている医療従事者の多くが見落としているのが、ExcelにはスプライN補間を行う「標準関数が存在しない」という事実です。マイクロソフトのExcelに搭載されている関数(FORECAST.LINEAR、FORECASTなど)はすべて線形補間または線形回帰ベースの予測関数です。曲線状のデータに対して線形補間を使うと、補間点の値が実際の現象から大きくずれることがあります。後述するように、この「標準関数の欠如」こそが医療データ解析においてエラーのリスクを生む源泉になっています。


MicrosoftサポートによるFORECAST.LINEAR関数の公式解説(線形補間・回帰予測の仕様確認に役立ちます)


スプライン補間ExcelのグラフとVBAによる数値取得の違い

多くの方が勘違いしているポイントがここです。Excelの「散布図(平滑線とマーカー)」で描いた美しい曲線は、確かに視覚的にはスプライン補間に見えます。しかし、その曲線上の任意の点の数値をセルに取り出すことは、標準機能では一切できません。これは仕様です。


具体的に確認してみましょう。散布図(平滑線)を右クリックして「近似曲線の追加」を選んでも、表示される近似曲線はスプライン補間ではなく、線形・対数・多項式などのモデルフィットです。Microsoftの公式コミュニティでも「エクセルには平滑線を数式化できるような機能は用意されていません」と明言されています。


Excelの平滑線はグラフ表示専用と覚えておけばOKです。


さらに興味深いのは、Excelの平滑線がどのアルゴリズムを使っているかすら、Microsoftは長年公開していなかったという事実です。複数の研究者の調査によれば、ExcelはBézierスプラインの変形、またはCatmull-Romスプラインと呼ばれるアルゴリズムを使っているとされています。Catmull-Romスプラインとは、隣接する制御点の「向き(接線方向)」から各区間の3次曲線を決定する手法で、一般的な自然3次スプライン補間とは計算方式が異なります。


そのため、Excelの平滑線グラフと、自分でVBAを実装した「自然3次スプライン補間」は厳密には一致しない場合があります。医療データ解析の精度を確保するには、自分で実装した数値補間を使い、結果をセルで管理することが基本です。


Microsoftコミュニティ公式:Excel平滑線の数式化が不可能である旨の公式回答(数値取得の限界を理解する上で重要)


スプライン補間Excel実装の核心:3次スプライン補間の仕組み

3次スプライン補間の基本的な仕組みを理解しておくと、VBAを実装するときや、他のツール(Python、R)と比較するときに迷わなくなります。


前提として、n+1個の補間点 (x₀, y₀), (x₁, y₁), …, (xₙ, yₙ) が与えられているとします。3次スプライン補間では、隣り合う2点の区間ごとに1本の3次多項式(3次関数)を当てはめます。各区間 xᵢ₋₁, xᵢ における補間関数 Pᵢ(x) は次の形になります。


Pᵢ(x) = C₁,ᵢ + C₂,ᵢ(x - xᵢ₋₁) + C₃,ᵢ(x - xᵢ₋₁)² + C₄,ᵢ(x - xᵢ₋₁)³


ここで重要なのは、各区間の境界点(制御点)において3つの条件が同時に満たされるように係数を決定するという点です。その条件とは、①隣り合う区間の関数値が一致する(値の連続性)、②1次導関数(接線の傾き)が一致する(滑らかな接続)、③2次導関数(曲率)が一致する(急激な曲がりを防ぐ)の3点です。これらの条件が揃って初めて「自然で滑らかな」曲線が得られます。これが自然スプラインの原則です。


実際に係数を求める計算は、三重対角行列(トリダイアゴナル行列)と呼ばれる連立方程式を解くことで実現されます。データ点が10点あれば9区間分の連立方程式を一度に解くイメージです。Excelでは `Application.MMult` と `Application.MInverse`(行列積と逆行列)を組み合わせることでこの計算をVBA上で実行できます。


係数の算出と補間評価が3次スプライン実装の核心です。


医療データへの応用として、たとえば血中薬物濃度の測定が0時間・2時間・4時間・8時間・12時間・24時間の6点しかない場合、3次スプライン補間を使えば1時間刻みの推定値(最大24点)を計算で埋めることができます。これによりAUC(曲線下面積)の台形近似精度が大幅に向上します。測定点が少ない薬物動態解析では、スプライン補間で中間値を推定してから台形則でAUCを計算する手順が精度向上に直結します。これは使えそうです。


理工学的な観点からExcelでの3次スプライン補間の数式導出と係数計算を詳しく解説したページ(数式の導出を確認したい方に)


スプライン補間Excel VBAのユーザー定義関数(UDF)実装手順

ここからは実際にExcel VBAでスプライン補間のユーザー定義関数を実装する手順を解説します。大まかな流れは①VBAエディタを開く、②標準モジュールを追加する、③コードを記述する、④セルから関数として呼び出す、の4ステップです。


まずVBAエディタを開く方法ですが、Excelの「開発」タブ → 「Visual Basic」、またはキーボードショートカット Alt + F11 で起動します。「開発」タブが表示されていない場合は、ファイル → オプション → リボンのユーザー設定 → 「開発」にチェックを入れてください。


次に標準モジュールを追加します。VBAエディタ内で「挿入」→「標準モジュール」を選択します。


以下に3次スプライン補間のコア部分のVBAコードを示します。


```vba
'=== 3次スプライン補間 ユーザー定義関数 ===
Function F_SPLINE(xRng As Range, yRng As Range, xq As Double) As Double
Dim n As Long, i As Long, k As Long
Dim x() As Double, y() As Double
Dim h() As Double, a() As Double
Dim dl() As Double, dm() As Double, du() As Double
Dim rhs() As Double, m() As Double


n = xRng.Rows.Count
ReDim x(1 To n), y(1 To n)
For i = 1 To n
x(i) = xRng.Cells(i, 1).Value
y(i) = yRng.Cells(i, 1).Value
Next i


' 区間幅 h を計算
ReDim h(1 To n - 1)
For i = 1 To n - 1
h(i) = x(i + 1) - x(i)
Next i


' 三重対角行列 の設定と右辺ベクトル
ReDim dl(2 To n - 1), dm(1 To n), du(1 To n - 1)
ReDim rhs(1 To n)
dm(1) = 1: dm(n) = 1
For i = 2 To n - 1
dl(i) = h(i - 1)
dm(i) = 2 * (h(i - 1) + h(i))
du(i - 1) = h(i)
rhs(i) = 3 * ((y(i + 1) - y(i)) / h(i) - (y(i) - y(i - 1)) / h(i - 1))
Next i


' Thomas アルゴリズムで m を求める
ReDim m(1 To n)
Dim w As Double
du(1) = du(1) / dm(1)
rhs(1) = rhs(1) / dm(1)
For i = 2 To n
If i <= n - 1 Then
w = dm(i) - dl(i) * du(i - 1)
du(i) = du(i) / w
rhs(i) = (rhs(i) - dl(i) * rhs(i - 1)) / w
Else
w = dm(i) - dl(i) * du(i - 1)
rhs(i) = (rhs(i) - dl(i) * rhs(i - 1)) / w
End If
Next i
m(n) = rhs(n)
For i = n - 1 To 1 Step -1
m(i) = rhs(i) - du(i) * m(i + 1)
Next i


' xq が属する区間を特定して補間値を計算
k = 1
For i = 1 To n - 1
If xq >= x(i) And xq <= x(i + 1) Then
k = i
Exit For
End If
Next i
Dim t As Double
t = (xq - x(k)) / h(k)
F_SPLINE = (1 - t) * y(k) + t * y(k + 1) + _
t * (1 - t) * ((1 - t) * (m(k) * h(k) - (y(k + 1) - y(k))) _
- t * (m(k + 1) * h(k) - (y(k + 1) - y(k))))
End Function
```


このコードをモジュールに貼り付けると、セル上で `=F_SPLINE(A2:A7, B2:B7, 3.5)` のように呼び出せます。この例では A2:A7 がX値の範囲、B2:B7 がY値の範囲、3.5 が補間したいX座標です。VBAが使えれば関数として呼び出せるということですね。


注意点として、このコード内の `du(i - 1)` 参照は配列の境界に依存するため、データ点が3点未満の場合はエラーになります。また、xq がデータ範囲外の場合は外挿となり、精度が著しく低下します。医療データへの適用では、補間対象のX値が測定点の範囲内に収まっているかを確認してから使うことが必須です。


三次スプライン補間の数式導出からExcel VBAでの実装まで詳しく解説している記事(行列方程式AB=Cによる係数算出の詳細が参照できます)


スプライン補間ExcelとFORECAST.LINEARの使い分け:医療データ解析の独自視点

医療現場でExcelを使う際、「どの補間・予測関数を選べばいいか」は見落とされがちなテーマです。実際には、データの性質によって使い分けを誤ると、解析結果が現実から大きくずれることがあります。


まずFORECAST.LINEAR(旧FORECAST関数)は、過去のデータから線形トレンドを延長して未来の値を「予測」する関数です。これは補間ではなく回帰予測であり、データ点の間の値を滑らかに埋める用途には向いていません。たとえば、血中薬物濃度が投与後に上昇してからゆっくり減少するカーブ(PK曲線)に対してFORECAST.LINEARを使うと、まったく意味のない直線予測が返ってくるだけです。FORECAST.LINEARは線形トレンド予測専用と覚えておけばOKです。


次に線形補間(FORECAST.LINEARではなく、2点間の直線補間)は、隣り合う2つのデータ点を結ぶ直線で中間値を求める方法です。計算は簡単ですが、生理学的に滑らかであるはずのデータに適用すると、測定ポイントで「折れ角」が生じ、1次微分が不連続になります。体温グラフで1時間おきの測定点間を直線補間すると、ノコギリ歯状の不自然なグラフになる現象がその典型例です。厳しいところですね。


一方、3次スプライン補間は1次および2次微分の連続性が保証されるため、生理学的に合理的な「なめらかさ」が自動的に実現されます。測定ポイントが少ない血中濃度データに対してAUCを台形則で求める際も、スプライン補間で中間点を追加することで推定精度が向上します。


以下に3手法の使い分けをまとめます。


手法 向いているデータ 医療現場での用途例 Excelでの実現方法
FORECAST.LINEAR 直線的トレンドのデータ 患者数の年次増加予測 標準関数で可能
線形補間 変化が急で粗いデータ 欠損検査値の簡易補完 数式で手動計算可能
3次スプライン補間 曲線状・滑らかな変化 血中濃度推移・体温変化・AUC計算 VBA(UDF)が必要


実際の業務で判断に迷ったときは、「データ点の間が物理的・生理的に滑らかであるはずか?」を問いかけるのが最も簡単な選択基準です。血中濃度・体温・血圧のような生理パラメータはほぼ例外なく滑らかに変化するため、スプライン補間が適切なケースが大半を占めます。つまりスプライン補間が原則です。


スプライン補間と線形補間の違いを図解で比較している解説記事(使い分けの判断基準を確認したい方に)


スプライン補間Excel実装の注意点:オーバーシュートとノット数の管理

スプライン補間は「滑らかであること」を保証しますが、すべての状況で正確かつ安全に使えるわけではありません。特に医療データを扱う場面では、以下に述べるオーバーシュート問題が見落とされやすく、注意が必要です。


オーバーシュートとは、スプライン補間で得られた曲線が実際のデータ点の値を超えて上下に「飛び出す」現象のことです。たとえば、血中薬物濃度が一定の時間に急激に上昇してその後は低値で安定するようなデータ(フラットな谷が続くパターン)に対して3次スプライン補間を適用すると、谷の部分でマイナス方向にオーバーシュートして、現実にはありえない「負の濃度値」が算出される場合があります。これは痛いですね。


データ点の間に急激な変化(変曲点が多い)があるほど、オーバーシュートのリスクが高まります。Runge現象という、補間点数を増やすほど振動が大きくなる現象がその理論的背景です。これを防ぐ方法として、制限付き3次スプライン(Restricted Cubic Spline:RCS)という手法があります。RCSは両端の区間でスプラインの曲率をゼロに制限することで、データ範囲外でのオーバーシュートを抑制します。医療統計の専門的な解析(用量反応関係の解析など)ではRCSが標準的に用いられる理由がまさにこれです。


オーバーシュートに注意すれば大丈夫です。


Excelで実装したVBAの3次スプライン補間を使う際は、以下のことを確認するだけでリスクを大幅に減らせます。まず、補間後の数値に「ありえない値(負の濃度・体温が30℃以下など)」がないかをIF関数でチェックするルールを設けることが有効です。次に、ノット数(制御点の数)を適切に設定することが重要で、測定点が多すぎても少なすぎてもオーバーシュートや不自然な曲線が生まれます。一般的には5〜15点程度のデータであれば3次スプラインは安定して動作します。


また、Excelで実装した3次スプライン補間はx値が単調増加(x₁ < x₂ < … < xₙ)であることが前提です。時間軸データや年齢データはこの条件を自動的に満たしていますが、x値の順番が不規則なデータをそのまま入力するとエラーや誤った補間値が返ります。データを入力する前に、x値を昇順に並び替えておくことが必須です。


3次スプライン補間の学習・計算ツール(N個の入力点に対して補間曲線をブラウザ上で即座に確認できます)