7.Pythonのデータサイエンス入門を学ぼう

## プロローグ

ジャービス：「やあ、クルミくん。今日はデータサイエンスについて教えていこうと思うんだが...」

クルミ：「えっマジ！？データサイエンスって、なんかめっちゃ難しそうじゃない？あたし、正直数学とかプログラミングとか超ニガテなんだけど...」

ジャービス：「心配いらない。実際のデータを使って、一つ一つ丁寧に説明していこう。今日は地球温暖化の原因となるCO2（二酸化炭素）のデータを分析していくんだ。」

クルミ：「えー、マジ？地球温暖化やばくない？あたしたちの未来どうなっちゃうの？」

ジャービス：「その気持ち、とても大切だ。だからこそ、データを見て実際に何が起きているのか理解することが重要なんだよ。」


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999291/7e9b90ab-b60f-49f5-b017-3f008103ab7a.png)


## 1. 必要なツールを準備しよう！

ジャービス：「まずは分析に必要なツールをインポートするよ。」


```python
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
```

クルミ：「えっと、これって何するやつ？全部英語でわかんない...」

ジャービス：「簡単に説明すると：
- pandas: データを表にまとめて整理するツール
- numpy: 計算を楽にしてくれるツール
- matplotlib: グラフを描くためのツール
だよ。」

クルミ：「なるほど！パンダって可愛い名前！これならなんか親しみやすい！」


## 2  🌍 今回使うデータについて

**ジャービス**：「今日使うのは、[ハワイのマウナロア天文台](https://scrippsco2.ucsd.edu/data/atmospheric_co2/primary_mlo_co2_record.html)で測定された大気中のCO2濃度データだよ。」

**クルミ**：「ハワイ！？いいなー！でも天文台でなんでCO2測ってるの？」

**ジャービス**：「マウナロア山は標高が高く、地域の影響を受けにくいんだ。だから地球全体のCO2濃度を測るのに最適なんだよ。」


### 📁 データの読み込み

```python
# データのダウンロード
!wget https://scrippsco2.ucsd.edu/assets/data/atmospheric/stations/in_situ_co2/monthly/monthly_in_situ_co2_mlo.csv
```

**ジャービス**: 「最初にデータを確認しましょう」

```python
# 最初の100行を確認
with open("monthly_in_situ_co2_mlo.csv") as file:
    for i in range(100):
        line = file.readline()
        print(f"行{i+1}: {line}")
```

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999291/05a0b2c9-6406-4d0d-a8c1-0d3f067d6ca1.png)


**クルミ** : 「データの前に英語文章が入っているんだ。それがあったら普通なPandasの```.read_csv```で使わないと気がする」

**ジャービス**：「その通りです。上記の`print()`から61 列からデータが始まり、あそこまでにスキップすればいいです。実は`pd.read_csv`では`skiprows`という列をスキップする変数があるんですよ」

```
df = pd.read_csv("monthly_in_situ_co2_mlo.csv", skiprows=61)
```

クルミ：「えっ待って！なんで61行スキップしてんの？超気になる～！」

ジャービス：「いい質問だね。実際のデータの前に説明文があるんだ。確認してみよう。」

```
df.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999291/f055ff69-85ab-4f3f-adcf-d75b64ca9021.png)

**ジャービス**:「問題を見ますね？　列のヘッダーは必の列ではなて、三つの列に占めています。」

**クルミ**：「えええ　どうしょう」

**ジャービス**　: 「簡単さ、PandasのDFの```.key()```のモジュールを利用して、ヘッダーを直しましょう。そして、ヘッダーでは繰り返した情報があるので最初の6つのヘッダーだけ使いましょう。」

```python
header = df.keys().tolist()
print(header)
#['  Yr', ' Mn', '    Date', '      Date', '     CO2', 'seasonally', '        fit', '  seasonally', '      CO2', ' seasonally', ' Sta']
cleaned_header = [ col.strip() for col in header]
print(cleaned_header)
#['Yr', 'Mn', 'Date', 'Date', 'CO2', 'seasonally', 'fit', 'seasonally', 'CO2', 'seasonally', 'Sta']
cleaned_header[2]="Date Excel"
print(cleaned_header[:6])
# ['Yr', 'Mn', 'Date Excel', 'Date', 'CO2', 'seasonally']
```

**ジャービス**: 「」

```
df = pd.read_csv("monthly_in_situ_co2_mlo.csv",skiprows=64,names=cleaned_header[:6],usecols=cleaned_header[:6])
df.head()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999291/8bfa897f-6342-4b9e-a590-d30fdb641d3c.png)

## 3 🔍 データを理解しよう

### 📑 基本的なデータ確認

ジャービス：「では、読み込んだデータを確認していこう。」

```python
# データの最初の5行を表示
print("【データの先頭】")
print(df.head())

# データの基本情報
print("\n【データの基本情報】")
print(df.info())

# 基本統計量
print("\n【基本統計量】")
print(df.describe())
```

クルミ：「うわっ！なんかいっぱい数字出てきた！」

