例題24-1:「PsychoPy Builderで作る心理学実験」イントロダクション

A: さて、この行き当たりばったりな「Pythonで心理実験」、途中からPsychoPyを扱いだしたので「PsychoPyの入門」と言えるページがなかったのですが、遂に「PsychoPyをこれから使おうと思っている人はこれを見てください」と言えるコンテンツが出来ました。「PsychoPy Builderで作る心理学実験」です。全10章構成で、1章でインストール、2章で基本操作、3章から10章にかけていろいろな実験を作りながらPsychoPy Builderの使いこなし方を学べる文書です。

B: あれ、これって、僕たちの出番がありませんが…?

A: うむ。私とB君がうんたらくんたらしゃべっていたらちっとも話が進まないので企画段階から排除された。はっはっは。

B: ははは。そいつぁ仕方ないや。はははは。

A: はははは。

B: ははは… はは。あれ、ちょっと泣いていいですか。

A: おう。好きなだけ泣いてこい。

B: うわああん! Aさぁあん!

A: だぁああああっ、しがみついてくんなうっとおしい! 誰が私にしがみついて泣けと言った!

B: いや、でもここはお約束の流れでしょう。Aさんの反応も含めて。

A: ええい、離れんか。まったくこんなことで貴重なページを消費するから使ってもらえないんだっての。

B: 恐らく真面目に話をしたら2/3くらいの長さになるでしょうからね。へへ。

A: いきなり出鼻をくじかれたが、まあそんなこんなでPsychoPy Builderの入門用文書です。Builderの使い方を解説した文書なので、残念ながらCoderに挑戦しようという方には引き続き「Pythonで心理実験」のあちこちを拾い読みしていただかなければいけません。

B: あらら。

A: すでにBuilderを使いこんでいて、Builderでは自分がやりたい実験が出来ないからCoderへ移りたいって方は残念ながら今回は対象外ですが、まったくプログラミングの経験が無いのに実験を自分で作らなきゃいけない!という人はぜひ使ってみて欲しいと思うのですよ。

B: そうそう、どどーんと泥船に乗ったつもりで!

A: 泥船って言うな。「特定のアプリケーションの使い方を覚えるよりも、一般的なプログラミング言語を覚えた方が汎用性があって役に立つんじゃないかなあ」と思っている方もいると思いますが、Builderを使っているとPythonのコードを書く場面が出てきます。そこから少しずつPythonの文法を覚えていって、ある時点で今までBuilderで書いていた実験をPythonで書くとどうなるか…と考えると、きっとプログラミングの習得がはかどるのではないかと思うのですよ。

B: ふむふむ。Aさんにしてはまともっぽい事を言う。

A: 自分の実験を作るためにプログラミングの学ぶのがつまんない理由のひとつに、最初の段階で学ぶことと「こんな実験を作りたい」という最終目標のギャップが大きすぎることだと思うんだよね。ifとかforとか使って、リストをちまちま作って。Builderでざざっと実験の大枠を作ってしまって、「ここで○○がしたい!」というポイントでコードを書くということを学んでいくという方向もありだと思うんだ。

B: おお。なんだかいいことを言っているような気がするぞ。

A: と、言いつつ私ぁプログラミングはデータ処理から覚えたんですがね。まずRとかでデータを処理する簡単なスクリプトを書く練習をした方が早いっすよ。多分。

B: だはっ、台無しだ。なんじゃそりゃ。

A: 本音なんだがなあ。今時の若い皆さんがやろうとしている実験て複雑なのよね。いろいろな方からの相談を聞いていると。心理学というものが成熟してそれだけ単純な実験ではオリジナリティのある仕事にならなくなってしまっているのかも知れんとかちょっと思ったり。よくわからんけど。

B: 本当に昔の実験は単純だったのかなあ?

A: ま、そんなこんなでBuilderの解説文書ですよ。ここでその内容を繰り返しても仕方がないので、例題24ではこの文書でどのような内容が解説されているかを紹介したい。PDFで390ページくらいあるからどこに何が書いてあるかざっと把握するのも大変だからね。B君も付き合うように。

B: へーい。

第1章-第4章: 基礎編

