第3章ではggplot2を使ったグラフの作り方について説明してきました。【3-11】Rのggplot2で作った複数のグラフを1つにまとめるgridExtraパッケージ今まで基本的なグラフの作り方について紹介しましたが、ggplot2は他にも様々なな調整やができます。今回はグラフを作るときに参考になるサイトを紹介します。質・量共にこのサイトより充実しているものばかりですが、ある程度慣なれていないと読み解けない箇所もあります。(初心者に向けた)説明の細かさはこのサイトが1番だと思いますので、困ったらこのサイトで確認してください。チートシートチートシートとは直訳するとカンニングペーパーという意味で、スライド1〜2枚でその機能を確認できる便利シートになります。基本的な使い方でこまればまずはチートシートを確認しています。Rにもいろいろなチートシートがあり、ggplot2のチートシートもあります。ggplot2のチートシートはRStudioのヘルプ→Cheetsheetsにあります(英語版)。日本語版もありますのでダウンロードしてお使いください。楽天Kobo通称「宇宙本」この本は初めてRを勉強する方に最初に進めている本です。Rの基本的な操作から第2章で行ったデータハンドリング、第3章で行ったggplot2によるグラフ作成も紹介されています。他にもウェブスクレイピングやレポートの作成などRを使ってデータ分析を行いたい方にはピッタリはまると思います。弓美子他Amazon楽天この本ではggplot2の細かい使い方が紹介されている辞書的な1冊です。2013年の本なのでRやggplotのバージョンの問題で上手く動かないものがあるというコメントもあります。実はこの本の第2版がオンラインで無料で読むことができます(英語)。サイトggplot2を初歩から要点押さえて使いこなすチュートリアルとコード集グラフ描画ggplot2の辞書的まとめ20のコードggplot2による可視化入門biostatisticsこれらのサイトはggplot2の基本的な使い方や代表的なグラフ、オプションの説明があります。慣れない時期はこれらのサイトを見比べながら少しずつイメージを掴むようにしてました。2019海外のサイトですが用途を選べばどのグラフを使えばいいか、そのコードサンプルを表示してくれます。そもそもどんなグラフを使えばいいか分からない場合は参考になります。edition先程の「Rグラフィックスクックブック」の第2版です。英語版では書籍がありますが、オンライ版は無料となっています。ggplot2の辞書的な使い方ができますので、困ったことがあるとよくお世話になっています。英語ではありますが、第3章を一通り試す+google翻訳でも参考になる部分は大きいと思っています。Visualizationこちらも英語版ではありますが、Rを使ったグラフ作成について考え方から実際のコードまで紹介されています。中上級変ではありますが勉強になります。Science私がRを勉強するのに利用したMOOC(Edx)のテキストです。英語ですが無料で読めます。ggplot2に関しても詳しい説明があります。こちらではデータ視覚化の原則(これだけは絶対にするな集)もあるので一読を進めます!r-wakalangRに関するどんな質問でも気軽に相談できるslackになります。Rは実はコミュニティーが平和で、初心者的な質問でも誰かがわかりやすく回答してくれる非常に珍しい(貴重な!)場になっています。ggplot2に関してのスレッドもあります。まとめ今回はRのggplot2を使うときに参考になる書籍やサイトを紹介しました。これからも参考になる情報があれば更新したいと思います。更新)前回はmutate関数を使って列の追加や修正を行いました。最後に以下のコメントで終了しました。mutate関数を使うと「FIMの合計点」とかだけでなく、年齢を「年代ごとに分類する」だったり、ある評価の「カットオフ値以上とそれ以下」に分けた列をExcelを使わずに作成することができます。(【2-2】Rのmutate関数を使って列の追加や修正を行うより)今回は連続変数を条件に応じて複数のカテゴリーに変換していきます。Rではいくつか方法があるのですが、今回はifelse関数、case_when関数、cut関数を紹介します。今回使う架空のデータは年齢、性別、病名が入っています。下のコードをまとめてスクリプトにコピペして実行してください。data.frame(年齢,性別,病名)head(data)今回は%>%やmutate関数を使って作業します。これらの使い方に不安がある場合は前回の記事をご参照ください1.ifelse関数をつかって分類する条件から2つに分類する場合ifelse関数は条件からTRUEとFALSEの2つに分けることができます。FALSEの場合)まず例としてdata_20という変数名に以下のように分類していきます。"female"))head(data_成人)条件から3つ以上分類する場合3つ以上分類するはifelse関数のFALSEにifelseを入れ込みます。FALSE)))このような形を「入れ子」と呼ぶそうです。繰り返せばいくらでも条件を増やすことができます。今度は「年代」という変数名で20歳ごとに区切ってみます。上のイメージをコードにするとこうなります。TRUE)の部分はfactorの順番を並べ替えています。20〜・・・」と100歳以上の場所がずれてしまいます。factorの並べ替えをしています。参照:【1-10】Rでよく使われる型について説明します。個人的に感じる「ifelse関数+入れ子」のメリットは「他の関数を覚えなくていい」で、デメリットは終わりの))))))))の数が多すぎて間違えやすく、エラーに悩まされることです(笑)2.case_when関数を使って分類する3つ以上の分類で入れ子構造対策で慣れるとわかりやすいのがcase_when関数かもしれません。上のイメージをコードにするとこうなります。)の数が少ないのがありがたいところです。上記の場合は数値でしたが次のような場合はどうでしょう?最初に行ったdata_20という変数名に以下のように分類していきます。Bは似ていますが、Bにあたる部分で==であれば1つしか入りません。%in%は1つでも複数でも大丈夫です。==に変えるとエラーが出ます。上記図は今回の記事だけでなく条件式を作る時に必要になる考え方です。case_when関数のメリットは入れ子構造にならないことで、デメリットとしては2つに分類するならifelseの方がコードが短くなります。Nishidaさんのツイートでcase_whenの解説を見つけました。ExploratoryはRをベースにしたデータ分析のソフトです。Rはプログラムを勉強してからでしか使えないところがありますが、ExploratoryはRコマンダーのようにプログラムを使わずにデータ分析ができます。すべての人にデータサイエンスを最新のデータサイエンスでは、さまざまな種類のデータを扱うことができ、機械学習や統計アルゴリズムを使用して、深い統計の知識がなくてもデータに隠れているパターンや傾向を見つけることができます。それはデータサイエンティストとプログラマーに限られています。Exploratoryは誰もが、プログラミングを必要とせずに、モダンで最先端のデータサイエンスのアルゴリズムに簡単にアクセスできるようにします。私たちは誰もが最新のテクノロジーにアクセスし、データを通じて世界をより深く理解していくべきだと強く信じています。~って部分がちょっと不安になるかもしれないけど、これはELSEといっしょ、つまりどの条件にも当てはまらなかったらということ。Nishida@KanAugust条件に、%in%を使って複数の値のリストのうち、どれかにマッチしたら、っていうのも使えるのが便利。12:09:25Exploratoryのサイトでもcase_when紹介がありました。運動器疾患と脳血管疾患以外をその他にしたければ以下のようになります。TRUEはここでは残り全部といった意味になります。"その他"勉強になりました!3.cut関数を使って分類する数値を分類するに限って言うとcut関数も使えます。cut関数はコードはスッキリしますが、少しクセがあり、おまじないが必要です。FALSEが必要になります。TRUEを加えないと端の値を読み込まず<NA>とデータなしとみなされてしまいます。これらをふまえると以下のコードになります。忘れないように注意が必要です。補足.mutate関数の組み合わせについてmutate関数を複数回行うにはいくつかの方法があります。(追記)2019/02/16更新すみません。mutate関数では2の方法は使えませんでした。2の方法は次で紹介するfilter関数で使うことができます。本来は,でつなぐと1つの行で済むのですが、初心者だと、()や,の数がうまくあわなかったりします。プログラミングの上級者からは意見があるかもしれませんが、プログラミング未経験・初心者はまず自分の覚えやすいものから始めていいと思っています。まとめ今回は条件によって分類する方法についてifelse関数、case_when関数、cut関数を紹介しました。それぞれに特徴がありますので、必要に応じて使い分けてください。%in%など)の紹介も行いました。演算子はデータを集計するときに必要になりますのでまた紹介していきたいと思います。【3-11】Rのggplot2で作った複数のグラフを1つにまとめるgridExtraパッケージ第3章ではggplot2を使ったグラフの作り方について説明してきました。【3-10】Rのggplot2でグループ毎にグラフを作りまとめて表示するfacet_wrap関数では3つのグラフを作成しました。今回はその3つのグラフを並べて1つのグラフにしてしまうgridExtraパッケージを紹介します。1.使用するデータ今回は【3-10】Rのggplot2でグループ毎にグラフを作りまとめて表示するfacet_wrap関数で取り込んだデータを使用します。データやコードについては以下をご参照ください。今回はtidyverseパッケージに加えgridExtraパッケージを使用します。上記パッケージを一度も使ったことがなければインストールします。install.packages("tidyverse")既にインストールしていればlibrary関数で呼び出します。("HiraKakuPro-W3")を使っています。+をの色をつけた箇所を消してください。"none")2.gridExtraパッケージについてgridExtraパッケージのgrid.arrange関数は複数のグラフを並べて1つのグラフにしてくれます。gridExtraパッケージを一度も使ったことがなければインストールします。install.packages("gridExtra")既にインストールしていればlibrary関数で呼び出します。...)とつなげるだけです。行数と列数を指定することもできます。1は横には1つ並べるという意味になります(何もつけないとこれになる)。2は横に2つ並べるとなります。縦には制限なく並びます。2は縦に2つ並べるという意味になります。5.大きさの比率を変える縦と横の比率を変えることもできます。2)のように指定します。2)のように3つ数を指定します。c(2,3))6.自分でレイアウトを作るさらに細かいレイアウトも可能です。この方法は以下のサイトを参考にさせていただきました。1自分でレイアウトを作る3パターンレイアウトを作ってみました。ポイントはmatrix型にすることです。rbind関数とc関数で縦につなぎます。=で微調整しています。2))7.まとめ今回はパッケージを使って複数のグラフを1つにまとめる方法を紹介しました。工夫次第でいろいろな見せ方ができます。gridExtraは便利なパッケージですのでぜひ試してみてください。第3章ではggplot2を使ったグラフの作り方について説明してきました。今回は少し実用的な場面としてテストの結果を下位項目も含めてまとめてグラフに表示するを目指したいと思います。以前仕事で1日で130個以上のグラフをExcelでコピペの手作業で作るという苦行をしたことがあるのですが、この方法で一気に作れるようになりました。【3-4】Rのggplot2でヒストグラムを作るgeom_histogram関数でfacet_grid関数について説明しましたが、今回はfacet_wrap関数を紹介します。下位項目をまとめてグラフで表示するためにはデータハンドリングも必要になります。データハンドリングについては2章で説明していますのでそちらもご参照ください。1.使用するデータ今回は【2-7】Excelの複数シートをRで一気に読み込むで取り込んだデータを使用します。使用するFIMという架空のデータです。FIM18項目ありそれぞれ1〜7点で採点します。FIMには運動項目と認知項目というサブグループがあります。食事〜階段までの13項目を運動項目(FIM_運動合計:13〜91点)理解〜記憶までの5項目を認知項目(FIM_認知合計:5〜35点)すべての合計をFIM_合計(18〜126点)またFIMを3回計測し、sheetという列には1回目,2回目,3回目が入っています。read.csv(url)head(dat)このデータからFIMの合計点と下位項目が1〜3回目でどのように変化したのかをグラフにしてみたいと思います。今回は棒グラフで平均を出します。2.データハンドリング【3-9】ggplot2でヒートマップを作るgeom_tile関数ではFIM_食事の項目だけを使いましたが、今回は全ての下位項目を使用します。グラフ作成にあたり、以下をイメージしてデータハンドリングします。・グラフを作る際、FIM_○○の"FIM_"はいらないので消したい・sheetごと、各項目ごとの平均を出したい。そのためにはwideデータになっているdatをlongデータにする必要がある・グラフに数値を表示するときに小数点が続くと見栄えが悪いので、小数点第1位まで表示したい今回もtidyverseパッケージを使用します。tidyverseパッケージを一度も使ったことがなければインストールします。install.packages("tidyverse")既にインストールしていればlibrary関数で呼び出します。data.frameの名前を変更する方法names関数を使うとdata.frameの列名をベクトルとして出してくれます。names(dat)そして直接変更するにはrename関数などありますが、同じ長さのベクトルを準備すると一括して入れ替えることができます。同じ長さのベクトル指定した文字列を消すstr_remove関数str_remove関数は指定した文字を消す事ができます。longデータについてはこちらの記事で紹介しています。TRUEを指定します。group_by関数とsummarize関数で集計する項目とsheet毎に集計を行うにはgroup_by関数とsummarize関数を使います。四捨五入するmutate関数とround関数を使って平均の値を四捨五入します。まとめると最初のコードになります。3.棒グラフを作成する棒グラフを作るにはgeom_bar関数を使います。棒グラフに数値を乗せる方法も紹介しています。("HiraKakuPro-W3")を使っています。+をの色をつけた箇所を消してください。facet_wrapでグループ毎のグラフをまとめて作るそしてグループ毎にグラフを作るにはfacet_wrap関数を使います。項目)これで項目ごとのグラフができました。気になる点があります。facet_wrapはそのままだと軸が固定されています。合計と各項目に点数差がありすぎて、各項目の点数の差がわかりません。"free"を追加します。"free")ただこれも1つ問題があります。グラフ自体は変化しているように見えるのですが、それぞれの軸が違うのでグループ毎の比較ができません。そのためにはdat_statからそれぞれを抽出してグラフを作成する必要があります。グラフ作成まで行ってみます。datを省略できます。"free"は追加しませんそしてfilter()の列以外は全部同じなことにも注目してください。filter関数については【2-4】で紹介しています。"none")5.まとめ今回はfacet_wrapでグループ毎のグラフを作る方法を紹介しました。facet_wrapはグループの違いをみるのに非常に便利です。合計と下位項目が入っているデータだと軸の問題が出ますので注意が必要です。今回作った3種類のグラフを組み合わせるためのgridExtraパッケージがあり次回紹介します。第3章ではggplot2を使ったグラフの作り方を紹介しています。今回はヒートマップを紹介します。ヒートマップはx軸,y軸だけでなくタイルの色で3次元的な表現ができます。ヒートマップといえば天気アプリの雨雲予報などでも見られますが、今回は集計したデータを折れ線グラフとヒートマップで比べてみるとどうなるかをRのコードを書きながら紹介したいと思います。1.使用するデータ今回は【2-7】Excelの複数シートをRで一気に読み込むで取り込んだデータを使用します。使用するFIMという架空のデータです。FIM18項目ありそれぞれ1〜7点で採点します(合計18〜126点)。FIMを3回計測し、sheetという列には1回目,2回目,3回目が入っています。read.csv(url)2.データハンドリング今回はFIMの中でもFIM_食事のデータだけを使います。この後グラフ作成で使うggplot2関数は全てtidyverseパッケージに含まれます。tidyverseパッケージを一度も使ったことがなければインストールします。install.packages("tidyverse")既にインストールしていればlibrary関数で呼び出します。データハンドリングを練習しているところであれば下のコードをみながら作成してみてください。ポイントは以下2つです。dat_eat_summarizeでは折れ線グラフを作成するのに項目という列を追加しました。dat_eat_statで個数を数える場合はn()を使います。()の中は何も入れません。なれない場合は下のリンクを参照してください。【2-4】Rで指定した列や行だけを取り出すselect関数、slice関数、filter関数を紹介します【2-6】Rでgroup_by関数とsummarize関数を使ってグラフ作成に必要な統計量(平均や標準偏差など)を求める【演習2】データハンドリングの基礎を復習します3.折れ線グラフを作るまずは折れ線グラフを作ってみます。折れ線グラフはgeom_line関数、数値を入れる場合はgeom_text関数です。平均の折れ線グラフまずdat_eat_summarizeを使って平均の折れ線グラフを作ります。ylim関数はy軸の最大値と最小値を設定します。7)実際の生データと平均を組み合わせる要約としてはこれでもいいですが、実際のデータも確認してみたいと思います。実際のデータはdat_eatにあるので使います。すると患者毎の折れ線グラフを作ることができます。して薄くしたほうが平均の線が目立ちます。4.ヒートマップを作る上の折れ線グラフもいいのですが、線が重なっているので数字が多いのか少ないのかわかりません。そのため次はヒートマップを作成してみます。ヒートマップはgeom_tile関数、またはgeom_raster関数です。geom_tile関数でヒートマップの色を指定するのにfillを指定します。色をn(カウント数)としたいので以下になります。5.タイルの色を変えるタイルの色を変えるにはscale_fill_gradientn関数を使います。折れ線グラフの線の色を変える時はscale_color_gradientn関数でした。今回は中の色を指定するのでcolorではなくfillになっています。=で2色指定するとグラデーションができます。3色以上指定すると中間の色も指定できます。"red"))すると1→3回目になるにつれて7点が増えていることがわかります。6.ヒートマップに数値を加えるヒートマップで傾向はつかめますが数値も欲しいところです。棒グラフや折れ線グラフの時と同様にgeom_text関数を使います。までは同じなので下のようにまとめることができます。数値が入ったことで見やすくなりました。7.ヒートマップに折れ線グラフを組み合わせる更にヒートマップと折れ線グラフを重ねてみます。ポイントは下に書いたコードが上に配置されます。1番上:数値2番目:折れ線グラフ3番目:ヒートマップ順番が大事です。これで十分ではありませんが、数値の変化も少し追えるようになりました。8.全部のグラフを重ねる過剰かもしれませんが、上のグラフに平均の折れ線グラフも加えてみます。順番に注意してください。9.まとめ今回はヒートマップを紹介しました。難しそうに感じますが、x軸とy軸にfillを加えるだけでヒートマップができてしまいます。アイデアを試してみるとggplot2やその前のデータハンドリングの理解にもつながりますので、3章の他のグラフも見ながらグラフ作成に挑戦してみてください。