【新刊案内】『改訂2版 RユーザのためのRStudio実践入門〜tidyverseによるモダンな分析フローの世界』

本記事について

2018年6月29日に、技術評論社様より、『 RユーザのためのRStudio実践入門〜tidyverseによるモダンな分析フローの世界』第1版を発売させていただきました。

gihyo.jp

 ありがたいことにご好評をいただき、2021年5月11日現在、第1版は4刷まで発売されています。

そして3年の時を経て、2021年6月3日、いよいよ第2版となる、『改訂2版 RユーザのためのRStudio実践入門〜tidyverseによるモダンな分析フローの世界』が販売予定です(予約受付中)。

gihyo.jp

 第1版は、「#宇宙本」の愛称でご案内させていただきましたが、第2版はデザインを一新し、それに伴い愛称も「#宇宙船本」と改めました。宇宙へいざ旅立とうというメッセージがあるとかないとか。

 

第1版と第2版の違い

1. 最新のRStudioや各種パッケージの機能を反映

これまで、第1版を重版する際にも、最新の内容をある程度は反映して加筆修正を行ってきました。しかし、重版ではページ構成を変えられないという制約があったため、原則として脚注でこっそり最新の内容に言及することしかできませんでした。

第2版では、まるっと書き換えても構わないということだったので、各章、多かれ少なかれ、内容が更新されています。

例えば

  • RStudio 1.2から追加された、Jobsペイン(任意のスクリプトを、現在のプロセスの裏で実行できる機能)
  • サポートが終了したパッケージの削除と、代替パッケージの紹介(特に第2章)
  • パッケージのメジャーアップデートに伴う、新たな関数や記法の紹介(特に、第3章のdplyr/tidyrパッケージ)

などです。

 

僕は第4章(ggplot2を用いたデータ可視化)を担当しているのですが、実は第4章の修正点は少ないです。というのも、ggplot2パッケ―ジはちょこちょこバージョンアップしているとはいえ、根本的な部分はほとんど変化がないからです。そのぶん、第1版では紹介しきれなかった関数を新たに盛り込んだり、最近注目されている(そしてすぐにサポートが終了することはなさそうな)パッケージを新たに紹介したりしています。

主要な変更点を上げると、以下です。

position_dodge()とposition_dodge2()の細かい挙動や違いについて、説明を追加

棒グラフや箱ひげ図など、X軸に離散変数をマッピングした可視化を行う際に、position = position_dodge()という引数が明示的/暗黙的に利用されることがあります。

実はggplot2でX軸に離散変数をマッピングするのは色々と面倒なことが多くて、引数を追加して細かな設定を行わなければいけないことがあります。今回の改訂では、position_dodge()や類似したposition_dodge2()という関数の挙動について、説明を追加しました。

複数のグラフを並べて表示するためのパッケージ

第1版でも3つのパッケージを紹介していましたが、近年ではpatchworkパッケージに注目が集まっています。実は第1版の時点でも(発売直後だったかも)patchworkパッケージはリリースされており、個人的には推したいと思っていたのですが、当時はまだCRANに登録されていなかったので、紹介を見送ったという経緯がありました。

現在ではCRANから容易にインストールが可能になったので、初心者にも安心して薦められます。patchworkの優れているところは、ggplotオブジェクトを+などの演算子で繋ぐだけで容易に図を結合できる点と、レイアウトの自由度が高い点です。

日本語の解説記事もWeb上にはいくつか存在するので、ぜひ使ってみてください。

patchwork.data-imaginist.com

説明しなかったこと:地理空間システム(GIS)のデータの可視化

簡単に言えば、ggplot2で地図を描く方法です。近年のアップデートによって、これが容易に実現できるようになりました。

ggplot2の目玉の1つでもあるので、紹介しようか悩んだのですが、別途必要な知識が増えるので、あくまで本書は入門書であることを考慮し、触れないこととしました。

ただし、この機能について詳しく紹介している書籍(以下)を参考文献に追加しましたので、興味がある方はそちらもご参照ください。

www.kspub.co.jp

 

2. 約50ページ、付録を追加

第1版を出版した当初から、「文字列処理には触れていないのかー」という声をいただいていました。そこで第2版では、

  • stringrパッケージによる文字列データの処理
  • lubridateパッケージによる日付・時刻データの処理

