データ分析
2025/05/15
森田 和登

【PythonでSEM】semopyを使った構造方程式モデリングの実践

本記事では、Pythonライブラリのsemopyを用いて構造方程式モデリング (SEM) を実行する方法を解説します。SEMの概要から、実際の消費者調査データを使ったSEMの分析例、具体的なPythonコードまで紹介します。

1 はじめに

構造方程式モデリングは、観測変数(実際に測定できるデータ)と潜在変数(直接は測定できないが、データから推測できる要素)との関係を明らかにする強力な統計手法です。


本ブログ記事では、消費者満足度を分析するというテーマで、Pythonのsemopyライブラリを使って構造方程式モデリングを実行する方法を紹介します。


2 構造方程式モデリングとは?

ここでは、構造方程式モデリング (Structural Equation Modeling; SEM) がどのような手法なのかを簡単に説明します。


SEMは、回帰分析やパス解析、因果分析などを包含した統合的な統計モデリング手法です。複数の説明変数間の相関関係や、目的変数への影響を統一的に推定することができる強力な手法です。


SEMの強みは、


① 観測変数だけでなく、潜在変数もモデルに組み込める


② 複数の目的変数を扱える


などの点にあると思います。これにより、分析者が持つドメイン知識を柔軟にモデルで表現することができます


SEMではパラメータ(変数間の関係の大きさ)を共分散行列を用いて推定することが多いため、共分散構造分析と呼ばれることもあります。


3 PythonでSEMを実行するためのsemopyライブラリ

構造方程式モデリング (SEM) を実行するためのツールとして近年メジャーなのは、R言語のlavaanライブラリだと思います。しかし、PythonでSEMを実行したいというユーザーも少なくないのではないでしょうか。


そんな要求に応えるのがsemopyライブラリです。



lavaanの特徴である直感的なモデル表現をそのままに、Pythonで実行できる点がsemopyの良さです。モデルの記述方法がシンプルで理解しやすく、Pythonのエコシステム内でデータ分析を完結させたい方に最適なライブラリと言えるでしょう。

4 消費者調査データを用いたSEMの実践

4-1. データセット


今回は、American Customer Satisfaction Index (ACSI) によって収集された消費者調査データを用います。ACSIは、米国の消費者の企業に対する満足度を測定するために、年間約40万人の消費者からデータを収集しています。




  • サンプルサイズ:8,239人の消費者

  • 対象の業界:加工食品、航空会社、インターネットサービスプロバイダー、銀行

  • データ収集方法:オンラインサンプリングと層別インタビュー





4-2. 分析の目的・用いる変数


消費者の期待がサービスの品質評価や価値評価、そして最終的な満足度にどのように影響し、それらが再購入意向につながるかをSEMを用いて明らかにします。


具体的には、以下の5つの潜在変数と、関連する観測変数を用いてモデルを構築します。


a. 顧客の期待 (Customer Expectations)



b. 知覚された品質 (Perceived Quality)



c. 知覚された価値 (Perceived Value)



d. 顧客満足度 (Customer Satisfaction)



e. 顧客ロイヤルティ (Customer Loyalty)



次に、これらの変数の間にどのような関係を仮定するのかについて説明します。




4-3. モデル構造の決定


パス図


今回は、下図のような変数間の関係を仮定します。



測定方程式


測定方程式では、潜在変数とそれを測定する観測変数(質問項目)の関係を表現します。 例えば、顧客の期待(Expectations)は OVERALLX, CUSTOMX, WRONGX の3つの観測変数で測定されます。



# 測定方程式
Expectations =~ OVERALLX + CUSTOMX
Quality =~ OVERALLQ + CUSTOMQ
Value =~ PQ + QP
Satisfaction =~ SATIS + CONFIRM + IDEAL
Loyalty =~ REPUR



構造方程式


構造方程式では、潜在変数同士の因果関係を定義します。





# 構造方程式
Quality ~ Expectations
Value ~ Expectations + Quality
Satisfaction ~ Expectations + Quality + Value
Loyalty ~ Satisfaction


この構造方程式はACSIの理論的枠組みに基づいており、


顧客の期待→知覚された品質→知覚された価値→顧客満足度→再購入意向


という因果の流れを仮定しています。




4-4. 分析結果



今回の分析では、「”顧客の期待”から”知覚された品質”へのパス」(1.825, p<.001)と「”顧客満足度”から”顧客ロイヤルティ”へのパス」(0.524, p=.01)が統計的に有意であることが示されました。これは、顧客が製品やサービスに対して高い期待を持つほど品質を高く評価する傾向があること、そして満足した顧客ほど再購入する可能性が高いことを意味します。


一方で、「”顧客の期待”→”知覚された価値”」「”知覚された品質”→”知覚された価値”」「”顧客の期待”→”顧客満足度”」「”知覚された品質”→”顧客満足度”」「”知覚された価値”→”顧客満足度”」のパスはいずれも統計的に有意ではありませんでした。この結果は、従来のACSIモデルで想定されていた関係性の一部が、今回のデータセットでは支持されなかったという分析の課題を示しています。




5 おわりに

本ブログ記事では、構造方程式モデリング (SEM) について簡単に説明し、ACSIによる消費者調査データに対してSEMを適用する分析の流れを紹介しました。


分析の結果、「満足度がロイヤルティを高める」という点が統計的に支持され、企業が顧客満足度を重視すべき理由が裏付けられました。満足した顧客は再購入する可能性が高く、ビジネスの持続的成長に貢献することが示唆されます。


一方で、顧客の期待・知覚された品質・知覚された価値から顧客満足度へのパスが有意でなかった点は、想定されている顧客満足度の形成メカニズムが今回の構造方程式モデリングで表現できていないことを意味します。業界別の分析やモデルの修正、あるいは追加変数の検討を行うことで、より精緻な結果を得られる可能性があります。


なお、末尾の付録にsemopyを用いてSEMを実行するためのサンプルコードがあるので、ぜひ参考にしてください。

6 参考

『研究に役立つ JASPによる多変量解析 – 因子分析から構造方程式モデリングまで –




 


semopyライブラリ



 


The American Customer Satisfaction Index (ACSI): A Sample Dataset and Description


7 付録 : semopyのサンプルコード

実行環境はPython 3.11.9で、semopyのバージョンは2.3.11です。



# ライブラリのインポート
import pandas as pd
import semopy as sem
from semopy import Model

# データの読み込み
df = pd.read_csv("your_path\your_data.csv") # csvを読み込む例

###############################
# 必要に応じてデータの前処理をする
###############################

# SEMの記述
model_desc = """
# 測定方程式
Expectations =~ OVERALLX + CUSTOMX
Quality =~ OVERALLQ + CUSTOMQ
Value =~ PQ + QP
Satisfaction =~ SATIS + CONFIRM + IDEAL
Loyalty =~ REPUR

# 構造方程式
Quality ~ Expectations
Value ~ Expectations + Quality
Satisfaction ~ Expectations + Quality + Value
Loyalty ~ Satisfaction
"""

# モデルのインスタンスを作成し、パラメータを推定
model = Model(model_desc)
result = model.fit(data)

print(result)

# パス図の描画
# ローカル環境の場合はあらかじめGraphvizをインストールする必要がある

try:
path_graph = sem.semplot(model, "sem_path_diagram.png")
except Exception as e:
import os
# Graphvizのパスを環境変数PATHに追加(例: Windowsの標準インストール先)
os.environ["PATH"] += os.pathsep + r"C:\Program Files\Graphviz\bin"
# パスを修正後、再度パス図を生成
path_graph = sem.semplot(model, "sem_path_diagram.png")

path_graph

New call-to-action