hidekatsu-izuno 日々の記録

プログラミング、経済政策など伊津野英克が興味あることについて適当に語ります(旧サイト:A.R.N [日記])

ソフトウェア・テストを再考する

私が SI という業務システム中心の受託開発業界にいることも多分に関係していると思うのだけど、ソフトウェア・テストに関する各種の方法論に対してどうしても懐疑的な考えを持ってしまう。端的に言ってしまうと「それは私(あるいはSI業界)がテストに関して抱えている問題を解決してくれる」ようには思えないからだ。

 

ここで言う一般的なソフトウェアテストの文脈での方法論というのは具体的には次のようなものを指している。

 

もちろん、これらの方法論は使っていないわけではなく、単体テストケースのケースを考えたり、網羅度を上げるために使うわけだけれど、ある意味テストをするなら誰しもが考えることをより確実に実施するためのものであって、それ以上のものではないように思える。

 

「私(あるいはSI業界)がテストで困っていること」と「ソフトウェアテストの専門家が解決したいと思っていること」の間には大きな開きがあるのではないか。最近話題となった COCOA の不具合や東証の障害にも関係する部分なので、まずはどういう問題に困っているのか具体的に書いてみようと思う。解決策も書きたいところだが、なかなか決定打がなく意見があれば Twitter などで聞かせてほしい。

1. 多様すぎる環境

覚えている人も多いだろうが、業務システムといえば Windows XP + IE6 という牧歌的な時代が長くあった。IE6 には様々な問題があったとはいえ、環境がひとつしかないというのはテストする立場からすれば大変ありがたいものだ。

 

スマホが一般的な時代となり、ビジネスにおいても iPadmacOS を兼用する会社も増えてきた。この流れを受け、業務システムと言えども動作環境を縛るということが難しくなってきた。OS だけでも Windows, macOS, iOS, Android の四種類、ブラウザも IE, Edge, Chrome, Safari, Firefox に対応が必要となる。バージョンやデバイスの違いも含めるとその組み合わせは膨大なものとなる。

 

業務システムで意外とハマるのが、IE や Edge の互換性表示(あるいはエンタープライズモード)問題だ。インストールされているのは IE11 や Edge なので利用者はそのつもりになっているのだが、旧システムのドメインを引き継いだ結果、IE7 や IE8 相当で表示され動作しないというクレームに繋がることがある。意外な盲点として RPA ツールもある。IE のCOMコンポーネントWebKit の古いバージョンを使っていたりするため、今までできていた業務ができなくなったというクレームが来ることがある。

 

また、ブラウザの自動更新も便利な一方で扱いが難しい。発注側がエンドユーザーに提供する際には、サポート環境として「各ブラウザの最新2バージョン」などと書くのが一般的だと思われるが、請負で開発する側には存在しないバージョンでの動作保証はできない。*1

 

請負側で動作保証できる最後のタイミングはシステムテストなのだが、システムテスト時点のバージョンで動作保証したところで、ユーザーテストからリリースまでの期間で動かなくなったり、状況が変わったらどう対応するのが正解なのだろうか。最終的には契約で決まるといはいえ、「良きに計らえ」を旨とする日本の SI 業界ではそう割り切れないのが現実だ。

2. 複雑すぎるライブラリの依存関係

Java にしろ Node.js にしろ、現代の業務システムはオープンソースソフトウェアなしには何もできない。たとえ外部のライブラリを使わなくとも、言語に含まれる標準 API には依存せざるを得ない。

 

数画面しかない業務システムであっても、数百~数千のライブラリが依存関係に含まれるのが当たり前の時代にあって、それらのライブラリにどのような不具合や脆弱性が含まれるか、利用者がすべてのソースコードを理解することは不可能だ。もはや祈りを捧げるしかない。

 

テストしてみたら動かない、のであれば一般的なテスト技法で事前に回避できるのだが、次のように特定の条件、状態でないと再現しないものは、原理的に解決は難しい。

  • レースコンディションに伴う不具合
  • まれにしか発生しないシステムエラーに伴う不具合
  • EXCELや画像など多様な可能性がありえるファイル形式の読み込みに伴う不具合
  • 言語ランタイムの細かいバージョン差異に伴う不具合

ライブラリのあるバージョンで見つかった不具合を解消するためにパッチバージョンを上げたら別の場所でエンバグしていたということもあり得る。実際にはそんなにないから大きな問題になっていないだけで、起こらないという保証はどこにもない。

3. 誰も知らない旧システム仕様

私がシステム開発の業界に入った20年前にはシステム化されていない業務をシステム化するという仕事も結構あったが、現在では多くの業務はすでにシステム化されており、さらにもはや3代目、4代目などということが当たり前になってきた。

 

動いているのだから変えなくてもいいのではないかと言う人もいるのだが、前述のように業務システムの利用環境は多様化しており、機能性が十分だから変えなくてもいいという状況にはない。モバイルだと一画面に表示できる項目数も限られるため、UI も大幅に見直しが求められる。

 

この時問題になるのは、もはや誰も旧システムの機能や細かい仕様をすべて把握していないということだ。発注側であっても、表面的な知識はあっても、夜間バッチジョブでどのような処理が行われているかや、離れた機能が実は関連しているなど、知らないことはたくさんある。

 

特に業務システムにおいてはひとつのシステムで完結することはめったになく、数十のシステムが有機的に紐付いている。そのシステムの仕様は知っていても、仕様を変更した結果、連携先システムのどこにどういう影響が及ぶかを確実に掴むことは至難の技だ。

 

