月別アーカイブ: 2014年4月

GLMをPythonでやってみる

ある勉強会でGLMについての課題が出ました。まずRで作ったのですが、やってみたらPythonでもできましたので、その辺をまとめてみました。

Pythonについて

PythonはRよりもしっかりしたプログラミング言語であり、かつRのように手軽に書くことができます。テキスト処理やクラスを使用した中規模以上のプログラムについてはRの方が書きやすい(はず)です。

近年科学計算系のモジュールの開発が進んでおり、Appendixに挙げたブログ記事によると、データ分析の主要ツールとしてRにとって代わる可能性もあるようです。
また、発生率の作成や分析、プロジェクションなど、アクチュアリーの業務に役立つ可能性をかなり秘めているのではないかと思っています。

Pythonモジュール

以下のモジュール(Rのパッケージのようなもの)を組み合わせることによってGLMが利用できます。

  • numpy, scipy – 数値計算、科学計算用モジュール
  • pandas – Rでいうデータフレームを扱うためのモジュール
  • pasty – model matrixを作成するためのモジュール
  • statsmodels – LM, GLMなどの分析を行うためのモジュール
  • matplotlib – グラフィックを扱うモジュール(Rでいうggplotのようなもの)

PythonとRの比較・対応

PythonはRよりもしっかりしたプログラミング言語であり、かつRのように手軽に書くことができます。他のプログラミング言語のような記述もできますが、GLMのような科学技術計算においてはRに近い形で記述できます。
Rのオブジェクト・関数とは概ね以下のような対応になります。

  • ベクトル – numpyモジュールのndarray
  • データフレーム – pandasモジュールのDataFrame
  • リスト、ベクトル演算をしない配列 – Python本体のリスト
  • 科学技術計算用関数 – scipyやstatsmodelsモジュール

コードおよび結果

Generalized Linear Models for Insurance Dataという本のdiabetes.xlsをcsvに変換して使用し、GLMでモデルを組んでみました。
diabetes.xlsは以下から取得できます。
http://www.businessandeconomics.mq.edu.au/our_departments/Applied_Finance_and_Actuarial_Studies/research/books/GLMsforInsuranceData/data_sets
Pythonコードおよび出力結果、対応するRコードおよび結果は以下のとおりで、Rの結果が再現できています。
https://gist.github.com/threecourse/11339125

Python環境構築

Pythonの開発環境にはいくつかありますが、科学計算系モジュールのインストールは結構面倒くさい(ことがある)ので、Enthought Canopy Expressというモジュールプリインストールの開発環境を使うのが便利だと思います。なお、商用利用可で、「Pythonによるデータ分析入門」でも薦められています。

また、Python ver2系とver3系の選択ですが、ver3系ではUnicode対応をはじめとして、言語向上のため後方互換性のない変更が行われています。科学的なコミュニティの大半はまだver3系に移行していないため、しばらくは2系の方が良いと思われます。

参考資料

ブログ記事

アクチュアリー向けPythonプログラムの紹介

  • Pythonによるプライシングツール(私が作成したものです)
    http://threeprogramming.lolipop.jp/blog/?p=624

    以下の特徴を持つ、実務に役立つと思われるプライシングツールです。

    • 「関数の集合」のみの記述で保険モデルを表現できる
      他の言語では、計算するには計算順序を指定する必要があるのですが、Pythonの柔軟性と「メモ化」という技術によって計算順序の指定を不要としています。
    • オブジェクト指向により、新しく保険種類を追加する場合に差分のみの記述で行えるようにしています。
  • Python をVBAのようにExcelで使うソフトを試す
    http://actuarialforumjapan.net/2013/04/29/test_datanitro/

Gitについて

いろいろ書籍を読んでみて、使い方がなんとなくわかってきた気がします。
Subversionと比べたときの利点は以下でしょうか。

  • 一人開発だと、リポジトリと作業フォルダを同じフォルダで行える。
  • ブランチが切りやすい
  • rebaseすることでコミットをまとめられたり、間違えたコミットを修正できる。

Subversionよりやや複雑ですが、やはり使いやすいように思います。以下のブログで述べられているように、分散型か集中型かではなく、ブランチの切り方やマージの仕方がGitの使いやすさのポイントなのかなと思います。
http://d.hatena.ne.jp/torutk/20140119/p1

参考文献は以下のとおりです。

Windows環境なのですが、インストールしたソフトウェアは以下です。