について、計50ページ近く内容を追加しました。僕はこのうち、stringrパッケージによる文字列データの処理を担当しました。自己満足かもしれませんが、かなりお気に入りの内容です。

本書の3章や4章では、一貫してmpgデータセットを用いて説明したように、1つの章の中で同じデータセットを使い続けるということは、読者の認知的な負担を減らすうえで重要だと考えています。

そのため、多様な文字列処理用の関数を適用可能な、文字列データを見つけてくる必要がありました。あーでもないこーでもない、と悩んだ結果たどり着いた答えは...ぜひ本書をお手に取って確かめてください!

またこのパートでは、正規表現についても簡単に紹介しています。正規表現は、Rに限らず様々なプログラミング言語で活用できる技術なので、今後R以外の言語の習得も目指している方にとって、有用だと思います。

ただしstringrパッケージ内で正規表現を用いる際には、少しだけ独特の書き方が必要になる場合があるので、注意してください。

 

最後に

第1版を持っているが、第2版も購入しようか迷っている方へ

これについては、他の著者がブログで言及してくださっているので、ご参照ください。notchained.hatenablog.com

 

y-mattu.hatenablog.com

 

僕個人の意見を言うとすれば...第3章のためだけでも、購入するメリットはあると思っています(僕が書いた章ではないんですが)。これは他の章が相対的に価値が低いということではなく、次の理由によります。

最近のバージョンアップによって、3章で紹介しているdplyrパッケージを用いてデータ整形する際の記法が、大きく変わりました。大きくと言っても、全くの別物という意味ではないのですが、across()where()などの関数を駆使した、新たな書き方を覚える必要がでてきました。正直に言えば、僕自身はけっこう難しくなったという印象を持っています。これから初めて学ぶ人にとっても難しいだろうし、すでに昔の書き方が染みついている人が新たに覚えなおすうえでも難しいだろうと思っています。

※もちろん容易に移行できる人はたくさんいると思いますが

また3章では、第1版でほとんど紹介していなかったtidyrパッケージの関数についても、説明が大幅に増えています。

いずれのパッケージに関しても、図を用いながら挙動を丁寧に説明しているので、イメージが沸きやすいと思います。

 

 

「いや、そりゃ著者にとっては買ってほしいでしょうよ」と思われるかもしれませんが、そういう下心がなく上記のように言っているというのは、信じていただくしかありません。

改訂にあたっての、個人的な思い

発売から3年経っても、未だに購入してくださる方がいること、そして第2版を出版できたこと、本当に嬉しく思います。ありがとうございます。

僕以外の著者3名はいずれもR界隈では有名で、よくご存じの方も多いと思いますが、そんな中にcontributorでも勉強会主催者でも何でもない僕が参加させていただけたことは、この上ない幸運だったと思います。

著者がこんなことをいうのはどうかという気もしますが、執筆しながらも学ぶことが多く、僕自身は著者でありながら読者でもありました。第2版の表紙絵は、宇宙から宇宙船に変わりましたが、この宇宙船は、「皆さんを」乗せる船ではなく、僕自身がその乗客の一人であると思っています。

 

本書が「皆さんと」tidyverseを旅するきっかけになれば幸いです。

Enjoy!!

【Tokyo.R #91】Road to ggplot2再入門

ちょっと前のことになりますが、第91回Tokyo.Rで発表してきました。

tokyor.connpass.com

 

今回は初心者セッションが充実した回だったので、ggplot2パッケージを用いた可視化について解説しました。資料は以下です。

 

Enjoy!

【書評】意思決定分析と予測の活用 基礎理論からPython実装まで

本記事について

著者の「Logics of Blue」馬場さんより、2021/02/25発売の「意思決定分析と予測の活用 基礎理論からPython実装まで」をご恵送いただきました。ありがとうございます!

www.kspub.co.jp

 

経営工学オペレーションズ・リサーチが専門の同僚がいるのですが、畑違いのためどういう専門領域なのかわかっておらず、理解したいなと思っていたところでした。本書の内容はまさにこれらの領域や、システム工学決定科学などの領域で活用されるようです(本書p4より)。

初学者として拝読しましたが、非常に面白かったです。本書で取り上げられている例の一つに、「ベネフィットとコストを勘案すると、機械を何台稼働させればいいか」という意思決定問題があります。僕だったら漠然と「うーん、とりあえず、3台くらい動かしてみてから考えよっか」と決めたくなってしまいます。

