ぴよログのデータから育児のつらさを可視化してみた

## 背景
去年に子供が生まれてから育児をしているのですが、[ぴよログ](https://www.piyolog.com)というアプリで授乳やミルク・睡眠・おむつ交換などの記録しています。

ぴよログはエクスポート機能がついており、自分でデータ分析をすることもできます。
そこでデータ分析で育児のつらさを可視化することができるんじゃないかと思ってやってみました。

## 「育児のつらさ」のポイント
育児のつらさは成長度合いや時間帯ごとに色々とあります。
まとめると以下のようなポイントかなと思います。

- 夜に何回も起こされるので、寝不足になってつらい
- 何度も授乳して、体力的にしんどい（母乳は血液でできてるため、血が持っていかれる≒リアル鷲巣麻雀状態（？））
- はいはいするようになると、目が離せなくなって自由な時間なくなるのでつらい
- 離乳食が増えると、あげるのに手間がかかり、ストックを仕込む必要もあってつらい

夜に何回も起きる、目が離せなくなる（＝昼寝が減る）といった情報は睡眠（寝る／起きる）のデータから取得できそうです。
授乳や離乳食は食事（授乳／ミルク／離乳食）のデータを集計すればわかりそうです。

これらは赤ちゃんの成長（月齢）によって状況が変わるので、月齢別の推移をみることにしました。

## 集計対象
- 睡眠
  - 時間帯（昼／夜）別の睡眠時間、起きる回数
- 食事
  - 種類別（授乳／ミルク／離乳食）の回数、ミルク量、授乳時間

## データ取り込み
ぴよログのエクスポートデータはこんな感じになっています。

```
【ぴよログ】2020年1月

----------
2020/1/1(水)
なまえ (0歳0か月0日)

01:00   ミルク 30ml   
05:00   ミルク 30ml   
07:00   寝る   
07:30   起きる (0時間30分)   
07:35   母乳 左 5分 → 右 5分   
...中略...

母乳合計　　   左 23分 / 右 23分
ミルク合計　   10回 290ml
睡眠合計　　   7時間20分
おしっこ合計   5回
うんち合計　   5回

----------
2020/1/2(木)
...

```

ぴよログのデータを取り込むことは他の人もやっていたので、勝手ながら[ぴよログのエクスポートデータを見える化する](https://qiita.com/kaji-tan/items/e1d6b4893dca8708a9ad)からソースを拝借しました。ありがとうございます。

```py
# 対象データをリスト化
def get_piyolog_all_items(month_texts):
    all_items = []

    for month_text in month_texts:
        # 改行で分割
        lines = month_text.splitlines()
        array = np.array(lines)

        for index, item in enumerate(array):
            # 日付取得
            if item == '----------' and index < len(array) - 1:
                day = array[index + 1][:-3]
                day_date = datetime.datetime.strptime(day, '%Y/%m/%d')

            # 対象項目の場合
            if item != '' and check_item(item):
                # 空白で分割
                record = item.split()

                record_dt = datetime.datetime.strptime(day + ' ' + record[0], '%Y/%m/%d %H:%M')
                record_type = None
                record_subtype = record[1]
                record_value = None
                record_timespan = None

                if '寝る' in record_subtype:
                    record_type = '睡眠'

                if '起きる' in record_subtype:
                    record_type = '睡眠'

                if 'ミルク' in record_subtype or '搾母乳' in record_subtype:
                    record_type = '食事'
                    # 搾母乳も項目名はミルクにする
                    record_subtype = 'ミルク'
                    # 時間は10分固定にする
                    record_timespan = 10
                    # ミルク量
                    record_value = int(record[2].replace('ml', ''))

                if '母乳' in record_subtype:
                    record_type = '食事'
                    record_time = 0
                    # 授乳時間の合計を計算する
                    for r in record[2:]:
                        if '分' in r:
                            record_time += int(r.replace('分',''))
                    record_timespan = record_time
                            
                # 記録
                all_items.append([day_date, record_dt, record_type, record_subtype, record_timespan, record_value])

    return all_items
```

これをDataFrameに格納するとこんな感じになります。

||日付|日時|分類|項目|時間|ミルク量|
|---|---|---|---|---|---|---|
|0|2020/01/02|2020/01/02 01:00|食事|ミルク|10.0|30.0|
|1|2020/01/02|2020/01/02 05:00|食事|ミルク|10.0|30.0|
|2|2020/01/02|2020/01/02 07:00|睡眠|寝る|||||
|3|2020/01/02|2020/01/02 07:30|睡眠|起きる|||||
|4|2020/01/02|2020/01/02 07:35|食事|母乳|10.0|||

## データ加工
あとは集計できるようにデータを加工していきます。

### 睡眠時間
「寝る」から「起きる」の時間で睡眠になりますが、寝る時間を睡眠の基準時間にしたかったので降順でソートしてからdiffをとりました。

```py
# 睡眠時間
s_sleep_timespan = df.query('分類=="睡眠"').sort_values('日時', ascending=False).日時.diff() * -1
s_sleep_timespan.name = '睡眠時間'
df = pd.concat([df, s_sleep_timespan], axis=1)

# 睡眠時間(timedelta)を分に直す
def sleeptime_to_minutes(x):
    return x.睡眠時間.seconds / 60
df["睡眠時間"] = df.apply(lambda x:sleeptime_to_minutes(x),axis=1)
```

### 時間帯（昼・夜）
寝た時間が7:00～19:00の間のものは昼寝、それ以外を夜寝として扱いました。

```py
# 時間帯
def replace_time_zone(x):
    # 7:00～19:00の間に寝たものは昼寝とする
    if x.日時.hour >= 7 and x.日時.hour <= 18:
        return '昼'
    else:
        return '夜'
        
df['時間帯'] = df.apply(lambda x:replace_time_zone(x),axis=1)
```

### 月齢
誕生日から1ヶ月ごとに月齢をとります。

```py
# 誕生日
birth_date = datetime.datetime(2020, 1, 1)

# 月齢
month_old_list = []
for i in range(0,12):
    month_old_list.append([birth_date + relativedelta(months=i+1),i])
    
def replace_month_old(x):
    for month_old in month_old_list:
        if x.日付 < month_old[0]:
            return month_old[1]
        
df['月齢'] = df.apply(lambda x:replace_month_old(x),axis=1)
```

## 集計
あとは可視化したいデータを月齢単位で集計します。

- 1回単位
    - 夜寝の時間
    - 昼寝の時間
    - 授乳時間
    - ミルク量
- 1日単位（月齢単位で集計する前に1日単位で集計しておきます）
    - 夜に起きている回数・時間
    - 昼寝回数
    - 食事回数

[ソースはこちら](https://github.com/yakipudding/piyolog-analytics/blob/main/piyolog-analytics.ipynb)

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120823/cd26e537-c80a-dd38-8393-c9e8d1b9f650.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120823/0f16c419-d3b9-11ad-1202-cdba3df43284.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120823/fc059f09-1003-62bc-4763-d42e32a90f92.png)

## 考察
### 新生児期(0～1ヶ月)
夜間に何度も授乳(ミルク)が必要で親がまとまった睡眠がとれないため、夜はとても大変です。
昼寝時間も1回あたりの時間が短いため、親も昼寝したくてもまとまって寝れないので体力的につらいです。
昼も起きている時間は短くほぼベビーベッドで寝ているだけなので、ある程度目を離しても大丈夫です。
ほぼ一日中ミルクと授乳をしていて、体力的にかなりつらい時期です。。。

夜のつらさ　★★★★★★★
昼のつらさ　★★★★☆

### ねんね期(2～4ヶ月)
まだまだ夜間授乳が必要で睡眠不足が続きますが、新生児期よりはましになります。
1回あたりのミルク量が増えるので、1日のミルク回数が減ります。授乳時間は1回あたり・1日トータルともに短くなって、少し楽になります。
昼に起きているときもあまり動かないので、マットに転がしておいて少し目を離してもまだ大丈夫です。確か暇なときにリングフィットをやったりしていたので、結構余裕があったような気がします。

夜のつらさ　★★★★☆
昼のつらさ　★★☆☆☆

### 寝返り・おすわり期(5～7ヶ月)
夜間授乳が減って親がある程度まとまった睡眠がとれるようになるため、夜はやや楽になります。
夜の睡眠不足が解消されるため、昼寝時間を自由時間として使えるようになります。
昼に起きている時間が長くなってあやす必要がありますが、おもちゃで勝手に遊んでくれるので多少は目が離せます。ただし寝返りで移動したりおすわりが安定していない間は危ないです。
離乳食がはじまるため、ミルク・授乳は減ります。離乳食は準備と食べさせることに時間がかかるので、少し大変になります。

夜のつらさ　★★★☆☆
昼のつらさ　★☆☆☆☆

### はいはい期(8～10ヶ月)
夜間授乳がかなり減り親がまとまった睡眠がとれるようになるため、夜はかなり楽になります。
昼寝時間が長くなるため、ある程度まとまった自由時間ができるようになります。
起きている時間はかなり長くなりあやす必要があり、はいはいで移動するので目が離せなくなってきます。Eテレが神になります。
離乳食の回数が増えるため、ミルク・授乳ともにさらに減ります。離乳食の回数が増えると、準備やらなんやらでそこそこ忙しくなります。

夜のつらさ　★☆☆☆☆
昼のつらさ　★★☆☆☆

## 振り返り
結果はわかりきっていたことですが、育児データを数値化して可視化することで時期別の育児のつらさが改めてわかったと思います。

今回は育児のつらさを可視化するというネガティブな目的だったので考察が愚痴っぽくなってしまいましたが、もちろん育児は楽しいことも多いですし子供はとっても可愛いです！！！笑
ただ育児の楽しさはなかなかデータ化も数値化もしづらいので可視化は難しいですね。。写真がどんどん可愛くなる・・・といったくらいでしょうか。。

[全ソース](https://github.com/yakipudding/piyolog-analytics/blob/main/piyolog-analytics.ipynb)はGitHubにあげているので、ぴよログで記録をしている方はよかったらお試しください。