仕様を誰も知らない以上、設計も実装もテストもすべて通り抜け、ユーザーテストやリリース後に発覚することになる。特に旧システムや連携先システムにテスト環境がない場合、本当に祈るしかないという状況になる。テストできないのに障害を起こすなとはこれ如何にという話だが、現実にはしばしば発生する。

 

これに関しては、ある程度解決策があると考えている。それは旧システムのソースコードをきちんと読むということだ。SI開発あるあるなのだが、業務システム開発の上流工程にはソースコードを読めない人が多く、設計書や発注元へのヒアリングだけで設計を進める人も多い。しかしながら、発注元も確実ではなく、設計書はしばしばメンテナンスが不十分である以上、ソースコードをきちんと読む以外に回避に繋がる道はないのではと思う。

4. 実施したことになっているテスト

前述のような状況なので、現在の業務システム開発は、仕様を整理して新システムを設計するだけでものすごく時間がかかる。日本のシステム開発はお金がかかる、人月商売の弊害だ、という意見を見聞きするが、一般論としてプロジェクト費用の60%ほどは実装以外の部分で発生しているし、システム開発失敗の原因の50%は要件定義フェーズにあるとされている。実際問題、要件定義がばっちりうまく言っているのに、ソフトウェアの製造で失敗する、というケースはめったに見ない(無いとは言わない)。

 

こんな状況なので、設計作業は遅れに遅れ、結果として製造が遅れ、単体テストは簡素化され、結合テストで単体レベルのバグつぶしをし、システムテストの終わりでなんとか間に合わせるということになりがちだ。しばしば、単体レベルの品質が低い、プログラマの能力がうんたらという話になりがちだが、個人的な経験から言えば、その前工程の失敗が尾を引いているだけのことが多いように思える。

 

単体テストをする時間がなくなったときに「実施したことになっているテスト」が発生する。単体テストをやったことにするのは簡単だ。単に結果報告書に○を付ければいい。JUnit が必要とされているなら、絶対に通過するテストをそれっぽく書き連ねておけばいい。実装者が追い詰められてそうすることもあれば、チームリーダーが進捗を誤魔化すためにそのように指示することもある。

 

なぜ、レビューで弾かないのか、と思われるかもしれないが、実装の完了すら危ぶまれる状況でレビューをして品質を上げることに何の意味があるというのだろうか。レビューをしている暇があるなら、まずは完成させる必要がある。「分岐網羅の組み合わせテストに基づくテストケースはすべて完成しています。いつでもテストできます。レビュー項目も完璧です。実装はできていませんが」では意味がないのだ。

 

実のところ、ここで問題としたいのは、テストが行われなかったことでも担当者を責めることでもない。スケジュールが押した以上、何かを捨てトリアージするしかない。問題は、未テストを検出して、リリース前にどうやって解消するのかということにある。予期できないトラブルすらたくさんあるのだから、予期できるトラブルは可能な限り解消しておきたい。

 

ただ、これに関しては工夫すれば解決できるのではないかと考えている。統計の検定やクロスバリデーションのように、違う観点を入れることで品質を改善できるのではないか。

 

例えば、各機能の単体テストにおいて、組み合わせパターンの偶数列、奇数列を違うチームで担当させてみてはどうだろうか。まったく単体テストが行われないというケースは減るだろうし、チームの進捗差によって発生するタスクの不均衡を平準化することもできるかもしれない。

 


 

今回、書いた内容について、アジャイルスクラムテスト駆動開発については特に触れなかった。理由としてはあまり詳しくないし実践したこともないため語る立場にないからだ。もし、それらの手法を使えば今回の問題(の一部)は解決するのであれば、その理由を公開してもらえるとありがたく思う。*2

*1:Edge をサポートしますと書いたら Android 版 Edge でアクセスしてきたり、Safari の最新2バージョンをサポートしますと書いたらすでに更新されていない WindowsSafari でアクセスしてきたりする可能性もあるので、環境の条件を考えるのもなかなかひと苦労する。

*2:私自身は、ウォーターフォールでしか開発経験はなく(ただし規模はそれなりに大きい)、少なくとも業務システム開発という領域においてそれらの手法が有効だろうと思ったことはなかったりしますが。

「外来種は本当に悪者か?」から何を学ぶか

ずいぶん長いこと積ん読になっていたので「外来種は本当に悪者か?」を棚卸して読んでみたら、これが実に面白かった。先に注意事項を書いておくけれども、この本を読むと最近話題の外来種撃退系番組を心から楽しめなくなるかもしれない。

この本で語られるのは「外来種は悪者」という概念が実のところ根拠が薄く、本来、理性によって行わなければならない研究活動でさえ、「外来種は悪者」であるという信念から逃れられないという事実だ。通常この手の本では数個の批判を拡大して書かれることが多いが、(この本の良い点でもあり、退屈なところでもあるのだけど)あらゆる視点から徹底的に実例を挙げての批判が行われる。

  • 人間が持ち込んだ外来種のほとんどは定着しない
  • 外来種生物多様性を高めている
  • 外来種の急増は環境の変化の結果であり原因ではない
  • 外来種の中には長期間定着しているため土地のアイコンになっているものもある
  • 外来種と在来種は共存しており、取り除くと共倒れする在来種も多い

