PHPで平均余命の伸び率をグラフ表示

(1/1)
厚生労働省は毎年、簡易生命表を発表している。男女とも、平均寿命はどんどん伸びている。
一方、身の回りで振り返ると他界した同期も少なくなく、年齢階層別の平均余命の伸びはどうなっているのだろうか、と疑問を感じた。
そこで、厚労省のデータを使って、「PHPでNHK政治意識月例調査をグラフ表示」で作ったPHPプログラムをベースに、平均余命の伸び率を暗く表示させてみることにする。

(2023年2月13日)令和3年度簡易生命表に対応

サンプル・プログラムの実行例

PHPで平均余命の伸び率をグラフ表示
男性の、年齢階層別の伸び率をグラフにしてみると、20歳、40歳の伸び率は、平均寿命の伸び率を下回っている。65歳以上の高齢者の伸び率が平均寿命を押し上げているのだ。
女性で見ると、さらに顕著だ。年齢が高くなるに伴って、ますます長生きすることが見て取れる。
20~30代の死因の上位は、自殺、事故であるから、これらを減らせば、平均寿命は更に伸びるのではないだろうか。

サンプル・プログラム

圧縮ファイルの内容
viewLifeExpectancy.phpサンプル・プログラム本体
LifeExpectancy.csv簡易生命表データファイル
viewLifeExpectancy.php 更新履歴
バージョン 更新日 内容
1.2 2022/04/09 PHP8対応,リファラ・チェック改良
1.11 2019/07/14 グラフの色を指定できるように
1.1 2019/07/14 グラフの表示幅・高さを指定できるように
1.01 2019/07/14 リファラ・チェック追加
1.0 2017/07/30

解説:準備

  34: //グラフの表示幅・高さ(単位:ピクセル)
  35: define('WIDTH',  600);
  36: define('HEIGHT', 600);
  37: 
  38: //jqPlotのあるフォルダ
  39: define('JQPLOT', '../../../../common/jqplot/');
  40: 
  41: //データファイル名
  42: define('DATA_FILE', './LifeExpectancy.csv');

折れ線グラフを描くのに、jQueryプラグイン「jqPlot」を利用する。
公式サイト「jqPlot Charts and Graphs for jQuery」から圧縮ファイルをダウンロードし、適当な場所に解凍しておく。その場所を定数 JQPLOT に定義する。

また、厚生労働省「平成30年簡易生命表」に掲載されている図表データから、1947年(昭和22年)以降の毎年の平均余命の推移を元に、データファイル "LifeExpectancy.csv" を用意した。カラム区切りはタブである。
これを読み込んで、プログラム内で伸び率を計算、グラフ表示させる。
データファイルの構造
西暦年 平均余命
男性 女性
0歳 20歳 40歳 65歳 75歳 90歳 0歳 20歳 40歳 65歳 75歳 90歳

