20221207
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を選択すると、メールアドレスが選択肢として表示されます。その中から大学のアドレスを選択します。(大学の***@g.nihon-u.ac.jpのアドレスは、大学名が入っていますが実際にはGoogleが運用しているG mailです。)
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の列が各ゼミを表しています。縦に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さんのことを受け入れても良いとは思っているものの、もっと評価が高い学生である1268で定員4名が埋まっているために、ゼミ未決定となっています。
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、マッチングの計算:人数を少し増やした例】でも見たように、マッチングアルゴリズムを実施した上でもゼミ未決定の学生が(人数が多い時はほぼ確実に)出てきます。その場合には第二段階を実施するなど調整が必要となるでしょう。