実験の結果と考察~心理学実験をやった話③~
はじめに
今回は実験の結果と考察について書いていこうと思っています。流れはデータの説明→全データの考察です。前回↓↓
使用ツール
・Psychopy3
・Python3
データの説明
考察するためにグラフとして4つ用意した。〇-△となっているが、〇のBがボタン押し条件、Vが振動条件であり、△のAが音、Vが図、AVが両方である。
まず、左上のグラフについて説明する。横軸を実際の遅延、縦軸を実験参加者からの報告値とした。そして見やすさのためにy=xを用意した。つまりy=xより下ならば実際よりも早く知覚されている。例えば、実際は400msなのに300msだと知覚している。この実験参加者は振動条件の音と図両方提示はほぼ正確な値を報告しているが、全体としては早めに知覚しているということである。
次に、右上のグラフについて説明する。右上は実際の値-報告の値を縦軸にとっている。つまり負であるならば早めに知覚しているということである。左上のグラフをより実際の値と報告値の差を見やすくする目的がある。
次に、左下のグラフについて説明する。右上のグラフを各条件について平均をとったものを棒グラフにしたものである。つまりどの条件がどれだけ実際値と報告値に差があるかを見やすくすることが目的である。この実験参加者は特にボタン条件の時、差があることがわかる。
最後に、右下のグラフについて説明する。右下のグラフが今回の実験の主たる目的のIBの強さを表すグラフである。右上のグラフのV-XからB-X(X={A,V,AV})をひいたものである。Vは振動条件であるので意図無し、Bはボタン条件なので意図有りであるため、縦軸が正である時、意図が無い方が遅く知覚されているということであるためIBが生じているといえる。この実験参加者はV以外では概ね正となっているためIBが生じている。
以上がグラフの説明である。本質的な部分をみるためには左上と右下だけで良いのだが、右上や左下のグラフのように多面的にデータを観測することで外れ値や、より具体的に考察することができる。一つまた勉強になった。
全体データと考察
全体のデータが上の通り。思ったよりデータ綺麗になってうれしい(?)。まずは結果からわかることを挙げる。
・全体として早めに知覚されている。
・実際値と報告値の差は実際値が大きくなるにつれて大きくなっている。
・Bの方がVよりも差が大きい。
・音が最も差が大きく知覚されている。
・しかし、IBの大きさは第二条件による差はない。
・いずれの条件でもIBは生じている。
まず、いずれの場合もIBが生じていることについてさすがに仮説通りでよかった。これ間違ってたらIB…ってなっちゃう。次に、第二条件で差がないことについて、そもそもの仮説の前提条件である視覚よりも聴覚の方が反応時間は早いから注意力が云々が間違っていたことが考えられる。反応時間によるIBへの影響がないことがここから考えられる。
まとめと感想
実験を0から自分で企画、実践、解析までやったのは本当にいい経験だし今しかできないなって思った。担当教授曰く、B4の方達よりもよく取り組んでいるとの言葉をいただいたのでとても嬉しかった。この実験をやるまでPythonに触れたことすらなかったのでとても苦労した。一番苦労したのはArduinoとのシリアル通信。
実験の有用性を聞かれても直接的には考えられない。しかし、IB自体は多くのことに応用できると思った。意図の有無で体感時間が変わることをモデリングすることで何か役に立つことがあると思う。思い浮かばないけど!何かあったら教えてください。
これで実験の話は終わりです。もしここまで読んでくださった方いたらありがとうございました。一応時間に余裕できたら今回の実験のプログラムの説明もやりたいな。
Comunicaç o serial com Python e Arduino (Portuguese Edition)
- 作者: Vitor Amadeu Souza
- 発売日: 2018/03/10
- メディア: Kindle版
- この商品を含むブログを見る
もしよければ↓ぽちっと↓お願いします。
実験の仮説と実験方法~心理学実験をやった話②~
はじめに
本ブログは前回の続きである。実験に関わる用語は前回の記事を参照してください。
実験の仮説まで
IBについて実験しよう~ってなっても既知であるものを実験したとしても意味がない。既知であるものとして例としては意図の強さを比較してより意図の強い場合とそうでない場合を比較し、より意図が強く働く方がIBが強くなることがわかっている。ここで、IBの強さを以下のように定義する。
(IBの強さ) = (意図がない体感時間) - (意図がある体感時間)
つまり、意図がある方が短く感じられることがIBであるため正である時にIBが生じていると言うことができ、IBの強さは正に大きくなるほど強くなる。
私はこういった先行研究から異なる知覚間でIBの強さは異なるのかを実験しようと考えた。今回、視覚と聴覚を比較することにした。視覚と聴覚は視覚の方が反応時間は早い。そこから視覚の方がIBは強まるすなわち意図がある時に早く知覚されると仮説をたてた。
実験の方法
実際に私が行った実験の方法を説明する。実験参加者として大学生男女10名を対象とした。参加者を集めるのにめttttttっちゃ苦労した。そりゃつまらんし誰もやりたいなんて思わないよね。参加者のみなさん本当にありがとうございました。
上の振動条件が意図無し、ボタン押し条件が意図ありです。ボタンor振動の後に0~1000ms(1s)のランダムな時間があり、図が提示されるか音が出るかその両方が出るかが第二イベントとしてある。このランダムな時間を参加者に推定してもらう。そして両者に差があるのか、そして第二イベントによる差はあるのかを実験によって調査する。
さいごに
うーん…実験方法についてもっと書きたいんだけどあんま書いてもな…って感じでめっちゃ短くなっちゃった。まあこれでヨシ。次は実験結果と考察をまとめるよ。
次回↓↓
もしよければ↓ぽちっと↓お願いします。
インテンショナルバインディングとは~心理学実験をやった話①~
どんなことを実験したのか
一口に心理学実験と言っても多くの種類があります。僕自身最初は睡眠についての何かをしたいと思っていたのですが、手間がとてもかかり、学部生ではとても実験までたどり着く事ができないそうなので方針を変え、2つの知覚(視覚や聴覚、触覚など)の関連性について学ぼうと考え、教授からインテンショナルバインディング(IB)について調べるのはどうかとの提案をいただきました。
インテンショナルバインディング(IB)とは
英語で書くとIntentional Bindingとなり、意図による束縛のような感じの意味です。勉強するにあたって読んだ文献を下に幾つか貼っておきます。
オリジナル実験において、まずオペランド条件とベースライン条件を以下のように定義します。
・オペランド条件…手元にあるボタンを押すまたはボタンを押してから250ms後に音がなるのでその音が鳴った時の時計の針の位置を報告
・ベースライン条件…手元にあるボタンを押すまたは突然音が鳴るので音が鳴った時の時計の針の位置を報告
この2条件に分かれて時計の針の位置をそれぞれ報告させたところ、行為(ボタン押し)のタイミングはオペランド条件の方がベースライン条件よりも遅く知覚され、音刺激のタイミングはオペランド条件の方がベースライン条件よりも早く知覚された。図示すると以下のようになる。青が時間軸で赤がベースライン条件、黄がオペランド条件である。
この図からオペランド条件の方がベースライン条件よりも短く知覚されていることがわかる。また、オペランド条件とベースライン条件の違いとして、オペランド条件は音が鳴るタイミングがある程度わかる⇒自分の行為と音に因果関係があるように感じられるため自分が音を鳴らしているかのように感じられることである。その反面ベースライン条件にはそういった意図はなく、突然音が鳴る。つまり両条件の違いは意図の有無である。
ざっくり説明すると「意図がある時とない時で体感時間が変わるで」ってことです。何言ってるかわからんと思います。僕もわかりません。うそですわかります。
さいごに
みなさんの身近でもこれは感じられていることです。多くの現象が考えられますが、例えば楽しいことってつまらないことより短く感じられませんか?この現象についてはIBだけではなく多くの原因が考えられますがIBから考えると楽しいことをしている時、その人は必ず意図のある行動つまり自発的行動を行っているはずです。行動ではないにしろ自発的に物事を考えたりしていると思います。逆につまらない時間はその人は自発的にほぼ何もしていないと思います。あれしろこれしろなど受動的になっていませんか?IBはそのような大きな時間のことではありませんが、数msの差が幾つも重なれば大きな体感時間の差になると思います。もし退屈な時間を短く済ませたいならば無理矢理にでも自発的行動をとってみようと僕は思いました。
あまり続けても冗長な記事となってしまうためここで一回切ります。ここまで読んでいただいた方いらっしゃったらありがとうございました。
次回は具体的にIBを使ってどんなことを実験するのかと実験方法まで書ければいいな。
次回↓↓
参考図書
もしよければ↓ぽちっと↓お願いします。
映画ワンピース スタンピードを公開初日に見てきた感想※ネタバレややあり
はじめに
このブログの対象は
・既に映画を観てこんな細かいことに気付いたぞって人
・煩雑な文章でも気にならない人←これ大事
つまり未視聴者などあらすじを確認したい人にとってはあんま…って感じになっちゃう
まずは予告↓↓
ゲrrrrrrrrrッロおもしろかった!!!!!!!
今まで二回観たい映画とかなかったんだけどこの映画はまた観たいと思った。てか観る。なんなら買う。小説も買う。文章で色々補填してあるだろうし絶対買う。
今回の映画のみどころ(若干ネタバレ?)
今回の見どころはやっぱりキャラの多さ。最悪の世代は全員出た。当然我らがウルージ様も極上のスマイルを見せてくださり、15億のルフィにも臆さず交戦するなど元気であられた。パンダマンが僕の体感だと10回ぐらい出てた気がする(実際はもっと多いかも)。まあパンダマンはどうでもいいんだけど。ナチュラルにケイミ―とパッパグとはっちゃん出てたしコニスもオープニングで背中だけ出てた気もする。あとはグラント(アニオリのキャラ)も1フレームぐらい出ててビビった 。他は映画常連となったルッチ君とサボ君。七武海もウィーブルとクマとドフィとジンベエ以外新旧揃って出たかな。個人的にジンベエいつ出るかなってわくわくしてたんだけど出なかったのは残念。多分時系列的にWCL編の後だから仕方ないのかも。エンディングではっちゃんと革命軍が手振るシーンあったけどこれコアラと再会してないのかな…。クロコさんとロビンの再開させるのもびっくりしたしこういうたくさんキャラ出す映画だと関係性とか考えなきゃいけないから大変そうだよね。
今回のラスボス・バレットについて
バレットは元ロジャー海賊団(他にも過去にあるけど)で、「"鬼"の跡目」とも呼ばれており、作中ではバギーに「レイリーに匹敵する」と言われています。実際に最悪の世代全員を相手に圧倒するなど正直「これどう倒すんだ…」って思ってた。ていうかバレットすげええともなったけど「これと同等のレイリーさん何者だよ…」の気持ちの方が大きかった。いや本当にどういうこと…??
ウソップさん
今回、真っ先にバレットにボコされちゃうウソップさん。この時バレットに言われた(ウソップは気絶してたから気付いてないかも)言葉が「弱い、使えない部下なんか切り捨てろ」でもうこれね…。W7でルフィに言ったセリフと重なっちゃってなんかつらくなっちゃったよ…。
おわりに
こんなに見づらく、ただ興奮冷めやらぬ中書いた雑な文章を読んでくださってありがとうございました。何か間違いやこんな発見したぞ!ってのがあったらコメントで教えていただけると幸いです!
グッズたくさんあったけどおっさん達が群がってて買えなかった…。パズルとか欲しかった。
[rakuten:cinemacollection:10277483:detail]
もしよければ↓ぽちっと↓お願いします。
Python3で大容量のcsvファイルを分割して読み込む
はじめに
この記事は記事タイトルの趣旨に関係のない所謂冗長なコードとなってしまっているので書き直しました。以下の記事へ飛んでいただけると幸いです。
実験の講義で大容量のcsvファイルをなるべく高速に検索するシステムを作ることになり、Pythonを使うことにした。ちなみにPythonは動作がありえん遅いためこの課題には不適切だけどとにかくPythonが使いたかった。
使用機材
RaspberryPi
Python3.X
コード
import csv
import pandas as pd
df = pd.read_csv('True.csv',chunksize = 8000000,names=('id','time','lati','long','url','tag'),usecols=['time','lati','long','url','tag'])
for r in df:
for row_index,row in r.iterrows():
if row[4] == sys.argv[1]:
for i in range(0,4):
print(row[i])
コード自体は短い。Pythonで大容量ファイルを使うなんてことはそうそうないから他にも普通にopen csvして一行ずつ読み込んだり試したけどどうも動作が遅いしスマートなコードにならなかったからやめた。
コードの説明
今回はpandasライブラリを使った。大容量に強いらしいし。
まずpandasを使ってファイルを読み込む。この時、chunksizeでファイルを分割する。usecolsで使うカラムを指定。iterrows()を用いてリスト形式で出力。sys.argv[]はphpのexec()関数から渡された値(この場合だとユーザが打ち込んだ検索ワード)が検索対象のタグと一致した時に~って処理をしてる。一致したらそのデータ出力という処理が全体の概要。
緑字の説明
chunksizeは一回で何行データを読み込むかを指定する。例えば今回の実験では2000万行のcsvファイルを扱ったが、chunksizeを1000万と指定すれば1000万×2回に分割、400万と指定したら400万×5回に分割することができる。なぜそんなことをする必要があるのかというと、メモリにのらないほどの大容量ファイルだと一度に読み込もうとすると読み込むことができない。そこでファイルをメモリにのる程度に分割することで大容量ファイルでも読み込むことを可能とする。当然分割するファイルが多いほど(chunksizeが小さいほど)実行速度は遅くなってしまうため使用機材のメモリが許す限り大きな値に設定すべきである。今回使ったラズパイ君は1GBしかメモリがないからchunksizeもとても小さくなってしまい(100万ぐらい)、結局思ったより早くならなかった。もっとメモリが大きかったりファイルが小さかったりしたらいい感じになったかも。
もしよければ↓ぽちっと↓お願いします。
【Python3】「DeprecationWarning: Call to deprecated function ~」の解決方法
ある日
Pythonでエクセルのデータ解析するかぁ~と思ってファイルを開こうとしたら…
のエラー文。最初は???って感じだったけど英単語調べた結果意訳すると「おめえそろそろなくなるメソッドつかってんぞ」とのこと。そして親切にも(Use ~)と教えてくれているので素直に従うと解決した。
まとめるほどのことでもないけどエラー文を読まず時間を浪費した自分への戒めとして残す。
おわり
もしよければ↓ぽちっと↓お願いします。
二次方程式の解の公式の導出方法をざっくり
はじめに
二次方程式の解の公式は誰でも知っている公式だと思います。しかし導出できますか?と聞かれるとできない人も一定数いると思います。というか導出できる云々より中学生の時に機械的に覚えさせられたから導出するという発想にすら至らないかもしれません。高校数学までならばほぼすべての公式が導出可能です。数Ⅲなどでは一部大学数学でしか証明できないものもありますが。大学の理論数学とかはもう導出とかそういう次元じゃないので高校数学がどれだけ良心的だったかわかります。
本題
まずは二次方程式の解の公式
⇒
見慣れたものだと思います。大学生になるとこの式は忘れているかもしれません。僕もうろ覚えでした。これを導出します。導出方法は平方完成をすればいいだけなのでそんな難しくありません。
まず、前提条件として二次方程式であるためa≠0、bとcは任意の実数です。
もしよければ↓ぽちっと↓お願いします。
【Python3】改行しながらテキストファイルに出力する
敗北者
改行できないの悔しすぎる。俺は敗北者。
コード1
#coding:utf-8
import random
number = [0.1,0.2,0.3,0.4,0.5,0.7,0.9]
delay = random.choice(number)
_delay = str(delay)
f = open('a.txt','a')
f.write('\n'.join(_delay))
f.close
出力
0
.
3
0
.
4など
…そうじゃないんだけどなあ
原因
原因として考えられるのは「0.3」を書き込んでいるんじゃなくて「0」「.」「3」を書き込んでるからそのたびに改行コードを打ち込んじゃっている。そこを力業でデバックする。
コード2
#coding:utf-8
import random
number = [0.1,0.2,0.3,0.4,0.5,0.7,0.9]
delay = random.choice(number)
_delay = str(delay)
f = open('a.txt','a')
f.write(_delay)
f.write('\n')
f.close
これはf.write()で書き込んだ後に改行コードを打ち込んでいるから確実っちゃあ確実だけどスマートじゃないからあんまやりたくなかった。。。
出力
0.3
0.4
ちゃんと思った通りに動いた。
余談
「かいぎょう」って打って一番に「開業」出てくるのやめてほしい。開業コードとかないから。
もしよければ↓ぽちっと↓お願いします。
Psychopy(Python)とArduinoでシリアル通信してみた
目的
python3からArduinoへシリアル通信を行い、ある文字列がきたらモーターを振動させるという処理をすること
プログラム(失敗例)
Python
import serial
import time
print('Start')
ser=serial.Serial('COM5',9600)
ser.write("a")
print('Send')
if ser.in_waiting>0:
line = ser.read()
print(line)
ser.close()
Arduino
void setup() {
Serial.begin(19200);
pinMode(8, OUTPUT);
}
void loop() {
byte VibON;
VibON = Serial.read();
switch(VibON){
case 'a':
digitalWrite(8, HIGH);
delay(40);
digitalWrite(8, LOW);
delay(20);
break;
default:
break;
}
delay(1);
}
プログラムの説明
上記のプログラムは正しく動作しないが、一応解説をする。まず、python側でシリアル通信をするためのserialをインポートする。これはデフォルトで入っていたり入っていなかったりするのでない場合は(py -m)pip install pyserialをcmd上で入力すれば入れられる。py -mはWindowsの場合にのみ必要。まずWindowsの不便さでここがうまくいかくて苦労したけどそれは省略。最初からlinux使えばよかた。serial.Serial()の引数は各々帰る。そしてwrite()でArduino側へ送信する。また、Arduinoから返ってきた値を表示するためにread()も書いてある。
Arduino側はいたってシンプルにSerial.read()で読み取ったデータがaならばモーターを振動させるという処理をさせている。しかしこのプログラムで実行しようとするとエラーが出る。
原因解明
Arduino側は普通にコンパイルできるしシリアルポートでaを送ると振動する。python側のエラー文を見ると「byte型で送れや」と怒られている。調べてみるとserialはbyte型しか送れないっぽい。じゃあaをbyte型にするにはb'a'とするだけでいいから直して実行するとエラーは出ないがモーターが動かない。
ser.write("a") → ser.write(b"a")
Arduinoから返っても来ない。わけがわからないのでとりあえず送るものを表示させてみたらb'a'と送っている。byte型で送っているから当たり前なんだけどこれじゃあaではないのでArduino側も振動するはずがない。次になぜArduinoから返ってこないか考える。通信したことを示すランプは光るし大した処理はしていないからよくわからん。とりあえずネットで検索をかけまくる。そしたらポートを開いてから書き込む間に遅延を発生している人がちらほら(全員じゃない)。とりあえず適当に遅延をかけてみたらArduinoから値が返ってきた!!多分処理が追い付かないまま書き込もうとしちゃって結局書き込めてない的な感じかな。
ser=serial.Serial('COM5',9600)
ser.write("a")
↓
import time
ser=serial.Serial('COM5',9600)
time.sleep(2)
ser.write(b"a")
いい感じになってきたのであとはモーターぶるっとさせるだけ。単純に文字列比較だと一生aは送られないからそこを考える。考えた過程とか忘れたので結論char型にして先頭からaを探すという処理をすることで解決した。このプログラム自体は簡単だった。成功プログラムを以下に示す。
プログラム(成功)
Python
import serial
import time
print('Start')
ser=serial.Serial('COM5',9600)
time.sleep(2)
ser.write(b"a")
print('Send')
#time.sleep()
if ser.in_waiting>0:
line = ser.read()
print(line)
ser.close()
Arduino
void setup() {
Serial.begin(9600);
pinMode(8, OUTPUT);
}
void loop() {
if(Serial.available() >0){
int Vib=Serial.available();
char VibON[Vib+1];
for(int i=0; i<Vib; i++){
VibON[i] = Serial.read();
if(VibON[i] == 'a'){
Serial.print(VibON);
digitalWrite(8, HIGH);
delay(1000);
digitalWrite(8, LOW);
delay(20);
}
VibON[Vib]= '\0';
Serial.print(VibON);
}
}
delay(1);
}
今回使ったArduinoは以下。非純正買ってもいいけど変なところで苦労するかも。
おわり。
もしよければ↓ぽちっと↓お願いします。
【Python】'range' object does not support item assignment の解決方法
結論:pythonによるバージョンの違いから吐かれるエラー
このエラー文自体の意味はこれは今のバージョンじゃ使えないよ~ってこと。Python2だとそのままa=range(M)みたいに使えたんだけどPython3からは使えなくなった。
どうすれば解決?
range()を使って乱数生成するのは同じ。ただ関数list()を使って
a = list(range(M)) とするとエラーが消えて正しく表示された。注意として変数(この場合はa)を関数名(list)と同じにする、つまり
list = list(range(M))のようにすると変数名と関数名を同じにするな!とエラー文が帰って来るので注意
参考文献
もしよければ↓ぽちっと↓お願いします。
自己紹介
大まかな自己紹介
2019年現在、情報学系統を専攻している大学生(B3)です。誰かの言葉ではなく自分の言葉でどこかでアウトプットできないだろうかと思いこのようなブログをはじめてみようかなと思いました。また、学業だけでなく日常的なことも書いていこうと思っています。アウトプットとしてこのブログを書くつもりでいるため多少読みにくいことや誤ったことがあるかもしれませんがご了承願います。また、言葉遣いなども不安定だと思います。
少し触ったことがあるものはLaravelとPythonです。機械学習やWebシステムに興味があります。
基本的には日記のようなものです。コメント、アドバイスなどどしどし待ってます!
もしよければ↓ぽちっと↓お願いします。