fc2ブログ

ブログアクセスログをスクレイピングする(3)

 久々にブログのアクセスログを集計してみようと思い立ち(いつもの思いつき・・)、2年ほど前のブログを参考にプログラムを動かしてみました。結論から言うと、以前Pythonプログラムから操作できていたWebページがセキュリティ強化のためか?動かず・・。万事休すの備忘録です。

 このブログ記事はブラウザにFirefoxを使いましたが、今回はChromeを使いました。ChromeDriverはブラウザバージョンに対応したものをネットから取得し、以下のプログラムと同じフォルダ内に保存しました。
from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import time
import csv

driver = webdriver.Chrome('./chromedriver')

username = "xxxxx@outlook.com"
password = "my password"

# Login Page
driver.get('https://fc2.com/ja/login.php?ref=blog')

login_username = driver.find_element(By.ID,"id")
login_username.clear()
login_username.send_keys(username)

login_password = driver.find_element(By.ID,"pass")
login_password.clear()
login_password.send_keys(password)

driver.find_element(By.CLASS_NAME, 'sh_login_ja').click() # Login button click
time.sleep(2)

login_password.submit()
time.sleep(3)
13行目を実行すると、Chromeがテストモードで立ち上がります。Chrome_auto_231126.pngその後、21行目まで実行すると、「メールアドレス/ブログID」と「パスワード」に必要事項が入力されました。Login_231126.png23行目の「ログイン」の画像ボタンを押すと、問題なければ管理画面にページが飛ぶのですが、「メールアドレス/ブログID」と「パスワード」のテキストボックスの入力内容がクリアされ、ログインできない結果でした。
 何度やっても結果は同じでした。また、ログインボタンを押す操作だけ、手動でやっても、管理画面にログインできませんでした。セキュリティが変わったのか、自動でログインできなくなったのかなと思いながらも、念のため、ブラウザをEdgeに変更して再トライしました。

 Edgeのdriver(Mac用のmsedgedriver)もネットから取得し、以下のプログラムと同じフォルダ内に保存しました。Edge_driver_231126.png
from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import time
import csv

driver = webdriver.Edge('./msedgedriver')

username = "xxxxx@outlook.com"
password = "my password"

# Login Page
driver.get('https://fc2.com/ja/login.php?ref=blog')

login_username = driver.find_element(By.ID,"id")
login_username.clear()
login_username.send_keys(username)

login_password = driver.find_element(By.ID,"pass")
login_password.clear()
login_password.send_keys(password)

driver.find_element(By.CLASS_NAME, 'sh_login_ja').click() # Login button click
time.sleep(2)

login_password.submit()
time.sleep(3)
13行目を実行すると、Edgeがテストモードで立ち上がりました。Edge_auto_231126.png Chromeの場合と同様に、「メールアドレス/ブログID」と「パスワード」に必要事項が入力されましたが、結果は同じで、管理画面へログインできませんでした。手動でボタンを押しても同様でした。

 ブラウザを変えても同じ結果なので、ブラウザの問題ではなさそうです。手動でログインボタンを押してもNGなので、そもそもテストモードで管理画面にログインできないような仕様に変更になったのでしょう・・。以前は問題なく動いていたので・・。
 セキュリティ強化のために、自動でWebサイトを操作することが難しくなっていますね。個人的に利用するだけなのですが・・。頭を冷やして別の方法を検討しようと思います。
スポンサーサイト



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を使って、労力なく処理することができました。データの前処理も終わりましたので、次回は、本丸のデータ分析を行いたいと思います。

PandasAIを使う(3)

 PandasにChatGPTの機能を実装したPandasAIというライブラリをデータ分析に活用しようと模索しています。先月もスマートウォッチのFitbitのデータを処理するのに利用しました。このPandasaiは日々機能改善されているので、今回Updateしました。

 今まで利用していたライブラリのバージョンは「0.5.4」でした。pandasai_before_230917.png現在(23/09/17)の最新版は「1.2.2」です。pandasai_after_230917.png Update後、Update前に正常に動作していたプログラムを動かすと、以下のエラーが発生。Beautifulsoupをインストールしなさいとのこと。pandasai_run1_230917.png言われた通り、Beautifulsoupをインストールして、改めてプログラムを実行すると、以下の警告が発生。SmartDataframeクラスを利用しなさいとのこと。pandasai_run2_230917.pngネット情報を参考にして、最終的に正常に動いたプログラムは以下の通り。
