睡眠・歩数・RHR・HRVデータの処理

1週間、1ヶ月といった単位で、行動・生理指標の変化を追う場合は、睡眠・歩数・RHR(安静時心拍)・HRV(心拍変動)データの日単位の取得が必要になります。

睡眠データの取得
 ClientIDとClientSecretを用いて,過去4日分の睡眠データを取得し,csv形式で保存する。40~46行目の関数は,それぞれ「総睡眠時間,目覚め後の時間,入眠時間,覚醒時間,寝返りの回数,寝返り時間,睡眠効率」の7つを取得している。

「合計睡眠時間=Awake(起きている時間)+MainLen(寝ている時間)」
"""
getSleepSmple.py
ClientIDとClientSecretで、Sleep関連データを取得するプログラム
"""
import sys
import fitbit
import pandas as pd
import gather_keys_oauth2 as Oauth2
from datetime import datetime, date, timedelta
     
print('Hello FitbitSleepAPP1') 
   
USER_ID     = "hoge"
CLIENT_SECRET = "hoge"
     
def requestFitbit(DATE):
    rval=""
    global auth2_client
    
    #fitbit_stats = auth2_client.intraday_time_series('activities/minutesSedentary', DATE, detail_level='1min')
    #HRstats = fitbit_stats['activities-minutesSedentary-intraday']['dataset']
       
    sleep_data = auth2_client.sleep(date=DATE)    
    #print(DATE+"睡眠データ取得実行しました") 
   
    OUTPUT_FILE = "SLEEP.csv"
    csv_file = open(OUTPUT_FILE, 'a')
    csv_file.write(DATE+",")
   
    sleepcnt=len(sleep_data["sleep"])
    #print(str(sleepcnt)+"回眠っています") 
   
    totallength=0;
    TAfter=0;
    TFall=0;
    TAwake=0;
    TLessCnt=0;
    TLessDur=0;
    TEffi=0;
    for var in range(0, sleepcnt):
        #print("睡眠:"+str(var)) 
        totallength+=sleep_data["sleep"][var]["minutesAsleep"] #総睡眠時間
        TAfter+=sleep_data["sleep"][var]["minutesAfterWakeup"]
        TFall+=sleep_data["sleep"][var]["minutesToFallAsleep"]
        TAwake+=sleep_data["sleep"][var]["minutesAwake"]
        TLessCnt+=sleep_data["sleep"][var]["restlessCount"]
        TLessDur+=sleep_data["sleep"][var]["restlessDuration"]
        TEffi+=sleep_data["sleep"][var]["efficiency"]
          
    AvgEffi=1
    if sleepcnt!=0:
        AvgEffi=TEffi/sleepcnt;    
      
    print(str(sleepcnt)+"回の睡眠で総睡眠時間は"+str(totallength)+"分です") 
    csv_file.write(str(totallength)+","+str(sleepcnt)+","+str(TAfter)+","+str(TFall)+","+str(TAwake)+","+str(TLessCnt)+","+str(TLessDur)+","+str(AvgEffi)+",")
   
    for var in range(0, sleepcnt):
        if sleep_data["sleep"][var]["isMainSleep"] == True:
            csv_file.write(sleep_data["sleep"][var]["startTime"]+","+str(sleep_data["sleep"][var]["minutesAsleep"])+","+str(sleep_data["sleep"][var]["efficiency"]))
   
    csv_file.write("\n")
    csv_file.close()
       
    return rval
##################################################
    
def writeindex():   
    OUTPUT_FILE = "SLEEP.csv"
    csv_file = open(OUTPUT_FILE, 'a')
                     
    csv_file.write("date,totallength,count,AfterWakeup,FallAsleep,Awake,restlessCount,restlessDur,AvgEffic,MainStart,MainLen,MainEffic\n")
    csv_file.close()
##################################################
    
"""Get tokens"""
server = Oauth2.OAuth2Server(USER_ID, CLIENT_SECRET)
server.browser_authorize()
ACCESS_TOKEN = str(server.fitbit.client.session.token['access_token'])
REFRESH_TOKEN = str(server.fitbit.client.session.token['refresh_token'])
     
print(ACCESS_TOKEN)  
print(REFRESH_TOKEN)
    
"""Authorization"""
auth2_client = fitbit.Fitbit(USER_ID, CLIENT_SECRET, oauth2=True, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN)
     
