どんな分野に関わらずデータ分析に興味があるけどどうしたらいいか全然わからないという方向けの無料講座が開設されました。実際に受講してみたので、どんな内容か?どんな人向けなのか?を紹介しましす。

2020/10/2更新
社会人のためのデータサイエンス演習が受講できるようになりました。
社会人のためのデータサイエンス入門は修了証はもらえませんが受講はできます。

gacco

gaffoとは大学教授をはじめとした一流の講師陣による本格的な講義を、誰でも無料で受けられるウェブサービスです。
 
gaccoはMOOCというオンラインで講義や課題を受けられるサービスの1つです。
今回紹介する講座の提供元は総務省統計局です。この講座を登録・受講したからといって「続きはこちら」などと言って高額な有料講座を勧められることもありません。


今回gaccoにデータ分析未経験者向けの口座が開講されました。


社会人のためのデータサイエンス演習
社会人のためのデータサイエンス入門




講座内容

「入門」ではデータ分析の基本的な言葉やデータの見方を紹介しているのに対し、「演習」では実際のExcelのデータを使ってデータ分析の基本を学ぶことができます。



社会人のためのデータサイエンス入門
今、ビジネスの現場では、統計的な思考力によって様々な課題を解決していく能力、すなわち"データサイエンス"力の高い人材が求められている。このようなことを踏まえ、本コースでは"データサイエンス"力の向上を目指し、事例なども踏まえ、データ分析の基本的な知識を学ぶ。

この講座は4週間のコースになります。

第1週:統計データの活用

~コースへの導入、分析事例から分析に用いる統計的な考え方、データの見方への導入を図る~

  • 大人がデータサイエンスを学ぶべき理由~はじめに
  • データサイエンスと統計~データサイエンスに基づいて課題を解決する能力を身に付けよう
  • 平均値の見方~分析事例(1)~"平均値"にだまされない
  • M字カーブの改善効果~分析事例(2)~少子高齢化社会を支える労働力人口の増加のために
  • 普及率の地域間比較~分析事例(3)~太陽光発電システムの普及率
  • 付加価値額と非正規職員比率の関係~分析事例(4)~付加価値額の産業間比較
  • スポーツをデータで科学する~分析事例(5)~ワールドカップで勝つためには
  • 合計特殊出生率の見方~分析事例(6)~都道府県別合計特殊出生率から見る少子高齢化
  • 国際比較データから日本社会を読み解く~分析事例(7)~国際比較データから見る平均寿命とGDPの関係と日本の特徴

第2週:統計学の基礎

~データ分析に必要な統計学の基礎を学ぶ~

  • 代表値~平均・中央値・最頻値~たくさんのデータをひとつの数値であらわそう
  • 分散・標準偏差~データの中の違いをあらわそう
  • 四分位・パーセンタイル・箱ひげ図~データの分布を表現しよう
  • 関係の見方・相関係数~データの間の関係を表現しよう(1)
  • 回帰分析~データの間の関係を表現しよう(2)
  • 標本分布~統計数値の精度を知ろう(1)
  • 信頼区間~統計数値の精度を知ろう(2)

第3週:データの見方

~データの見方について基本的な方法を学ぶ~

  • 統計表の見方~実際のデータを見てみましょう
  • 比率の見方(1)-クロスセクションデータ~比率の活用
  • 比率の見方(2)-使い方と注意点~比率を使った分析
  • 時系列データの見方(1)-基礎編~時間とともに観測されるデータ
  • 時系列データの見方(2)-発展編~様々な調整
  • 時系列データの見方(3)-分析編~予測をしてみましょう

第4週:公的データの使い方とコースのまとめ

~誰もが入手可能なデータである公的統計データの入手方法を学び、コースのまとめを行う~

  • 政府統計とは~統計局の統計調査の紹介
  • 公的データの入手方法~e-Statの紹介/e-Statの主な機能
  • e-Statの使い方(人口ピラミッド)~データベース機能を利用して人口ピラミッドを作ってみよう
  • 統計ダッシュボードの使い方~統計ダッシュボードの紹介/統計ダッシュボードを使ってみよう
  • 地図で見る統計(jSTAT MAP)の主な機能~jSTAT MAPの紹介/jSTAT MAPの主な機能
  • 地図で見る統計(jSTAT MAP)の使い方~jSTAT MAPを使って地図上にデータをあらわしてみよう
  • コースのまとめ~データサイエンス力の向上を目指して




社会人のためのデータサイエンス演習

総務省統計局が提供する講座、ビジネスの現場で求められているデータサイエンスをわかりやすく解説します。

今、ビジネスの現場では、統計的な思考力によって様々な課題を解決していく能力、すなわち“データサイエンス”力の高い人材が求められている。本コースでは“データサイエンス”力の向上を目指し、事例なども踏まえ、ビジネスの現場で使われる実践的なデータ分析(統計分析)の手法を身につける。

この講座は5週のコースになります。


第1週:データサイエンスとは

  • “データサイエンス”力の高い人材育成について
  • データサイエンスが必要とされる背景
  • データサイエンスに求められるスキルや知識
  • データサイエンスの将来
  • PPDACサイクルに沿った問題解決の進め方
  • 分析の設計手法

第2週:分析の概念と事例

~ビジネス課題解決のためのデータ分析基礎(事例と手法)(1)~

  • Analysis(分析)とは
  • 1変数の状況の把握(1)(可視化の活用)
  • 1変数の状況の把握(2)(代表値の活用)
  • 比較して2変数の関係を見る
  • ビジネスにおける比較(1)(概要)
  • ビジネスにおける比較(2)(適切なA/Bテストの活用)

第3週:分析の具体的手法

~ビジネス課題解決のためのデータ分析基礎(事例と手法)(2)~

  • クロス集計の軸設定と見方
  • 散布図と相関の調べ方
  • 相関関係と因果関係の違い
  • 時系列データの見方
  • 時系列データの分解の方法

第4週:ビジネスにおける予測と分析結果の報告

~ビジネス課題解決のためのデータ分析基礎(事例と手法)(3)~

  • 回帰分析による予測
  • モデル評価と予実評価
  • 分析結果の報告(記述/可視化方法)
  • 分析結果の報告(解釈の注意点)
  • 予測・分類等代表的手法と活用場面

第5週:ビジネスでデータサイエンスを実現するために

  • 各週のおさらい
  • データ分析に基づく問題解決ケーススタディ
  • 様々な企業で活躍するデータサイエンティスト
  • 企業でデータサイエンスを実現するためのポイント
  • 講座のまとめ


必要なこと

Excelを使います。



どうやって勉強するの?

どちらの講座も2つのパートからなっています。

動画による講義

