【Pythonデータ分析実践】気象APIで過去の天気データを取得・分析・可視化する全手順 🌤️
「去年の夏の、地元の平均気温の推移ってどうだったんだろう?」
「PythonでWeb APIからデータを取ってきて、グラフにするまでの一連の流れを知りたい!」
「データ分析のプロジェクトって、実際にどんなコードを書くの?」
こんにちは! Pythonプログラミング探検隊、隊長のPythonistaです! これまで私たちは、Pandasでデータを自在に操り、Matplotlibでその結果を可視化する強力なスキルを身につけてきました。今回は、それらの知識を総動員し、さらに外部のデータをリアルタイムで取得する、非常に実践的なプロジェクトに挑戦します!
今回のテーマは、「指定した場所と期間の過去の気象データを、無料のWeb APIから取得し、月ごとの平均値を計算してグラフで可視化する」という、データ分析の一連のパイプラインをゼロから構築することです。このプロジェクトを通して、あなたはPythonを使ったデータサイエンスのワークフローを、最初から最後まで体験することができます。さあ、Web上の膨大なデータから、意味のある洞察を導き出しましょう!
1. プロジェクトの概要と準備
1.1. 今回作るツールの機能
このスクリプトは、以下の機能を持つ一連のデータパイプラインです。
- 指定した地点(緯度・経度)と期間の、過去の気象データ(平均気温、平均湿度、平均風速)をWeb APIから取得します。
- 取得したデータを整形し、PandasのDataFrameとしてCSVファイルに保存します。
- 保存したCSVファイルを読み込み、月ごとの平均値を計算します。
- 計算結果をMatplotlibを使い、3つのグラフにまとめて可視化します。
1.2. データソース:Open-Meteo API
今回は、無料で利用でき、APIキーの登録も不要な、非常に使いやすい気象データAPIである「Open-Meteo」のHistorical Weather APIを利用します。
1.3. 必要なライブラリの準備
このプロジェクトでは、いくつかの外部ライブラリを使用します。ターミナルやコマンドプロンプトで、pipを使ってインストールしてください。
pip install numpy pandas matplotlib openmeteo-requests requests-cache retry-requests japanize-matplotlib
openmeteo_requests
: Open-Meteo APIと簡単にやり取りするための専用ライブラリ。requests_cache
: 一度取得したAPIの応答をキャッシュし、次回以降の実行を高速化します。retry_requests
: ネットワークエラーなどでリクエストが失敗した場合に、自動で再試行してくれます。japanize-matplotlib
: Matplotlibで日本語を簡単に表示するためのライブラリです。
2. スクリプトの全体像(完成コード)
まずは、今回作成するスクリプトの全体像を見てみましょう。このコードをweather_analyzer.py
のようなファイル名で保存してください。各部分の詳しい解説はこの後でじっくり行います。
3. コードの仕組みを徹底解説!
このスクリプトは、大きく分けて「データ取得・保存」と「分析・可視化」の2つの関数で構成されています。
3.1. パート1:気象データの取得と保存 (get_and_save_weather_data
関数)
この関数が、APIからデータを取得し、扱いやすいCSVファイルとして保存するまでを担当します。
・堅牢なAPI通信の設定
cache_session = requests_cache.CachedSession('.cache', expire_after=-1)
retry_session = retry(cache_session, retries=5, backoff_factor=0.2)
openmeteo = openmeteo_requests.Client(session=retry_session)
ここでは、単にリクエストを送るだけでなく、requests_cache
で一度取得したデータをキャッシュ(一時保存)し、retry_requests
で通信エラー時に自動で再試行するように設定しています。これは、安定したデータ収集を行うためのプロフェッショナルなテクニックです。
・【重要】APIからの応答データを整形する
# APIの応答から、開始日時、終了日時、時間間隔を取得
start_time = pd.to_datetime(daily.Time(), unit="s", utc=True)
# ... (中略) ...
# 連続した日付の配列を生成
date_range = pd.date_range(start=start_time, end=end_time, freq=interval, inclusive="left").tz_convert(timezone)
# 正しい日付配列を使ってデータフレームを作成
weather_df = pd.DataFrame({ ... })
この部分がデータ整形の肝です。Open-Meteo APIは、日付情報と観測値の配列を別々に返します。そのため、APIが返すメタデータ(開始時刻、終了時刻、時間間隔)を元に、Pandasのpd.date_range()
関数を使って正確な日付のインデックスを自分で生成し、観測値のNumPy配列と組み合わせて一つのDataFrameを作成しています。タイムゾーンの変換(tz_convert
)も行い、より正確なデータを扱えるようにしています。
3.2. パート2:データの分析と可視化 (analyze_and_plot_data
関数)
この関数では、保存したCSVファイルを読み込み、分析・可視化を行います。
・月ごとの平均値を計算 (resample
)
df.set_index('date', inplace=True)
monthly_avg = df.resample('ME').mean()
Pandas入門シリーズでも学んだ、時系列データ処理の強力なメソッドresample()
を使っています。'ME'
は「月の最終日 (Month End)」を意味し、日々のデータを月単位のデータにまとめ直し、その平均値を計算しています。
・グラフの描画 (Matplotlib)
fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(12, 15), sharex=True)
# ...
axes[0].plot(...)
axes[1].plot(...)
axes[2].plot(...)
Matplotlibのサブプロット機能を使い、3つのグラフ(気温、湿度、風速)を縦に並べて描画しています。sharex=True
オプションにより、全てのグラフでX軸(時間軸)が共有され、比較しやすくなっています。
4. スクリプトの使い方と実行結果
- 上記の完成版コードを
weather_analyzer.py
として保存します。
- コード冒頭の
LATITUDE
, LONGITUDE
, START_DATE
, END_DATE
を、あなたが調べたい地点や期間に書き換えます。
- ターミナルを開き、必要なライブラリをインストールした後、スクリプトを実行します。
python weather_analyzer.py
- 最初にAPIからデータが取得されて
weather_data.csv
が作成され、その後、そのデータを元にしたグラフが表示されます。
このように、指定した地点の1年間の気象データの推移が一目で分かりますね!
5. まとめと【次回予告】GUIアプリ化への挑戦
今回は、Pythonを使った非常に実践的なデータ分析プロジェクトに挑戦しました。
- Web APIからデータを取得し (
openmeteo_requests
) - 取得した生データを整形し (
pandas
) - 月ごとに集計し (
resample
) - 結果をグラフで可視化する (
matplotlib
)
という、データサイエンスの基本的なワークフローを最初から最後まで一気通貫で体験することができました。様々なライブラリを連携させることで、これほど強力なツールが作れるというのは、Pythonの大きな魅力ですね。
さて、このスクリプトは非常に強力ですが、場所や期間を変えるたびにコードを直接編集する必要があります。これを、プログラミングを知らない人でも使えるように、ボタンや入力欄を持ったデスクトップアプリケーションにできたら、もっと便利だと思いませんか?
今後のブログでは、この「気象データ分析ツール」を、Tkinterを使って誰でも使えるGUIアプリケーションへと進化させるプロジェクトに挑戦するかもしれません! ぜひ、お楽しみに! その他の投稿はこちら
コメント
コメントを投稿