fc2ブログ

ChatGPT4を使う(5)

 前回の続きです。前回お話しした通り、$20の有償のChatGPT4が開通しました。ChatGPT4_initial_231029.png
 まず、設定を確認しておきます。
 ロケール(アルファ)を「ja-JP」に変更すると、デフォルトの英語表記から日本語表記に変わりました。ChatGPT4_setting1_231029.png ベータ機能を確認すると、「プラグイン」と「高度なデータ分析」ができるようですね。どんなことができるかは、次回以降、味見をしようと思います。ChatGPT4_setting2_231029.png データ制御を確認すると、チャット履歴の保存と、入力の文言がモデルの学習に使われる旨が書かれてあります。個人が自宅で使う分は、学習されても問題ない内容しか話さないので、ONにしておきました。ChatGPT4_setting3_231029.png
 さて、今回は流行に乗るわけではありませんが、DALL-E 3を使ってみました。DALL-E 3は2023年9月21日にOpenAI社が公開したばかりの最新の画像生成AIで、テキストプロンプトからその内容を反映した画像を生成するDALL-Eシリーズの最新版です。

 ChatGPTのWebページの「GPT-4」をクリックして、「DALL・E 3」を選択しました。DALL-E3_setting_231029.png まず初めに「居眠りをしている豆柴犬」です。以前のブログで「豆柴」をAI側が理解できていなかったので「豆柴犬」としました。今回はバッチリですね。Qualityも高い。DALL-E 3の実力なのでしょうか??mame_shiba_231029.png
 次に「自律神経が落ち着く景色」を出してもらいました。今年は今もそうですが、公私共にいろんなことがあり、自律神経のバランスが非常に良くないです。ゆっくり休めていない感じでしょうか・・?。ChatGPTに労わってもらいましょう。landscape_231029.pngこれは「なかなかいい感じ」ですね。絵心のない私が言うのも変ですが、AIが書いた感じは避けられませんが、どこに出しても問題ないようなQualityです。

 この風景画を用いて、遊んでみようと思います。まずは、ルノアール風にアレンジしてもらいました。少しぼやけた感じ(語彙力がなくうまく表現できません・・)が出たように思いました。Renoir_231029.png次はゴッホ風です。これはタッチが素人にも分かりやすいですね。Gogh_231029.png最後に個人的に興味がある、東山魁夷風にしてもらいました。すごくいい感じですね。HigashiyamaKaii_1_231029.pngGPT4がどのタッチが好きかを聞いてきたので「東山魁夷だ」と答えると、サービスの画像を出力してくれました。これも味わいがあって良いです。HigashiyamaKaii_2_231029.png
 今回はDALL-E 3で楽しませてもらいました。次回は、ChatGPT4のプラグイン機能を使ってみようと思います。
スポンサーサイト



ChatGPT4を使う(4)

 今年の4月のブログでChatGPT4を有償で利用した内容のお話をしました。当時、画像とテキストの両方の入力を受け入れる「マルチモーダルモデル」が利用できるという触れ込みがあったので・・。ただし、機能実装がまだだったので、1か月で有償サービスを止めました。その後、BingやGoogle Bardに画像入力が導入されたのでそちらを利用していました。

 4月に初めてChatGPT4を試して半年が経ち、もう一度使ってみたいなと思い立ち、まず、①OpenAIのAPIか、②先日開通させたAzure OpenAIのAPIを利用しようと考えました。毎月$20払い続けるよりも、利用した分だけ請求される方が納得できますので。平日の日中は仕事で利用できず、土日が利用のメインなので、月3,000円(150円/ドル:直近円安進む・・)は正直な所、割高に感じます。

 まず、①のOpenAIのAPIについてですが、情報によると、GPT-4のAPIアクセスについて、以下の2点が記載されていました。ともに当てはまらずで断念しました。
 1. 2023年7月6日、1ドル以上の支払いを成功させたすべてのAPI ユーザーにGPT-4 API (8k) へのアクセスを許可しました。間もなくすべての開発者にアクセスを開放し、その後はコンピューティングの可用性に応じてレート制限の引き上げを開始する予定です。現在 GPT-4-32K API へのアクセスは許可されていませんが、後日利用可能になる予定です。
 2. 2023年8月18日以降に作成された API アカウントの場合、0.50 ドル相当以上のプリペイドクレジットを購入すると、すぐに GPT-4 にアクセスできるようになります。

 1.において、月1ドル以上利用すれば開放されるのかもしれませんが、試していないのでよく分かりません。また、「間もなくすべての開発者にアクセスを開放」と書かれていますが、一向に気配なしですね・・。2.については、8/18以前にAPIアカウントを作成していたので「NG」でした。中途半端な立場でがっかり。

 ②のAzure OpenAIのAPIですが、これもスムーズに行きませんでした。利用希望者が多く制限されている感ありです。そもそもGPT4を利用する際にはWait Listに申請が必要でしたが、直近は不要になっているはずで、GPT4_1_231029.pngJapan East(日本東部)にもモデルがあるとのことで、確認してみたのですが、GPT4_2_231029.pnggpt-4、gpt-4-32kはありませんでした。注意事項に書かれていた「入手可能性は限られています」に引っかかっているのでしょうね・・。Azure_East_Japan231029.png
 ネットを彷徨っていると、「GPT-4モデルの作成に利用できるカナダ東部、スウェーデン中部、スイス北部などの別の地域を使用することをお勧めします。」との情報を得ましたので、カナダ東部とスイス北部の2拠点で確認しました。結果は「GPT-4の環境をデプロイできましたが、実際動いているのはGPT4ではない。」でした。原因はよく分かりません。GPT_chat_231029.pngまだ、GPT4のAPI登録関係が流動的なのでしょうね。

 結局、最終的にはあきらめて、$20を出費することにしました。半年ぶりの課金です・・。楽に、Free Planから切り替え完了。ChatGPTPlusに変身!です。GPT4_Web_1_231029.pngエンジンも確かにGPT4ですね。これは本物ですね(ハルシネーション(嘘)がなければ・・)。GPT4_Web_2_231029.png有償利用期間中、じっくり使い込んで行こうと思います。

