猫も杓子も構造化

発達障害、特別支援などについて書いています。最近は心理学関係の内容が多めです。

Pythonでお絵かき(続・カフェウォール錯視編)

前回の記事でPILというライブラリを使ってカフェウォール錯視を描く方法について書き、結果次のような画像が出来上がった。

f:id:nekomosyakushimo:20170905120835p:plain

今回はより実験刺激っぽく、明度を系統的に変化させながら刺激を作る場合について書こう。

例えば、真ん中の線の明度を系統的に変化させたいとする。

ここでは完全な黒から白まで5段階くらいで試してみよう。まず、明度情報についてのリストを用意する。

#線の明るさのリスト
value = [0,64,128,192,255]


そして、このリストを用いて繰り返しの処理を行うのだが、繰り返しのたびに保存するファイルの名前を変えたい。そこで、filenameという変数を作り、繰り返し処理の最初に明度情報を含んだ「cafe64.png」のようなを文字列をその中にいれるようにする。注意するべき点として、明度情報は整数で与えてあるのでそれを文字列型に変換しないとうまくいかない(str関数を使う)。

画像ファイルの出力は、前回と違って繰り返し処理の内部に埋め込む。

for k in value:
    filename = "cafe" + str(k) +".png"
    draw.line([(0,61),(620,61)], width = 2, fill = (k,k,k)) #真ん中の灰色の線
    image.save(filename)

あとは、前回のコードと同様である。

完成したカフェウォール群がこちら。明度が順番に0,64,128,192,255と増えている。

f:id:nekomosyakushimo:20170905140925p:plainf:id:nekomosyakushimo:20170905140934p:plainf:id:nekomosyakushimo:20170905140939p:plainf:id:nekomosyakushimo:20170905140944p:plainf:id:nekomosyakushimo:20170905140953p:plain

灰色の場合は明るくなるにつれて錯視量が大きくなっている気がするが、完全な黒と白の場合においては錯視は起きていないように思える。みなさまの目にはどう映りますでしょうか。

Pythonでお絵かき(カフェウォール錯視編)

PIL(Python Imaging Library)というものがある。これは、Pythonで画像関係のデータを扱う際に必要なものをまとめたライブラリなのだそうだ。何かしらの実験刺激を作る際に、決まったパターンで単純な図形を繰り返したいときというのがあり、そういう場合にこれは役に立つのではないかと思ったので、試しにカフェウォール錯視でも作ってみる。

カフェウォール錯視というのは、傾きの錯視の一つでリンク先を見てもらうか、googleで検索してもらえればどんなものかは分かるでしょう。

カフェウォール錯視

※北岡先生のサイトにはたくさんの錯視が紹介されていて見ているだけで楽しい。


手順としては、四角形の開始位置のリストを最初に作り、その位置情報に従い繰り返し処理で順々に描画していくという流れ。今回は2段しか四角形を描いていないのでそれぞれで繰り返し処理を行なっているが、y座標の開始位置のリストを作れば複数段重ねることも容易でしょう。位置情報のリストを作る際には、前の記事で紹介したnumpyのarray関数を使った。

#coding:utf-8
from __future__ import division
from __future__ import unicode_literals
from numpy import array
from PIL import Image, ImageDraw

#黒の四角の位置情報
black1 = array(range(5)) * 120 + 30

#描画オブジェクトとか
image = Image.new("RGB", (620,123), color=(255,255,255))
draw = ImageDraw.Draw(image)

for i in range(5): #上段の四角形を描く
    draw.rectangle(((black1[i],0),(black1[i]+60,60)), outline = None, fill = (0,0,0))
for j in range(5): #下段の四角形を描く
    draw.rectangle(((black1[j]+30,63),(black1[j]+90,123)), outline = None, fill = (0,0,0))
draw.line([(0,61),(620,61)], width = 2, fill = (128,128,128)) #真ん中の灰色の線

image.save("cafe.png")


完成品はこちら。

f:id:nekomosyakushimo:20170905120835p:plain


ちなみに水平線の灰色を明るい色にするとやや錯視量が大きくなる気がしますがどうでしょうかね。(最初のはRGB=(128,128,128)で2番目がRGB=(160,160,160))

f:id:nekomosyakushimo:20170905121355p:plain

Pythonでのベクトル処理

Python初学者が戸惑ったとことかを備忘録がてらメモしておく。

Rとの違いでまず迷ったのがベクトルとスカラーの演算である。