でも好況不況や、それぞれの機械のランニングコスト、社会的需要などについての情報があれば、ある基準を最適化するような予測が導ける、ということが本書で解説されています。

 

考えてみればそりゃあそうで、僕自身の日常生活では意思決定のミスが起こっても、そこで生まれる金銭的損失はそんなに大きくありません。うっかり終電を逃してしまって、仕方ないからタクシー使うか、てへへ、くらいのもんです。

でも金融とか経営とか、動くお金が膨大になるような場面では、ほんの小さな選択肢の違いが、とんでもない利得/損失の違いに帰結することもありえますよね。そういった場面では感覚的に意思決定するわけにはいかないので、手元にある情報から計算して、ある基準を最適化する予測を導く必要があるということだと理解しました。

 

【追記】

「予測を導く」っていうのは、本書の内容を表す正確な表現じゃなかったかもしれません。色んな予測結果が得られているうえで、予測結果をどう活用するか、ということが本書の焦点のようです。

 

以下、簡単な書評です。

 

本書の特長

1. 簡単な事例で、豊富な理論を紹介

本書で解説されている内容は、基本的に「利得行列」と呼ばれる情報の一覧を手掛かりにしています。現実的な意思決定では、この利得行列が複雑になったり、状況を想像することが難しい場合もあるのだと思いますが、本書では非常にシンプルな事例を用いているため、本質的な部分が分かりやすいと思います。

本当に多くの理論や数式が紹介されるので、「この添え字jって何だっけ...」など混乱することもあると思いますが、事例がシンプルなのですぐに立ち戻って思い出すことができます。

 

対して、数式や理論は多く紹介され、かなり濃密な内容だという印象を受けました。例えば第2部のエントロピーの話などは難しい内容だと思います。この辺の内容は、(馬場さんの本ではありませんが)以下の書籍なども参考にするといいかもしれません。

www.asakura.co.jp

 

 

第3部になると、さらに数式の難易度が上がります。数式だけを見ると、「ウッ...」と気後れしてしまう人もいるかもしれませんが、ちゃんと地の文を読むと、丁寧な解説が行われています。「この数式のこの部分、どういう意味なんだ...」と思ったらその近くには「これは~~という意味です」と解説がついています。数式パートは紙と鉛筆を用意して理解し、後述するプログラミングパートではPCで実装する、という学び分けが良いのではないでしょうか。

 

馬場さんは、他の書籍でもそうですし、実際に講演を拝聴したこともあるのですが、本当に読者/聴衆を置いてきぼりにすることがありません。躓きそうな石があったらちゃんと除いてくれる、そんな気遣いを感じます。

 

2. Pythonコード

馬場さんの本といえば、事例、数式、そしてプログラミングコードの3点セットでお馴染みです。恐らく本書で紹介されている全ての計算において、Pythonコードが掲載されていると思います。実際に手を動かしながら学べるので、自分が今何をやっているのか、理解しやすいと思います。

多くのライブラリを使いこなして計算するのではなく、numpyとpandasを組み合わせて、時には関数を自作して、数式を実装していく感じです。馬場さんの著書「Pythonで学ぶあたらしい統計学の教科書」の進め方に近いですね。

www.shoeisha.co.jp

 

注意が必要なのは、本書はPythonそのものの解説書ではないということです。初めてPythonを使う人を想定して、関数の定義方法や、numpyのndarray、pandasのDataFrameなどの簡単な説明はありますが、必要最低限にとどめられています。

また、本書はコードをJupyter Notebook上で実行することを想定していますが、Jupyter Notebook自体の説明はありません。

ただし、これらは説明が不十分と捉えるべきではないと思います。本書があくまで伝えたいのは理論の部分であり、それらを丁寧に解説した結果すでに400ページ近くの分量になっています。ここでPython自体の説明も紙面を割いてしまうと、本当に伝えたいところを削らざるを得ないという判断だと思います。

サポートページはしっかりと用意され、そのURLは本書内に記載されていますし、有益な参考図書も多く紹介されているので、全く心配はいりません。

logics-of-blue.com

 

Python自体を初めて触る人は、適宜、他の参考図書なども併用しながら読むと良いと思います。

 

まとめ

僕自身、この書籍がターゲットとする内容が専門ではないので、踏み込んだ書評ができませんでしたが、初学者目線では非常に勉強になりました。第4部では、選好や効用関数など、経済学でお馴染みの内容が紹介されるので、経済学に関心がある人は、この辺りの内容も役に立つかもしれません。

 

