概要

共分散構造分析は、構成概念を定量化し、因果関係を分析します。主な適用場面として、ブランド力の構造を把握したり、消費者の意識を把握することが挙げられます。

構成概念(潜在変数)とは、現象を単純に理解するために構成した概念で、直接測定することができない変数です。例えば「ブランド力」や「景気」などです。SEMでは、この構成概念(潜在変数)を間接的に測定(測定できる変数から計算する)し、その因果関係を分析します。回帰分析や因子分析の合わせ技といったイメージの分析手法です。

共分散構造分析の実行

全体の手順は次のようになります。各手順の解説は後述しますので、ここでは全体の流れ(「データの確認」→「モデルの作成」→「分析の実行」→「分析結果の出力」→「パス図の作成」)のコード例を示します。SEMでのキモは「モデル作成」で、検証したい因果関係の仮説を立てるところから始めます。次に潜在変数の指標としてどのような観測変数が良いかを検討します。

step.1 準備

SEMを実行するために次のパッケージを使用します。また、サンプルデータとしてRに組み込みのデータセットPoliticalDemocracyを使用します。

# ライブラリの読み込み
library(lavaan)  # SEMの実行用パッケージ
library(semTools)  # 修正インデックス等のSEMのユーティリティ
library(semPlot)  # パス図作成用のパッケージ

# データの確認
head(PoliticalDemocracy)
##      y1       y2       y3       y4       y5       y6       y7       y8
## 1  2.50 0.000000 3.333333 0.000000 1.250000 0.000000 3.726360 3.333333
## 2  1.25 0.000000 3.333333 0.000000 6.250000 1.100000 6.666666 0.736999
## 3  7.50 8.800000 9.999998 9.199991 8.750000 8.094061 9.999998 8.211809
## 4  8.90 8.800000 9.999998 9.199991 8.907948 8.127979 9.999998 4.615086
## 5 10.00 3.333333 9.999998 6.666666 7.500000 3.333333 9.999998 6.666666
## 6  7.50 3.333333 6.666666 6.666666 6.250000 1.100000 6.666666 0.368500
##         x1       x2       x3
## 1 4.442651 3.637586 2.557615
## 2 5.384495 5.062595 3.568079
## 3 5.961005 6.255750 5.224433
## 4 6.285998 7.567863 6.267495
## 5 5.863631 6.818924 4.573679
## 6 5.533389 5.135798 3.892270

step.2 モデルの作成

次表に示す4つの式のタイプを利用してモデルを記述することができます。

モデルのタイプ オペレータ
潜在変数の定義 潜在変数 =~ 観測変数 + 観測変数 + 潜在変数
回帰 目的変数 ~ 説明変数 + 説明変数
分散・共分散 変数 ~~ 変数
平均 変数 ~ 1
### モデルの作成
model <- '
# 潜在変数の定義
ind60 =~ x1 + x2 + x3
dem60 =~ y1 + y2 + y3 + y4
dem65 =~ y5 + y6 + y7 + y8
# 回帰分析
dem60 ~ ind60
dem65 ~ ind60 + dem60
'

step.3 分析の実行

SEMを実行するために、sem()関数を使います。1つ目の引数にモデル、2つ目にデータセットを指定します。

fit <- sem(model, data = PoliticalDemocracy)

step.4 分析結果の出力

分析結果のサマリーを出力するためにsummary()関数を使います。また、標準化した出力結果を出力するためには、引数にstandardized=TRUEを与えます。

summary(fit, standardized=TRUE)
## lavaan (0.5-23.1097) converged normally after  42 iterations
##
##   Number of observations                            75
##
##   Estimator                                         ML
##   Minimum Function Test Statistic               72.462
##   Degrees of freedom                                41
##   P-value (Chi-square)                           0.002
##
## Parameter Estimates:
##
##   Information                                 Expected
##   Standard Errors                             Standard
##
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   ind60 =~
##     x1                1.000                               0.669    0.920
##     x2                2.182    0.139   15.714    0.000    1.461    0.973
##     x3                1.819    0.152   11.956    0.000    1.218    0.872
##   dem60 =~
##     y1                1.000                               2.201    0.845
##     y2                1.354    0.175    7.755    0.000    2.980    0.760
##     y3                1.044    0.150    6.961    0.000    2.298    0.705
##     y4                1.300    0.138    9.412    0.000    2.860    0.860
##   dem65 =~
##     y5                1.000                               2.084    0.803
##     y6                1.258    0.164    7.651    0.000    2.623    0.783
##     y7                1.282    0.158    8.137    0.000    2.673    0.819
##     y8                1.310    0.154    8.529    0.000    2.730    0.847
##
## Regressions:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   dem60 ~
##     ind60             1.474    0.392    3.763    0.000    0.448    0.448
##   dem65 ~
##     ind60             0.453    0.220    2.064    0.039    0.146    0.146
##     dem60             0.864    0.113    7.671    0.000    0.913    0.913
##
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .x1                0.082    0.020    4.180    0.000    0.082    0.154
##    .x2                0.118    0.070    1.689    0.091    0.118    0.053
##    .x3                0.467    0.090    5.174    0.000    0.467    0.240
##    .y1                1.942    0.395    4.910    0.000    1.942    0.286
##    .y2                6.490    1.185    5.479    0.000    6.490    0.422
##    .y3                5.340    0.943    5.662    0.000    5.340    0.503
##    .y4                2.887    0.610    4.731    0.000    2.887    0.261
##    .y5                2.390    0.447    5.351    0.000    2.390    0.355
##    .y6                4.343    0.796    5.456    0.000    4.343    0.387
##    .y7                3.510    0.668    5.252    0.000    3.510    0.329
##    .y8                2.940    0.586    5.019    0.000    2.940    0.283
##     ind60             0.448    0.087    5.169    0.000    1.000    1.000
##    .dem60             3.872    0.893    4.338    0.000    0.799    0.799
##    .dem65             0.115    0.200    0.575    0.565    0.026    0.026

