ill-identified diary

所属組織の見解などとは一切関係なく小難しい話しかしません

[書評]『データ分析のためのデータ可視化入門』と最近の R グラフィックスパッケージ事情

この記事は最終更新日から3年以上が経過しています

概要

Healy (2018) “Data Visualization: A Practical Introduction” の邦訳『データ分析のためのデータ可視化入門』をもらったので, この本のレビューと本書ではあまり取り上げられていない, R グラフィックスをさらに活用するためのヒントを提示する.

2021/9/24 追記: 『Python ユーザでも『データ可視化入門』で練習できるようにパッケージを作った + Plotnine との互換性ガイド - ill-identified diary』に書いたように, Python でも matplotlib のような煩雑な構文に惑わされずにこの本で紹介されているような方法を実現するためのパッケージ/用例を作ってみた.


初めに

(潜在的な)読者には十分な情報を与えたいと思っている (翻訳者と出版社の売上を邪魔したいわけではない. しかし読者の立場に回れば結果的にそうなることもあるだろう) ので, 英語の原著はネット上で公開されているという情報も提示しておく. なお, 私は原著の書籍版も持っているので, それと比較した意見も書く. あくまで本書をどう読むか, という話である. これ以降, 本書に対する否定的なコメントもあるが, それだけで本書を買う価値がなくなるわけではない (むしろ私は過去に本書の邦訳が欲しい, と公の場で何度か発言している). この話と補完的に読むことで ggplot2 を基盤にした R グラフィックスのエコシステムをうまく活用して欲しい, というのが今回の狙いである.

本書の特徴

どういう本なのか

序文にもあるように本書は「なぜやるのか (Why)」と「どうやればいいか (how to)」の説明を両立することに努めている. 古くは Wickham (2009) 自身の ggplot2 のクックブック (2016 年にアップデートされた), そして最近では Chang (2018) が登場した. これらは ggplot2 の how to としては詳細であり優れているが why の記述は乏しかった.

本書の著者の導入するルールは基本的には Tufte (2001) の提唱する古典的なデータ可視化の原理に基づいている. これは端的に言えば「グラフに余計な装飾をするな, 情報は最低限にしろ」であり, インクは極力データの記述に使い, それ以外の「冗長な」記述に使うインクの量は最小限であれという「データ-インク比」なる概念まで用意している.

しかし本書は最近の認知心理学の研究などから得られた新しい知見にも言及している*1. その中のいくつか, 例えばチェッカーシャドー錯視, ゲシュタルトの法則などはみなさんの多くがどこかで見聞きしているだろう. 人間の眼は角度や面積の大小を正確に認識できないので, 円グラフは不適切だという話もどこかで聞いたことがあるかもしれない. 人間の視覚や色覚は形状や色彩を思ったより正確に認識することができない. さらにそういった生理的なものだけでなく, 人は常になんらかのコンテキストに基づいて物事を見ている (例えば本文の例なら, 米国の共和党民主党のシンボルカラーとして伝統的に青と赤が使われる). コンテキストとはつまり先入観でもあるので頼りすぎるべきではないが, よりストレスのない認知も可能になる. こういった事実を考慮すると人間の視覚能力には様々な制約, つまり文字通り「盲点」があり, 単純にシンプルさをめざすことで客観的なグラフができるとする「データ-インク比」の原理だけではどうもうまくいかない可能性がある*2. Tufte の著作は第2版においても多くが2色刷りだが, 本書, そしてその邦訳も, このような事情を反映して, フルカラーである.

もちろん, 抽象的な理論の説明に終止しているわけではない. とにかく手っ取り早く実用的なグラフを描く方法を知りたい読者に「人間とは……クジラとは……」などと遠大なテーマを語りだしても相手にされない. 冒頭に書いたように本書は “why” と “how to” のバランスをとって書いてあるので, こういう可視化の原理を書くだけでなく, 掲載されているほとんどのグラフに対して, それを作成する R のコードも掲載されている (例外の多くは真似してはいけない「悪い例」).