Webページの自動保存・送信システムを作る(2)

 前回の続きです。今回はRaspberry Piの中で実施している処理(Pythonプログラム)の詳細をお話しします。

Pythonプログラムのキーとなる部分は以下の2点です。
 1. Webページをpdfファイルにする技術
 2. メールを送受信する技術

1.については、pdfkitライブラリを用いました。このライブラリを利用する上で、同時にwkhtmltopdfライブラリもRaspberry Piにインストールしました。
pip3 install pdfkit
sudo apt-get install wkhtmltopdf
2.については、当初Gmailを使う方法を検討していましたが、最終的にoutlook(hotmail)を使うことにしました。以前はGoogleアカウント設定で「安全性の低いアプリ」として設定することでGmailのメールサーバーを外部アプリから利用することができましたが、2022/5/30にこの方法が廃止されたためです。安全性の低いアプリ_231022最近、ネット情報でGmailでも2段階認証を有効にしたら、アプリパスワードを使って、外部アプリからも利用できることを知りました。

以下、作成したPythonプログラムです。まとまりがないプログラムですが、エラーなく動作しています。
# ssmail.py
# Mail sender of the pdf file converted from the web page
import os
import sys
import pdfkit
import email, imaplib
import base64
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from pathlib import Path
import logging

# Mail registration information
username= os.environ['USERNAME'] # Outlook Mail
password= os.environ['PASSWORD'] # Outlook Mail
to_email= os.environ['TO_EMAIL']
cc_email= os.environ['CC_EMAIL']

# Log file setting
logging.basicConfig(
filename="MailSenderLog.txt",
level=logging.INFO,
format="%(asctime)s:%(levelname)s:%(message)s",
)

# Mail receive
# IMAP4 protocol setting and login
mail= imaplib.IMAP4_SSL("outlook.office365.com")
res = mail.login(username, password)
print(res)
logging.info(res)

# Target folder dxds set
resp_code, mail_count = mail.select(mailbox="dxds", readonly=False)
mail_count_int = int(mail_count[0])
print('Mail: '+ str(mail_count_int))
logging.info('Mail: '+ str(mail_count_int ))

if mail_count_int == 0: # No target mail
mail.logout()
sys.exit()

# Mail check
resp_code, mail_ids = mail.search(None, "ALL")
logging.info("Mail IDs : {}\n".format(mail_ids[0].decode().split()))

mail_id = '1'
logging.info("================== Start of Mail [{}] ====================".format(mail_id))
resp_code, mail_data = mail.fetch(mail_id, '(RFC822)') ## Fetch mail data.
message = email.message_from_bytes(mail_data[0][1]) ## Construct Message from mail data
logging.info("From : {}".format(message.get("From")))
logging.info("To : {}".format(message.get("To")))
logging.info("Bcc : {}".format(message.get("Bcc")))
logging.info("Date : {}".format(message.get("Date")))
logging.info("Subject : {}".format(message.get("Subject")))
logging.info("Body : ")
for part in message.walk():
if part.get_content_type() == "text/plain":
body_lines = part.as_string().split("\n")
logging.info("\n".join(body_lines[:12])) ### Print first 12 lines of message
logging.info("\n")
data_b64_dec = base64.b64decode(''.join(body_lines[3:]))
data_dec = data_b64_dec.decode('utf-8')
logging.info(data_dec.splitlines()[0]) # Target WebPage URL
logging.info("================== End of Mail [{}] ====================\n".format(mail_id))


# WebPage to PDF file
url = data_dec.splitlines()[0]
pdf_file = '/home/pi/prog/output.pdf'
try:
pdfkit.from_url(url, pdf_file)
logging.info(f'PDF file "{pdf_file}" is created.')
except Exception as e:
logging.info(f'Error occurred.: {str(e)}')

# Delete Message
mail.store(mail_id, '+FLAGS', r'\Deleted')
mail.expunge()
# IMAP4 close
mail.logout()

# mail sender
mail_title = 'DX paper'
message = '''
DX paper will be sent.
'''

# Create mail with MIME multipart
msg = MIMEMultipart()
msg['Subject'] = mail_title
msg['To'] = to_email
msg['From'] = username
msg['cc'] = cc_email
msg.attach(MIMEText(message))

# Load attachments
filepath =Path( '/home/pi/prog/output.pdf')
filename = filepath.name #filepath.stem
with open(filepath, 'rb') as f:
attach = MIMEApplication(f.read())
attach.add_header('Content-Disposition', 'attachment', filename=filename)
msg.attach(attach)

# Send a mail
smtp_host = 'smtp.office365.com'
smtp_port = 587
smtp_password = password