"""request"""
#requestFitbit("2022-02-22")
writeindex();   #インデックス記入
today = datetime.today()
for var in range(0,4):
    #day=today + timedelta(days=1)
    #print(var+":" + datetime.strftime(yesterday, '%Y-%m-%d'))
    stamp=datetime.strftime(today - timedelta(days=var), '%Y-%m-%d')
    print("target: " + stamp, end=' ')
    requestFitbit(stamp)

歩数データの取得
1日あたりの歩数を取得する

"""
getStepSample.py
個人の1日の歩数データを取得するプログラム
"""
import sys
import fitbit
import gather_keys_oauth2 as Oauth2
from datetime import datetime, timedelta
import json
 
print('Hello FitbitDailyStepsAPP')
 
USER_ID = "hoge"
CLIENT_SECRET = "hoge"
 
def requestFitbit(DATE):
    global auth2_client
 
    # APIエンドポイントを使用して1日の歩数データを取得
    steps_data = auth2_client.make_request(f'https://api.fitbit.com/1/user/-/activities/steps/date/{DATE}/1d.json')
 
    OUTPUT_FILE = "Steps.csv"
    with open(OUTPUT_FILE, 'a') as csv_file:
        csv_file.write(f"{DATE},")
        if "activities-steps" in steps_data and len(steps_data["activities-steps"]) > 0:
            steps_info = steps_data["activities-steps"][0]  # リストの最初の要素を取得
            csv_file.write(f"{steps_info['value']}\n")
        else:
            csv_file.write("No steps data\n")
 
def writeindex():
    OUTPUT_FILE = "Steps.csv"
    with open(OUTPUT_FILE, 'w') as csv_file:
        csv_file.write("date,steps\n")
 
# トークンの取得
server = Oauth2.OAuth2Server(USER_ID, CLIENT_SECRET)
server.browser_authorize()
ACCESS_TOKEN = str(server.fitbit.client.session.token['access_token'])
REFRESH_TOKEN = str(server.fitbit.client.session.token['refresh_token'])
 
print("AT:"+ACCESS_TOKEN)
print("RT:"+REFRESH_TOKEN)
 
# 認証
auth2_client = fitbit.Fitbit(USER_ID, CLIENT_SECRET, oauth2=True, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN)
 
# インデックスの書き込み
writeindex()
 
# 1日の歩数データのリクエスト
today = datetime.today()
for var in range(0, 7):
    stamp = datetime.strftime(today - timedelta(days=var), '%Y-%m-%d')
    print(f"target: {stamp}", end=' ')
    requestFitbit(stamp)

RHR(安静時心拍数)の取得
RHRはその日の安静時の心拍数の評価値

"""
getRHRsample.py
個人のHRVデータを取得するプログラム
"""import sys
import fitbit
import gather_keys_oauth2 as Oauth2
from datetime import datetime, timedelta
import json

print('Hello FitbitRHRAPP')

USER_ID = "hoge"
CLIENT_SECRET = "hoge"

def requestFitbitRHR(DATE, ID):
    global auth2_client

    # APIエンドポイントを使用して安静時心拍数データを取得
    heart_data = auth2_client.make_request(f'https://api.fitbit.com/1/user/-/activities/heart/date/{DATE}/1d.json')

    OUTPUT_FILE = ID + "_RHR.csv"

    with open(OUTPUT_FILE, 'a') as csv_file:
        csv_file.write(f"{DATE},")
        if "activities-heart" in heart_data and len(heart_data["activities-heart"]) > 0:
            heart_info = heart_data["activities-heart"][0]['value']
            if 'restingHeartRate' in heart_info:
                rhr = heart_info['restingHeartRate']
                csv_file.write(f"{rhr}\n")
            else:
                csv_file.write("No resting heart rate data\n")
        else:
            csv_file.write("No heart rate data\n")

def writeindex(ID):
    OUTPUT_FILE = ID + "_RHR.csv"
    with open(OUTPUT_FILE, 'w') as csv_file:
        csv_file.write("date,restingHeartRate\n")

# トークンの取得
server = Oauth2.OAuth2Server(USER_ID, CLIENT_SECRET)
server.browser_authorize()
ACCESS_TOKEN = str(server.fitbit.client.session.token['access_token'])
REFRESH_TOKEN = str(server.fitbit.client.session.token['refresh_token'])

