【Pythonデータ分析実践】気象APIで過去の天気データを取得・分析・可視化する全手順 🌤️

「去年の夏の、地元の平均気温の推移ってどうだったんだろう?」
「PythonでWeb APIからデータを取ってきて、グラフにするまでの一連の流れを知りたい!」
「データ分析のプロジェクトって、実際にどんなコードを書くの?」

こんにちは! Pythonプログラミング探検隊、隊長のPythonistaです! これまで私たちは、Pandasでデータを自在に操り、Matplotlibでその結果を可視化する強力なスキルを身につけてきました。今回は、それらの知識を総動員し、さらに外部のデータをリアルタイムで取得する、非常に実践的なプロジェクトに挑戦します!

今回のテーマは、「指定した場所と期間の過去の気象データを、無料のWeb APIから取得し、月ごとの平均値を計算してグラフで可視化する」という、データ分析の一連のパイプラインをゼロから構築することです。このプロジェクトを通して、あなたはPythonを使ったデータサイエンスのワークフローを、最初から最後まで体験することができます。さあ、Web上の膨大なデータから、意味のある洞察を導き出しましょう!


1. プロジェクトの概要と準備

1.1. 今回作るツールの機能

このスクリプトは、以下の機能を持つ一連のデータパイプラインです。

  1. 指定した地点(緯度・経度)と期間の、過去の気象データ(平均気温、平均湿度、平均風速)をWeb APIから取得します。
  2. 取得したデータを整形し、PandasのDataFrameとしてCSVファイルに保存します。
  3. 保存したCSVファイルを読み込み、月ごとの平均値を計算します。
  4. 計算結果を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. スクリプトの使い方と実行結果

  1. 上記の完成版コードをweather_analyzer.pyとして保存します。
  2. コード冒頭のLATITUDE, LONGITUDE, START_DATE, END_DATEを、あなたが調べたい地点や期間に書き換えます。
  3. ターミナルを開き、必要なライブラリをインストールした後、スクリプトを実行します。
    python weather_analyzer.py
  4. 最初にAPIからデータが取得されてweather_data.csvが作成され、その後、そのデータを元にしたグラフが表示されます。


このように、指定した地点の1年間の気象データの推移が一目で分かりますね!


5. まとめと【次回予告】GUIアプリ化への挑戦

今回は、Pythonを使った非常に実践的なデータ分析プロジェクトに挑戦しました。

  • Web APIからデータを取得し (openmeteo_requests)
  • 取得した生データを整形し (pandas)
  • 月ごとに集計し (resample)
  • 結果をグラフで可視化する (matplotlib)

という、データサイエンスの基本的なワークフローを最初から最後まで一気通貫で体験することができました。様々なライブラリを連携させることで、これほど強力なツールが作れるというのは、Pythonの大きな魅力ですね。

さて、このスクリプトは非常に強力ですが、場所や期間を変えるたびにコードを直接編集する必要があります。これを、プログラミングを知らない人でも使えるように、ボタンや入力欄を持ったデスクトップアプリケーションにできたら、もっと便利だと思いませんか?

今後のブログでは、この「気象データ分析ツール」を、Tkinterを使って誰でも使えるGUIアプリケーションへと進化させるプロジェクトに挑戦するかもしれません! ぜひ、お楽しみに! その他の投稿はこちら

コメント

このブログの人気の投稿

タイトルまとめ

これで迷わない!WindowsでPython環境構築する一番やさしい方法 #0

【Python標準ライブラリ完結!】11の冒険をありがとう!君のPython力が飛躍する「次の一歩」とは? 🚀