各週に5〜10個程度のyoutubeの動画で学びます。
それぞれの動画は10分前後なのに加えyoutubeなので再生速度を上げることもできるので通勤時間などすきま時間でも勉強ができます。

課題

各週の最後に課題があります。

課題は今の所全て選択形式です。内容としては講義動画を見れば全て解答できるレベルになっています。

加えてExcelの実際のデータを使った課題でもアドインツールやピボットテーブルを使うことで関数を使った計算などを必要としないので1問1問の時間もさほどかかりません。


教材

動画があるので無くても受講可能ですが、もし紙媒体でも欲しいという方がいればスタディーノートがAmazonで発売されています。






何が学べるか?

基本的な統計量
「平均値に騙されない」という内容で平均値・中央値・最頻値の紹介や分布によってどの値を使えばいいのかを紹介しています。95%信頼区間に関しても丁寧に解説してくれています。

表・グラフの使い方

どういった場面にどんなグラフを使えばいいのか?といった紹介やExcelを使ったグラフの作成方法について紹介しています。

表はピボットテーブルを使ったクロス集計表、グラフは棒グラフや折れ線グラフ・散布図が紹介されています。またこういったグラフはダメ!といった注意点も紹介されています。

相関と因果関係、単回帰直線

データから散布図を作り相関係数や単回帰直線を作成します。
また相関関係と因果関係の用語の説明と相関関係と因果関係は違うことを丁寧に紹介しています。

Excelで単回帰直線を作り予測をするといった流れも紹介されていますが、重回帰やロジスティック回帰などは今回の講義の範囲外となっています。

時系列分析

時系列データの基本的な見方(傾向・循環変動 + 季節変動 + 不規則変動に分けるなど)やExcelを使った分解方法などについて紹介があります。


データの報告の仕方

こういった内容を講座で見たことがなかったのですが個人的に参考になったのが「演習」にあった分析結果の報告の仕方でした。

こういったところに気をつけないと、データは正しくても誤って解釈して報告する恐れがありますよ!といったところに時間を割いて説明されています。

それだけでなく悪意のあるデータの見せ方を見抜く力がつくと感じました。



公的データの使い方

公的統計データの入手方法について紹介があります。



実際に受講して感じたこと








ツイートでも紹介しましたがデータ分析未経験な方こそ向いていると感じました。既に研究をしていたり統計学を勉強している方には講義動画を見なくても課題を全問正解できるような内容かもしれません。

そもそも統計学が好きな人なんてマイノリティで、数学や統計学の用語はわかりにくいものが多いです。

講義では数式とかExcelの関数を使うことが無く、数学や統計学の話に寄りすぎていないので数学・統計学とかよくわからない、Excelの操作がよくわからないという方でもとっつきやすい構成になっていると感じました。

今回の内容がわかればデータに関するリテラシーは確実に上がると思いますし、個人的にはこの内容を押さえてくれてたら相談されたとしてもすごく話がしやすい!と感じました。

・データ分析何もわからんという状態をなんとかしたい
・今までしたこと無いけどデータ分析が必要になった
・統計の本とか読んでもわからん(そもそも「読む」なんて選択しがない)
・Excelでの分析は職場の報告書を使っているだけで、新たに分析しようとなっても使い方がわからない

上記のような方は今回の受講は何かのきっかけになるかもと感じました。


講座のスケジュールについて

講座の課題には期限があります。


ただ動画はすきま時間でも見れる分量で、課題も講義を見れば確実に正解できる内容だった(当時)ので、その気になれば1日でも何とかなるかもしれません。

すべての課題を締切日までにパスできれば修了証がもらえます。




まとめ

今回は社会人のためのデータサイエンス入門・演習を紹介しました。
データとか苦手という方がとっつきやすい講座ですので、興味があれば期限もありますので受講をおすすめします。







*更新日:2020/09/28
*記事を大幅に追加

*最終更新日:2020/09/30
*gtsummaryのバージョンが上がったことでインストールのコードを一部修正



医療統計に限らず、データを分析する時に集計表を出す場面は多くあります。

特に医療統計では表1(table1)として図表の最初に提示することが多いです。

スクリーンショット 2020-09-12 9.37.17

ポスター発表だとPower Pointでしょうか。
スクリーンショット 2020-09-12 9.38.30

論文であればWordを使うかもしれません。
スクリーンショット 2020-09-12 9.40.28

このtable1を作る時は基本次のような作業が必要になります。
・Excelで集計
・コピー
・WordやPower Pointに張り付け、もしくは手打ち
・体裁を整える

これが意外とめんどくさい作業なのですがRを使えば一度に行えます。
・Excelでデータを集める
・Rで集計→体裁を整える→Word, Power Point, 図として出力する

今回はgtsummaryパッケージを紹介します!


そしてこの記事を書いている最中にgtsumarryパッケージの作者であるDaniel Sjobergさん(@statistishdan)より直接アドバイスを頂きました。この場を借りてお礼申し上げます。



改善点やリクエストがあれば連絡が欲しいとのことでした。自分もいくつかリクエストさせていただきましたが、疑問点や改善点あればご指摘いただければ連絡してみるのはいかがでしょうか。




1.データの準備
今回は【1-11】Rで医療統計で必要なtable1を作るtableoneパッケージについて紹介しますで使用したデータと同じものを使います。


set.seed(1)
年齢 <- floor(rnorm(100,60,10))
性別 <- sample(c("男性","女性"),100,replace = TRUE)
体重 <- floor(rnorm(100,60,7))
MMT <- as.numeric(sample(c(1:5), 100, prob = c(0.1,0.1,0.2,0.3,0.3), replace = TRUE))
術側 <- sample(c("右","左"),100,replace = TRUE)
治療 <- sample(c(0,1),100,replace = TRUE)
data <- data.frame(年齢,性別,体重,MMT,術側,治療)
data
今回は治療(0:対照群、1:治療群)として分けていきます。


もしご自身のExcelデータで取り込み方がわからない場合は【4-0】第4章を進めていく上での準備をご参照ください。プロジェクトの使い方やExcelデータの読み込みについて紹介しています。


2.ライブラリの読み込み

一言でいうとライブラリとはRの機能を拡張してくれる機能の事です。

今回は4つのライブラリを使います
gtsummary(table1や結果の表をいい感じにまとめてくれる)
tidyverse(データの集計などに使用。今回はサブ的に使う)
gt(gtsummaryのデータをもっと細かく修正することができる。gtsummaryだけで完結するので必要ないが、表のタイトルやサブタイトルを付け加えたかったら必要)
flextable(できた表をWordやPower Point形式に貼り付ける際、gtsummaryよりも細かいく修正することができる。gtsummaryだけで完結するので必要ないが、表のタイトルやサブタイトルを付け加えたかったら必要)