server = smtplib.SMTP(smtp_host, smtp_port)
server.starttls()
server.login(username, smtp_password)
server.send_message(msg)
server.quit()
まとまりのないプログラムの中身をChatGPTに解説してもらうと以下の通りです。

--- ChatGPT Comments From Here ---
このプログラムは、WebページからPDFファイルを生成し、生成されたPDFファイルをメールで送信するPythonスクリプトです。以下はプログラムの主要な部分の説明です。

1. モジュールのインポート:
- `os`, `sys`: システム操作と環境変数へのアクセスを提供するモジュール。
- `pdfkit`: WebページからPDFファイルを生成するためのライブラリ。
- `email`, `imaplib`: 電子メールの操作(受信)に関するライブラリ。
- `base64`: ベース64エンコードとデコードを行うライブラリ。
- `smtplib`: SMTPプロトコルを使用してメールを送信するためのライブラリ。
- `email.mime.text`, `email.mime.multipart`, `email.mime.application`: メールの構築に使用されるMIME(Multipurpose Internet Mail Extensions)関連のモジュール。
- `pathlib`: ファイルパス操作のためのユーティリティ。

2. メールの設定情報:
- `username`, `password`, `to_email`, `cc_email`: メールの認証情報と送信先、CC(カーボンコピー)のアドレスを環境変数から取得します。

3. ログファイル設定:
- `MailSenderLog.txt` ファイルにログ情報を書き込むための設定。

4. メール受信:
- IMAP4プロトコルを使用してOutlookメールに接続し、ログインします。
- 受信対象のメールを`dxds`フォルダから取得し、メールの数を取得します。

5. メールの取得:
- 受信対象のメールが存在する場合、最初のメール(メールID 1)を取得し、その内容を解析します。
- メールの送信元、送信先、日付、件名、本文などの情報をログに記録します。
- メールの本文からWebページのURLを抽出します。

6. WebページからPDFファイル生成:
- 抽出したWebページのURLを使用して、`pdfkit`を使ってPDFファイルを生成します。
- 生成されたPDFファイルは`/home/pi/prog/output.pdf`に保存され、ログに生成の成功またはエラーが記録されます。

7. メッセージの削除:
- メールの処理が完了したら、受信したメールを削除し、IMAP4接続を閉じます。

8. メール送信:
- PDFファイルを添付して、指定された送信先とCCアドレスにメールを送信します。
- SMTPプロトコルを使用してOutlookのSMTPサーバーに接続し、メールを送信します。

このプログラムは、Outlookメールアカウントを使用して特定のフォルダからメールを受信し、WebページをPDFファイルに変換して指定の受信者に送信するためのスクリプトです。プログラム内でログも記録され、エラーが発生した場合に問題のトラッキングが可能です。
--- ChatGPT Comments To Here ---

完璧な解説ですね! 以下、補足です。

2. メールの設定情報: プログラム16〜19行目
 前回お話しした通り、Raspberry Piでは、crontabで1日あたり、6:30、6:35、6:40の3回、このPythonプログラム(シェルプログラム)を実行しています。各種ファイルはRaspberry Piの「/home/pi/prog」フォルダに置きました。

DXpapersender.shの中でプログラム16〜19行目の変数を指定しています。中身は以下の通り。
#!bin/bash
cd /home/pi/prog/
export USERNAME="my_mail@hotmail.co.jp"
export PASSWORD="my_mail_password"
export TO_EMAIL="to_email@xxx.co.jp"
export CC_EMAIL="my_mail@hotmail.co.jp"
python3 ssmail.py
3. ログファイル設定: プログラム22〜26行目
メールサービスとPythonプログラムとのやりとりのログを記録するためのものです。以下、4. メール受信から6. WebページからPDFファイル生成までのログを取っています。
2023-10-12 06:30:02,671:INFO:('OK', [b'LOGIN completed.'])
2023-10-12 06:30:02,715:INFO:Mail: 4
2023-10-12 06:30:02,736:INFO:Mail IDs : ['1', '2', '3', '4']

2023-10-12 06:30:02,737:INFO:================== Start of Mail [1] ====================
2023-10-12 06:30:03,022:INFO:From : xxxx
2023-10-12 06:30:03,024:INFO:To : xxxx
2023-10-12 06:30:03,025:INFO:Bcc : None
2023-10-12 06:30:03,025:INFO:Date : Tue, 10 Oct 2023 20:14:38 +0000
2023-10-12 06:30:03,026:INFO:Subject : dxdx
2023-10-12 06:30:03,026:INFO:Body :
2023-10-12 06:30:03,030:INFO:Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

aHR0cHM6Ly9ub3RlLmNvbS9rb3VzZWluZW5fbm90ZS9uL25kNGRjYWVhOTNjY2Q/bWFnYXppbmVf
(中略)
LmNvbS9hcHAvZ29vZ2xlL2lkMjg0ODE1OTQyPuOBp+WFseacieOBl+OBvuOBl+OBnw0KDQoNCuW4
uOWyoQ0K

2023-10-12 06:30:03,031:INFO:

2023-10-12 06:30:03,032:INFO:https://note.com/xxxxxx

2023-10-12 06:30:03,033:INFO:================== End of Mail [1] ====================

2023-10-12 06:30:20,240:INFO:PDF file "/home/pi/prog/output.pdf" is created.
以後の流れは、ChatGPTの解説通りです。

 今回はRaspberry Piの中で実施している処理(Pythonプログラム)の詳細をお話しました。ChatGPTにプログラムの中身を解説してもらいましたが、うまく説明できていて驚きでした。ChatGPTにプログラムを書いてもらうのも良いですが、こういう書かれたプログラムの解説のような使い方も良いですね。