僕自身、これから何度もこの書籍を読み返し、勉強していきたいと思います。

Enjoy!

【書評】データ分析のためのデータ可視化入門

本記事について

訳者の方々から、2021/01/26発売の、「実践Data Scienceシリーズ データ分析のためのデータ可視化入門」をご恵送いただきました。ありがとうございます!

www.kspub.co.jp

 

本書は、「Data Visualization A practical introduction」の邦訳です。

socviz.co

 

原著は過去に私費で購入していたのですが(写真左)、自分で読むのも人に貸すのも、和書のほうが圧倒的に楽なので、たいへん嬉しいです。

f:id:das_Kino:20210126094606p:plain


以下、書評です。

 

本書の特徴

1. 「可視化という作業」自体の解説

タイトルからも分かるように、本書はRのggplot2パッケージを用いた可視化の入門書です。この手のソースは、事例集やハンズオン形式のコード紹介に注力したものが多いですが、本書ではまず最初に、なんと40ページ近くも費やして、「可視化って奥が深いんだぞ!」ということを熱弁しています。

 

可視化は統計的解析とセットで用いられることが多いと思いますが、可視化を怠ると、統計的解析において深刻な問題が発生しえます。有名なのは、「記述統計量(例:平均、分散)が同じだが、データの分布がまるで異なることがある」という事例ですね。

journals.plos.org

本書でも「アンスコムの四重奏」という事例から始まり、様々な観点で可視化の重要性を訴えています。

 

個人的に面白いと思ったのは、「ポップアウト」や「ゲシュタルト」など、知覚・認知心理学的な観点でも説明している点です。情報の取捨選択に係る能力を注意(attention)と呼びますが、「頑張って注意を払わないと情報が取得できないグラフ」もあれば、「注意をさほど払わなくても情報を選択できるグラフ」もあります。ヒトのことを理解したうえで、ヒトが効率的に情報を獲得できるように工夫しよう、というメッセージが込められていて、第1章はとても読みごたえがあります。

 

2. 丁寧な事例解説

ggplot2は、ひとたびクセを掴むと、かなりスラスラ書けます。それは可視化の文法(Grammar of Graphics)に基づいて設計されているからです。しかし、細かい調整をしようとすると、めったに使わない関数や記法が必要となり、とたんに難しくなります。

 

本書では、基本的なggplot2の使い方を丁寧に解説しているだけでなく、けっこうマイナーな書き方まで紹介しています。マイナーというのは、「そんなんいつ使うねん」という意味ではなく、「ちゃんと説明しようとすると難しいから、多くの書籍では恐らく回避されていたところ」という意味です。

 

原著の「A practical introduction」という副題の通り、実践的な用途において必要となる、痒いところに手の届く書き方まで詳しく解説されています。例えば第6章では「予測の図示」という方法が紹介されています。散布図に対して近似直線を引くだけなら簡単なのですが、予測というのは直線的関係だけに限りませんし、実用的には推定結果も点推定だけでなく区間推定まで行いたいものです。そういったところまでちゃんと解説されているのが嬉しいです。

 

3. 地理データの描画 

これは訳者の一人、瓜生さんが何より得意とされている内容だと思います。ggplot2では、地理データの描画が可能です。例えば日本地図を、人口密度に応じて都道府県ごとに色を塗り分ける、などが可能です。最新のバージョンでは、geom_sf()という関数が存在し、地理空間システム(GIS)データを扱いやすくなっています。

uribo.hatenablog.com

 

恐らく原著が出たタイミングでは、まだgeom_sf()が実装されていなかったのだと思うので、本書では既存のgeom_polygon()を用いて地理データが描画されています。しかし地理データの色を塗り分けたり、地理的な空間配置を考慮したグラフを描いたりする際に、本書の内容は最新のggplot2でも活用できると思います。

 

個人的には、地理データの描画はすごく苦手だったので、こうして体系的な解説が日本語で読めるというのは、非常にありがたいです。

 

4. 訳者の技量

僕は(もう閉会しましたが)Hijiyama.Rなど、西日本で勉強会に参加することが多く、Tokyo.Rなど東日本の勉強会に参加したことがありません。そのため実は、本書の訳者のお三方とは、直接の面識はないのですが、皆さん様々な解説記事・資料をインターネット上に公開されているので、日頃から「なんてすごい人たちなんだ」と思っていました。

 

