実践型AIプログラミング特講 #12

実践型AIプログラミング特講 #12

今回はpyhtonAIパッケージを用いて天気予報から未来の天気予測を行う、またビックデータとして天気予報のデータを解析しやすい形式でストックする方法を皆様にご紹介させていただきます。

プログラミング特講#11をご覧になっていない方はそちらから目を通していただけると一層理解がしやすくなると思います。

過去10年間の気象データを解析してみよう

本節では過去 10年間の気象データの解析に挑戦してみます。ここでは過去の気温データを題材にして、データの集計や解析の方法を紹介します。また、機械学習を利用して明日の気温予測にも挑戦してみます。

気象データを利用しよう

機械学習を用いて翌日の気温を予測するというプログラムを作ります。そのために、過去の気象情報を取得する方法を紹介します。機械学習では、整理されていない膨大なデータを整形する必要があるので、Python のデータ解析ライブラリー「Pandas」の使い方も紹介します。それでは、1つずつ見ていきましょう。

過去 10年分の天気予報を取得する方法

まずは、分析準備から始めましょう。分析対象となる気象データをダウンロードします。過去の気象データは、気象庁のWeb サイトからダウンロードできます。

過去の気象データ·ダウンロード

[URL]  https://www.data.jma. go.jp/gmd/risk/obsdl/index.php

続いて、Jupyter Notebook で新規ノートブックを作りましょう。画面右上の[New> Python 3] で新規ノートブックが作成できます。そして、以下のプログラムを実行しましょう。これは、CSVファイル「data.csv」を整形して「kion10y.csv」へ出力するものです。

in_file = “data.csv”

out_file = “kion10y.csv”

# CSV ファイルを1行ずつ読み込み (※1)

with open (in_file, “rt”, encoding=”Shift_JIS”) as fr:lines =fr.readlines ()

# ヘッダーをそぎ落として、新たなヘッダーをつける (※2)

lines = [“年,月,日,気温,品質,均質n”] + lines [5:]

lines = map(lambda v: v.replace (‘/’, ‘,’), lines)

result = “”.join(lines).strip()

print (result)

# 結果をファイルへ出力 (※3)

with open (out_file, “wt”, encoding=”utf-8″) as fw:

fw.write (result)

print (“saved.”)

すると、次のような CSVファイルが生成されます。

年,月,日,気温,品質,均質

2006,1,1,3.6,8,1

2006,1,2,4.0,8,1

2006,1,3,3.7,8,1

2006,1,4,4.0,8,1

2006,1,5,3.6,8,1

プログラムを見てみましょう。(※1)の部分で、ファイルを読み込みます。with 構文を使うことで、開いたファイルを自動的に閉じることができます。また、Excel 等で出力した CSVファイルをはじめ日本語を含む一般的な CSV ファイルは、文字コードが Shift_JIS である場合が大半です。 encodingオプションをつけないと文字化けして正しく読み込めません。プログラムの(※2) の部分では、既存のヘッダー行を削り、新たなヘッダー行を追加しています。また、「年/月/日」と書かれている部分を「年,月,日」と置換することで、年月日を3つのデータに分割しています。(※3)の部分で、整形結果をファイルへ保存します。こでは扱いが簡単になるように、UTF-8 で保存しています。このプログラムはファイルを1行ずつ読み込んで、整形して書き出すだけのプログラムですので、Python でのファイル置換処理の具体例として参考にしてみてください。

Colaboratoryで気温データを取得する方法

Colaboratory で実行する場合は、ここまでの手順で作成したデータファイルを直接操作してみましょう。以下のプログラムを実行して、Colaboratory の仮想マシン上にデータファイルをダウンロードします。

# ダウンロード

from urllib.request import urlretrieve