これらの批判を見て思うのは、そもそもなんで外来種が悪者だと思ったの? ということだろう。有体に言ってそのように考える理由の方が薄い。研究者自身が「外来種が悪者という前提にしないと論文の投稿先がないし、引用もされない」と語っているように、皆「外来種が悪者」であるという先入観が出発点になっているのだ。

このことから思い出されるのは、最近書いたベイズ統計学に関する論争だ。それ自体の正否はここでは置いておくけれども、似たような論争は過去多く行われてきた。

熱力学で有名なボルツマンは原子の実在性を巡り論敵からの批判に悩まされ最終的に自殺に追い込まれた。相対論、量子論、確率概念、頻度統計 vs ベイズ統計と従来の科学観を覆されたとき、科学者と言えどもその信念はなかなか変えられない。歴史を振り返れば、新しい科学観が出てきたとき、その批判者が最終的に意見が変えたケースは少なかったようだ。パラダイムシフトはその科学観が歴史的検証を経て、科学者の世代交代によって実現してきたと言える。

このことから学ぶべきことがあるとするならば、哲学や主義に対する柔軟性だろう。たとえその哲学や主義を受け入れられなかったとしても、その哲学や主義を受け入れたならば正しいと言えるのか、を冷静に考える余裕を持つべきということだろう。パラダイムがたびたび変化している事実がある以上、ひとつの信念に固執する立場は守旧派に堕するリスクを常に抱えている。(守旧派が存在するがゆえに理論が精緻化されていくと考えれば、学問にとっては必要悪とも言えるが)

本の紹介に戻ろう。この本で初めて知った面白い話題といえば、アマゾンの原生林がまったく「手付かずの自然」と呼べるものではないという部分だ。現在、原生林と呼ばれている地域は、何千年も前に存在した文明が放棄した耕作地が荒れ果てた結果で、地面を調べると盛土の跡や人骨が見つかるという。地上の生活可能な地域については、大昔から人間の手垢が付いており「手付かずの自然」などというものはほとんど残っていないそうだ。「ALWAYS 三丁目の夕日」同様、懐かしき昔の姿などというものはただの幻想に過ぎない。

本書の「はじめに」で書かれているけれども、自然の保護はあくまで「人間にとって必要」なのであって、自然の側からすれば余計なお世話に過ぎない。福島第二原発周辺を見れば明らかなように、人間が住まなければ勝手に自然は回復する。

この本の結論とは裏腹に、個人的には気が楽になった部分もある。しょせん自然の姿が人間様の願望に過ぎないならば、それを前提にどんどん改良してしまえばいい。カミツキガメはなぜ排除しなければならないのか。それは外来種だからではない、人間にとって危険で困るからだ。トキはなぜ保護しなければならないのか、それは珍しい鳥を人間が見たいから、でいいではないか。

興味の範囲外であったこの本を買うことになったきっかけは、最近終了してしまった「ぷらすと」にて動物行動学者の新宅広二さんが外来種駆除番組について問われ「外来種も生き物だし、外来種を駆除するというのはナチスユダヤ人を排除するきっかけにもなってていいことじゃないんだよね」と回答していたのを観たからだ。*1

ぷらすとの新宅さん回はいずれも面白いので、ぜひ合わせて見ることをオススメしたい。


新宅さんに聞く夏の動物事件簿【WOWOWぷらすと】


新宅さんに聞け!動物VS人間編【WOWOWぷらすと】


新宅さんに聞け! 草食動物のすべて!【WOWOWぷらすと】


新宅さんに聞け!探検と動物【WOWOWぷらすと】


新宅さんに聞け! 動物映画のエトセトラ【WOWOWぷらすと】


新宅さんに聞く「地球最後の動物」【WOWOWぷらすと】


パンダを語る。【ぷらすと×Paravi】


海外ドキュメンタリーチャンネルを語る/ぷらすと×アクトビラ #1355


2019年の動物を振り返る/ぷらすと×アクトビラ #1366

*1:ぷらすとが無くなったことで、いつも興味の対象外であった動物や音楽関係の情報源が無くなってしまったのが本当に残念だ。1回200円くらいだったら払ってもいいんだけど、どっかやってくれないものか。

なぜ統計学には主義が必要なのか

前回「ベイズ統計学に関する議論を整理する」では、できるだけ中立的な視点で書くことに注力し、伊津野なりの結論については特に書かなかった。今回のエントリでは、様々な見解や調べた結果を元に私見を書く。

もちろん、伊津野は専門家ではなく、情報や理解が不足する部分については想像で補ったため「それはおかしい」と感じられる点もあるだろう。そのような記述を見つけたら、単に批判を書くのではなく、なぜ問題だと思うのか、自身のブログやTwitterなどで他の人間にも理解できるように論点を明確に書くようにしてほしい。うんこの投げ合いはうんざりだ。それに、コメント欄に批判や反論を書かれても、伊津野の理解力では適切な回答ができるとは思えない。広い範囲に意見を投げかけた方がより専門的な回答が得られ生産的だろう。*1

前置きが長くなったので本論に移ろう。

まず先に結論を述べる。現在、ベイズ統計学は「(頻度主義とは異なる)主観ベイズ主義に基づく統計学」として世界的に受容されており、「渡辺ベイズ解釈」は日本の特定の論者が主張しているだけという状況にある。また、「頻度主義 vs ベイズ主義」という対立は過去あったものの、現在ではそのような争いはなく、頻度主義とベイズ主義という異なる2つの主義が共存している。

誤解してほしくないは、あくまで「渡辺ベイズ解釈」がマイナーなものであるというだけで、それが間違いであると言っているわけではない。しかしながら、「渡辺ベイズ解釈」と異なる理解を表明した記述をトンデモ扱いするのは異常である。たとえ将来的に「渡辺ベイズ解釈」がメジャーな解釈になるとしても、パラダイムシフトが起こるまでは保守的に扱うのが科学的態度というものだろう。もし「渡辺ベイズ解釈」が現代のスタンダードであると思い込み、海外の学会などで「ベイズにおいてデータは確率変数」などと語るならば、怪訝な顔をされるのは間違いない。「渡辺ベイズ解釈」に優れた部分があると思うのであれば、現時点はマイナーな主張であることを前提とした上で、その違いやメリットをアピールすればよいだけだ。マイナーな解釈をまるでメジャーな解釈であるかのように語られるのは、学問を学ぶ上でノイズにしかならない。

この結論を読んだ人の中には、それでも「主義なんて知らんし。俺はデータを分析したいだけだ」と思う方も多いだろう。特に機械学習や数学から統計学を学んだ人ほどこの傾向が強いものと考えられる。なんせ、私自身も当初その立場から調べはじめたのだから。しかし、安心してほしい。これから説明するのは「主義は存在するし必要だが、それほど意識する必要はない」ということだ。統計学において「主義」が何を意味をしているのかさえ理解しておけば、あとは統計学の実務に邁進すればいい。

このことを説明するために2つの事前準備を行う。ひとつは「主義」「主観的」という言葉の用法だ。なぜ、この用語を説明しなければならないかと言えば、そもそも論者の中でも理解が統一されていないからだ。当初、私も論者それぞれが定義しないのが問題なのではないかと考えていのだが、調べているうちにそうでないことがわかった。これらは「哲学のテクニカルターム」である。

実のところ統計学者でも「主義」の意味を正しく理解できていない人が多いように感じる。昔、科学哲学の本を読んだ際には「面白いけどまったく役に立たない」と感じたものだが、こんなところで役に立つとは思わなかった。

「主義」という言葉を聞くと、どうしても「共産主義」や「資本主義」のようにイデオロギーの色をまとってしまう。だが、「主義」自体にそのような意味合いはない。例えば、Wikipedia 英語版にも「接尾辞「-ism」は中立であり、したがって、それが識別する多くのイデオロギーのいずれにも関連する意味合いを持たない」と記述されている。では、どういう意味かと言うと「一貫したものの見方」程度の意味である。「渡辺ベイズ」論者の中には、「これは新たな主義と言ってよいのでは?」という記述を見て主義呼ばわりはけしからんと思ったようなのだが、その時点で「主義」という言葉の意味を誤解している。主観ベイズ主義を批判し、実際既存の主義とは全く異なる観点から構築されている以上、異なる主義なのは明らかだ。既存概念とは異なる新たな主義を1から構築するのはたいした仕事なのだから、むしろ誇るべき事柄のように思えるがいかがだろうか。

次に「主観的」だが、これも客観的の対義語で、単にある主体の内側から見ているという意味に過ぎない。データを分析する統計学の立場から見れば、データから誘導的に決められるものが客観的、それ以外のすべては主観的である。ここで注意してほしいのは、「主観的」「客観的」というのは単なる説明語であり、それ自体にたいした意味はないということだ。経験ベイズ法を使って事前確率を用意するのは客観的と言えるし、主体が決め打ちしているという意味で言えばモデルや分布族の設定は主観的と言える。事前分布も、無情報事前分布を使うのか、経験ベイズ法を使うのか選択できるという意味では主観的である。

もうひとつの事前準備は、科学哲学、統計学、数学の関係性の整理だ。統計学は比較的新しい学問であることから、情報科学出身、物理学出身、数学出身、哲学出身と様々な分野をバックグラウンドにもつ人々から構成されている。そのため「統計学者」という肩書が付いていても、どの立ち位置から発言しているのかがしばしば曖昧になる。なぜ、この整理を行わなければならないのか。科学哲学者の伊勢田氏の言葉を借りれば「興味・関心が異なる」からだ。「興味・関心が異なる」学問をひとつの学問として扱ってしまうとどういう問題が起こるのかは「科学を語るとはどういうことか」を読むとわかりやすいかもしれない。科学哲学者の言う「科学的方法論が正しいという証拠はない」という言説と「科学的方法論によって正しさが証明された物理学」をくっつけた結果、「物理学はすべて間違っている」という結論が導き出され、物理学者が粛清されるようでは大変困ってしまう。学問にはそれぞれに「興味・関心」があり、その範囲で正しさを規定している。「正しい」の定義を物理学者に聞けば「間違いが明らかになっていない」ことだと答えるだろうし、数学者に聞けば「ある公理系について関係が成り立つ」であると答えるかもしれない。そして、科学哲学者に聞けば、おそらく「いまだ模索中である」と返ってくるだろう。

科学哲学、統計学、数学の関係は、科学哲学、物理学、数学の関係を念頭におくとわかりやすい。物理現象を数学を使ってモデル化するのが物理学であるように、データの分析手法を数学を使ってモデル化するのが統計学である。さらに、データの分析手法を細かく見ると「正当性」「因果」「推論」「意思決定」といずれも哲学が取り扱ってきたものであることがわかる。ようするに、物理学の物理現象に当たるものが哲学的概念なのであり、統計学とは哲学的概念を数学を使ってモデル化したものと捉えた方がよいのだ。

