👋

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

に公開

プロローグ

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

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

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

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

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

image.png

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

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

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

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

ジャービス:「簡単に説明すると:

  • pandas: データを表にまとめて整理するツール
  • numpy: 計算を楽にしてくれるツール
  • matplotlib: グラフを描くためのツール
    だよ。」

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

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

ジャービス:「今日使うのは、ハワイのマウナロア天文台で測定された大気中のCO2濃度データだよ。」

クルミ:「ハワイ!?いいなー!でも天文台でなんでCO2測ってるの?」

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

📁 データの読み込み

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

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

# 最初の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

クルミ : 「データの前に英語文章が入っているんだ。それがあったら普通な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

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

クルミ:「えええ どうしょう」

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

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

3 🔍 データを理解しよう

📑 基本的なデータ確認

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

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

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

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

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

ジャービス:「一つずつ見ていこう:

  • head():最初の数行を見せてくれる
  • info():データの形や型を教えてくれる
  • describe():平均値や最大値など、重要な数値をまとめてくれる」

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

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

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

image.png

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

クルミ:「まじ!?データにも掃除が必要なんだ!あたしの部屋みたいね(笑)」

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

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

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

# 基本的な時系列プロット
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
クルミ:「うわ~!右上がりじゃん!これやばくない?」

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

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

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

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

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

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

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

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

クルミ:「マジで!?なんで?」

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

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

# 月別の箱ひげ図を作成
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
クルミ:「なになに?この箱みたいなのって何?」

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

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

7. トレンド分析:未来予測!?

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

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

# 年平均を計算して、トレンドを見る
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

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

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

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

おわりに

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

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

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

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

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

クルミ:「もちろん!あたし、データサイエンス女子になっちゃった?(笑)」

Discussion