サイトトップ | 人口学 | [in English]

人口ピラミッドの作り方
(How to make population pyramid)

最終更新:28 August 2019

このページの目的は,フリーソフトを使って簡単に人口ピラミッドを描く方法を説明することである。Windows環境での説明をするが,使うソフトはどちらもLinux版やFreeBSD版やMac版があるので,おそらくそれらの環境にも応用可能だろう。

用意するソフトウェアとインストール方法

以下3種類のソフトを用意する。

  1. LibreOffice:オフィスソフトだが(日本語版トップページ),人口ピラミッドを描く上で重要なのは,データ入力や編集に使う表計算ソフトCalcである。既にMicrosoft Officeが入っているならExcelでも良いし,他のフリーな表計算ソフトとしてはGnumeric PortableEtherCalcを使っても良い。
  2. R:統計解析環境というかスクリプト言語としても有名になったが,強力な作図機能をもっている(入手はCRANから)。人口ピラミッドを作った後に他のソフトに持ち出すのに,jpegやpngなどのラスタグラフィックにもできるし,pdfやWindowsメタファイルなどのベクトルグラフィックにもできるなど,サポートしているファイル形式が多い。CRANから自分のOS用のバージョンをダウンロードして実行すればインストールできる。詳しくは統計処理ソフトウェアRについてのTipsをご覧いただきたい。
  3. R用のpyramidパッケージ:開発過程はここに書いたが,簡単に人口ピラミッドを描くためだけに作ったパッケージである(pyramid_1.5.zipのダウンロード)。Rへのインストールは,インターネットにつながった環境であれば,Rを起動後に[パッケージ]の[パッケージのインストール]を選び,CRANミラーサイトを指定して,pyramidパッケージをインストールするだけで良い。インターネットにつながっていない場合は,[パッケージ]の[ローカルにあるzipファイルからのパッケージのインストール]を選び,予めダウンロードしておいたpyramid_1.5.zipを指定する。
    なお,マウスを使いたくなければ,プロンプトに対してinstall.packages("pyramid")と打つのでもインストールできるし,utils:::menuInstallLocal()と打ってから予めダウンロードしておいたpyramid_1.5.zipを選ぶのでもインストールできる。

データの入手先

自分で調査して得たデータを使うこともあるだろうし,官公庁などが発表している二次資料を使うこともあるかと思うが,人口ピラミッドを描くときに必要なデータは,いずれの場合でも男女年齢階級別人口である。

作図の手順(1)

まず,pyramid()またはpyramids()関数を使って,日本の人口について,既発表資料から人口ピラミッドを作る方法を紹介する。

  1. 必要な情報は,年齢階級区分と男女年齢各歳別人口と目盛だけなので,国勢調査のページからダウンロードしたExcelまたはCSVファイルから人口ピラミッドを作るためには,まず必要な情報だけを抜き出したファイルを作らねばならない。このためには,次のようにすると楽である。
  2. 例えば,長野県全県の平成27年(2015年)国勢調査人口の男女年齢各歳別人口ピラミッドを作ってみよう。平成27年国勢調査>人口等基本集計>都道府県結果>20長野県から,3-1 年齢(各歳)男女別人口のCSVファイルをダウンロードする。タスクトレイにあるLibreOfficeのクイック起動メニューから表計算ドキュメントを選ぶことでCalcを起動し,そこにダウンロードしたファイルをドラッグ&ドロップすると,読み込みオプションを指定する画面になるので,文字化けしていたら適切な文字コードを選び,区切り記号としてコンマを指定すると読み込める。B列が男女込みの人口か男性人口か女性人口か,総数か日本人のみか,の区分である。男性の総数は201,女性の総数は301である。E列が地域区分を示し,全県かDID地区のみか市部か郡部かという4種類あるが,全県のデータであれば「長野県」を選べば良い。12行目が年齢を示していて,G列が0歳,DM列が110歳以上,となっている。なお,DN列を見ると,年齢「不詳」がかなり多いことがわかる。年齢「不詳」はピラミッドに含めることができないので扱いが難しいが,ここでは単純にピラミッド描画には使わないことにする。
  3. 次にファイル(F)から新規作成を選んで「表計算ドキュメント」を新しく作る。A1にAgeと打ち,A2に0と打ち,A3に1と打って,その両者を選んでから右下の黒いドットを下にA112までドラッグすると,110までの数字が入る。B1にMalesと打ってから元の表に戻り,G21からDM21を選んでコピーし,新しい表に戻ってB2で右クリックし,「形式を選択して貼り付け>形式を選択して貼り付け」のオプションで「行と列を入れ替える」を選んでペーストする。次にC1にFemalesと打ってから元の表に戻ってG29からDM29を選んでコピーし,さきほどと同様に「行と列を入れ替える」を選んでペーストする。このデータは高齢の部分で0人のところが"-"になっているため,そのセルを0で置き換える。そうしておかないと,Rで読み込んだときに男性人口も女性人口も自動的にfactor型になってしまうので作図できない。
  4. 「ファイル(F)」から「保存」を選び,ファイルの種類を「テキストCSV」にして,適当な名前を付けて保存する。フィールドのオプションを尋ねるダイアログが出てくるので,フィールドの区切り記号を{タブ}にして保存する。nagano-table-2015.csvのようなテキスト形式データファイルができるので,Calcを終了する。
  5. Rを起動し,まず
    library(pyramid)
    とする(注:もちろん,pyramidパッケージがインストール済みであることが前提である)。次に例えば,
    x<-read.delim("e:/work/nagano-table-2015.csv")
    のように,保存したタブ区切りテキストデータファイルをフルパスで指定してデータフレームに読み込む(なお,Calcでの上記操作をスキップしてRだけ使いたい方は
    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で編集すると良い。

  1. Rが表示している人口ピラミッドのウィンドウ上のどこでもいいのでマウスを右クリックして,「メタファイルとしてコピー(copy as metafile)」すれば,この図はウィンドウズメタファイルとしてクリップボードに保存される。この状態でコンソール(R Console)に
    q()
    と打ってRを終了してよい。Save workspace image?(日本語版では「作業スペースを保存しますか?」)というダイアログには「いいえ」でよい。
  2. LibreOfficeのDrawを起動し,「編集」から「貼り付け」を選べば保存した図が貼り付けられる。これを編集するには,図を選んだ状態で「変更」から「切り離す」を選べばよい。図の個々の要素が編集可能になるので,年齢の表示から余計なものを取り除く。ここは残念ながら手作業でやるしかない。縦横に均等に並べるには,均等配置したい要素を選んでから「変更」の「分布」(右クリックからも選べる)を使うと便利である。
  3. 加工後の画像は,Drawの「ファイル(F)」メニューから「エクスポート」することで,PNGやJPEGなどの画像ファイルもできるし,PDF形式にするのも簡単である。

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()

と打てば,下図程度にはきれいに仕上がる。

長野県の人口ピラミッド(2015年国勢調査)

作図の手順(2)

次に,小集団の生データから人口ピラミッドを作る方法を紹介する。

小集団の年齢データから作った人口ピラミッド

たくさんの人口ピラミッドを表示してみる

作図の手順(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つの集団の人口構造などを比べてみる

これまで書いたとおり,人口ピラミッドは,通常,男女の年齢別人口構造を左右向かい合わせに配置するが,男性人口,女性人口,あるいは男女合計人口の年齢構造を,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
0597272791740783720
1-4229775427547581220
5-924517231879129396
10-1424011033808510298
15-1926495761720161561
20-2428717687622988673
25-2931111198733057752
30-34280991140732312965
35-392868991976128251113
40-443082383624879961405
45-493201726432847991226
50-542422307385036082878
55-592107859723018793266
60-6421605816403743175212
65-6922447927522562476866
70-7422257845091546236182
75-7918410267451499178199
80-841406679587887169013
85+110242173405894010627

この表のデータをタブ区切りテキストファイルにしたdeaths.txtを読みこんで,左にスウェーデン,右にカザフスタンを配置し,人口,死亡数,年齢別死亡率を比較できるように3つのグラフを横に並べてpng形式で描画するコードがcomp2pop.Rである。図を下に示す。

Compare age-structures between Sweden and Kazakhastan

特定年齢層を強調した日本の人口ピラミッドを描く

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に示す。図を下に示す。

戦後と最近の日本における母子保健対象の比較

日本の人口ピラミッドのアニメGIFを作ってみる

他に用意するソフト

これはRとLibreOfficeだけではできないので,ここでは古溝剛さんが公開されているGiamというソフトを使ってみる。

固定サイズのpngファイルを自動出力させる

自動的にすべての年を処理するにはfor()を用いる。数字を含んだ文字列を作るにはsprintf()を用いると便利である。データの読み込みからpngファイルの一括生成まで含んだコードはmake-all-pyramids-japan.Rとなる(実行するとカレントディレクトリに大量のpngファイルが自動作成されるので注意)。

Giamを使ってアニメGIF化する

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年の群馬県の人口ピラミッドを重ね描きする実行例が表示される。

応用例1:神戸市の地図上に区別の人口ピラミッドを描く

神戸市の地図上に区別に人口ピラミッドを描くサンプルコード(kobe-plot.R)も載せておく。国土地理院のウェブサイトから兵庫県のshapeファイルを含むN03-140401_28_GML.zipをダウンロードし展開した後,EpiInfoに含まれているEpiMapのAddLayerPartial機能を使って神戸市だけの地図情報をkobe-city.shpとして保存し,同じディレクトリに神戸市の区別の人口データ(神戸市が独自に国勢調査結果をまとめているページから,平成22年国勢調査結果の「全市」をダウンロードして加工したもの)を置いて,Rでそのディレクトリを作業ディレクトリにしてこのコードを実行すると下図ができる(低解像度ラスタデータなので,国土地理院のシェイプファイル地理情報を使って描いたが個別許可は必要ないはず)。

神戸市区別人口ピラミッド

応用例2:関西の地図上に県別の人口ピラミッドを描く

mapdataパッケージに日本の都道府県地図データは入っているので,関西の府県別人口ピラミッドを地図上に重ね描きするだけなら,シェイプファイルを用意しなくても可能である。このコードを実行すると下図ができる。

関西府県別人口構造(国勢調査2015年)

応用例3:日本地図の上に青森,東京,長野,沖縄の2015年国勢調査人口から5年ごとに2045年までの将来推計人口をアニメーション表示する

社人研にエクセル形式で公開されている都道府県別人口データとmapdataパッケージの日本地図データ("japan")から,日本地図を描いた上に都道府県別人口ピラミッドを描くことができる。しかし全都道府県を表示するとあまりに画面が見にくくなるので,青森,東京,長野,沖縄の4都県だけを表示する。社人研データは2015年国勢調査に基づいた推計人口と,そこから5年ごとに2045年までの将来推計人口を含んでいるので,ピラミッドの形の変化がアニメーション表示されるようにしてみる。

animationパッケージを使う上で注意するのは,描画サイズはani.options()で指定すること,saveVideo()の場合はffmpegを別途インストールしておいてフルパスで指定することに加えて,座標系設定を伴う描画の時しかアニメーションに記録されないことである。つまり,最初に地図を表示してから,各都道府県のピラミッドをpyramidf()でフレーム指定して描画し,暫くポーズした後でrect()でフレームを白塗りし,次の年のpyramidf()を実行する場合,すべての描画が終わった状態の画像しか記録されないのである。そこで,各都県の各年度について,地図を描画するところから始めると,アニメーションとして記録されるようになった。

このコードを実行すると下図ができるはずである(MP4動画)。

青森,東京,長野,沖縄の2015年から2045年の推計人口

世界の国や地域の人口ピラミッドを描く

鐵人三國誌にメモしたが,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年の人口ピラミッドを示しておく。

ブラジル・中国・フランス・日本の1950年,1985年,2020年の人口ピラミッド

なお,1.5の登録申請後に,三重大学の奥村先生から,統計グラフの色というページを教えていただき,グラフのデフォルト描画色として,ユニバーサルデザインのベースカラーを使ったらどうかとご提案いただいた。確かにこれまで色には無頓着だったが,その方が良いと思うので,1.6で取り入れたいと思う。左が"#bfe4ff"で右が"#ffcabf"とすれば良かろう。試しにさっき作ったピラミッドをこの色で描き直してみると(コード,ただしサイズは後で半分に縮小した)下図のようになる。たしかにこの方が目に優しい気がする。

ブラジル・中国・フランス・日本の1950年,1985年,2020年の人口ピラミッド(ユニバーサルデザインベースカラー版)

地図上に世界の国や地域の人口ピラミッドを描く

既に示したmapdataパッケージの地理情報と,wpp2019パッケージの人口データを組み合わせれば,他からデータをもってこなくても,地図上に世界の国や地域の人口ピラミッドを描くことが可能である。

問題は,mapdataパッケージに含まれている国名と,wpp2019パッケージに含まれている国名が異なる場合があることである。例えばベトナムは,mapdataでは"Vietnam"だが,wpp2019では"Viet Nam"である。その点だけ注意してコーディングすれば,コード自体はそんなに複雑ではない。東南アジア諸国の人口ピラミッドを地図上に描くコードでできた地図を示す。

東南アジア諸国の人口ピラミッド

米国の州別人口ピラミッドを地図上に描く

米国の州別地図データはmapsパッケージに入っている。米国センサス局にある州別年齢各歳別男女別人口データ(CSVファイル)はRでそのまま読めるので,この2つを組み合わせることは簡単である。us-states.Rを実行すると下図ができる。

Population pyramids of US 7 states on the map

Correspondence to: minato-nakazawa[atmark]umin.net.

リンクと引用について