Webページの自動保存・送信システムを作る(1)

 どこの会社でもSNSや個人ブログ等のWebページ閲覧が、不適切な内容が含まれている等の理由で、規制されていることがあると思います。その中で、最近のAI技術(LLM関連)を会社で調べていて、その技術が記載されているWebページ(ブログ)を見つけ、閲覧したかったのですが、ブロックされて結局タイムリーに閲覧できずじまい・・。
 業務に必要な場合は会社の情シス部門に事情を話して、内容によっては開放してくれるのですが、ドメイン単位でしか開放できないとのこと・・。今回の私の求めている内容は適切な内容ですが、同一ドメインの中に私が全く興味のない不適切な内容も含まれており、切り分けができないのでNGとのこと。万事休す・・。

 ただ、内心馬鹿馬鹿しくて納得が行かず、会社の業務で調べているのに本末転倒だなと強く考える中で、結局、自宅でそのWebページをpdfファイルにして、自宅のPCから自分の会社メールアドレス宛に添付メール送信するしかないなと考えました。
 会社の対応は、不真面目な社員が業務中に不適切なWebサイトを閲覧するのを避けたいのが目的なのでしょうが、私自身、毎日分刻みで仕事をしているので、そんな不適切なWebサイトを見に行く(現実は見れないですが・・)余裕もありません。
 いつもの長〜い前置き(愚痴)はその程度にして、成り立つ方法を以下の通り考えました。

設計思想は以下の通りです。
 1. 自宅(会社でない環境)で「端末A」を用いて、気になるWebページを確認する。
    ↓
 2. そのWebページのURLを「端末A」から「システムB」に知らせる。
    ↓
 3. その「システムB」のプログラムで、目的のWebページをpdfファイルにして「端末C」に知らせる。

今回の場合、実際の使用形態を想定して
 端末A: iPad
 システムB: Raspberry Pi + Pythonプログラム
 端末C: 会社のPC
で、知らせる手段は「メール」です。端末AとシステムBが一つにできればシンプルになるのですが、自分の使用形態を優先します・・。

実施例はこんな感じです。
1. 気になるWebページをiPadの「Googleアプリ」で確認し、右上の共有ボタン(四角形に上矢印のボタン)からメールを選択し、WebPageCheck_231022.png2. 目的のURLを、自動pdfファイル化処理を行うシステムB(端末はRaspberry Pi)にメール送信しました。この際、メールサービス側でこの自動処理用メールを識別するために件名を「dxdx」(仮)と固定件名としました。sendMail_231022.png送信されたメールは、Outlook(hotmail)で自分のメールとしてRaspberry Piで受信し、フォルダ仕分け(今回は「dxds」フォルダ)された状態で確認できます。recievedMail_231022.png3. Raspberry Piでは、crontabで1日あたり、6:30、6:35、6:40の3回Pythonプログラム(シェルプログラム)を実行するように仕込みました。crontab_sh_run_231022.png Raspberry Pi内のPythonプログラムでpdfファイルを作成した後に、会社PCに送付したメールは以下の通りです。画面はCcで自宅の個人メールアドレス宛に同時送信されたものです。output.pdfという形でWebページの内容が添付されます。finalRecievedMail_231022.png
  一連の実施した内容は以上の通りです。2.のRaspberry Piの中で実施している処理の詳細は次回お話しします。

Fitbitのデータを処理する(5)

 前回の続きです。今回は、睡眠に関する詳しいデータを眺めてみようと思います。前回、jsonファイルから変換されたcsvファイルを使って、必要な情報を寄せ集め、データセットを作成しました。
 前回のjsonファイルからデータセットに取り入れたデータ項目は以下の通りです。
dateOfSleep: 睡眠日
startTime: 睡眠開始日時
endTime: 睡眠終了日時
duration: 睡眠時間[msec]
minutesToFallAsleep: 睡眠までの時間
minutesAsleep: 睡眠時間
minutesAwake: 覚醒時間
minutesAfterWakeup: 覚醒後の時間
timeInBed: ベットにいる時間
efficiency: 効率
deep_count: 深い睡眠回数
deep_minutes: 深い睡眠時間[min]
wake_count: 覚醒回数
wake_minutes: 覚醒時間[min]
light_count: 浅い睡眠回数
light_minutes: 浅い睡眠時間[min]
rem_count: レム睡眠回数
rem_minutes: レム睡眠時間[min]
また、本シリーズの第二回でデータ分析したデータ項目と
STRESS_SCORE: ストレススコアの値。(補足:高いほどストレスが少ない)
SLEEP_POINTS: 睡眠成分の点数。(補足:高いほどストレスが少ない)
RESPONSIVENESS_POINTS: 反応性コンポーネントからのポイント。(補足:高いほどストレスが少ない)
EXERTION_POINTS: 反応性コンポーネントからのポイント。(補足:高いほどストレスが少ない)
第三回で分析したデータ項目も追加しました。
overall_score: 全体スコア
 overall_score = composition_score + revitalization_score + duration_score
composition_score: 深い睡眠とレム睡眠の構成スコア(25点満点)
revitalization_score: 回復スコア(25点満点)
duration_score: 睡眠スコア(50点満点)
deep_sleep_in_minutes: 深い睡眠時間[分]
resting_heart_rate: 前日の安静時の心拍数
restlessness: 寝返りを繰り返す状態の割合
分析に利用できる変数の数は26個です。

 まず、pandasaiで相関マトリックスを作成してもらいました。