第1章: PsychoPyの準備

A: この章ではPsychoPyの入手方法、インストール方法、アップデートなどについて解説している。

B: アップデートについて書いてあるのがいいですね。「最新版が出ているからアップデートしろ」って出て来るとOKしなきゃいけなくなる気がするんだけど、OKすると失敗するというか、失敗したことすらよくわかんない状態になるという。

A: 「アップデートしろ」なんて命令的な口調ではないが、気持ちはわかる。原則としては 現在のバージョンで何も不満を感じていないならばわざわざアップデートすることはない ってとこだね。

B: 新しいのが必ずしも良いとは限んない、と。

A: そゆこと。あと知っておいてほしい点を挙げるとすれば、PsychoPyを使う際にExcelがあると便利なんだけど、LibreOffice Calcが十分にExcelの代りになるということ。Ubuntuでもno problem。

B: Ubuntuなら全部フリーソフトでいけますね。

第2章: 刺激の位置や呈示時間の指定方法を覚えよう

../_images/24-1-01a.png
../_images/24-1-01b.png

第2章の図より抜粋

A: この章ではPsychoPyでコンポーネントをルーチンに配置する、実験を実行するといった操作や、刺激のさまざまなパラメータの指定方法を学びます。

B: パラメータ? 文書中ではプロパティと呼んでますね。

A: おっと、そうだった。プロパティ。PsychoPyのダイアログ名ではパラメータではなくプロパティとなっているので文書中ではプロパティで統一しています。要するに刺激の色とか透明度とか位置とか、そういうのを指定する方法ですね。これらのテクニックは基本中の基本なので、ぜひマスターしておきたいところです。

B: 位置や大きさの指定ん時の単位なんかは僕は今でも躓きますからね。

A: 単位で躓く?

B: いや、normなのに(400,0)とか書いて刺激が画面外に吹っ飛ぶとか。

A: そりゃB君がおっちょこちょいなだけだろ。あと、PCにあまり詳しくない人はこの章のトピックスのframeに関する話や、16進数の話も覚えておきたいところです。

B: frameのことはもっとページ数を書いてちゃんと説明した方がいいと思うんですんがね。

第3章: 最初の実験を作ってみよう―サイモン効果

../_images/24-1-02a.png
../_images/24-1-02b.png

第3章の図より抜粋

B: いよいよ最初の実験ですね。

A: ここではサイモン効果を例として、刺激の位置や色などのパラメータを変更しながら試行を繰り返す方法、使用する刺激のパラメータを列挙した「条件ファイル」をExcelやLibreOffice Calcを用いて作成する方法、キーボードを用いた反応の計測方法、実験記録ファイルの内容など、PsychoPy Builderで実験を組み立てるための基本的なテクニックを解説している。

B: この章の内容を押させておけば、とりあえずシンプルな恒常法みたいな手続きの実験は出来るようになりますね。

A: まあそんなに難しくはない、と思う。キーボードによる反応の計測で、反応時間の計測、正答率の記録、不要なキー押しを記録しないといった重要項目が出て来るので押さえておきたい。あとはloopTypeの指定。sequential、random、fullrandomの指定を覚えておこう。

B: 無作為な順序で繰り返すのか、決まった順序で繰り返すのかの指定ですね。

A: 他にもこの章にはキー名の一覧表もあるのでぜひご活用を。PCに詳しくない人は、この章のトピックの疑似乱数とシードの話や、エスケープ文字のことは覚えておきましょう。

B: それからset every repeatを忘れたときのエラー表示のことも!

第4章: 繰り返し方法を工夫しよう―傾きの対比と同化

../_images/24-1-03.png

第4章の図より抜粋

A: 特に文書では基礎編とか書いてないんだけど、区分けするならここまでが基礎編かな。この章の目玉は多重ループ。多重ループを工夫することでPsychoPy Builderで出来る実験の幅が大きく広がります。

B: 具体的には?

A: ブロック化された実験や、決まった順序の繰り返しと無作為な順序の繰り返しが混在した実験を作ることが出来るようになる。

B: ブロック化と言うと?

