2017.04.25

Rで雨温図(Hythergraph)を書く(その3)

前回前々回に続き,統計解析フリーソフトRで雨温図(Hythergraph)を書くというシリーズの3回目。

今回は4都市分の雨温図を並べて書いてみる。

前回,気象データとして,ASEAN各国の首都の月別最高気温・最低気温・雨量をまとめたcsvファイルを作ってみたのでそれを再び使用する:

「aseanclimate.csv」をダウンロード

前回も述べたが,データの出典は,カンボジアやラオスに関してはそれぞれの国の統計年鑑,その他の国については世界気象機関(WMO)のデータベースである。

スクリプトは以下の通りであるが,これまでとの大きな違いは,こんな感じ:

  • ASEAN諸国のうち,カンボジア,ラオス,タイ,ベトナムの首都の雨温図を書くことにした
  • 関数par()を使って画面を4分割し,4都市分がまとめてみられるようにした
  • for文を使って描画作業を繰り返すことにした

こんな図ができるはず。

Hythergraph4countries

今回のスクリプトを応用すれば,一画面に何都市分の雨温図でも表示できる。もちろん図が小さくなるので見えにくくなるが。

| | コメント (0) | トラックバック (0)

2017.04.24

Rで雨温図(Hythergraph)を書く(その2)

前回からの続き。

今回は気象データを読み込んで雨温図(Hythergraph)を書くことにする。

まず,気象データであるが,ASEAN諸国の首都の月別最高気温,最低気温,雨量をまとめたcsvファイルを作ってみた:

「aseanclimate.csv」をダウンロード

データの出典として,カンボジアやラオスに関してはそれぞれの国の統計年鑑,その他の国については世界気象機関(WMO)のデータベースを用いた。

スクリプトは次の通りで,前回との違いは,csvファイルの読み込みを行うところである。

あと,ブルネイではなく,カンボジアのプノンペンの雨温図を書くことにする。

ちなみに,小生の場合,csvファイルはcドライブ直下に作った"rtemp"というフォルダーに置いている:"c:\\rtemp\\aseanclimate.csv"

こんな図ができるはず。

Hythergraphcambodia_2

今回,csvファイルの読み込みを行ったのは,複数都市の雨温図を並べて書くという作業を行うための伏線である。

次回(その3)では4都市分の雨温図を書くことにする。

| | コメント (0) | トラックバック (0)

Rで雨温図(Hythergraph)を書く(その1)

久々に統計解析フリーソフトRの話をする。

雨温図 (Hythergraph)というのは,ある地域の降水量と気温をあらわすグラフのことである。月別の気温を折れ線グラフで,雨量を棒グラフで表し,両者を重ねて表現する。

これをRで書こうとすると,ちょっと手間取る。

折れ線グラフだけ,または棒グラフだけならplot()とかbarplot()といった関数を使ってあっという間に描けるのだが,両者を重ねるのは意外と難しい。

"Symfowareについての考察blog"や定番"統計解析フリーソフト R の備忘録頁"を参考にしながらスクリプトを書いてみたので紹介する。

最近ASEAN諸国の研究をしているので,ASEAN加盟国の一つ,ブルネイの首都,バンダルスリブガワンの雨温図を書いてみる。

雨温図に必要なデータは世界気象機関(WMO)のデータベースから入手:

"World Weather Information Service - Bandar Seri Begawan"

肝心のスクリプトは次の通りである:

こんな図ができるはず。

Hythergraphbrunei


スクリプトを読むとおわかりだと思うが,棒グラフと折れ線グラフのx座標がずれないようにするために,barxというベクトルを作って,棒グラフの各バー(棒)の中心の位置を記録し,折れ線グラフのx座標として利用している。

このあたりの知恵は"Symfowareについての考察blog"を参照。

今回は雨量,最高気温,最低気温のデータを全部ベタ打ちで入力したが,次回(その2)では,csvデータを取り込んでグラフを書く,というやや進化したものをお見せする予定。