そんな方々が翻訳されているので、日本語としての自然さや、訳語の適切さについては、言うまでもなく優れていると思いました。ただ何より僕が感動したのは、「翻訳者の判断で、原著とは違うコードを使用したこと」です。

 

tidyverseパッケージ群は、開発が盛んであるがゆえに、関数がコロコロ変わりがちです。335ページの脚注を見ると、「原著では(dplyrパッケージの)sample_n()関数を使用していたが、dplyrバージョン1.0.0から追加されたslice_sample()関数に書き換えた」とあります。最新の仕様をフォローしているからこそ出来ることですよね。

 

まとめ

上記のように、本書は単なる「ggplot2の解説書」ではなく、「ggplot2を用いた、可視化の解説書」になっています。識者の方々が翻訳を担当されたことにより、最新の仕様も考慮した訳書になっています。

 

本書はかなり詳しく書かれているぶん、上記のように深いところまで説明しているので、もしかしたら「うわああ、覚えることが多い~~」と焦ってしまう人もいるかもしれません。まず本書の第1章を読んで可視化の重要性について理解を深めたのち、いったん別の情報源でggplot2を簡単に学び、そのあとで本書に戻ってくるのでもよいかなと思いました。

Hadley Wickham著の「R for Data Science」はお勧めです。

r4ds.had.co.nz

 

あと、書評に拙著を紛れ込ませるのは下品だと思うのですが(本当にごめんなさい)、「RユーザのためのRStudio[実践]入門」も入門書としてお勧めです。現在、内容の刷新+内容の大幅追加を行った第2版の改訂作業を行っている最中ですので、遠からずご案内できると思います!

gihyo.jp

 

すいません、最後に宣伝をしてしまいましたが、「実践Data Scienceシリーズ データ分析のためのデータ可視化入門」は本当にお勧めです。皆さんも是非! Enjoy!

【書評】「Rで学ぶ統計的データ解析」

本記事について

講談社サイエンティフィク様より、データサイエンス入門シリーズ「Rで学ぶ統計的データ解析」を教科書見本としてご恵送いただきました。

www.kspub.co.jp

 

実はデータサイエンス入門シリーズはほぼ全巻購入していて、大好きなシリーズです。

www.kspub.co.jp

 

書評というと偉そうですが、この本も本当に良い本だなと思ったので、簡単に感想を書きたいと思います。

(フルカラーで3000円って破格ですよね...)

 

本書の特徴

1. 最小限のR環境

最近はもう、RはRStudio上で実行するのが標準的だと思いますし、tidyverseパッケージ群(例えばデータフレーム操作はdplyr、可視化はggplot2)を活用することが増えてきたと思います。

個人的にはRStudio+tidyverseパッケージ群が好きですが、導入はそれなりに面倒くさいとも思います。RStudioは多機能が故にどこを見ればいいか最初は分かりづらいし、tidyverseパッケージ群はインストールに失敗することもあります。あと開発が盛んなので、関数が増えたり減ったり変わったりもしますし。

 

一方本書では、RStudioは使わず素R環境で説明が行われていますし、特別なパッケージのインストールもほとんど求めていません。実はRは、デフォルトでもかなり多くの計算用関数・可視化用関数があるんですよね。第1章・第2章で、baseのRだけで出来ることを、かなり詳しく紹介してくださっています。apply()ファミリーなど、ちょっと癖があるけど使いこなしたら便利な関数もちゃんと説明されているのが嬉しいです。

特に第2章の「データの可視化と要約」のところは、かなり勉強になりました。僕はRを本格的に使い始めた直後からggplot2を勉強したので、実はbaseのRで可視化する方法をほとんど理解していなかったんですが、「こんなに色んなことできたんだ...」と驚きました。

もちろんパッケージを全く利用していないという意味ではなくて、例えばクラスター分析でclustrdパッケージを使うなど、要所要所で必要なパッケージの紹介もなされています。

 

2. 明確な道筋

データ分析の教科書には、色々な分析方法が紹介されていますが、初学者のうちはそれぞれの分析がどのような関係にあるのかを理解するのは容易ではないと思います。例えば「回帰分析」と「分散分析」は多くの教科書に載っていると思いますが、実際には互いに密接な関係があるにもかかわらず、これらの関係はあまり明確に言及されていないことも多いと思います。

