Coffee and Research
  • Home
  • cifmodeling
  • A Conversation on Causality at Our Table (EN)
    • Index
    • Study design
  • A Conversation on Causality at Our Table (JP)
    • Index
    • Study design

On this page

  • Study Design II − Data Have Types
    • データには型がある
    • 文献
    • エピソード、用語集、Rスクリプト

Data Have Types: A Coffee-Chat Guide to R Functions for Common Outcomes

R関数を暗記する前に、「データはどう生まれたか」を考えてみませんか。データの型と確率モデルの対応を、父と娘の対話で整理するcoffee-chat guide。これから解析を始める方に向けた導入編です。
Published

December 1, 2025

Study Design II − Data Have Types

Keywords: probability model, R simulation, survival & competing risks, language & writing


データには型がある

私「コーヒー淹れたから、もう少し相談させてよ。さっきRの話がでたでしょ。そのとき、どの関数を使うかもアウトカムによって違うんだよっていってたじゃない?あれ、いまいちピンとこないんだけど。データなんて、全部数字じゃないの?」

お父さん「いいね、最近秋めいてきたからコーヒーがあるとありがたい。数字には違いないんだけどね。統計解析では、データの型がとても大事なんだ。代表的なのはこの4つ」

  • 連続データ
  • 2値データなどの分類データ
  • 計数データ
  • 生存時間データ

私「連続データって、年齢とか血圧みたいな測るやつでしょ?2値データもわかるよ。私の調査で比較したいストーマ保有あり・なしとか」

お父さん「ご名答。で、計数データは、交通事故の発生件数のような、数をカウントしたデータのこと。生存時間データは、たとえば寿命とかだね。死亡など特定のイベントが起こるまでの時間を扱うデータだよ。今回のがんサバイバー調査でいえば、手術から復職までの時間とか、再発までの時間とかね」

私「いわれてみれば、たしかに種類が違うね。でも、昔受けたRの授業では、言われた通りにコード打ってただけだったなあ。glm()とかsurvfit()とか、なんかよくわからないことばを」

お父さん「そうだね。パソコンある?」

私「へ」

お父さん「パソコン。あるでしょ。RStudioインストールしよう」

私「はあ、まあ声を掛けたのはこっちだからいいけど」

お父さん「Rではね、連続データを解析するなら、mean()、t.test() なんかがよく使われる」

私「はあ」

お父さん「2値データを集計するときはtable()。p値を計算するときはfisher.test()。複雑な解析はglm(family = binomial) みたいな回帰モデル。生存時間データだと、survfit()、coxph()、それからcifplot()みたいな関数が出てくる」

そんなにいっぱい覚えられるわけないでしょ。Rの授業でも思ってたけど、そんなのあたかも呪詛なんだって」

お父さん「覚えなくていいよ」

私「え、いいの?」

お父さん「大事なのは、どの型のデータに、どんなR関数をあてるのかをイメージできること。もっといえば、どんな確率分布を仮定しているかを、なんとなくでいいから思い浮かべてほしいんだ」

私「確率分布?」

お父さん「学部でやったでしょ。正規分布(normal distribution)は聞いたことある?2値データの2項分布(binomial distribution)は?」

私「それくらいはね」

お父さん「単なるデータの記述より高度な統計手法では、裏でなんらかの確率モデル(probability model)を考えてる。生存時間データだと、標準的に使われるモデルってわけじゃないんだけど、一番シンプルな分布は指数分布(exponential distribution)っていうんだ」

私「知らんな。呪詛」

お父さん「そうだね、人間が使う言葉とは思えないとはこっちも思うよ。でも、本題に入る前につまづいたらもったいない。もし、統計でわからない言葉が出てきたら、いつでも質問においで。まあ、とにかく、どのデータの型にどんな確率モデルを使うのか、パターンを知ることだね」

私「はあ。それとRが関係するわけ?」