| | コメント (0) | トラックバック (0)

2017.03.21

Rでサンキ―・ダイアグラム的なものを書く

エネルギーの流れを理解するためには,サンキー・ダイアグラム(Sankey diagram)という図表を用いると良い。サンキー・ダイアグラムというのはフロー図の一種で,工程間のエネルギー・物資・資金等の流量を表現するのに用いられる。

小生が関わっている分野で言うと,環境工学やエネルギー関連の研究で良く用いられる。

サンキー・ダイアグラムはわかりやすい図表だが,作るのは大変である。

何か良い手はないかと思ったら,Rにちょうどいいパッケージがあった。

"riverplot"

というパッケージがそれである。実は"sankey"というそのものズバリのパッケージもあるのだが,riverplotの方が,説明がわかりやすく,出力される図もきれいだったので,こちらを使ってみる。


◆   ◆   ◆


準備

まず,何としてもパッケージriverplotを入手する。

CRANにあるはずなので,探してみること。


◆   ◆   ◆


riverplotの練習 (1)

A, B, Cという3つのノードがあり,AからCに5,BからCに10が流れるとする。

これをriverplotでフロー図(サンキー・ダイアグラム)にしてみよう。

まず,なにも考えずに,以下のコマンドを打ち込んでいく。

最後に"Enter"キーを押して,次のような図が出てきたらOK。

Riverplot01_2


◆   ◆   ◆


nodesの説明

さて,コマンドの解説を始める。

どんなフロー図を書くのか,という定義はmakeRiver()という関数を用いて行う。

makeRiver()には最低限,nodesとedgesという2つの変数が必要である。

nodesというのはノード,つまり結束点を定義したデータフレームである。

今回はA, B, Cという3つのノードがある。それぞれのID(識別コード),横軸(x)座標,色(col),名前(labels)を次のように決めよう:

  • ノードA:IDを"A",横軸(x)座標を1とする。色(col)を黄色とし,名前(labels)を"Node A"とする。
  • ノードB:IDを"B",横軸(x)座標を1とする。色(col)をデフォルトの灰色とし,名前(labels)を"Node B"とする。
  • ノードC:IDを"C",横軸(x)座標を2とする。色(col)をデフォルトの灰色とし,名前(labels)を"Node C"とする。

ノードごとにIDやx座標を定義するのではなく,ID,x座標といった属性ごとに定義を行うことにする。

すると,

ID = c("A", "B", "C")
x= c( 1, 1, 2 )
col= c( "yellow", NA, NA )
labels= c( "Node A", "Node B", "Node C" )

となる。色(col)に関しては,NAと書いておけば,デフォルトの灰色が指定される。

これら4つの属性をnodesに収納するため,data.frame関数を使用する:

nodes <- data.frame( ID = c("A", "B", "C"),
x= c( 1, 1, 2 ),
col= c( "yellow", NA, NA ),
labels= c( "Node A", "Node B", "Node C" ),
stringsAsFactors= FALSE )

最後に

stringsAsFactors= FALSE

というのがあるが,今回はこれを「まじない」とでも言っておく。

これで,ノードに関する定義が終わった。


edgesの説明

つぎに,edgesという変数の説明。

edgesというのはノード間の流れを定義したデータフレームである。

今回の例では,AからCに5,BからCに10の何か(水かもしれないし,金かもしれない)が流れるという設定である。

edgesというデータフレームでは,流れの出発点をN1と呼び,流れの終着点をN2と呼ぶ。N1からN2への流量をValueと呼ぶ。

すると,

  • AからCに流量5の流れがあることを:N1 = "A", N2 = "C", Value = 5
  • BからCに流量10の流れがあることを:N1 = "B", N2 = "C", Value = 10

と表すことになる。