例えば、Rだとあまり何も考えずにオブジェクトにベクトルを放り込んで演算をすれば勝手にやってくれる。

> a <- c(1:20)
> a
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
> a + 1
 [1]  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21
> a * 2
 [1]  2  4  6  8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
> b <- c(21:40)
> a + b
 [1] 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60
> a * b
 [1]  21  44  69  96 125 156 189 224 261 300 
341 384 429 476 525 576 629 684 741 800

ところがpythonでこのノリは通用せずエラーを吐き出す。掛け算ではリストの要素を2回繰り返される。

>>> a = list(range(20))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

>>> a + 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "int") to list

>>> a * 2
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]


pythonでベクトルの演算をするにはどうすれば良いかといえば、numpyというライブラリを使うと良いらしい。使うのはarray()という配列を作る関数で、リストを読み込めば、1次元の配列(つまりはベクトル)が生成され、ネストされたリストを読み込めばN次元の配列が作られるようだ。

>>> import numpy as np
>>> aa = np.array(a)
>>> aa
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10,
 11, 12, 13, 14, 15, 16, 17, 18, 19])

>>> aa + 1
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 
11, 12, 13, 14, 15, 16, 17, 18, 19, 20])

>>> aa * 2
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18, 20,
 22, 24, 26, 28, 30, 32, 34, 36, 38])

ちなみに、片方が配列であれば、もう片方が普通のリストであっても配列同士の演算がされるようだ。リスト同士の演算と比べて見ると差がわかる。

>>> aa + b
array([20, 22, 24, 26, 28, 30, 32, 34, 36, 38,
 40, 42, 44, 46, 48, 50, 52, 54, 56, 58])

>>> a + b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]


やはり、統計解析を主たる目的で作られている言語と汎用的な言語ということで勝手は色々違うみたいですね。

Atomに入れてみたパッケージ

Atomというのは色々とカスタマイズできることが売りのエディタということで、いくつかの記事を参考にしてパッケージを入れてみる。参考にしたのは、次のような記事。

AtomでPythonの開発環境を整える - Qiita
オススメのatomパッケージ7選 - Qiita


とりあえず入れてみたのは次のパッケージ。

japanese-menu

日本語でも英語でもどちらでも良いような気がしますけど、まぁ日本語の方が安心感あるじゃないですか。

file-icons

アイコンが綺麗に表示されるとそれだけで気分が良いじゃないですか。

autocomplete-python

ちょっと打てばすぐ補完してくれるので少し作業が早くなりますね。

highlight-selected

選択した単語をハイライトしてくれるのだけど、単語を間違えて打っていてエラー吐き出したときに他にもないかチェックできて便利。

auto-runner

ターミナルまでいって実行しなくともショートカットで実行できるのだけど、ライブラリを読もうとするとエラーを吐き出すことが多くてあまり上手に使えていませんね。

Hydrogen

jupyter kernelをatom内で動かすということだけど、インタラクティブに確かめながら開発できて大変便利ですね。


こんなところなのですが、Psychopy Corder時代よりは使い易い感じになりました。

Atomの導入やら

実験刺激を作れるようになろうと思いPsychoPyというアプリケーションのPsychoPy Corderというのを先月あたりから使い始めた。刺激作成のライブラリとしては使いやすく、基本的な動作はなんとなく分かってきたものの、もう少し快適な開発の環境にならないかと思いCorderを捨てて別のエディタを試してみた。

検索してなんとなくカッコ良さそうだからというフィーリングでAtomを導入して見る。

atom.io

とりあえず、Corderよりは使いやすそうであるので色々と試して、また考えていきたい。


関連
nekomosyakushimo.hatenablog.com

2E教育について

自宅に『LD研究』が届いたので、パラパラと目を通す。

特集は昨年のシンポジウムの2E教育について。基調講演の後に話題提供が4件続き、その後に指定討論者のコメントが加えられるというスタイルである。

話題提供に目を通していて、2Eという概念が未整理な印象を受けた(あまり研究されていないのだからそりゃそうでしょうが)。話題提供の報告者の実践はそれぞれに多様なアイデアを提供するものに思うが2E教育の概念とどう関わるのがいまいち分からないものが多かった。通級指導教室の実践を報告した今西では最後の段落に申し訳程度に2Eの言葉が使われているだけであったし、小倉による青年のグループ活動の実践も自己理解にフォーカスを当てたSST風のありがちな実践で、西村による大学体験プログラムの報告も発達障害のある生徒の進学を支援するという点で必要なことに思うが、進学を支援することそのものが2E教育なのかは疑問であった。(大学に進学した発達障害者は皆exceptionalかというとそうでもないでしょう。)