rstudioのPackagesをみて自分のパソコンにインストールされているか確認してみてください。
このリストに入っていなかったり、最新のパッケージにしたい場合は以下のコードをコピペして実行してください。この操作は毎回する必要はありません。

install.packages("gtsummary")
install.packages("tidyverse")
install.packages("gt")
install.packages("flextable")

(追加)
記事作成時点(2020/09/23)でのバージョンは1.3.4です。
ただ1.3.4.9008以降で使えるtheme_gtsummary_mean_sd()がとても便利です。
現段階で最新版を使うためにはgithubからインストールする必要があります。
2020/09/30にバージョン1.3.5がリリースされました。
上記のinstall.packages("gtsummary")で問題ありません。


ライブラリがインストールできていれば今度はパッケージを読み込みます。
基本Rstudioを起動すると基本のパッケージしか使えない状態です。
パッケージは毎回呼び出す必要がありlibrary関数を使います。
まずは今回の記事で必要なgtsummaryとtidyverseを読み込みます。

library(gtsummary)
library(tidyverse)

これで準備は完了です。


3.表を作る前に確認しておくこと


table1はそもそも各群のベースラインを比較します。

スクリーンショット 2020-09-12 9.38.30


そのためには各変数(評価)がどんなデータか理解している必要があります


数値かカテゴリーか?

集計を行うにはその変数が数値なのか?カテゴリー変数なのか?の理解が必要です。

数値:年齢・体重

カテゴリー:性別、MMT、術側

MMTは「1が7人、2が5人・・・」と集計を行いたいとすると、値は数値ですがカテゴリー変数として集計を行う必要があります。


数値の場合は正規分布なのか?そうでないのか?

同じ数値でも正規分布かそうでないのか?を決めておくことが必要です。

正規分布であれば平均±標準偏差ですが、正規分布でない場合は中央値(四分位範囲 or 最大値〜最小値)で表現したりします。


4.基本的な使い方

今から実際にgtsummaryを使っていきます。

まずは作ってみる

集計表を作るのはtbl_summary()関数を使います。

dataのデータをtbl_summary関数に入れ込みます。
これを表現するとdata %>% tbl_summary()と表記します。
%>%はパイプ演算子といい、最近Rでデータを扱う時の主流となっています。

data %>% 
  tbl_summary()
スクリーンショット 2020-09-12 13.43.17

とりあえず集計表ができました!ただ群別に表示がされていないので群を分けます。
tbl_summary(by = 群分けする列名)のようにby=○○を付け加えるだけです。

data %>% 
  tbl_summary(by = 治療)
スクリーンショット 2020-09-12 14.01.16
たった2行でそれらしい表ができてきました!


5.テーマを決める

gtsummaryはいくつかのテーマ(設定)があります。
表の細かい修正の前にテーマについて紹介します。


・ジャーナルに合わせたテーマに変える(JAMA / LANCET)
・日本語にする
・デフォルトの中央値(四分位範囲)を平均(標準偏差)に変える
・列幅を狭める
・元の設定に戻す

5−1.ジャーナルに合わせたテーマに変える(JAMA / LANCET)

table1といっても投稿するジャーナルで投稿規定が違います。
gtsummaryでは現在JAMAとLANCETのに合わせたテーマがあります。

#JAMAの投稿規定に合わせる
theme_gtsummary_journal(journal = c("jama"), set_theme = TRUE)
#LANCETの投稿規定に合わせる
theme_gtsummary_journal(journal = c("lancet"), set_theme = TRUE)

#元の設定に戻す
reset_gtsummary_theme()


5−2.日本語にする

英語→日本語にする機能もあります。

#日本語にする
theme_gtsummary_language("ja")
#元の設定に戻す
reset_gtsummary_theme()
スクリーンショット 2020-09-12 14.39.39

注釈などが日本語に変わりました。


5−3.デフォルトの集計・検定を中央値(四分位範囲)を平均(標準偏差)に変える

gtsummaryではデフォルトの集計・検定方法がノンパラメトリックとなっています(中央値・四分位範囲・Wilcoxonの順位和検定など)。
医療統計では平均(標準偏差)で表現することが多いです。個別に設定する方法は後ほど説明しますが、デフォルトでパラメトリックにする設定があります(平均・標準偏差・t検定など)。

theme_gtsummary_mean_sd()

#元の設定に戻す reset_gtsummary_theme()

*この機能はパッケージ開発者のgtsumarryパッケージの作者であるDaniel Sjobergさん(@statistishdan)に自分がリクエストしたところ機能追加していただきました。バージョン1.3.4.9008以降で使えます。ありがとうございます!



5−4.幅を狭くする

できた表はゆとりがありますがコンパクトにまとめることもできます。
theme_gtsummary_compact()を実行するだけです。

#幅をコンパクトにまとめる
theme_gtsummary_compact()

#もとの設定に戻す
reset_gtsummary_theme()
スクリーンショット 2020-09-12 14.45.41

5−5.設定を戻す

今まで説明したtheme_gtsummary_〇〇関数ですが、全てrecet_gtsummary_theme()を使えばデフォルトの設定に戻ります。

reset_gtsummary_theme()


6.p値の列を作る

次にp値の列を作ります。
作り方は%>%を使い、先程のコードにadd_p()を加えるだけです。

data %>% 
  tbl_summary(by = 治療) %>% 
  add_p()
スクリーンショット 2020-09-12 14.52.49
注釈までつけてくれました。
年齢と性別にはWilcoxonの順位和検定(マン・ホットニーのU検定)
性別と術側にはカイ二乗検定
MMTにFisherの正確確率検定が使われています。
「Wilcoxonの順位和検定じゃなくてt検定にして欲しい」に関しては先程説明した5−3.デフォルトの集計・検定を中央値(四分位範囲)を平均(標準偏差)に変えるをご参照ください。中には平均±標準偏差にしたり、これは平均だけどこっちは中央値など細かい調整をしたい場合もあるかもしれません。細かい設定は下にある14−3.集計方法を変更するをご参照ください。

*検定自体に関しては第4章に解説があります。サイトマップに一覧がありますので検定に関して知りたい場合は確認してください。



7.N数を加える
人数を加える場合はadd_n()を加えます。

data %>% 
  tbl_summary(by = 治療) %>% 
  add_p() %>% 
  add_n() 
スクリーンショット 2020-09-12 15.01.43
欠損値がないので全て100ですが、欠損値があるデータだと変わることはあります。


8.全体の集計の列を作る

もし全体の集計列を加えたければadd_overall()を加えます。
今回はadd_n()を外してadd_overall()を加えていますが、もちろんどちらも加えることも可能です。