import pandas as pd
from pandasai import SmartDataframe
from pandasai.llm import OpenAI

# Sample DataFrame
df = pd.DataFrame({
"country": ["United States", "United Kingdom", "France", "Germany", "Italy", "Spain", "Canada", "Australia", "Japan", "China"],
"gdp": [19294482071552, 2891615567872, 2411255037952, 3435817336832, 1745433788416, 1181205135360, 1607402389504, 1490967855104, 4380756541440, 14631844184064],
"happiness_index": [6.94, 7.16, 6.66, 7.07, 6.38, 6.4, 7.23, 7.22, 5.87, 5.12]
})

# Instantiate a LLM
llm = OpenAI(api_token="My key")

df = SmartDataframe(df, config={"llm": llm})
print(df.chat('Which are the 5 happiest countries?'))
結果が正しく表示されました。pandasai_run3_230917.png
 開発がホットな生成AI関連分野のライブラリは、日々の更新をウォッチしておかないとコールする関数が変わっていたりしますね。ChatGPTはともかく、ネット記事でも得られた情報の「新鮮度」を確認しつつ、利用しなくてはなりませんね。

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

 前回、自身の「ストレスの高低」が「睡眠の良し悪し」に依存していることが見えてきましたので、睡眠のデータを詳しく見ていこうと思います。

 データファイルを物色していると、sleep_score.csvという名前のファイルがあったので、内容を確認しました。変数の中身を調べると以下の通りでした。
・sleep_log_entry_id: 睡眠ログID
・timestamp: 起床日時

・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: 寝返りを繰り返す状態の割合

 今回もPandasAIを使って楽にデータファイルのデータを可視化しました。

検証したPythonプログラムは以下の通りです。
import pandas as pd
from pandasai import PandasAI
from pandasai.llm.openai import OpenAI

# Instantiate a LLM
OPENAI_API_KEY = "..MY OPENAI-KEY.."
llm = OpenAI(api_token=OPENAI_API_KEY)
pandas_ai = PandasAI(llm)

df = pd.read_csv('sleep_score.csv')
column_names = df.columns.tolist()
print(column_names)

#0. 列名'overall_score', 'composition_score', 'revitalization_score', 'duration_score', 'deep_sleep_in_minutes', 'resting_heart_rate', 'restlessness'のそれぞれについてヒストグラムを作成してください。
pandas_ai(df, prompt='Create a histogram for each of the column names overall_score, composition_score, revitalization_score, duration_score, deep_sleep_in_minutes, resting_heart_rate, restlessness, respectively.')

#1. 列名'overall_score', 'composition_score', 'revitalization_score', 'duration_score', 'deep_sleep_in_minutes', 'resting_heart_rate', 'restlessness'のデータの相関マトリックスを書いてください。
pandas_ai(df, prompt='Write a correlation matrix of the data for the column names overall_score, composition_score, revitalization_score, duration_score, deep_sleep_in_minutes, resting_heart_rate and restlessness.')

#2. 列名'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 of the data for the column names overall_score, composition_score, revitalization_score, duration_score, deep_sleep_in_minutes, resting_heart_rate and restlessness.')

#3. 列名duration_scoreに対し、列名overall_scoreをプロットしてください。
pandas_ai(df, prompt='Plot the column name overall_score against the column name duration_score.')

#4. 列名deep_sleep_in_minutesをX軸に、列名composition_scoreをY軸にプロットして、直線回帰分析してください。
pandas_ai(df, prompt='Plot the column name deep_sleep_in_minutes on the X-axis and the column name composition_score on the Y-axis, perform a linear regression analysis.')

