私の人生の統計:1年間習慣を追跡し、これが私が学んだことです
「私の人生の統計:1年間の習慣追跡から得た教訓」
私は332日連続で日常活動(勉強、スポーツ、交流、睡眠など)に費やした時間を計測しました
なぜ?なぜこんなことをするのか?
これはおそらく私が人生で最も長く時間のかかる実験の一つです。さらに、それにはほとんど科学的な意義はありません – 人口サンプルはたった一人であり、非常に主観的です(完全に私の記憶と時間の認識に依存しています)。
ではなぜこんなことをするのでしょうか?ルーティン、自己責任の方法として、私にはさまざまな方法で役立っています。私は人生の低い時期にこれを始め、自分自身を研究し、異なる習慣が私の気分やメンタルヘルスにどのような影響を与えるかを調べました。ポイントは自分の脳を「ハック」できるようにすることでした。統計的に言えば、何が私を長期的に幸福で健康にし(逆に何がそうでないか!)、私の人生を改善し、困難な時期を経験している私と同様の人々にヒントや助けを提供することができるでしょう。
そして、なぜあなたにとってこれが重要なのでしょうか?
私はこの内省的なエクササイズがデータサイエンスがどんなことにも適用できる素晴らしい例だと考えています。もちろん、このようなトラッキングやジャーナリングである必要はありません。あなたが人生で価値あると思うものを研究することができます。ペットの行動を追跡したり、町の天気を調べたり、地元の公共交通システムの遅延率を調べたり…個人の分析の余地はたくさんあります:データがあれば、それを研究することができます!幸運なことに、データはどこにでもあります – ただ適切な場所を探し、追跡する必要があります。
メソッド – 私は何をし、どのようにそれを行ったのか?
毎日いくつかの分を割いて、自分がやったことに関する個人的なメモを取り、異なる活動やカテゴリーに費やした時間(時間単位)を記録しました。
- 「NASAのPower APIを使用して気候GPTを作成する」
- 「サム・アルトマンの疾風の週末:OpenAIからマイクロソフトへ」
- UCバークレーの研究者たちは、目標指向型の会話を革命化することを目指しています
測定した変数は年を通して少し変わりました。一部は新しく現れ、一部は消え、他の変数と統合しました。最終的に残った変数、およびすべての時間記録のデータを持つ変数は次のとおりです:睡眠、執筆、勉強、スポーツ、音楽、衛生、言語、読書、交流、気分 – 10個の変数で、私の人生の最も重要な側面をカバーしていると考えています。
データの初期探索
まず、睡眠、勉強、交流、気分の4つの変数について個別の時系列を調べました。Microsoft Excelを使用していくつかのプロットを簡単に描きました。これらは毎日過ごした時間(青)と移動平均¹(赤)を表しています。気分変数の評価は10(最高!)から0(ひどい!)までのスケールです。
各プロットに含まれるデータについての注釈に関して:合計はシリーズの値の合計、平均はシリーズの算術平均、標準偏差(STD)があり、相対偏差は平均を標準偏差で割ったものです。
あらゆる要素を考慮して、私の睡眠は十分に良かったと思います。 rough daysもありましたが、トレンドはかなり安定していると思います。実際、私の研究の中でも最も変動が少ないの一つです。
私が学問的なキャリアに捧げた時間をまとめました。変動が多いですが、仕事と勉強のバランスを取るために週末にプロジェクトを詰め込むことがしばしばありますが、それでも満足しています。
この表に関しては、ただ驚くばかりです。全体の合計時間は、私が内向的な性格だと考えると予想以上に多いです。もちろん、大学の同僚との時間も含まれます。変動性については、社交に関する確立されたルーティンが難しいため、標準偏差が非常に高いのは理にかなっています。
これは最も変動の少ない系列です。相対偏差は私の研究対象の中で最も低く、私はこれに満足しています。安定した気分を保つことは良いことだと思いますが、もちろん良い気分の場合はなおさらです。
相関研究
主要な変数の傾向を見た後、より詳しく調査し、それらの間の潜在的な相関²を研究することにしました。私の目標は「気分」を数学的にモデル化し予測(少なくとも説明)できることであり、相関は重要な指標でした。相関から次のような関係を抽出することができました。「私が最も勉強する日は、最も寝る時間が少ない日です」「通常は言語と音楽を一緒に勉強します」など。
他の何かを行う前に、Pythonファイルを開き、シリーズ分析のキーライブラリをインポートしましょう。実際のコードでは、エイリアスを使用することが一般的な慣例であり、冗長さを減らすのに役立ちます。
import pandas as pd #1.4.4
import numpy as np #1.22.4
import seaborn as sns #0.12.0
import matplotlib.pyplot as plt #3.5.2
from pmdarima import arima #2.0.4
相関に関する二つの異なる研究を行います。変数間の線形関係については、Pearson相関係数³を、変数間の単調関係についてはSpearman相関係数⁴を使用します。それらの実装⁵はpandasで行われています。
Pearson相関行列
2つの変数XとYのPearson相関係数は次のように計算されます:
すべての可能なペアワイズ相関が計算された相関行列を簡単に計算できます。
#データを読み込み、選択し、正規化する
raw = pd.read_csv("final_stats.csv", sep=";")
numerics = raw.select_dtypes('number')
#相関行列を計算する
corr = numerics.corr(method='pearson')
#ヒートマップを生成する
sns.heatmap(corr, annot=True)
#プロットを描画する
plt.show()
これは私のデータから得られた生のPearson相関行列です。
そして、これらは重要な値です⁶ – 95%の信頼度でゼロと異なるとされる値です。以下の式でt検定⁷を実行します。各相関値rhoについて、以下の条件を満たさない場合は破棄します:
ここで、nはサンプルのサイズです。以前のコードを再利用し、このフィルターを追加できます。
#constantsN=332 #サンプルの数STEST = 2/np.sqrt(N)def significance_pearson(val): if np.abs(val)<STEST: return True return False#データを読み込むraw = pd.read_csv("final_stats.csv", sep=";")numerics = raw.select_dtypes('number')#相関を計算corr = numerics.corr(method='pearson')#マスクを準備mask = corr.copy().applymap(significance_pearson)mask2 = np.triu(np.ones_like(corr, dtype=bool)) #上三角を除去mask_comb = np.logical_or(mask, mask2)c = sns.heatmap(corr, annot=True, mask=mask_comb)c.set_xticklabels(c.get_xticklabels(), rotation=-45)plt.show()
破棄されたものは単なるノイズであり、トレンドや関係を正しく表していない可能性があります。いずれにせよ、真の関係が意味を成さないと仮定する方が、意味のある関係ではないものを考慮するよりも望ましいです(これはエラータイプIIがエラータイプIよりも好まれるということです)。特に、主観的な測定を行う研究では特にそうです。
スピアマンの順位相関係数
スピアマンの順位相関係数は次のように計算できます:
前と同様に、相関行列を迅速に計算できます:
#データを読み込み、選択、正規化raw = pd.read_csv("final_stats.csv", sep=";")numerics = raw.select_dtypes('number')#相関行列を計算corr = numerics.corr(method='spearman') #この変更に注意!#ヒートマップを生成sns.heatmap(corr, annot=True)#プロットを表示plt.show()
これは私のデータから得られた生のスピアマン順位相関行列です:
実際に有意である値を見てみましょう。有意性を確認するための式は次のとおりです:
ここでは、絶対値が1.96より大きいすべてのt値をフィルタリングします。再び、破棄された理由は、ノイズ(ランダムチャンス)であるか、実際のトレンドであるかを確信できないからです。コードで表します:
# 332のサンプル数TTEST = 1.96def significance_spearman(val): if val==1: return True t = val * np.sqrt((N-2)/(1-val*val)) if np.abs(t) < 1.96: return True return False#データを読み込むdataraw = pd.read_csv("final_stats.csv", sep=";")numerics = raw.select_dtypes('number')#相関を計算corr = numerics.corr(method='spearman')#マスクを準備mask = corr.copy().applymap(significance_spearman)mask2 = np.triu(np.ones_like(corr, dtype=bool)) #上三角行列を除外mask_comb = np.logical_or(mask, mask2)#結果をプロットするc = sns.heatmap(corr, annot=True, mask=mask_comb)c.set_xticklabels(c.get_xticklabels(), rotation=-45)plt.show()
これらは有意な値です。
私はこのチャートの方が変数間の関係をより明確に説明していると思います。その基準はより「自然」であり、線形関数や関係だけでなく、単調増加または単調減少する関係も考慮しています。これは他のチャートほど外れ値の影響を受けません(特定の変数に関連する数日間の悪い日々は全体の相関係数に影響を与えません)。
それでも、読者に判断して独自の結論を導き出していただくために、両方のチャートを残しておきます。
時系列研究 – ARIMAモデル
このデータを時系列データとして扱うことができます。変数を説明する際に時間が重要な要素となることがあります。いくつかの変数は定期的に変動するか、自己相関を持つ可能性があります。たとえば、悪い夜の睡眠は翌日の過眠を引き起こす可能性があります-それは時間的な相関です。このセクションでは、初期の調査の変数に焦点を当てます。
ARIMA¹¹モデルを探索し、データに適した適合度を見つけましょう。ARIMAモデルは、自己回帰モデル(AR¹²)と移動平均を組み合わせたモデルのことを指します-そのためにその頭文字がARIMA(Auto Regressive Integrated Moving Average)です。この場合、モデルの係数を決定するために「pmdarima」の「auto_arima」メソッドを使用します。これはRの「forecast::autoarima」関数にインスピレーションを受けた関数です。
for v in ['Sleep','Studying','Socializing','Mood']: arima.auto_arima(numerics[v], trace=True) #結果を表示するためにtrace=Trueを指定
結果は次の表にまとめられています:
驚くべきことに、睡眠は自己回帰ではなく、気分はそうです!見るように、単純なARIMA(1,0,0) – AR(1) – は気分をかなりよく表しています。これは、D日の気分はD-1日または前日の気分と、通常分布されたノイズによって説明されることを意味します。
ささいに見えるかもしれませんが、この結果は十分に興味深いです。学習も自己回帰ですが、ARIMA(1,0,2)に従います-つまり、直接的なトレンドには従わず、移動平均に従います。ただし、この場合のAIC¹³はかなり高いため、モデルが観察された動作の説明を過度に複雑にしている可能性があります。
FFT – ファストフーリエ変換
データを分析するために離散フーリエ変換¹⁴を使用することができます。これにより、季節性に関連するパターンを認識することができます。フーリエ変換は、系列をその基本成分に分解することができるデータ変換演算です。これは以下の画像でよりよく理解できます:
以下は別の例です。周波数1および10の2つの正弦関数からなる信号を持っています。FTを適用した後、次のようになります:
結果は2つのピーク(x = 1およびx = 10)を持つプロットです。Fourier変換は、信号の基本成分を見つけ出しました!
これをコードに変換しましょう:
for v in ['Sleep','Studying','Socializing','Mood']: t = np.arange(0,N,1) x = numerics[v] X = np.fft.fft(x) n = np.arange(0,len(X),1) T = N freq = n/T plt.figure(figsize = (8, 4)) plt.subplot(121) plt.plot(t, x, 'r') plt.xlabel('Time (days)') plt.ylabel(v) plt.subplot(122) plt.stem(n, np.abs(X), 'b', markerfmt=" ", basefmt="-b") plt.xlabel('Freq (1/days)') plt.ylabel('FFT |X(freq)|') plt.xlim(0, 30) plt.ylim(0, 500) plt.tight_layout() plt.show()
ケーススタディに戻りますが、以下はコードが出力する結果です:
Sleepは周波数1で有意な値を持っていることがわかります。つまり、データは1日周期に従っていますが、これはあまり役に立ちません。Studyingも興味深い値を示しています。最初の5つほどは他の値よりも顕著に大きいですが、ノイズがそれらと他のグラフ全体に広がっていますので、確定的な結論は得られません。
これを補うために、移動平均でノイズを除去します。MA(5)を再度適用し、FFTを研究してみましょう。コードはほとんど同じですが、移動平均の部分だけが異なります。
def moving_average(x, w): return np.convolve(x, np.ones(w), 'valid') / wk = 5for v in ['Sleep','Studying','Socializing','Mood']: t = np.arange(0,N-k+1,1) x = moving_average(numerics[v], k) X = np.fft.fft(x) n = np.arange(0,len(X),1) T = N-k+1 freq = n/T plt.figure(figsize = (8, 4)) plt.subplot(121) plt.plot(t, x, 'r') plt.xlabel('Time (days)') plt.ylabel(v) plt.subplot(122) plt.stem(n, np.abs(X), 'b', markerfmt=" ", basefmt="-b") plt.xlabel('Freq (1/days)') plt.ylabel('FFT |X(freq)|') plt.xlim(0, 30) plt.ylim(0, 500) plt.tight_layout() plt.show()
以下は、コードによって生成されるグラフです:
MAを適用した後、ノイズはわずかに減少しました。それでも、これらから抽出できる結論はないようです — 重要な、明確な周波数値を見つけることはできません。
結論
さまざまな統計的研究を行った結果、予想通りの結論が得られました:人間の行動は非常に複雑であり、エクセルシートや数学モデルの限度を超えています。それでも、方法論に基づいたデータの収集とそれによって生じる分析の機会には価値があります。以下は私たちが行った内容の要約です:
- 生データと傾向線の概要。
- PearsonおよびSpearmanの相関分析と有意性検定。
- ARIMAモデルの適合。
- 高速/離散フーリエ変換の分解。
これらの分析を行った結果、データと異なる変数間の相関に関する洞察を得ることができました。以下は私たちの調査結果の要約です。
- 相対偏差(ばらつき)の観点から見ると、MoodとSleepは最も低い値(それぞれ11.3%、15.5%)であり、StudyingとSocializingはどちらも100%以上でした。
- Socializingは、ほとんどの趣味とは負の相関がありましたが、Moodとは正の相関がありました(PearsonとSpearmanの両方で)。これは、友人や家族と会うときに一日中趣味を脇に置かなければならないため、私は一人でいるよりも一般的に幸せです。
- MoodとWritingは、Spearmanの分析で負の相関があります。これは、私が時々短編小説や日記に自分の問題を吐露することによって説明されます。
- MoodとStudyingは、ARIMAモデルの適合研究によって自己回帰と判明しました。つまり、特定の日の値は前日の値によって説明できるということです。
- 離散フーリエ変換では明確な分解は見つかりませんでしたが、いくつかの周波数群が他の周波数群よりも突出していました。
興味深い「グローバル」統計情報も得られたことも注目に値します。科学的に意味があるかどうかはわかりませんが、知っておく価値はあります。
個人的には、この実験は私にとって役立ちました。最終的な結果が結論的ではないとしても、悪い時期を乗り越え、良い時期を記録するのに役立ったと思います。同様に、自己反省を行い、自分自身を少しでもよく知ることは常にプラスだと考えています。
最後に、これはすべての変数の累積チャートです — MS Excelで再作成されました — 累積変数は線形であっても、その変動する勾配のためにデータを見ることが難しくなるため、対数グラフとしてプロットしました。以上です!お楽しみください!
いつものように、お考えや疑問があればコメントしていただけると幸いです。
コードとデータは私のGitHubで入手できます。
GitHub – Nerocraft4/habittracker
GitHubに貢献するには、GitHubでアカウントを作成してください。
github.com
参考文献
[1] Wikipedia. 移動平均. https://en.wikipedia.org/wiki/Moving_average
[2] Wikipedia. 相関. https://en.wikipedia.org/wiki/Correlation
[3] Wikipedia. ピアソン相関係数. https://en.wikipedia.org/wiki/Pearson_correlation_coefficient
[4] Wikipedia. Spearmanの順位相関係数。 https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient
[5] Pandasドキュメント. pandas.DataFrame.corr. https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.corr.html
[6] Wikipedia. 統計的有意性。 https://en.wikipedia.org/wiki/Statistical_significance
[7] Wikipedia. スチューデントのt検定。 https://en.wikipedia.org/wiki/Student%27s_t-test
[8] Wikipedia. 順位相関。 https://en.wikipedia.org/wiki/Rank_correlation
[9] Wolfram MathWorld. 単調関数。 https://mathworld.wolfram.com/MonotonicFunction.html
[10] Wikipedia. 自己相関性。 https://en.wikipedia.org/wiki/Autocorrelation
[11] Wikipedia. 自己回帰和移動平均。 https://en.wikipedia.org/wiki/Autoregressive_integrated_moving_average
[12] Wikipedia. 自己回帰モデル。 https://en.wikipedia.org/wiki/Autoregressive_model
[13] Science Direct. 赤池情報量基準。 https://www.sciencedirect.com/topics/social-sciences/akaike-information-criterion
[14] Wikipedia. 離散フーリエ変換。 https://en.wikipedia.org/wiki/Discrete_Fourier_transform
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles