数式で表記すると以下のようになります。$$「良く設計された比較行列は、重み成分の比としてあらわすことができる」という事実は、後ほど重み成分を計算で得る際に重要になってくるので覚えておいてください。比較行列の固有ベクトルを計算して重みを得る※ここでは線形代数の知識が要求されますが、難しければ飛ばし読みしても大丈夫です。最終的な計算は、プログラムを書いて行うので、手計算ができなくても大きな問題にはなりません。良く設計された比較行列においては、その固有ベクトルを重み成分とみなすことができます。厳密にいえば「最大固有値を持つときの固有ベクトル」が「重み成分のベクトル」となります。固有値と固有ベクトルというのは線形代数で学ぶ専門用語ですね。難しいところもありますが、定義だけ理解しておけば、取り急ぎAHPの理解には十分かと思います。固有値と固有ベクトルの復習まずは(釈迦に説法かもしれませんが)表記法の整理から進めます。行列は大文字で太文字のアルファベットで表記されます。列数と行数が等しい行列を正方行列と呼びます。比較行列は、(行数も列数も比較対象となるものの個数と一致するので)正方行列となります。固有ベクトルなどのベクトルは、小文字で太文字のアルファベットで表記されます。今回は2行1列の重みベクトルを求めたいわけです。$$なお、すべての要素が0であるベクトルを零ベクトルと呼びます。数値の4などは、行列でもベクトルでもありません。「普通の数値」を区別するためにスカラーと呼びます。固有値はスカラーです。固有値・固有ベクトルの定義を見ます。\)の固有値と呼びます。$$固有ベクトルと重みベクトルの関係さて、いったん固有値・固有ベクトルは脇に置いておいて、良く設計された比較行列と重みベクトルの関係を確認します。良く設計された比較行列は、以下のように、重みの比で表すことができます。$$行列の掛け算の公式を思い出すと、比較行列と重みベクトルの積は、以下のように計算されることがわかります。}$$すなわち「比較行列と重みベクトルの積」は「比較対象数(スカラー)と重みベクトルの積」になるわけです。「行列とベクトルの積」が「スカラーとベクトルの積」になるのが固有値と固有ベクトルでした。\)は、上記の比較対象数と重みベクトルに対応します。ところで、比較行列のように行列の要素が正である正方行列は、たった1つの最大固有値を持ち、その時の固有ベクトルの各成分が正になることが証明されています。\)における、最大固有値を持つ固有ベクトルを求めると、それを重みベクトルとみなすことができそうだ、ということになるわけですね。最後に重みの合計値を1にする作業が入ります。得られた固有ベクトルの各要素を、固有ベクトルの要素の合計値で割ってやれば、重みベクトル完成です。ここで紹介した重みベクトルの計算方法は、固有値法と呼ばれます。ほかにも幾何平均を使う方法などいくつかが知られています。「2つの基準・2つの選択肢」のAHPのまとめ2つの基準(味と価格)と2つの選択肢(牛丼とお寿司)があるときのAHPの流れを見てきました。基本的な考えは以下の通りです。:お寿司が勝っている価格:牛丼が勝っている3.味を優先させたいから、お寿司を食べようこの流れは直観的かと思います。基準の優先順位を定めてから、そのあとで選択肢の優先順位を決めよう、という階層構造があるわけです。この次に、『味の方を優先させたいな』という言葉による表現をやめて、重み(優先度)という概念を導入しました。「味:価格」では「3:1」の比率で重みをつけよう、といった具合です。この場合は、味の重みが0.75で、価格の重みが0.25となります。同様に「味に関する、牛丼とお寿司の重み」と「価格に関する、牛丼とお寿司の重み」を得たうえで、重み付きの合計値を計算することで、「味と価格の総合評価」に基づく、選択肢の優先付けができるようになりました。最後に、重みを計算するための固有値法の説明をしました。重要さの度合いを「1,3,5,7,9」といった数値で表現し、この結果を使って比較行列を得ました。比較行列において、最大固有値を持つ固有ベクトルを得ることで、重みを機械的に計算することができました。固有値法による重みの計算は、一見すると複雑で大変そうに見えますが、Pythonなどのプログラミング言語を使うことで、ある程度簡略化できます。スポンサードリンク3.Pyhonで計算するAHP固有値や固有ベクトルはPythonのsympyというライブラリを使うことで精度よく計算ができます。分析コードはGitHubで管理しています。完全なコードはこちらで公開しています。ライブラリを読み込みます。『init_printing()』と実行することで、出力が美しくなります。出力を美しくするinit_printing()味と価格の2つの基準の重みを計算する比較行列を作ります。sympyで行列を作る際は『Matrix』というクラスを使います。1]])固有値や固有ベクトルを得るコードは以下の通りです。『eigenvects』という関数を使うと、固有値も併せて出力されます。eval_mat_1.eigenvects()eigen_val_vects_1結果はこちら。固有値・固有ベクトルが2セット得られます。本当に、以下で示すように、美しい数式の表現で得られます。sympyは便利ですね。$$ちなみに、0番目の要素が固有ベクトルで、1番目の要素が多重度、2番目の要素が固有ベクトルとなっています。インデックスを忘れてしまわないように保存しておきます。2こうしておけば、例えば以下のようにして、最大固有値とその時の固有ベクトルを取得できます。x[EIGEN_VAL_IDX]))最大固有値とその時の多重度・固有ベクトルを個別に取得したうえで、固有ベクトルを表示させます。『type(eigen_vec)』と実行すれば確認できます)。これでは不便なので、以下のようにしてlistの最初の要素を取得します。すれば、後で計算がやりやすくなります。$$得られた固有ベクトルを、合計値が1になるように標準化してやれば、重みベクトルが得られます。$$比較行列から重みを計算するための関数を作る上記の計算を何度も繰り返すのは面倒なので、関数にまとめます。return(weight_vec)関数を作っておけば、以下のようにたった1行のコードで重みを計算できます。$$寿司と牛丼問題を解決するお寿司と牛丼のどちらを食べるか、という問題を決着させましょう。以下の3つの比較行列を用意します。1]])基準の重みベクトルを計算します。$$続いて、味に関する、お寿司と牛丼の重みベクトルを計算します。細かいですが「N」という関数を使うことで、任意の桁数で出力できます。見にくいので、有効数字2桁で丸めました。$$最後に、価格に関する、お寿司と牛丼の重みベクトルを計算します。$$あとは、「味に関する、お寿司と牛丼の重みベクトル」と「価格に関する、お寿司と牛丼の重みベクトル」に対して、味と価格の重み付きの合計値をとれば総合評価ができますね。愚直に計算してもよいのですが、せっかくベクトル形式になっているので、行列の掛け算の公式を使って、一発で総合評価を行いたいと思います。お寿司と牛丼の結果を結合します。1行目がお寿司で2行目が牛丼です。1列目が味で、2列目が価格です。$$先のjoin_mat_1に、基準の重みを掛け合わせてやれば、総合評価ができますね。$$1行目がお寿司なので、やはりお寿司を食べに行くべきだ、という結果になりました。4.3つ以上の比較と比較行列の一貫性これから、3つ以上の要素があるときのAHPに移ります。「味・価格・待ち時間」の3つの基準がある中で、食べに行くところを判断する、などが想定されます。最大固有値をとるときの固有ベクトルを求めるということは同じなのですが、3要素以上になると比較行列の一貫性が満たされているかどうかのチェックが必要になります。この点をまずは説明します。比較行列が逆数規則と推移性規則を満たすときに、一貫性を持つといいます。逆数規則たとえば「味は価格よりもやや重要である」と判断されたとき、味は「3」という数値で表現されました。一方で価格は「1/3」とその逆数とみなされます。それで、以下のような比較行列が得られることになります。$$このように、「A・Bの評価が3なら、B・Aの評価は(逆数の)1/3」になるというのが逆数規則です。これは比較行列を作る際のルールのようなものですね。比較対象の要素数が3以上になると、考慮しなければいけなくなるものです。「味が価格よりも3倍重要」であり、かつ「価格は待ち時間よりも5倍重要」であるならば「味は待ち時間よりも3×5=15倍重要」となるとき、推移性を持つといいます。逆に「味が価格よりも3倍重要」であり、かつ「価格は待ち時間よりも5倍重要」なのに「味は待ち時間と同じくらい重要」というのでは、推移性を持ちません。「味は価格より大事、価格は時間より大事。それならば、味は時間よりずっと大事に違いない」というのが推移性規則のココロです。比較対象の要素数が2つだと、気にする必要がないんですが、3つ以上に増えると、要素同士の関係性を気にしないといけないんですね。推移性規則が満たされている例Pythonによる実装を通して確認します。推移性を満たしている例から確認します。比較行列を用意します。1]])例えば「味が価格よりも3倍重要」であり、かつ「価格は待ち時間よりも5倍重要」そして、「味は待ち時間よりも3×5=15倍重要」が満たされているので、推移性を満たしていそうです。固有値、固有ベクトルの計算も問題ありません。$$重みベクトルの計算も簡単に終わります。続いて、推移性規則が満たされていない例を挙げます。1]])この比較行列eval_mat_3の固有値、固有ベクトルを求めると、なかなか複雑な形になっています(長すぎて画面に収まらないかもしれません)。$$目がチカチカしそうですね。これのややこしいところは、虚数が入ってきていることです。虚数はその大小を判断することが困難なので、以下のようにas_real_imag()を適用して、固有値を虚数部と実数部に分けます。$$実数部だけを取得するコードは以下の通りです。$$上記の結果を応用すると、最大固有値を持つ固有ベクトルを取り出すコードは以下のようになります。比較対象が3つ以上になると、一貫性(特に推移性)の評価が重要となります。一貫性を持つ場合は、最大固有値が比較対象数と一致します。「味・価格・待ち時間」の3つがあるならば、最大固有値は3になるはずです。ここからのずれを調べれば良さそうです。Index)です(西崎(2017))。CIは以下のように計算されます。\)は最大固有値で、nは比較対象の数です。$$また、ランダムに生成された行列のCIから計算されたランダム指標RIを使う方法もあります。RIはSaaty(2013)で以下のように示されています。Rate)が、以下のように計算されます。$$CIは0.1未満(場合によっては0.15未満)であることが求められます。CRも同様に0.1未満であることが求められます。一貫性指標CIを計算してみます。比較対象の数を得ます。これは、比較行列の行数(列数)を使えばよいです。$$一貫性指標CIを計算します。$$0.1を大きく超えているので、この比較行列は使うべきではないでしょう。ダメ押しでCRも計算してみます。$$こちらも0.1を大きく上回ってしまいました。重みベクトルを得る関数の修正2つの比較において、重みベクトルを計算する関数を作りました。これを改造して、一貫性指標を出力してくれるようにします。print("一貫性の評価。return(weight_vec)実行すると、以下のように、CIやCRを出力してくれます。これを見て、比較行列を修正するか否かを判断することにします。2)================================================================================一貫性の評価。$$寿司と牛丼、ラーメン問題を解決する最後に計算例を挙げておきます。分析コードまずは、比較行列を指定します。計算はPythonを使えば一瞬なので、実務上は、この比較行列を得るのが最も大変かもしれませんね。]])基準の重みベクトルを得ます。2)================================================================================一貫性の評価。$$味に関する、お寿司と牛丼、ラーメンの重みベクトルを得ます。2)================================================================================一貫性の評価。$$価格に関する、お寿司と牛丼、ラーメンの重みベクトルを得ます。2)================================================================================一貫性の評価。$$最後に、待ち時間に関する、お寿司と牛丼、ラーメンの重みベクトルを得ます。2)================================================================================一貫性の評価。$$お寿司・牛丼・ラーメンの結果を結合します。$$いよいよ総合評価です。$$僅差ではありますが、ラーメンが最も大きな値となりました。味はお寿司が最もよかったのですが、価格も待ち時間もともに大きく劣っていたので、お寿司は選ばれなくなりました。このように、いろいろの判断基準があるときには、AHPを使うことで総合的な評価を下すことが可能となります。AHPには、今回紹介したもの以外にも、いくつかの計算の方法があります。どのような計算であれ、パソコンを使えば一瞬で計算が終わってしまうわけですが、その内部でどのように評価がなされているのかは、理解しておいた方がよろしいかと思います。誤り等あれば、メールやコメントなどでご指摘いただけますと大変幸いです。効用分析の基礎からAHPなどの応用的な手法まで記載されている、意思決定の教科書です。』オペレーションズ・リサーチ寄りの意思決定論の入門書です。具体例をあげつつ、個別の手法について紹介していくタイプの本です。Risks』AHPやANPに関する説明が詳しく載っています。西崎(2017)でこの本を引用するときはSaaty(2005)と記載されていましたが、当方はKindle版を読んだので、出版年がずれています。書籍タイトルは同じなので、西崎(2017)で引用されているのと同じ本だと思います。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。technology.。