ベイジアンネットワークとは?仕組みとPython入門

AI用語

複数の要因が複雑に絡み合うデータを扱うとき、「どれが本当に効いているのか」「もし条件を変えたら結果はどうなるのか」を直感的に理解するのは簡単ではありません。ベイジアンネットワークは、こうした複雑な依存関係をグラフ構造として整理し、確率でシナリオを評価できる手法です。しかもPythonなら、専用ライブラリを使って数十行ほどのコードで動かすこともできます。

この記事では、ベイジアンネットワークの基本概念から、Python(pgmpy)による最小実装、ビジネスでの使いどころ、注意点までを一通り整理します。読み終えるころには、「ベイジアンネットワークとは何か」「自分の業務ならどこで役立ちそうか」を自分の言葉で説明できる状態を目指します。

📖この記事のポイント

  • ベイジアンネットワークは複数要因の依存関係を非循環有向グラフ(DAG)で表し、条件付き確率の積で全体を扱うモデル!
  • 条件付き独立の仕組みにより、複雑な確率分布を小さなCPDに分解でき、「どの要因がどこに効いているか」を直感的に理解しやすい!
  • 部分的な観測から他の確率を推論したり、What-if分析で施策ごとのシナリオ比較ができ、マーケ・製造・医療など幅広く活用できる!
  • Pythonのpgmpyを使えば、数十行のコードで「天気→渋滞→遅刻」のようなネットワークを作成し推論まで体験できる!
  • 実務で使う際は、因果の向きはデータだけでは決まらない点や、変数増加による複雑化、連続値の離散化といった注意点が重要!
  • たった2時間の無料セミナー会社に依存しない働き方&AIスキルを身につけられる!
  • 今すぐ申し込めば、すぐに月収10万円UPを目指すための超有料級の12大特典も無料でもらえる!

\ 累計受講者10万人突破 /

無料特典を今すぐ受け取る
監修者プロフィール
森下浩志
日本最大級のAI情報プラットフォーム「romptn ai」編集長。著書に「0からはじめるStable Diffusion」「0からはじめるStable Diffusion モデル・拡張機能集編」など、AmazonベストセラーのAI関連書籍を多数執筆。AIにおける情報の非対称性を解消するための社内研修や出張講義も行う。

ベイジアンネットワークとは?直感的に理解する

出来事をノードと矢印で表す確率モデル

ベイジアンネットワーク(Bayesian Network)は、出来事や状態を「ノード(確率変数)」、その影響の向きを「矢印(依存関係)」として表す確率モデルです。矢印に循環がないため、構造は必ず「非循環有向グラフ(DAG: Directed Acyclic Graph)」になります。ベイズネット、信念ネットワークと呼ばれることもあります。

例えば「雨」「渋滞」「遅刻」という3つの要因を考えます。

  • 雨が降ると渋滞が起きやすくなる
  • 渋滞が起きると遅刻しやすくなる

この関係をそのまま矢印で表すと「雨 → 渋滞 → 遅刻」というネットワークになります。ノード同士の矢印が、どの要因がどの要因に影響しているかを視覚的に教えてくれるイメージです。

条件付き確率と「分解」の考え方

ベイジアンネットワークの肝は、複雑な確率分布を「条件付き確率の積」に分解できることです。変数を X1, X2, …, Xn とし、それぞれの親ノード集合を Parents(Xi) とすると、全体の同時確率は次のように書けます。

P(X1, X2, …, Xn) = Π P(Xi | Parents(Xi))

つまり、大きな確率分布を「各ノードが親ノードの影響をどれだけ受けるか」を表す小さな条件付き確率に分割して管理できます。このとき、

  • 同じ親ノードを持つ子ノード同士は、親の状態を知っていれば互いに条件付き独立になる

という性質が生まれます。先ほどの例でいうと、「雨 → 渋滞 → 遅刻」という構造がある場合、渋滞の状態が分かっていれば、雨であるかどうかに直接頼らなくても遅刻確率を計算できる、というイメージです。

回帰分析やディープラーニングとの違い

回帰分析は、ある1つの目的変数(売上、離反率など)を説明変数の組み合わせで説明するのに優れた手法です。一方で、「AがBに影響し、BがCに影響する」といった多段の構造や、相互に絡み合った因果関係を表すことはあまり得意ではありません。

ベイジアンネットワークは、複数の要因が階層的・段階的に影響し合う構造を、グラフとしてそのまま表現できます。そのため、「どの段階のどの要因が効いているのか」を直感的に捉えやすくなります。

また、ディープラーニングは高い予測精度が期待できる一方で、内部の判断プロセスがブラックボックスになりがちです。それに対してベイジアンネットワークは、

  • どのノードがどのノードに影響しているかが明確
  • 条件を変えたときの影響を確率として説明しやすい

という特徴があり、説明責任が求められる領域(医療、金融、公共政策など)と相性が良い手法です。

ベイジアンネットワークでできることと活用イメージ

複数要因の依存関係を可視化して共通理解をつくる

