運動をすると、不健康になる?横断データ分析の罠

この記事は、産業保健職が自社の健康診断データを分析するときに知っておくとよい概念について解説します。因果と相関の違い、横断研究とコホート研究の違い、基本的な因果推論の枠組みなどがテーマです。

単年度のデータを扱うときの罠

産業保健職が健康診断のデータを分析するときに、一般的に最も入手しやすいのは業務で取り扱う健康診断データかと思います。

健康経営の取り組みのために、健康診断から会社の施策のプランを考える必要がある人もいるかもしれません。そんなときに、単年度のデータ分析だけを使って何かを言おうとすると結構間違えることがあります。

この記事では、そんな実例を眺めながら、産業保健職がデータを扱う際に知っておくと良い疫学的な話を書いていきます。

運動をすると不健康になる?

この見出し、逆じゃない?と思いませんでしたか?

その通りです!

運動をすると、本来健康になります。しかし、単年度の健康診断結果を分析すると、

運動習慣がある人の方が、肥満だったり脂質異常症の割合が高い結果になっている結果に頻繁に遭遇します。


なぜでしょうか?
運動をする人がどういう人に多いかがヒントです。

どうでしょう?前回の健康診断結果が悪いので、運動に取り組む、でももともと健康診断結果が悪いので翌年も結果が悪くなるという関係性が仮説として考えられます。

こんな関係があるのであれば、今年のデータだけを見ると、「運動をしている人の方が健康診断結果が悪くなる」という誤った結論を導いてしまいかねません。これが、運動であれば、なんか変だな?と気づくことは比較的簡単ですが、賛否ある要素である場合はデータの結果の解釈には慎重になる必要があります。

実際の構造(仮説)

先ほどの例、実際にどのような構造になっているかを考えてみます。

健康診断結果が悪い人が翌年も悪い可能性が高いのが一般的な考え方だと思います。また、よい結果の人は翌年も多分良い結果であろうと想像できます。

ここで、検診結果が悪い人がとる行動を考えてみると、悪かったので運動でもするかと考える人がたくさんいたとします(産業保健的には優秀な集団ですね。)ここで、たくさんは、太目の矢印表すこととします。

運動そのものの効果を素直に考えると、運動をすると健康診断結果はよい方向に動くはずです。逆に、運動をしないと、健康診断結果は悪い方向に動くはずです。ということで、矢印で考えると、悪い健康診断結果を受けた人は、次のようになるはずです。

あとは、健康診断結果がよかった人たちの話ですが、健康診断結果が良い人のうち半分くらいがもともと運動をしていて、半分は運動をしないなどいろいろな状況が想像できますが、全体としては、

こんな感じが想定されます。次はこの構造がもし成り立った場合に、どのようなことが起こるか、コンピューターでシミュレーションしてみます。

シミュレーションをしてみる

先の構造のデータをR言語というプログラミング言語でシミュレーションし
てみます。(プログラムそのものに興味がない人は飛ばしてください)

仮定の説明

良い健康診断の結果の人がいたとして、10%の確率で運動をやるとしましょう。運動をやっていると、6割の確率で良い結果に、またやっていないと6割の確率で悪い結果になるとします。

ただ、これだけだと、良い健診結果があると翌年も良い結果がでやすいという話が成り立たなくなるので、次のように運動からの良い結果になる可能性を30%アップさせておきます。

同様にして、悪い健康診断結果の場合を考えます。こっちは、結果が悪ければ運動をはじめやすいということで、悪い結果の人が50%の確率で運動をするようになると想定します。また、もともと悪い人が悪い結果になりやすいというところを、悪い結果になる確率を30%足すことで表現します

この二つの状況をまとめると、複雑ですが以下のようになります

プログラムでシミュレーションしてみる

さて、仮定の説明で表現したデータを、R言語を利用して作成してみます。

library(tidyverse)

set.seed(12345) #ランダムな要素があるので、ランダムさを固定して同じ結果がでるようにする
d <- tibble(prev_hcu = sample(c(0,1),500,TRUE)) #前回の健康診断の結果をランダムに決める

d <- d |> 
  mutate(
    is_exercise = case_when(
      prev_hcu == 0 ~ sample(c(0,1),500, TRUE, prob = c(0.5, 0.5)), #前の結果が悪ければ、50%の確率で運動をはじめる
      prev_hcu == 1 ~ sample(c(0,1),500, TRUE, prob = c(0.9, 0.1))  #前の結果が良ければ、10%の確率で運動をはじめる
    )
  ) |> 
  
  mutate(
    prob_good = case_when(
      is_exercise == 0 ~ 0.4,
      is_exercise == 1 ~ 0.6
    ) #運動の有無で今回の健康診断結果が「良い確率」を設定
  ) |> 
  
  mutate(
    prob_good = case_when(
      prev_hcu == 0 ~ prob_good - 0.30,
      prev_hcu == 1 ~ prob_good + 0.30
    ) #今回の健康診断結果が「良い確率」を前回の健康診断結果に応じて変化させる 
  ) |> 
  
  mutate(
    curr_hcu = map_dbl(prob_good, ~{
      sample(c(0,1), 1, TRUE, prob = c(1-., .))
    }) 
  ) # 今回の健康診断の結果をprob_goodの値に応じて決める。