推定値、標準誤差、Z値などのパラメーター値を抽出するためにparameterEstimates() 関数を使います。

parameterEstimates(fit)
##      lhs op   rhs   est    se      z pvalue ci.lower ci.upper
## 1  ind60 =~    x1 1.000 0.000     NA     NA    1.000    1.000
## 2  ind60 =~    x2 2.182 0.139 15.714  0.000    1.910    2.454
## 3  ind60 =~    x3 1.819 0.152 11.956  0.000    1.521    2.117
## 4  dem60 =~    y1 1.000 0.000     NA     NA    1.000    1.000
## 5  dem60 =~    y2 1.354 0.175  7.755  0.000    1.012    1.696
## 6  dem60 =~    y3 1.044 0.150  6.961  0.000    0.750    1.338
## 7  dem60 =~    y4 1.300 0.138  9.412  0.000    1.029    1.570
## 8  dem65 =~    y5 1.000 0.000     NA     NA    1.000    1.000
## 9  dem65 =~    y6 1.258 0.164  7.651  0.000    0.936    1.581
## 10 dem65 =~    y7 1.282 0.158  8.137  0.000    0.974    1.591
## 11 dem65 =~    y8 1.310 0.154  8.529  0.000    1.009    1.611
## 12 dem60  ~ ind60 1.474 0.392  3.763  0.000    0.706    2.241
## 13 dem65  ~ ind60 0.453 0.220  2.064  0.039    0.023    0.884
## 14 dem65  ~ dem60 0.864 0.113  7.671  0.000    0.644    1.085
## 15    x1 ~~    x1 0.082 0.020  4.180  0.000    0.043    0.120
## 16    x2 ~~    x2 0.118 0.070  1.689  0.091   -0.019    0.256
## 17    x3 ~~    x3 0.467 0.090  5.174  0.000    0.290    0.644
## 18    y1 ~~    y1 1.942 0.395  4.910  0.000    1.167    2.717
## 19    y2 ~~    y2 6.490 1.185  5.479  0.000    4.168    8.811
## 20    y3 ~~    y3 5.340 0.943  5.662  0.000    3.491    7.188
## 21    y4 ~~    y4 2.887 0.610  4.731  0.000    1.691    4.083
## 22    y5 ~~    y5 2.390 0.447  5.351  0.000    1.515    3.265
## 23    y6 ~~    y6 4.343 0.796  5.456  0.000    2.783    5.903
## 24    y7 ~~    y7 3.510 0.668  5.252  0.000    2.200    4.819
## 25    y8 ~~    y8 2.940 0.586  5.019  0.000    1.792    4.089
## 26 ind60 ~~ ind60 0.448 0.087  5.169  0.000    0.278    0.618
## 27 dem60 ~~ dem60 3.872 0.893  4.338  0.000    2.122    5.621
## 28 dem65 ~~ dem65 0.115 0.200  0.575  0.565   -0.277    0.507

モデルの適合度指標とその値を抽出するためにfitMeasures()関数を使います。次の例のように適合指標名を指定することで、特定の適合指標を取り出すことができます。また、すべての適合度指標を出力するためには引数にfit.measures = “all”を与えてください。

主な適合度指標

  • CFI:独立モデル(想定しうる最も適合度が低いモデル)と分析モデルを比較して、どの程度良いものであったかを評価する指標。0から1の値をとり、1に近いほど良いモデルと解釈される。一般的に0.95以上が良適合の判断基準として用いられる。
  • RMSEA:分析モデルの悪さを測定する指標。一般的に0.05以下が良適合の判断基準として用いられる。
  • AGFI:観測変数の分散に対するモデルの説明率という観点から分析の精度を評価する指標。回帰分析における修正済み決定係数に相当する。0から1の値をとり、1に近いほど良いモデルと解釈される。一般的に0.95以上が良適合の判断基準として用いられる。
fitMeasures(fit, c("cfi", "rmsea","agfi"))
##   cfi rmsea  agfi
## 0.953 0.101 0.765

setp.5 パス図の作成

 パス図を作成するためにsemPaths()関数を使います。引数whatLabels = “stand”でパス係数に標準化解をラベルするように指定しています。  

semPaths(fit, layout = "tree", whatLabels  = "stand", rotation = 4)


「データから価値を創造する」一般社団法人データマーケティングラボラトリー

Copyright© DML All Rights Reserved.