print(ACCESS_TOKEN)
print(REFRESH_TOKEN)

# 認証
auth2_client = fitbit.Fitbit(USER_ID, CLIENT_SECRET, oauth2=True, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN)

# インデックスの書き込み
writeindex(USER_ID)

# 安静時心拍数データのリクエスト
today = datetime.today()
for var in range(0, 7):
    stamp = datetime.strftime(today - timedelta(days=var), '%Y-%m-%d')
    print(f"target: {stamp}", end=' ')
    requestFitbitRHR(stamp, USER_ID)

HRV(心拍変動)データの取得
HRVは睡眠時のものとなるため、1日あたり一つ。評価値はrMSSDを示し単位はms。

"""
getHRVsample.py
個人のHRVデータを取得するプログラム
"""
import sys
import fitbit
import gather_keys_oauth2 as Oauth2
from datetime import datetime, timedelta
import json
 
print('Hello FitbitHRVAPP')
 
USER_ID = "hoge"
CLIENT_SECRET = "hoge"
 
def requestFitbit(DATE):
    global auth2_client
 
    # APIエンドポイントを使用してHRVデータを取得
    hrv_data = auth2_client.make_request(f'https://api.fitbit.com/1/user/-/hrv/date/{DATE}.json')
 
    OUTPUT_FILE = "HRV.csv"
    with open(OUTPUT_FILE, 'a') as csv_file:
        csv_file.write(f"{DATE},")
        if "hrv" in hrv_data and len(hrv_data["hrv"]) > 0:
            hrv_info = hrv_data["hrv"][0]  # リストの最初の要素を取得
            csv_file.write(f"{hrv_info['value']['dailyRmssd']},{hrv_info['value']['deepRmssd']}\n")
        else:
            csv_file.write("No HRV data\n")
 
def writeindex():
    OUTPUT_FILE = "HRV.csv"
    with open(OUTPUT_FILE, 'w') as csv_file:
        csv_file.write("date,dailyRmssd,deepRmssd\n")
 
# トークンの取得
server = Oauth2.OAuth2Server(USER_ID, CLIENT_SECRET)
server.browser_authorize()
ACCESS_TOKEN = str(server.fitbit.client.session.token['access_token'])
REFRESH_TOKEN = str(server.fitbit.client.session.token['refresh_token'])
 
print(ACCESS_TOKEN)
print(REFRESH_TOKEN)
 
# 認証
auth2_client = fitbit.Fitbit(USER_ID, CLIENT_SECRET, oauth2=True, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN)
 
# インデックスの書き込み
writeindex()
 
# HRVデータのリクエスト
today = datetime.today()
for var in range(0, 4):
    stamp = datetime.strftime(today - timedelta(days=var), '%Y-%m-%d')
    print(f"target: {stamp}", end=' ')
    requestFitbit(stamp)

公認心理師特講(実験・感情)

公認心理師特講(実験/感情)
 事前に提示していた課題に関し、解説動画を用意しましたのでご覧ください。また、動画で使用されている資料をPDFで用意したため、必要に応じてご利用ください。

訂正:動画中で、Barretの神経生物学的状態(コア・アフェクト)に関する解説部分が「感情の社会的構成主義説」となっていますが、正しくは「感情の心理的構成主義説」ですのでご注意ください。

リアクションの提出
 こちらのリンクから本日を含む3日以内にリアクションを登録してください(リアクションには、動画を見て、考えたこと、感じたことをお書き下さい。リアクションは出欠記録を兼ねており、かつ成績評価の対象となることにご留意ください)。

24神経・生理心理学

授業の目的
 本講義では、心と体の関係について、様々な角度から理解を深める事を目的とする。各種の基礎的な計測手法を解説すると同時に、実際にそれらを用いた過去の実験事例を取り上げ、中枢神経系や自律神経系のメカニズムについて学んでゆく。また、主要な関連分野における近年のトピックについても適宜解説を行い、単なる学問としてでなく、これらの新しい知見を日常場面にどの様に活用してゆくか、ストレス・健康といった身近な概念も交えながら、応用生理心理学的視点も含め議論をすすめてゆく。

到達目標
 これらを踏まえ、本演習は、以下を到達目標とする。