p 値を例に挙げよう。p 値が何らかの意味で正しさを判断するために使われるのは、「正しい」とは何かという概念があり、その「正しい」のすべては表現できないにしろ、ある条件においては「正しい」とみなしてもよいだろうという合意があるから意味を持つ。数学の世界だけで閉じてしまえば p 値はただの数字に過ぎず何の意味も持たない。

このように考えれば「渡辺ベイズ」の主張の歪さが見えてくる。渡辺ベイズの主張は、物理現象を扱わない物理学のようなものだ。さらに問題なのは、「良い/悪い」という哲学的概念を扱っているのに、数学的概念の範囲で議論がすべて閉じているかのように語ってしまっていることだ。統計学は、データによって客観的な現実世界を、モデルによって哲学的概念を表現することで成り立っているのにも関わらず、(極端に言えば)ツールに過ぎない数学だけで何かが語れると思うのは相当に極端な態度に思える。

さて、ここまで来れば、ベイズ統計学が「主観確率に基づいている」という言明が当たり前であると同時にたいして意味があることではないことが明らかだろう。まず「合理的な(逆向きの)推定 or 意思決定」という概念があり、その主要な実装としてベイズ統計学が存在しているのだ。推定や意思決定をモデル化した結果なのだから確率が主観的なのは当たり前の話である。また同時に、ベイズ統計学が「人間の推定 or 意思決定」をモデル化していないことも強調しておくべきだろう。あくまで合理的個人が行う前提のモデルであるから「人間の意思決定はもっとデタラメである」のような批判も意味をなさない。

そしてこれも当然であるが、頻度論に基づく統計学は「合理的な(逆向きの)推定 or 意思決定」のために作られていない。すなわち、頻度主義とベイズ主義は異なっており、ひとつにはできないし、同じデータを使っても頻度論とベイズ主義では解釈も結果も異なってくることになる。

では、前回のまとめの各項目に対する私見を述べる。

  • 1.2 現在において頻度主義とベイズ主義に対立があるのか  ⇒ 頻度主義とベイズ主義は異なるものだが、両立するので対立しない
  • 2.「主観確率」「意思決定論」によるベイズ解釈は役に立つのか ⇒ 役に立つ/立たないでなく、それが前提である。
  • 3.ベイズ統計学において「パラメータは確率変数、データは定数」という説明は正しいか ⇒ 主義による。しかしながら、特に説明をおかないのであるば、メジャーである主観ベイズ主義で解釈すべきであろうから、この説明は正しいとすべき。

となる。

なお、「1.1 過去において頻度主義とベイズ主義の対立は意味があったのか」については、どちらの側面もあるため別に結論を出す必要はないだろう。「4. 『ベイズ統計での更新プロセスは最終的に真の分布に到達する』という言説は正しいか」、「5. 『ベイズ統計では仮説が正しい確率がわかる』という言説は正しいか」については、前提条件をどこまで書くべきかという程度問題のように見える。これは人によって判断が分かれるかと思うが、そこまで問題のある記述とは思わない。

*1:正直な話、今回のエントリはまったく自信がない。自信はないが専門家が交通整理をしてくれない以上、私的な理解の整理でもあった方がましだろうと思い公開することにした。

ベイズ統計学に関する議論を整理する

最近、「統計学を哲学する」の出版をきっかけとした Twitter 上の議論を追いかけながらベイズ統計学について調べている。

統計学を哲学する

統計学を哲学する

  • 作者:大塚 淳
  • 発売日: 2020/10/26
  • メディア: 単行本(ソフトカバー)

前々からベイズ統計学については興味があったので、議論を追ったら何かしらの理解を深められるのでは、と思い関連するツィートを読んでみたのだが、これがびっくりするほどわからない。

通常「わからない」と書いたら高度な数学的議論が繰り広げられているからわからない、という意味だと思われるかもしれないがそうではない。そもそも何が論点なのかもはっきりとせず、議論らしき議論も行われず、ほとんどうんこの投げ合いと呼んでもいい状況だったのだ。

なるほどこれが「頻度主義 vs ベイズ主義」の対立なのかと思いもしたのだが、もやもやが残ったこともあり、議論の内容は理解できなくても論点整理くらいはできるだろうと調べ始めたのが運の尽き。「従来型の主観ベイズ解釈 vs 新興の渡辺ベイズ解釈」という日本のベイズ界隈のちょっと面倒な状況に気付かされてしまった。

個人的に言いたいことは沢山あるが、今回は中立的な視点で論点を整理するだけにした。あくまで論点なので、その正否に関して判断は行わない。各論点への伊津野の見解は別エントリで書こうと思う。論点が漏れているのではと思われるようであれば、コメント頂きたい。

1. 頻度主義とベイズ主義は対立するのか

頻度主義とベイズ主義は対立するのか。これに関してはふたつの切り口で整理が必要だと考える。

1.1 過去において頻度主義とベイズ主義の対立は意味があったのか

過去において頻度主義とベイズ主義の対立があったことは歴史的事実であって、それを否定する人はいない。では、それに意味があったのか。渡辺ベイズにおいては「悲しい歴史があった」と書かれているが、Ken McAlinn 氏による対立議論によって手法が開発されたので不毛ではないという見解もある。

1.2 現在において頻度主義とベイズ主義に対立があるのか