一方本書では、

  • 第3章:回帰分析
  • 第4章:回帰分析(特に、正則化法を用いたリッジ回帰など発展的方法)
  • 第5章:判別分析(被説明変数が質的変数の場合における回帰分析のようなもの)
  • 第6章:ロジスティック回帰モデル(判別分析と関係した分析)
  • 第7章:決定木に基づく判別モデル(判別分析やロジスティック回帰モデルとは違う強みがあることを紹介)
  • 第8章:主成分分析(判別分析と似ているところはあるが、情報の圧縮という、別の目的のため)
  • 第9章:クラスター分析(判別分析などと同様、分類が可能だが、教師あり/なしという違いがある)

という流れで、明確に筋の通った話が一貫して続いています。各章で全然違う分析を紹介しているという印象は全くなく、分析同士がどのような関係にあるのかが非常に明確に説明されていると思います。

 

また第10章以降は、ブートストラップ法やシミュレーションの実演が行われており、「こういう魔法みたいな手法/法則があるんだよ」ではなく、その挙動を実際に確かめられるようになっています。

 

3. 「まずは実行しよう、数理はそれからだ」という帯

帯に書いてあるコメントです。これだけ読むと、Rのマニュアルに特化した本なのかと思ってしまうかもしれませんが、全くそんなことはありません。プログラミング一辺倒でもなく、数式一辺倒でもなく、バランスよく両者が併記されていると思います。

バランスよくと書きましたが、これは分量の話です。

僕自身は数式をざっと眺めて「ふんふんなるほどね」と理解できるタイプの人間ではないので、これから1ページずつガシガシ鉛筆で書き込みしながら、丁寧に読んでいこうと思います。例えば110ページを開いてみると、文字の半分くらいが「X」なんですが、もしかしたら僕以外にも、これをみて「ウッ...」と感じてしまう人はいるかもしれません。

でも恐らく、本書ただ一冊を読んで完結するようなことは想定されていなくて、「データサイエンス入門シリーズ」の他の本も併せて読んで勉強することが想定されているのだと思います。それらも含めて丁寧に読み進めていけば、きっと怖くないと思うので、頑張って読んでいきたいと思います。

 

まとめ

決して阿っているわけではなくて、本当にいい教科書だなと思いました。時間をかけて、Rによるプログラミングと数理の勉強を並行していくタイプの書籍だと思いますので、ゼミなどで教科書として利用することが特に相性が良いかもしれません。

最後に...これは完全に個人的な話ですが、本書の査読者(原稿をチェックされた方々?)のお名前を眺めていたら、学部の同期がいました。何よりそれが一番の励みになりました。

複数の.csvファイル(じゃなくてもいいけど)を一気に結合する

本記事について

Online Psychological Experiment Advent Calendar 2020 第17日目の記事です。

最初は気軽にポエムでも書こうかと思っていたものの、他の記事がどれも真面目だったので、「だから、オレだってなんかしなくっちゃあな…カッコ悪くて2021年に行けねーぜ…」ということで急きょtipsを書くことにしました。

オンライン実験のデータがどのように保存されるか

もちろん、どんな実験をするかや、どのサービスを利用するかによって、話は変わります。しかし一般的には、「協力してくださった実験参加者の数だけ、ファイルが蓄積される」と思います。オフラインの(実験室で行うような)実験ならなおさらですね。

例えば僕自身は、こちらの記事を参考にして、lab.jsで作成した.jsonファイルを、Open Labにアップロードし、単語記憶課題のオンライン実験を行いました。その結果、実験参加者の数だけ個別の.csvファイルがサーバ上に蓄積されました。

複数の.csvファイル(じゃなくてもいいけど)を一気に結合したい

もちろん.csvファイルに限らず、全てのファイルが.xlsxでも良いのですが、ともかく拡張子が同じ複数のファイルを、1つのファイルに結合しなければ、前処理も分析もできないわけです。

実験参加者数が少なければ(例えば10人など)、1つのファイルを開いてデータをコピーして、別のファイルにペーストするのを繰り返す...という手作業でも、さほど手間にはならないでしょう(※言うまでもなく、これはヒューマンエラーが混入する恐れがあるので、避けるべきですが)。