ベイジアンネットワークを使うと、複数要因が関わるプロセスを一枚のグラフにまとめられます。

  • 「どの要因が入り口で、どこに波及していくか」が一目で分かる
  • 関係者同士で「業務プロセスのイメージ」を共有しやすい

例えばマーケティングであれば、「認知 → 興味 → サイト訪問 → 購入」といった流れをノードと矢印で整理するだけでも、「ボトルネックがどこにありそうか」「どの施策がどこに効きそうか」の議論がしやすくなります。

部分的な観測から他の確率を推論できる

ベイジアンネットワークでは、一部のノードの状態だけが分かっている状況でも、他のノードの確率を推論できます。例えば先ほどの「雨 → 渋滞 → 遅刻」モデルで、

  • 「渋滞している」という観測だけが分かっているとき

に、「雨であった確率」や「遅刻する確率」を更新して計算できます。これは、実務では次のような場面で役立ちます。

  • センサーの一部が欠損しているが、残りの情報から異常確率を知りたい
  • 購買履歴は分からないが、サイト行動だけから離反リスクを推定したい

簡単なイメージとして、以下のような形で確率が更新されていきます。

条件「雨」である確率「遅刻する」確率
条件なし30%10%
渋滞していると分かった場合60%25%

実際の数値はモデル次第ですが、このように「観測した事実に応じて他の確率が更新される」のがベイジアンネットワークの強みです。

シナリオ分析で「もし〜なら」を定量的に比較できる

ベイジアンネットワークは、What-if分析にも向いています。例えばマーケティング施策で、

  • 「値引きを強くした場合」
  • 「広告出稿量を増やした場合」

それぞれのシナリオで最終的な購買確率がどう変わるかを、確率として比較できます。単に「売上が上がりそう」という感覚ではなく、「この施策なら購入確率が何%ポイント上がる」という形で議論できるため、意思決定の納得感を高めることができます。

代表的な活用シーン

  • マーケティング:認知・興味・検討・購入といったステップをノードとして表現し、どの施策がどのステップに効いているかを可視化する。
  • 製造・保守:センサー値、環境条件、稼働時間などの依存関係を整理し、異常検知や故障確率の推定、予防保全に活用する。
  • 医療・ヘルスケア:生活習慣や検査値、症状と疾病リスクの関係をモデル化し、部分的な情報からでもリスクを推定する。
  • レコメンド・行動予測:興味・閲覧・カート投入・購入などのユーザー行動をネットワークとして表し、どの行動が次の行動をどの程度押し上げるかを分析する。

Pythonで試すベイジアンネットワーク(pgmpy)

pgmpyとは?インストール方法

Pythonでベイジアンネットワークを扱う代表的なライブラリの一つが「pgmpy」です。離散値のベイジアンネットワークであれば、

  • ネットワーク構造の定義
  • 条件付き確率表(CPD: Conditional Probability Distribution)の設定
  • 推論(確率の計算)

までを一通りカバーできます。インストールは次のように行います。

pip install pgmpy

最小モデルを作って推論まで体験する

先ほどの「天気(Weather)→ 渋滞(Traffic)→ 遅刻(Late)」を、pgmpyで簡単に表現してみます。ここでは各変数を「0: いい状態」「1: 良くない状態」として扱います。

1. モデル構造の定義

from pgmpy.models import BayesianModel
from pgmpy.factors.discrete import TabularCPD
from pgmpy.inference import VariableElimination

model = BayesianModel([('Weather', 'Traffic'), ('Traffic', 'Late')])

2. 条件付き確率(CPD)の設定

cpd_weather = TabularCPD(
    variable='Weather', variable_card=2,
    values=[[0.7],  # Weather = 0(晴れ)
            [0.3]]  # Weather = 1(雨)
)

cpd_traffic = TabularCPD(
    variable='Traffic', variable_card=2,
    values=[[0.9, 0.4],   # Traffic = 0(渋滞なし)
            [0.1, 0.6]],  # Traffic = 1(渋滞あり)
    evidence=['Weather'], evidence_card=[2]
)

cpd_late = TabularCPD(
    variable='Late', variable_card=2,
    values=[[0.95, 0.6],   # Late = 0(遅刻しない)
            [0.05, 0.4]],  # Late = 1(遅刻する)
    evidence=['Traffic'], evidence_card=[2]
)

model.add_cpds(cpd_weather, cpd_traffic, cpd_late)
model.check_model()

3. 推論の実行

infer = VariableElimination(model)
result = infer.query(variables=['Late'], evidence={'Weather': 1})
print(result)

ここでは「Weather = 1(雨)」と与えたときの「遅刻する確率(Late = 1)」を推論しています。実際に実行すると、

  • Late = 0(遅刻しない)
  • Late = 1(遅刻する)

それぞれの確率が出力され、雨の日に遅刻するリスクがどれくらい上がるかを数値として確認できます。少ないコードで「条件を変えると結果がどう変わるか」を体験できるのが、ベイジアンネットワークとpgmpyの良さです。

一歩先へ:構造学習とパラメータ学習

実務では、

  • ネットワーク構造(どのノードがどれに矢印を出すか)をデータから学習する構造学習
  • 構造が決まった前提で、条件付き確率をデータから推定するパラメータ学習

