20230310-01
注意:こちらのページに記載していたmatchingMarketsパッケージを利用して安定マッチングを求める方法は、2023年4月5日にパッケージがCRAN repositoryから削除されたため利用できません。別の方法を後日掲載します。
2023年5月18日
東京大学マーケットデザインセンターが提供しているアプリを使って安定マッチングを計算できます。次のページをご覧ください→20230518 -------------------------
Rを使ったMatchingの計算
【参考】
マッチングアルゴリズムを配属に利用している実例について、まずは次のシスメックス社の記事をご覧ください。
ここからが本題です
【1、Rの環境を準備】
個人のパソコンにRを導入するのではなく、ここではインターネット上で利用できるサイトを使います。(なお個人のパソコンにRを導入する場合には、「r rstudio インストール」というキーワードで検索するとさまざまなサイトがありますので、ご利用ください。)
まずPosit cloudにサインインします。そのためにに行きます。 https://gyazo.com/a9c443df7c85865b9d7c2f4613b11d2b
右上のSign upを押すと、プラン選択のページが表示されます。
https://gyazo.com/e00299e6ec4829d71fdb255e87dfb130
無料で使いたいので、Plusは選択せずにそのままSign upを押します。
すると登録のページが開きます。
https://gyazo.com/65f471dde0ed78341444e92ec8a7332d
ここで、E-mailなどを入力せずに、Googleアカウントを使ってログインしましょう。
Sign up with Googleを選択すると、自分が利用しているメールアドレスが選択肢として表示されます。Googleアカウントをお持ちでない場合は、メールアドレスやパスワードを登録してサインアップしてください。
https://gyazo.com/df286dafa097aac2cf3a747121889462
Your Contentというページが表示されました。まだ中身は何もありません。
右上にあるNew Projectを押します。その選択肢の中で、New RStudio Projectを選択します。
https://gyazo.com/9ab73d7fda7d2df457b6ba8211c5d449
上のページが表示されたまま、少し待ちます。
https://gyazo.com/e7fdc78f5282e10ca11d88761f79cd4c
このページが表示されたら成功です。
https://gyazo.com/6104b9ab931b247234608837d618d379
ページの上部に、Your Workplace/ Untitled Projectとあります。(え表示されていなければ、ページ左上の☀︎ようなマークをクリックしてみてください。)そのUntitled Projectをクリックするとプロジェクト名を設定できるので、例えばMatchingなどとします。
これでRの準備ができました。
https://scrapbox.io/files/639012d84e5e90001f2aaaac.png
【2、Rの使い方】
画面中央にConsoleという表示欄があります。R version 4. 2. 2から始まる説明書きがありますが、その説明の一番下に、> のマークがあります。ここに指示を書いて、エンターキー(改行キー)を押すと計算が行われます。
例えば、>の右側に、
2+3
と記入して、エンターキーを押してみましょう。そうすると、そのしたに
[ 1 ] 5
という計算結果が表示されるはずです。
【3、マッチング計算の準備】
マッチングの計算をするには、専用のパッケージを使う必要があります。まずConsoleの欄にある>の右側に
install.packages("matchingMarkets")
と記入してください。コピーして貼り付けても構いません。リターンキーを押して少し待つと、また>が表示されます。これでインストールされました。続いて使えるように設定します。>の右側に
library(matchingMarkets)
と記入して、リターンキーを押してください。またすぐに>が表示されます。
または(こちらのほうが簡単ですが)右下の欄からPackagesのタブを選択して、
installを選択します。
https://gyazo.com/d7d537f545df0e3152735bd2ecdbca7e
すると次のようなページがポップアップします。
https://gyazo.com/50fd384a1aff5df5bfd40701772b2a4c
Packagesの欄に
matchingMarkets
と入力します。途中まで打てば候補に出てきます。
入力後にinstallボタンを押します。
続いてpackagesのリスト内にあるmatchingmarketsの左のチェックボックスに✅マークを入れます。
https://gyazo.com/59a5021672245aadd340baca0550808d
きちんと設定できているのかを確認するために、>の右側に
library()
と記入して、リターンキーを押してください。これは現時点で使うことができるパッケージを一覧表で表示させるための指示です。これを押すと、Console画面が下半分になり、上部にR packages availableという枠が新たに表示されます。その上から三つ目あたりにmatchingMarketsと表示されていれば成功です。
https://gyazo.com/439926ba7732116da41fd388d99ee2e5
R packages available
の枠は不要なので、折りたたんでおきましょう。
上の画像の丸を付けた部分のボタンを押すと折り畳めます。
【4、マッチングの計算:簡単な例】
実際にマッチングの計算をしてみましょう。
まず新入社員が6人いて、配属先の部署が3つあるとします。新入社員は名前ではなく社員番号で扱い、1から6までとします。また部署にも番号をつけて1,2,3とします。各部署の定員は2名ずつとします。
6人の新入社員は、それぞれが3つの部署に対して好みを持っています。
新入社員の1さんは、配属を希望する順に部署1、部署2とします。部署3ゼミへの配属は希望しません。このように、新入社員はすべての部署に対して配属を希望する必要はありません。
次の新入社員の2さんは、1, 3, 2の順番で部署を希望しています。新入社員の3番から6番さんも同様に個人としての好みを持っているので、それを下のように表示します。一行目が新入社員1の好みを表していて、新人は6人いますから、6行で好みを書きます。NAというのは、希望しない(無回答)という意味です。
1,2,NA,
1,3,2,
3,1,NA,
2,1,3,
2,NA,NA,
1,2,3
これで6人分の好みを記述できました。例えば上から5番目の行を見ると、2, NA, NA,となっているので、新入社員の5番は部署2への配属しか希望していないことになります。
同様に部署側も6人の新入社員を評価した上で、配属される新人についての希望を出します。部署は3つあるので、それぞれの責任者が提示した希望が
3,4,5,6,2,1,
2,1,3,5,NA,NA,
3,1,5,2,NA,NA
であるとしましょう。1行目が部署1の担当者による新入社員への評価です。社員3を最も高く評価し、社員1を最も低く評価しています。またこの部署の担当者は、6人いるすべての新入社員について、好みの順序はあるものの、最低限の基準には達していて受け入れても良いと考えています。
これに対して2行目をみてください。部署2の担当者は、評価が高い方から社員番号2, 1, 3, 5の順に評価しています。そしてここまでに登場しない新入社員4と6のことは、部署の新人として配属して欲しくはないと考えているため、NAが二つ記入されています。部署3の担当者も同様に、二人の社員のことは配属を希望していません。
これで新入社員側と部署側の評価が揃いました。いま作ったリストを次のように記載します。
-----ここから-----
s.prefs <- matrix(c(
1,2,NA,
1,3,2,
3,1,NA,
2,1,3,
2,NA,NA,
1,2,3
), 3,6)
c.prefs <- matrix(c(
3,4,5,6,2,1,
2,1,3,5,NA,NA,
3,1,5,2,NA,NA
), 6,3)
hri(s.prefs=s.prefs, c.prefs=c.prefs, nSlots=c(2,2,2))
-----ここまで-----
これを-----ここから-----と-----ここまで-----は含まない形でコピーして、consoleの>のところに貼り付けてみてください。そしてリターンキーを押すと、計算結果が表示されます。
collegeの列が各部署を表しています(元は学校に生徒を配属する例のために作られたパッケージなので、collegeとstudentという表現になっていますが、これを部署と新入社員と読み替えてください)。
縦に112233とあるのは、それぞれの部署の定員が2名ずつなので、部署1の決定者(一人目)、部署1の決定者(二人目)、部署2の決定者・・・という順に表示されています。注目するのはstudentの列です。縦に、461523とあります。これは部署1に配属が決定したのが新入社員の4と6、部署2に決定したのが新入社員の1と5、部署3に決定したのが新入社員の2と3という意味です。
https://scrapbox.io/files/639011199ada120023258267.png
【5、マッチングの計算:人数を少し増やした例】
それでは練習問題として、12人の進入社員がいて、部署は3つのケースを考えます。部署1の担当者は受け入れ上限人数を4人と希望していて、部署2と3の担当者は受け入れ上限を5人としていることを想定します。
12人の新入社員の希望をリストにまとめると12行になります。
1,2,NA,
1,3,2,
2,1,NA,
2,1,NA,
2,3,1,
1,NA,NA,
3,2,NA,
1,3,NA,
1,2,NA,
2,1,3,
1,NA,NA,
3,2,NA
また各部署の担当者による新人への評価は
3,5,6,8,1,2,11,10,9,NA,NA,NA,
5,3,10,4,7,1,9,12,NA,NA,NA,NA,
12,7,5,2,8,10,NA,NA,NA,NA,NA,NA
であったとしましょう。
これを先程のように、計算の命令の形に記載します。ただし先ほどは、新入社員が6人で、各部署の定員が2人ずつだったのが、人数も定員も変わっていることに注意してください。計算の指示は次のようになります。
-----ここから-----
s.prefs <- matrix(c(
1,2,NA,
1,3,2,
2,1,NA,
2,1,NA,
2,3,1,
1,NA,NA,
3,2,NA,
1,3,NA,
1,2,NA,
2,1,3,
1,NA,NA,
3,2,NA
), 3,12)
c.prefs <- matrix(c(
3,5,6,8,1,2,11,10,9,NA,NA,NA,
5,3,10,4,7,1,9,12,NA,NA,NA,NA,
12,7,5,2,8,10,NA,NA,NA,NA,NA,NA
), 12,3)
hri(s.prefs=s.prefs, c.prefs=c.prefs, nSlots=c(4,5,5))
-----ここまで-----
注意するのは、最初の塊の最後の行にある数字が、先程の3,6から3,12になっているところです。これは一人の新入社員が3つの部署を評価していて、12人の新入社員がいることを意味しています。
同様に二つ目の塊にある部署側による新人への評価についても、最後の行に12,3とありますが、各部署の担当者一人につき12人の新人を評価していて、3人の担当者がいることを意味します。
最後の1行には、各部署の定員が記載されています。4,5,5とあるのが、部署1から3までの定員です。
それでは結果を見てみましょう。上記の指示をコピーしてconsoleの>の右に貼り付けてみましょう。エンターキーを押すと結果が表示されます。
collegeとstudentの列を見ていくと、まず部署1には1,2,6,8の4人が決定しています。部署2には3,4,5,9,10の5人が決定しています。表記上は10,3,4,5,9ですが、これは計算の方法により先に決定した人が上に表示されているだけで、どの部署にどの新入社員が決定したかのみが重要です。部署3には7と12のふたりが決まりました。
この結果を見ると、新入社員の11さんだけが配属先が未決定であることがわかります。この人は、部署1しか希望していませんでしたが、部署1の担当者は、3,5,6,8,1,2,11,10,9,NA,NA,NA,という順に新人を評価していて、11さんのことを受け入れても良いとは思っているものの、もっと評価が高い社員である1, 2, 6, 8で定員4名が埋まっているために、11さんは配属先が未決定となっています。
https://scrapbox.io/files/63901111573e0d001d954609.png
【6、マッチングの計算:実名版】
新入社員や部署の名前を単なる番号ではなく、実名で扱いたい場合には次のように書きます。
ここでは各部署の採用担当を、総務部の安藤・法務部の井上・経理部の内田の三人としています。
また新入社員は、社員番号でS1からS6の6人としました。
-----ここから-----
s.prefs <- matrix(c(
"安藤","井上",NA,
"安藤","内田","井上",
"内田","安藤",NA,
"井上","安藤","内田",
"井上",NA,NA,
"安藤","井上","内田"
), 3,6)
colnames(s.prefs) <- c("S1","S2","S3","S4","S5","S6")
c.prefs <- matrix(c(
"S3","S4","S5","S6","S2","S1",
"S2","S1","S3","S5",NA,NA,
"S3","S1","S5","S2",NA,NA
), 6,3)
colnames(c.prefs) <- c("安藤","井上","内田")
hri(s.prefs=s.prefs, c.prefs=c.prefs, nSlots=c(2,2,2))
-----ここまで-----
入力してリターン(エンター)キーを押すと結果が表示されます。
https://scrapbox.io/files/6390110a33e503001dc3cb7d.png
安藤さんが担当をしてる部署には、社員番号S4とS6の二人が決定しています。
あとは人数がどれだけ増えても、同様にリストを作ってRで処理すれば、安定マッチングの条件を満たす社員の配属先が表示されます。
なお【5、マッチングの計算:人数を少し増やした例】でも見たように、マッチングアルゴリズムを実施した上でも配属先が未決定の社員が(人数が多い時はほぼ確実に)出てきます。その場合には第二段階を実施するなど調整が必要となるでしょう。