流れごとにN1, N2, Valueを定義するのではなく,N1, N2, Valueといった属性ごとに定義を行うことにする。

すると,

N1 = c("A", "B")
N2 = c("C", "C")
Value = c(5, 10)

となる。これら3つの属性をedgesに収納するため,data.frame関数を使用する:

edges <- data.frame( N1 = c("A", "B"),
N2 = c("C", "C"),
Value = c(5, 10))

これで,ノード間の流れを定義できた。

nodesとedgesの定義が終わったので,makeRiver()関数を使って,全体の流れの情報をrという変数に代入する:

r <- makeRiver( nodes, edges )

これで,あとは

plot( r )

と打ち込めば,フロー図が出力される。

| | コメント (0) | トラックバック (0)

2014.10.21

Rで宇部市の町丁字別の人口密度を塗り分ける(making a choropleth map)

久々にRの話をする。

今回はRを使った地図の塗り分け(階級区分図,コロプレス図,choropleth map)を行う話。

実はだいぶ前にも同じ話題を取り扱った(「Rでカンボジアの塗り分け地図を作る」2011年11月28日)が,今回は自作コード(青木繁伸先生作成のコードを改造したもの)を利用するのではなく,Rのパッケージ"foreign","maptools","sp"を利用する。


◆   ◆   ◆


準備

コロプレス図を作成するためのデータを,あらかじめ政府統計の総合窓口にて入手するところから始める。

政府統計の総合窓口/地図で見る統計(統計GIS):
http://e-stat.go.jp/SG2/eStatGIS/page/download.html

  • 「Step1:統計調査(集計)を選択」の中から「平成22年国勢調査(小地域)2010/10/01」を選択する。
  • 「Step2:統計表を選択」の中から,人口密度が求められそうなデータを選ぶ。「男女別人口総数及び世帯総数」がいいだろう
  • 「統計表各種データダウンロードへ」をクリック

ここまで進むとまた新たなページ「統計表各種データダウンロード」に移動する。

  • 「Step3:地域選択」で都道府県と市区町村を選択する。今回は山口県,35202宇部市の組み合わせで選択
  • 「検索」ボタンを押すと統計データと境界データが表示される
  • 境界データには町丁字の境界データ(形状データ,ポリゴン)と国勢調査による町丁字別人口,世帯数などのデータがまとめて入っている。どんなデータが含まれているのかは「定義書」をちゃんと読むこと
  • 今回は「日本測地系緯度経度・Shape形式」の「宇部市(620KB)」を選択(クリック)してzipファイルをダウンロードする

zipファイルをダウンロードしたら,解凍して適当なところに保存する。

小生の場合はRによる作業のディレクトリとして"c:/rtemp/"というフォルダを使っているので,"c:/rtemp/JapanGIS/"というフォルダを作って,解凍したものを保存している。

正確に言うと,"c:/rtemp/JapanGIS/A002005212010DDSJC35202/"というのが宇部市のshapeデータを含むファイル群が保存されているフォルダとなる。


◆   ◆   ◆


ここからがRでの作業になる。

あらかじめRのパッケージ"foreign","maptools","sp"を入手しておくこと。

そうしたら以下のコマンドを打ち込んでいく。

いよいよ宇部市のshapeデータの取り込みである。

するとこういう図が登場するはず(↓)

Ube01

困ったことに海面まで含まれている。「定義書」を読むとこれを削るためのヒントが得られる。

今作ったデータセット"maptemp"には"HCODE"という陸地と水面とを区別する変数が入っているので,これを利用すれば海面を取り除くことができる。HCODE=8154が水面調査区であるから,

とやれば,海面が消えたことがわかるだろう。

Ube02

次にデータセットmaptemp1に人口密度のデータを加える。「定義書」によれば,変数"AREA"が町丁字の面積[m^2],変数"JINKO"が町丁字別人口を表しているから,新たに人口密度を表す変数"DENS"を作って,データセットmaptemp1に加えてやればよい:

ここで,"* 1000000"としたのは人口密度の単位を[人/km^2]にするため。

さて,ついに町丁字別人口密度の塗り分けを行う。

Ube03

・・・なんかうまくいっていませんね。色の違いが判らない。全面的に真っ赤。

これは極端に人口密度が高い場所が生じているため。思い切って,表示する人口密度の上限を10000人/km^2とする処理を加えてみる。

Ube04

はい。ましになりました。

このあと,塗り分けのカラーパレットをいろいろと変えてみる。

"terrain.colors"を使ってみた結果は次のようになる(↓):

Ube05

小生としては"terrain.colors"の方が"heat.colors"よりも気に入っている。

というわけで,結構楽にコロプレス図が書けることがわかった。

| | コメント (0) | トラックバック (0)

2013.10.07

林知己夫『調査の科学』を読む

数学の中で難しいのは確率・統計ではないかと思っている。微分・積分,代数・幾何など,難しいようだが,計算結果などを巡って意見が対立することは無い。

ところが確率・統計では計算結果を巡ってもめることが多々ある。計算結果の何を巡ってもめているかというと,解釈を巡ってもめているのである。

例えば,小生は統計言語"R"を使っているわけだが,これを使えば,様々な統計的検定が簡単にできる。しかし,その検定結果に対しては,ネイマン・ピアソン流かフィッシャー流かで,解釈の仕方ががらりと変わるわけである。

結局,確率・統計分野では,数学の他の分野に比べて常々勉強しなくてはいけないことが山のようにあると思う。

というわけで,時折勉強のために確率や統計の本を読んでいるのだが,最近,質的データを量的に扱うという統計的手法「数量化理論」を生み出した偉大な統計学者である林知己夫の『調査の科学』を読んでいる。

調査の科学 (ちくま学芸文庫)調査の科学 (ちくま学芸文庫)
林 知己夫

筑摩書房 2011-05-12
売り上げランキング : 484579

Amazonで詳しく見る
by G-Tools

この本で凄いと思ったのは統計用語のユニバース母集団(population)を厳密に分けていることである。

この辺が詳しく書いてあるのが本書の第2章である。以下,主要部分を引用する。

「定義がはっきりし,しかもその構成要素が具体的にとらえられるような調査対象集団を,統計学ではユニバース universe と呼んでいる。」(42ページ)
「母集団とはユニバースに確率的な概念を加えたものである」(43ページ)
「ユニバースと母集団が同じではないか,と思われるかもしれない。<中略> しかし,厳密な考え方としては,ユニバースと母集団はまったく別のものであることを認識していただきたい。」(43ページ)
「ユニバースに,要素を取り出すという考え方を加えたのが,「母集団」である。」(44ページ)
「日本人という調査集団では,ユニバースであった住民登録簿から機会均等に,つまり公平なくじ引きで,むずかしくいうと同じ抽出確率でつぎつぎと人を抽出すると決めたのが母集団ということになる」(44ページ)


さて,こうした説明を聞いたのち,ウェブ上でユニバース母集団について解説している文章を読むと,なんか違う。

例えばこういう説明:

「統計学上の population と universe の違いは、前者が、検定や推定の対象であるところの個体から観測される値(小学校6年生のお小遣い) の集まりであるのに対して、後者は個体(小学校6年生)の集まりという点です。」(コラム『統計備忘録』バックナンバー第34話「sample, population, universe」,統計WEB,2008年1月15日)

『調査の科学』の解説を書いた吉野諒三によれば,ユニバースと母集団の区別について厳密に取り扱っているのは,本書を除くと林文ほか『統計学の基本』(朝倉書店,1991)や杉山明子編『社会調査の基本』(朝倉書店,2011)ぐらいしか存在しないようである。

社会調査の基本社会調査の基本
杉山明子編著

朝倉書店 2011-03-18
売り上げランキング : 288849