(R言語を使えて、細かな内容が気になる方は、コメントを読んでみてください。)

このプログラムから出来上がるデータは、次のようです。prev_hcu列が前回の健康診断、is_exercise列が今回の健康診断で運動をしているかしていないか、prob_goodは今回の健康診断が良い結果となる確率、そしてcurr_hcuが今回の健康診断の良い、悪いです。(いずれも、悪い/運動なし=0、良い/運動あり=1としています)

このデータ、前の健康診断(prev_hcu)が悪い(=0)と、運動(is_exercise)をより高い確率で行う(=1)となって、今回の健康診断(curr_hcu)がよくなる(=1)確率が60%まで上がりますが、前の健康診断が悪いので、それが足を引っ張って、結局運動してても60-30の30%までしか良い健康診断結果となる確率はあがりません。
(注:ここで話しているのは架空の話で、リアルの話をものすごく簡略化している点にご注意ください。補足1)

では、このデータを集計してみましょう。

データの集計ー単年度

まずは、前回の健康診断の結果です。悪い人が251名、良い人が249名とおおむね半々の結果でした。ただ、この結果は、今回の健康診断のデータのみではわからないというところに注意が必要です。(過去のデータも含めて入手しないといけません)

次いで、今回の集計をしてみます。健康診断結果が良い人たち(curr_hcu=1)では、運動をしている人(is_exercise=1)の割合が29%である一方、健康診断結果が悪い人たちで運動をしている人の割合は34%となりました。

Rの出力結果だけだと見づらいので、表にしてみました。この表からも、運動があると、健康診断結果が悪いように見えますね?

分母を変えてみてみると、運動をしていない人たちで、健康診断結果が良い人の割合は51.5%である一方、運動をしている人たちで、健康診断結果が良い人の割合は45.6%です。

こっちも表にしてみるとこんな感じで、運動がない人たちの方が、良い健康診断結果になっているように見えます。

いずれの見方でも、運動と悪い健康診断結果が関連していそうに見える結果となりました。もし、データが出てくる構造のことを何も考えずに、こういう結果をみたら、「運動すると実は健康に悪いのかも?」など、大きく誤った結果を導き出してしまいかねません。

このように、単年度のデータを用いて健康診断や企業のデータを分析する場合は背景を考えて、その結果が妥当なものかを考える必要があります。

データの集計ー複数年度

単年度のデータの背景についてのデータ、つまり、前年度のデータが手元にあるとすると、先ほどの集計結果についてもう少し踏み込んで考えることができます。

ここまでは、単年度の結果を次のように見てきました。

ここからは、前回の健診結果の良い場合と悪い場合に集団を分割して考えてみることにします。

すると、結果は次のようになりました。運動のありとなしで健康診断結果が良い人の割合を見てみると、前回の結果を考慮しない場合と比べて逆の結論になっています。

参考:

また、健診の良い悪いを分母としてみてみると、

参考:

いかがでしようか?前年度の結果を考慮して集計することで、運動をしている人の方が健診結果が良い、あるいは、健診結果が良い人たちの方が運動をしているというような説明ができるようになりました。

このように、単年度だけのデータで現象を解釈するのは結構慎重になる必要があります。今回のこの例は、架空のデータをシミュレーションしたものですが、実際の産業保健業務を行う中で「血圧が高い人達の方が運動している」などと解釈することができる健康診断の単年度のデータは実際に遭遇したことがあるので、ぜひ気を付けてみてください。

疫学的な背景の説明

今回の記事で取り上げた話題について、疫学的なキーワードを提示させていただきます。もし学術的な側面からも勉強したいという方がいたら、調べてみてください。

単年度データ

ある年度の1回の調査をつかってデータを分析した結果を報告した場合、その研究は、横断研究(Cross-sectional Study)と呼ばれます。この記事で見た通り、横断研究では相関について報告できますが、因果については相当慎重に解釈する必要があります。
相関から因果を主張してはいけないということにはなりませんが、相当慎重に考えましょうという話です。

複数年度のデータ

