見出し画像

プログラミング×経済学:選好順序の作り方講座

*仕事のご依頼はココナラからお願いいたします。
主に、Web制作、ビジネス代行(データ関連・資料作成など)、デザイン、作詞・作曲などを受け付けております。

はじめに

今回ご紹介するのは、経済学でお馴染みの選好順序(選択肢の好みの順)をすべて生成するプログラムです。たとえば、

りんご ≻ みかん ≻ ぶどう

みたいなことですね。

このプログラムがどのような時に必要かというと、
・エージェントや投票者などの「個人」がたくさんいて、
・選択肢に対する選好順序を彼らに特定の制約のもとランダムに与えて、
・集団の意思決定や取引・交渉など様々な設定でシミュレーション分析する
場合かと思います。かなり汎用性があるのではないでしょうか。

よく使用される選好順序は以下の2種類です(詳細は後程)。
Linear order:すべての選択肢を厳密に順序付けるもの
Weak order:無差別な(どっちでもいいよという)選択肢がある順序

Linear orderを生成するのは簡単です。選択肢のリスト内の順列を生成すれば終わりですね。

他方Weak orderの場合は、なかなか大変になります。今回は、このWeak orderの集合を生成する方法を紹介いたします。

二項関係(数学)と選好関係

選好順序というのは、選好「関係」によって表現されます。数字の大小「関係」と似ていますね。数字を降順・昇順に並べるには、大小関係が必要なのと同じです。

ではこの関係、とりわけ二項関係とはなんなのか、というお話をします。

a R b

関係Rとは、aとbの関係性を表すものです。以下に有名な例を挙げます。

・数値の大小関係「R⇔≧」
 :「a R b」は、値aが値b以上であることを示す
・恋愛関係「R⇔”左側の人は右側の人が好き”」
 :「a R b」は、aさんはbさんのことが好きであることを示す
選好関係「R⇔≿」
 :「a R b」は、選択肢aが選択肢bより同程度以上望ましい(無差別or好きである)ことを示す

以上の例から、なんとなく二項関係というものが何か理解できるかと思います。この「関係」を学ぶと、数学が言語の1つであるという感覚が得られるのではないでしょうか。

そして、選好関係において厳密に順序が決まる場合は非対称な関係として

a P b または a ≻ b

と表現します。他方、無差別の場合は対称な関係として

a I b または a ~ b

と表現します。ただし、「a ≿ bかつb ≿ a」⇔「a ~ b」です。左側(a ≿ bかつb ≿ a)は
・選択肢aは選択肢bと無差別 or 選択肢bより望ましい、かつ
・選択肢bは選択肢aと無差別 or 選択肢aより望ましい
なので、「選択肢aは選択肢bより望ましい」と「選択肢bは選択肢aより望ましい」の部分は他の部分と両立しません。よって、2つの文を合わせると
・選択肢aと選択肢bは無差別である(a ~ b)
となるわけです。

Weak order

それでは、選好順序の中でも「weak order」と呼ばれるタイプのものの性質を以下に整理したいと思います。性質は3つあります。
*すべての選択肢の集まり(集合)をXとしておきましょう。

1)反射性:X内の任意の選択肢aについて、a ≿ aである(同一の選択肢は無差別)。
2)完備性:X内の任意の選択肢a, bについて、a ≿ bまたはb ≿ aである(すべての選択肢のペアは順序付け可能)。
3)推移性:X内の任意の選択肢a, b, cについて、a ≿ bかつb ≿ cならば、a ≿ cである。

以上3つの性質を満たす選好順序(または選好関係)を「weak order」と言います。

パーティションの作り方 by Python

それでは、weak orderの生成に必要なプログラムを考えていきます。

まず、「異なる2つの選択肢が無差別」である可能性を含む選好関係であることを考慮すると、望ましい順に以下のようなグループ分けができます。

X_1, X_2, ..., X_k

添え字(_i)が小さいほど上位グループです。この場合、
・同じグループ内の選択肢同士は「無差別」とし、
・上位グループの各選択肢は下位グループの各選択肢より「厳密に望ましい」とします。

このようなグループ分けができるということは、すべての選択肢の「あらゆる分割」、すなわちパーティションが必要となります。

ここで注意していただきたいのは、選択肢集合Xの部分集合(一部の選択肢を集めたもの)をすべて生成しても効率が悪いです。なぜかというと、{a}や{a, b}などの部分集合には重複があり、「上位または下位グループ」になり得ません。X_1, X_2, ..., X_kはすべて重複があってはいけません。後に重複部分を取り除く面倒な作業が追加されます。

したがって、パーティションの生成プログラムが有効となります。

それでは、パーティション生成プログラムをご紹介しましょう。Pythonで記述していきます。

まず、この関数に入れる選択肢リスト(選択肢が3つの場合)を用意します。

choice=3
c=list(range(1,choice+1))
print(c)

選択肢のリストは [1, 2, 3] となります。a, b, cと指定しても良いですが、選択肢の数を変更するとき大変なので、数字のラベルを使います。

次に示すのは、最も一般的なパーティション生成プログラムです。

def partition(choiceset):
   if len(choiceset) == 1:
       yield [ choiceset ]
       return
   for div in partition(choiceset[1:]):
       for n, subset in enumerate(div):
           yield div[:n] + [[ choiceset[0] ] + subset]  + div[n+1:]
       yield [ [ choiceset[0] ] ] + div

このプログラムを解釈するために、c=[1, 2, 3]をpartition関数に入れるとどうなるのか、順を追って見ていきます。

*ここからは有料になります。購入いただいた場合、一番下に添付した.py形式のファイル(すべてのプログラムが載っていて、AnacondaなどのPyhtonを実行するソフトですぐに使えるもの)もダウンロード可能です。

ここから先は

5,245字 / 1ファイル

¥ 3,000

サポートしていただけますと幸いです。サポートの使い道は、研究に使用する機材や音楽機材に充当させていただきます。