吉原による横浜市での実践は才能を伸ばすということにフォーカスを当てている点で他の話題より、2Eとの関連が見出しやすそうに感じたが、一番関連が高そうなサマースクールによる高次の思考活動の実践報告においても、結局対象が希望者であるため、どんなexceptionalな生徒に対して、どんな特別な活動が提供されたのかのつながりが見えづらかったように思う。

全体的な感想としては、2E教育という概念の整理をもう少し丁寧に行った方が実りある実践が出てくるのではないかと思う。

シンポ企画者の松村の基調講演では、狭義と広義の2E教育を区分している。狭義については「診断・識別される障害と才能を併せもつ」として、広義については、「潜在的な障害と才能があるが、両方は診断・識別されない」とある。

前者についても後者についも、どうexceptionalな生徒の才能を識別あるいはその兆候を掴むかというのが重要に思う。というか、それをしないと議論が始まらないでしょう。発達障害の診断についていえば、チェックリストだの診断基準が確立しているが、才能の方についての識別法を確立しないことには、結局「発達障害の人には二重のニーズがあるかもしれないですね」という心構え的なものに終わってしまうだろう。それを、狭義の2E教育対象者を峻別するための公式の方法として使うかはさておき、ニーズが顕在化していないものについては必要な処遇が何かも分かるはずもない(発達障害界隈であれだけアセスメントが大事だと言ってきて、才能教育ではアセスメントの必要性がないなどといったことはまさか言うまい)。

まぁ、このシンポをきっかけにこれからやっていきましょうね、ってことなんですかね。

※ちなみにAmazonで「2E教育」で調べてみても、日本語の書籍は全然ヒットしないけど英語の書籍はたくさんヒットする。日本ではまだまだ始まったばかり(まだ始まってない?)なんですね。

Twice-Exceptional Gifted Children: Understanding, Teaching, and Counseling Gifted Students

Twice-Exceptional Gifted Children: Understanding, Teaching, and Counseling Gifted Students

Twice-exceptional Students Participating in Advanced Placement

Twice-exceptional Students Participating in Advanced Placement

Twice-Exceptional Kids: A Guide for Assisting Students Who Are Both Academically Gifted and Learning Disabled

Twice-Exceptional Kids: A Guide for Assisting Students Who Are Both Academically Gifted and Learning Disabled

理論的な根拠と言うけれども

自閉症の人に対する構造化という支援の手法がある。わたしのブログのタイトルにもなっている。

先日友人と話す中で、それに関連して次のような質問を受けた。「自閉症の人の認知の仕組み(例えば、実行機能障害や弱い中枢性統合など)を明らかにすることは、構造化という介入に対する理論的根拠を与えることになるのか。」細部は違うと思うが大意はこんな感じだったと思う。

これについて真面目に考えてみたのだが、考え始めるとなかなかに難しい問題だということに気づいた。せっかく考えたことでもあるのでメモしておこうと思う(まとまってはいないが)。

まず、理論的根拠という言葉をどういう風に扱うかということが問題になろう。「理論」の主な役割というのは科学哲学の教えるところによれば現象の「説明」および「予測」であったと記憶している(うろ覚えだが)。そうなると、一体「何の現象」を説明して予測するのかということが次に考えることだろう。

行動分析をベースにした考え方をとれば、ある介入が説明し予測するものは、対象者の行動である。それが適応行動の増加だろうが問題行動の低減であろうが、行動の次元で起きる何かしらの変化を説明し予測できるかが行動分析家にとっての主な関心だろう。

行動分析家が行動上の変化を説明する場合、強化と弱化の原則を基本とした三項随伴性という概念が用いられる。先行条件、標的行動、結果事象の関係性の変化をもって、行動上の変化を説明する。

また、理論は行動上の変化の予測を可能にする。だからこそ、行動分析家はベースラインと介入期というものを分けて捉える訳だし、ベースライン期と介入期を操作することによって(一般的にはABABデザインで)、その理論の検証を行おうとする訳である。

このように考えると、行動上の変化を説明し、予測するだけであれば、介入と変化における関数関係が確立できれば良いわけで、何も内的な概念を導入する必要はない。

一方で、三項随伴性という道具を用いないで行動の変化を説明しようとする立場もあるだろう。