data %>% 
  tbl_summary(by = 治療) %>% 
  add_p() %>% 
  add_overall() 
スクリーンショット 2020-09-12 15.05.19


9.変数名を太字にする
このままでもいいですが、変数名を太字にしてわかりやすくします。
bold_labels()を使います。

data %>% 
  tbl_summary(by = 治療) %>% 
  add_p() %>% 
  add_overall() %>%   
  bold_labels()
スクリーンショット 2020-09-12 16.04.08




10.出力する

まだまだ調整は必要ですが、とりあえずここで出力してみます。
スクリーンショット 2020-09-12 15.50.09

出力には出力のファイル形式(docやpdf,図など)にあわせてgtsummary内の型を変える必要があります。

スクリーンショット 2020-09-12 15.27.50
公式サイトより引用

出力の形式はgt,kable,flextableなどがあります。
デフォルトはgtとなっています。
gtとはRだけでいい感じの表を作るためのgtパッケージの形式です。
今まで見てきた表です。確かにとても綺麗です。




HTMLの場合

HTML形式の場合はこのまま出力できます。
右下のViwerからSave as Web Pageを選択します。
Save as ImageやCopy to Clipboardは日本語が入るとうまく機能しません。
画像として残したいならパソコンでスクリーンショットを撮ったほうが早いです。
スクリーンショット 2020-09-12 16.07.28


Office(Word, Power Point)の場合

Officeの場合はflextable形式に変換します。
先程のコードにas_flex_table()を加えます。
そしてtable1(他の名前でもいい)という変数を付けます。
今までずっとtheme_gtsummary_compact()を設定していたので小さなサイズの表になっています。
今回は一度リセットし再度日本語にした状態で行ってみます。

reset_gtsummary_theme()
theme_gtsummary_language("ja")
table1 <- data %>% tbl_summary(by = 治療) %>% add_p() %>% add_overall() %>% bold_labels() %>% as_flex_table() table1
スクリーンショット 2020-09-12 16.18.20
gt形式と雰囲気が変わりました。こちらのほうが論文で見た形に近いかもしれません。

次にこれをWordやPower Pointに変換しますが1行のコードでできてしまいます。
手っ取り早く変換するにはprint(今作った変数名, preview="○○")を使います。
preview="○○"はpreview="docx"preview="pptx"の2択です。

#Wordで開く場合
print(table1, preview = "docx")
スクリーンショット 2020-09-12 16.22.24


#Power Pointで開く場合
print(table1, preview = "pptx")
スクリーンショット 2020-09-12 16.26.25


どうでしょうか!!!
この後の文字サイズや修正もWordやPower Pointで直接できてしまいます!
これだけでもかなり時短になるかと思います。

ただ集計方法を平均(標準偏差)やt検定を使うためにはもう少しコードを変える必要があります。


11.様々な箇所を修正する
ここからは応用編になりますが、gtsummaryは色々な箇所を変更することができます。

スクリーンショット 2020-09-27 20.54.57


変数の順番を変えたい、いらない変数を減らしたい:gtsummaryの前に修正しておく
列内の文字の修正(0→対照群)|:gtsummaryの前に修正しておく
集計の方法や表示を修正したい:tbl_summary()
検定の方法を変えたい:add_p()
左上のCharacteristicを変えたい:modify_header(label=)
ヘッダーを編集したい:modify_header(stat_by=)
overallの列を編集したい:add_overall()
ヘッダーの上にもう一つ追加したい:modify_spanning_eader()|
Nの列を編集したい:add_n()
脚注を編集したい:modify_footnote()
タイトル、サブタイトルを加えたい:gtsummaryで直接できない。(gtパッケージやflextableパッケージで編集する)

上記の()内にコードを追加することで細かい修正ができます。


12.変数を並べ替えたい

変数はdataの変数の並んでいる順になっています。
そのため並べ替えるにはgtsummaryを使う前にdataの並び順を変える必要があります。
dataを並べ替えるには【2-4】Rで指定した列や行だけを取り出すselect関数、slice関数、filter関数を紹介しますで紹介したtidyverseパッケージselect関数を使います。
data %>% select関数で並べ替える %>% tbl_summary() %>% ・・・とtbl_summary()の前に入れます。

data %>% 
  select(治療,年齢,体重,性別,術側,MMT) %>% 
  tbl_summary(by = 治療) %>% 
  add_p() %>% 
  add_overall() %>%   
  bold_labels()
スクリーンショット 2020-09-12 16.38.50


13.列内の文字の修正(0→対照群など)

今は治療が0,1となっています。
修正するにはgtsummaryの前にdataのデータ自体を修正します。
列を修正するには【2-2】Rのmutate関数を使って列の追加や修正を行うで紹介したmutate関数を使います。先ほどと同じでtbl_sumamry()の前に入れます。
mutate()の中はfactor関数を使います。factor(列名, labels=c(○○))に関しては【1-10】Rでよく使われる型について説明します。のfactor関数の箇所をご参照ください。

data %>% 
  select(治療,年齢,体重,性別,術側,MMT) %>% 
  mutate(治療 = factor(治療, labels = c("対照群", "治療群"))) %>% 
  tbl_summary(by = 治療) %>% 
  add_p() %>% 
  add_overall() %>%   
  bold_labels()
スクリーンショット 2020-09-12 17.46.55



14.集計を変更する(tbl_summaryのいろいろな設定)

集計方法を指定するのはtbl_summary()です。
公式ドキュメントはこちら



既にby=は説明していますが、ここではtype(変数のタイプ)、label(一番左の変数名)、statistics(集計方法)、digits(小数点第何位まで示すか)を紹介します。

どれも○○ =変えたい変数名を選択 ~ 何に変えるかといった表記方法になります。

14−1.集計のタイプを指定する(type=)

今回のデータでいうと、MMTはカテゴリーとして表にする予定で特に修正は必要ありませんでした。もしMMTがカテゴリーでなく数値として認識されるとこうなります。
スクリーンショット 2020-09-12 17.05.44
これは列ごとに集計のタイプが決まっているからです。
タイプというのは以下のの3種類です。

"continuous(数値)"
"categorical(カテゴリー)"
"dichotomous(2択)" 

gtsummaryでは自動的にタイプを決めてくれるのですが、もし変更したい場合場合はtbl_summary()内でtype = 変えたい変数名 ~ "○○"を加えます。
○○は先程の3択です。

例えばMMTをカテゴリー変数として扱いたければ以下のようになります。

data %>% 
  tbl_summary(by = 治療,
              type = MMT ~ "categorical")


14−2.一番左の変数名を変更する(label=)