A: 一連の試行において一部のパラメータが固定されていることだね。例えばあるブロックでは赤い刺激がターゲット。別のブロックでは緑の刺激がターゲット。各ブロックのターゲットが赤と緑のどちらになるかは無作為な順序で決められるっていうタイプの実験。もちろん、刺激の位置などのターゲット色以外のパラメータは試行毎に無作為に変化している。

B: 決まった順序と無作為な順序の混在というのは…。

A: 今のブロック化もその例の一種なんだがな。他の例としては懐かしのPythonで心理実験例題1で取り上げたリーディングスパンテスト(RST)。あれは文を呈示する順番が固定されている。何種類かの文リストのどれからテストするかは無作為に選びたいが、呈示する文は決まった順番でなければならない。

B: ふむふむ。

A: あと、この章で押さえておくべきはexpInfoダイアログの扱いだね。項目を増減させたり、expInfoダイアログの値を使って使用する条件ファイル名を実行時に指定したり。このテクニックはすでに「Pythonの内部変数を利用している」という意味では本来5章に含むべきなのかもしれない。けれども実行時に条件ファイル名を指定すると言うテクニックはこの章の「繰り返し方法を工夫する」という目的には欠かせないからこの章で扱われてるわけだね。

第5章-第8章: 発展編

第5章: Python コードを書いてみよう―視覚の空間周波数特性

../_images/24-1-04a.png
../_images/24-1-04b.png

第5章の図より抜粋

B: で、お次は「Pythonコードを書いてみよう」になるわけですね。

A: うむ。4章までの内容でBuilderの基本的な使用方法をマスターしたと言えるんじゃないかと個人的には思うんよね。ここからは、Pythonのコードを積極的にBuilderに組み込んでいっていろいろな実験を実現する方法を解説する。4章までの内容で出来る実験も多いが、5章以降のテクニックを使うとBuilderで出来る事が飛躍的に増える。

B: 変数、データ型、関数、引数、戻り値とか、耳慣れない用語が出てきてプログラミングをしたことがない人にとっては一気に難しくなりますね。

A: まあ、一応必要な用語は出てきたその場で解説するという方向で書いてあるんだろうが、とりあえず「こう書くんだ」ということだけ覚えて先に進んでもいいと思う。わからなくなったら戻ってきたらいい。

B: わかったつもりでも、先に進んでみたら自分がわかっていなかったことに気付くってのもありますからね。

A: だな。この章ではPsychoPy Builderの内部変数 t を用いてコントラストが変化するグレーティングを描画している。アニメーションする刺激を描くときの基本テクなのでぜひマスターしてほしい。

B: 他に何かあります?

A: expInfoダイアログから数値を得る方法についても押さえておきたいところだね。expInfoダイアログからファイル名などの文字列を得るのは4章ですでに触れたテクニックだが、数値を得る時には文字列から数値に変換してやらないといけない。こういう例に触れると、データ型というものを意識しないといけないということが実感していただけるのではないかと思う。

B: ふむふむ。僕は一応データ型とかわかっているつもりですが、よくこの部分で間違えますね。そういう意味でも注意喚起しておくのは良いことかと。

A: だから自分のドジ自慢をしてどうするのかと。はい、次。

第6章: 反応にフィードバックしよう―概念識別

../_images/24-1-05a.png
../_images/24-1-05b.png

第6章の図より抜粋

A: 知覚とか注意寄りの例題が続いたので、ここで推論というか概念獲得というかの例題。学習するテクニックはif文による処理の分岐。この章からCodeコンポーネントが登場する。

B: 難所ですかね。

A: んー。どうなんだろう。他のプログラミング言語に慣れている人はPythonのインデントによるブロック化がキモいと思うかも知れないが、プログラミング初めての人なんかは案外さらっと入れるんじゃないかと思う。

B: えー。

A: サンプルを記述に従って作成してみるのはそれほど難しくないと思うが、自分でif文を使いこなせるようになるにはちょっとした修業が必要かもしれないな。

B: 修行ですか。

A: 「こういう時にはif文だ!」と「ぴこーん」と来るようになるにはある程度自分で試行錯誤した経験が必要だと思うんだよね。それはさておき、この章は他にも盛りだくさんの内容だ。まず、if文を使用する上で欠かせない比較演算子が論理演算子出て来る。そして変数への代入。