import pandas as pd
from pandasai import PandasAI
from pandasai.llm.openai import OpenAI

# Instantiate a LLM
OPENAI_API_KEY = "My Openai Account"
llm = OpenAI(api_token=OPENAI_API_KEY)
pandas_ai = PandasAI(llm)

df = pd.read_csv('sleep-detail.csv') # dataset read
column_names = df.columns.tolist()
print(column_names)

#0. 以下の列名のデータ間の相関マトリックスグラフを書いてください。'duration, minutesToFallAsleep, minutesAsleep, minutesAwake, minutesAfterWakeup, timeInBed, efficiency, deep_count, deep_minutes, wake_count, wake_minutes, light_count, light_minutes, rem_count, rem_minutes, STRESS_SCORE, SLEEP_POINTS, RESPONSIVENESS_POINTS, EXERTION_POINTS, overall_score, composition_score, revitalization_score, duration_score, deep_sleep_in_minutes, resting_heart_rate, restlessness'
pandas_ai(df, prompt='Write a correlation matrix graph between the data in the following column names. duration, minutesToFallAsleep, minutesAsleep, minutesAwake, minutesAfterWakeup, timeInBed, efficiency, deep_count, deep_minutes, wake_count, wake_minutes, light_count, light_minutes, rem_count, rem_minutes, STRESS_SCORE, SLEEP_POINTS, RESPONSIVENESS_POINTS, EXERTION_POINTS, overall_score, composition_score, revitalization_score, duration_score, deep_sleep_in_minutes, resting_heart_rate, restlessness')
結果は以下の通りです。Fitbit_Matrix.pngこの相関マトリックスから私が主に読み取れたのは以下の3点です。
① 睡眠時間(duration)に関連している変数で睡眠時間と各変数は正相関がある。
  例) timelnBed(1.00)、minutesAsleep(0.99)、rem_minutes(0.73)、light_minutes(0.65)、wake_count(0.63)
② 寝返りを繰り返す回数(restlessness)が増えると睡眠の効率(efficiency)が下がる。
  例) restlessness(-0.64:寝返りを繰り返す状態の割合)
③ 深い睡眠:deep、覚醒:wake、軽い睡眠:light、レム睡眠:remの間にも関係が見られる。
  例) deepとrem(0.44)、wakeとlight(0.31)、light_count(0.49)

 このデータセットから読み取れる内容をChatGPTに確認すると、以下の回答がありました。

『提供されるデータには、さまざまな日付のさまざまな睡眠関連変数が含まれています。いくつかの主要な変数間の関係を分析してみましょう。

1. 期間と効率:
睡眠時間(duration)と睡眠効率(efficiency)の間には正の関係があるようです。睡眠時間が長くなるほど、睡眠効率も高くなる傾向があります。
2. 睡眠時間と就寝時間:
睡眠に費やした合計時間(minutesAsleep)とベッドで過ごした合計時間(timeInBed)の間には、正の関係があると予想されます。一般的に、ベッドにいる時間が長いほど、睡眠時間は長くなります。
3. 深い睡眠と全体的な睡眠スコア:
深い睡眠の変数(deep_countおよびdeep_minutes)は、全体的な睡眠スコア(overall_score)に寄与する可能性があります。深い睡眠の量が多いほど、全体的な睡眠スコアが向上する可能性があります。
4. 安静時の心拍数と睡眠の質:
安静時の心拍数(resting_heart_rate)は睡眠の質と逆相関がある可能性があります。安静時の心拍数が高い場合は、睡眠の質が低いことを示している可能性があります。
5. ストレススコアと睡眠の質:
ストレス スコア(STRESS_SCORE)と睡眠の質の間には関係がある可能性があります。ストレススコアが高いほど、睡眠の質が低いと相関する可能性があります。
6. 落ち着きのなさと睡眠の質:
この変数はrestlessness睡眠の質に関連している可能性があります。落ち着きのなさが高いほど、睡眠の質が低下する可能性があります。

これらは変数間の潜在的な関係に基づいた一般的な観察であることに注意することが重要です。より詳細な洞察や統計分析を提供するには、相関係数や回帰分析などのより高度な技術を使用できます。』

より詳細な分析がChatGPTでも実施できていますね。恐るべしです。データ分析の初期調査に利用しない手はありませんね。次回は、深い睡眠:deep、覚醒:wake、軽い睡眠:light、レム睡眠:remの間の関係についてもう少し深掘りしようと思います。

Fitbitのデータを処理する(4)

 前回から時間が空いてしまいました・・。前回は、睡眠のデータを詳しく見てきて、その質(スコア)が「前日の安静時の心拍数」や「寝ている時の寝返りを繰り返す割合」にも関係しているような知見が得られました。今回は睡眠に関する詳しいデータを眺めてみようと思います。

 Fitbitの詳しい睡眠データはダウンロードしたデータファイルの中に、1か月単位のjsonファイル(sleep-YYYY-MM-DD.json)に保存されていました。このjsonファイルの構造が分かりにくかったので、ChatGPTに聞いてみました。ちなみにjsonファイルの中身はこんな感じです。
