サイトトップ | 人口学 | [in English]
最終更新:28 August 2019
このページの目的は,フリーソフトを使って簡単に人口ピラミッドを描く方法を説明することである。Windows環境での説明をするが,使うソフトはどちらもLinux版やFreeBSD版やMac版があるので,おそらくそれらの環境にも応用可能だろう。
以下3種類のソフトを用意する。
自分で調査して得たデータを使うこともあるだろうし,官公庁などが発表している二次資料を使うこともあるかと思うが,人口ピラミッドを描くときに必要なデータは,いずれの場合でも男女年齢階級別人口である。
まず,pyramid()またはpyramids()関数を使って,日本の人口について,既発表資料から人口ピラミッドを作る方法を紹介する。
とする(注:もちろん,pyramidパッケージがインストール済みであることが前提である)。次に例えば,library(pyramid)
のように,保存したタブ区切りテキストデータファイルをフルパスで指定してデータフレームに読み込む(なお,Calcでの上記操作をスキップしてRだけ使いたい方はx<-read.delim("e:/work/nagano-table-2015.csv")
とすれば上記の加工済みのファイルをネットワーク経由で直接読みこめる)。ここでx<-read.delim("http://minato.sip21c.org/demography/nagano-table-2015.csv")
とすれば長野県の人口ピラミッドが描かれる。pyramids(Left=x[,2], Right=x[,3], Center=x[,1], Cstep=10)
単純にはこれだけで良いのだが,もう少しきれいに加工したいときはLibreOfficeのDrawで編集すると良い。
と打ってRを終了してよい。Save workspace image?(日本語版では「作業スペースを保存しますか?」)というダイアログには「いいえ」でよい。q()
Rだけでも,オプション指定である程度見やすいピラミッドにしておくことは可能である。例えば以下のように打つ(nagano-pyramid-2015.R)。
# x <- read.delim("http://minato.sip21c.org/demography/nagano-table-2015.csv") x <- read.delim("./nagano-table-2015.csv") library(pyramid) png("nagano-pyramid-2015.png", width=672, height=672) par(family="sans", mar=c(2,3,2,2)) pyramid(data.frame(M=x[,2], F=x[,3], A=x[,1]), Clab="", Llab="男性", Rlab="女性", Cstep=10, AxisFM="d", main="長野県の人口ピラミッド\n (2015年国勢調査)") dev.off()
と打てば,下図程度にはきれいに仕上がる。
次に,小集団の生データから人口ピラミッドを作る方法を紹介する。
作図の手順(2)でも2つの人口ピラミッドを描画したが,今度は1980年から2015年までの群馬県の8つの人口ピラミッドをまとめて描かせてみる。e-Statからダウンロードできるda03.xlsは,各都道府県が別々のワークシートになっているので,10枚目のワークシートの群馬県のところからデータを読む。もちろん,LibreOfficeのCalcはExcel形式のデータを読めるので,Calcで開いて余計な部分を削除し,手順(1)と同様にテキストファイルとして保存してから読むのでも良いが(形式指定でコンマを表示させなくすることと,"-"を0に置換することに注意),ここではDr. Hadley Wickhamらが開発したreadxlパッケージのread_xls()関数(Excelファイルの形式がxlsかxlsxか不明な場合はread_excel()関数)を使って,直接読み込むことを考える。
ワークシート上では,7行目が「0~4歳」,24行目が「85歳以上」であり,1920年男女がE列とF列,1925年男女がL列とM列,……と続き,1980年から2015年は,CK,CL,CR,CS,CY,CZ,DF,DG,DM,DN,DT,DU,EA,EB,EH,EI列に入っている。read_xls()関数で範囲や形式を指定するには,sheet=,range=,col_names=,col_types=などのオプションを適切に指定する。
なお,read_xls()関数はネット上のファイルを直接指定できない(たぶん)ので,予めda03.xlsをダウンロードして作業フォルダに置いておく必要がある。
コーディングの説明は省略するが,gunmapyramids.Rを読み込んで実行すると,下図ができあがるはずである。
これまで書いたとおり,人口ピラミッドは,通常,男女の年齢別人口構造を左右向かい合わせに配置するが,男性人口,女性人口,あるいは男女合計人口の年齢構造を,2つの異なる集団について左右に配置し,集団間比較に使うこともできる。例えば,以下は,Preston SH et al. (2001) Demography. Blackwell Pub. p.22に掲載されている,スウェーデンとカザフスタンの女性の1992年の年齢階級別人口と年齢階級別死亡数の表である。
Age Group | Population in Sweden | Death in Sweden | Population in Kazakhstan | Death in Kazakhstan |
---|---|---|---|---|
0 | 59727 | 279 | 174078 | 3720 |
1-4 | 229775 | 42 | 754758 | 1220 |
5-9 | 245172 | 31 | 879129 | 396 |
10-14 | 240110 | 33 | 808510 | 298 |
15-19 | 264957 | 61 | 720161 | 561 |
20-24 | 287176 | 87 | 622988 | 673 |
25-29 | 311111 | 98 | 733057 | 752 |
30-34 | 280991 | 140 | 732312 | 965 |
35-39 | 286899 | 197 | 612825 | 1113 |
40-44 | 308238 | 362 | 487996 | 1405 |
45-49 | 320172 | 643 | 284799 | 1226 |
50-54 | 242230 | 738 | 503608 | 2878 |
55-59 | 210785 | 972 | 301879 | 3266 |
60-64 | 216058 | 1640 | 374317 | 5212 |
65-69 | 224479 | 2752 | 256247 | 6866 |
70-74 | 222578 | 4509 | 154623 | 6182 |
75-79 | 184102 | 6745 | 149917 | 8199 |
80-84 | 140667 | 9587 | 88716 | 9013 |
85+ | 110242 | 17340 | 58940 | 10627 |
この表のデータをタブ区切りテキストファイルにしたdeaths.txtを読みこんで,左にスウェーデン,右にカザフスタンを配置し,人口,死亡数,年齢別死亡率を比較できるように3つのグラフを横に並べてpng形式で描画するコードがcomp2pop.Rである。図を下に示す。
fmsbパッケージには,日本の国勢調査データから男女年齢各歳別人口だけ取り出してデータフレームにしたJpopとJpoplが含まれている(Jpopはオープンエンドの最高年齢が85歳以上,Jpoplは110歳以上)。変数は,最初の列が年齢Age(ただし最高年齢のところが"85+"となっているため,整数型ではなくFactorつまり要因型になっている),2列目からが1888年から5年おきに1918年までと,1920年から5年おきに1940年までと,1947年と,1950年から5年おきに最新までの年齢別人口である(変数名はM2015,F1888のように,男女を示す先頭文字と4桁年号である)。これを使えば,すべての国勢調査年の男女各歳別の人口ピラミッドを描くことは容易である。そのままの数字だと軸ラベルとして表示される桁数が大きすぎるので,10000で割って,タイトルに「(単位:万人)」と入れると見栄えが良い。
pyramid()関数で塗りつぶし色を指定するLcolとRcolというオプションは,実はベクトルを指定でき,特定年齢層だけを別の色で塗ることも可能である。母子保健対象年齢層を強調するために色を変え,戦後すぐと最新の2005年のピラミッドを並べて描くコードをpyramid2mch.Rに示す。図を下に示す。
これはRとLibreOfficeだけではできないので,ここでは古溝剛さんが公開されているGiamというソフトを使ってみる。
自動的にすべての年を処理するにはfor()を用いる。数字を含んだ文字列を作るにはsprintf()を用いると便利である。データの読み込みからpngファイルの一括生成まで含んだコードはmake-all-pyramids-japan.Rとなる(実行するとカレントディレクトリに大量のpngファイルが自動作成されるので注意)。
Giamを起動し,メニューバー「ファイル」の「コマの挿入」を選び,上で生成されたpngファイルを全部選んで「OK」する。実はいろいろなオプションが指定できるようだが,とりあえずウェイト(コマ間の待ち時間)をデフォルトの10/100秒から倍の20/100秒にして,GIF形式で保存してみると(書き込みオプションはデフォルトのまま),下のアニメGIFができあがる。
ただし,2013年2月現在では,animationパッケージを使う方が簡単だと思う。作り方は2012年Rユーザ会で発表した内容を参照されたい。
鵯記にメモした通り,フレーム内に描画するバージョンとして関数pyramidf()を追加した。オプションとして,描画フレームの左下と右上の座標を指定するframe=が増えただけで,他はpyramid()と同じである。frame=のデフォルトはc(-1.15, 1.15, -0.05, 1.1)であり,これはデフォルトのCgap値0.3でpyramid()を実行したときの座標と同じである。バージョン1.4以降をインストールすれば,library(pyramid); example(pyramidf)とするだけで,2005年と2010年の群馬県の人口ピラミッドを重ね描きする実行例が表示される。
神戸市の地図上に区別に人口ピラミッドを描くサンプルコード(kobe-plot.R)も載せておく。国土地理院のウェブサイトから兵庫県のshapeファイルを含むN03-140401_28_GML.zipをダウンロードし展開した後,EpiInfoに含まれているEpiMapのAddLayerPartial機能を使って神戸市だけの地図情報をkobe-city.shpとして保存し,同じディレクトリに神戸市の区別の人口データ(神戸市が独自に国勢調査結果をまとめているページから,平成22年国勢調査結果の「全市」をダウンロードして加工したもの)を置いて,Rでそのディレクトリを作業ディレクトリにしてこのコードを実行すると下図ができる(低解像度ラスタデータなので,国土地理院のシェイプファイル地理情報を使って描いたが個別許可は必要ないはず)。
mapdataパッケージに日本の都道府県地図データは入っているので,関西の府県別人口ピラミッドを地図上に重ね描きするだけなら,シェイプファイルを用意しなくても可能である。このコードを実行すると下図ができる。
社人研にエクセル形式で公開されている都道府県別人口データとmapdataパッケージの日本地図データ("japan")から,日本地図を描いた上に都道府県別人口ピラミッドを描くことができる。しかし全都道府県を表示するとあまりに画面が見にくくなるので,青森,東京,長野,沖縄の4都県だけを表示する。社人研データは2015年国勢調査に基づいた推計人口と,そこから5年ごとに2045年までの将来推計人口を含んでいるので,ピラミッドの形の変化がアニメーション表示されるようにしてみる。
animationパッケージを使う上で注意するのは,描画サイズはani.options()で指定すること,saveVideo()の場合はffmpegを別途インストールしておいてフルパスで指定することに加えて,座標系設定を伴う描画の時しかアニメーションに記録されないことである。つまり,最初に地図を表示してから,各都道府県のピラミッドをpyramidf()でフレーム指定して描画し,暫くポーズした後でrect()でフレームを白塗りし,次の年のpyramidf()を実行する場合,すべての描画が終わった状態の画像しか記録されないのである。そこで,各都県の各年度について,地図を描画するところから始めると,アニメーションとして記録されるようになった。
このコードを実行すると下図ができるはずである(MP4動画)。
鐵人三國誌にメモしたが,World Population Prospectsの2019年版データが,既にwpp2019というパッケージとしてcranに入っているので,国と地域と年次を選んで人口ピラミッドを描くコードを書いてみた。
wpp2019には多くの国・地域別に1950年から2020年までの年齢5歳階級別人口が入っているので,国・地域と年次を複数選択して(複数選択は,Ctrlキーを押しながらマウスクリックという,EZRと同じ方法)一気に人口ピラミッドを書く方が楽だろうと思って,それができるコードも書いてみた。当初,軸目盛の自動指定が今ひとつだったが,裏RjpWikiさんにpretty()という関数をご教示いただき(pretty()については,ほくそ笑むさんによる素晴らしい解説記事が参考になる),pyramid()の軸目盛のデフォルト設定を,これまでの0から最大値までを5等分するという単純な方法から,pretty()を使って設定する方法に変えた。もちろんLaxis=オプションで指定すれば,これまで通りに任意の軸目盛を与えることができるのは変わらない。pyramid_1.5.zip,またはpyramid_1.5.tar.gzとして,このサイトからダウンロードすることができるが,CRANにも登録した。
使用例として,ブラジル・中国・フランス・日本の1950年,1985年,2020年の人口ピラミッドを示しておく。
なお,1.5の登録申請後に,三重大学の奥村先生から,統計グラフの色というページを教えていただき,グラフのデフォルト描画色として,ユニバーサルデザインのベースカラーを使ったらどうかとご提案いただいた。確かにこれまで色には無頓着だったが,その方が良いと思うので,1.6で取り入れたいと思う。左が"#bfe4ff"で右が"#ffcabf"とすれば良かろう。試しにさっき作ったピラミッドをこの色で描き直してみると(コード,ただしサイズは後で半分に縮小した)下図のようになる。たしかにこの方が目に優しい気がする。
既に示したmapdataパッケージの地理情報と,wpp2019パッケージの人口データを組み合わせれば,他からデータをもってこなくても,地図上に世界の国や地域の人口ピラミッドを描くことが可能である。
問題は,mapdataパッケージに含まれている国名と,wpp2019パッケージに含まれている国名が異なる場合があることである。例えばベトナムは,mapdataでは"Vietnam"だが,wpp2019では"Viet Nam"である。その点だけ注意してコーディングすれば,コード自体はそんなに複雑ではない。東南アジア諸国の人口ピラミッドを地図上に描くコードでできた地図を示す。
米国の州別地図データはmapsパッケージに入っている。米国センサス局にある州別年齢各歳別男女別人口データ(CSVファイル)はRでそのまま読めるので,この2つを組み合わせることは簡単である。us-states.Rを実行すると下図ができる。
Correspondence to: minato-nakazawa[atmark]umin.net.