Pythonのデータサイエンス入門を学ぼう
プロローグ
ジャービス:「やあ、クルミくん。今日はデータサイエンスについて教えていこうと思うんだが...」
クルミ:「えっマジ!?データサイエンスって、なんかめっちゃ難しそうじゃない?あたし、正直数学とかプログラミングとか超ニガテなんだけど...」
ジャービス:「心配いらない。実際のデータを使って、一つ一つ丁寧に説明していこう。今日は地球温暖化の原因となるCO2(二酸化炭素)のデータを分析していくんだ。」
クルミ:「えー、マジ?地球温暖化やばくない?あたしたちの未来どうなっちゃうの?」
ジャービス:「その気持ち、とても大切だ。だからこそ、データを見て実際に何が起きているのか理解することが重要なんだよ。」
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}")
クルミ : 「データの前に英語文章が入っているんだ。それがあったら普通なPandasの.read_csv
で使わないと気がする」
ジャービス:「その通りです。上記のprint()
から61 列からデータが始まり、あそこまでにスキップすればいいです。実はpd.read_csv
ではskiprows
という列をスキップする変数があるんですよ」
df = pd.read_csv("monthly_in_situ_co2_mlo.csv", skiprows=61)
クルミ:「えっ待って!なんで61行スキップしてんの?超気になる~!」
ジャービス:「いい質問だね。実際のデータの前に説明文があるんだ。確認してみよう。」
df.head()
ジャービス:「問題を見ますね? 列のヘッダーは必の列ではなて、三つの列に占めています。」
クルミ:「えええ どうしょう」
ジャービス : 「簡単さ、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()
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)
# 欠損値を削除
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()
クルミ:「うわ~!右上がりじゃん!これやばくない?」
ジャービス:「その通りだ。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()
クルミ:「なになに?この箱みたいなのって何?」
ジャービス:「これは箱ひげ図って言って、データのバラつきを見るのに便利なんだ。箱の中に、データの半分くらいが入ってるんだよ。」
クルミ:「へー!夏の方が数値低くなってるね!まじで植物すごい!」
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()
クルミ:「うわ...マジやばくない?このままだと...」
ジャービス:「そうだね。だからこそ、データサイエンスは重要なんだ。数字で見ることで、問題の深刻さが理解できる。」
クルミ:「なんか、データサイエンス勉強して良かった!環境のこととか、前より全然わかるようになった!」
おわりに
ジャービス:「今日は基本的なデータ分析から、環境問題まで幅広く学んだね。」
クルミ:「うん!最初は難しそうって思ったけど、実際にデータ見ながらだと結構わかりやすかった!てか、これ友達にも教えたい!」
ジャービス:「それは素晴らしいね。データサイエンスの力で、世界をより良く理解できる。次回は...」
クルミ:「次回は絶対インスタのデータ分析やろうね!約束だよ!」
ジャービス:「(笑)分かった分かった。でも、その時もちゃんと統計的な考え方を使おうね。」
クルミ:「もちろん!あたし、データサイエンス女子になっちゃった?(笑)」
Discussion