解説:jqPlotスクリプト

 249: /**
 250:  * jqPlot用のスクリプト:下請け
 251:  * @param   array  $items データ配列
 252:  * @param   string $category 種別
 253:  * @return  string スクリプト
 254: */
 255: function plotSub($items, $category) {
 256:     //プロットするデータ
 257:     switch ($category) {
 258:         case 'zero':
 259:             $table  = array('男性', '女性');
 260:             $colors = array('blue', 'red');     //グラフの色
 261:             break;
 262:         default:
 263:             $table  = array('0歳', '20歳', '40歳', '65歳', '75歳', '90歳');
 264:             $colors = array('cyan', 'green', 'blue', 'red', 'purple', 'orange');
 265:             break;                              //グラフの色
 266:     }
 267: 
 268:     //系列の生成
 269:     $str2 = '';
 270:     foreach ($table as $key=>$val) {
 271:         $str2 ."\t\t\t{ label: '{$val}', color: '{$colors[$key]}' },\n";
 272:         $series[] = '';
 273:     }
 274: 
 275:     $year_min = 9999;
 276:     $year_max = 0;
 277:     foreach ($items as $year=>$val) {
 278:         if ($year < $year_min)       $year_min = $year;      //X軸の最小値
 279:         if ($year > $year_max)      $year_max = $year;      //X軸の最大値
 280:         if ($category == 'male') {
 281:             for ($key = 0$key < 6$key++) {
 282:                 $series[$key.sprintf("['%04d-01-01', %4.1f],", $year, $val[$key]);
 283:             }
 284:         } else if ($category == 'female') {
 285:             for ($key = 6$key < 12$key++) {
 286:                 $series[$key - 6.sprintf("['%04d-01-01', %4.1f],", $year, $val[$key]);
 287:             }
 288:         } else {
 289:             $series[0.sprintf("['%04d-01-01', %4.1f],", $year, $val[0]);
 290:             $series[1.sprintf("['%04d-01-01', %4.1f],", $year, $val[6]);
 291:         }
 292:     }
 293:     $year_min = floor($year_min / 5* 5;
 294:     $year_max = ceil($year_max / 5* 5;
 295: 
 296:     $str1 = '';
 297:     foreach ($series as $val) {
 298:         $str1 ."\t\t[ " . $val . "],\n";
 299:     }
 300: 
 301:     $js =<<< EOT
 302: jQuery(function() {
 303:     jQuery.jqplot('jqPlot_polls',
 304:     [
 305: {$str1}
 306:     ],
 307:     {
 308:         //系列
 309:         series: [
 310: {$str2}
 311:         ],
 312:         legend: {
 313:             show: true,
 314:             placement: 'inside',
 315:             location: 'nw',
 316:             renderer: $.jqplot.EnhancedLegendRenderer,
 317:             rendererOptions: { numberRows: 1 }
 318:         },
 319:         seriesDefaults: {
 320:             showLine: true,
 321:             rendererOptions: { smooth: false },
 322:             markerOptions: { size: 0 },
 323:         },
 324:         //軸
 325:         axes: {
 326:             xaxis: {
 327:                 renderer:$.jqplot.DateAxisRenderer,
 328:                 tickOptions: { formatString: '%Y' },
 329:                 label: '西暦年',
 330:                 min: '{$year_min}-01-01',
 331:                 max: '{$year_max}-12-31',
 332:             },
 333:             yaxis: {
 334:                 label: '伸び率'
 335:             }
 336:         },
 337:         //ハイライター
 338:         highlighter: {
 339:             show: true,
 340:             showMarker: true,
 341:             tooltipLocation: 'sw',
 342:             fadeTooltip: false,
 343:             bringSeriesToFront: true,
 344:             tooltipAxes: 'xy',
 345:             formatString: '%s年<br />伸び率%s'
 346:         }
 347:     }
 348:     );
 349: });
 350: 
 351: EOT;
 352: 
 353:     return $js;
 354: }

 356: /**
 357:  * jqPlot用のスクリプト:男性
 358:  * @param   array $items データ配列
 359:  * @return  string スクリプト
 360: */
 361: function plotMale($items) {
 362:     return plotSub($items, 'male');
 363: }

 365: /**
 366:  * jqPlot用のスクリプト:女性
 367:  * @param   array $items データ配列
 368:  * @return  string スクリプト
 369: */
 370: function plotFemale($items) {
 371:     return plotSub($items, 'female');
 372: }

 374: /**
 375:  * jqPlot用のスクリプト:0歳余命
 376:  * @param   array $items データ配列
 377:  * @return  string スクリプト
 378: */
 379: function plotZero($items) {
 380:     return plotSub($items, 'zero');
 381: }

ここでは、jqPlotプラグインの「jqplot.dateAxisRenderer.js」(時間軸を扱う)、「jqplot.highlighter.js」(ツールチップなどハイライト表示を行う)、「jqplot.pointLabels.js」(データポイントラベルを表示する)の3つを使っている。
jqPlotの使い方は、「jqPlot - jQuery プラグイン」(アルファシス)が詳しい。

男性、女性、0歳余命は、伸び率を格納しているデータ配列 $items から表示させる要素が違うだけなので、下請け関数 plotSub 内で場合分けしてスクリプトを発生させるように下。

参考サイト

(この項おわり)
header