以前にも書いたように R はパッケージ開発が盛んなので解説が陳腐化しやすい. R に限らずオープンソースソフトウェアの使い方を解説する書籍の鮮度が急速に失われるのはほとんど宿命と言っていい. そんなわけで, これは個人的な考えだが, 真に実用的な技術書というのは, 実装に依存しがちでこのようにすぐ鮮度の落ちる “how to” だけでなく, より普遍的な原理や理論にあたる “why” もきちんと触れるものだと考えている. R ユーザーに広く普及し, 本書でも使用されている, ggplot2 パッケージですら例外でなく, 2018年の原著の出版以降新しい機能・構文が増えている. しかし邦訳では翻訳者の配慮で, そういった箇所の多くで原著のコードの差し替えまたは補足説明がなされている.

どういう人が読むとよいか

前節で書いたように, 掲載されているグラフのほとんどに対して, 作成したソースコードも掲載されている. 使用するデータの多くも著者の用意した socviz パッケージに含まれているため, R のごく基本的な操作だけを知っている初心者でも, ほとんどつまづくことは無いだろう. なお本書には R の最低限の使い方のレクチャーも含まれている. 読者はこれを元に少しづつオプションを書き換えたりすることで, ggplot2 の挙動を学べるだろう.

すでにある程度 ggplot2 パッケージを使っている人は, ちょっと Web 検索するだけで日本語の情報がいくつも引っかかることを知っているだろう (Tokyo.R の初心者セッションでもよく触れられる). 既にそういう情報を参考にして学んだ人も多いだろう. しかし多くは断片的だし, 古い記事ならあまり推奨されない書き方をしていることもある (もちろんとても良い資料も存在する). 本書は現時点でかなり新しい ggplot2 (ver. 3.3.2) の最新の書き方を反映している (翻訳の時点で更新されている) 上に, ggplot2 の基本機能を紹介するのだけではなく, 信頼区間のプロット, 散布図に対する回帰曲線のオーバーレイ, 地図上のプロット, といった事例ごとの how to を教えてくれる. これらを実現するに際して便利な他のパッケージもいろいろ紹介している. ggplot2 の基本的な関数は知っているが, 毎回グラフを描くコードがとても長くなってしまう人や, データを記述するのにそのグラフがなぜ適切なのか自分で説明できる自信がない人も, 読んで得られるものが多いだろう.

邦訳に対する細かいツッコミどころ

というわけでここからは明確にダメ出しの話をする. しかしこの「細かい」というのは critical でないという意味であり, 重ねて言うがこれらの問題点はあくまで些細なもので, だから買うなという意味ではない. むしろ私のこの指摘を念頭に置いた上で読んでくれれば本書はより一層役に立つことだろう.

  1. コードの幅など, 微妙にレイアウトが統一されてない

  2. 言及されている参考書の邦訳情報も欲しかった (参考文献リスト, 8.6節ほか)

  3. 現在は軸ラベルの重なりを回避するオプションもある (p. 167)

  4. 地図の可視化なら “Land doesn’t vote, people do” の紹介も欲しい (7章)

(1) 本書は余白を広めにとり, そこに傍注や参考となる図を配置するというレイアウトになっている (これは原著の Web 版でも同じ). 邦訳はところどころコードブロックが本文の枠から飛び出している. 原著より少し版が小さいため, 枠内に収めようとすると改行が増えすぎ, かといって文字を小さくすると見づらくなる. おそらく翻訳者らも腐心したに違いない*3. まあ私のような神経質な人間しか気にならないだろうが, 余白にもいろいろな情報が掲載されている一部のページでは窮屈さを感じてしまった.

(2) 本文中で何度か引用されている Wickham and Grolemund (2016) は『R で始めるデータサイエンス』というタイトルでオライリー・ジャパンから邦訳が出版されている. これは 8.6 節には書かれているが, 参考文献リストには注記がない. 本書は各章がある程度独立しているので, このセクションを見なくても気付くような配慮があったら良かったのではないかと思う. 冒頭でクックブックの例として挙げられた Chang (2018)*4も同様で, Imai (2017) も, 岩波書店から『社会科学のためのデータ分析入門』というタイトルで上下巻に分かれて邦訳が出ている. 出版時に原題とだいぶ違うタイトルになったり, 出版社のサイトで原著が何なのか記載されていなかったりすることも多いので調べるのが面倒ではあるが.