ここが主要な論点だが、この点についてはいくつかの立場がある。

  • A) 頻度主義とベイズ主義は異なるものだが、両立するので対立しない
  • B) ベイズ主義は頻度主義を包含する。
  • C) 頻度主義はベイズ主義を包含する。
  • D) A, B, C の間でいまだ対立がある

こうやって議論を書いているのだから D だろうという考え方もあるが、一部で主張されているのか、世界的にそういう主張が主流であるのか、ではまったく違う話だろう。

事前確率が自由に設定できるというベイズ主義の自由度の高さを考えると、 C はないと思うのだが、この後に出てくる「ベイズ主義においてもパラメータは定数、データは確率変数」という意見を見るに、渡辺ベイズは C を志向しているのではないかと思われる節もある。

また、B について最尤推定ベイズ推定の特殊な形であるという限定的な意味でそのように主張している可能性がある。

2. 「主観確率」「意思決定論」によるベイズ解釈は役に立つのか

調べ始める前に思ったのは、論者により「主観的」の用法が一致していない可能性だった。用法が違うならば議論は絶対に成立しない。実は違う視点で同じことを言っている可能性すらある。

なお、黒木氏によるベイズ解釈は役に立たないという主張は、主観ではリスクの比較ができないというものである。

また、この問いについては、「ベイズ統計が主観確率を扱っているという言説自体が無意味」、あるいは、問い自体が無意味(これについては説明が必要なのでここでは割愛する)という考え方もある。

3. ベイズ統計学において「パラメータは確率変数、データは定数」という説明は正しいか

下記はベイズ統計学の書籍で広く採用されている頻度論とベイズの違いを表現する表だ。

     頻度論 ベイズ
パラメータ 定数 確率変数
データ 確率変数 定数

この表に対し、次の2つの反対意見が見られる。

  • ベイズにおいてもデータは確率変数である
  • ベイズにおいてもパラメータは定数、データは確率変数である

後者に関して、渡辺澄夫研究室出身の方がそう発言されておられたので、もしかすると渡辺ベイズではそういう解釈をするのかもしれない。

また、これに関連する議論として、2つの見解が黒木氏により提起されている。

  • A) 「ベイズにおいてデータは無作為抽出が前提となっている」
  • B) 「ベイズであるか否かによらず、真の値は決まっている」

2020/12/19 追記:「ベイズにおいてもパラメータは定数、データは確率変数である」という発言やそれを肯定するツィートが実際にあったからそう書いているのだが、黒木氏の真意としてはここに記載されているように、何を確率変数にするかは戦略的に決めるということのようだ。だが、主義を置かないとした結果、そう置かざるを得なくなっているだけのようにも感じる。また、Ken McAlinn 氏よりベイズ統計学では必ずしも iid を置く必要がないにも関わらず、iid を前提としているとの批判がある。

4. 「ベイズ統計での更新プロセスは最終的に真の分布に到達する」という言説は正しいか

統計学を哲学する」では「ベイズ流の更新プロセスは最終的に真理へと到達しうる」と書かれていたが、真理という語を使うのは情緒的に感じられたので、真の分布と書き換えている*1

この問に対する、黒木氏の批判は「分布族のモデルを使ったベイズ更新によって到達可能なのはそのモデルで実現可能な最良の結果に過ぎません」というものである。

この問については、主張とは別にいくつかの前提条件が付く可能性が想定される。例えば、いくら更新プロセスを走らせたところで事前分布の影響がなくならないケースがあれば、この言説は間違いと言うこともできるが、それが特殊なケースに限られるのであれば、必ずしも問題のある言説とも言えない。なお、同書本文中でも「ある弱い前提さえおけば」という条件が記載されているので、その前提が本当に弱い前提であれば、問題のある言説とは言えない。

5. 「ベイズ統計では仮説が正しい確率がわかる」という言説は正しいか

一般にベイズ統計の利点として「ベイズ確信区間は信頼区間よりも解釈が直感的である」ことが挙げられる。この言説が間違っているならばベイズ統計を使うメリットのひとつが損なわれることになる。

この批判を行っている黒木氏の主張はここで読めるが、判然としない。この言説の前提が明示されていないことを問題視しているのかもしれない。

*1:意味が違ってしまうようであれば修正するので指摘頂きたい

ベイズ会計とはなにか

ベイズ会計と書くと、また新しい会計管理の手法かと思われるがそうではない。より正しく書くならば、会計制度のベイズ的基礎付け、と言うべきものである。もともと会計制度は商慣行から歴史的な経過を経て発展してきたものであるが、現在では会計学という学問により首尾一貫した理論的体系で分析され、その結果が反映されている。ベイズ会計も同様に、既存の会計制度をベイズ的な思考法に基づき整理することで、制度に選択肢がある場合、どの制度がより合理的であるかを分析するためのツールとしての利用が想定されている。

まず、ここでのベイズ的な思考法の定義をしておこう。ベイズ的とは、まず、すでに得られた経験や慣習を元に事前確率分布を設定し、その分布を実際に得られたデータで更新するという作業を繰り返すことで、真の確率分布に近づけていくという考え方である。