左の列は変数名が載っていますが、単位など付け加えたい場合もあります。
変数名を直接編集したい場合はtbl_summary()のlabel=""で編集します。
もし変えたい変数が2つ以上の場合はlist()を使う必要があります。
下の2つのコードはlabel=しか変わっていないので見比べてください。上のツイートも参考になります。

#変えたい列が1つだけのとき
data %>% mutate(治療 = factor(治療, labels = c("対照群", "治療群"))) %>% select(治療,年齢,体重,性別,術側,MMT) %>% tbl_summary(by = 治療, label = 年齢 ~ "年齢(歳)") %>% add_p() %>% add_overall() %>% bold_labels()

#変えたい列が2つ以上の時はlist()の()内に入れる
data %>% mutate(治療 = factor(治療, labels = c("対照群", "治療群"))) %>% select(治療,年齢,体重,性別,術側,MMT) %>% tbl_summary(by = 治療, label = list(年齢 ~ "年齢(歳)", 体重 ~ "体重(kg)")) %>% add_p() %>% add_overall() %>% bold_labels()
スクリーンショット 2020-09-12 18.06.04


14−3.集計方法を変える(statistic=)
集計方法のデフォルトが中央値(四分位範囲)となっています。
最新バージョン(バージョン1.3.4.9008以降)ではtheme_gtsummary_mean_sd()関数を使えば平均(標準偏差)になりますが、平均±標準偏差平均と中央値を同時使いしたい場合はtbl_summary()内でstatistic=○○を指定します。
tbl_summary(statistic = 変えたい変数名 ~ "集計方法")という書き方をします。

data %>% 
  select(治療,年齢,体重,性別,術側,MMT) %>% 
  mutate(治療 = factor(治療, labels = c("対照群", "治療群"))) %>% 
  tbl_summary(by = 治療,
              statistic = c(年齢, 体重) ~ "{mean}({sd})") %>% 
  add_p() %>% 
  add_overall() %>%   
  bold_labels()
スクリーンショット 2020-09-12 18.11.46
脚注を見ると平均(標準偏差)に変わっています。


今回はc(年齢, 体重)と列名を指定しました。
もし全ての数値の列を選びたい時はall_continuous()を使うこともできます。
data %>% 
  select(治療,年齢,体重,性別,術側,MMT) %>% 
  mutate(治療 = factor(治療, labels = c("対照群", "治療群"))) %>% 
  tbl_summary(by = 治療,
              statistic = all_continuous() ~ "{mean}({sd})") %>% 
  add_p() %>% 
  add_overall() %>%   
  bold_labels()

もし年齢だけ指定すると、年齢は平均(標準偏差)、体重はデフォルトの中央値(四分位範囲)となります。

data %>% 
  select(治療,年齢,体重,性別,術側,MMT) %>% 
  mutate(治療 = factor(治療, labels = c("対照群", "治療群"))) %>% 
  tbl_summary(by = 治療,
              statistic = 年齢 ~ "{mean}({sd})") %>% 
  add_p() %>% 
  add_overall() %>%   
  bold_labels()

スクリーンショット 2020-09-12 18.19.20


もし中央値[四分位範囲]など2箇所変更するならlabel=の時と同様にlist()を使います。
data %>% 
  select(治療,年齢,体重,性別,術側,MMT) %>% 
  mutate(治療 = factor(治療, labels = c("対照群", "治療群"))) %>% 
  tbl_summary(by = 治療,
              statistic = list(年齢 ~ "{mean}({sd})",
                                 体重 ~ "{median}[{p25},{p75}]")) %>% 
  add_p() %>% 
  add_overall() %>%   
  bold_labels()
スクリーンショット 2020-09-12 18.21.16

ここで右側の説明を行います。
{集計方法}とすることで集計ができます。{}に入っていない箇所はその文字がそのまま使われます(ここでは( )や[]やカンマなど黒文字の箇所。%や人など文字を入れることも可能)。
スクリーンショット 2020-09-12 18.32.59

他にも集計方法はあります。
{n}:集計した人数
{p}:集計した人数の%
{N}:母数
{p○○}:○○%時の値(0から100の数値を指定。"{p10},{p90}"など)
{var}:分散
集計方法を変えると自動的に脚注が変わるのもありがたいところです。

もし平均±標準偏差にしたい場合はどうしたらいいでしょうか?
"{mean}±{sd}"とすればOKです。±の間にスペースを入れることだって可能です。

14−4.小数点をあわせる(digits=)
デフォルトでは整数になっていますが、小数点第何位まで指定することができます。
人数は整数(0)がいいですし、小数点第何位で指定したい場合もあります。

data %>% 
  select(治療,年齢,体重,性別,術側,MMT) %>% 
  mutate(治療 = factor(治療, labels = c("対照群", "治療群"))) %>% 
  tbl_summary(by = 治療,
              statistic = list(年齢 ~ "{mean}({sd})",
                                 体重 ~ "{median}[{p25},{p75}]"),
              digits = list(c(年齢,体重) ~ c(1,2), 
                            c(性別,術側,MMT)  ~ c(0,1))) %>% 
  add_p() %>% 
  add_overall() %>%   
  bold_labels()
スクリーンショット 2020-09-12 18.48.13


digits = list(c(年齢,体重) ~ c(1,2), 
                  c(性別,術側,MMT)  ~ c(0,1)))
~の左側は今までと同様に列の選択を行っています。
今回~の右側は2つ数値を指定しています。
これは{平均}({標準偏差})という2つの数値を使っているからです。
年齢と体重の1つめの1は平均の小数点は第1位、2つめの2は小数点第2位という意味になります。

ここで体重の75%を確認してみてください。小数点第1位になっています。これは体重は{中央値}、{25%}、{75%}の3つの数値を指定する必要があるのに3つ目を指定していないためです。
そのため正しくは以下になります。


data %>% 
  select(治療,年齢,体重,性別,術側,MMT) %>% 
  mutate(治療 = factor(治療, labels = c("対照群", "治療群"))) %>% 
  tbl_summary(by = 治療,
              statistic = list(年齢 ~ "{mean}({sd})",
                                 体重 ~ "{median}[{p25},{p75}]"),
              digits = list(年齢 ~ c(1,2), 
                            体重 ~ c(1,2,2),
                            c(性別,術側,MMT)  ~ c(0,1))) %>% 
  add_p() %>% 
  add_overall() %>%   
  bold_labels()



15.add_p()のいろいろな設定

14ではtbl_summary()のいろいろな設定について説明しましたが、今度はadd_p()の設定について説明します。

スクリーンショット 2020-09-27 20.54.57


15−1.検定方法を変える

