女性エンジニアが増えている今だからこそ伝えたい！　生理についての分析結果

## はじめに
「1ヶ月のうち、元気にフル稼働できるのはたった1週間…これ、つらすぎません？」

PMSや体調不良で悩むみなさんに朗報です✨
世界のデータをもとに、生理周期を徹底分析してみました！
（※日本のデータではありません。個人差がありますが参考になれば嬉しいです😊）

辛い時期も、データからヒントを得て乗り越えましょう！

## kaggleデータセット

こちらのデータセット参考にしました。

https://www.kaggle.com/datasets/nikitabisht/menstrual-cycle-data/data




生理サイクルに関するさまざまな情報が含まれています。以下はそのいくつかの項目です。



| 項目名                                | 内容                                                                                   |
|-------------------------------------|----------------------------------------------------------------------------------------|
| **CycleNumber（サイクル番号）**       | 平均サイクル番号は約8で、範囲は1〜45です。                                             |
| **Group（グループ）**                | 0または1の二値で、多分対照群と治療群などを示しています。                                 |
| **CycleWithPeakorNot（ピークの有無）** | サイクルでピークが検出されたかを示し、ほとんどの値が1で、ピークが一般的であることを示唆しています。 |
| **ReproductiveCategory（リプロダクティブカテゴリ）** | 主に0が多く、9までの範囲がありますが、リプロダクティブステータスのカテゴリと思われます。 |
| **LengthofCycle（サイクルの長さ）**   | 平均サイクル長は約29日で、18日〜54日までの範囲です。                                    |
| **EstimatedDayofOvulation（排卵の推定日）** | 平均推定排卵日は約10日で、範囲は0〜23日です。                                         |
| **LengthofLutealPhase（黄体期の長さ）** | 平均黄体期の長さは約12日です。                                                         |
| **FirstDayofHigh（高温期の初日）**    | 高温期の最初の日は平均で約9日目です。                                                  |
| **TotalNumberofHighDays（高温期の日数）** | 平均の高温期日数は約4日です。                                                         |
| **TotalHighPostPeak（ピーク後の高温期合計）** | ピーク後の高温期日数は平均でごくわずかです。                                           |
| **TotalNumberofPeakDays（ピーク日数）** | ピーク日数は平均で約2日です。                                                          |
| **TotalDaysofFertility（受胎可能日数）** | サイクルごとの平均受胎可能日数は約8日です。                                            |
| **TotalFertilityFormula（受胎可能日数の計算値）** | 受胎可能日数とほぼ同じです。                                                           |
| **LengthofMenses（生理期間の長さ）**  | 生理期間の平均は約3日です。                                                            |
| **MensesScoreDayOne 〜 DayFive（生理スコア1〜5日目）** | 各日の生理スコアで、2日目が最も高くなっています。                                       |
| **TotalMensesScore（生理スコア合計）** | 各日の合計スコアで、平均は約8です。                                                    |
| **NumberofDaysofIntercourse（性交日数）** | サイクルごとの平均性交日数は約4日です。                                                |
| **IntercourseInFertileWindow（受胎可能期間での性交）** | 受胎可能期間に性交があったかどうかを示し、ほとんどが0です。                             |
| **UnusualBleeding（異常出血）**       | 異常出血はほとんどのサイクルで発生していないことを示しています。                        |





## 1. ヒストグラム_1
生理周期の長さ（LengthofCycle）の頻度分布を可視化しています。binsで周期の長さを区切り、データのばらつきや平均的な周期の傾向をつかむことができます。ここでは、周期がどのくらいの頻度で現れるかを確認することができます。

<details><summary>全体コードはこちら</summary>

```python:python

# Set font for macOS
if platform.system() == 'Darwin':
    plt.rcParams['font.family'] = 'Hiragino Sans'

# Drop missing values (if any)
df = df.dropna(subset=['LengthofCycle'])

# Create the histogram with adjusted size
plt.figure(figsize=(10, 6))  # Increase figure size
plt.hist(df['LengthofCycle'], bins=range(int(df['LengthofCycle'].min()), int(df['LengthofCycle'].max()) + 2), edgecolor='black')
plt.xlabel('Length of Cycle (Days)')
plt.ylabel('Frequency')
plt.title('Frequency Distribution of Cycle Length')
plt.xticks(range(int(df['LengthofCycle'].min()), int(df['LengthofCycle'].max()) + 1))
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
```
</details>


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/0da13687-c68e-4c5d-8e57-5e4315214866.png" width=80%>






## 2. ヒストグラム_2
生理期間の分布を確認できます。特に、10日、11日、15日のように少数のデータを目立たせるために、ビンの設定を工夫しています。これにより、生理期間の特徴的な傾向を掴むことができます。


<details><summary>全体コードはこちら</summary>

```python:python
import numpy as np
import matplotlib.pyplot as plt

# 'LengthofMenses' を数値型に変換
df['LengthofMenses'] = pd.to_numeric(df['LengthofMenses'], errors='coerce')

# LengthofMensesを昇順に並び替え
sorted_data = np.sort(df['LengthofMenses'].dropna())  # NaNがある場合を考慮してdropnaを使用

# 10, 11, 15を最後に持ってくるためにビンの幅を設定
bins = np.arange(sorted_data.min(), 15, 1)  # 15未満のビン
bins = np.concatenate([bins, [15, 16, 17]])  # 10, 11, 15を最後に設定

# ヒストグラムを表示
plt.hist(sorted_data, bins=bins, color='skyblue', edgecolor='black')
plt.title('Distribution of Length of Menses')
plt.xlabel('Length of Menses (days)')
plt.ylabel('Frequency')
plt.xlim(sorted_data.min(), sorted_data.max())
plt.show()

```

</details>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/32f889cb-a5c6-d8bb-0a93-03f40e9b2f49.png" width=80%>




## 3. 箱ひげ図
ピークの有無がサイクルの長さにどのように影響を与えるかを視覚的に示しています。これにより、ピークがあるサイクルとないサイクルの違いを比較することができます。


<details><summary>全体コードはこちら</summary>

```python:python
plt.figure(figsize=(4,5))
sns.boxplot(x='CycleWithPeakorNot', y='LengthofCycle', data=df, palette='Set2')
plt.title('Box Plot: CycleWithPeakorNot vs LengthofCycle')
plt.xlabel('CycleWithPeakorNot')
plt.ylabel('Length of Cycle (days)')
plt.show()
```
</details>


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/511a9e8e-4cdc-5412-946f-897bcb37c1f6.png" width=80%>





## 4. まとめ
みなさん、本当に頑張っています。だからこそ、無理せず、心にゆとりを持って進みましょう。

水のように流れるままに、気の向くままに。
無理せず、自分らしく取り組んでいければそれが一番です✨