1.生理心理学において一般的に用いられる測定指標について概説できるようになる。
2.各測定指標変化の背後にある神経活動について説明できるようになる。
3.心身相関現象をもたらす様々な身体機能について説明できるようになる。
なお、本科目はストレス耐性科目として設定されており、授業内にて学生のストレスおよびストレスマネージメントに関する知識とスキルについて学習を促す。

成績評価の基準
目標1~3に関しては、定期的に行う小テスト、期末の試験、レポートにより評価を行う。
成績評価の配分は、小テスト・試験・レポートの成績を50%、リアクションペーパーへのコメント等から判断される参加状況を50%とする。授業内容に関しての意見・質問については、次回授業の冒頭で適宜フィードバックを行う。

01.ガイダンス
02.神経系
03.心電図と心拍数
04.末梢血管活動
05.血圧
06.小テスト
07.体温
08.皮膚電気活動
09.呼吸・筋電図
10.脳波・眼球運動
11.小テスト
12.ストレスと健康
13.リラクセーション
14.記憶・感情等の生理学的反応の機序・高次脳機能障害
15.試験

心理学情報処理基礎演習1-15

前回授業へのコメント
 様々な視点に基づいた、バラエティに富んだプレゼンテーションを作成してくださり、ありがとうございました。一見遊びのように思える調査にも、意外な真実が含まれていることがあると思います。調査の楽しさを少しでも感じていただけたらよかったなと思います。

リアクションの提出
 最初はExcelやPowerPointに苦手意識があった方も、授業の課題を通して徐々に慣れていただけたものと思います。今回は、上記の動画を視聴した感想と、15回授業を受けた上での全体的な感想を、リアクションに記入して送ってください。半年間お疲れ様でした。
AクラスリアクションBクラスリアクション

24初年次演習メモ

自己紹介
「名前、出身地、自宅か一人ぐらしか、兄弟構成、中学・高校での部活、趣味、なぜ心理学科に入ったのか?どんな心理学に興味があるのか(ざっくりと)?」
これらの内容で各自自己紹介をメモ書きしてもらい、共有し、その後実際に口頭で自己紹介する。


図書館で本を借りる
来週は、読んだ本の内容を紹介していただきます。下記の注意点を参考に、メモをとっておきましょう。 

5分程度で図書館で借りた本を紹介する際に、以下のポイントに留意してください。

  1. タイトルと著者: まず、本のタイトルと著者名を明確に伝えましょう。
  2. ジャンルと対象読者: 本のジャンルや対象読者を簡潔に説明しましょう。これにより、聞いている人が自分に興味があるかどうか判断しやすくなります。
  3. 概要: 本の主題や内容を簡単に紹介しましょう。物語や議論の大まかな流れを把握できるように、要点を絞って説明してください。
  4. 引用と例: 本から興味深い引用や具体的な例をいくつか紹介することで、内容を理解しやすくなります。ただし、引用や例が多すぎると、紹介が冗長になるため注意してください。
  5. 評価と感想: あなたが本を読んだ感想や評価を述べましょう。これが他の人に読む価値があるかどうかを判断する助けになります。ただし、主観的な意見が多くなりすぎないように、客観的な観点からも評価しましょう。
  6. 時間管理: 5分の制限内に紹介を終えられるように、時間を十分に管理してください。事前に練習して、ポイントを簡潔に伝えられるように準備しましょう。
  7. 身振り手振り: 話す際に、適度な身振り手振りを使って、聞いている人が理解しやすく興味を持ちやすいようにしましょう。

最後に、紹介が終わったら、質問や意見があるかどうか確認しましょう。相手の関心を引くような紹介ができれば、本に対する興味を喚起できます。

その後2週間にわたり、各自が読んだ本を紹介してもらう。


心理学に関連する動画を視聴する
今日は、心理学に関する動画を視聴します。

ダニエル・ピンク: やる気に関する驚きの科学
ケン・ロビンソン: 学校教育は創造性を殺してしまっている
ケリー・マクゴニガル: ストレスと友達になる方法


新入生の面談をする
ひとりずつ、何回かに分けて面談する。


新聞を読む
今日は図書館で新聞をコピーして読んで、発表しよう(発表は来週)。発表のときは下記の点について述べるようにしてください。
1.どのような内容なのか?
2.なぜその記事を読んだのか?
3.記事を読んだ感想は?


心理学ワールドを読む準備をする
来週は心理学ワールドを読もうと思います。軽く目を通しておいてください。
https://psych.or.jp/publication/world/