#5. 列名resting_ heart_rateをX軸に、列名revitalization scoreをY軸にプロットして、直線回帰分析してください。
pandas_ai(df, prompt='Plot the column name resting_ heart_rate on the X-axis and the column name revitalization score on the Y-axis, perform a linear regression analysis.')

#6. 列名restlessnessをX軸に、列名revitalization_scoreをY軸にプロットして、直線回帰分析し、回帰式と相関係数をグラフの枠外に表示してください。
pandas_ai(df, prompt='Plot the column name restlessness on the X-axis and the column name revitalization_score on the Y-axis, perform a linear regression analysis.')

プログラムの実行結果は以下の通りです。
#0. ヒストグラム
hist1_230820.pngoverall_score(全体スコア)がcomposition_score(深い睡眠とレム睡眠の構成スコア)、revitalization_score(回復スコア)、duration_score(睡眠スコア)の3つの和であるという定義の元でデータを見ると、65から91の間に全体スコアが入っていますが、回復スコアと睡眠スコアが極端に悪い日もあることが分かりました。hist2_230820.pngdeep_sleep_in_minutes(深い睡眠時間)はデータの分布の形は良さげですが、深い眠りが0分に近いのは我ながら「まずい」のではないかと思いました。身に覚えがないので、何があったのでしょうか??また、resting_heart_rate(前日の安静時の心拍数)やrestlessness(寝返りを繰り返す状態の割合)が睡眠に及ぼす影響は何かあるのでしょうか?
 ヒストグラムを見る限り、分析ができないほど異常なものはなさそうなので、継続しました。

#1. 相関マトリックス
 相関マトリックスを書くようにPandasAIに指示すると(Write a correlation matrix)、グラフではなく値のみの表示でした。CorrelationMatrix_230820.png#2. 相関マトリックスグラフ
 改めて、相関マトリックスグラフを書くようにPandasAIに指示すると(Write a correlation matrix graph)、希望するグラフが出てきました。賢いです!CorrelationMatrixGraph_230820.png
#3. duration_scoreとoverall_scoreの関係
 #2のマトリックスの中で相関係数の0.92のduration_score(睡眠スコア)とoverall_score(全体スコア)の関係をプロットすると以下の通りで正の相関があります。OverallScore_vs_DurationScore_230820.png全体スコアは「深い睡眠とレム睡眠の構成スコア」と「睡眠スコア」と「回復スコア」の和で、かつ睡眠スコアは50点満点で他の2つのスコアが25点満点なので、全体スコアと睡眠スコアの相関が高いのも理解できます。

#4. deep_sleep_in_minutesとcomposition_scoreの回帰分析
 #3のプロンプトで「Aに対し(against)」のAがX軸側に来て欲しいのですが、PandasAIでY軸側に判断されたので、X、Y軸の変数を明確にしました。ついでに回帰分析も実行し、回帰直線も描画させました。深い睡眠時間が増加すれば「深い睡眠とレム睡眠の構成スコア」が増加するという結果です。相関係数は0.59でした。DeepSleepInMinutes_vs_CompositionScore_230820.png#5. resting_ heart_rateとrevitalization scoreの回帰分析
 resting_heart_rate(前日の安静時の心拍数)が高ければ、revitalization_score(回復スコア)も上がる結果です。相関係数は0.52でした。前日に活動的であれば、その日に寝て、翌日はその分、回復しているということなのでしょうね。RestingHeartRate_vs_RevitalizationScore_230820.png#6. restlessnessとrevitalization_scoreの回帰分析
 寝ている間のrestlessness(寝返りを繰り返す状態の割合)が大きいと回復スコアが下がるという結果です。相関係数は-0.44です。寝苦しいと疲れが取れないということなのでしょうね。Restlessness_vs_RevitalizationScore_230820.png
 今回は、睡眠のデータを詳しく見てきて、その質(スコア)が「前日の安静時の心拍数」や「寝ている時の寝返りを繰り返す割合」にも関係しているような知見が得られました。次回は睡眠に関する詳しいデータを眺めてみようと思います。

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

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

月別アーカイブ

メールフォーム

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