因果推論を用いたポジショニングが患者の褥瘡発生率に与える影響(1)

【はじめに】

ポジショニングに関する仮想データを生成し、因果推論を用いて解析するシミュレーションモデルの例題を作成しました。このシナリオでは、ポジショニングが患者の褥瘡発生率に与える影響を調べます。そこで、高齢者の褥瘡(じょくそう)発生リスクを予測するためのロジスティック回帰モデルを構築・評価するPythonコードを示します。

 

【例題の設定と前提条件】

  • 仮想データセット: 1000人の患者を想定し、それぞれについてポジショニングの質(良い/悪い)、年齢、性別、既存の健康状態(良好/中等度/悪い)、褥瘡発生(はい/いいえ)のデータを生成します。
  • 因果推論の目的: ポジショニングの質が褥瘡発生にどの程度影響を与えるかを推定します。
  • 統計モデル: ロジスティック回帰モデルを使用し、ポジショニングの質が褥瘡発生の確率に与える影響を分析します。

 

 

Pythonコード】

import numpy as np

import pandas as pd

from sklearn.linear_model import LogisticRegression

from sklearn.model_selection import train_test_split

from sklearn.metrics import classification_report

 

# 仮想データの生成

np.random.seed(0) #乱数生成のシードを設定します。これにより、毎回同じ乱数が生成されるようになり、結果が再現可能になります。

data_size = 1000 #データセットのサイズを1000と定義します。つまり、1000人分のデータを生成します。

age = np.random.normal(70, 10, data_size) #正規分布に従う年齢データを生成します。平均年齢は70歳、標準偏差は10です。1000個の年齢データが生成されます。

gender = np.random.choice(['男性', '女性'], data_size) #1000個の「男性」または「女性」の性別データをランダムに生成します。

health_condition = np.random.choice(['良好', '中等度', '悪い'], data_size, p=[0.5, 0.3, 0.2]) #「良好」、「中等度」、「悪い」の健康状態をランダムに生成します。各状態の選ばれる確率はそれぞれ50%30%20%です。

positioning_quality = np.random.choice(['良い', '悪い'], data_size, p=[0.7, 0.3]) #「良い」または「悪い」のポジショニングの質をランダムに生成します。「良い」が70%、「悪い」が30%の確率で選ばれます。

bedsore_occurrence = (np.random.rand(data_size) < (0.3 + 0.5 * (positioning_quality == '悪い'))).astype(int) #褥瘡発生のデータを生成します。np.random.rand(data_size)0から1までの一様分布に従うランダムな数値を生成します。この値が (0.3 + 0.5 * (positioning_quality == '悪い')) より小さい場合に褥瘡が発生したとします。ポジショニングの質が「悪い」場合、褥瘡が発生する確率は0.80.3 + 0.5)となり、質が「良い」場合は0.3です。これを整数型(0または1)に変換しますつまり、、ポジショニングが「悪い」と褥瘡発生確率が高くなるように設計(最大80%!)しました。

 

# DataFrameの作成

df = pd.DataFrame({

    '年齢': age,

    '性別': gender,

    '健康状態': health_condition,

    'ポジショニングの質': positioning_quality,

    '褥瘡発生': bedsore_occurrence

})  #上記の情報をまとめて、1つの表(DataFrame)にします。

 

# 因果推論のためのデータ準備

X = pd.get_dummies(df.drop('褥瘡発生', axis=1), drop_first=True) #文字データ(カテゴリ変数)を数値に変換(ダミー変数化)。drop_first=Trueで多重共線性を防ぎます。

y = df['褥瘡発生'] #目的変数(ターゲット)は褥瘡の有無(0 or 1)です。

 

# データの分割

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) #学習用とテスト用にデータを分割(8:2)します。

# ロジスティックス回帰モデルを学習

model = LogisticRegression()

model.fit(X_train, y_train)

 

# テストデータでの予測

predictions = model.predict(X_test)

 

# 結果の報告

print(classification_report(y_test, predictions)) #テストデータで予測した精度・再現率・F1スコアなどを表示します。

 

出力結果