お父さん「うん。たとえばさ、これは覚えてほしいんだけど、割合(proportion)と率(rate)っていう指標のがある。日常生活でもよく使うでしょ?交通事故の発生率とか。でも、日常では、割合と率の違いを意識しないよね。でも、統計の世界では、割合は2項分布のパラメータ、率はPoisson分布っていう別の確率分布のパラメータなんだ。Poisson分布は少しマニアックだけど」

私「割合と率なんて同じ意味でしょ?」

お父さん「違う違う。割合ってパーセントで表すでしょ、女性割合が60%とか。でも、“東京都の1年あたりの交通事故の発生率”を例に考えてみてよ。パーセントにならなくない?交通事故が何回、起きたかを年で割ってるだけだから」

私「ふーん。続けたまえ」

お父さん「教科書どおりじゃなくていいんだ。“あ、これは正規分布っぽい連続データだから、このあたりの関数かな”とか、0/1のデータだから、このへんの関数かなって、感覚で結びつけられるといいよ。そうするとRの関数もずっと覚えやすくなる」

私「なるほどね。データの型と分布をイメージできれば、R関数丸暗記不要ってことね。そいつははかどるわ」

お父さん「そうそう。イメージがあれば、あとでマニュアルや本を見たときに、ああ、これのことかってつながるからね。じゃあ、Rでちょっとだけデモを見せてみようか。年齢(連続)、性別とストーマ(2値)、生存時間(生存時間データ)をシミュレーションして、簡単な解析をやってみるよ。使うのは正規分布、2項分布、指数分布」

私「また呪文が出てくるんでしょ?」

お父さん「そうだね。とりあえずlibrary(ggplot2)、library(cifmodeling)って打って。ヒストグラムとKaplan-Meier曲線を教えるよ」

私「とりあえず思考停止で打つわ」

お父さん「教えてあげてるんだから思考停止しない。Rの機能を追加するとき、install.packages()とlibrary()を使う。ざっくりいうとね、それぞれ、“Rパッケージをパソコンにインストールする”コマンドと、“インストール済みのパッケージを使えるようにする”コマンドなんだ」

私「ふむふむ。じゃあインストールの方は、一度やったら、それで終わり?」

お父さん「基本的にはそう。同じパソコンなら、インストールは原則1回でOK。たとえば、install.packages("ggplot2")は、CRANっていうパッケージの倉庫から、自分のパソコンにダウンロードする。library(ggplot2)は、ggplot2を取り出して、“これからグラフを描くからこの道具を使います”ってRに宣言する」

私「なるほど。ちょっとスッキリした。今まで毎回インストールしなきゃいけないのかなって思ってた」

お父さん「毎回インストールすると、“コーヒー淹れるたびに豆を買いに行く”ようなものだからね。豆はまとめて買っておいて、飲むときに挽けばいい。パッケージも同じだよ」

シミュレーションデータの生成

ここでは、Rを使って簡単なシミュレーションデータを作り、連続データ・2値データ・生存時間データそれぞれについて、代表的な統計解析のデモをします。題材は「ストーマ保有者と非保有者の2群比較」です。

  • 年齢:正規分布rnorm()から生成した連続データ

  • 性別・ストーマ保有:2項分布rbinom()から生成した2値データ

  • 生存時間:指数分布rexp()から生成した生存時間データ

Rコードと結果はこちら
set.seed(46)

# ストーマ保有あり(1)/なし(0)
stoma <- rbinom(200, size = 1, prob = 0.4)

# 性別 0 = 女性, 1 = 男性
sex <- rbinom(200, size = 1, prob = 0.5)

# 年齢:正規分布から生成(ストーマあり群を少し高齢に)
age <- rnorm(200, mean = 65 + 3 * stoma, sd = 8)

# 生存時間:指数分布(ストーマあり群の予後の期待値10年、ストーマなし群の予後の期待値15年)
hazard <- ifelse(stoma == 1, 1 / 10, 1 / 15)
time   <- rexp(200, rate = hazard)