urlretrieve(“https://raw.githubusercontent.com” + \”/kujirahand/book-mlearn-gyomu/master/src/ch2/tenki” + \”/kion10y.csv”,”kion10y.csv”)

# データを表示

import pandas as pd

pd.read_csv (“kion10y.csv”)

気温の平均値を求めよう

ここまでの部分で、分析対象となるデータが整いました。今度は、Pandas ライブラリーを利用して、10年間分のデータを分析してみましょう。まずは、この10年分のデータを集計して、各年ごと、日別に平均気温を求め、10年分の平均気温を調べるプログラムを作ってみましょう。v heikin.pyimport pandas as pd# Pandas でCSV を読み込む–( * 1)- – -df=pd.read_csv(“kion10y.csv”, encoding=”utf-8″)–(* 2)# 日付ごとに気温をリストにまとめるmd ={}for i, row in df.iterrows ():m, d, v =(int(row[‘ 月’]), int (row[‘ 日’]), float(row[‘ 気温’]))key=”{:02d}/{:02d}”.format(m,d)if not(key in md): md[key]=[]md [key] += [v]# 日付ごとに平均を求める–(* 3)avs={}for key in sorted (md):v = avs [key]= sum (md [key]) / len(md[key]) # —(× 4)print (“{0} : {1}”.format (key, v))Jupyter Notebookで新規セルを作成し、上記のプログラムを記述して実行してみましょう。すると、以下のような結果が表示されます。

01/01 : 6.0

01/02 : 6.545454545454546

01/03 : 6. 145454545454546

01/04 : 6.101/05 : 6. 4818181818181815

01/06 : 6.663636363636363

01/07 : 6.290909090909091

うまく平均を計算できているようです。それでは、プログラムを確認してみましょう。プログラムの(※1)の部分では、Pandas を利用して、先ほど作成した10年分の平均気温のCSV ファイル「kion10y.csv」を読み込みます。Pandas の read_csv)メソッドの戻り値は、DataFrame 型となりますので、変数名を df としています。プログラムの(※ 2) の部分では、Python の辞書型 (dict 型)を利用して、各年の日付データを「年/日」というキーの辞書に追加していきます。この for 構文で、すべての気温データを加算しても良かったのですが、うるう年など、各年によってデータ数が異なるので、一度すべてのデータを辞書型に追加するようにしています。aErame 型のデータを1行ずつ処理するには、for 構文と dfiterrows() メソッドを利用します。プログラムの(※3) の部分で、辞書型の各データの平均値を求め、画面に出力します。つまり、(※Aの部分が、このプログラムの肝となる部分です。平均気温の一覧リストを sum()関数で合計し、合計値をデータの数で割ります。それによって、平均値を求めています。

任意の日にちの平均気温を表示してみよう

それでは、任意の日付の平均気温を表示してみましょう。たとえば、11/3 の平均気温を表示してみます。上記のプログラムを実行すると平均気温が、list 型の変数 avsに代入されますので、JupyterNotebook ヘ以下のように入力すると結果を知ることができます。

avs [“11/03”]

ここから、11月3日の平均気温は15度前後であることがわかりますね。ちなみに、2017年の11月3日は平均気温が 16.2度で、例年より温かい気温でしたが、平均気温からそれほど離れている訳ではありませんでした。

各月の平均気温を調べよう

先ほどのプログラムでは、素直に DataFrame 型のデータを1行ずつ処理しましたが、Pandas モジュールにある、DataFrame のaroupby() メソッドを使えば、特定のデータをグループ化して集計が可能です。import matplotlib.pyplot as pltimport pandas as pd# CSVを読み込む (※1)df=pd.read csv(“kion10y.csv”, encoding=”utf-8″)# 月ごとに平均を求める (※2)g= df.groupby ([‘月])[“気温”]gg = g.sum() / g.count ()# 結果を出力 (※3)print (gg)gg. plot ()plt.savefig(“tenki-heikin-tuki.png”)plt.show()こちらも、Jupyter Notebook で実行してみましょう。すると、以下のように実行結果が表示されます。プログラムを確認してみましょう。(※1)の部分では、Pandas で CSVファイルを読み込みます。(※2)の部分では、groupby0 メソッドを使って、月の列をグループとしてまとめ、気温データを取得します。そして、g.sum0 メソッドで気温を月ごとに合計し、g.count) メソッドで月ごとのデータ数で割ります。(※3)の部分では、(※2)で求めた月ごとの平均気温を出力します。

気温が30度超だったのは何日? – Pandas でフィルターリング

同様の手法を使って、平均気温が30度超の日が各年に何日あったのかを調べてみましょう。import matplotlib.pyplot as pltimport pandas as pd# ファイルを読むdf = pd.read_csv(‘kion10y.csv’, encoding=”utf-8″)# 気温が30度超えのデータを調べる (※ 1)– -atui_bool =(df [“気温”] > 30)# データを抜き出す (※ 2)atui = df [atui_bool]# 年ごとにカウント (※3)cnt =atui.groupby([“年”])[“年”].count()# 出力print (cnt)cnt.plot()plt.savefig(“tenki-over30.png”)plt.show ()Jupyter Notebook 上でプログラムを実行する。また、Jupyter Notebook 上で実行すると、以下のようなグラフが描画されます。2010年は暑かったというのが伝わってくるグラフです。プログラムを見てみましょう。(※1)の部分では、気温が30度超のデータを調べます。atui_bool の内容を表示するとわかりますが、各行に対して、True か False で判定した bool 型のリストを返します。(※ 2)の部分では、DataFrame 型のデータに対して、bool型のリストを与えると、True の行のデータだけを持つ新たな DataFrame 型のデータを返します。(※3)の部分では、 groupby0 で年ごとにデータをまとめて、日数をカウントしています。

実行結果を評価してみよう

予測した気温と実際の気温がだいたい合致しているのはわかりましたが、どの程度合致しているのか、数値で確かめます。上記のプログラムを実行した直後に、以下のプログラムを記述して、確かめてみましょう。平均1.66度の誤差、そして最大8.4度の誤差となりました。平均だけを見れば、ある程度は予測できていることがわかります。average= 1.6640684971954243max= 8.471949619908475

応用のヒント

ここでの機械学習を応用できそうなテーマとしては「気温の変化とビールの売り上げ」などが考えられます。気温の変化とビールの売り上げは関連があり、気温から売り上げが予想できると言われています。気温の予測プログラムでは、過去6日の気温から翌日の気温を予測しました。ここで、翌日の気温ではなくビールの売上高などの要素を目的変数に指定するなら、さまざまな予測プログラムに応用できます。

この節のまとめ

気象庁から過去の気象データをダウンロードして活用できる

・Pandas を使うと CSV データの取得や、データの集計が簡単にできる

・売上げなどの需要予測をするには、回帰分析を使う

 

いかがでしたでしょうか。天気予報は気象予報士でなくともAIを利用することでこのようにデータを定量的に解析し未来の天気予測及び、気象条件や気温条件によってどの程度営業成績が変化するのかその関係性を回帰分析を介して行うことが可能になります。

 

プログラミングカテゴリの最新記事