データサイエンティストの採用面接でなに聞く?

データサイエンティストの採用を進めている会社はどんどん増えている昨今ですが、採用面接はどのように行われているでしょうか?私も日米いろいろな採用面接を経験してきましたし、その中でも特に難しかった「鶏の王」の課題については以前このブログにも書いたのですが、同時に自分でもたくさんのデータサイエンティストの採用面接を行ってきました。今回はデータサイエンティストの採用面接を網羅的にご紹介しようということではないですが、先日公開したPodCastにも関連して、少しだけヒントとなるようなことをお話したいと思います。

採用したいレベルや種類にも大きく依存しますが、DS採用面接には大きく分けると下記のようなパターンがあると思っています:

  1. 汎用的なデータサイエンスの質問をして、技術レベルを測る
  2. 過去の経験を技術的な詳細を含めて話してもらい、修羅場をくぐってるか確認する
  3. 実際になにか課題を出し、場合によってはコーディングを含め解決してもらう

1番に関しては、最近Webなんかで調べるといくつでも出てきます。Top 50 Data Science Interview Questions and Answers for 2021なんかには典型的な質問(「交差検定って何?」から「こういうときはどのアルゴリズムを使うのが正しい」とか)がまとまっています。例のごとく日本語の同様コンテンツがほとんど見つからないのは残念ですが、Google翻訳も進化しているので問題ないのかな。

2番に関しては色々聞き方のコツがありますが、私が面接するときには根掘り葉掘り聞いたあとに、「で、今話してくれたプロジェクトって、お金に換算するといくらの価値を持ってると思いますか?」という質問をします。ほとんどのケースで「正解」は存在しない質問ですが、候補者が関わってきたことがビジネスコンテクストの中でどのような意味を持っているのか、に対する考え方を確認する上で優れた質問だと自画自賛しています。

3番が特に今回お話したい種類の質問です。こういう質問は無数に考えることができますし、その中でもどのような能力をテストしたいのかによって変えていくことになると思いますが、以前私が使っていたものとしては、アルゴリズムを解釈し、実装する能力をためすために、バブルソートアルゴリズムの仕組みを説明し、その場で書いてもらっていました。短いと10行以内で書けるのですが、面接のプレッシャーの中でやりきるのは制限時間にもよりますが結構難しい問題です。他にも、データを渡してそれを分析してもらい、ビジネス課題を解決するためのアクションを提案してもらうことにより、よりデータ解析寄りの能力をテストすることもできます。

前述の鶏の王のケースは、訳のわからない問題にどのように取り組むかを考えさせる問題。データサイエンティスト固有の素質をみるというよりは課題解決における突破力をテストするものですが、これを現場で使うとほとんどのケースで全く前に進めない候補者が続出してしまうのではないかと危惧します(私含め)。

ということで、ここからが本題なのですが、先日PodCastで岩沢先生にお話を伺った際に、様々なパズルやクイズを考えることを趣味にされていて、このような方が現代にいらっしゃるということ自体にとても感銘を受けたのでした。このエピソードは下記でも聞いていただくことができますが、その中でリスナー向けに出題していただいた問題(52:10辺り)がデータサイエンティスト面接の文脈でも面白いと思ったので、この場にて回答も含めお話したいと思います。

シバタアキラのCafeでAIたい – ゲストプロフィール:早稲田大学大学院会計研究科客員教授・パズル家 岩沢宏和さん
プレーヤーが2人いて、それぞれコインを5枚ずつ持っています。各プレーヤーは5枚のコインの表裏に1から10までの数を一つづつ重複なく書いておきます。各プレーヤーは5枚のコインを投げて出た数の積がどちらが大きいのかを競います。この時、最も勝てる確率が高くなるような数字の割り当て方を見つけなさい。

コインへの数字の割当が決まっても、目の出方によって一度のプレーで勝つ確率はどちらのプレーヤーにもあると思われますので、強さは何回もプレーを繰り返した上で統計的に決定する必要があります。この問題、あなたならどのようにアプローチしますか?

自分で解きたい方はこの下の答えは見ちゃダメ🙅‍♀️