『TEACCHとは何か』(エンパワメント研究所)という、TEACCHプログラムの中心的なメンバーが書いた本があり、その中に「構造化された指導法の理論的裏づけ」という章がある。そこでは、例えば実行機能と構造化の関連が次のように書いてある。

実行機能とそれに関する情報の順序立ての問題は、ASDの人が日常生活の流れを理解し、それに沿って行動することを困難にしている。自分が何を、どのような順序で遂行すべきかを理解できないことが不安の大きな原因となり、問題行動につながっている。そのため、視覚的な1日のスケジュールは、構造化された指導法のアプローチの重要な構成要素の一つとなるのである。(p.89)

ここでは、問題行動の原因が不安にあり、その不安は実行機能の障害によりもたらされているという説明がなされている。図式的に表すと以下のようになろう。


実行機能障害 → 不安の増大 → 問題行動


従って、問題行動を引き起こしている不安を減らすこと、不安を引き起こしている実行機能障害に対してアプローチをとることが、問題行動低減の説明になるだろう。TEACCHの人たちによる問題行動の低減の説明を図式的に表すと、次のようになるだろう。


構造化 → 不安の低減 → 問題行動の低減


行動分析の説明のモデルと比べると、「実行機能」や「不安」などの概念を挟んでいる分、現象の説明についてはやや間接的な印象を受ける。間接的である分、注意しなければならない点もいくつかあるように思う。

まず、最初の図式の1つ目の矢印である「実行機能障害」が「不安を増大」するのかということについて。また、そうなのであれば、実行機能障害の程度がどの程度の不安の増大を予測するのかということが問題になろう。『TEACCHとは何か』の本で、ASDの実行機能障害の根拠として挙げられているのが、Sally Ozonoffによるレビュー論文である(Ozonoff, 1995)。その中でOzonoffは、ASDの実行機能について調べた実証的研究を紹介しているが、それらの多くの研究は、ウィスコンシンカード分類課題やハノイの塔の課題などの神経心理学的課題の成績を他の群と比較したものである。では、そうした神経心理学的課題が低かったことをもってして、それがASDの不安につながっていると言って良いかは十分に検討しなければならない。

また、2つ目の矢印である「不安の増大」が「問題行動」につながるのかということも検討事項に思う。直感的には関連ありそうな気もするが、それは問題行動の原因ではなくあくまで誘発要因ではないだろうかというのが、行動分析的な考え方に毒されている人間の感想である。さらに、2つ目の図式の最初の矢印である「構造化」が「不安」を減らしているかというのも検証が必要であろう。

いずれの点も、内的なものを原因であったり結果であったりに捉えているので、その因果関係の検証がしづらい(できないという訳ではない)ので十分に気をつけて見る必要があるだろう。細かなことを言っているようではあるのだが、この因果関係が明らかにならない限り説明のモデルとしては成立しないのであるから仕方がない。

さて、一番最初の「自閉症の人の認知の仕組みを明らかにすることは、構造化という介入に対する理論的根拠を与えることになるのか」という質問についてだが、条件を満たせば理論的根拠を与えるだろうというのが今のわたしの理解である。

条件というのは、「内的な認知構造」と「介入の結果としての行動上の変化」に妥当な因果関係が確立していることである。それをすることなしに、「実行機能」がどうたらとか「中枢性統合」がどうたらとか、「かっこいい(あるいは難しそうな?)」言葉を振り回して、もとの研究の射程を越えたレベルの推論をするのは、科学を装ったインチキなのではないかと思ったりする今日この頃である。とりあえず、認知的な特徴についての研究が一体、何を説明できて、何を説明できないのか注意して議論するべきだろうと思う。

この問題については、また改めて考えたい。


参考
Ozonoff, S.(1995). Executive functions in autism. In Learning and Cognition in Autism, E. Schopler and G. B. Mesibov, eds. New York: Plenum Press, pp. 199- 219.

TEACCHとは何か―自閉症スペクトラム障害の人へのトータル・アプローチ

TEACCHとは何か―自閉症スペクトラム障害の人へのトータル・アプローチ

  • 作者: ゲーリー・B.メジボフ,エリックショプラー,ビクトリアシェア,Gary B. Mesibov,Eric Schopler,Victoria Shea,服巻智子,服巻繁
  • 出版社/メーカー: エンパワメント研究所
  • 発売日: 2007/03
  • メディア: 単行本
  • この商品を含むブログを見る