(3) これは 3.3.0 から追加された機能である. とはいえ本書で紹介されているように軸を転置させたほうが見やすくなることが多いというのはそのとおりなので, あくまで知っておくといいかもしれない, という程度. いちおう, 公式ブログと同じ例で比較を図1に掲載する.

p <- ggplot(mpg) +
  geom_bar(aes(x = manufacturer, fill = drv)) + 
  theme(axis.text.x = element_text(size = 11))
p

p + scale_x_discrete(guide = guide_axis(n.dodge = 2))

図 1: 3.3.0 から追加されたラベルの重なり回避
f:id:ill-identified:20210203221650p:plain

(4) はツッコミというべきではない. これが公開されたのはつい1ヶ月前, 2020年の年末だからだ. 以下のようなツイートが当時話題になった (使用したコードともっと詳細なデモは github で公開されている.).

これは色分け地図を安易に使うことを戒めた秀逸な例だ. スイスの国民投票について, 青 (賛成多数) と 赤 (反対多数) で色分けしたこの地図は, 一見すると青が大多数にみえる. しかし実際には賛成多数の地域の多くは山林地帯 (というかアルプス山脈) であり, 面積が広い割に人口が少ない. そしてこの投票では実際には反対がわずかに過半数を越えている. もちろん本書でも本質的に同様なアイディアを述べ, 注意を喚起している. しかし可視化の失敗を端的に可視化したこの例は紹介せずにはいられない.

本書を読んだ人におすすめの R パッケージ

R のパッケージは無数にあり, また日々更新されているので全てに言及することは難しい. そこで, 本書で言及されていないが, 本書の趣旨に合うと思われる便利な R パッケージをいくつか紹介してみる. 特定の分野で使う図を ggplot2 で描く系のパッケージは多すぎるので, 比較的汎用性の高いものだけ選んだ (例えば bayesplot とか DiagrammeR とか ggdag とか factoextra とかは便利だが, 特定の用途に特化しているので今回は紹介しない).

データセット処理関係

skimr - データの要約統計量を簡単に得る

ggplot2 自体にもデータを集計する機能がいくつか存在するが, 一般的には入力データの時点で集計をする必要がある. この話は主に本書の5章でも言及されており, dplyr パッケージを使ったデータの加工方法を紹介している. より簡単に全ての変数の要約統計量を得ることもできる. その方法の1つは skimr パッケージ skim() 関数を使うことだ. この関数はデータフレームを受けて要約統計量を出力する. そしてこの出力はデータフレームでもあるので, そのまま ggplot() に与えることができる. また, group_by() してから skim() に与えればグループ別集計もしてくれるため, tidyverse のパイプラインのフローに自然に埋め込むことができる. 日本語で書かれた使用例としては, 少しコードがごちゃごちゃしているが, 私の以前書いた『三國志で学ぶデータ分析』の 3.3 節が参考になるとうれしい.

sf - 新しい地理構造データパッケージ

初リリースは4年ほど前なので, R 界隈ではわりと定着しつつある気がする, 地理情報を扱うためのパッケージ. Science Fiction ではなく Simple Features の略. 本書では7章で地図をグラフにする方法が取り上げられたが, sf は登場しなかった*5. もしあなたが地理空間モデルを扱うとか, 地理データにいろいろ複雑な加工処理をほどこす一環としてグラフにしたいのなら, このパッケージの導入を検討したほうが良い. sf 以前は地理データといえば sp だったが, データフレームを主に扱う R とはかなり相性が悪く, 使いづらかった. sf はより R 上で使いやすい設計になっている. 詳しい話は『RでGISをやるときにはsfパッケージ、という世の中になるらしい。 - Technically, technophobic.』を読めば良い. ggplot2 と併用するミニマルな使用例は私がこの前書いた.

テーマ・スタイルのプリセット系