B: 変数への代入なんて基本中の基本だと思うんですが、この章になってやっと出て来るんですね。

A: これまでの章ではBuilderが勝手に代入をしてくれていたからな。この辺りがBuilderからプログラミングの学習へ進むという学習法の特殊なところ。そして、クラス、オブジェクト、データ属性という重要なキーワードが出て来る。

B: Aさんにしごかれる前の僕だったら確実にこの辺で気絶していたと思いますね。ちょっと難しすぎでは。

A: 5章の繰り返しになるけど、よくわからなかったら「なんだか知らないけどこう書くんだ」と自分を納得させて先に進むとよいと思うよ。

B: むむむー。

A: PCに詳しくない人は、この章でパスによるファイルやフォルダの場所の指定を必ずマスターしておいてほしい。絶対パス、相対パスというもきちんと覚えておこう。ここを覚えていないと画像ファイルなどを刺激に使いたいときにわけわかんなくなること必至だから。

B: うんうん。

A: そして文字列の結合も絶対に便利だから覚えておこう。Unicodeのことは絶対に覚えなきゃいけないという程でもないけど、知っておいた方がいい。

B: うんうん。

A: さて、次の章だが…

B: へ? なにか忘れていませんか?

A: 何が?

B: RatingScaleコンポーネントがこの章で…

A: あーあーあー。聞こえない聞こえない。

第7章: キーボードで刺激を調整しよう―ミューラー・リヤー錯視

../_images/24-1-06a.png
../_images/24-1-06b.png

第7章の図より抜粋

A: この章はif文の理解を深める事が目的。特にif文と内部変数continueRoutineを利用したルーチンの中断は極めて重要なテクニックなので、脱Builder初心者を目指すキミは絶対にマスターすること☆!

B: ホントにRatingScaleスルーするんだ…。

A: 他にもCodeコンポーネントで独自に作成した変数の値を実験記録ファイルに出力する方法も紹介されているぞ!これも絶対に覚えておきたい重要テクニックだね☆! これに関連してメソッドという重要キーワードが出て来るからしっかり理解してこう☆!!

B: 確かにこの章はBuilderで本格的な実験を行うためには欠かせないテクニックが目白押しですね。内容は難しいと思いますがしっかりマスターしたいところです。

A: …おい。そろそろ突っ込めよ。

B: はい?なにか?

A: …。ごほん。Builderで使われているさまざまなオブジェクトのメソッドを知っておくと本当にいろんなことが出来るようになるんだけど、一度にマスターするのはやはり難しい。少しずつ覚えていくといいと思う。

B: ていうか、オブジェクトのメソッドとかどうやって調べたらいいんですかね?

A: んー。難しいな。とりあえずこの文書で紹介されているメソッドを知っていたらそこそこのことはできるんじゃないかと思う。BuilderKeyResponse、TrialHandler、Mouse、List、Clock。あ、BuilderKeyResponseはデータ属性だけでメソッドは紹介してないか。

B: それぞれキー押し、ループ、マウス、リスト関連ですね。

A: あと8章のcontains/overlapか。これがどのクラスのメソッドかを厳密に言おうとすると話が難しいのだが…

B: ハイハイ、難しい話は飛ばしましょう。Aさんの悪い癖です。

A: 派生クラスの話をしないといかんからな。B君が言うとおりここではパスしよう。次。

第8章: 08マウスで刺激を動かそう―鏡映描写課題

../_images/24-1-07a.png
../_images/24-1-07b.png

第8章の図より抜粋

A: この章では鏡映描写課題を題材にして、マウスの使い方、for文、breakとcontinueによる繰り返しの制御、そして地味ながらとっても大事なリストの要素へのアクセスとListオブジェクトのメソッドなどを学ぶ。

B: リストの操作なんて普通のプログラミング入門だったら最初の方で済ませる話ですよね。やっぱり特殊だなあ。それにしてもこの章はもう難しすぎで「発展編」のレベルを超えてるんじゃないですか?

A: んー。マウスの使い方は「発展編」で扱うべきだと思うし、for文もリストの操作も本格的な実験の作成のためには知っておくべき。

B: 納得いかないなあ。

A: B君が難しく感じているのはfor文とかリストじゃなくて、パスを描画するためのPolygonコンポーネントの座標値の計算方法じゃないのか。単に計算が嫌というだけで。

B: ぎくっ

A: まぁBuilderの使い方を学ぶという本質とは外れた部分なのにちょっと複雑すぎるかも知れんね。

B: あと、for文のhasattrとかも難しすぎますよ! そもそもこのfor文の例自体無理やりすぎません?

A: continueの例として無理やり突っ込んだ感はあるよな。hasattrの件はif文で論理演算子を使う時の重要なポイントだから、筆者が解説しときたい気持ちもわからんでもない。まあ、この章までの内容が理解できていれば、相当な種類の実験をBuilderで作ることが出来ると思う。んじゃ次。

第9章-第10章: やりすぎ編

第9章: 実験の流れを制御しよう―強化スケジュール

../_images/24-1-08a.png
../_images/24-1-08b.png

第9章の図より抜粋

B: ちょ、やりすぎ編って!

A: 公開してからすでに複数の方にそう言われているようなので。この章は偉大なる(ないしょ)先生からこのような内容を扱えという意見を賜ったからと聞いておるぞよ。

B: ほう。それは畏れ多いですな。なんまんだぶなんまんだぶー。

A: 内容としては、発展編で学んだテクニックを駆使しながらVIやVRといった強化スケジュールの実験をBuilderで実現することに挑む。復習みたいなもんだな。

B: コンポーネントではMovieとSoundが取ってつけたように出てきましたね。

A: うむ。本当に唐突に出てきたよな。そろそろ分量が多くなりすぎたんで、筆者もこの辺でねじ込んどかないとまずいと思ったんだろう。

B: Soundはまだこの例題で使ってるからいいですが、Movieは本当にただ紹介しただけって感じですよね。もうちょっとなんとかしようがあったのでは?

A: んー。筆者は最初報酬画面をMovieにすることも考えていたみたいなんだな。でもそれだと報酬用のムービーを作成しないといかんだろ。それが面倒くさかったんだな。

B: ここまでやっといて手抜きですか。相変わらずマメなんだかズボラなんだかわからない人ですね。

A: まあいろいろとツッコミを入れたい内容の章ではあるが、ここでPythonの重要構文であるwhileが出て来るんだよな。読者が将来的にPythonのプログラミング習得へ進むのであれば、whileは絶対に紹介しておかなければいけない構文だ。さらに言うと、この章のbreakやcontinueRoutineを駆使したフローの制御をマスターすれば、相当複雑な手続きを持つ実験でもBuilderで作ることが出来るはずだ。テクニックとしてはすでに8章までに出てきたものばかりだが、それらを組み合わせることでこんなことまで出来てしまうんだという例だと思ってほしい。

B: そんなことだから「やりすぎ」って言われちゃうんじゃ…。

A: この章で他に覚えておきたいのは何と言っても文字列のフォーマット。C++などの経験者にはおなじみの、データを文字列に埋め込むテクニックだ。これを知っていると実験参加者へのさまざまな情報のフィードバックがとてもやりやすくなる。

B: %.1fとか%dとかいうアレですね。

A: あと紹介しているのはGlobal Clockかな。実験開始からの時間を得る方法だ。これを必要とする人はあまりいないかも知れないけど、時間管理は心理学実験のキモだからな。知っておいて損はしないだろう。

B: 知ってて損な知識ってあるんですか?

A: つまらんことを言って話の腰を折るな。次いくぞ、次。

第10章: 無作為化しよう―視覚探索

../_images/24-1-09a.png
../_images/24-1-09b.png

第10章の図より抜粋

B: さて、最終章ですが…。

A: 前半の内容に関してはもう「正直すまんかった」って感じかな…。いや「無茶しやがって…」だろうか。

B: どっちでもいいですが。無作為化の話は汎用性の高い重要テクニックですよね?