# ランダムな打ち切り(0 = 打ち切り, 1 = イベント)
status <- rbinom(200, size = 1, prob = 0.9)

dat <- data.frame(
  age    = age,
  sex    = factor(sex, levels = c(0, 1), labels = c("WOMAN", "MAN")),
  stoma  = factor(stoma, levels = c(0, 1), labels = c("WITHOUT STOMA", "WITH STOMA")),
  time   = time,
  status = status
)
head(dat)
       age   sex         stoma      time status
1 59.19077 WOMAN WITHOUT STOMA 17.939751      1
2 59.46486   MAN WITHOUT STOMA 18.189251      1
3 55.34491   MAN WITHOUT STOMA  2.445121      1
4 60.68207   MAN WITHOUT STOMA 46.737429      1
5 61.79577   MAN WITHOUT STOMA  0.149128      1
6 62.84530 WOMAN    WITH STOMA  0.298167      1
連続データと2値データの要約

まず、ggplot2パッケージのggplot()と、table()を使って、ストーマあり群とストーマなし群のデータをヒストグラムと分割表で記述しています。データを生成したときの設定を踏まえると、ヒストグラムでは、ストーマありとなしの間で、年齢の分布がずれているはずです。

Rコードと結果はこちら
# install.packages("ggplot2") #インストールが必要なら実行
library(ggplot2)

ggplot(dat, aes(x = age, fill = stoma)) +
geom_histogram(alpha = 0.5, position = "identity", bins = 10) +
labs(x = "AGE", y = "FREQUENCY", fill = "STOMA") +
theme_minimal()

table(STOMA = dat$stoma, SEX = dat$sex)
               SEX
STOMA           WOMAN MAN
  WITHOUT STOMA    43  76
  WITH STOMA       44  37
生存曲線による生存時間データの要約

次の生存時間データでは、cifmodelingパッケージのcifplot()を使って、Kaplan–Meier曲線を描いてみます。ストーマ保有者より、非保有者の方が、生存曲線が高くなる(生存期間が長くなる)はずです。生存時間データとその扱いについては、次とその次のエピソードでお話しします。

Rコードと結果はこちら
# install.packages("cifmodeling") #インストールが必要なら実行
library(cifmodeling)
cifplot(Event(time, status) ~ stoma,
  data         = dat,
  outcome.type = "survival"
)

このエピソードに関係するクイズです

2009~2014年にFDAによって承認されたがん領域の医薬品は、83品目あったそうです。奏効率(腫瘍縮小や完全寛解)がエンドポイントの臨床試験を根拠として承認されたのは、83品目のうち何割だったか、正しいものを選びなさい。

  1. 0~24%
  2. 25~49%
  3. 50~74%
  4. 75~100%
答えはこちら
  • 正解は2です

Kim and Prasad(2016)の総説論文によると、奏効率の結果に基づいて承認されたのは83品目のうち31品目と報告されています。また、エンドポイントの内訳は通常承認と加速承認では異なります。通常承認では、品目55品目のうち48品目が全生存期間、無増悪生存期間、無病生存期間で評価されたのに対し、加速承認では、奏効率を主要エンドポイントとする第II相試験の結果を根拠にした品目が大多数でした。

文献

  • Kim C and Prasad V. Strength of validation for surrogate end points used in the US Food and Drug Administration’s approval of oncology drugs. Mayo Clin Proc 2016; S0025-6196(16)00125-7

エピソード、用語集、Rスクリプト

  • A Story of Coffee Chat and Research Hypothesis
  • Data Have Types: A Coffee-Chat Guide to R Functions for Common Outcomes
  • Outcomes: The Bridge from Data Collection to Analysis
  • [A First Step into Survival and Competing Risks Analysis with R]
  • [When Bias Creeps In: Selection, Information, and Confounding in Clinical Surveys]
  • Statistical Terms in Plain Language
  • study-design.R