ここからは本コースの締めくくりとして、単純集計とグラフを利用したレポートの作成を通して、Rを実際に利用する場面を想定した課題をやっていきましょう。
「課題」としていますが、ここまで解説していない概念や関数もたくさん登場します。
そのため、自分でとくのではなく、その状況に自分がおかれたらと想像しつつ動画と一緒に内容を追っていただいて、解き方の解説を見たうえで、次のRの勉強の指針としていただくことを想定した問題となっています。
だいぶ高度なことをしているように見えるかもしれませんが、少しだけ勉強していただければ、Rが統計解析だけでなく、色々な場面で便利に利用できるプログラミング言語であることを理解いただけると思います。
それでは、はじめていきましょう。
状況設定 あなたは、ある会社に務めている産業看護職です。体重と血圧をターゲットにした健康施策を会社で実行するにあたり、どの職場を重点的に対策をしたらよいかを調べたいと思っています。 血圧と体重を含む5年間のデータを利用して、
- 会社全体のレポート
- 職場別のレポート
- 個人別のレポート
を作成するようなことをやりたいと思っています。 課題1:
kadai/dataフォルダに含まれる、data.csvファイルにはある会社の健康診断の(架空の)データが含まれています。この架空データ、列が6個あり、 * wpid: 職場ID * id :個人のID * yr :健康診断の年度 * bmi :BMI * sbp :収縮期血圧 * dbp :拡張期血圧
です。ここで、個人を特定するにはwpidとidを組み合わせて行う形なっています。なので、id=1の人はwpid毎に一人ずついるので注意してください。 このデータを利用して、Rmrkdownを書いて、会社全体のレポートを上司に向けて作成してみてください。レポートの内容は、上司はパワーポイントでの発表を好むので、 * スライド1:タイトル * スライド2:全体を集計した表 * スライド3~:職場別に集計した表
としましょう。どのような集計方法とするかは、皆さんにお任せします。なお、会社の標準的なプレゼン資料のテンプレートは、kadai/bunseki_co_template.pptxの内容であるので、それを反映してください。
課題2: 次に、職場別に集計して上司にプレゼンした結果、ここの職場の担当者にも結果を送ってほしいと上司からいわれました。会社は伝統的にデータのやりとりはエクセルファイルで行われています。 課題1の集計結果を、それなりに見栄えのする表を作って各職場の担当者に送信するためのエクセルファイルを職場の数だけ作成してみてください。 課題3: 上司から、BMIが30以上の人、BMIが16未満の人、あるいは血圧が160/100どちらかが超えている人を抽出して、個々のグラフを作成して、それを利用して産業看護職として健康相談をおこなうように指示がありました。 これまで、エクセルで条件に当てはまる人を抽出して、グラフと表を作成して、Wordファイルに貼り付けたうえで、コメントを書いていました。 Wordファイルを作成するところまでをRでやってみましょう。今回は、面談時に提示するだけなので、特に凝ったレイアウトは必要ありません。
架空データの作成用スクリプト
{
library(tidyverse)
set.seed(12345)
sampledata <- tibble(
wpid = 1:5,
hiddenp = c(-5,0,5,3,-2),
n = c(100,80,200,40,400)
) %>%
mutate(
data = map2(hiddenp,n,~{
param <- .x
n <- .y
tibble(id = 1:n) %>%
mutate(hiddenip = rnorm(n,param,5)) %>%
mutate(values = map(hiddenip,~{
tibble(
yr = 2000:2002,
bmi = rnorm(3,rnorm(1,23+hiddenip*0.1 )),
sbp = rnorm(3,rnorm(1,5*hiddenip+135)),
dbp = rnorm(3,rnorm(1,5*hiddenip+77 ))
)
}))
})
)
sampledata2 <- sampledata %>%
select(wpid,data) %>%
unnest(data) %>%
select(!hiddenip) %>%
unnest(values)
summary(sampledata2)
write_csv(sampledata2,"kadai/data/data.csv")
}
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.2 ✔ readr 2.1.4
✔ forcats 1.0.0 ✔ stringr 1.5.0
✔ ggplot2 3.4.2 ✔ tibble 3.2.1
✔ lubridate 1.9.2 ✔ tidyr 1.3.0
✔ purrr 1.0.1
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors