Process:階層分析法)は、2つ以上の評価基準がある中で意思決定を行う方法の1つです。安い代わりに品質が悪い製品と、価格は高いが品質の良い製品の、どちらを購入するかを考える時などに使われます。AHPの基本的な理論を説明したうえで、Pythonでこれを実装する方法を説明します。実装の際はsympyという数値計算ライブラリを用います。分析コードはGitHubで管理しています。完全なコードはこちらで公開しています。寿司と牛丼、ラーメン問題を解決する1.AHPとはAHPは、2つ以上の評価基準がある中で意思決定を行う方法の1つです。安い代わりにあまりおいしくない料理と、価格は高いがとてもおいしい料理の、どちらを食べるかを考える時などに使われます。2つ以上の評価基準がある、と言うと複雑に見えます。AHPの目指すことは単純です。価格と品質のどちらの基準を重要視するかを先に決めます。「重要視する基準」が高い選択肢を採用します。当たり前のことを、と思われるかもしれませんが、この手続きを標準化して、比較的簡単に計算できるように整理したことの功績は大きいと思います。Processの略で、日本語にすると階層分析法となります。複雑な意思決定であっても、階層を分けることで、1つ1つは機械的な手続きで意思決定ができるように工夫されています。レベル1の階層は「意思決定の目的」です。どの料理を選ぶか、どの商品を選ぶか、どの会社に就職するか、新しいプロジェクトとしてどのようなものを立ち上げるか。いったものが意思決定の目的となります。休日のランチとして、どのお店に行くかを決めることを目的とします。レベル2の階層は「基準」です。味という基準であったり、価格という基準などが想定されます。レベル3の階層は「選択肢」です。お寿司屋さんや牛丼屋さんなど、候補となるお店が列挙されます。通常の教科書だと、3つ以上の基準・選択肢の例が扱われることが多いのですが、これだと考慮すべき事柄が多いので、少し難しいです。この記事では、まず「2つの基準・2つの選択肢」という、とても単純な事例を確認してから、複雑な分析に移ることにします。考え方まずは優先させたい基準が何なのかを判断します。「味を優先したいな」と思ったとします。続いて、選択肢ごとに、基準の優劣を評価します。以下のようになったとします。寿司屋:味は良いが、価格が高い牛丼屋:味は悪いが、価格が安い価格は安い方が良く、高いのは悪いという評価となります。最終的には「味を優先してお店を決めたいので、お寿司屋に行こう」と決めることになります。補足しておくと「味を優先したいな」というのは個人の好みです。私が味を優先させたいと思ったからと言って、ほかの人がそう思うかはわかりません。個人、あるいは単一の組織の行動を決めているのだと、ご理解ください。今回は「寿司屋の方が味が良い」としましたが、これも好みの問題でしょう。牛丼の味の方が好きな人もいるはずです。これは、自分が意思決定をする場合には自分の心に尋ねるしかありません。相手の意思決定を支援する場合は、相手にアンケートをとって確認しておく必要があります。大変にどうでもよいですが、私自身は牛丼が大好きです。価格に関しても、人によって価値観が異なるので注意が必要です。私なんかだと貧乏性なので、1000円のランチと1500円のランチだと、結構な差があると感じます。高給取りな方ですと、500円の差なんて気にもしないかもしれませんね。5000円以上の差が出てきて、初めて金額で優劣がつく、なんてこともあるかもしれません。このあたりの感覚は、次節で重みを評価する際に大切になってきます。先のやり方は単純ではあるのですが、問題もあります。「味と価格だと、味の方を”わずかに”優先したい」という場合と「味の方を”圧倒的に”優先させたい」というのは異なるはずです。「寿司と牛丼なら、圧倒的に牛丼の方が安い」という状況だったとします。この時「味の優先度が価格よりわずかに勝っているだけ」の場合は、牛丼が選ばれるかもしれません。逆に「味の優先度が価格より圧倒的に勝っている」という場合は、寿司が選ばれるかもしれません。どちらを優先するかという順序だけでなく、その度合いを評価することが必要ということです。AHPでは、基準や選択肢を順序付けるのに「重み」あるいは「優先度」と呼ばれる数値を使います。3:1という比率で重みをつけることを考えたとします。重みの合計値を1とすると、味の重みは「0.75」で価格の重みは「0.25」となりますね。このように数値で評価しておけば、優先の度合いを評価できそうです。重みの評価ができる場合は、以下の手順で判断することになります。以下の計算によって、総合優先度を求めます。0.25×0.9よりおよそ0.35というわけで、総合優先度はお寿司の方が順位が高いという結果になりました。お寿司を食べに行きましょう。基準の重みや「各基準に対する、選択肢の優先度」を計算できれば、総合的な評価に基づいて判断が下せそうです。今回のような単純な2つの選択肢での比較ならともかくとして、比較対象が3つや4つになってくると、重みや優先度を評価するのが大変となります。そこで、AHPでは、この作業を簡単にするために、1対比較を通して比較行列を作ります。1対比較のもたらすご利益は、3つ以上を比較するときに得られます。3つ以上の比較を行う例は、後ほど紹介します。1対比較と比較行列の作成手順を整理します。基準として、味・価格の2つがあった時「味VS価格」でその優劣を比較します。味・価格・待ち時間の3つの基準があるときは「味VS価格」「味VS時間」「価格VS時間」の3通りの1対比較を行うことになります。今回は2つしか基準がないことを想定しているので、1回だけ比較すれば完了ですね。比較の際には、以下の比較尺度を使います。表現は木下(2004)を参考にしました。9平たく言えば、数値が大きくなればなるほど重要だということです。偶数はなるべく使わないようにします。しても中間的な評価をせざるを得ないときには、使うこともあるようです。数値を当てはめていきます。この時、重要なものの方が数値が大きくなります。重要ではない方(今回は価格)は、逆数をとって「1/3」となります。1つめの要素を「味」、2つめの要素「価格」にした時の比較行列Aは以下のようになります。$$比較行列のイメージは以下のようになります。良く設計された比較行列は、重み成分の比としてあらわすことができます。「良く設計された」というのは含みを持たせた表現ですが、2つの基準・選択肢での評価においてはあまり気にする必要がないです(だから2つの評価は簡単なのです)。「良くない設計の比較行列」の例は、3つ以上での比較の際に紹介します。基準の重みは以下のようになっていました。