ggthemes/hrbrthemes

この2つは本書の8章でも少しだけ言及されているが, 私としてはもう少し強調されてもいいように思うので, 追加情報を書いておく*6. どちらも theme_ で始まる関数群を提供しており, ggplot2theme_ 関数と同様にグラフに予め設定されたスタイルを簡単に適用できる. 本書で採用されているのは hrbrthemes パッケージだが, こちらは基本的に欧文のタイポグラフィに適したスタイルをテーマ関数に落とし込んでいる (IBM Plex, Econ Sans, Roboto 等日本語グリフのないオープンソースフォントを前提としている). もちろんフォントを変更すれば日本語も使えるのだが, どうもバランスが悪い気がする (あくまで気分ベース). 一方で ggthemes は, これもまた英語圏を想定して作られたパッケージではあるが, WSJ 誌, Economist 誌といった大手メディアで使われるスタイルや, Excel, Stata, Tableau といった有名ソフトウェアのデフォルトのスタイルなど見慣れたデザインのものが多い. とはいえ私自身, テーマはだいたい theme_clean() のようなシンプルなものしか使わず, どちらかというと scale 系関数のカラーパレットが目当てである. 具体的には scale_color_pander(), scale_color_colorblind() など. これらは名前の通りカラーユニバーサルデザインを意識したものなので, 特に理由がない限りカテゴリカルな色分類はこのどちらかを使っている*7.

ggthemes のテーマのほとんどはここでサンプルを見ることができる.

Introduction to ggthemes

逆に hrbrthemesscale_x_percent(), scale_x_comma() という簡単に軸ラベルのフォーマットを変えられる関数が役に立つかもしれない. 後者は prefix, suffix 引数があるため, 「XX円」のような表記も簡単にできる.

hrbrthemes を活用するなら, たとえば以下のような感じだろうか (図2, あくまで機能紹介なのでグラフとしての完成度は考慮してない).

theme_set(
  theme_ipsum(base_family = "Yu Gothic") + theme(axis.title.y = element_text(angle = 0))
)
ggplot(mtcars, aes(mpg, wt, color = cyl)) + geom_point() +
  thm + scale_y_comma(suffix = "円") + scale_x_percent() +
  labs(y = "金額 (円)")

図 2: hrbrthemes で日本語表示
f:id:ill-identified:20210203221653p:plain

colorblindr/colorspace - カラーユニバーサルデザインかどうかを確認する

カラーユニバーサルデザインというと, colorblindrパッケージも詳しく紹介しなければならない. これも本書では名前のみの言及である*8. これは scale_fill_OkabeIto(), scale_color_OkabeIto() という2つの関数を提供してくれるだけでなく, 色弱者の見え方をシミュレートする機能がある. それは公式に書いてあるように, cvd_grid() または view_cvd() 関数に ggplot2 のグラフオブジェクトを与えるだけで可能となる. さらに cvd_emulator() は画像ファイルに対して同様のことができる (図3, こちらはオンラインでも体験できる). ggthemes_colorblind は1色目が黒であり, 識別性能だけなら良いのだろうが特に塗りつぶしになると黒が強調されすぎてちょっと使いづらい気がするため, こちらのカラーパターンのほうが使いやすいかもしれない. ここ数年更新が停止しているのが気になるが, 一応動作する (ver. 0.1.0; ただし日本語フォントが文字化けする). なお CRAN には登録されていないので Github からインストールする必要がある (詳細な手順は Githubリポジトリ参照).

図 3: cvd_emulator() で画像ファイルを確認した例
f:id:ill-identified:20210203221656p:plain

また, colorspace パッケージは提供するカラーパレット一覧を colorspace::hcl_palettes(plot = T) で表示してくれる. これらは ggplot2 の関数と同様の命名の各種 scale_XXX_YYY_ZZZ(palette = ...) 関数で使用できる.

こちらが用意してくれるカラーパレットは HCL 色モデルに準じたものだが, dichromat と違い, カラーユニバーサルデザインは必ずしも考慮していないことに注意. また, colorblindr に見られるようなシミュレーション機能に近いものもあるが, 機能は限定的である.