A: うむ。この章のお題は視覚探索課題で、刺激を画面上の位置へ試行毎に無作為に割り当てていく方法の解説がハイライトだ。こういう「実行時に無作為に選択するが、条件ファイルになんていちいち書いていられない」という事態には心理学実験を作っているとよく直面する。そのような事態を切り抜けるために必須のテクニックが解説されていて、ぜひマスターしてもらいたいところだ。

B: じゃあなんで発展編に入れなかったんですか。

A: そんなの筆者に聞けよ。ま、思うにCodeコンポーネントを使ったリストの操作とかが必要で、読者がある程度Codeコンポーネントに習熟してからじゃないとこの話題は難しいと判断したんじゃないかな。

B: 筆者に聞けよとか言う割にはずいぶん具体的に答えますな。

A: うるさい。そんなわけで、かなり厄介な章だけど発展編を全部読んだ人はぜひこの章も読んでおいてほしいところだな。特にリストのスライスはぜひ覚えておきたいね。

B: で、そのやりすぎ部分ですが。XMLの。

A: ああ…。あれは完全に筆者の悪ノリというか、やりすぎ感全開よな。でも、psyexpファイルを直接編集するのって覚えておくととっても便利なんだぜ? この例題に出て来る15個のImageコンポーネントを並べて一個一個設定するなんて私なら絶対Builderでやりたくねえよ。直接コード書く。

B: ですよねえ。

A: でも、ルーチンの名前を変えたいとか、新しいバージョンのPsychoPyで作った実験が古いバージョンのPsychoPyで動かなくて困ったなんて時に、ちょいちょいってpsyexpファイルのXMLを書き換えるだけで解決しちゃうことって多いんだぜ。知っておいて損はないテクニックだ。

B: 知っておいて損なテクニックってあるん…

A: だああぁっ、しつこい。次行くぞ。

第11章: 付録編

第11章: 付録

B: そして最後は付録ですね。コンポーネントのプロパティ一覧、Pythonのキーワード、Builderの予約語、内部変数一覧。なんていうか、こんなのよく調べましたね。

A: Builderの予約語やら内部変数やらはPsychoPy Builderのソースを見りゃそのまんま書いてあるんだがね。ま、でもこうやって一覧になっていて、日本語の解説が短いながらも付いているのは意味があるだろう。

B: そして「『この節で確認すること』一覧」。

A: このリスト、各節の最後に置くのと最後にまとめて置くのとどっちがいいか筆者が悩んでたぞ。結局両方に載せたみたいだが。本人としては索引の代わりにもしてほしいらしい。

B: えー。索引なら50音順に並んでいるとか、探しやすくなっていないと。せめて一覧表に章や節のタイトルは書いてほしい所ですね。

A: 確かに。でも今回のTWSに間に合うように公開するにはそこまでやっていられなかったということらしい。勘弁してやってくれ。

B: へいへい。

------------------------------ * * * ------------------------------

A: というわけで、ざっと「PsychoPy Builderで作る心理学実験」の内容を見てきた。後は文書中で作成している実験ファイルやら条件ファイルを公開するって筆者は宣言してるわけなんだけど、 さっさとやりやがれ ってなところだな。

B: とりあえず6章や10章で使用している画像ファイルはアップロードされていますが、せめて例題8の条件ファイルはアップロードしておいてほしい所ですよね。あんな表とても入力する気になりません。

A: だよな。まあ、奴もそろそろ後期の授業が迫ってきて忙しくしているので長い目で見てやってほしい。

B: ついさっき「さっさとしやがれ」とか言った口でそんなこと言いますか。

A: んじゃ、例題24はこんなもんかな。例題25は何にするかまだ決めてません。もしかしたらPsychoPy関連の小ネタをを例題19に追加するかもしれません。

B: 例題19に追加するんだ。

A: 新たに例題を起こすほどのこともない小ネタなんでな。あと、もしかしたらOpenSes... (突然ものすごい勢いで誰かがやってきてAを引きずって去っていく

B: おーい、Aさーん。…なんてこった、最近ぼくが居なくなる系の〆が多かったけどまさかAさんが居なくなるとは。えーと、そんなわけだかどんなわけだかよくわかりませんが、皆さんごきげんよう。Aさんの無事を祈っていてください。