集計のデフォルトは中央値(四分位範囲)でした。
統計を見るとデフォルトはWilcoxonの順位和検定(マン・ホットニーのU検定)やクラスカル・ウォリス検定といったノンパラメトリック検定となっています。

これをt検定や分散分析で行うには修正が必要です。
手っ取り早いのは最新バージョンで使えるtheme_gtsummary_mean_sd()です。
(上にある5−3をご参照ください)
これを使えば集計も検定も自動的にパラメトリックに変わります。

theme_gtsummary_mean_sd()


もし個別に修正するにはadd_p(列名 ~ "検定方法")と記載します。

で指定します。2つ移乗あればlist()を使います。このあたりの記載は14集計を変更するで説明していますのでさかのぼって確認してみてください。
"t.test" for a t-test,(t検定)
"aov" for a one-way ANOVA test,(1元配置分散分析)
"wilcox.test" for a Wilcoxon rank-sum test,(マン・ホットニーのU検定)
"kruskal.test" for a Kruskal-Wallis rank-sum test,(クラスカル・ウォリス検定)
"chisq.test" for a chi-squared test of independence,(χ二乗検定)
"chisq.test.no.correct" for a chi-squared test of independence without continuity correction,
"fisher.test" for a Fisher's exact test,(フィッシャーの正確確率検定)
"lme4" for a random intercept logistic regression model to account for clustered data, lme4::glmer(by ~ variable + (1 | group), family = binomial). The by argument must be binary for this option.(階層モデルのロジスティック回帰?)

Tests default to "kruskal.test" for continuous variables, "chisq.test" for categorical variables with all expected cell counts >=5, and "fisher.test" for categorical variables with any expected cell count <5. A custom test function can be added for all or some variables. See below for an example.
公式サイトより引用


例えば全ての数値データをWilcoxonの順位和検定でなくt検定にするには add_p(all_continuous() ~ "t.test")となります。

またt検定とWilcoxonの順位和検定を同時使いしたければlistを使って以下のようになります。

data %>% 
  select(治療,年齢,体重,性別,術側,MMT) %>% 
  mutate(治療 = factor(治療, labels = c("対照群", "治療群"))) %>% 
  tbl_summary(by = 治療,
              statistic = list(年齢 ~ "{mean}({sd})",
                                 体重 ~ "{median}[{p25},{p75}]"),
              digits = list(年齢 ~ c(1,2), 
                              体重 ~ c(1,2,2),
                              c(性別,術側,MMT)  ~ c(0,1))) %>% 
  add_p(list(年齢 ~ "t.test",
                  体重 ~ "wilcox.test")) %>% 
  add_overall() %>%   
  bold_labels()

スクリーンショット 2020-09-27 12.00.58


16.左上の変数(Characteristic)を修正したい
スクリーンショット 2020-09-27 20.54.57


左上の「変数(Characteristic)」と書かれている所を編集するにはmodify_header(label="○○")を追加します。

data %>% 
  tbl_summary(by = 治療) %>% 
  add_p() %>% 
  add_overall() %>%   
  modify_header(label = "○○") %>% 
  bold_labels()
スクリーンショット 2020-09-27 21.52.30


17.ヘッダーを編集したい

上の表では対照群, N = 53となっています。
スクリーンショット 2020-09-27 20.54.57

オレンジの箇所をヘッダーといい、変えたり改行するにはmodify_header(stat_by=)で編集します。
<br>は改行記号で、{style_percent(p)}は人数を%で表記することができます。


スクリーンショット 2020-09-27 23.24.04

このような修正も可能です。
スクリーンショット 2020-09-27 23.30.18

一つ前の左上の「変数(Characteristic)」を変えるのもmodify_header(label=)でした。
同じ関数なので両方とも修正したい場合はまとめることができます。

  data %>% 
    mutate(治療 = factor(治療, labels = c("対照群", "治療群"))) %>% 
    select(治療,年齢,体重,性別,術側,MMT) %>% 
    tbl_summary(by = 治療) %>% 
    add_p() %>% 
    add_overall() %>%   
    modify_header(label = "○○",
                  stat_by = "**{level}**<br>N =  {n}") %>% 
    bold_labels()
スクリーンショット 2020-09-27 23.25.37
よくみると全体(Overall)は改行されていません。これはOverallを修正するのはadd_overall()内になるからです。

18.全体(Overall)の列を修正したい

スクリーンショット 2020-09-27 20.54.57

全体(Overall)に関してはadd_overall()で修正を行います。
先程modify_header()でヘッダーを2段にしました。
ここではOverallのヘッダーも2段にします。
Overallのヘッダーはadd_overall(col_label = "")を使います。

スクリーンショット 2020-09-27 23.47.33

  data %>% 
    mutate(治療 = factor(治療, labels = c("対照群", "治療群"))) %>% 
    select(治療,年齢,体重,性別,術側,MMT) %>% 
    tbl_summary(by = 治療) %>% 
    add_p() %>% 
    add_overall(col_label = "**全体**<br>N = {N}") %>%   
    modify_header(label = "○○",
                  stat_by = "**{level}**<br>N =  {n}") %>% 
    bold_labels()
スクリーンショット 2020-09-27 23.49.35

19.ヘッダーの上に列を追加したい

スクリーンショット 2020-09-27 20.54.57

ピンクの箇所になりますが、ヘッダーの上に「治療」などもう一列つけることもできます。
modify_spanning_header(starts_with("stat_") ~ "**○○**") とします。
starts_with("stat_")は集計をしている列という意味になります。
**で挟まれたところは太字になります。

スクリーンショット 2020-09-27 23.55.35


20.脚注を編集したい

スクリーンショット 2020-09-27 20.54.57

脚注(黄色)の箇所はmodify_footnote()で編集します。

脚注自体をなくす
modify_footnote(update = everything() ~ NA)を追加。

集計方法(1となっている列)を編集
modify_footnote(update = starts_with("stat_") ~ "○○")を追加。

検定(2となっている列)を編集
modify_footnote(update = starts_with("p") ~ "○○")を追加。

data %>% 
  mutate(治療 = factor(治療, labels = c("対照群", "治療群"))) %>% 
  select(治療,年齢,体重,性別,術側,MMT) %>% 
  tbl_summary(by = 治療) %>% 
  add_p() %>% 
  add_overall() %>% 
  modify_footnote(update = starts_with("stat_") ~ "11111") %>% 
  modify_footnote(update = starts_with("p") ~ "22222") %>% 
  bold_labels()
スクリーンショット 2020-09-28 0.33.37

21.タイトル・サブタイトルを加える
表のタイトル・サブタイトルは実はgtsummaryで作成できません。