mdthemes - R Markdown と ggplot2 を調和させる

mdthems は本当に最近公開されたパッケージ. R markdown と併用するときのユーティリティ的なパッケージ. ラベル等の ggplot2 内のテキストに Markdown 構文を使用できる. 使用法は, md_theme_minimal() などこのパッケージが提供するテーマを追加するだけ. ggthemes, hrbrthemes, tvthemes パッケージが提供するテーマ関数にも対応しており, 関数名はすべて md_theme_ で始まる.

ただし, 内部では HTML に変換しており, <code> が使えなかったりする. まだ出来たてなので今後の機能追加に期待したい.

gridExtra/cowplot/ggpubr/patchwork - 複数のグラフを連結する

基本的にはグラフをごちゃごちゃさせるべきではないが, 複数のグラフを連結するのが必要な場合もまれにある. 本書では gridExtracowplot の名前が言及されているが, よりカジュアルにやりたいなら patchwork も良いだろう. (というかグラフをたくさん連結すること自体少ないので, 私はたまに patchwork を使うだけ. 例えば図1とか.) 私はいろいろな研究領域での論文執筆ルールに詳しくないので, 例えば以下のページの比較を見るとよいのではないだろうか.

ggplot2の図をパネル状に並べる (cowplot, patchwork, egg, ggpubr) - A plant researcher

ユーティリティ系

fontregisterer - 文字化けを気にせず好きな日本語フォントを使う

これは私が作ったやつ. ggplot2 はほとんど無敵のように見えるが, 実のところ (使用者は知っているとおもうが) Windows または MacOS でグラフに好きな日本語フォントを指定しようとすると文字化けする. とくに PDF で保存する際にはほぼ間違いなくうまくいかないが, Healy の本は英語圏の読者を想定しているためか残念なことにこの問題には一切言及がない. 文字化けから解放されるにはフォントファミリを登録するとか, cairo_pdf() を使うとかいろいろな手順が必要だが, それを毎回やると面倒なので面倒さを解消するためにこのパッケージを作った. このパッケージは以下のような機能を提供している.

  • パッケージを読み込むだけでフォントが登録される (デフォルトのPNG形式での表示の文字化け防止)

  • OS の日本語に使用可能標準フォントファミリ名を取得する関数

  • デフォルトのフォント設定を一括設定する関数

ただし, 2021年1月に出た RStudio 1.4 の追加機能の使い方次第では, この面倒な手続きのいくつかはなくともなんとかなるかもしれない (現在調査中, 現時点では『おまえはもうRのグラフの日本語表示に悩まない (各OS対応) - ill-identified diary』に書いた話が最新だと思う).

colourpicker/ggThemeAssist/esquisse - インタラクティブにグラフのデザインを調整する
私は基本的にグラフのカラーパレットは遊ぶために使うものでないと考えているので, 既に書いたようにユニバーサルカラーデザインに準じた既存のカラーパターンを使うようにしている. 色が与える印象は無視できないため, 本書でも自分の思いつきで作ったカラーパターンを使ってしまうことを戒めている. 例えばあなたの勤める企業カラーに沿った色に統一したいという欲望があったとしても, すでに計算されたカラーパレットを修正することは極力やらないほうがいい. しかしときには何らかの理由で細かくカラーパターンを設定したいときもあるだろう. そういうときは colourpicker パッケージをインストールすると, RStudio のアドインとして, グラフの色の設定でどう見た目が変わるかをインタラクティブに確認しながら操作できる GUI が追加される (図4).

図 4: colourpicker パッケージの Plot Colour Helper
f:id:ill-identified:20210203221700p:plain

同様に, ggThemeAssist もテーマを GUI で設定するための RStudio アドインを提供してくれる (図5). 使い方はこの gif を見ればよいだろう*9. ただし, 補足しておくと私はこれらをほぼ使っていない. 一旦

theme_set(
  theme_classic(base_family = "Noto Sans CJK JP") + theme(legend.background = element_blank())
)

