地球環境観測: 気温・降水量気候値データの図化

地点別気候平年値データ(気象庁のまとめによる)

気象庁(2002年)の出版物 「気候系監視報告・別冊第8号」の付録CD-ROMから、 世界の地上気温と降水量の月ごとの平年値 (原則として1971-2000年の平均)のデータを取り出して、CNSに持ってきました。

オリジナルデータ

気象庁で作成された形のままのデータを /pub/sfc/earthobs/data/jma/norm2002/origdata/ の下に置きました。

データファイルの形式はCSV (値がコンマ区切りで含まれたテキストファイル)で、 日本語コードはShift-JIS、改行コードはCR+LF (DOS・Windows式)です。 ファイル名と意味は次のとおりです。 (気温の標準偏差、降水量の5分位値のファイルは省略しました。)

ドキュメント

また、気象庁によるドキュメントファイルのうちこのデータを理解するために必要なものを /pub/sfc/earthobs/data/jma/norm2002/origdoc/ に置きました。

編集したデータ

外国と日本の両方を含め、気温と降水量がそろっている地点に限って、 増田が作業に使っている固定幅空白区切りのテキストファイル [この形式を選択する理由説明(英語)]に変換したものを /pub/sfc/earthobs/data/jma/norm2002/work1/ に置きました。 (ただし、空白区切りとして見たときの23列め以降は固定幅ではありません。) 日本語文字を含まないASCIIデータです。 改行コードはLFのみ (Unix式)です。 normtemp.txtが気温、normprec.txtが降水量のファイルで、 空白区切りとして見たそれぞれの列の意味は次のとおりです (昨年度用意したものと少し変更しました)。

編集作業用のプログラム

ここまでの編集に使ったプログラム(Awk)も置いてありますが、説明は省略します。 Awkの教材は [別ページ]、 とくにAwkによるコンマ区切りのデータの扱いについては [別ページ]を見てください。 編集作業の手順は次のとおりです。

この過程で作られた地点リストファイル edlist.txt, edlistjp.txtの各列の意味は次のとおりです。

国名表

ここで採用した国名コードと国・地域名との対応を示したファイルを country.txtとして追加しました。

ここで採用した国名コードは原則としてISO 3166の2文字コードですが、 WMO・気象庁が採用している地域区分を反映して補助情報をつけたものもあります。 気象庁の2002年のCD-ROMのほかに、 WMOの地点番号表(Publication 9 Vol. A, 2003年4月現在。わざと最新でなく気象庁CD-ROMと時期の近いものを使った)と、 GNUのmiscfiles (2004年10月の1.4.2版およびそれ以前のもの)に含まれたcountriesファイル(ISO 3166コードが示されている) を参照して増田が編集したものです。 2002年に作成されたファイルの国名を尊重したので、 cs (Serbia and Montenegro)ではなくyu (Yugoslavia)が含まれています。 しかし、東チモールの国名コードは独立後のtlにしました。 WMO地点番号表の地域区分は、 とくに独立国でない島々については、ISOよりも大きくくくられています。 個別に調べてISOのコードを入れましたが、 正確でないところがあるかもしれません。

ファイルの縦の列は、長い補助情報がある行があるため、 必ずしもそろいませんが、 空白区切りとして見たとき1列めがコード、2列めが地域名です。 WMOのファイルにある地域名を採用した場合は地域名は大文字になっています。 変更した場合、2列めの地域名は小文字まじりになっていて、 3列めにWMOの地域名がかっこつきで入れてあります。

編集したデータを使うプログラム例

また編集後のデータを使うプログラム例として、 selwmost.awkを置きました。 自分の作業するディレクトリにcdしたうえで、 次のようにしてコピーしてください。

cp /pub/sfc/earthobs/data/jma/norm2002/work1/selwmost.awk .
これは、WMO番号を指定して1地点を取り出し、 各月ごとに「月の番号、気温、降水量」が空白区切りでならんだ12行を書き出す ものです。 使いかたは、たとえば(WMO番号48940の地点を抽出する場合)
awk -v wmoid=48940 -f selwmost.awk /dev/null > 48940.txt
のようにします。 (Awkについては[別ページ]を参照。 今後もう少しAwkの基本的使いかたの説明を補足する予定です)。 結果は標準出力に出るので、ファイルにしまうには">"によるredirectionを使います。 ただし、このプログラムは 入力となるnormtemp.txtnormprec.txt/pub/sfc/earthobs/data/jma/norm2002/work1/ というディレクトリにあることを前提として書いてあります。 入力となるデータファイルを自分のところにコピーする必要はありません。 ただし、もし入力データを自分のところに持って作業したい場合は、 プログラム中のファイル名を書きかえれば動くはずです。
なお、このプログラムはAwkの使いかたとしては邪道なこと(BEGIN部で全部の処理をし、からっぽのファイルを読ませる)をやっており、 他のプログラム言語で書いたほうがすっきりすると思います。 これでも目的は達しますし他に迷惑をかけるわけでもないので、 邪道を承知でAwkを使ってしまうのがわたしの流儀ですが、 みなさんはそれぞれ自分の納得のゆく方法を見つけてください。

