読者です 読者をやめる 読者になる 読者になる

初老のボケ防止日記

おっさんのひとりごとだから気にしないようにな。

スポンサーリンク

Python Pandasをさわってみる(2)

Python Pandas


Pandasのチュートリアルは親切なほうだと思うんだけど、いかんせんチュートリアルのサンプルが海外のデータなのでイマイチよくわからない。いや、統計をまともに学んでいないオッサンにとっては何を使おうと同じなのであるが、もう少しわかりやすくて色々と扱いやすいデータはないものかと。
Python Pandasを使う準備は前回でできた。

osa030.hatenablog.com

てことで、ネットで公開されている統計データを使って何かできないかなーと色々と探してみたところ例えばコンビニのシェア率とかネタ的に面白そうなデータは無料では一般公開されていないようので、政府統計で使えそうなものを探した。

でこれを見つけた。

www.stat.go.jp

この中で今回ターゲットにしたのはコチラ。

年次毎の都道府県別の年齢(区分)別人口

国勢調査の結果を元に毎年データが都道府県別に集計されているので、これを使えば時系列に都道府県別のデータが使えるんじゃないかと。なんとなくわかりやすくていいじゃないの。今回は入門なので「年齢(3区分)」でやってみる。

長期時系列データ

長期スパンでまとめられたもの。今回は以下の2つを使う。

  • 人口推計 長期時系列データ 我が国の推計人口(大正9年~平成12年)

統計表一覧 政府統計の総合窓口 GL08020103

表番号10「都道府県,年齢(3区分)別人口(各年10月1日現在)-総人口(昭和45年~平成12年)」

  • 人口推計 長期時系列データ 長期時系列データ(平成12年~22年)

統計表一覧 政府統計の総合窓口 GL08020103

表番号10「都道府県,年齢(3区分)別人口(各年10月1日現在)-総人口(平成12年~22年)」

単年度データ

平成23年から直近(平成26年)までのデータはこちらから

  • 人口推計 各年10月1日現在人口 年次

他の年月の統計表一覧 政府統計の総合窓口 GL08020102

表番号11「都道府県,年齢(3区分),男女別人口-総人口」

これで昭和45年(1970年)から平成26年(2014年)までのデータが手に入る。

データの前処理をする

よーし、じゃあこれをPandasにくわせて色々とやってみようと思ったんだけど、EXCELのセル構造をみたらEXCELのフォーマットが統一されていない。印刷後の紙出力を意識した空白セルがはいってたりと紙だと違いはわかりにくいんだけど、プログラムで処理するにはセルがずれるともう面倒くさい。

EXCEL方眼紙滅べ。

ということで、ここはひとつ統一フォーマットでCSVに出力しましょうそうしましょう。

環境

OS Windows 8.1(64bit)
Python 2.7.9(32bit)
Pandas 0.16.2
その他 xlrd

本当はPandasでやりたいところなんだけども、いきなりこんな複雑なことはしたら絶対心が折れるので普通にPythonでやることにした。

xlrdのインストール

pypi.python.org

PythonでEXCELを扱うモジュール。てっきりPandasが使うものかと思ってたらPandasは別のライブラリを使うらしい。でもそれでスクリプト組んだのでインストールする。

$ pip install xlrd

ディレクトリ構成

$ ls -F *
convert.py
datas:
H12_H22_05k5-10.xls
H23_a01100.xls
H24_a01100.xls
H25_a01100.xls
H26_a01100.xls
S45_H12_05k5-10.xls

変換対象のEXCELデータ

ダウンロードした統計データの以下のEXCELをdatas配下に以下の名称で配置した。

  • 都道府県,年齢(3区分)別人口*1
総人口(昭和45年~平成12年) S45_H12_05k5-10.xls

 

  • 都道府県,年齢(3区分),男女別人口