などと最初に設定したらそれを使いまわすのが効率的で, このような些末な設定をしないに越したことがないと考えているため. 特に ggThemeAssist で設定できるのは, 背景パネルやグリッド線の色といった theme() で設定できる細かい項目ばかりであり, そういったものは既存のプリセットを使うのがよく, 文字の大きさ調整以外であまり操作しないと思われる (背景を目を引く自己主張の強い色にするのは良くない).

図 5: ggThemeAssist の画面
f:id:ill-identified:20210203221704p:plain

ところで, GUI を提供するパッケージは他にも esquisse というものがあり, 簡単な操作で変数やグラフの種類を選んでグラフを作成する GUI を提供してくれる (図6). プログラミングにまだあまり慣れていない人には良いかもしれないが, 残念ながら esquisse は現時点 (ver. 0.3.1) では列名に日本語 (マルチバイト文字) を含んでいると意図したとおりに動作しないことがある (OS や文字コードなど細かい設定の条件は把握していない).

図 6: esquisse の画面
f:id:ill-identified:20210203221709p:plain

なお, colorspace パッケージにもいくつか GUI ウィザードがあるが, サンプルグラフを使ったシミュレーション機能が主なので, 自作のグラフの調整はできない.

参考文献



Chang, Winston. 2018. R Graphics Cookbook: Practical Recipes for Visualizing Data. Second. Beijing ; Boston: O’Reilly. https://r-graphics.org/. (石井弓美子・河内崇・瀬戸山雅人訳,『R グラフィックスクックブック』, オライリー・ジャパン, 2019 年)


Healy, Kieran. 2018. Data Visualization: A Practical Introduction. Princeton, NJ: Princeton University Press. https://socviz.co/. (瓜生真也・江口哲史・三村喬生訳『データ分析のためのデータ可視化入門』, 講談社, 2021年)


Tufte, Edward R. 2001. The Visual Display of Quantitative Information. Second. Cheshire, Conn: Graphics Press.


Wickham, Hadley. 2009. Ggplot2: Elegant Graphics for Data Analysis. 1st ed. New York, NY: Springer New York. DOI: 10.1007/978-0-387-98141-310.1007/978-0-387-98141-3. (石田基広・石田和枝訳,
『グラフィックスのための R プログラミング』, シュプリンガー丸善出版, 2011 年)


Wickham, Hadley, and Garrett Grolemund. 2016. R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. 1st ed. Sebastopol, CA: O’Reilly. https://r4ds.had.co.nz/. (黒川利明・大橋真也訳,『R で始めるデータサイエンス』, オライリー・ジャパン, 2017 年)


*1:E. Tufte の “The Visual Display of Quantitative Information” の初版は83年刊である.

*2:Tufte の著作を見ればわかるが, 彼のシンプルさの追求は本当にラディカルである.

*3:翻訳者の一人もコード整形ルールに悩んだと述懐している: https://note.com/kilometer/n/n55fb07137da6

*4:原著の時点では未刊行だったが邦訳も2019年に出ている.

*5:ggplot2 が sf を正式にサポートしたのは 2018年6月頃リリースされた 3.0.0 から. 本書の原著は2018年12月刊行だが, Web版のバージョンが4月なのでこの時点で執筆は終わっていたのだろう.

*6:類似パッケージとして tvthemes および xaringanthemer があるが, 前者は色合いなどがだいぶ「遊んでいる」感じであり, 本書の方向性とは異なる. 後者は xaringan パッケージと併用して R Markdown で作成したスライドに載せる画像を前提としている. よってこれらの紹介は省略する.

*7:colorblind および後述する OkabeIto は9種類目以降の色分けが設定されておらず警告を発するが, pander は色を使い回すことに注意. 色弱を抱えていなくともそこまで多い色の分類は難しいので, 8種類という数字をカテゴリー分類の上限の目安とすると良いかもしれない.

*8:ちなみに邦訳は colorblinder とタイポしている(p. 285)

*9:ggThemeAssist は現時点 (ver. 0.1.5) では日本語フォントが表示されないし, GUI 上でフォントファミリを指定することもできない.