このページでは、おもに、pandas の hist または matplotlib の hist をつかって、 ヒストグラムの図をかく。
numpy の histogram をつかって ヒストグラムの (図ではなく) 数値を書きだす例を追加した [2022-08-29]。
quantile (分位数、パーセンタイル) の数値を書きだす例を追加した。[2022-06-24]。
[2022-05-15] Pandas の hist がつくるものが正しいヒストグラムであるのか、疑問がのこっていますが、 どうやら、図の長方形の面積ではなく高さが、各区間の件数に対応しているようです。 したがって、集計区間がデータ値で等間隔でなくても、図上で等間隔ならば、 正しいヒストグラムとみなしてよさそうです。ただしじゅうぶん確かではありません。
[2022-05-15] [気象観測データ (1地点) のグラフ作成と基本的な統計処理: 日照時間 日別値] の 材料をつくりながら、 時間降水量のほうのプログラムの改良すべきいくつかの点に気づきました。 残念ながらすぐには修正できませんが、時間がとれたら修正します。 関心のある人は上のリンクさきのプログラム例と比較してみてください。
[2022-06-24] quantile (分位数) の計算を追加しました。
[気象観測データ (1地点) のグラフ作成と基本的な統計処理 (Python による試作)]と 基本的に同じことを、1時間ごとの降水量の観測値でやってみる。
[気象庁の観測データを使う (序論)] (板倉用教材) のページで、 気象庁ウェブサイトの「過去の気象データ ダウンロード」の機能をつかって、 例として、熊谷の 2019-2021年の3年ぶんの時別値の降水量を、1年ごとに別々の CSVファイルでダウンロードした。 なお、ダウンロードの際に日付の形式は「年月日などに分ける」をえらんだ。 (2022年5月9日にダウンロードしたものを、つぎのところに置いておく。 ダウンロードしたときの名まえは data.csv だが、変更した。)
ここでは、このデータを Python で読んで、図化や基本的な統計処理をこころみる。 【説明は 日本語 Windows 上 の Anaconda にくみこまれた Python 3.8.8 での実行結果による。 他の OS では、日本語文字を表示するために「fontname='MS Gothic'」などとしているところは 変更が必要だろう。】
まず、Pandas の read_csv をつかって、1年ぶんのデータを データフレーム「df」に読みこみ、 列の名まえをつけかえ、 品質情報が「8」でないところは欠損あつかいにする (np.nan にかえる) 処理をしたうえで、 横軸に日時の通し番号、縦軸に降水量をとって、点グラフ (作図技術上は散布図と同じ) をかいてみる。
[複数の CSV ファイルをつないでひとつのデータフレームにする (Python Pandas)] 【リンクさき 2022-05-10 授業後修正】の ページに書いた手順で、それぞれの CSVファイルを df1 というデータフレームに読みこんだうえで つないでいく手順で、ひとつのデータフレームをつくる。 それを graph1 と同様に作図してみる。
Python の datetime パッケージ の datetime 関数をつかって、 年・月・日・時を、日付型に換算する。 データフレームに、日付型の日時の列「datex」を追加する。 そして、横軸に日時、縦軸に降水量をとってグラフをかく。 横軸の目盛りに書くラベルは、年の下2けたと月にしてみた。
graph2 と同様な 3年ぶんのデータがはいったデータフレームを材料として、 Pandas の hist メソッドを単純に呼び出してヒストグラムをかいてみる。 集計区間は、mm/時 単位で、0 から 100 まで 5 きざみにしてみた。
図をみても 「ほとんどの時間の降水量は 5 mm 未満である」という情報しかわからない。 あきらかにうまくない作図例である。
降水量 0 (無降水および微量降水) をはずし、降水量 (mm/時) の区間を、0.25 からはじめて 2倍、2倍... になるように設定してみた。 (実際に収録されている観測値の最小値は 0.5 で、0.25~0.5の区間にくるデータはないことがわかったが、 ひとまずそのままにしてある。)
横軸を対数目盛りにしている。区間の幅はこの軸のとりかたで等間隔になる。
これでうまくいったと思ったのだが、このヒストグラムはまちがっているかもしれない。
集計区間をかえず、横軸を対数目盛りでなく通常の目盛りにしてみる。ただし数値の範囲は 64 mm/時 までとした。 (目盛りにつけた数字がかさなって読めないところがあるが、ひとまずそのままにした。)
ヒストグラムはグラフの (棒の高さではなく) 長方形の面積が頻度をあらわすべきなのだが、 hist2 と hist2x のグラフは、棒の高さが同じになっており、面積が同じになっていない。 すくなくともどちらかはまちがったヒストグラムである。
そこで、hist 関数にたよらずに、区間ごとの頻度をかぞえるようにしてみた。 (ただし、データ欠損のチェックはせず、 if の条件が、データ値が欠損値 (np.nan) のばあいは False になることを想定している。)
結果をみると、hist2, hist2x の棒の高さのところに表示された数値と対応している。 したがってhist() によるヒストグラムは 上の hist2 のように区間をあらわす画面上の幅を一定にしておけば正しいヒストグラムといえるが、 hist2x のように画面上の幅が一定でないばあいは正しくない、と思われる。
[2022-05-15] hist 関数をつかわずに、hist2a と同様に集計し、長方形をひとつずつかくことによって ヒストグラムのような図をつくるプログラムを試作してみた。 正しい処理かどうか、まだ自信がない。
[気象観測データ (1地点) のグラフ作成と基本的な統計処理 (Python による試作)]で やってみたのと同じように、年をとわず、月を、(英語の頭文字で) DJF, MAM, JJA, SON に わけて、hist2 と同様な形の 4つのヒストグラムをかいてみる。 季節によって時間降水量のとる値がかなりちがうので、 縦軸は、ひとまずデータ内容から自動的に決まるままの、季節によってちがう尺度にした。 (解析を進めるばあいは季節ごとに値の範囲を考えて固定するべきである。)
NumPyパッケージの histogram() 関数は、 ヒストグラムで表示されるような数値を計算して、数字で書きだす機能をもつ。 (グラフをかく機能はもたない。)
入力データとしては NumPy の配列が想定されているが、 一般的なリスト、あるいは、pandas のデータフレームの列をそのまま渡しても、 これまでためした範囲では、計算できている。
ここでは、上の hist2.py であつかったのと同じ、3年分 (季節をとわない) の 1時間降水量について、 いくつかのオプションで、集計区間 (bin) を設定し、集計してみる。 histogram() での bin の設定には、binの数をあたえる方法と、区間の端の値のリストをあたえる方法がある。 また、density というオプションが False のときは、集計されたカウント値を、 True のときは「密度」 を書きだす。
このプログラム例では、つぎのばあいについて、 それぞれ、density を False と True で計算してみた。 実際には、目的に適したものを選択して実行すればよい。
[注] 境界の値が等間隔の bin のばあいは「密度」は相対頻度 (合計が 1 になる) だが、 等間隔でないばあいは、区間の幅あたりの相対頻度になっているらしく、 (2)のばあいは、「密度」に各区間の幅をかけて合計すると 1 になる。 (2) と (3) とは bin の降水量のくぎりが同じになるようにしたので、 カウント値は同じになるのだが、 「密度」は (2) では降水量の区間の幅あたり、(3) では降水量の対数の区間の幅あたりで 計算されるので、数値は同じにならない。
数量の頻度分布の指標として、パーセンタイル (percentile) というものがよくつかわれる。 (記述統計のばあいについていうと) 数値データを小さい順にならべて、順位が全体の個数の n パーセントに達したところの数値が n-パーセンタイルだ。 百分率をつかうのが必然ではないので、一般的には、quantile という。n-パーセンタイルは、100分のn に対する quantile である。 quantile にほぼ対応する日本語は「分位数」である。 「四分位数」 (英語では quartile [quantileとは1字ちがい]) は、順位が、下から4分の1、上から4分の1 になるところの両方をさすことがある。
ここでは、上の hist2.py であつかったのと同じ、3年分 (季節をとわない) の 1時間降水量について、 いくつかの割合の数値に対する分位をもとめてみる。 0.5 に対する分位が中央値、0.75 に対する分位が上側四分位数、0.99 に対する分位が 1パーセンタイルである。