といったステップも重要になります。pgmpyにはこれらをサポートする機能もあるため、まずは小さなネットワークで動作を理解し、その後に構造学習などへ広げていく流れが現実的です。

実務で意識したい注意点と限界

因果の向きはデータだけでは決まらない

ベイジアンネットワークは因果関係を表現しやすいモデルですが、データだけを見て自動的に「これが原因でこれが結果」と断定できるわけではありません。構造学習で矢印の向きの候補を提案することはできますが、最終的には、

  • ドメイン知識(業務や現象についての専門知識)
  • 実験や追加分析

を組み合わせて判断する必要があります。「因果の可能性を示す」ことと、「因果だと断言する」ことは分けて考えるのが安全です。

変数が増えるとモデルが複雑化する

ノードや矢印を増やしすぎると、

  • 学習に必要なデータ量が増える
  • 条件付き確率表が指数的に大きくなる
  • グラフが複雑になり、読み手が理解しづらくなる

といった問題が生じます。実務的には、最初から「すべての変数」を詰め込むのではなく、

  • 重要な要因に絞った小さなモデルから始める
  • 必要に応じて少しずつノードを追加していく

という進め方が現実的です。

連続値は離散化が必要になるケースが多い

ベイジアンネットワークの代表的な実装では、変数は離散値(カテゴリ)として扱われることが多く、温度や売上金額などの連続値は、

  • 低・中・高
  • 小・中・大

といったカテゴリに区切って「離散化」してからモデル化します。この離散化の仕方によって結果が変わることもあるため、

  • 現場の感覚に合う区切り方になっているか
  • データ分布が極端に偏っていないか

などを意識することが大切です。連続値をそのまま扱えるベイジアンネットワークの拡張手法もありますが、まずは離散値モデルで感覚を掴むのがおすすめです。

よくある質問(FAQ)

ベイジアンネットワークは因果関係を保証してくれますか?

ベイジアンネットワークは因果の候補を表現するのには適していますが、「これが原因でこれが結果だ」と自動的に保証してくれるわけではありません。基本的には、「この構造を仮定したときに、データとどれくらい整合的か」「その構造がドメイン知識と矛盾しないか」を確認しながら使う必要があります。

ベイジアンネットワークとベイズ推定は何が違いますか?

ベイズ推定は、事前分布とデータから事後分布を計算するというベイズ統計の基本的な考え方を指します。一方、ベイジアンネットワークは、多数の確率変数の関係をグラフ構造と条件付き確率で表現するモデルです。ベイジアンネットワークの内部でも、確率の更新にはベイズ推定の考え方が使われています。

Pythonで最も簡単に使えるライブラリは?

離散値のベイジアンネットワークを手軽に試すのであれば、pgmpyが扱いやすい選択肢の一つです。ネットワーク構造の定義、条件付き確率の設定、推論までを一つのライブラリで完結できます。他にも、拡張的な確率モデルを扱えるライブラリはいくつかありますが、まずはpgmpyで小さなモデルを作って感覚を掴むのがよいでしょう。

どんなデータ構造に向いていますか?

ベイジアンネットワークは、

  • 要因が複数段に連鎖しているケース(例:認知 → 興味 → 購入)
  • 「なぜその結果になったのか」という説明責任が求められるケース
  • 一部の情報しか観測できないが、残りを推定したいケース

といった場面に特に向いています。一方で、数百〜数千の変数を一度に扱うような超高次元データでは、モデル設計と計算コストの観点から別の手法を検討することも多いです。

まとめ

  • ベイジアンネットワークは、複数要因の依存関係を非循環有向グラフ(DAG)として表し、条件付き確率の積で全体の確率分布を扱う手法です。
  • 回帰分析やディープラーニングと比べて、構造が明示されており、「なぜそうなるのか」を確率とグラフで説明しやすいという強みがあります。
  • 部分的な観測から他の確率を推論したり、施策ごとのシナリオを確率で比較したりできるため、マーケティングや製造、医療、レコメンドなど幅広い分野で活用できます。
  • Pythonのpgmpyを使えば、数十行のコードで小さなベイジアンネットワークを構築し、実際に推論を試すことができます。
  • 一方で、因果の向きはデータだけでは決まらないこと、変数を増やしすぎるとモデルが複雑化すること、連続値では離散化が必要になることなどの注意点もあります。

ベイジアンネットワークは、一見すると難しそうに見えますが、小さなモデルから触ってみると「複数の要因がどう効いているか」を驚くほど整理してくれます。まずはシンプルな業務プロセスを例に、Pythonとpgmpyでミニモデルを作り、自分の仕事のどこで活かせそうかを考えてみてください。

romptn ai厳選のおすすめ無料AIセミナーでは、AIの勉強法に不安を感じている方に向けた内容でオンラインセミナーを開催しています。

AIを使った副業の始め方や、収入を得るまでのロードマップについて解説しているほか、受講者の方には、ここでしか手に入らないおすすめのプロンプト集などの特典もプレゼント中です。

AIについて効率的に学ぶ方法や、業務での活用に関心がある方は、ぜひご参加ください。

\累計受講者10万人突破/