Amazonで詳しく見る
by G-Tools

通常はユニバースと母集団の対応関係が固定しているために,両者を区別する意義があまりないようだが,アンケートの回収率の低下などの問題が生じている現在では,ユニバースと母集団について,厳密な定義にまでさかのぼって慎重に検討する必要がある,ということを吉野諒三は述べている。

| | コメント (1) | トラックバック (0)

2012.08.01

Rのデータ操作入門(1):モード,リスト

Rを使いこなすためには,Rによるデータ操作法を学ぶことが最も重要である。

1. モード

データには数値(numeric),文字(character),論理値(logical),リスト(list, 後述)のようなモードがある。

あるオブジェクトxに,あるデータ(データ自体,オブジェクトなのであるが…)の集合を保存する場合,もっとも頻繁に使われるのがc関数である。c関数はベクトルの形でデータをオブジェクトに保存する。

たとえば,1, 2, 3, 4という数値データをxというオブジェクトに保存する場合,Rでは


> x = c(1, 2, 3, 4)

と命令する。

このとき,xに保存されたデータのモードを確かめるためにはmode関数を使用する。


> mode(x)
[1] "numeric"

このようにxの要素のモードは数値であることがわかる。

様々なモードのデータをc関数によって一つのオブジェクトに保存した場合,保存された要素のモードが統一される。例えば,


> y = c(1, 2, "cat", 4)

と命令した場合,yには数値データと文字データが混在したまま入力されるわけだが,mode関数でyに保存されたデータのモードを確かめると,


> mode(y)
[1] "character"

となり,すべての要素が文字に変換されたことが示される。実際,


> y
[1] "1" "2" "cat" "4"

となって,数値データが文字データになっていることがわかる。

c関数によって文字データと数値データをあるオブジェクトに保存した場合,そのオブジェクトの要素のモードは文字"character"となる。

c関数によって数値データと論理値データをあるオブジェクトに保存した場合,そのオブジェクトの要素のモードは数値"numeric"となる。

では,文字データと論理値データをあるオブジェクトに保存した場合はどうなるか?


> z = c("dog", "cat", TRUE)
> z
[1] "dog"  "cat"  "TRUE"
> mode(z)
[1] "character"

すなわち,オブジェクトの要素のモードは文字"character"となる。


2. ベクトル要素への名前付け

1.で例示したオブジェクトx, y, zはいずれもベクトルである。ベクトルの各要素にはnames関数によって名前を付けることができる。


> x =  c(1, 2, 3, 4)
> names(x) = c("alpha", "beta", "gamma", "delta")

または


> names(x) = c('alpha', 'beta', 'gamma', 'delta')

とすれば,ベクトルxの第1要素にはalpha,第2要素にはbeta,第3要素にはgamma,第4要素にはdeltaという名前が

つく。すなわち,


> x
alpha  beta gamma delta 
    1     2     3     4


3. リスト

リスト(list)はモードの異なる複数のデータを,それぞれのモードを変更せずに一つのオブジェクトに保存する場合に使う関数である。


> x = list(1, "dog", TRUE)
> x
[[1]]
[1] 1
[[2]]
[1] "dog"
[[3]]
[1] TRUE

リストはそれ自体,ひとつのモードである。


> mode(x)
[1] "list"

すなわち,list関数は,「モードの異なる複数のデータを,それぞれのモードを変更せずに結合する,リストというやり方」でオブジェクトをつくる関数である。


参考文献
P.スペクター著,石田基広・石田和枝訳『Rデータ自由自在(Data Manipulation with R)』(シュプリンガー・ジャパン)

| | コメント (0) | トラックバック (0)

2011.11.28

Rでカンボジアの塗り分け地図を作る

以前,Rを使ってカンボジアの白地図を描く方法を紹介した(「Rでカンボジアの白地図を書く」)。