[{
"logId" : XXXXXXXXXX,
"dateOfSleep" : "2023-08-10",
"startTime" : "2023-08-09T22:52:30.000",
"endTime" : "2023-08-10T04:51:00.000",
"duration" : 21480000,
"minutesToFallAsleep" : 0,
"minutesAsleep" : 317,
"minutesAwake" : 41,
"minutesAfterWakeup" : 0,
"timeInBed" : 358,
"efficiency" : 88,
"type" : "stages",
"infoCode" : 0,
"logType" : "auto_detected",
"levels" : {
"summary" : {
"deep" : {
"count" : 3,
"minutes" : 57,
"thirtyDayAvgMinutes" : 45
},
"wake" : {
"count" : 26,
"minutes" : 41,
"thirtyDayAvgMinutes" : 53
},
"light" : {
"count" : 21,
"minutes" : 171,
"thirtyDayAvgMinutes" : 186
},
"rem" : {
"count" : 8,
"minutes" : 89,
"thirtyDayAvgMinutes" : 79
}
},
"data" : [{
"dateTime" : "2023-08-09T22:52:30.000",
"level" : "wake",
"seconds" : 240
},{
"dateTime" : "2023-08-09T22:56:30.000",
"level" : "light",
"seconds" : 480
},
・・・
中略
・・・
{
"dateTime" : "2023-08-10T04:49:30.000",
"level" : "wake",
"seconds" : 90
}]
},
"mainSleep" : true
},{
"logId" : XXXXXXXXXX,
"dateOfSleep" : "2023-07-30",
"startTime" : "2023-07-30T13:07:30.000",
"endTime" : "2023-07-30T14:21:00.000",
"duration" : 4380000,
"minutesToFallAsleep" : 0,
"minutesAsleep" : 65,
"minutesAwake" : 8,
"minutesAfterWakeup" : 0,
"timeInBed" : 73,
"efficiency" : 89,
"type" : "classic",
"infoCode" : 2,
"logType" : "auto_detected",
"levels" : {
"summary" : {
"restless" : {
"count" : 2,
"minutes" : 8
},
"awake" : {
"count" : 0,
"minutes" : 0
},
"asleep" : {
"count" : 0,
"minutes" : 65
}
},
"data" : [{
"dateTime" : "2023-07-30T13:07:30.000",
"level" : "restless",
"seconds" : 60
},{
"dateTime" : "2023-07-30T13:08:30.000",
"level" : "asleep",
"seconds" : 2040
},{
"dateTime" : "2023-07-30T13:42:30.000",
"level" : "restless",
"seconds" : 420
},{
"dateTime" : "2023-07-30T13:49:30.000",
"level" : "asleep",
"seconds" : 1860
}]
},
"mainSleep" : false
}
]

 ChatGPT曰く、
添付されているJSONファイルは、特定の夜の睡眠データを含んでいます。以下に構造の説明を示します:

トップレベルの構造は、1つの辞書要素を含むリストです。

辞書内にはいくつかのキーと値のペアがあります:

"logId":睡眠ログの数値識別子。
"dateOfSleep":睡眠の日付("YYYY-MM-DD"形式)。
"startTime":睡眠の開始時刻("YYYY-MM-DDTHH:MM:SS.sss"形式)。
"endTime":睡眠の終了時刻("YYYY-MM-DDTHH:MM:SS.sss"形式)。
"duration":睡眠の期間(ミリ秒)。
"minutesToFallAsleep":眠りに落ちるのにかかった時間(分)。
"minutesAsleep":実際の睡眠時間(分)。
"minutesAwake":夜間の全体の覚醒時間(分)。
"minutesAfterWakeup":起床後の時間(分)。
"timeInBed":ベッドでの総時間(分)。
"efficiency":睡眠効率のパーセンテージ。
"type":睡眠データのタイプ(この場合は "stages")。
"infoCode":情報コード。
"logType":ログのタイプ(この場合は "auto_detected")。
"levels":睡眠ステージの概要と詳細データを含む辞書。
"mainSleep":メインの睡眠かどうかを示すブール値。
"levels"辞書内には2つのキーと値のペアがあります:

"summary":異なる睡眠ステージ(深い睡眠、覚醒、軽い睡眠、REM)の要約データを含む辞書。
"data":日付と時間を含む詳細な睡眠ステージのデータのリスト。
"summary"辞書内には、各睡眠ステージに対して4つのキーと値のペアがあります:

"count":この睡眠ステージのインスタンスの数。
"minutes":この睡眠ステージで過ごした合計時間(分)。
"thirtyDayAvgMinutes":この睡眠ステージの30日間の平均時間(分)。
"data"リストには、各辞書に以下のキーと値のペアが含まれています:

"dateTime":睡眠ステージの測定の日時("YYYY-MM-DDTHH:MM:SS.sss"形式)。
"level":睡眠ステージのレベル("wake"、"light"、"deep"、または"rem")。
"seconds":特定の睡眠ステージで過ごした秒数。
 jsonファイルの中身の構造を丁寧に教えてもらえました。記録データには、睡眠タイプが2種類あり、一つは「通常の睡眠」ともう一つは「昼寝等の短い睡眠」で、mainSleepというBool値で前者はTrue、後者はFalseで区別できることが分かりました。また、前者の通常の睡眠には異なる睡眠ステージ(深い睡眠:deep、覚醒:wake、軽い睡眠:light、レム睡眠:rem)、後者の昼寝等の睡眠にはrestless、awake、asleepのステージがあることが分かりました。

 jsonファイルの構造が理解できたので、次にそのjsonファイルから必要な情報のみを可読性の良いcsvファイルに出力するPythonプログラムを生成AIに作ってもらいました。ChatGPT、bing、Bardの三者に確認しましたが、Bardが一番賢い回答を返してくれました。以下、そのプロンプトです。