心理学ワールドのどの記事を読むのかを決める
来週は、下記の1~4をお話しいただきますので、来週話す事を想定し、メモを取りながら読むようにしてください。1.記事のタイトル2.なぜその記事を選んだのか?3.簡単な内容紹介4.感想 また、文中に出てくるキーワードについて、できるだけ調べて読むようにしてください。意味がわからないキーワードは、検索エンジンやChatGPTなどを使って調べるようにしてください。

今週は心理学ワールドのうち、どの記事を読むか決めていただきます。https://psych.or.jp/publication/world/ 心理学ワールドの各巻のうち、「特集」もしくは「小特集」のうちから、1本の記事を選んで読んでください。自分が読む記事が決まったら、この発言のあとに ///////////////////////////////////////////////////////////私は、「暴力」特集の中から、差別という暴力を読みます。https://psych.or.jp/publication/world077/pw05///////////////////////////////////////////////////////////
などのように書き込んでください。他の人と被った場合は、申し訳ありませんが別の記事を選んでください。読む記事は、「特集」もしくは「小特集」の中から選ぶようにしてください。


小論文を書く

小論文を「小論文(自分の名前)」というファイル名のワードファイルにまとめ、「ファイル>小論文フォルダ」に入れておいてください。この課題は本日中に完了してください。合計600字程度で、序論・本論・結論の3段落構成であることを確認してから提出してください。

以降小論文を発表してもらい、フィードバックを行う


プレゼンテーション

自分の興味があることについて紹介するプレゼンテーションを準備してください。題材は、好きな音楽や著作、ゲームなどの趣味に関するものの紹介、自分の出身地の紹介、ペットなどの紹介等、なんでも構いません。過去の事例では、部活で習ったスポーツの紹介(弓道と空手の場合は実演あり)、趣味のお菓子作りの紹介(試食用のケーキを持ってくる)、趣味の手品の実演などがありました。プレゼンテーションは5~10分程度の内容にしてください。当日はインターネットに接続したPCを準備するので、Youtubeで自分の好きな楽曲を流すなどの方法もありです。プレゼンテーションはパワーポイントで作成し、「プレゼンテーション(自分の名前)」というファイル名で、「ファイル>プレゼンテーションフォルダ」に7/18までに入れておいてください。長野が作成したサンプルをフォルダに入れておきましたので、参考にして作成してください。

上記課題を行う際は、必要に応じてコンピュータ室に移動して行っていただき構いません。

心理サイエンス基礎演習まとめ

12月18日が休校となったため,補講を行います。内容は心理サイエンス基礎演習のまとめで,来年の心理サイエンス応用演習の内容についても簡単に触れました。改めて見ると,心理サイエンス応用演習はAIやSTEM教育など,かなり高度な内容を扱っています。参加するのは,大変だと思いますが動画を見て興味が出た方は,ぜひチャレンジしてみてください。

上記の動画を見た感想と,授業を通した感想をリアクションのページから,1月29日までに登録してください。リアクションの登録をもって,出席とカウントします。

STEM教育まとめ

授業で扱った「生体計測をテーマにしたSTEM教育」について,どのようなことを行なってきたのかを以下の動画にまとめましたので,少々長いですがご覧ください。

「生体計測をテーマにしたSTEM教育」についてのアンケート調査にご協力ください。回答は2024年1月29日の深夜までにお願いします。今回の授業に関しては,このアンケート調査への回答を持って出席とします。皆さんお忙しいところすみませんが,よろしくお願いいたします。

23心理サイエンス基礎演習Ⅱ

授業の目的
本演習は心理学における実験研究に有用な、様々なテクニックを身につけることを目的とする。具体的には、従来の心理学に、プログラミング、CG、VR、電子工学、デジタルファブリケーション等の技術を組み合わせ、独創性の高い研究を実施する力を養う。

到達目標
1.プログラミングやデジタルファブリケーション、CGなどに関する各種ソフトウェア等に触れ、それらの技術を応用した実験刺激を作製できるようになる。
2.上記のスキルをベースに独自の研究アイデアを発案、他者にわかりやすく伝えることができるようになる。

授業コンテンツ
ガイダンス
VRゴーグルの使い方を知る
UnityでVRを使う
3Dプリンタの使い方を学ぶ
3Dデータの作成方法を学ぶ
Arduino入門(1)
Arduino入門(2)