横断研究の背景について考えたい場合は経時的に取得したデータを利用することになります。ある時点で研究を計画して、集団(コホート)を設定して、そのコホートからデータを別の時点で取得して行う研究のことをコホート研究といいます。
研究の計画がデータ収集の後に行われた場合は過去起点コホート研究(retrospective cohort study)と呼ばれます。産業保健の現場で行うデータ分析、初年度はこの形になります。逆に、研究計画を立ててからデータを集め始めるものを前向きコホート研究(prospective cohort study)と呼びます(補足2)。

産業保健のデータは、健康診断、ストレスチェック、時間外労働時間、従業員への調査データなど、定期的に反復して同一対象者から取得するものが多いです。そのため、きちんと計画を立てて取り組むことで上記のコホート研究で用いられる手法(補足3)でいろいろな分析やインサイトを得ることができます。

データの生成過程を考える

今回の記事では、次のようにデータの生成背景を確率で表記していました。

これ、もう少しシンプルにすると、次のようにデータが関係していると表現することができます。

これ、DAGとよばれる、因果推論を考える上でかなり大事で便利な考え方で、次のように、運動→前回の結果→今回の結果という矢印がつながっている限り、運動と今回の健診結果だけで物事を語ると誤ったことを主張する可能性があるというように使えます(補足4)

この赤色の矢印を伝った関係性を断ち切るには層別化や調整などを行う必要があります(補足5)。今回は層別化という手法を用いて、前回の健診結果を経由した運動と今回の健診結果への影響を取り去ってみて、運動→今回の健診結果がどれくらい影響があるかを見ています。

おわりに

ここまでお読みいただきありがとうございました。産業保健現場のデータ分析を考える場合に、何かの参考になると幸いです。尚、今回データを作成したり、分析をするにあたりR言語を利用しましたが、R言語を勉強するのであれば、

の「医師が教えるR言語での医療データ分析入門―改訂版(2022年)」を強くお勧めします(この記事を書いた者が公開しているコースであり、宣伝です。)

補足


補足1:簡略化

 この記事では、運動の有無とか健康診断の結果が良い・悪いなどと表現していますが、疫学的な教科書では、ill-definedと呼ばれる表現で「十分な定義ではない」ものとなります。例えば運動をしている、していない、はなにをもって運動になるのでしょうか?「駅まで毎日5分歩いているから運動しています」という運動しているから、「毎日会社帰りにジムで1時間ジョギングしています」という運動しているまで幅広いです。これらを同じ「運動をしている」という定義に入れると運動の効果を考えるときに不具合なのは想像できますでしょうか?厳密に定義するためには、例えば、「歩数計Aを使って、1日XXXX歩以上が月にXXXX日以上」など、後から再現できる定義を利用したり、広く使われている質問尺度などを利用することが研究を行うためには必要です。ただ、産業保健の実務でここまでやるの、それはそれで手間やコストの問題から難しいので、行われている研究+自社のデータでいろいろ考えるというのが良いのではないかと思います。

補足2:前向きと後ろ向き

前向き(prospective)コホート研究と過去起点(retrospective)研究ですが、prospectiveが前向きなのに対して、retrospectiveを後ろ向きと訳してある場合が多々ありますが、データの集め方はいずれも集団を先に設定してから、後に結果を求める形になります。こんな記事https://www.igaku-shoin.co.jp/paper/archive/y2021/kanchigai_02に、後ろ向き?過去起点?の話について記載されていたりするので、興味がある方はぜひ読んでみてください


補足3:分析手法

この記事では解説しませんが、疫学研究に関する教科書などに記載されている手法は産業保健の現場のデータから何かを考えるのに非常に役に立ちます。これまで全く勉強したことがないという人はhttps://amzn.to/3Uwd17tや、https://amzn.to/3UzbCggなどの教科書が参考になると思います。(産業保健では関係ない話題もありますが。)
(注:アマゾンのアフェリエイトリンクです。)

補足4:DAG

この、矢印がつながるという概念、D-separationというルールがいくつかあるのですが、興味がある方はDAGで検索して調べてみてください。英語であれば無料のオンライン講義や教科書など良い資料があります。日本語では私の知る限り、https://amzn.to/3we03kJに比較的わかりやすい説明がかかれていました(が、まったく背景知識なしではちょっと難しいと思います。)
(注:アマゾンのアフェリエイトリンクです。)

補足5:調整

層別化は今回実施した方法ですが、もっと変数が多くなってくると層別化は難しくなります。その場合は、重回帰分析、ロジスティック回帰分析などの多変量解析と呼ばれる方法をとることをお勧めします。(が、これらの手法、安易に利用すると、それはそれで誤った結論にたどり着くことがあるので、きちんと理解している人に教わる等をお勧めします。)

この記事が気に入ったらサポートをしてみませんか?