上の実行例で、抽出する地点番号と結果をしまうファイル名とは対応させてあるのですが、手で入力するとまちがえてしまうおそれがあります。 必ず同じ文字列が使われるようにするには、

awk -v wmoid=$1 -f selwmost.awk /dev/null > $1.txt
という内容(1行)のシェルスクリプト (selwmost.shとする)を作り、
sh selwmost.sh 48940
のように実行するのがよいでしょう。 このシェルスクリプトも同じディレクトリに用意しておきます。 (この簡単なシェルスクリプトの場合、 cshでもshでも同じ形でよいので、 名前が短いほうのshを使う形で示しました。)

データの組織化の立場からの注釈

データをまちがいなく扱ううえで、 データを、関係(relational)データベースの分野でいう「正規化」された表の形に 整理するのが望ましいと言われます ([別ページ(英語)], 柴田(2001)[参考書]の「組織化」のところ, あるいは関係データベースの教科書参照)。 定義としては不完全ですが簡単に言うと、一定の列数かける一定の行数の、論理的な意味で長方形型の表です。

ここで扱うデータの場合、 気象庁オリジナルのデータの(論理的)形式は、 個々のファイルについて見ると、列の名前を示す見出し行を別とすれば、正規化された表とみなせます。 しかし、ファイルの組み合わせとしてみると、正規化は不完全です。 地点リストが別の表として用意されているので、 気温・降水量データには地点を同定する項目は1列だけあればよいはずで、 外国の地点のデータについて、このデータセット中の地点番号とWMO地点番号の両方が含まれているのは冗長です。 また、変数の意味に立ち入って考えてみると、 月ごとの値がそれぞれ別々の列になっていますが、 これは時間座標値は違うが本来は同じ変数なので、 列は同じにし、月ごとのデータをそれぞれ別の行にしたほうが筋が通っています。 ただし、そのように正規化することが実用的な意味でよいかどうかは別の問題です。

一方、増田が編集したデータのほうは、 気温・降水量データファイルに、2種類の地点番号に加えて緯度・経度・標高も含めているので、正規化からはオリジナルデータよりも遠ざかっています。 この形式は、地点リストのファイルを読まなくても 気温・降水量のファイルだけを読めば 地点の属性もわかるようにしたいという便宜的理由で採用したものです。 ([別ページ(英語)] でも書いたように、わたしはときどき意識的に正規化しない表を使います。)

1点の気温・降水量を抽出したファイルは、 月、気温、降水量の3列からなる、正規化された表になっています。 関係データベースで使うことを想定したわけではありませんが、 12か月のデータを時系列として GMT ([別ページ])あるいは gnuplot ([別ページ])で 作図するために、時系列を列として縦にならべたのです。 構造がきれいな代わり、 この数値がなんであるかという情報(metadata)が全く含まれていないという弱点があります。 上の実行例では、ファイル名にWMO地点番号を含めるようにしましたが、 そういう注意をしないで実行すると、たとえ列の意味はわかったとしても、 どの地点のものかわからないので役にたたないファイルができてしまいます。 この形式は、抽出をどのようにしたかを覚えているうちに使う臨時のファイルの形式であり、もし忘れたら抽出からやりなおせばよい、 また地点の情報が知りたければ地点リストのファイルを見ればよい、 という考えで採用したものです。

もう少しまちがいに対して安全にするためには、 metadataをデータの表と簡単に区別できる形で同じファイルに含めたほうがよいでしょう。 たとえば、gnuplotではデータファイルの「#」で始まる行は数値でなくコメントとみなすので、metadata情報はこの形にしておき、 GMTで作図する場合はシェルスクリプト内であらかじめAwkを通して「#」で始まる行を取り除いてから作図プログラムに渡すことが考えられます。 GAME-Tの降水量データの作図のシェルスクリプト[別ページ参照]は そのように作りました。

(2004-09-30), 2005-10-20, 2006-11-08
増田 耕一 (環境情報学部 非常勤講師)
[このデータを使った実習の目次ページへ] [地球環境観測2006教材目次へ] [日程へ]