Optimization terminated successfully.   (最適化は正常に終了しました。)

         Current function value: 0.588391(現在の関数値:0.588391

         Iterations 5                    (反復 5)

                           Logit Regression Results(ロジット回帰の結果) 

==============================================================================

Dep. Variable:               y   No. Observations:         1000

Model:                  Logit   Df Residuals:              994

Method:                  MLE   Df Model():                 5

Date:            Fri, 26 Jul 2024  Pseudo R-squ.:          0.1497

Time(時間):            07:01:56   Log-Likelihood:        -588.39

converged:                 True   LL-Null:              -691.99

Covariance Type:      nonrobust   LLR p-value:         8.151e-43

==============================================================================

                 coef    std err          z      P>|z|      [0.025      0.975]

--------------------------------------------------------------------------------------------------

const          2.3942      0.535      4.478      0.000       1.346       3.442

x1            -0.0146      0.007     -2.026      0.043      -0.029      -0.000

x2             0.1348      0.142      0.952      0.341      -0.143       0.412

x3             0.1846      0.203      0.911      0.362      -0.213       0.582

x4            -0.0535      0.164     -0.327      0.744      -0.374       0.267

x5            -2.1624      0.168    -12.865      0.000      -2.492      -1.833

==============================================================================

褥瘡発生(1)と非発生(0) を予測したモデルの性能

                No    precision    recall     f1-score     support

                 0        0.63         0.85        0.72         105

                 1        0.73         0.45        0.56          95

    accuracy精度                                                       0.66                200   全体の66%を正しく予測できます(正解率)                                 

   macro avg 平均         0.68                    0.65                0.64                200   クラス0と1の平均。バランス評価に使える

aweighted 加重平均     0.68                    0.66                0.65               200   supportの多いクラスの影響が大きくなる平均

精度はそこそこ(66%)だが、偏りがある → 予防の観点では、発生者をもっと正確に見つけたい。


クラス別の評価

指標意味クラス0(非発生)クラス1(発生)
precision(適合率)「予測が当たった割合」予測が1だった中で、本当に1だった割合   0.63 0.73
recall(再現率)「見逃しの少なさ」実際に1だった中で、ちゃんと1と予測できた割合。非発生(0)の再現率が高い(0.85) → 褥瘡が起きてない人はよく見つけられてる!発生(1)の再現率が低い(0.45) → 褥瘡が起きてる人の見逃しが多い! 0.85 0.45
f1-scoreprecisionとrecallのバランス 0.72 0.56
support各クラスの実際の件数 105人 95人



  

Chi2: 189.23775532054566, p-value: 4.66352495494576e-43

 

結果の解釈

上記のPythonコードは、仮想データに基づいてロジスティック回帰モデルを学習し、褥瘡発生の予測を行います。classification_report関数によって出力されるレポートは、モデルの精度、リコール、F1スコアなどの評価指標を提供します。これらの指標を用いて、ポジショニングの質が褥瘡発生に与える影響の大きさと、モデルの予測性能を評価することができます。

このシミュレーションモデルは、実際の臨床データに基づいた研究においても応用可能であり、ポジショニングの質の改善が褥瘡予防に有効であることを示唆するために使用することができます。ただし、実際のデータを使用する場合は、より多くの変数や患者の特性を考慮に入れる必要があります。また、データの収集方法や分析手法によって結果が異なる可能性があるため、注意が必要です。

 

結果の説明

ロジスティック回帰モデルの結果

基本統計情報

Dep. Variable (従属変数): y (褥瘡発生)

No. Observations (観測数): 1000

Model: ロジスティック回帰モデル

Method: MLE (最大尤度法)

Df Residuals (残差の自由度): 994 (1000-5-1994

Df Model (モデルの自由度): 5

Pseudo R-squ.: 0.1497(擬似決定係数、モデルの説明力の指標)

Log-Likelihood (対数尤度): -588.39(モデルの適合度を示す)

LL-Null: -691.99(定数項のみのモデルの対数尤度)

LLR p-value: 8.151e-43(モデル全体の有意性を示す)

係数の解釈

const (定数項): 2.3942(褥瘡発生の基準確率を示す)

x1 (年齢): -0.0146

std err (標準誤差): 0.007

z (z): -2.026

P>|z| (p): 0.043

[0.025, 0.975] (95%信頼区間): [-0.029, -0.000]

x2 (性別_女性): 0.1348

std err: 0.142

z: 0.952

P>|z|: 0.341

[0.025, 0.975]: [-0.143, 0.412]

x3 (健康状態_中等度): 0.1846

std err: 0.203

z: 0.911

P>|z|: 0.362

[0.025, 0.975]: [-0.213, 0.582]

x4 (健康状態_悪い): -0.0535

std err: 0.164

z: -0.327

P>|z|: 0.744

[0.025, 0.975]: [-0.374, 0.267]

x5 (ポジショニングの質_悪い): -2.1624

std err: 0.168

z: -12.865

P>|z|: 0.000

[0.025, 0.975]: [-2.492, -1.833]

結果の解釈

年齢と褥瘡発生の関係

係数: -0.0146

p: 0.043

年齢が高くなると褥瘡発生の確率がわずかに減少することを示していますが、p値が0.043であり、通常の有意水準(0.05)よりも小さいため、この結果は統計的に有意です。

 

ポジショニングの質と褥瘡発生の関係

係数: -2.1624

p: 0.000

ポジショニングの質が「悪い」と褥瘡発生の確率が大幅に増加することを示しています。p値が非常に小さいため、この結果は非常に統計的に有意です。

 

検定方法

ロジスティック回帰モデルの評価

擬似決定係数 (Pseudo R-squared): 0.1497

モデルの説明力を示す指標ですが、線形回帰の決定係数 (R-squared) とは異なり、0に近 いほどモデルがデータをうまく説明していないことを示します。

対数尤度比検定 (Likelihood Ratio Test)

LLR p-value: 8.151e-43

モデル全体の有意性を評価し、非常に小さいp値はモデルが有意であることを示しています。

個々の変数の有意性

z検定:

各変数の係数が統計的に有意かどうかを評価します。p値が0.05未満であれば、通常その変数は統計的に有意とされます。

この結果から、年齢が褥瘡発生に与える影響はわずかであるものの有意であり、ポジショニングの質が褥瘡発生に強い影響を与えることが確認されました。

 

数値結果の解説

   Precision(適合率)特定のクラスに属すると予測されたデータのうち、実際にそのクラスに属するデータの割合

褥瘡なし: 0.63、褥瘡あり: 0.73

   Recall(再現率)実際に特定のクラスに属するデータのうち、正しくそのクラスに属すると予測されたデータの割合

褥瘡なし: 0.85、褥瘡あり: 0.45

   F1-score 適合率と再現率の調和平均

褥瘡なし: 0.72、褥瘡あり: 0.56

   Accuracy(正解率)全体のうち、正しく予測された割合。0.6666%

これらの結果から、褥瘡なしの場合は高い再現率を持つが、褥瘡ありの場合には適合率は高いが再現率が低いことがわかります。全体の正解率は66%です。

 

混同行列(Confusion Matrix

混同行列は、モデルの予測結果を視覚的に示します。以下は、予測と実際の分類の一致と不一致を示します。

左上(0,0)=89 褥瘡が発生しなかったと予測し、実際にも発生しなかった数(True Negative

右上(0,1)=16 褥瘡が発生すると予測したが、実際には発生しなかった数(False Positive

左下(1,0)52 褥瘡が発生しなかったと予測したが、実際には発生した数(False Negative

右下(1,1)43 褥瘡が発生すると予測し、実際にも発生した数(True Positive

 

年齢と褥瘡発生の関係ヒストグラム

ヒストグラムは、年齢と褥瘡発生の関係を示します。褥瘡が発生した人としなかった人の年齢分布の違いを見ることができます。年齢別の褥瘡発生分布により、年齢が高いほど褥瘡が発生しているようですが視覚的には微妙です。


モデルを改善するには、発生者(1)の再現率を上げる工夫が必要!

  • 例えば、特徴量の追加(栄養状態や寝返り頻度など)や、モデルのチューニング(重み調整)に挑戦しても良い。

このブログの人気の投稿

片貝の四尺玉は世界一を連呼する『片貝賛歌~希望の花~』を作詞しました!!

小論文 統計的因果推論の現場適用による排泄ケアの展望

論文 排泄ケアにおける尊厳の保持と社会システムの課題 ~「おむつ」をめぐる心理的・文化的考察~