以下のjsonファイルからcsvファイルを作成するPythonプログラムを作成してください。

csvファイルに出力する項目と順番は以下の通りです。
dateOfSleep, startTime, endTime, duration, minutesToFallAsleep, minutesAsleep,minutesAwake, minutesAfterWakeup,timeInBed, efficiencyに続いて、levelsのsummaryについては、以下のルールで分けて、項目名を作成してください。

ルール:
deepをdeep_count, deep_minutes, deep_thirtyDayAvgMinutesの3項目、
wakeをwake_count, wake_minutes, wake_thirtyDayAvgMinutesの3項目、
lightをlight_count, light_minutes, light_thirtyDayAvgMinutesの3項目、
remをrem_count, rem_minutes, rem_thirtyDayAvgMinutesの3項目、
restlessをrestless_count, restless_minutesの2項目、
awakeをawake_count, awake_minutesの2項目、
asleepをasleep_count, asleep_minutesの2項目

jsonファイル:
前述のjsonファイルをコピー
Bardの回答の一部を修正したプログラムは以下の通りです。修正箇所は
 ① 11〜36行目のwriter.writerowの項目名の追加・削除
 ② 54〜62行目のfor文内に睡眠のタイプを分けるif〜else文を追加
です。ほぼ完璧なコードでした!
import csv
import json

def create_csv(json_file, csv_file):
with open(json_file, "r") as f:
data = json.load(f)

with open(csv_file, "w", newline="") as f:
writer = csv.writer(f)
# ヘッダー行を作成
writer.writerow([
"dateOfSleep",
"startTime",
"endTime",
"duration",
"minutesToFallAsleep",
"minutesAsleep",
"minutesAwake",
"minutesAfterWakeup",
"timeInBed",
"efficiency",
"deep_count",
"deep_minutes",
"wake_count",
"wake_minutes",
"light_count",
"light_minutes",
"rem_count",
"rem_minutes",
"restless_count",
"restless_minutes",
"awake_count",
"awake_minutes",
"asleep_count",
"asleep_minutes"
])

for entry in data:
# 各項目をcsv行に変換
row = []
row.append(entry["dateOfSleep"])
row.append(entry["startTime"])
row.append(entry["endTime"])
row.append(entry["duration"])
row.append(entry["minutesToFallAsleep"])
row.append(entry["minutesAsleep"])
row.append(entry["minutesAwake"])
row.append(entry["minutesAfterWakeup"])
row.append(entry["timeInBed"])
row.append(entry["efficiency"])

# levelsのsummaryから項目を取得
for level_name, level_data in entry["levels"]["summary"].items():
if(entry["mainSleep"]):
row.append(level_data["count"])
row.append(level_data["minutes"])
else:
if(level_name =='restless'):
for i in range(8):
row.append('')
row.append(level_data["count"])
row.append(level_data["minutes"])

writer.writerow(row)

if __name__ == "__main__":
json_file = "sleep-2023-07-01.json"
csv_file = "sleep-2023-07-01.csv"
create_csv(json_file, csv_file)
 jsonファイルの構造の解読からcsvファイルへの出力まで生成AIを使って、労力なく処理することができました。データの前処理も終わりましたので、次回は、本丸のデータ分析を行いたいと思います。

XBB対応ワクチンを打つ

 XBB.1.5対応ワクチンの案内が自治体から郵送されてきたので、申し込んで一昨日(10/7)接種しました。コロナワクチンとしては5回目の接種です。コロナが5類になった後も、多くの知り合いがコロナ感染しましたが、私自身は現時点でコロナに感染していません(あるいは、感染していたが気づいていなかったかもしれません・・)。

 コロナワクチンの1回目、2回目の接種の頃(2年前)は、重症化すると命に関わるとのことで、多くの人が接種していたように思いますが、3回目、4回目と回を重ねるごとに、副反応に耐えられない等の理由で周囲の知り合いは接種していなかったですね。

 今回のXBB対応ワクチンについても、接種不要、健康な体にあえて副反応を起こすようなダメージを与えない方が良いという意見や、直近の変異株「EG.5(通称エリス)」にも効果があるので打った方が良いという意見等、賛否情報が飛び交っていますね。副反応の内容については厚生労働省のサイトに記載がありました。XBBワクチン副反応
 最終的には個人判断なので、私は接種(ファイザー)を選択しました。元々のどや扁桃腺等の呼吸系が弱いので、感染時のダメージが想像もつきません。少しでもダメージを小さくするために免疫を作っておくのは重要と思っています。

 10/7の朝9:30に接種しましたが、その日の昼頃から接種箇所の疼痛があり、夕方頃から熱はありませんでしたが、頭痛が発生。頭痛薬を飲んでその日は休みましたが、夜中頃から37度以上の発熱(最大37.5度)があり、翌10/8は1日中37度以上を維持し、頭痛も継続していました。解熱剤(頭痛薬)を飲んで一時的に熱は下がり、頭痛も治りますが、薬の効果が切れると元通りを繰り返しました。

 昨日(10/8)は薬を飲んで床に入りましたが、今朝(10/9)目が覚めると熱も引いて、頭痛もなくなっていました。副反応が1日で済んで良かったと思います。更なる変異株が発生せずに、6回目の接種がないことを強く祈ります。

