OpenFisca触ってみたメモ 2022-06-18 yuiseki
感想
時期によって適用される制度は様々に変化する、ということが最も重要な前提としてソフトウェア全体が設計されている
制度のロジック、条件判定に関わる値を、常にベクトルで扱っている OpenFiscaのPythonコード上の値は、スカラーやブーリアンではない。常にベクトル よって、制度の条件判定は、ベクトル空間における演算として記述される 推測だがこれによって画期的に書きやすくなっている
複雑な制度のロジックをスカラーやブーリアンではなくベクトルで扱うという発明 ここの「ベクトル」の概念をもう少し詳しく教えて欲しいですtkgshn.icon*3
yuiseki.iconの理解
スカラーやブーリアンで複雑な制度条件ロジックを記述しようとすると大量のif文を書くことになる
制度の条件も、制度を使えるかどうかという各個人の様々な属性情報も、多次元ベクトルとしても表現することができる
ある人がある制度を使えるということは多次元ベクトル空間上で「制度の条件ベクトル」と「個人の属性ベクトル」が雑に言うと同じ向きになる(正確に言うと重なり合っている)ということである
例
code:python
def formula(対象世帯, 対象期間, parameters):
児童手当 = parameters(対象期間).福祉.児童手当
世帯収入 = 対象世帯("世帯収入", 対象期間)
所得閾値 = 児童手当.所得閾値
所得条件 = 世帯収入 <= 所得閾値
ひとり親 = 対象世帯.nb_persons(世帯.保護者) == 1
子どもたちの年齢 = 対象世帯.members("年齢", 対象期間)
八歳未満の子どもがいる = 対象世帯.any(子どもたちの年齢 < 8)
六歳未満の子どもがいる = 対象世帯.any(子どもたちの年齢 < 6)
手当条件 = 所得条件 * ((ひとり親 * 八歳未満の子どもがいる) + 六歳未満の子どもがいる)
手当金額 = 児童手当.金額
return 手当条件 * 手当金額
ここで当たり前のように*とか+という演算記号が出現しているが、これは算数的な掛け算や足し算ではない。これによって条件分岐を表現している
If no NumPy function helps you express a very specific condition, you can code arbitrary conditions using * instead of and, and + instead of or.
NumPyを使わずにベクトルを素朴に*をするとandになり+にするとorになる!!!!
これはベクトルがそもそもNumPyのarrayだからnishio.icon
*と+は演算子オーバーロードされて要素ごとのペアワイズ計算になっている
でbooleanのTrueは1、Falseは0として解釈される、これはPythonの慣習
その結果、掛け算は両方が1の時だけ1になるわけで、andの挙動と一致する
だったらTrueとTrueを+したら2になるのでは?と思うだろうけど、これはBooleanのarray同士の計算の場合は足し算の結果をBooleanにする処理が入ってるのでTrueになる
間違えて片方が数値のarrayだったりするとエラーも出さずに普通に加算されちゃうので要注意です
ksmesho.icon僕は以下の例で理解しています。
if 文の場合:
200 if their salary is less than 500;
100 if their salary is strictly more than 500, but less than 1000;
50 if their salary is strictly more than 1000, but less than 1500;
0 otherwise.
OpenFiscaの場合:
code:python
def formula(person, period):
salary = person('salary', period)
return select(
## 以下の二行がベクトル
)
いまの世の中には制度を決める際にその複雑さを成約するような条件が無いので、いくらでも複雑な制度をつくることができるため、制度を機械可読に記述するためにはその言語がチューリング完全であることは現実的に必須である
一方で静的な制度の情報はPythonではなくYAMLによって簡単に記述、メンテナンスできるように工夫されている たとえば児童手当の額が変わったとして、もしPythonが書けない人であっても、YAMLを数行書き換えるだけで反映できる
Pythonの柔軟性を生かして、本質的なロジックを書くだけで良いように工夫されている
Pythonなので英語以外の文字列で記述できる
各国の法律用語や福祉用語をいちいち英語に翻訳するとか苦痛すぎるのでありがたい
実装したロジックが正しいかどうかを客観的に検証するソフトウェアテストがYAMLで簡単に書けるのもすごい Pythonが書けなくても「N歳の子とM歳の子がいるひとり親世帯にはX円の児童手当が払われるべき…」みたいな条件をYAMLで書いてくれる人がいれば間違ったロジックを書いてしまった時に検出できてバグをつぶせる
OpenFiscaの発明者は法制度と計算機科学、両方に精通した天才に違いない
OpenFiscaの主要概念
parameters
使い回され変化しうるような、様々な制度に共通する、ある時点で静的な値
reforms
制度のロジックの上書き表現
situation_examples
制度のテスト
tests
制度のテスト
variables
制度のロジック
個人、世帯、法人の持つ属性情報