今度は塗り分け地図(Choropreth Map)を作る方法を紹介するウェブページを作ったので,ここで紹介する。

Rでカンボジアの地図の塗り分けをする

かの高名な青木繁伸先生(群馬大学)の作成したグラフィック関連プログラムを参考にcmb.map()という関数を作った。Rでカンボジアの塗り分け地図を作りたいという人(余り需要はなさそうだが)は自由に使っていただきたい。


使い方

cmb.map(zdata, t, 9, "[person/km^2]")

のようにパラメータを入力して使用する。

1番目のパラメータ:zdataは24の州・特別市に対応した長さ24のベクトルデータ。
データは:

Banteay Meanchey, Battambang, Kampong Cham, Kampong Chhnang, Kampong Speu, Kampong Thom, Kampot, Kandal, Koh Kong, Kep, Kratie, Pailin, Sihanoukville, Mondul Kiri, Oddar Meanchey, Phnom Penh, Pursat, Preah Vihear, Prey Veng, Ratanak Kiri, Siem Reap, Stung Streng, Svay Rieng, Takeo

の順に並べなくてはいけない。

2番目のパラメータ:tは色分けを行うための閾値(境界値)で4つの数値を持つベクトルデータである。
3番目のパラメータはカラーパレットの番号。9番はHeat Colorと呼ばれる赤系統の色を使ったカラーパレット。
4番目のパラメータはtの単位で,凡例の上に表示する。


使用例

2008年のカンボジアの州別人口密度をプロットする。

まず,人口密度データをPD2008というベクトルに収納する:

PD2008 <- c(102,88,172,85,102,46,74,355,13,106,29,88,230,4,30,
4571,31,12,194,14,87,10,163,237)

つぎに閾値を定めプロットする。

t <- c(50, 100, 200, 500)
cmb.map(PD2008, t, 9, "persons/km^2")

次のような画像が現れればOK。

Cmbpopdens

詳細は次の3つの頁を見ていただければわかると思う。
ソースコードやshapeデータの入手方法も全て公開しているので,自由に活用していただきたい。

| | コメント (0) | トラックバック (0)

2011.09.08

Rでカンボジアの白地図を書く

カンボジアの統計データとRのmaptoolsパッケージを使って,地図の塗り分けをしようと思っている。

まだ勉強途中だが,とりあえず白地図を書くことができるようになった。

Cmbprov

ただし,重要なものが抜けている。トンレサップが無い。

手順の詳細は次のページに書いておいた。参考にする人もいるだろう。

Rでカンボジアの白地図を書く

| | コメント (0) | トラックバック (0)

2010.08.08

Rで地図の塗りわけ

以前、
住宅用太陽光発電パネルの普及率は日照時間と関係があるのか?」(2010年4月7日)
という記事を書いて、住宅用太陽光発電システムの普及状況と日照時間について検討してみた。

昨日(2010年8月7日)は都道府県別の太陽光発電システム普及状況と日照時間をもうちょっとビジュアル的に表現しようと、統計用言語であるRを使用して「地図の塗り分け」を行ってみた。

参考資料は群馬大・青木繁伸先生の「Rによる統計処理」の「塗り分け地図を描く」のページ。

作業手順は勤務先のウェブページ「Rで地図の塗りわけ」に記載しているので、Rを使用した地図の塗り分けをしてみたい人は参考にしてほしい。青木先生作成のプログラムを改造して、新たなカラーパレットと凡例の追加を行ったコードを掲載しているので、少しは役に立つのではないかと思う。

塗り分け結果だけ見たい人は以下を見てほしい。

Capacity

都道府県別設備容量累積値(1994~2007年度・人口1000人あたり)


Daylight

都道府県別年間日照時間(1971~2000年平年値)


これらを比べてみると、少なくとも、日照時間が少ない都道府県では普及状況が悪いという傾向が見て取れるだろう。

| | コメント (0) | トラックバック (1)

より以前の記事一覧