一番愚直なやり方として、全て試してみる、という方法があります。可能性のある全ての数字の割当方法を生成し、それをリーグ戦もしくはトーナメント戦で戦わせた結果を見て、一番強かったセットを決定するという方法です。面接でこの問題を出されたとしたら、私だったらその方法をためすのではないかと思います。

まず、そのような5枚のコイン(そのセットを「5コイン」と呼ぶ)の割り当て方はいくつ存在するのかを考えてみると、それぞれのコインに2つの数を重複なく割当て、またその順序は関係ないので、

10C2x8C2x6C2x4C2 / 5! = 945

となります。これをPythonで表すと、もちろんアプローチは千差万別ですがこんな感じになります(候補者がこんなコードを書き出したら結構ドキドキしますね)

import itertools
def create_all_coins():
  return [coin(o) for o in list(itertools.combinations(list(itertools.combinations(range(1,11), 2)),5)) if nondup(o)]

def nondup(l):
  used=set()
  for i in l:  
    used.add(i[0]); used.add(i[1])
  return len(used)==10

コードをつらつら書くのはやめますが、後はコイン対コインの戦い方(上記ではcoinクラス内で定義)と勝敗の決定方法(何回トライして決めるのか)を定義して、それぞれの5コインについて、それ以外すべての5コインとの対決を行えば、処理時間次第で結果が出ます。それぞれの5コインについて、他の幾つのコインに勝てたのか、また他のすべての5コインに勝つような最強5コインがあったかワクワクしながら5コインの勝数をヒストグラムで見てみるとこんな感じの結果が出てきます(それぞれの対戦は1000回やった結果出少数が多い方を勝ちとした)

この課題は、コーディングの観点からも、処理時間の観点からも、このアプローチ(いわゆるBrute Forceなアプローチ)で解決するには1時間の面接では難易度が高めと思われるので、実践には向かないのかもしれないですが、この結果を見てどう判断するのかというところは重要なポイントになってくると思います。私の場合はここで岩沢先生にメールし、これって勝敗はランダムなんですか?結局どの組み合わせも強弱のちがいって出ないんじゃないですか?とご連絡しました。ランダムな勝負であれば中心極限定理が働いて、正規分布に近づくと思ったからです。

一方で、上記は完全な証明にはなりません、あくまで結果のデータに基づく推察にすぎないです。この問題は明確に設定されていますから、統計学的な証明を試みてみるというのも一つですし、そうなってくるとデータサイエンティスト的な演習ではなくなり、数学的過ぎて言われてもむしろ面接官が理解できないのでは、と危惧してしまいますが、岩沢先生に教えていただいたのはこんな答えでした

これは非常にシンプルな証明があります.
私は当初,やや硬い表現で証明する方法を考えていたのですが,本質的に同じことを実にうまい表現で表す方法を私の友人が思いついたので,その表現で証明します.
結論は,どのように数を配置しても勝負は五分五分になるというものでした.
引き分けのときは勝敗がつくまで勝負を繰り返すというルールがあったことは,念のため注意喚起しておきます.
 
さて,(数の配置はどうであれ)プレーヤーをAとBとし,透明なガラスのテーブルの上で勝負をする場面を思い浮かべます.
すると,Aが勝つ(負ける)場合は,テーブルの下から見ると,必ずBが勝って(負けて)います.そして,テーブルの上から見たことが起こる確率と,テーブルの下から見たことが(テーブルの上から見て)起こる確率は明らかに等しいので,Aの勝つ確率とBの勝つ確率は等しいということがわかります.(終)

狐につままれたような、あっけにとられてしまう解法ですが、その発想はなかった・・・というところでしょうか。こんなふうに自由に頭を使えるようになりたいなぁ、というのが個人的な感想でした。こんな答えを候補者が出してきたら、採用でしょうか?

ちなみに、出題者の岩沢先生は「数学セミナー」誌の名コーナー「エレガントな解答をもとむ」にもご出題されているそうなので、われこそはという方はぜひチャレンジしてみて下さい!こちらから。