ジャービス：「一つずつ見ていこう：
- head()：最初の数行を見せてくれる
- info()：データの形や型を教えてくれる
- describe()：平均値や最大値など、重要な数値をまとめてくれる」


## 🧹　4. データのお掃除タイム！




ジャービス：「その通り！データの欠損値を確認して、きれいにしていこう。」

```python
# 欠損値チェック
df.isnull().sum()
# -99.99を欠損値として処理
df.replace(-99.99, np.nan, inplace=True)
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999291/359de2fe-8d84-4f0f-8bb9-a26aad3f2b4e.png)

```python
# 欠損値を削除
df.dropna(inplace=True)
```

クルミ：「まじ！？データにも掃除が必要なんだ！あたしの部屋みたいね（笑）」

## 5. グラフを描いてみよう！

クルミ：「ねぇねぇ、グラフとか作れないの？なんかインスタ映えしそう！」

ジャービス：「もちろん！様々なグラフが描けるよ。」

```python
# 基本的な時系列プロット
plt.figure(figsize=(12,6))
plt.plot(df["Date"], df["CO2"])
plt.title("CO2濃度の推移")
plt.xlabel("日付")
plt.ylabel("CO2濃度(PPM)")
plt.grid(True)
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999291/f2292ca1-748a-4347-a77d-6f4cc233d38e.png)
クルミ：「うわ～！右上がりじゃん！これやばくない？」

ジャービス：「その通りだ。CO2濃度は年々上昇している。具体的に計算してみよう。」

```python
# 年平均のCO2濃度を計算
yearly = df.groupby("Yr")["CO2"].mean()
a, b = np.polyfit(yearly.index, yearly.values, 1)
```

クルミ：「えっと...これは何してるの？」

ジャービス：「簡単に言うと、毎年どのくらいCO2が増えているか計算してるんだ。結果を見てみよう。」

```python
print(f"毎年のCO2増加量: {a:.2f} ppm/年")
```

クルミ：「まじやばくない？これって私たちの未来に関係あるよね？」

## 6. 季節ごとの変化を見てみよう！

ジャービス：「CO2濃度って、実は季節によっても変化があるんだ。」

クルミ：「マジで！？なんで？」

ジャービス：「植物が関係しているんだよ。春から夏にかけては植物が活発に光合成をして、CO2を吸収する。逆に秋から冬は...」

クルミ：「あ！植物が枯れちゃうから、CO2吸収されなくなるってこと？なんかスゴイ！季節で見れるの？」

```python
# 月別の箱ひげ図を作成
plt.figure(figsize=(12, 6))
df_clean.boxplot(column="Residual", by="Mn", grid=True)
plt.title("月別のCO2濃度変動♪")
plt.xlabel("月")
plt.ylabel("年平均からのズレ (PPM)")
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999291/19f862f1-1ee0-4fc5-8312-be3390d0c28f.png)
クルミ：「なになに？この箱みたいなのって何？」

ジャービス：「これは箱ひげ図って言って、データのバラつきを見るのに便利なんだ。箱の中に、データの半分くらいが入ってるんだよ。」

クルミ：「へー！夏の方が数値低くなってるね！まじで植物すごい！」


## 7. トレンド分析：未来予測！？

クルミ：「ねぇねぇ、このままいくと将来どうなるの？」

ジャービス：「いい質問だね。データから将来の予測もできるんだ。」

```python
# 年平均を計算して、トレンドを見る
yearly = df.groupby("Yr")["CO2"].mean()
future_years = np.arange(1958, 2050)
z = np.polyfit(yearly.index, yearly.values, 1)
p = np.poly1d(z)

plt.figure(figsize=(12,6))
plt.plot(yearly.index, yearly.values, 'o', label='実測値')
plt.plot(future_years, p(future_years), 'r--', label='予測')
plt.title("CO2濃度の未来予測...")
plt.xlabel("年")
plt.ylabel("CO2濃度(PPM)")
plt.legend()
plt.grid(True)
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999291/4008025b-ba9e-4b91-9176-d93000d640cc.png)


クルミ：「うわ...マジやばくない？このままだと...」

ジャービス：「そうだね。だからこそ、データサイエンスは重要なんだ。数字で見ることで、問題の深刻さが理解できる。」

クルミ：「なんか、データサイエンス勉強して良かった！環境のこととか、前より全然わかるようになった！」

## おわりに

ジャービス：「今日は基本的なデータ分析から、環境問題まで幅広く学んだね。」

クルミ：「うん！最初は難しそうって思ったけど、実際にデータ見ながらだと結構わかりやすかった！てか、これ友達にも教えたい！」

ジャービス：「それは素晴らしいね。データサイエンスの力で、世界をより良く理解できる。次回は...」

クルミ：「次回は絶対インスタのデータ分析やろうね！約束だよ！」

ジャービス：「（笑）分かった分かった。でも、その時もちゃんと統計的な考え方を使おうね。」

クルミ：「もちろん！あたし、データサイエンス女子になっちゃった？（笑）」