総人口(平成12年~22年) H12_H22_05k5-10.xls
総人口(平成23年10月1日現在) H23_a01100.xls
総人口(平成24年10月1日現在) H24_a01100.xls
総人口(平成25年10月1日現在) H25_a01100.xls
総人口(平成26年10月1日現在) H26_a01100.xls

出力形式

後々Pandasで処理しやすいかなーということで、こんな感じの形式で。

year 西暦
prefecture 都道府県名
young 0-14歳の人口
adult 15-64歳の人口
elder 65歳以上の人口

この形式で1行が出力されたCSVを作る。

変換スクリプト

#! /usr/bin/python
# -*- coding: utf-8 -*-

import xlrd
import csv

def load(inputxls):
  book = xlrd.open_workbook(inputxls)
  return book.sheet_by_index(0)

def encode(value):
  if isinstance(value,float):
    return int(value)
  return value.encode('utf-8').replace(' ','').replace(' ','')

def parse(sheet, start_row, prefecture_col, start_col, step, years ):
  rows = []
  for row_num in range( start_row, start_row + 47 ):
    y = row_num - 1
    x = prefecture_col - 1
    prefecture = encode(sheet.cell(y,x).value)
    x = start_col - 1
    for year in years:
      young = encode(sheet.cell(y,x+1).value)
      adult = encode(sheet.cell(y,x+2).value)
      elder = encode(sheet.cell(y,x+3).value)
      x += step
      rows.append([year,prefecture,young,adult,elder])
  return rows
 
def save(header, rows, outputcsv):
  with open(outputcsv, 'w') as f:
    writer = csv.writer(f, lineterminator='\n') 
    writer.writerow(header)
    writer.writerows(rows)

if __name__ == '__main__':
  header = (
  'year',
  'prefecture',
  'young',
  'adult',
  'elder',
  )
  targets = (
  ('datas/S45_H12_05k5-10.xls',11,3,5,4,range(1970,2000)),
  ('datas/H12_H22_05k5-10.xls',12,3,5,4,range(2000,2011)),
  ('datas/H23_a01100.xls',21,10,13,4,[2011]),
  ('datas/H24_a01100.xls',21,10,13,4,[2012]),
  ('datas/H25_a01100.xls',21,10,13,4,[2013]),
  ('datas/H26_a01100.xls',21,10,13,4,[2014]),
  )
  rows = []
  for target in targets:
    sheet = load(target[0])
    rows.extend(parse(sheet, *(target[1:]))) 
  save(header, rows, '1970-2014.csv') 

注意するところは、元がEXCELなので日本語の文字コードがcp932なのでそれをUTF-8にエンコードしてやらないと後々面倒。それと都道府県名の中や後ろに全半角スペースがあるので除去してやらないとダメ。あとはそれぞれのファイルの該当セル位置さえわかれば共通処理でいけた。

変換してみる

ヒャッハー!変換してやるぜー!

$python ./convert.py
$ ls 1970-2014.csv
1970-2014.csv

確認してみる

中身をみてみよう

  • 先頭3件
$ head -n 3 1970-2014.csv
year,prefecture,young,adult,elder
1970,北海道,1309,3576,299
1971,北海道,1302,3577,309
  • 末尾3件
$ tail -n 3 1970-2014.csv
2014,宮崎県,153,642,319
2014,鹿児島県,227,963,478
2014,沖縄県,249,903,270
  • 全件数
$ wc -l 1970-2014.csv
   2116 1970-2014.csv
  • 単年度のデータ件数
$ cat 1970-2014.csv | grep 1970 | wc -l
     47
  • 単一都道府県のデータ件数
$ cat 1970-2014.csv | grep "埼玉県" | wc -l
     45

元のデータ件数は、

期間 45(1970-2014)
都道府県 47
合計 2,115

なので、件数と出力形式はあっているようだ。長くなったのでこのデータをPandasで確認するのは次回に持越しだ。

べ、別に小出しにして記事数稼ごうというつもりじゃないんだからな。

Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)

Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)

*1:昭和45年~平成12年は男女別データがないのである

スポンサーリンク