もう一度出力のイメージを確認します。
今までは全て「集計」と書かれたところで作業していました。
ただタイトル・サブタイトルはas_○○と出力に合わせた形式に変換してから作成します。

スクリーンショット 2020-09-12 15.50.09

21−1.HTML形式でタイトル・サブタイトルを加える

今回はas_tg()形式で行います。
もともとgtsummaryのデフォルトはas_gt()となっているので修正はいりませんがわかりやすく加えています。

table1 <-
  data %>% 
  mutate(治療 = factor(治療, labels = c("対照群", "治療群"))) %>% 
  select(治療,年齢,体重,性別,術側,MMT) %>% 
  tbl_summary(by = 治療) %>% 
  add_p() %>% 
  add_overall() %>%   
  bold_labels() %>% 
  as_gt()
次にgtパッケージを使って編集します。gtパッケージはgtsummaryの元になっているパッケージです。
まずはgtパッケージを呼び出し、tab_header()を使います。
 library(gt)
#タイトル・サブタイトルを加えるにはtab_header()を用いる
table1 <- table1 %>% tab_header(title = "タイトル", subtitle = "サブタイトル")
スクリーンショット 2020-09-28 0.50.42


21−2.office形式でタイトル・サブタイトルを加える

今回はflextable形式で行います。
flextable形式にするにはas_flex_table()を使います。
table1 <-
  data %>% 
  mutate(治療 = factor(治療, labels = c("対照群", "治療群"))) %>% 
  select(治療,年齢,体重,性別,術側,MMT) %>% 
  tbl_summary(by = 治療) %>% 
  add_p() %>% 
  add_overall() %>%   
  bold_labels() %>% 
  as_flex_table()
table1
次にflextableパッケージを使って編集します。
まずはflextableパッケージを呼び出すのですが、このパッケージにはタイトル・サブタイトルを指定する関数がありません。代わりにadd_header_lines()を使って1番上に1行増やします。
ポイントはサブタイトル→タイトルの順に作ることです。
フォントサイズを変更することもできます。
 library(flextable)
table1 <- table1 %>% add_header_lines("サブタイトル") %>% add_header_lines("タイトル") %>% fontsize(i = c(1,2), size = c(20,14), part = "header")
table1
スクリーンショット 2020-09-28 0.58.52
この後はprint関数でWordやPower Pointに変換します。

#Wordの場合
print(table1, preview = "docx")
#Power Pointの場合
print(table1, preview = "pptx")


22.まとめ

かなり長くなりましたが、gtsummaryでtable1を作成する方法を紹介しました。

ただなれないうちは全てgtsummaryで作成しなくても、ある程度作成したら残りはdocxやpptxに変換して修正できることもできます。。

まずは触ってみながらどこまでをRでするか、どこからをOfficeでするかなど自分なりの方法を探してみるのもいかがでしょうか?

そしてgtsummaryは回帰分析の結果など、table1以外の表にも対応しています。
そこに関しては今後の記事で紹介します。



第4章は統計を扱います。

第4章ではt検定から始まり色々な種類の統計やp値や信頼性の考え方などを紹介してきました。

そして内容は後半の多変量解析に入り、前回は多変量解析を行う上で大切な考え方を紹介しました。

【4-17】「先にデータを取って後で統計」がなぜ危険なのか?どうすればいいのか?を多変量解析、相関・因果関係、交絡を使って解説してみる


そしてもう1つ重要な考え方があります。それは洞察(因果関係)を見たいのか?それとも予測がしたいのか?です。

これは統計学と機械学習の違いにも通じる話になります。

1.使うデータ

ここでも前回の記事と同じデータを使います。

架空のデータです。

library(tidyverse)
set.seed(25) v1 <- rnorm(100,87,13) v2 <- rnorm(100,63,10.5) v <- c(v1,v2) a1 <- as.integer(rnorm(100,35,5)) a2 <- as.integer(rnorm(100,55,5)) age <- c(a1,a2) sex <- c(sample(c(0,1),size = 100, prob = c(0.7,0.3),replace = TRUE),sample(c(1,0),size = 100, prob = c(0.7,0.3),replace = TRUE)) t1 <- as.integer(rnorm(100,120,20)) t2 <- as.integer(rnorm(100,70,20)) time <- c(t1,t2) df <- data.frame(v,time,age,sex) df

スクリーンショット 2020-07-15 13.51.21

v:歩行速度、1分間に歩いた距離(m)とします。

time:片脚立位の時間(s)

age:年齢

sex:性別(0:男性,1:女性)

これをみて片脚立位の時間が長くなれば歩行速度が上がると考えていいかどうかとします。




2.多変量解析はどういう仕組みか?

スクリーンショット 2020-07-17 14.34.46

スクリーンショット 2020-07-17 14.27.48



まず多変量解析(ここでは重回帰分析)は左辺(y)にアウトカム、右辺に要因(x)をおいた式となります。yとxには色々呼び方がありますが同じ意味です。

そして数学的なテクニックを使い(最小二乗法や最尤法)を使い係数を求めます。

コードと解釈の仕方は次の記事で紹介します。

fit <- lm(v ~ time + age + sex)
summary(fit)

スクリーンショット 2020-07-17 14.47.59

色々見るところはあるのですが、とりあえず黄色に注目します。

Estimateというのが係数(β)になります。(Intercept)は切片です。

1分で歩いた距離 = 0.03×片脚立位時間(秒)+ -0.84×年齢(歳) + 0.42(女性であれば) + 108.33

ロジスティック回帰もそうですが、やっていることは係数を求めているということです。


3.重回帰分析とロジスティック回帰の使い分け方

重回帰分析とロジスティック回帰の使い分けはアウトカムを見ます。

重回帰分析:アウトカムが連続した数値になっている
ロジスティック回帰:アウトカムが「自立・非自立」といった2択になっている


ちなみにアウトカムが3択以上のある場合は自分の知りたいことにあわせて2択にしてしまったほうがいいです。
3択以上の解析は複雑になります。


4.xを見たいのか?yを見たいのか?

じつはこの数式には2つの見方があります。それはxを見たいのか?yを見たいのか?です。


洞察(因果関係)に興味がある=xに興味がある

まずxを見るときの視点を説明します。

上の式を再掲します
1分で歩いた距離(m) = 0.03×片脚立位時間(秒)+ -0.84×年齢(歳) + 0.42(女性であれば) + 108.33

この式は右辺に片脚立位時間、年齢、性別という3つの変数があります。

ここで年齢と女性でないという条件で片脚立位の時間が1秒増えるとどうなるでしょうか?

答えは歩行距離が0.03m増えるということになります。

逆に片脚立位・女性でない条件で年齢が1つ増えれば歩行距離は-0.84m減ります