さて、これを会計に適用することを考える。会計において求めたい真の確率分布とは会計的事実に他ならない。会計的事実とは、費用は発生主義、収益は実現主義で認識し、費用収益対応の原則に基づいて計上される事実である。具体的に示そう。ある商品を販売し商品を手渡した、そして入金は月末日であるとする。この時、商品を手渡した時点で売上と売掛金が発生し、月末日に売掛金が現金で相殺されることなる。これをベイズ的な思考法でとらえるならば、受注時点をt=0とする「商品を手渡した時点で、金利を考慮しなくてもよいくらい直近に確実に支払いが行われる」という事前分布が経験的におかれているので、その時点で売上を計上して良い、と解釈できる。もし、将来支払いが完遂されることが期待できないのであれば、確率に応じた貸倒引当金の計上が求められる。これだけではベイズ的な思考法を導入することに価値が感じられないかもしれない。しかしながら、発送基準、引渡基準、検収基準と複数の売上計上基準が存在することを知っていれば多少は有用性が出てくる。それらの基準は経験的に設定された事前分布の違いによると解釈することができる。

ベイズ的な思考法がいかに会計制度と親和的であるかを示す好例として減価償却が挙げられる。減価償却は、その資産を取得した後に獲得できる総利益を考えた上で、各期の利益額に相当する資産額を費用として計上する行為に他ならない。すなわち、減価償却には将来においてどのように利益が獲得できるかという推論が必然的に発生するのである。

ベイズ的な思考法は、過去の経験に基づき事前分布を定め、新しく得られたデータで更新していくことにより、現時点持ち得る情報に基づく最善の推論を行うという理論的枠組みであるため、このような状況を分析するには非常に適している。

特にソフトウェア会計はまさにその考え方に基づいて設計されている。ソフトウェアの減価償却額は、見込販売数量あるいは収益に基づく減価償却額と販売可能期間の均等配分額を比較し、いずれか大きい額を計上することになっている。これは、各期末の販売状況に基づき、事前分布をベイズ更新していく作業に他ならない。

一方、いわゆる耐用年数表による減価償却は、取得資産が一定期間、同程度の価値を生み出すという事前分布が置かれていることになり、ビジネスに直接影響するような資産取得の場合には不適切だと言えるし、ノートPCの購入のように日常業務に使うものであれば、妥当な想定であるとも言える。

従来の会計学では、この適切、不適切であるという基準が曖昧であった。ベイズを基礎とすることで、最善の推論を行うための事前分布として不適切であるかという新たな基準により評価が可能になる。

会計処理にベイズ的な思考法を持ち込むメリットを示すより良い具体例として、のれんの償却処理が挙げられる。通常、企業買収を行う際は、買収元企業は帳簿価格より高い価格で買収先企業を購入することになる。のれんとはこの差額である。のれんは資産の実態を伴わないため仮想的な資産と考えられており、どのように取り扱うべきかは難しい問題とされている。この処理方法としては、一括費用処理、資産計上し必要に応じて減損、資産計上し一定期間で減価償却の三通りの方法があり、アメリカでは2番目の方法、日本では3番目の方法が採用されている。

ベイズ的に考えたとき、まず買収元企業がどのような予想をしているのか、ということが重要となる。通常、購入に費やした金額以上の価値があるから購入するであろうことは明らかであろう。また、短期間で事業閉鎖することが前提となっているなどの場合を除けばゴーイングコンサーンは前提となる。すなわち、一括費用処理や一定期間で減価償却を行うというのは、最善の推論とは言えないのである。会計的事実の追求を目的とするのであれば、のれんの処理は資産計上し必要に応じて減損することが望ましいということになるのである。

ベイズ会計の良い点はそれだけではない。実際に得られたデータを使い事前分布を更新することで、その会計制度に対する実際の分布との比較が可能になる。例えば、実際の分布では、のれんは数年後に高い確率で減損の恐れがあるのであれば、資産計上とともに引当金を計上すべきということになるかもしれない。

なお、ここまでの記述は、伊津野の思いつきを教科書的に書き下しただけで、ベイズ会計などという言葉はただの造語である(一応、似たような発想をしているものが2つほど見つかったので参考文献として記載しておく)。個人的にはなかなかうまい説明なんではないかと思っているのだけど、どうだろうか。私自身は研究者ではなくこれ以上掘り下げようもないので、興味があれば概念を勝手に拝借して頂いても良いし、別のベイズ統計+会計という切り口で語ってもらってもよいです。卒論なんかのネタにはちょうどいいかもしれないねw

【参考文献】

最後の工数見積の海を漂う(画面・帳票・バッチ割合導出編)

前回のエントリで外れ値を分析したが、「画面、帳票、バッチの比率 1.5 : 1.0 : 0.7 という数値は感覚的なもので根拠がない」という問題については残されたままとなっていた。

hidekatsu-izuno.hatenablog.com

以前のエントリで書いた通り、比率を正しく求める手順としては、主成分分析からの重回帰分析が一般的なのだけど、正規分布から外れる場合にはうまく分析できないという問題がある(主成分分析を経由する場合、切片を0にする事ができないという問題もある)。

いろいろ考えたのだが、例えば画面については機能数あたりの画面数で人時工数に重みを付けた上で分位点回帰を行えば、画面あたりの係数が求まる。これを帳票、バッチについても行えば、それなりに妥当な結果が得られるのではなかろうか。

というわけでやってみた結果は以下の通り。なお、箱ひげ図における外れ値は対象外として分析している(前回は、第一分位点~第三分位点に絞ってみたが小規模案件が相対的に減ってしまい、むしろ変な結果になることがわかったため通常の外れ値を使うことにした)。

画面の係数=105.4706
帳票の係数=110.4000
バッチの係数=50.8271