しかしオンライン実験となると、一般的にサンプルサイズが大きくなりやすいと思うので、手作業は労力の観点から現実的ではありません(※くどいようですが、労力以外の観点からも、データをコピペでまとめるのは避けるべきです)。

purrrパッケージを使おう

R環境限定の話になりますが、purrrパッケージを用いれば、同じディレクトリ内に存在する、拡張子が同じ全てのファイルを、1つのデータフレームに結合することが、容易にできます。

その方法は...これだっ!(他の方が作成された資料を共有していくツェペリ魂)

上の画像のコードは、tidyverseパッケージをロードする前提で書かれているので、最低限必要なpurrrパッケージとreadrパッケージだけをロードした場合には、以下の書き方になります。
tidyverseパッケージをロードしたら、これら2つのパッケージも自動的にロードされますが)

library(purrr)
library(readr)


target_files = list.files("data/",
                          pattern = ".csv$",
                          full.names = TRUE)

dat = purrr::map_df(target_files, readr::read_csv)

まず、 特定のディレクトリ内に存在する、拡張子が.csvのファイル名を全て、target_filesという名前のリストにまとめています。この場合は、現在の作業ディレクトリの中に、「data」という名前のフォルダがあり、その中に全ファイルが存在する想定です。

次に、 readr::read_csv()関数で個々の.csvファイルを読み込むたび、purrr::map_df()で1つのデータフレームとして結合していきます。結合されたデータフレームは、datという名前のオブジェクトに格納されます。

自分用にカスタマイズも可能

データによっては、

  • ファイルを読み込む際に、空欄のセルをNAにしたい
  • ファイル名も、データフレーム内の変数として保存したい

などの、細かいカスタムが必要となることもあるでしょう。そのような場合には、データを読み込む関数(上のコードではreadr::read_csv())をカスタムした自作関数を定義すればよいです。

ここで新たにdplyrパッケージをロードしているので、パイプ演算子%>%を使用しています(それだったらtidyverseパッケージを1つロードすればよい気もしなくもない)。

library(purrr)
library(readr)
library(dplyr)

# 自作関数
read_func = function(x){readr::read_csv(file = x, na = "") %>%
    dplyr::mutate(filename = x)}


target_files = list.files("data/",
                          pattern = ".csv$",
                          full.names = TRUE)

dat = purrr::map_df(target_files, read_func)

このコードでは、read_func()という関数を自作しています。
まずreadr::read_csv()でファイルを読み込む際に、空白のセルをNAにするよう、引数を指定しています。さらに、1つのファイルをそのようにして読み込んだあとで、dplyr::mutate()によって、ファイル名をfilenameという名前の列に追記しています。
あとはpurrr::map_df()のなかで、自作した関数read_func()を使用することを明記するだけです。

おわり

全てのデータが、1つのデータフレームにまとめられれば、第15日目の記事のように前処理を行うことも、分析することもできます。

Enjoy !!

Google Colaboratory + PyStanを使ってみた話

この記事について

Stan Advent Calendar 2020 第14日目の記事です。
14日目のカレンダーが空いていたので、何か埋めなきゃということで、「そういえば使ったことないから、Python環境でStanを使ってみよう」という思い付きで書いています。

普段はR環境でStanを使っているので、全てが手探りです。そんなわけで、この記事は自分のための備忘録です。世の中にはもっと体系的にまとまった記事がたくさんあるので、ぜひそれらを参考にしてください。

今回はGoogle Colaboratory上で、PyStanを用いることにします。なお今回はGoogle Driveのマウントはしませんが、Google ColaboratoryをGoogle Driveと連携させることで、より使いやすくなると思います。

実演

.stanファイルを用意する

これはRやPythonとは関係のない作業なので*1、好きなエディタを用いて書きます。ここでは説明変数が1つの、単回帰モデルを例とします。


y_i=\beta_0+\beta_1x_i+\varepsilon_i \qquad i = 1, 2, ..., n \\
\varepsilon_i \sim {\rm Normal}(0, \sigma)

 n個のデータがあり、目的変数 yを、説明変数 x_1で予測しています。 \beta_0が切片、 \beta_1が回帰係数、 \varepsilonが残差です。
これは以下の確率モデルと同義です。


y_i \sim {\rm Normal}(\beta_0+\beta_1x_i, \sigma) \qquad i = 1, 2, ..., n \\

つまり、

目的変数 y_iは、正規分布に従う。その平均は \beta_0+\beta_1x_iで、標準偏差 \sigmaである