Azure OpenAIを使う(2)

 前回の続きです。今回は、Azure OpenAI StudioでChatGPTが利用できる環境を構築します。

 作成したAzure OpenAIのリソースにおいて、「Explore」をクリックすると、AzureOpenAI_setup7.pngAzure OpenAI Studioが立ち上がりました。何も環境構築していないデフォルトの画面を確認してみましょう。
 PlaygroundのChat画面です。Deployしていないので空です。AzureOpenAI_setup8-0.png次にPlaygroundのCompletions画面です。これもDeployしていないので空です。AzureOpenAI_setup8-1.pngDALL-E(Preview)は、East USリージョンのみ利用可のようですね。AzureOpenAI_setup8-2.png次にManagementのDeploymentsです。AzureOpenAI_setup8-3.pngModelsです。3種類のモデルがデプロイ可能であることが分かりました。AzureOpenAI_setup8-4.pngData filesも空状態です。AzureOpenAI_setup8-5.pngQuotas(割り当て)です。それぞれ300TPM(Tokens-per-Minute)分の割り当てがあるようですね。AzureOpenAI_setup8-6.png最後はContent filters(Preview)です。AzureOpenAI_setup8-7.png
 デフォルト画面を確認できたので、本題のChatGPTが利用できる環境を構築します。
 まず、Deploymentsから「Create new deployment」を選択しました。AzureOpenAI_deploy1.png次に以下の設定を行い、Createボタンを押しました。
 Select a model: gpt-35-turbo
 Deployment Name: GPT35Turbo (自由に設定可能)
 Content Filter: DefaultAzureOpenAI_deploy2.pngしばらく待つと、デプロイが完了しました。ChatGPT3.5が使える状態になりました。AzureOpenAI_deploy3.png早速PlaygroundのChat画面を確認すると、Azure OpenAIのChatGPTが正常に動作することを確認できました。AzureOpenAI_deploy4.png次に、PythonのプログラムでAPIを使って動作確認しました。AzureOpenAI_deploy5.pngコマンドラインで実行させても、問題なさそうですね。AzureOpenAI_deploy6.png
 今回は、Azure OpenAI StudioでChatGPTが利用できる環境を構築し、問題なく動作することを確認しました。今後、Azure OpenAIの環境で試すべく案件の調査を継続して行いたいと思います。

Azure OpenAIを使う(1)

 OpenAI環境のChatGPTは自宅で利用していますが、会社で利用しているのはAzure OpenAI環境のChatGPTです。会社の環境で試してみたいことがたくさんあるのですが、環境構築等は情報システム部門が管理しているので、一般の社員の私は触ることができません。そこで自宅で自分のAzureのOpenAI環境を作ろうと思い立ちました。

 Azure OpenAIは許可制で、ターゲットが法人と認識しており、個人ユーザでは登録ができないと、今までずっと思っていました。ところが、やってみると問題なく登録できました。今回はその備忘録です。まずはSetupまでお話します。

 Azure PortalからAzure OpenAIの環境構築する際にまず、専用サイトから事前申し込みを行いました。
 申し込みサイトには21件の質問事項がありました。サービスを悪用されないためなのでしょうが、利用者の所属する会社も含めて入念に調べられますね・・。入力時の注意点と入力内容は以下の通り。
① 個人の電子メールアドレス(例: gmail.com、hotmail.com、Outlook.comなど)の使用不可。
  → 会社のメールアドレスではなく、個人契約のプロバイダの個人メールアドレスを設定。
② 会社について、社名、住所、郵便番号、Webサイト、電話番号まで事細かく入力要。
  → 秘密情報ではなく、WebサイトでOpenになっているので、所属する会社の情報を入力。
③ 申請は貴社自身のためのものであり、顧客に代わって申請するものではないことを念押し。
  → 私自身の組織(My own organization)を選択

 最後まで入力し、申し込みを送信すると、以下のメッセージが表示されました。実際にうまく行ったのか不明でしたが、「申し込みありがとう」と書いてあるので成功したのでしょう・・。AzureOpenAI_setup0.pngメールを確認すると、MicrosoftからAzure OpenAIのアクセスリクエストありがとうの旨のメールが届いていました。10営業日以内に連絡があるようですが、AzureOpenAI_setup0-1.png7時間後に、Azure OpenAIへようこそメールが届いていました。速っ!!AzureOpenAI_setup0-2.pngそれではAzure Portalでリソースを作成することにしましょう。

 すべてのサービスからAzure OpenAIを選択し、作成をクリックしました。AzureOpenAI_setup1.pngAzure OpenAIの作成の「①基本」において、以下の通り設定して「次へ」をクリックしました。
 リソースグループ: Azure-OpenAI (好きな名前入力可)
 リージョン: Japan East
 名前: Azure-OpenAI0 (好きな名前入力可)
 価格レベル: Standard S0AzureOpenAI_setup2.png「②ネットワーク」はそのまま「次へ」をクリック。AzureOpenAI_setup3.png「③タグ」もそのまま「次へ」をクリック。AzureOpenAI_setup4.png「④レビューおよび送信」で内容を確認後「作成」をクリックすると、デプロイが始まりました。AzureOpenAI_setup5.pngしばらく待つと、デプロイが完了しましたので「リソースに移動」しました。AzureOpenAI_setup6.png無事にリソースが作成されていることを確認しました。AzureOpenAI_setup7.png
 次回は、Azure OpenAI StudioでChatGPTが利用できる環境を構築します。

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: