はじめに

早いもので12月も折り返しにさしかかり、 R Advent Calendar 2019も14日目になりました。 この記事では、文系の大学院へ進む人(あるいは進んだ人)を対象に 「どのように我々はRと向き合えるか」という話をまとめてみました1。 ここで想定している読者は 1. 統計やプログラミングに悩める文系の院生2. 進学を検討している学生 です。

この投稿の目的は 「プログラミング学習が文系院生のキャリアに与える長所と短所を挙げ、 それでも学びたい人には道筋を示す」というのものです。 この目的を達成するためのマイルストーンの1つは プログラミングと統計、研究の関係を考えられるようになることです。 それに加えて、 皆さんの学習計画が少しでも見通し良くなれば、 と考えています。 それはそうとしてなんで博士も取ってない院生がそんなものを残す必要があるのでしょうか。

理由の1つは、今ならまだ 「大学院に入りたての頃、自分は何が分からなかったのか」が分かる状態だからです。 というのもスキルや知識の熟達に伴い、 いわゆる「専門家の盲点」という現象が発生します。 これは「(特定の概念を)自分が理解できる理由も、 他の人が理解できない理由も分からない」という状態です。 僕はまだ「自分が何に困っていたか」を自覚出来ているので、 備忘録ついでに残しておきます。

もう1つは単純に、プログラミングを正規の課程で学んだ文系院生が少なく2、 情報が不足しているからです。 もちろん「文系 プログラミング」とかでググれば情報は出てくるのですが、 大抵は「就職に有利だよ!」とか「視野が広がるよ!」 といった情報でスクールを斡旋するアフィブログですし、 そもそも研究者を志す文系の院生には無縁な情報です3。 こと文系院生にとって必要なのは 1.研究と結びつく2.ボスも自分も説得できる 情報だと思います。 (もちろん、食い扶持を確保するのも視野を広げるのも大切なのですが…)

ちなみに言語学という分野を専門にしている場合、 言語学者が学ぶべきプログラミング言語 という記事が既にあったりします。 他の分野でも同様にプログラミングと結びつける人はいると思うので探すと良いかもしれません。 僕はプログラミング推進派 (というか、一度はみんな触ってみて良いんじゃない?くらいのポジション)なので、 他者の意見の扱いに慣れていない学部生の方は 「にゃ、プログラミングなんていらん!」という意見も適度に取り入れてバランス取って欲しいな、 と思っています。

文系院生がプログラミングと向き合うメリット

プログラミングと統計、研究…と聞いた時、 統計と研究の関係は自明な気もします。 でもプログラミングはどうなんでしょうか。 個人的な話として、 プログラミングは少なくとも統計の勉強に役立ちます。 加えて、人によっては研究する上でも役立つ印象です。 それぞれ、もう少し具体的に見ていきましょう。 興味のない方は次の節に進みましょう。

統計の勉強に役立つ

そもそも論ですが、文系でも院に入れば統計を学ぶことになります4。 少なくとも我が母校の法政や現在の駒場、 留学していた頃の専門科目でも統計は仮説検証という文脈で必須でした。 したがって、統計と研究のパスは保証されています。 そして、統計を学ぶ際には必ずと言っていいほど プログラミング言語のRが使われていました。 この点から、プログラミングは「統計の勉強」というノードを介して、 研究とも繋がるのです。

ただ難しい点があるとすれば、 統計という新しいジャンルを勉強する際に 「プログラミング言語を勉強する」という新しいイベントが発生するのです。

留学時に履修してた専門科目のコースにRを使った統計の授業がありました。 確かANOVAだったと思うのですが、 正直「(やばい分からん…。英語がダメだから分からんのか 数学がダメだから分からんのかすら分からん…)」 という状態でした5。 つまり、学習の過程で新たな学習対象を発生させることは 「自分が分かっていないこと」の切り分けを困難にしうる悪手です。

もちろん、プログラミングの学習というイベントを発生させず、 ペンと紙だけでt検定やANOVAを勉強するのも良いのです。 研究室がその状態なら仕方ありません。 しかしながら、glm()lmer() を使う研究室だとペンと紙だけでは無理です。 なので「ンン? glm()? t検定みたいにピーチを出すやつでしょ???」という認識に留めて乗り切るか、 諦めて勉強しましょう。その学習を助けるのがこの記事の目的ですが、 そういう方のために最近(2021年3月)、 A Tutorial on LME and VWP というサイトを作りましたのでそちらもご参照ください。

ここまでは、せいぜい「プログラミングを学習すると統計の入口で躓かないよ」 という話なのですが、実は学習の道中でも非常に心強い存在です。 というのも単に glm() を使えるレベルの理解にとどまらず、 損失関数を定義して optim() でパラメタ推定できるというレベル、 パラメタ推定の処理も自分で書けるレベルといった… 要は「作れるレベルの理解」の段階までサポートしてくれるからです。

具体的に何をどう勉強すれば良いのか、というマイルストーンは最後にまとめるとして、 「研究の幅を広げられる」というメリットを次に述べたいと思います。 もし研究との関連に興味のない方は次の節に進みましょう。 次の話はどちらかというと、ボスと自分を納得させる材料です。 (納得するとは言ってない)

研究にも(稀に)役立つ

研究においても、プログラミングと統計の理解は様々な役割を持ちます。 というのも、実験デザインを決める段階でも実験刺激を作る段階でも、 分析する段階でも役立ちますし、 実験の再現性を保証したい場合も必要になります。 さらに、計算機をテコにした研究領域の拡大もあります。 それぞれを具体的に見てみましょう。

まず、統計を用いて実行できる分析が頭に入っていれば、 そこから逆算して組むべき実験デザインや調査の手法も分かります。 こういう着地点が見えている実験、調査で得られるデータは解釈しやすいです。 逆にわからずに複雑な実験を組むと結果の解釈時に地獄をみるはずです6。 またプログラミングを通じてより深い統計の理解が実現できていれば、 データを解釈する際にきっと役立ちます。

また、プログラミングだけでなく環境の話にもなりますが、 研究の再現性を保証できる点も嬉しいです。 実験で使う刺激を手動で作成すると「誰が作ったか」に依存する危険がありますし、 分析の過程でも適度な粒度で関数にしないと実行する場所によって変数に格納された値が異なる、 という地獄が始まります。 前処理の困難を分割できるのも嬉しいです。

最後になりますが、プログラミングを学んだことが研究の幅を広げてくれた気が最近はします。 自分が専攻する分野名に「計算」をつけて形式化した分野があり、 僕はその分野と従来の分野の中間を最近は狙っています。 そこの話についていくにはプログラミングや統計の知識が不可欠です。 研究分野が計算機の進歩に追従することは多くの分野でありますが、 そのブームに乗る時に役立つかもしれません7

以上のように、プログラミングは統計の勉強に役立つのに加えて、 研究する上でも役立つ…というのがしばらく手を動かしてみた感想です。 正直、周りにこういうのが分かる人が少なく今もまだ手探りな状態なので、 ここらへんは過大/小評価してしまっているかもしれません。

おまけ: デメリット

さて、ここまでプログラミング学習を全押ししたわけですが、 残念ながら日本の文系コースにおいて プログラミングは一部の教員、 あるいは院生が勉強会なんかで共有しているに過ぎません。 ぶっちゃけ「そんなん勉強してなんの意味があるの? 論文読んだほうが良いよ」 という雰囲気すらありました。

ただ僕の場合は作ってみないと理解できない脳みそなので、 やっぱり言語を理解する仕組みも作りたい、という希望が有ります。 また作るだけじゃなくて、それを理論、仮説として解釈したくて、 そのためにはコーディングのスキルが必要でしたし、 そういうのを活かした研究を量産していく心づもりです。

もともと構成論的な理解の仕方が好きだったのと、 博士1年という「よーし勉強は一区切りついたし、 これからは研究がんばるぞ!」という時期に 面白い講義8を取ってしまって 諦めがつかなくなってしまったのも原因かなぁとか思ってます。 ただ、そういう構成論的な理解を目標としなければ、 必要最低限を効率よくやればいいだけなのです。

問題は「どこまでが適度か」という点が独学だとつかめない点だと思います。 文系の院生はプログラミングの学習に対し、 どんなアプローチが取れるのでしょうか。 次に本題、我々にとってのプログラミング学習のゴールとは何か、 また何を学ぶのか、という話に進みます。

学習のゴールとマイルストーン

ゴールを決めよう

プログラミングを学習するかどうかを決める前に (あるいは既に学習を始めていたとしても)、 統計と向き合う姿勢を決めると良いかと思います。 めちゃくちゃザックリとしてて殴られそうですが、 だいたいこんな感じじゃないかなぁと思います。

  1. 統計はt検定やANOVAで乗り切る(コスパ最強)
  2. GLMとか使うけどt検定みたいなもんだと割り切る (⌒,_ゝ⌒)
  3. GLMとかの理屈は理解したいけど実装は遠慮しとく
  4. 手を動かしながらGLMを理解したい
  5. 自分で最尤推定でモデルのパラメタを推定できるレベルまで到達したい
  6. GLMだけじゃなく、ベイズにも興味がでてきた
  7. 統計(モデリング)だけじゃなくて機械学習にも興味が出てきた
  8. データを使うキャリアパスに興味が出てきた

ここでゴールを決めたら、次はマイルストーンを立てましょう。

マイルストーンを設定しよう

マイルストーンの設定は単純で、まず学習の対象を決めます。 これが意味する作業は、自分に何が必要なのか、何が要らないのかをリストにまとめることです。

例えば、もしゴールが1や2、3の場合、プログラミングは不要です。 必要なのは統計的仮説検証の理論、そしてRという名の電卓です。 ただ、再現性を保証する目的で環境(RStudio)を勉強するのは推奨します。 それだけでなく、文字のエンコーディングやOSについても知っておくと良いかもしれません。 学部生でも夏の間、あるいは院に進む前に終わる範囲かと思います。 t検定をRで、というのは学部の夏合宿でやりました。

ただ、もしゴールが3の場合は学習対象がぐっと増えるのは確実です。 というのも1や2のプロセスに加えて数学の復習が挟まります。 具体的には数A(順列・組合せ、条件付き確率など)、 数II(関数と合成関数、微積分など)と確率(ベイズの定理、各種確率分布)程度が必要です。 一通り終わった後の書籍としては緑本が適切です。 期間はコミコミで半年くらいかかると思います。 (あくまでも目安です。これを1週間でやるのはしんどいよ、位の話です)

くどいですが、ちょうど2と3の中間くらいの目標の人のために A Tutorial on LME and VWP というサイトを作りましたのでそちらもご参照ください。

問題は4と5, 6の人です。 この人たちは上述した数学の基礎やGLMだけでなく、プログラミングもガッツリ勉強しないとダメです。 ただ、順番が変わります。 まず開発環境とプログラミングの学習から始めましょう。 そして上の範囲に加えて線形代数も、Rでしっかりと手を動かして学習しましょう。 5の人は緑本の6章を optim() で書き直せるようになるのをゴールに、 6に進みたい人はアヒル本を体の一部にしましょう。 最近だと『社会科学のためのベイズ統計モデリング』という書籍も出たそうです。 期間はわかりませんが、僕はプログラミングが少し分かる程度(下のリスト)からスタートして1年かかりました。

  1. 基本的な形(str, int, float, bool)
  2. ベクトル/行列
  3. 関数(合成関数、高階関数) # これが大切
  4. 開発環境(RStudio, Git)

なお、Rでプログラミングを学ぶ時はRを用いた教科書の特性に注意すべきです。 というのも、Rの教科書の大半は統計の教科書でもある性質から 「理論を数式で説明してから関数を紹介する」という形式になりがちです。 つまり数学も分かっていない状態でRの教科書を開くと結構痛い目を見ます。 さらに、Rを勉強する層にとって関数は「作るもの」ではなく「使うもの」として扱われている印象があります。 したがって、プログラミングとしてRを学ぶときは、関数の扱いが丁寧な教材を探しましょう。

さて7の人はどこに向かうのでしょうか。 といっても、統計モデリングを楽しんだ人は機械学習も楽しめると思います。 こういう人には Coursera の Machine Learning がおすすめです9。 GLMのロジスティック回帰を機械学習の視点から眺めるのも楽しいですし、 あぁニューラルネットってこうなってたのか、という発見があったり、 実務/研究で使えそうなネタも見つかります。

もしかすると8に進みたいって人もいるかもしれません。 データコネコネ(前処理, 可視化)の方法や OSと黒い画面の使い方(Linux, Terminal, Vim, Tmux, SSH, EC2)、 チームでの開発(Git, GitHub/GitLab, GitFlow, 環境の仮想化, Style Guide)や 報告の資料作り (TeX/Markdown, MS/Google/Libre, 学術系/産業系の作法) を知っておくと、 色々と便利です。 ひょっとすると、ドメイン知識を活かした仕事が見つかるかもしれません。

正直、データコネコネはどの段階でも使える気はしなくもありません。 ただ全部を抑えるのは現実的ではないかもしれません。 だからこそ、ゴールを決めるのです。 おすすめは3か5です。効率よく進めれば現実的な範囲です。

ここまでで学習の対象をリストにまとめられたら、 次に自分が使える時間を考えながら学習計画を立てます。 例えば「修士論文に間に合わせたいから、 実験計画をする修士の2年の頭までには4まで進みたい」 のように、制限時間を決めます。 そして学習する単元ごとに1から3ヶ月の期間の目標 (マイルストーン)を設定します。

最後にマイルストーンを1つ実施し、計画の評価と更新を行ないます。 工数の評価は相対的に行なうほうが楽なので、 マイルストーンの粒度が同程度の場合、 実施したマイルストーン1つにかかった時間から全体の計画が現実的かが判断できます。

偉そうに色々言いましたが、僕は学習計画なんて立てたことありません。 すべて自分の失敗から「こうすればよかったなぁ」という懺悔ちゃんです。 まぁ、必要になってから必死に勉強する遅延評価勉強法もありだとは思いますが…。

まとめ

最後になりますが、この投稿の目的は「プログラミング学習が文系院生のキャリアに与える長所と短所を挙げ、 それでも学びたい人には道筋を示す」 というのものでした。 メリット、デメリットに分けてプログラミングと統計、研究の関係を考えられるようになったでしょうか。 プログラミングは研究に必要な統計の理解を助けるだけでなく、 研究自体の役にも立つ、という話をしました。

また「学習計画を立てるのを助ける」という目標もありました。 この記事では月並みですが、ゴールを決める大切さを強調し、 またゴールの例を8個ほど挙げました。 大事なのは1から8のどこを目指すかで、 1から3はプログラミングの学習はあまり重要ではないのに対し、 4からは他にも必要なものが増えるので腹をくくろう、という話でした。 また、6から先はきついので5を目標にすると良いのでは、という話もしました。

そして、ゴールを決めたら必要/不必要な単元を洗い出し、 使いたい時間に基づいてマイルストーンを同程度の粒度に砕いて設定します。 まずは1つ目のマイルストーンを実施してみて、 かかった時間から全体の学習計画の実現可能性を評価し、 必要であれば更新しましょう。 更新の頻度を速くし、イテレーションを回すことが最適化のコツです。

何度か述べましたが、文系の大学院でプログラミングを学ぶのは現状だと茨の道です。 周囲からの協力は期待できませんし、研究に直結するかどうかも微妙です10。 ただ、大学院に進む人にとって新しいことを学び続けることは精神衛生の観点から不可欠ですし、 プログラミングは統計や研究を助けうるという点から有力な候補だと思うのです。 食い扶持も増やせますし。

最後の最後になりますが、こんな長い記事にお付き合いくださり、ありがとうございました。 特に院生でもないのに目を通してくださった方、貴重な時間をありがとうございました。 皆様の大学や企業での研究/開発ライフが実り多いものになることを願ってます。

おまけ

本筋を濁してしまうと感じたため除外した 「プログラミングを学ぶメリット」について3つ補足します。

  • 経験を積むチャンスをもらえた
  • RとPythonの得意分野が見えた
  • 新しい分野に乗れた

経験を積むチャンスを得られる

プログラミングを学んだことにより、僕は色々なチャンスをもらえました。 まず「あの新しい子はプログラミングができるらしいよ」という話になり、 色々な仕事をボスがくれます。 解決するために勉強して仕事を終わらせると少し進み、 進むと更に全方向から仕事がきてまた前に進む感じです。

ただ、研究室で「ちょっとできる子」扱いされても実務はからっきしです。 今までやってきたプログラミングや統計が現実世界でどう使われてるかまでは見えません。 そこで企業におじゃまするわけですが、 「プログラミングに興味あります。なので、こんな事やってきました!」という人と 「プログラミングに興味あります。でも、まだ何も勉強してません!」という人だと、 多分ですが採ってもらえる割合も違うと思います。幸い僕は前者でした。 ただ、入ってから「自分は何を勉強してたんだ…」と毎日思いながら勉強し続けることになりますが。

まとめると、こうした機会をもらったことで チームでの開発手法とかデザインパターンとか、 機械学習と統計モデリングの接点とか見方の違いとか、 ドメイン知識の活かしどころなんてのも学べました。 そこで得たネタで異分野の学会に参加したり、 コメントもらって交流もらえたり、研究のアイデアが湧くこともあります。

RとPythonの得意分野を考慮した技術選択ができる

うそです言い過ぎました。ごめんなさい。 でも「Rじゃなきゃプロジェクト入りません、分析しません」 とかではなく、 チームのメンバーや環境に合わせられたり、 ちゃちゃっと前処理して報告まとめたいからRかなぁ、 でも後でモジュール残して本体に組み込みたいならPythonで かっちりテスト書いていこうかなぁ、みたいな 対応が荒削りながらできるようになりつつあります。

新しい分野に乗れる

完全に私ごとですが、心理言語学という多少ふわっとした内容を 形式的に研究する計算心理言語学という分野があって、 ここでの議論の内容が分かるようになったのが 非常に良い副作用でした。 プログラミングを学んだあとでN教授のオートマタ理論の授業を履修し、 その後で統計モデリングやった結果なので、完全にマグレですが…。


P.S.

プログラミングの素養にフォーカスしたRの教科書があれば教えていただけると助かります。 研究に役立つ再現性も大事なんですが、なんかこう、 「わープログラミングめっちゃたのしいやん!!!」となれる感じの…。 『R言語徹底解説』とかですかね。冬休みに読もうかな…。

でも正直、学習プランよりも教材よりも 「プログラミングや統計を使って表現したいもの」を見つけるというのが大切な気もします。 というのも、僕がプログラミングにドハマリしたきっかけは関数を勉強したとき、 「数学とか言語学とかがプログラミング経由で現実に反映できるやん!!! 素敵!!!」 ってなった段階なので…。(ここまでの話をぶち壊してる)

これは画家や漫画家、イラストレーターといった業種と同じで、 技術だけ伸ばしても「表現したいものが無い」という状態は辛いのです。 最初は絵を描くという行為自体のが楽しくてしかたなかったのに、 次第に「あれ、僕ってなんでデッサンやってきたんだっけ。 僕の描きたいものってなんだっけ」となって方向を見失います。 なのでむしろ、表現したいものとかモデリングしたいもの、知りたいものに 技術が追いついてないくらいほうが健全かもしれません。


脚注

  1. 文系とはなにか、という議論も人によっては大切かもしれません。が、本稿では「大学に入ってから数学と向き合わなかった人」というものを置いておきます。学際化が進んでいる現在では線引きが難しいですし、線引きしても本稿では大して役に立たないからです。ただ、統計だけではなく計算的なモデル作成の需要は今後もなくならず、なんとなく増えていくんじゃないかなと思ってます。 

  2. アメリカの大学に1年の交換留学をした時に全く興味のなかった Computer Science 101 を履修させられたのがきっかけでした。 

  3. これは「就職に有利だから」という理由で大学院に進学した文系の学生を僕がまだ見たことがないから、という決めつけです。 

  4. 統計が不必要な分野もありますが、「我々が見ている事象は揺らがず、観測者に依存しない」という強めな前提が必要です。 

  5. 隣の席に座ってた学生のLershに聞いたら「ワイも分からん」と言ってた。留学中 Computer Science と Painting 以外はだいたいそんな感じだった。 

  6. 色々と考慮に加えた上での実験を行った結果ですら解釈が難しいのに、考え無しで行った実験の解釈とか恐怖しかありません。 

  7. 2021年、Interspeechという国際会議に受理されました。 

  8. N教授のオートマタ理論の講義です。教科書にはBarbaraを使いました。これがキッカケで計算論から見た文法を学ぶことになり、自分がしたかった研究への糸口が見つかった気がします。ただこれも、プログラミングも統計モデリングも知らないM1の時点で履修していたら、特に響くものもない授業になってしまっていたかと思います。あと開講がランダムみたいですし。タイミングって大事です。 

  9. 余談ですが、教育に携わる人は Coursera、一回は使ってみる価値あると思います。コースデザイン、クラスデザイン、評価手法、どれをとっても美しくてため息しか出ません。終わると修了証がもらえます。数学を極力避ける姿勢を嫌う人もいるかもしれませんが、興味の入り口を作るという意味では素晴らしい授業だと思います。 

  10. そこらへん、うちのボスは寛大で「それが君にとって大切なら優先せよ」というスタンスを取ってくれたのに加え、こちらの技術でできるチョイ上くらいの仕事を振ってくれたため、勉強しながら資金面、精神面の援助を受けられました。ただ、そんな人に恵まれるのは必然ではないため「期待できない」という表現をしています。期待された時に応じる用意は常にすべきです。