というモデルを立てたことになります。以下のStanコードを、regression.stanという名前で保存しておきます。

data {
  int<lower=0> n_data;   //サンプルサイズ
  real y[n_data];        //目的変数
  vector[n_data]  x;     //説明変数
}

parameters {
  real beta_0;           //切片
  real beta_1;           //回帰係数
  real<lower=0> sigma;   //標準偏差
}

model {
  y ~ normal(beta_0 + beta_1*x, sigma);
}

Google Colaboratory上に.stanファイルをアップロードする

自分のPCにPython環境がなくても、インターネットブラウザ上でPythonコードが実行できる、Google Colaboratoryを使用します。ここにアクセスして、[ファイル → ノートブックを新規作成]します。

f:id:das_Kino:20201211103021p:plain

ローカルの.stanファイルは、以下の手順で容易にアップロードできます。 f:id:das_Kino:20201211103808p:plain

「注: アップロードしたファイルはランタイムのリサイクル時に削除されます。」というメッセージが現れると思いますが、これはGoogle Colaboratoryを使う以上仕方のないことです。

アップロードされた場所は、対象のファイル名にカーソルを合わせて、右端の「・・・」をクリックすると現れるメニューのうち、「パスをコピー」を選択するとクリップボードに格納されるので、知ることができます。実際にやってみると、/content/regression.stanであることが分かります。

f:id:das_Kino:20201211104119p:plain

ライブラリの読み込み

最低限、これらのライブラリを読み込めば良いと思います。PyStanのサンプリング結果を、トレースプロットやチェインごとの事後分布といった形で可視化するためには、arvizというライブラリが適しているようですが、Google Colaboratoryではまず!pip install arvizでインストールする必要があります。

import numpy as np #サンプルデータを作成する際に、randomモジュールで乱数生成するため
import pystan #stanのPython用インタフェース

# 可視化用ライブラリ ----------------------
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns

# PyStanのサンプリング結果の可視化用ライブラリ ------------------
!pip install arviz # arvizというライブラリをまずインストールする
import arviz

サンプルデータの作成

単回帰モデルを真のモデルとして、パラメータの真値を指定してサンプルデータを作成します。

n = 50 #サンプルサイズ

np.random.seed(seed = 1234) #乱数のシード
x = np.random.randint(low = 1, high = 30, size = n) #説明変数。1~29の一様乱数(整数)をn個生成
y = np.random.normal(loc = 20 + 1.5 * x,
                     scale = 3.0,
                     size = n) #目的変数。正規分布に従い、その平均は20 + 1.5x。標準偏差は3.0

可視化してみます。

# サンプルデータの可視化
sns.jointplot(x = x, y = y) 

f:id:das_Kino:20201211110044p:plain

.stanファイルのコンパイルとサンプリング

まずはアップロード済みの.stanファイルをコンパイルします。

sm = pystan.StanModel(file = '/content/regression.stan')

次に、サンプリングです。Rだと、rstan::sampling()関数の中で、object = smコンパイルしたオブジェクトを指定しますが、Pythonだとちょっと書き方が違うことに注意です。

また、Rでは、rstan::sampling()関数の中で、list型でデータを渡しますが、PyStanでは辞書型でデータを渡す必要があるところも違いますね。辞書型のデータはdict()などで作成できます。

その他の引数はRStanでもPyStanでもほとんど同じですね。

fit = sm.sampling(
    data = dict(
        n_data = n,
        y = y,
        x = x
        ),
    seed = 1234,
    iter = 2000,
    warmup = 1000,
    chains = 4)

収束診断とサンプリング結果の出力

まずはうまく収束したかどうか、視覚的に確認してみましょう。ここではarvizライブラリのplot_trace()を用いて、トレースプロットやチェインごとの事後分布を可視化します。

arviz.plot_trace(fit)

f:id:das_Kino:20201211111419p:plain

収束していると考えてよさそうです。
要約統計量は以下の通りです。うまくパラメータリカバリできていますね。

print(fit)

f:id:das_Kino:20201211111202p:plain

おわり

PyStan、初めて使ってみたんですが、Google Colaboratoryを併用することで、環境構築の手間もほとんどいらず、手軽に利用することが出来ました。

Enjoy !!

*1:もっとも、RStudioの文法チェック機能が優れているので、慣れないうちはRStudio上で書くのが良いような気はします