だいたい、画像:帳票:バッチ=1.0:1.0:0.5 というところだろうか。この係数を元に分位点回帰を行うと係数は 1.0247 となる。人月工数に換算すると次の通り。

人月工数=0.68 * 画面数 + 0.71 * 帳票数 + 0.33 * バッチ数

わりあい妥当な線かもしれない。

最後の工数見積りの海を彷徨う(外れ値分析編)

過去、幾度となくIPAの資料に基づき工数見積りを計算するためのエントリを書いた。

hidekatsu-izuno.hatenablog.com

最後のエントリを書いてからしばらくが経ち「ソフトウェア開発データ白書2018-2019」が出ていたのも知っていたけど、前回の分析データで概ね満足を得ていたので放置していた。

とはいえ、課題がなかったわけでもなく、次の点はなんとかしたいな、と思っていた。

  • ソフトウェア開発データ白書2016-2017 だけで分析した時の数値が 2014-2015 の時の数値と大きく違っており、原因を調べる必要がある。
  • 画面、帳票、バッチの比率 1.5 : 1.0 : 0.7 という数値は感覚的なもので根拠がない

前者については、一旦、両方のデータをひとつにして分析することでむりやり解決したのだが、本来はきちんとデータを見る必要がある。今回のエントリは、そこらへんを検討しようという趣旨となっている。

実際どれくらい違うのかというと

データ 分位点回帰で得られた係数
2014-2015 65.05
2016-2017 116.27
2018-2019 137.05
全体 87.23

2014-2015 と 2018-2019 では倍の開きがある。分析手法に難がある証拠だ。

まず、データとなるソフトウェア開発データ白書は3回分ある。2014-2015、2016-2017、2018-2019 の3つ。このデータを工数でマッチングし、人時工数、画面数、帳票数、バッチ数の一覧を作成した。

どう分析するのがいいかなと思ったのだが、多次元のデータをそのまま分析するのは難しいので、人時工数、機能数(=画面数+帳票数+バッチ数)、機能あたりの人時工数の3つの指標を箱ひげ図で表示してみた。

人時工数

まず、人時工数を見ていく。

f:id:hidekatsu-izuno:20201122091333p:plain
人時工数(箱ひげ図)

予想はしていたが、想像を上回る外れ値の多さ。とはいえ、実は中央値にはさほどの開きがない(オレンジの線が中央値)。箱ひげ図が見えるように範囲を絞ってみる。

f:id:hidekatsu-izuno:20201122092508p:plain
人時工数(箱ひげ図/50000人時以下)

分位点回帰は、本当の分位点とは異なり各分位点から遠いデータの重みを下げることで調整しているため、外れ値のデータの影響を完全に除去できていないのではと思われる。

機能数

次に機能数。

f:id:hidekatsu-izuno:20201122102258p:plain
機能数(箱ひげ図)

こちらも人時工数ほどではないが、同様の傾向が見られる。

f:id:hidekatsu-izuno:20201122102522p:plain
機能数(箱ひげ図/500機能以下)

機能あたりの工数

では、機能あたりの工数はどうか。傾向が同じということは打ち消し合うかと思ったが、そうでもない。

f:id:hidekatsu-izuno:20201122102807p:plain
機能あたりの人時工数(箱ひげ図)

f:id:hidekatsu-izuno:20201122103024p:plain
機能あたりの人時工数(箱ひげ図/800人時以下)

外れ値の除去

とりあえず外れ値が問題になっていそうなことはあきらかだ。外れ値の除去の方法としては、

  • スミルノフ・グラブス検定を使う
  • 箱ひげ図の第3分位点と第1分位点からIQR(第3分位点-第1分位点)の1.5倍以上離れたデータを外れ値とする
  • 機械学習の異常値検知を行う

がある。統計で使うのは、最初の2つだが、スミルノフ・グラブス検定は正規分布に従うことが前提であるので、今回のデータに使うのは適切とは言えない。箱ひげ図を使うべきだろう。

また、外れ値の除去の影響を緩和する方法として

  • ウィンソライズ:外れ値を最大値や最小値、特定のパーセンタイル値に置き換える
  • トリミング:外れ値を削除する

の2方式がある。影響緩和という意味ではウィンソライズの方がよさそうに思えるが、実際のデータを見ると、3バッチで201人月のような特殊すぎるものも含まれているし、経験的にも工数の極端に大きい機能があるようなプロジェクトは特殊なものだと思われるため、除去する方が適切だろう。

機能ごとの人時工数の外れ値を実際に除去した上で分位点回帰を行ったのが下記の結果となる。年ごとの結果のばらつきが多少は抑えられていることがわかる。

データ 分位点回帰で得られた係数
2014-2015 63.72
2016-2017 116.27
2018-2019 115.23
全体 78.36

とはいえ、まだまだばらつきが大きいようだ。

さらに除去するとどうなるか

だいぶ除去できたとはいえ、それでも1機能あたり5人月弱のデータが含まれている。これを第3分位点で切れば、1機能あたり3人月弱までのデータに制限することができる。統計的に適切かはわからないが、第1分位点~第3分位点のデータに限定して実施してみた結果は次のようになる。

データ 分位点回帰で得られた係数
2014-2015 116.27
2016-2017 117.79
2018-2019 137.05
全体 122.38

結果のばらつきがほとんどなくなってきたのがわかる。この結果を正とするなら、

人月工数=1.14 * 画面数 + 0.76 * 帳票数 + 0.54 * バッチ数

となる。