Good Morning RStudio!
はじめに
こちらは、Zoom と音声SNS クラブハウス (Clubhouse) で開催している RStudio 勉強会のコース資料です。 毎週土曜午前8:00-8:30に、クラブハウスのクラブ「医療統計を0から学び隊」にて開催しています。
- Zoom https://us02web.zoom.us/j/84011725895 (ミーティングID: 840 1172 5895, パスコードはクラブハウス内で伝えます)
- クラブハウスとZoomを併用する方は、ハウリングを避けるためにクラブハウス側はイヤフォンにしてください。
日程: 土曜日午前7:30~9:00
主な流れ
- 7:30 Zoom ルームオープン、統計検定テキスト読み、前週の振り返り;
- 8:00-8:30 ルーム(初級と上級)に分かれる。
- 初級は、下記の内容を講師が教えます。受講者は、つまづいた時は画面共有しながら操作方法を学びます。
- 上級は、統計検定2級テキストをRStudioで実行したり、自分の研究でつまづいているところを共有画面で解決します。
- 8:30-9:00 「つまづきポイント」検討
「初級」ルームは、3か月を1クールとして、一通り教科書を学び、対応する RStudio の操作方法を習得します。 1月~3月は、統計検定4級相当とします。 4月~6月は、このレジュメを見直し、ふたたび統計検定4級相当のグラフ作成や読み取りを通して、RStudio の使い方について学びます。
2022年予定
ブラウザのセキュリティのために、動画をクリックしてもリンクに飛ばないようです。右クリックしてリンクをコピーし、ブラウザの新規タブを開いてペーストしてください。
| 日 | 日 | ページ | 動画 | 内容 |
|---|---|---|---|---|
| 1/8 | 4/9 | なし | 動画 | RStudio.cloud の登録、概要, Rmd ファイルの理解 |
| 1/15 | 4/16 | 2 - 12 | 動画 | エクセルファイルのインポート, データフレームの理解 |
| 1/22 | 4/23 | 2 - 12 | 動画 再収録 |
棒グラフ, パッケージの理解 |
| 1/29 | 5/7 | 13 - 14 | 動画 | barchart の並べ替え, 因子 (factor) の理解 |
| 2/5 | 5/14 | 15 - 19, 132 - 148 | 動画 | 折れ線グラフ |
| 2/12 | 5/21 | 55-56 | 動画 | 度数, データフレームの操作 |
| 2/19 | 5/28 | 11, 20-21, 60-61 | 動画 | 複合グラフ |
| 2/26 | 6/4 | 22 - 25 | 動画 | Long形式とWide形式、帯グラフ |
| 3/5 | 6/11 | 46 | なし | 演習 |
| 3/12 | 6/18 | 28, 62-65 | 準備中 | クロス集計 |
| 3/19 | 6/25 | 165-182 | 準備中 | ヒストグラムと箱ひげ図 |
| 3/26 | 7/2 | なし | 準備中 | HTML, Word, プレゼン |
対象: RStudio と統計を基礎から学びたい教育学・心理学・医療系の専門家や学生。EZR などを使っていたが、コマンドに慣れたい人。 一方的にやり方を教わるだけでなく、トラブル対処を含め、相互に教えあう方式にしていきたいと思います。
教科書: 統計検定4級対応「資料の活用」 https://www.toukei-kentei.jp/about/grade4/
学習環境: * クラブハウス用端末 * Zoom および RStudio.cloud 用端末
RStudio.cloud 端末は、パソコンが最適ですが、タブレット+キーボードでも代用可能です。スマートフォンは、画面が小さすぎるため使用できません。
到達目標: エクセルファイルを読み込むことができる。棒グラフ、折れ線グラフとその複合グラフ、帯グラフを描くことができる。レポートを作成することができる。
このコースでは、小・中学生でも学ぶことができるように、以下の点に注意しています。
- 数学を極力使いません。計算は主に四則演算になります。
- プログラミングを使って作図をします。この際、図の下部にある軸を x 軸、図の左側にある軸を y 軸と言います。
- R は一部日本語化されていますが、英語でメッセージが出ることもあります。重要なメッセージについて解説いたします。
- 変数は、変数であることをわかりやすくします。数字や文字の変数は、
myFileのように、my を頭に付けています。データフレームの場合は、dfKenteiのように、df を頭に付けています。 - 関数は、
sum()のように、()をつけて示しています。 - データフレームの列名は、
dfKentei$MountainのMountainのように、どのデータフレームの列か分かるように示します。名前は通常、大文字から始まる英語にしています。 - ソースコード、データフレーム、変数がなるべく常に画面上で表示されるようにします。
RStudio.cloud と Rmd (4/9)
R/Rstudio は、Windows, macOS, Linux などで使用することができる、統計アプリケーションです。 また、ウェブブラウザー上でR/RStudio を使う、RStudio.cloud というサービスがあります。
通常はパソコンにインストールして使いますが、とくに Windows でトラブルがよく出ます。 そこで、本講座では、R を手軽に試すことができる RStudio.cloud を使用します。
RStudio.cloud は、R および RStudio を ウェブブラウザ上で遠隔操作するウェブサービスです。 無料版は時間制限などがありますが、手軽に試すことができます。 R はインストールで失敗したり、パッケージのインストールに失敗することがあるので、お勧めです。
まず、RStudio.cloud でアカウントを作成します。
あらかじめ、ここで登録するメールアドレスを決めておいてください。Google アカウントまたは GitHub アカウントを持っている場合は、そのアカウントを使うこともできます。Google アカウントを使う場合、スクロールして、
Sing Up with Google
を選択してください。
プロジェクトの作成
RStudio.cloud でアカウントを作成すると、まずプロジェクトの作成を求められます。
プロジェクトには、ここで使うRStudio の他に、 Jupyter と、Github があります。
- RStudio: これがR/Rstudio のプロジェクトの基本になります。
- Jupyter: これは、主に Python 向けの統合開発環境です。
- Github: これは、すでに他の人が作った公開プロジェクトを読み込む際などに使用します。
ここでは、 New RStudio Project を選択しましょう。
しばらくすると、以下のような画面になります。 これが、RStudio の初期画面になります。
Step 1: まずはプロジェクト名を決めましょう。今回は、1~3月まで統計検定4級を学ぶので、“Stat4” などとします。
Step 2: Console と呼ばれる部分です。ここが、R 本体を直接操作している部分になります。> の右側にコマンドを入力して R を動かしていきます。
Console などに表示されたメッセージには、日本語でメッセージが表示されることもありますが、だいたい英語で表示されます。これは、英語が苦手な人や英語を学んでいる最中の小・中学生などは難しいと思います。もし、Error と出ていたら、何らかのエラーが発生して実行していたものが途中で終わってしまっています。Error という文字がなさそうであれば、たとえ赤字でエラーっぽく見えていても、正常に終わっていることがほとんどです。
R と RStudio
R と RStudio は、別のソフトウェアです。 R は R 本体のことで、RStudio は R を快適に操作するための環境になります。 RStudio を使わなくても、R を使うことは可能です。
R の特徴は、フリーソフトウェアであることです。 フリーソフトウェアとは、無料のソフトウェアという意味ではありません。 ここでは、「フリー」は「自由」の意味で、だれもが「自由」に改変したり、機能を追加したりできます。 このため、多くの人が追加機能を作成し、公開しています。
RStudio は、そのようにして追加された機能の一つです。
つまづきポイント: R と RStudio って?
R本体は、テキストファイルに書かれたソースコードや、Console に入力されたコードを実行するプログラムです。
一方、RStudio は、ソースコードを描いたテキストファイルを編集できるようにしたり、結果を表示したりするプログラムです。また、レポート作成も可能で、HTML(そのままブログとして投稿可能)や Word .docx 形式で出力することができます。
R のバージョンは、4.1.2 です。一方、RStudio のバージョンは、2021.09.1 です。
研究目的でよく使われている他のソフトウェアと比較すると、以下のような長所と短所があります。
長所
- 多くの統計学の専門家が開発に関わっています。
- 無料です。上では「フリー」は無料の意味ではないと述べましたが、他のソフトウェアでは数十万円する機能が無料なのはやはり長所と言えます。
- 研究途中に症例が増えるなどしてデータが変わった場合、コードを再実行することで統計解析・作図を瞬時に行うことができる。
- 図が美しい。
短所
- 非常にわかりづらい。
- 誰でも機能追加ができるために、一貫性がない。また、同じことができるパッケージが複数存在し、どれを使ってよいかわかりにくい。
- プログラミング言語としては、ほかの主要な言語と大きく異なる。ほかの言語を習得している人であっても、R にはなかなかなじみづらい。
- 日本語が弱い。特に、ウィンドウズでユーザ名が日本語になっていると、RStudio はうまく機能しません。ファイル名やディレクトリ名はなるべく英語にしておきましょう。また、図やPDFを作成する際に、日本語がうまくいかないことが多々あります。
教員向けの情報
RStudio.cloud は、プログラミング教育に適した特徴があります。
- 環境が統一される。
- 教員の環境(パッケージをインストールしておいたり、解析に使うエクセルファイルなど)を、生徒の RStudio.cloud に配布することができる。
- インターネットが接続されていることが保証される。
Rmd
まず、File > New File > R Markdown… を選択します。 はじめて Rmd ファイルを作成する場合、追加パッケージのインストールが必要になります。これは、自動的に行われます。
つまづきポイント: この段階でのエラー
RStudio.cloud ではなく、Windows 版を使っていると、この段階でパッケージインストールのエラーが出ることがあります。
この問題が出る Windows の修正は、Windows の知識をある程度必要とします。また、R が使えるよう設定するまでに1時間以上かかります。このため、RStduio.cloud をお使いすることをお勧めします。
Rmd は、RStudio のファイル形式です。
Rmd の基礎となっているのは、Markdown という、デジタル文書の書き方です。 マークダウンでは、以下のように記述します。
- 冒頭の — の部分は、knit 時に使うので、今は変更しない。
- 見出しは # 記号を使う。より小さい見出しは ## と、#記号を増やしていく。
- 強調したい部分は ** で囲む。例: Rmd は、**とても**簡単です。
- 箇条書きは、行頭に - または * とする。番号付き箇条書きは、行頭を 1とすれば、自動的に数字を順序にしてくれる。
- リンクは、各括弧([ と ])で囲い、URLを半角括弧( ( と ) ) で囲む。
Rmd をこのように変えてみましょう。
---
title: タイトル
author: 名前
date: 日付
output: html_document
---
# Abstract
Abstract comes here.
## Introduction
R はとてもすばらしい統計プログラミング言語である。
## Methods
参加者は100人であった。
## Results
参加者のうち、女性は80人であった。
## Discussion
本研究では、〇〇であることが判明した。
Rmd のアウトライン表示
いま作った Rmd を保存しましょう。
さらに、アウトラインを表示 (Show document outline) をクリックしてみます。 長い文章を書く場合には、アウトラインを表示しておくと、行ったり来たりすることが楽になります。
Rmd に R を埋め込む
また、これに加えて、Rmd では ```{r} と ``` で囲まれた中に R のソースコードを書くことで、R を実行することができます。 この記号は「バッククォート」(backquote, backtick) と言い、日本語キーボードでは通常、シフトキーを押しながらPの右となりの @ キーを押すことで表示されます。
このように記述したものは、RStudio で HTML や Word .docx などの形式に、整形した上で変換してくれます。
R では、基本的に日本語は避けたほうが良いです。とくに、ファイル名とフォルダ目、図中の日本語、PDF出力の際に日本語が文字化けしたり、表示されないことがあります。ただし、Rmd の本文は、PDFに出力するとき以外は日本語を使うことができます。
なお、この記事自体も Rmd で記述したものを、RPubs に出版しています。
では、本日は RStudio を終了しましょう。 RStudio を修了すると、保存するかどうか聞かれます。 この保存は、Rmd などのファイルのことではありません。 RStudio の「セッション」と呼ばれるものを保存することになります。
まとめ
- R は、統計に特化したコンピュータ言語です。
- RStudio は、R を快適に使うための統合開発環境 (IDE) です。
- 記録は Rmd 形式で保存し、なるべく日本語の使用は避けます。
データとデータフレーム (4/16)
それでは、データを取り込んでみましょう。
初めての方は、以下のように警告が出てきます。
ここで、初めて「パッケージ」という言葉が出てきました。 R では、パッケージはライブラリとも言います。 エクセルファイルをインポートするには、パッケージを使用します。
つまづきポイント
Windows では、エラーが出てインストールできないことがあります。 しかも、Windows は文字化けしてエラーメッセージが読めないことがあります。
つまづきポイント
厳密にいうと、パッケージは関数などのソースコードで、ライブラリはパッケージの保存場所を指します。
ここでは、readxl と Rcpp という二つのパッケージをインストールしようとしています。
readxl: Excel ファイルを読むためのパッケージ。ただし、読み込むだけで書き込みはできない。Rcpp: 他のパッケージをコンパイルするために必要なパッケージ。
Yes を選択し、しばらく(30秒くらい)待つと、下のような画面になり、エクセルファイルを読み込む画面になります。
エクセルファイルのインポート
上の File/URL では、保存してあるファイルだけでなく、インターネット上のファイルも指定することができます。
なお、実際には R に、ソースコードを送っています。 そのソースコードが、 Code Preview に表示されています。
つまづきポイント
ファイルを探して指定したい場合は Browse をクリックしてください。 File/URL にパスを入力すると、Browse ボタンが Update に変わります。 この場合は、いったん Update でプレビューを確認しなければ、インポートはできません。
R でのパスは、Windows でもバックスラッシュではなくスラッシュを使います。例: C:/Benkyo/Benkyo.xlsx
PLoS One から Excel データをダウンロードすると、.xlsx であるのに、.xls という拡張子がつくことがあります。この場合、ファイル名の拡張子を正しく直してからインポートしてください。
RStudio.cloud を使っている方は、自分のパソコンにあるファイルは直接はインポートできません。RStudio.cloud では、File ペインに Upload ボタンがあります。これを利用して、まずは RStudio.cloud にファイルをアップロードしてください。
データフレーム
では、エクセルファイルを読み、データフレームに格納するソースコードを書いてみましょう。
library(readxl)
library(curl)
myUrl <- "http://babayoshihiko.ddns.net/download/kentei4.xlsx"
myDestfile <- "kentei4.xlsx"
curl_download(myUrl, myDestfile)
dfKentei4 <- read_excel(myDestfile)この分は、Rのソースコード(プログラム)部分になります。 ソースコードは、色を使って見やすくしています。 ただし、ウェブ版とワード版で色が若干異なります。 ウェブ版では、この部分は、
- 紫色: 関数
- 青色: 関数の引数
- 黒色: 変数、データフレーム、データフレームの列名などのオブジェクト
- 緑色: 代入記号
<- - 赤色: 文字
- 黄土色: 数値
となります。
一方、ワード版では、
- 黄色: 関数の引数
- 黒色: 関数、変数、データフレーム、データフレームの列名などのオブジェクト
- 黄土色: 代入記号
<- - 緑色: 文字
- 青色: 数値
となっています。
また、RStudio でも色がついて表示されますが、これは Tools > Global Options として、上から4つ目の Appearance を開くと、いろいろと色の設定ができます。 使いやすいテーマを使うと良いでしょう。
では、プログラムの解説を行います。まず、最初の2行にある library(readxl) と library(curl) は、それぞれ readxl と curl というパッケージを使うために読み込んでいます。初めての方は、これらのパッケージをまだインストールしていないので、インターネットからインストールする必要があります。
次の2行は、myUrl と myDestfile という二つの変数を設定しています。
5行目には、curl_download(myUrl, myDestfile) とあります。curl_download() は、インターネット上からファイルをダウンロード関数で、最初の引数に myUrl、2つ目の引数に myDestfile を渡しました。 最後に、read_excel() 関数を使って、dfKentei4 というデータフレームにデータを格納しました。
成功すると、以下のような画面になります。
なお、この画面でデータフレームの中身を書きかえることはできません。
ここから先は、次週の予習になります。 先ほどのエクセルファイルをインポート後、以下のコードを書いて実行してみましょう。
ggplot(dfKentei4, aes(x = Mountain, y = Altitude)) +
geom_bar(stat = "identity") +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")これはまだ見た目が悪いですね。次週は、この見た目をテキストに近づけていきましょう。
つまづきポイント
macOS の場合は、日本語が四角く文字化けしているかもしれません。 そのため、以下のコードを追加しています。
theme_bw(base_family = "HiraginoSans-W3")ペインを増やす
実際に作図を始める前に、作業環境を改善しましょう。
1 Tools > Global Options を選択します。 2 Appearance を選択します。 3 Add Column をクリックします。
これで、以下のように Source ペインが左側に追加されました。
この Source ペインの追加の目的は、次回解説いたします。
まとめ
- エクセルファイルを、ローカルまたはインターネットから開くことができます。
- Rでは、データは「データフレーム」という形式を扱うことが多い。
- SAS, SPSS, Stata, Google Spreadsheet なども読むことができます。
棒グラフ (4/23)
棒グラフ
棒グラフは、数量の大小を比較するのに適しています(統計検定4級テキスト p. 11-14)。
- 棒の高さが量をしめします。
- 棒の幅は統一します。
- 並べ方は、種類ごとにまとめたり、大きい順など、工夫をすることができます。
- 何種類かの値を同時にグラフ化することもあります。
パッケージ
これまで、何度か「パッケージ」をインストールしてきました。 ここでは、確認のために再度パッケージを追加してみましょう。
Tools > Install Packages を選択します。
次のような画面になります。
ここで、以下のようなパッケージをインストールしておきましょう。
ggplot2
Install をクリックすると、Console の2つ隣にある Jobs のところにインストールの経過が表示されます。
パッケージとは、R の関数やデータなどをまとめたものです。
データを読み作図する
先週の流れのおさらいです。
- エクセルファイルを読み込み、データフレームに格納する。
- データフレームを確認する。
- データフレームから棒グラフを作図する。
まずは、エクセルファイルを読み込み、データフレームとして格納します。
データフレームの名称は、データフレームであることがわかるように df を頭につけるなどするとよいと思います。例: dfKentei4
つまづきポイント
Rの解説本は、データフレームなどの名称に無関心なことが多く思われます。初学者は、このオブジェクトがデータフレームなのか引数名なのかなどがわからないので、分かりやすい命名規則を使うとよいと思います。
library(readxl)
dfKentei4 <- read_excel("kentei4.xlsx")つぎに、データを確認します。 これは、以下のコードを実行します。
library(ggplot2)
ggplot(dfKentei4, aes(x = Mountain, y = Altitude)) +
geom_bar(stat = "identity") +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")Rmd に上記のソースコードを書くと、下のようになっていると思います。
ソースコードの部分を「チャンク」と言います。 チャンクの右上、10行目の右端にある緑色の三角形のボタンを押すと、このソースコードが実行されます。
元の図の幅と色から変えましょう。 geom_bar() 関数に、引数の width と fill を追加します。
library(ggplot2)
ggplot(dfKentei4, aes(x = Mountain, y = Altitude)) +
geom_bar(stat = "identity", width = 0.4, fill = "blue") +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")つぎに、y 軸の目盛りを設定します。 これは、scale_y_discrete() 関数を追加します。
library(ggplot2)
ggplot(dfKentei4, aes(x = Mountain, y = Altitude)) +
geom_bar(stat = "identity", width = 0.4, fill = "blue") +
scale_y_discrete(limits=c(0,1000,2000,3000,4000,5000,6000,7000,8000,9000,10000)) +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")軸は、数直線です。ただし、数値はそのままでは見づらいことがあります。
library(ggplot2)
ggplot(dfKentei4, aes(x = Mountain, y = Altitude)) +
geom_bar(stat = "identity", width = 0.4, fill = "blue") +
scale_y_discrete(limits=c(0,1000,2000,3000,4000,5000,6000,7000,8000,9000,10000),
labels=c("0","1,000","2,000","3,000","4,000","5,000","6,000","7,000","8,000","9,000","10,000")) +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")library(ggplot2)
ggplot(dfKentei4, aes(x = Mountain, y = Altitude)) +
geom_bar(stat = "identity", width = 0.4, fill = "blue") +
scale_y_discrete(limits=c(0,1000,2000,3000,4000,5000,6000,7000,8000,9000,10000),
labels=c("0","1,000","2,000","3,000","4,000","5,000","6,000","7,000","8,000","9,000","10,000")) +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")まとめ
本日学んだのは、ggplot2 による作図です。
- 必要なパッケージの追加をします。
ggplot()関数は、足し算方式で図の設定を追加します。geom_bar(): 棒グラフを描くscale_y_discrete(): y軸の目盛りを設定するtheme_bw(): 背景を設定する
ところで、よく見ると山の名称の並び順がテキストと異なっています。 これは次週に直していきたいと思います。
因子 (5/7)
数値、文字
データには、数字型、文字型などの型があります。
数字型は、厳密には整数 (integer)、実数 (numeric) などがあります。文字型は character といいます。このほか、TRUE と FALSE だけからなる論理型 (logical) があります。
実は、R の「型」はちょっと厄介です。 そこで、今日はデータの mode として、numeric と character、データの class として factor を学びます。 この factor の日本語訳が、因子です(心理学などで使われる「因子分析」があるので、言葉の誤解を避けるためにファクタと書かれる時もあります)
library(readxl)
dfKentei4 <- read_excel("kentei4.xlsx")
mode(dfKentei4$Mountain)## [1] "character"
Mountain 列は、文字型 (character) と認識されていることがわかります。
mode(dfKentei4$Altitude)## [1] "numeric"
Altitude 列は実数型 (numeric) であることが分かります。
また、これは RStudio の Environment ペインの Data でも確認することができます。
先週見たグラフでは、山の並び方が、文字としてあいうえお順になっているものと思われます。 そこで、文字ではなく因子 (factor) として、順序を決定してみます。
dfKentei4$Mountain <- factor(dfKentei4$Mountain, levels = c("エベレスト","ゴドウィンオースチン","カンチェンジュンガ","ローツェ","マカルウ","富士山"))Environment ペインの Data で dfKentei4 を確認してみましょう。
Mountain 列が、因子 (factor) になっていることがわかります。
library(ggplot2)
ggplot(dfKentei4, aes(x = Mountain, y = Altitude)) +
geom_bar(stat = "identity", width = 0.4, fill = "blue") +
scale_y_discrete(limits=c(0,1000,2000,3000,4000,5000,6000,7000,8000,9000,10000),
labels=c("0","1,000","2,000","3,000","4,000","5,000","6,000","7,000","8,000","9,000","10,000")) +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")これで、並べ方は Mountain 列 の因子の順序通りに表示することができました。
因子
因子 (factor) とは、統計検定4級テキストでは「質的データ」と説明されています(テキスト p. 53)。 質的データの例としては、性別、血液型、趣味などがあります。
今回因子型とした山の名称は、厳密には質的データというものではないかもしれません。 しかし、ここでは並べ替えを行うために、因子型としました。
実際の研究では、例えば性別などは、以下のようにすることがあると思われます。
- 1: 男性, 2: 女性
- 0: 男性, 1: 女性
- 男: 男性, 女: 女性
- M: 男性, F: 女性
どのようにしても R では因子 (factor) として認識されれば、因子として扱ってくれます。
つまづきポイント
数値や文字は mode です、一方、因子は class です。R では、データ型として、type, mode, class があります。 とても分かりづらいので、最初のうちはあまり気にしないほうが良いでしょう。
ひどいデータ
実際には、ひどいデータにしょっちゅう出くわします。
例えば、男性は M、女性は F とコード化したとしましょう。
library(readxl)
dfKentei4Dirty <- read_excel("kentei4.xlsx", sheet = "bad-factor-sample")みてみると、大文字、小文字、さらには半角と全角が入り混じっています。 これを因子にしてみるとよくわかります。
datatable(dfKentei4Dirty)dfKentei4Dirty$Sex1 <- factor(dfKentei4Dirty$Sex)8つも水準があります。 どうにか、MとFだけにしたいので、stringi パッケージの stri_trans_nfkc() 関数と、base パッケージの toupper() 関数を使ってみます。
library(stringi)
dfKentei4Dirty$Sex2 <- factor(
toupper(
stri_trans_nfkc(dfKentei4Dirty$Sex)),
levels = c("M", "F"))このように、ひどいデータを修正する作業を、cleaning や sanitizing といいます。こういった処理に特化したパッケージもありますが、日本語にうまく対応しているのは内容なので、今のところ上記のコードが一番よさそうです。
欠損値
もし、エクセルファイルのデータに不備があるとどうなるでしょうか?
まず、データが欠損している場合を試してみます。
library(readxl)
dfKentei4NA <- read_excel("kentei4.xlsx", sheet = "p12NA")エクセルデータの別のシートを読み込み、新たにデータフレーム dfKentei4NA を作成しました。
このデータフレームを使って、棒グラフを作ってみましょう。
library(ggplot2)
ggplot(dfKentei4NA, aes(x = Mountain, y = Altitude)) +
geom_bar(stat = "identity", width = 0.4, fill = "blue") +
scale_y_discrete(limits=c(0,1000,2000,3000,4000,5000,6000,7000,8000,9000,10000),
labels=c("0","1,000","2,000","3,000","4,000","5,000","6,000","7,000","8,000","9,000","10,000")) +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")このように、欠損していながらもなんとか表示はされます。
ところが、演算を行おうとすると、途端に問題が生じます。 一例として、標高の平均値を求めてみましょう。 平均値は、英語では average と mean という二つの語がありますが、R では、mean の方を使って mean() という関数になります。
mean(dfKentei4NA$Altitude)## [1] NA
このように、一つでも欠損値 (NA) があると、平均値も NA となってしまいます。
欠損値については、統計検定4級テキストには何の記述もありません。 欠損値がある場合には、欠損値のあるデータを削除する方法があります。 na.omit() という関数を使う方法です。
dfKentei4NA <- na.omit(dfKentei4NA)これで、NA があった行がすべて削除されたデータフレームとして dfKentei4NA が作られました。 この平均値を求めてみましょう。
mean(dfKentei4NA$Altitude)## [1] 7418.25
研究目的ですと、欠損値は
- 欠損があるものは削除する(完全ケース分析)
- 多重補完法 (multiple imputation) を用いて、欠損に補完する(多重補完法)
という大きく分けて二つの方法があります。 代入法には、多重補完法以外にもたくさんありますが、現在学術的に認められているのは多重補完法です。
まとめ
- データの mode として、整数 (integer)、数値 (numeric)、文字列 (character) などがあることを学びました。
- データの class として、因子 (factor) があることを学びました。
- データの欠損値を削除する方法を学びました。
折れ線グラフ (5/14)
データ読み込み
テキスト p. 15 ですが、データがないので、p. 132 のデータを使うことにします。
今回、同じファイルの別シートを読み込みます。 エクセルで、先日ダウンロードしたファイルを開くとわかりますが、複数のシートがあります。
シートを指定してエクセルファイルを開くことを、ソースコードで書くと次のようになります。
library(readxl)
dfJPop <- read_excel("kentei4.xlsx", sheet = "p132")いままで使っていた read_excel() 関数に、sheet という引数を追加しています。 データフレーム dfJPop を確認してみてください。
折れ線グラフ
library(ggplot2)
ggplot(dfJPop, aes(x = Year, y = Population)) +
geom_line()y軸を変えましょう。まずは、棒グラフと同じようにしてみます。
library(ggplot2)
ggplot(dfJPop, aes(x = Year, y = Population)) +
geom_line() +
scale_y_discrete(limits=c(0,2000,4000,6000,8000,10000,12000,14000),
labels=c("0","20","40","60","80","100","120","140")) +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")なぜか、y軸のラベルがなくなりました。 そこで、いろいろと試してみました。
library(ggplot2)
ggplot(dfJPop, aes(x = Year, y = Population)) +
geom_line() +
scale_y_continuous(limits=c(0,140000),
breaks=c(0,20000,40000,60000,80000,100000,120000,140000),
labels=c("0","20","40","60","80","100","120","140")) +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")変更点は、scale_y_discrete() 関数を scale_y_continuous() に変えました。 教科書的には、_discrete は整数(または準受変数)、_continuous は連続変数の場合に使うことになっています。 しかし、標高では discrete、人口で continuous という逆の現象になっています。 どうやら、棒グラフと折れ線グラフでは、y軸の設定方法が異なるようです。
次に、点を追加します。 どのように追加するのでしょうか? なんと!geom_point() 関数を追加するのです。
library(ggplot2)
ggplot(dfJPop, aes(x = Year, y = Population)) +
geom_line() +
geom_point() +
scale_y_continuous(limits=c(0,140000),
breaks=c(0,20000,40000,60000,80000,100000,120000,140000),
labels=c("0","20","40","60","80","100","120","140")) +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")最終的には、このようなソースコードになります。
library(ggplot2)
ggplot(dfJPop, aes(x = Year, y = Population)) +
geom_line() +
geom_point() +
scale_x_continuous(limits=c(1900,2025),
breaks=c(1920, 1930, 1940, 1950, 1960, 1970, 1980, 1990, 2000, 2010),
expand = c(0, 0)) +
scale_y_continuous(limits=c(0,150000),
breaks=c(0,20000,40000,60000,80000,100000,120000,140000),
labels=c("0","20","40","60","80","100","120","140"),
expand = c(0, 0)) +
annotate("text", x=1907, y=148000, label="(百万人)", size = 2) +
coord_cartesian(xlim = c(1910,2020), ylim = c(0,148000), clip = "off") +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")
theme(axis.title.x = element_blank(), axis.title.y = element_blank())## List of 2
## $ axis.title.x: list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ axis.title.y: list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## - attr(*, "class")= chr [1:2] "theme" "gg"
## - attr(*, "complete")= logi FALSE
## - attr(*, "validate")= logi TRUE
annotate(): プロット上に、文字 (“text”)、ボックス (“rect”)、線 (“segment”) などを描きます。 x, y は、プロット中の x, y を使用します。coord_cartesian(): プロットの範囲を指定します。
ここでは、百万人という文字を、図の範囲外である1907年のあたりに表示させたかったので、coord_cartesian() で図の領域を広げ、ただしプロットはscale_x_continuous()で範囲を区切って表示しました。
theme():theme(axis.title.x = element_blank())これは、x軸のタイトルを表示させないための設定です。
まとめ
- 折れ線グラフを描くには
geom_line()関数を足す。 - 折れ線グラフに点を追加して描くには
geom_point()関数を足す。 - y軸の設定は、
scale_y_discrete()やscale_y_continuous()がある。
度数とデータフレームの操作 (5/21)
データフレームの計算
統計検定4級テキストの p. 55 では、質的データの分析の説明が書かれています。 ここの表2.2.2と表2.2.3を、数字化したものをエクセルファイルで用意しました。
以前ダウンロードしたことがある人は、フォルダ内にあると思います。 以下のコードを書いてみましょう。
library(readxl)
dfInjury <- read_excel("kentei4.xlsx", sheet = "p55")この表は、合計値を意図的に追加していません。 まず、Pupils の合計を計算してみましょう。
sum(dfInjury$Pupils)## [1] 40
最初に表示される [1] は、返り値の一つ目であることを表しています。 合計は 0 人です。 また、Rmd の文章中で、この「40」という計算結果を表示させたいときは、`r sum(dfInjury$Pupils)` と書きます。
相対度数
統計検定4級テキスト p. 56 にあるように、相対度数を計算して、データフレーム dfKentei4 に追加しましょう。 相対度数の列名は Proportion とします。
dfInjury$Proportion <- proportions(dfInjury$Pupils)関数
proportions(): ある数字の列 (例: 1, 2, 2) に対し、その相対度数 (例: 0.2, 0.4, 0.4) を返す。
dfInjury$Proportion は、データフレーム dfInjury に、新たに Proportion 列を追加します。 その追加するものが、proportions() 関数の返り値です。 この関数の引数に、dfInjury$Pupils は、データフレーム dfInjury の Pupils 列です。
R では、このように列データに対して一気に計算をすることができます。
なお、これは、以下のようにしても得られます。
dfInjury$Proportion <- dfInjury$Pupils / sum(dfInjury$Pupils)まとめ
- データフレームの列は、
データフレーム$列で操作することができます。 - エクセルでデータを作成する場合、「合計」行などは作らないようにしましょう。
- 列全体を合計で割ったり、
列1+列2のように、列単位の計算をすることができます。
複合グラフ (5/28)
ここでは、棒グラフと折れ線グラフを一つのプロットに重ねて描いてみようと思います。
棒グラフの y 軸は左側に設定します。 折れ線グラフの y 軸は右側に設定します。
複合グラフを描くために、統計検定テキスト4級の p. 60 のデータを使ってみましょう。
まず、エクセルファイルをインポートし、データフレームに格納します。
library(readxl)
dfMatz <- read_excel("kentei4.xlsx", sheet = "p60")このデータフレームは、野球選手である松坂投手の球種別の投球数のデータです。 、統計検定テキスト4級の p.60 の表2.2.5の投球数までとなっています。
PitchType 列を因子に変えておきましょう。 これをしない場合、図を描画する際にあいうえお順に並ばれます。
dfMatz$PitchType <- factor(dfMatz$PitchType, levels = dfMatz$PitchType)factor() 関数は、因子に変更して返します。 最初の引数の dfMatz$PitchType は、データフレーム dfMatz の PitchType 列を表しています。 因子は順序を付けることができるのですが、ここではそのままの順序にします。 このため、levels = dfMatz$PitchType という引数を追加しています。
返した値は、データフレーム dfMatz の PitchType 列に格納します。 つまり、上書きをします。
RStudio の Environment ペインで、Factor に代わっていることを確認しましょう。
累積度数の計算
統計検定4級テキスト p. 60 にあるとおり、累積とは、ある度数などを順に足していくことです。 累積度数とは、ある度数列を順に足していった列となります。 R では、累積度数は、base パッケージにある関数 cumsum を使って設定することができます。
データフレーム dfMatz にある列 Frequency を元に、累積度数を計算します。 累積度数は、新しい列 CumulativeSum に格納します。
dfMatz$CumulativeSum <- cumsum(dfMatz$Frequency)dfMatz$CumulativeSum は、データフレーム dfMatz の列 CumulativeSum を指します。 データフレームの後に $ 記号を置き、その後に列名を繋げます。 この列はまだ存在していない列なので、新たに作られます。 すでにある列の場合、上書きされます。
cumsum() は、base パッケージにある関数で、累積度数を返します。
これを <- で dfMatz$CumulativeSum に格納しています。
次に、累積度数を総数で割り、累積相対度数を計算します。
dfMatz$CumulativeProportion <- dfMatz$CumulativeSum / sum(dfMatz$Frequency)この行の最後にある sum() は、base パッケージ関数で、引数である dfMatz$Frequency の合計を返します。
dfMatz$CumulativeSum / sum(dfMatz$Frequency) は、累積度数の列を、投球数の合計でそれぞれ割る処理をし、結果として累積相対度数を返します。
最終的に、dfMatz データフレームに、新しい列 CumulativeProportion を作って格納しています。
棒グラフ + 折れ線グラフ
では、複合グラフとして、投球数を棒グラフ、累積相対度数を折れ線グラフで描いてみます。
まずは、級種別の投球数を棒グラフ化します。 おなじみの ggplot() と geom_bar() という関数を使用します。
library(ggplot2)
ggplot(dfMatz, aes(x = PitchType, y = Frequency)) +
geom_bar(stat = "identity") +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")次に、累積相対度数の折れ線グラフを描きます。 ここで大事なことは、もともと ggplot() 関数には、引数 x に PitchType, 引数 y に Frequency を指定しています。 このままでは x はよくても y が累積相対度数になりません。 そこで、geom_line() 関数には、改めてデータフレーム、x, y を指定します。
ただし、ここで問題があります。 上で棒グラフを描いたときに、y 軸の幅が 0 から 1560 までになりました。
しかし、CumulativeProportion は割合なので、数値が 0.1 や 0.9 などになります。 そこで、CumulativeProportion に 1500 を掛けて、線がつぶれてしまわないようにします。
library(ggplot2)
ggplot(dfMatz, aes(x = PitchType, y = Frequency)) +
geom_bar(stat = "identity") +
geom_line(data = dfMatz, aes(x = PitchType, y = CumulativeProportion * 1500, group = 1, inherit.aes = FALSE)) +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")最後に、scale_y_continuous() 関数を使って右側に二つ目の y 軸を設定します。 二つ目 (second) の y 軸なので、sec.axis という引数に、sec_axis() 関数を使って設定します。この辺は、似たような名称のものが連続するので、分かりづらい点ですね。
なお、このとき、目盛りが1500倍されているので、1500で割ります。
library(ggplot2)
ggplot(dfMatz, aes(x = PitchType, y = Frequency)) +
geom_bar(stat = "identity") +
geom_line(data = dfMatz, aes(x = PitchType, y = CumulativeProportion * 1500, group = 1, inherit.aes = FALSE)) +
scale_y_continuous(sec.axis = sec_axis(~./1500, name = "累積度数")) +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")今日はここまでとします。
もし気になるのであれば、x 軸と y 軸の左側のラベルを変えてみてください。
まとめ
- データフレームの列の計算を学んだ
ggplot2を使い、二つ目のデータの図化を学んだ- 二つ目のデータに対する二つ目の y 軸の設定方法を学んだ
Long 形式と帯グラフ (6/4)
Long 形式と Wide 形式
Excel などでデータを準備する際には、なんとなく使用している「型」があると思われます。
一例として、10人の生徒の体力を見るために、50m走の時間(Speed, 秒)と、幅跳びの距離(Jump, m)を、4月(April)、9月(September)、3月(March)の3回計測したとします。
おそらく、このような表を作成するのではないでしょうか。
このように、被験者一人につき一つの行で、50m走3回と幅跳び3回分を横に広く (wide) に書く形式を Wide 形式と言います。
この形式はとても見やすく、このままだいたいの作図もできます。
一方で、この形式のままでは作図できないものがあります。 その一つが、帯グラフになります。
では、帯グラフを作るときは、どのような形式が良いでしょうか?
このように、数値が常に同じ列に入っているような形式を Long 形式といいます。
帯グラフと円グラフ
統計検定4級テキスト p. 11 にあるとおり、円グラフと帯グラフは、全体に対する割合を表す際に用いられます。 また、テキスト p. 22 に解説されているように、棒グラフを円グラフに変換しています。 また、テキスト p. 25 も割合であっても棒グラフを使うこともあります。
ただし、学術的にはあまり円グラフは使われません。 円グラフが望ましくない説明
帯グラフは、通常帯が複数になるように作成します。 例えば、「性別」ごとの「けがの原因」を、男女比較するために用います。 このように、データフレーム内の2つの列を使うことを、2要因といいます。 「要因」という語は、統計検定4級テキストでは使われていません。 (因子の種類の数(たとえば性別は男と女の2つ)は水準(性別は2水準)といいます。)
医療系ですと、円グラフも帯グラフもほとんど使いません。 とくに、帯グラフで違いを見るような場合には、むしろ数値をそのまま書いた表を作ることが多いです。 また、有意差があるかどうかは、χ二乗検定をします。
しかし、医療系以外では帯グラフを使うこともあるかとは思います。 そこで、帯グラフだけ作成します。
統計検定4級テキストの図1.4.16 (p.27) は、同書の p. 55-57 にもデータがあります。 なお、データは、 kentei4.xlsx のシート p55 にあります。
Long データから棒グラフ
まず、データを準備します。 統計検定4級テキストには、帯グラフを作図するのに適したデータが見つかりません。 一つあるのは、p. 53 の表2.1.1ですが、4件目までであとは省略されています。 この表2は、性別と血液型という、因子の要素が2つあります。
そこで、p. 55 の保健室のデータをちょっと改良したものを用意しました。 エクセルファイルは kentei4.xlsx で、シートは p55-raw です。
library(readxl)
dfInjury <- read_excel("kentei4.xlsx", sheet = "p55-raw")今回のデータは、今までとかなり様子が違います。 実は、被験者一人ひとりの生データとなっています。
dfInjury$Reason <- factor(dfInjury$Reason)
dfInjury$Gender <- factor(dfInjury$Gender)Reason と Gender が因子であるので、因子に変更しました。
library(readxl) で、パッケージ readxl を読み込んでいます。
read_excel() 関数では、デフォルトフォルダにある kentei4.xlsx を読み込んでいます。 シートは、sheet = "p55-raw" で指定しています。
dfInjury <- read_excel(...) とすることで、read_excel() 関数で読み込んだものを、dfInjury というデータフレームに格納しています。
dfInjury$Reason とは、dfInjury の要因(エクセルで言う列)です。 factor() 関数を使い、Reason 要因を因子に変換し、また Reason に格納しなおしています。
次の Gender も同様です。
では、ひとまず Reason 列だけで棒グラフを作図してみましょう。
ggplot(dfInjury, aes(x = Reason)) +
geom_bar(position = "identity") +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")これは、一見すると1/22の棒グラフの時と同じように作図したように見えます。
1/22 のソースコードは以下のようでした。 x だけでなく、 y も指定しています。
ggplot(dfKentei4, aes(x = Mountain, y = Altitude)) +
geom_bar(stat = "identity") +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")実は、ggplot() 関数では、aes の中の引数 y を指定しないで棒グラフを描こうとすると、y は x の件数とするのです。
帯グラフの作図
では、いよいよ帯グラフを描きましょう。 まず、引数 x には性別を設定します。 引数 y は、件数を数えるため、設定しません。 ここで新たに、fill という引数を設定します。 これが、帯の模様を作る要因になります。
ggplot(dfInjury, aes(x = Gender, fill = Reason)) +
geom_bar() +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")おや、これでは件数をそのまま積み上げており、比率を求めたことになりません。 帯グラフにするためには、 geom_bar() 関数 に、position = "fill" という引数を与えます。
ggplot(dfInjury, aes(x = Gender, fill = Reason)) +
geom_bar(position = "fill") +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")ここで、ちょっと分かりにくいのは、ggplot() 関数の中の fill は引数ですが、geom_bar() 関数に与えている “fill” は、文字列なのでクォーテーションマークで囲っています。
縦棒ではなく、横棒にしましょう。 coord_flip() という関数を追加します。
ggplot(dfInjury, aes(x = Gender, fill = Reason)) +
geom_bar(position = "fill") +
coord_flip() +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")色がどぎついままですね。 色については、R では科学ジャーナルに応じた色パレットを提供するパッケージがあります。 パッケージ名は ggsci です。 このパッケージには、Lancet 風の色にする scale_fill_lancet() や、 JAMA 風にする scale_fill_jama() 関数があります。。
library(ggsci)
ggplot(dfInjury, aes(x = Gender, fill = Reason)) +
geom_bar(position = "fill") +
coord_flip() +
scale_fill_jama() +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")最終的には、以下のようにしてみました。
library(ggsci)
ggplot(dfInjury, aes(x = Gender, fill = Reason)) +
geom_bar(position = "fill", width = 0.5) +
coord_flip() +
scale_fill_jama(name = "理由") +
ggtitle("保健室を利用した理由") +
xlab("性別") + ylab("割合") +
scale_x_discrete(labels = c("女子", "男子")) +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")つまづきポイント
macOS の場合、この図の日本語部分が文字化けし、四角が並んでいるかと思われます。 ネットなどでは、豆腐と呼ばれています。 これは、フォントを適切に設定することで日本語が表示されます。
フォントを設定するには、最後の行に + 記号を追加し、 theme_*() 関数でフォントファミリーを設定します。
scale_fill_discrete(name = "理由") +
theme_grey(base_family = "HiraginoSans-W3")まとめ
- 帯グラフ、円グラフは割合を示しますが、表で数値を示すだけのこともあります。
- 集計データではなく、生データから図を作成しました。
- カラーパレットを使って、色の組み合わせを変えてみました。
演習 (6/11)
統計検定4級テキスト p. 46 の問1と問2を読み、グラフを作成してみましょう。
なお、データは、 kentei4.xlsx のシート p46-1 と p46-2 にあります。
クロス集計 (6/18)
クロス集計
クロス集計表の説明は、統計検定4級テキストの p. 62 にあります。 複数の項目を組合わせて度数を集計した表です。
テキストには書かれていませんが、実はこれを図示したものが帯グラフです。
つまり、帯グラフとクロス集計表は同じものを表しています。
そこで、帯グラフを作図する際に使ったデータを使ってみましょう。 まずは、同じデータをインポートし、データフレーム dfInjury に格納します。
library(readxl)
dfInjury <- read_excel("kentei4.xlsx", sheet = "p55-raw")
dfInjury$Reason <- factor(dfInjury$Reason)
dfInjury$Gender <- factor(dfInjury$Gender)ここまでは、帯グラフの時と全く同じです。
次に、base パッケージにある ftable() 関数を使って、クロス集計表を出力してみます。
ftable(dfInjury, row.vars = "Gender", col.vars = "Reason")## Reason すり傷 その他 ねんざ 切り傷 頭痛 発熱 腹痛
## Gender
## F 2 2 2 3 10 3 2
## M 7 1 1 2 3 0 3
これは、確認するためには十分ですが、報告書にこのまま記載するわけにはいきません。 そこで、もう少し見た目の良い表を作るために crosstable というパッケージを追加してみます。
library(crosstable)
as_flextable(crosstable(dfInjury, cols = Reason, by = Gender))label | variable | Gender | |
F | M | ||
Reason | すり傷 | 2 (22.22%) | 7 (77.78%) |
その他 | 2 (66.67%) | 1 (33.33%) | |
ねんざ | 2 (66.67%) | 1 (33.33%) | |
切り傷 | 3 (60.00%) | 2 (40.00%) | |
頭痛 | 10 (76.92%) | 3 (23.08%) | |
発熱 | 3 (100.00%) | 0 (0%) | |
腹痛 | 2 (40.00%) | 3 (60.00%) | |
このほかに、SPSSやSASに慣れた人向けの出力をするパッケージ gmodels もあります。
library(gmodels)
CrossTable(dfInjury$Gender, dfInjury$Reason, format = "SPSS")##
## Cell Contents
## |-------------------------|
## | Count |
## | Chi-square contribution |
## | Row Percent |
## | Column Percent |
## | Total Percent |
## |-------------------------|
##
## Total Observations in Table: 41
##
## | dfInjury$Reason
## dfInjury$Gender | すり傷 | その他 | ねんざ | 切り傷 | 頭痛 | 発熱 | 腹痛 | Row Total |
## ----------------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
## F | 2 | 2 | 2 | 3 | 10 | 3 | 2 | 24 |
## | 2.028 | 0.034 | 0.034 | 0.002 | 0.751 | 0.881 | 0.293 | |
## | 8.333% | 8.333% | 8.333% | 12.500% | 41.667% | 12.500% | 8.333% | 58.537% |
## | 22.222% | 66.667% | 66.667% | 60.000% | 76.923% | 100.000% | 40.000% | |
## | 4.878% | 4.878% | 4.878% | 7.317% | 24.390% | 7.317% | 4.878% | |
## ----------------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
## M | 7 | 1 | 1 | 2 | 3 | 0 | 3 | 17 |
## | 2.862 | 0.048 | 0.048 | 0.003 | 1.060 | 1.244 | 0.414 | |
## | 41.176% | 5.882% | 5.882% | 11.765% | 17.647% | 0.000% | 17.647% | 41.463% |
## | 77.778% | 33.333% | 33.333% | 40.000% | 23.077% | 0.000% | 60.000% | |
## | 17.073% | 2.439% | 2.439% | 4.878% | 7.317% | 0.000% | 7.317% | |
## ----------------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
## Column Total | 9 | 3 | 3 | 5 | 13 | 3 | 5 | 41 |
## | 21.951% | 7.317% | 7.317% | 12.195% | 31.707% | 7.317% | 12.195% | |
## ----------------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
##
##
医療系の場合、クロス集計表には、質的データにはχ二乗検定、量的データにはt検定(どちらも正規分布を仮定しています)を行い、そのp値を付すことが多い用です。 なお、上記の crosstable でも、test = TRUE という引数を追加することで検定結果を追加することができます。
そこで、医療系にあったクロス集計表を作成してみます。
library(tableone)
CreateTableOne(data = dfInjury, strata = "Gender", factorVars = "Reason")## Stratified by Gender
## F M p test
## n 24 17
## StudentID (mean (SD)) 23.42 (12.45) 17.59 (10.72) 0.126
## Reason (%) 0.138
## すり傷 2 ( 8.3) 7 ( 41.2)
## その他 2 ( 8.3) 1 ( 5.9)
## ねんざ 2 ( 8.3) 1 ( 5.9)
## 切り傷 3 (12.5) 2 ( 11.8)
## 頭痛 10 (41.7) 3 ( 17.6)
## 発熱 3 (12.5) 0 ( 0.0)
## 腹痛 2 ( 8.3) 3 ( 17.6)
## Gender = M (%) 0 ( 0.0) 17 (100.0) <0.001
医療系ということもあり、引数も比較的わかりやすいものになっています。
引数
data: データフレームstrata: 層別化する列factorVars: データが因子の列。χ二乗検定される。他の列は量的データとみなされ、t検定される。
最後に、インタラクティブに操作することができる rpivotTable パッケージを紹介します。 これは、HTML の特徴を生かして、ウェブページ上で表示を変えることができるものになります。
library(rpivotTable)
rpivotTable(dfInjury, rows="Gender", cols="Reason", width="100%", height="400px")Wide と Long、集計
このパートは、直接 R で作業を行いません。
R の解説本を読んでいて困ることは、本に書かれているソースコードを、自分のデータで実行してみても、エラーが出たり思い通りの図や表が出ないことがあります。
今、各群10人、2群の被験者に対して、2つの尺度(例、ADL評価としてバーセルインデックスと認知機能評価として MMSE)を、2回測定するものとします。 エクセル等でデータを作成するとき、次の3種類があります。
集計データ
| Group | BI 1回目 | BI 2回目 | MMSE 1回目 | MMSE 2回目 |
|---|---|---|---|---|
| A | 87.4 (2.0) | 92.4 (2.2) | 17.4 (2.0) | 22.4 (2.2) |
| B | 87.6 (2.2) | 88.4 (2.1) | 17.6 (2.0) | 16.8 (2.1) |
生データ (Wide)
| PatientID | 群 | BI 1回目 | BI 2回目 | MMSE 1回目 | MMSE 2回目 |
|---|---|---|---|---|---|
| 1 | A | 85 | 85 | 17 | 18 |
| 2 | B | 85 | 80 | 16 | 17 |
多くの人は、生データ (Wide) から、集計データや図を作成していくのではないでしょうか?
実は、Wide 形式というのは、必ずしも使いやすい形式ではありません。
現在、Rでは以下のような生データ (Long) を準備することが推奨されています。
生データ (Long)
| PatientID | Group | Scale | Time | Value |
|---|---|---|---|---|
| 1 | A | BI | 1 | 85 |
| 1 | A | BI | 2 | 85 |
| 1 | A | MMSE | 1 | 17 |
| 1 | A | MMSE | 2 | 18 |
| 2 | B | BI | 1 | 85 |
| 2 | B | BI | 2 | 80 |
| 2 | B | MMSE | 1 | 16 |
| 2 | B | MMSE | 2 | 17 |
ggplot2 による作図や各種の検定は、Long 形式のデータから直接できるようになっています。
統計検定4級テキストでは、これまでほとんど「集計データ」を扱ってきました。 これは、統計検定4級テキストにあるデータで完成されたものは、集計データだけだったからです。 生データ (Wide) に相当するものは、p.55 表2.2.1 (ある小学校の保健室の利用記録)、p.63 表2.2.6 (体育祭に関するアンケート結果の一覧表)など一部ありしたが、2名程度しかデータがありませんでした。
例外は、帯グラフを作成するときに利用した保健室データの生データですが、これはテキスト中にはなく想像で作ったものです。
生データ (Long) は、以下のようなことが利点として挙げられます。
- 記録する際のフォーマットに近い。
- 検査ごとに検査者や日付データなどを入れることもできる。
一方で、欠点もあります。
- 生データ (Wide) と異なり、欠測データが一覧表からは分かりにくい。
R では、これまで Long と Wide を変換するパッケージが何度か大きく改定されてきました。 インターネット上で R wide long 変換 などと検索すると、現在でも変遷する前の古い方法が引っ掛かります。
| パッケージ | long から wide | wide から long |
|---|---|---|
| reshape2 | dcast | melt |
| tidyr < 1.0 | spread | gather |
| tidyr >= 1.0 | dcast | pivot_longer |
reshape2 パッケージは、今でも使うことができます。 また、tidyr の spread() と gather() 関数もまだありますが、いずれはなくなると思われます。 基本的には、tidyr の pivot_* 関数を覚えるようにしましょう。
まとめ
- R におけるクロス集計の作成方法を学んだ。
- データの形式として、集計データ、生データ (wide)、生データ (long) について学んだ。
- R で作図や表作成をするには、適切な生データ (wide または long) を使う必要があることを学んだ。
ヒストグラムと箱ひげ図 (6/25)
ヒストグラム
統計検定4級テキスト p. 116 に説明されている、「科学の道具箱」のサイトから、「01.小・中学校体力測定データ」をダウンロードします。
library(curl)
curl_download("https://rika-net.com/contents/cp0530/contents/data/04-03-01.xls", "tairyoku.xls")
library(readxl)
dfTairyoku <- read_excel("tairyoku.xls")library(readxl)
dfTairyoku <- read_excel("tairyoku.xls")
dfTairyoku$`学校` <- factor(dfTairyoku$`学校`)では、ggplot2 を使って、ヒストグラムを描いてみましょう。 日本語の列名は、バッククォートで囲むことで使うことができます。
library(ggplot2)
ggplot(dfTairyoku, aes(x = `50m走(秒)`)) +
geom_histogram() +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
箱ひげ図
次に箱ひげ図 (box-whisker plot) を描いてみます。 箱ひげ図は、英語では box-whisker ですが、関数名は geom_box() です。
なお、統計検定4級テキスト p. 117 では、「学校」列で層別化 (strata) しています。
library(ggplot2)
ggplot(dfTairyoku, aes(x = `学校`, y = `50m走(秒)`)) +
geom_boxplot() +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")p. 118 の図2.3.30 のように、並べて表示するためには、データを Long 形式にしなければなりません。
library(tidyr)
dfTairyokuLong <- pivot_longer(dfTairyoku,
cols = c(`握力(左)(kg)`, `握力(右)(kg)`),
names_to = "Hand",
values_to = "Handgrip")これで、データが Long になっています。 データを確認してみましょう。
それでは、いよいよ図を作成します。 引数 x には学校 (学校列)、y には握力 (Handgrip列) です。 左手と右手を並べるため、fill 引数に Hand 列を指定します。
library(ggplot2)
ggplot(dfTairyokuLong, aes(x = 学校, y = Handgrip, fill = Hand)) +
geom_boxplot(width = 0.4) +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")統計検定4級テキスト p. 118 の図2.3.30では、平均値も追加しています。
library(ggplot2)
ggplot(dfTairyokuLong, aes(x = 学校, y = Handgrip, fill = Hand)) +
geom_boxplot(width = 0.4) +
stat_summary(fun.y=mean, geom="point", shape=4, size=3, color="black",
position = position_dodge2(width = 0.4, preserve = "single")) +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")小学校と中学校を入れ替えたり、色を変えてみてください。
散布図
統計検定4級テキスト p. 118 には、散布図(図2.3.31)があります。 これを作図してみましょう。
使用するのは、これまでと同じく ggplot2 パッケージです。 点を追加するので、geom_point() 関数を追加します。
相関の高そうな、握力の右と左を使ってみましょう。 なお、データフレームは Wide 形式の方を使っています。
library(ggplot2)
ggplot(dfTairyoku, aes(x = dfTairyoku$`握力(右)(kg)` , dfTairyoku$`握力(左)(kg)`)) +
geom_point() +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")散布図行列
統計検定4級テキスト p. 119 には、散布図がたくさんまとまった図(図2.3.32)があります。 これを作図してみましょう。
使用するのは、GGally パッケージにある ggpairs() という関数です。 すべての列を使用すると多すぎるので、第4列(握力(右)(kg))から第7列(長座体前屈(cm))までを指定します。
library(GGally)
ggpairs(dfTairyoku,
columns = c(4, 5, 6, 7)) +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")相関図に加えて、相関係数も表示されています。
今日はここまでとします。
まとめ
- ヒストグラムと箱ひげ図を描きました。
- ヒストグラムと箱ひげ図は、量的データのばらつきを表すことを確認しました。
- 散布図と散布図行列を作図してみました。
HTML, Word, プレゼンテーション (7/2)
これまで、いろいろな図を作ってきたかと思います。 そして、それは .Rmd 形式のファイルに保存していました。
自分のPCにだけ保存しておくのはもったいないです。 ぜひ、学会で発表したり、論文を書いて投稿しましょう。
プレゼンテーション
Rmd でプレゼンテーションファイルが作れます。 実は、Rmd からスライドを作る方法はたくさんあります。
- PowerPoint 出力
- HTML 出力
- ioslides
- Slidify
- reveal.js
それぞれ、見た目や機能が異なりますので、試してみて気に入ったものを使ってみてください。
Rmd ファイルでは、スライドの区切りは、以下のようになります。
- 大見出しを付ける場合は
# - 見出しを付ける場合は
## - 見出しのないスライドの区切りは
---
# 見出し1
* 項目1
## 小見出し1
* 項目1.1
---
コメント
Word に出力
近年、多くの学会では、論文の原稿として LaTeX や Word 形式を受け付けています。 しかし、学会によって形式がちょっとずつ異なります。
例えば、ある学会は行番号を入れて投稿せよとあり、別の学会では行番号を入れるなとあります。 こうした問題にある程度対処できるようにしましょう。
Rmn の冒頭に、以下のような記述があると思います。
---
title: "Good Morning RStudio!"
author: "BABA Yoshihiko"
date: "2022/1/4"
output: html_document
---
この最後の行を word_document に変えると、Word .docx 形式で出力することがデフォルトになります。 ただし、これだけなら、Knit ボタンで Knit to Word を選択してもできますね。 上記の場合、実は Word ファイルをテンプレートとして指定することができます。 これによって、あらかじめ double lined や行番号を書式設定しておいた .docx ファイルを用意しておけば、その形式で出力してくれます。
Play with R!
最後に、いろいろと遊んでみましょう。
Google 検索するときに、ggplot2 glow などと検索し、「画像」ボタンをクリックします。 そうすることで、いろいろな ggplot2 の工夫を見ることができます。
多くの場合、ソースコードも示してあります。 これを試してみましょう。
まず、統計検定4級テキストにあった絵グラフのようなものを作ってみます。 これには、reactable と reactablefmtr というパッケージを使います。 実は、絵グラフで検索してみてもこれは見つかりませんでした。 最終的には、“cran cool table statistics” で見つかりました。
この画面中には見当たりませんが、下のほうにスクロールしていくと、かっこいいテーブルが見つかりました。
library(reactablefmtr)
library(reactable)
reactable(dfJPop,
defaultColDef = colDef(align = "left", maxWidth = 200),
columns = list(
Population = colDef(cell = icon_assign(dfJPop, icon = "envira", fill_color = "green", buckets = 5, show_values = "right")))
)ここでは絵グラフのようなものを試してみましたが、他にもいろいろとできそうです。
次に円グラフもかっこよくしてみましょう。
library(ggplot2)
ggplot(dfInjury, aes(x = Reason, fill = Gender)) +
geom_bar(colour = "white") +
coord_polar(theta = "x") +
theme_bw(base_family = "Hiragino Kaku Gothic Pro W3")ソースコードを見ていただくとわかりますが、geom_bar() 関数 を使っているので、これはあくまでも棒グラフです。 棒グラフを、coord_polar() 関数で、円グラフのように表示しています。
次に、webr パッケージの PieDonut() 関数を使ってみます。
なお、関数名は、R では通常、小文字の英語で verb_adjective(noun) という形式をとることが多いです。しかし、この PieDonut() 関数は、NounNoun2(noun) という形式になっていて、ちょっと違和感があります。
library(webr)
PieDonut(dfInjury,
aes(pies=Gender,donuts=Reason),
family = "Hiragino Kaku Gothic Pro W3")次に、グラフを光らせてみましょう。 「光る」は、英語で glow ですので、Google で “ggplot2 glow” と検索してみます。
library(ggplot2)
library(ggfx)
ggplot(dfTairyokuLong, aes(x = 学校, y = Handgrip, colour = Hand)) +
geom_violin() +
with_outer_glow(
geom_jitter(
aes(group = Hand),
position = position_jitterdodge()
),
colour = "white",
sigma = 15,
expand = 2) +
scale_color_manual(values = c("#00AFBB", "#E7B800")) +
theme_dark(base_family = "Hiragino Kaku Gothic Pro W3")library(ggplot2)
library(ggfx)
ggplot(dfMatz, aes(x = PitchType, y = Frequency)) +
with_outer_glow(
geom_bar(stat = "identity", fill = "white"),
colour = "gold",
sigma = 15,
expand = 2
) +
with_outer_glow(
geom_line(data = dfMatz,
aes(x = PitchType,
y = CumulativeProportion * 1500,
group = 1,
inherit.aes = FALSE),
colour = "blue"),
colour = "cyan",
sigma = 15,
expand = 2) +
scale_y_continuous(sec.axis = sec_axis(~./1500, name = "累積度数")) +
theme_dark(base_family = "Hiragino Kaku Gothic Pro W3")まとめ
- 統計検定4級テキストを使い、RStudio の操作方法を学びました。
- テキストのすべてを網羅したわけではありません。円グラフなど、あまり使用しないものは省略しています。
- Rは、マスターするものではありません。検索しながら使っていくと良いと思います。