Pythonで作る人口ピラミッド動画(YouTube投稿可)
人口ピラミッド。中国語風に書けば、人口金字塔。高齢化が進む日本の人口ピラミッド(年齢階級・性別別の人口分布)は全くもってピラミッド風の三角ナリをしていませんが、「金字」と言われれば、ふむそうかとなんとなく金の形に見えてきて、漢字訳を避けカタカナ読みを採用した日本人には見えない何かを中国の方は見ている・見ていたのかもしれません。
Pythonで統計動画
当アカウント「プラセボ・グラピクス」では、プラセボにまつわる少数の、そしてプラセボにまつわらない多数の統計動画を紹介しています。そして2020年現在その多くはPythonで書かれたプログラムで作成され、YouTubeチャンネルで公開されています。
なぜ「統計」動画かと言えば、統計的表現は通り一遍の紋切り型となる場合が多くプログラムとして表現しやすいからです。棒グラフとか円グラフとか、使い慣れた分かりやすい表現はほかの方(特に動画視聴者)にもなじみ深いため、受け入れられやすいはず。
ここでは、同様の取り組みを始めるにあたって情報収集をされている方、あるいは何らかのPython入門・初級コースを終え、新たな独自の目標となるような何かをお探しの方に向けて「Pythonでこんなこともできますよ!」という内容をお伝えします。
そして本noteの題材は、冒頭で述べた人口金字塔(人口ピラミッド)。その年次推移を動画にします。
なお、コードの全容や詳細を掲載するものではなく、あくまでも道筋を示するにとどまる内容ですので予めご了承ください。一通り読んでみて知らないことが多く・難しく感じた場合は、各種の脱初心者コースや中級コースを履修の上、再度チャレンジすることをお勧めします。
統計動画作成の大まかな道程
解像度を上げずにPythonでの統計動画作成順を列挙すれば以下。
一つ一つをもう少し詳しく見てみましょう。
データ取得
今回のメインとなるものではありませんが、実は一番の鬼門がこのデータ取得フェーズかもしれません。大元となるデータを外部から引っ張ってこなきゃならないけれど、欲しいデータがまるっと転がっていることはほぼほぼあり得ないからです。
最近では政府統計サイトe-Statの充実が図られ以前より取得が簡単になったものと思われますが、それでも困難を感じる場面が多いです。しょうがないのでe-Statサイトをクローリングして必要な情報を取得する簡易プログラムを作って(もちろんPythonで)対応したりしています。本当はe-Stat内で提供されるデータベース機能(またはAPI機能)がより充実しリアルタイムで全項目が更新されるようになることを期待しますが、中々難しいのでしょう。
クローリングやスクレイピングも身に着けるべき技術の一つと捉え、Pythonの腕を磨く機会と考えるのが良いかもしれません。
政府関連統計は基本的に隔年次(二年ごと)、年度次、年次、月次など期間ごとにばらばらの「ファイル」で提供されています。もしほしいデータが「データベース」として提供されていれば一括してデータを取得できるかもしれません。データベース機能に習熟するためにはExcelでいうところのピボットテーブルの知識が必要不可欠です。もし未修得の場合にはこちらの勉強も視野にいれることをお勧めします。
人口ピラミッド動画を作るなら、年次ないし隔年次別に性別・年齢階級別の人口がわかるデータを取得してください。
データ整形
さて鬼門のデータ収集を済ませた後も気を抜くことはできません。プログラムで扱いやすいようデータを前処理する必要があります。この段階のみを扱った本が出ているほど奥の深い分野であり、一筋縄ではいきません。
特にe-Statで提供される日本国内のデータはプログラムから読み取り利用しやすいようにはできておらず、もっぱら人間がExcel等の表計算ソフトで閲覧しやすいように提供されている場合があります。
一方、国連が提供している世界各国の人口推移データを見たときはあまりの整いっぷりに驚かされました。前処理ほぼ要らんやん…。
e-Statのデータに基づく場合は覚悟を決めてPandasとお友達になりましょう。Pandasはデータ解析支援に頻用されるPythonライブラリ※です。
統計動画を作成し、作成し続けるために必須のスキルはPandasの活用です。「ExcelにできることはExcelで」というのも一つの方針ですし、VBA(Excel等で動くプログラム)を活用して自動化さえできるのではありますが、それでも。Pandasによるデータ整形技術は、統計動画作成に疲れ切ってしまわず、継続可能なプロジェクトにするための必須スキルと言えるでしょう。
人口ピラミッド動画作成には、列見出しを上記のようなものとするデータが必要です。整形されたデータはCSVファイルなどとして保存しておきましょう。df.to_csv。
★動画の枠組みを作成
さて、本題はここから。
Pythonを利用する場合、統計動画本体は何でつくるのか。
という疑問の直接的な回答はこう。
「Matplotlibで」
Matplotlibはグラフ描画ライブラリ。上記のデータ解析支援ライブラリPandasと非常に仲良しな(∵より基礎的な計算用ライブラリNumpyを共有している)ライブラリです。自由度が高く(それゆえ修得が困難ではありますが…)、静止画・動画いずれにも対応する便利さで、Pythonで統計グラフ動画を作成するなら迷わずMatplotlibを選んで間違いありません。
あまり突っ込んだことを書く余裕はありませんが、大まかな流れを述べておきます。ここでは特に人口ピラミッド動画のようなやや複雑さを伴う動画の場合に限定しています。
①動画作成には「matplotlib.animation.FuncAnimation」クラスの利用がおすすめ。類似の「ArtistAnimation」クラスが存在し、日本語情報はこちらの方が多いように感じますが、柔軟にプログラム可能な「FuncAnimation」の活用をお勧めします。
②まずは枠組みを固める。枠組みというか、まずは作りたい形の静止画を完成させることを考えます。動画はこの静止画を高速で連続的に入れ替える紙芝居のようなもの。ある年のデータをダミーとして静止画作成に活用すれば十分でしょう。静止画・静止グラフとして表現できたなら、ほぼそのまま動画にもできるはず。反対に静止画の作成がままならなければ、動画を目標にするのは時期尚早と言えるでしょう。
③データと図形等の表現を分離する。人口ピラミッド動画を作成する場合、Matplotlibで用意されている自動整形タイプのグラフを利用することは難しいです。そのため、例えば長方形オブジェクト「matplotlib.patches.Rectangle」を利用して棒グラフを表現します。このとき、「(アーティストと呼ばれる)オブジェクトを用意する」仕事と「このオブジェクトの長さ・配置をデータに従い決定する」仕事とは分離しておきましょう。「FuncAnimation」ではデータだけが順次与えられ、その都度データに見合った静止画を返すようなプログラムを組むことになりますが、その際に「blit」という高速化が利用しやすくなるためです(詳細略)。
データを流し込み、動画を作成
さて枠組みが出来上がれば、次はデータを次々に差替えて動画を完成させます。
この際、データはすべてPandasのDataFrameで扱うようにしておきます。なぜなら、FuncAnimationクラスは引数framesにDataFrameのリストを受け付けてくれるからです。やったね!
前のデータ整形段階で縦横無尽にデータを扱うことに習熟していれば、これはそれほど難しいことではありません。日付を指示する列を対象とし「pandas.DataFrame.groupby」メソッドによりframe用の日付毎データのリストを用意してやれば、あとは枠組みに流し込むだけで順次静止画(正確にはアーティストのリスト)が生成され、自動的に張り合わせて動画が完成します。というか、そうなるようにプログラムを組み上げます。
もし動画のフレーム数を増やしてもっと滑らかな動画にしたければデータの補間(interpolate)を実施しましょう。「pandas.DataFrame.interpolate」メソッドが便利です。
補間することを考えれば、たとえ年次データが提供されているとしても日付データをあらかじめ持たせておいた方が良いでしょう。動画プログラムの作成にはデータ整形の手順を行ったり来たりする試行錯誤が求められます。
おわりに
いかがでしょうか。Pythonで人口ピラミッド動画ないし統計動画を作成する見込みは立ちそうでしょうか。
具体的なコードには一切触れていないためもやもやとしたものがたくさん残ったかもしれません。もし要望があれば(全体ではないにせよ)コードを示しつつの解説も行いますのでコメント等にてご質問いただければと思います。
さてこんな国もありますね。
うーむ、ピラミダル!
その他その他、(手近にあったため文脈無視で適当に)アイキャッチで利用した運転免許統計×人口ピラミッドなど、各種人口金字塔動画そろい踏みのYouTubeチャンネル「プラセボ・グラピクス」で、是非Pythonによる動画作成の柔軟性をご堪能ください。
あなたも動画を創りたくなることを願って。
この記事が気に入ったらサポートをしてみませんか?