こうやって係数を見ることで他の条件は同じだとして知りたい要因が1つ値が変わるとアウトカムはどう変化するのかを見ることができます。そういう意味ではyの値自体には大して意味がありません。


ここで前回の記事の交絡因子が関係します。

【4-17】「先にデータを取って後で統計」がなぜ危険なのか?どうすればいいのか?を多変量解析、相関・因果関係、交絡を使って解説してみる

因果関係(効果があるかどうか)を考える時はどれだけ重要な交絡因子が取り除けているかが説得力に繋がります。そのためにはどの因子が大事な交絡因子なのかを考える必要がありますが、それはその分野の知識によって決まります。
スクリーンショット 2020-07-17 15.10.39


よって大事なことは右辺には興味がある要因と交絡因子をできるだけ入れることが大切です。

そして知りたい要因は介入が可能であるものが基本となります。
例えば知りたい要因を年齢にしてしまうと、もし有意差が出たとしても年齢を変えることはできません。

なぜここを強調するかというと統計の手法には変数選択という自動的に変数を削除することができるオプションがあるからです。

医療統計でいちばん有名なのはステップワイズ法です。
(下図はEZRの重回帰分析の設定画面)
スクリーンショット 2020-07-17 15.20.46

交絡因子の影響を除きたいのに交絡因子自体を計算から除いてしまうとそれは本当にこの研究でいいたかったことなのか?となってしまいます。

そのためxに興味があるときは変数選択は基本行いません(強制投入といいます)。

*ただ本によっては意見が違ったりします。理学療法の研究ではステップワイズが使われていることも多く、もしかしたら査読で「ステップワイズを」と言われる可能性はあるかもしれません。その雑誌に合わせることも必要なのかもしれませんし、生物統計家のご意見も伺ってみたいところです。

以下の2サイトではステップワイズはよくないという記事になります。







予測に興味がある=yに興味がある。

次にy(左辺)を見るときの視点を紹介します。

上の式を再掲します
1分で歩いた距離(m) = 0.03×片脚立位時間(秒)+ -0.84×年齢(歳) + 0.42(女性であれば) + 108.33

これは片脚立位時間、年齢、性別がわかれば左辺の1分間で歩いた距離を予測することができるということになります。

スクリーンショット 2020-07-17 17.02.35

つまり右辺はどれだけいい予測になる因子を集められるかが大切になります。
そのため交絡因子がどうかや介入が可能かどうかは重要な問題ではありません。
ただ、勘違いしやすいのですが因子が多ければいいモデルになるわけではありません
先程と違い精度に貢献しない因子を外すこともします。

そして予測に興味がある場合に大切なのはモデルを作ることより作ったモデルが新しいデータでも通用するかを試すことで信頼性が増すということです。

これは今回のデータのみに当てはまりがよく、未知のデータでは通用しないという過学習という問題が起こっている可能性があるからです。モデルを作っただけでは過学習が起こっているかどうか判断できません。今回のモデルで使わなかったデータで予測がどれくらい的中するか再検証する必要があります。誤差だったり精度・感度・特異度はこういった再検証に用いられます。



加えて医療統計ではあまりみられませんが、取ったデータから新たな変数を作ることも可能です。

例えばアウトカムを歩行距離として、下肢の左右各関節で疼痛(VAS)を測っていたとします。ただ痛いところは人それぞれですし、変数が多くなりすぎるので変数をまとめたいとします。
  • 各関節の最大のVASを採用する
  • 各関節の平均点を採用する
  • VAS5を超えた関節の数を採用する
  • 他の点数とかけ合わせた新たな変数を作る
他にも色々あるかもしれません。そうやって精度の高い予測を作ることになります。
こういった作業は特徴量エンジニアリングといい、機械学習のテクニックになります。

ただし解釈の難しい因子を作ってしまうと解釈(説明可能性)が難しくなります
上の例だと痛い関節の数はイメージが付きますが、疼痛×筋力みたいな数値はその数値にどういった意味があるのか?と聞かれても「予数値で臨床的な意味は・・・だけど予測の精度が上がる数値」となってしまします。

精度を追求するか説明可能性を追求するかはトレードオフな関係ではありますが、医療現場では説明可能性がある因子を使った方が作った方が使ってくれやすいという印象があります。理由を説明しにくいモデルは「ホントにー?」と胡散臭く思われる可能性があります。

まずは説明しやすいモデル、その後に需要があれば難しいモデルに挑戦するような考えがいいかと思います。


5.因果関係でも予測でも入れないほうがいい変数がある

ただ因果関係・予測どちらにも言えることですが入れないほうがいい因子があります。それは多重共線性が関係します。

数ある因子同士の中で相関係数が高すぎるものが混じっていると多重共線性が発生し結果が不安定にあるという特徴があります。正確な表現ではありませんが、計算の過程で◯÷0みたいな変なことが起こってしまうイメージです。

そのため独立変数同士で相関行列を求め、相関係数が高いものがあるかを調べたりVIFというものを確認したりします。

もし多重共線性が見つかれば相関が高い因子のうちのどちらかを省くか、合成した新しい変数を採用するかになります。

相関行列の求め方は【4-16】Rで相関行列を作成するGGally, cor, clrrplot, corrr関数を紹介しますで紹介しています。



6.まとめ

重回帰分析やロジスティック回帰という回帰分析は計算方法やコードの書き方は同じでも医療統計として使う場面と機械学習として使う場面があります。知りたい要因の因果関係に興味があるのか?アウトカムの予測に興味があるのかで集めるデータや解析や検証の行い方に違いが出てきます。


知りたい要因の因果関係に興味がある→医療統計的な考え方
スクリーンショット 2020-07-17 15.10.39
→データを取り始める前に重要な交絡因子が無いかを十分に検討する
→選択バイアス、情報バイアスもできるだけ入らないよう注意する
→多重共線性がないか確認し、あれば対処する
→分析の結果から考察する


アウトカムの予測に興味がある→機械学習的な考え方
スクリーンショット 2020-07-17 17.02.35
→データを取り始める前に予測に重要な要因は何かを検討する
→多重共線性を調べる
→データを予測作成用のデータと検証用のデータに分ける
→予測作成用のデータでモデルを作る。できたモデルの精度を確認する
→検証用のデータで精度を再検証する
(モデルを作成しただけだと実は本当の精度はわからない)


医療統計ではほとんど前者になることが多い、もしくはどっちつかずになっていることが多い印象ですが、どちらに興味があるかが意識できると多変量解析の勘所が上がるのではないかなと思います。


前回・今回と長くなってしまいましたが、次は重回帰分析の実際について紹介します!


↑このページのトップヘ