column
PR

白か黒か——その問いを解くアルゴリズムを追いかけてみた話

tantan_tech
記事内に商品プロモーションを含む場合があります

この記事を読んでわかること

  • 「多数決・二択アンケート」では拾いきれない意見の構造とは何か
  • Polisがどのように「グラデーション」を数学で扱うかに対して理解できたこと
  • Claude Codeを使ってJupyter NotebookでPolisのアルゴリズムを追いかけた体験記

「白か黒か答えろ」で答えられない

「この案に賛成ですか?反対ですか?」

たった二択。YesかNo。0か1か。

アンケートを集計したことがある人ならわかると思いますが、集計できる形で設問を設計した方が楽ですよね。自由入力されるとそれをどう解釈するのかに頭を悩ませる。(最近はAIで結構いい感じにまとめてくれますが)

でも本当は、そんな単純に答えられる問題ばかりではないはずです。「現場での仕事はアクシデントがいっぱいあって、それを解決していくのが楽しいけど。でももっと新しいことをしてみたい」「猫はめっちゃ好きだけど、猫アレルギーだから一緒に暮らしたいかと言われれば、それは難しいけど、でも猫は好きです。」とか。人の意見はグラデーションに満ちていますね。

そんな「白か黒かで答えろという難題」に対して、数学的なアプローチで別の答えを出そうとしているツールがあります。それが Polis だそうです。


Polisとは何か——対立ではなく、コンセンサスを見つけるツール

通常のアンケートとの違いをざっくり言うと、こうなります。

普通のアンケート:

  • 「この施策に賛成ですか?」→ 5段階で答えてください
  • 結果:「賛成 60%、反対 40%」
  • → 賛成 vs 反対という対立の構図が生まれる(らしい)

Polisがやること:

  • 参加者がそれぞれ自由に意見(ステートメント)を投稿する
  • 他の人の意見に「賛成・反対・どちらでもない」で投票する
  • 未投票の項目は平均値で補完して、全員分のデータとして扱う
  • 投票パターンから似た意見を持つ人のグループ(クラスター) を見つける
  • グループ間で対立させるのではなく、全グループに共通して支持されている意見(コンセンサスポイント) を抽出する

意味不明ですよね。私も意味がよくわかりません。今も完全に理解したわけじゃないですが、少し解像度が上がったので、素人ながら説明してみたいと思います。

まずは体験してみよう

https://pol-is.jp

これがPolis JAPANです。新しい議題の投稿や、既存の議題への投票もできる。百聞は一見にしかずということで、まずは体験してみるのがいいと思います。


なぜPolisに惹かれたか——「当たり前」を疑う視点

私がPolisに興味を持った理由は、技術的な新しさよりも、前提への問いかけにあります。

「アンケートは選択肢を用意して集計するもの」「多数決で決める」——こういった意思決定の方法は、私たちの中に「そういうもんだ」として存在しています。

でもPolisは、その前提に対してこう言っているように聞こえます。

「そもそも、人間の意見を0か1で表現するのは無理だよね。」

そして、その「無理」を解消するために数学を使っている。PCA(主成分分析)という手法で高次元の投票データを2次元に圧縮し、座標が近い人同士を同じグループとして捉える。技術的な難しさよりも、技術で解こうとする問題マインドそのものがおもろいと思いました。

最終的にPower Platform上で実装してみたい

そのためにまずはアルゴリズムを研究してみる。


Claude Codeと一緒に、アルゴリズムを一つ一つ追いかけてみた

概念として「おもろい」と思っていたPolisを、自分の手元で再現をしておかけたい。なのでJupyter NotebookでアルゴリズムをPythonで再現してみることにしました。

今回は Claude Code と一緒に作業しました。「1ステップずつ、何をやっているか追いかけられるようなノートブックを作りたい」という方針で進めて、以下の流れで実装しています。

全体の流れ

  1. Polisの公式APIからデータ取得
    • Polisは公開されているディスカッションのデータを取得できるAPIを持っています
    • 実際の投票データ(誰がどの意見に何を投票したか)を取得
  2. 投票行列の構築と欠損値補完
    • 「投票していない=意見なし」ではなく、その人の他の投票パターンの平均値で補完
    • これにより、未回答者も一定のデータポイントとして扱われる
  3. PCA(主成分分析)で次元圧縮
    • 高次元(ステートメント数だけの次元)の投票データを2次元に落とす
    • 座標が近い人 = 投票パターンが似ている人、という構造になる
  4. クラスタリング
    • 2次元空間上にプロットされた人たちを、グループに分類する
    • 「だいたいこういう意見を持つグループ」が浮かび上がってくる
  5. コンセンサスポイントの抽出
    • 各グループを横断して、すべてのグループが同意している意見を見つける
    • これが「対立を超えた合意の土台」になる

実装してみてわかったのは、Polisが使っているアルゴリズム自体は、既存のライブラリを組み合わせたものだということです。そこもかなりアツいですよね。普遍的なものを組みわせて画期的なことしたい笑

なんか言われたら、「コロンブスの卵ですね」と心の中で呟きたい。


Jupyter notebookを見てみよう

Polisにこんな議題を投稿してみた。

「残業を平準化するのは誰の仕事か?」

テーマは残業の平準化を誰が担うべきか。管理職の教育不足を挙げ、マネジメント強化を主張する立場と、個人努力だけでは限界と組織ルール整備を求める立場がある。繁忙期の波を見える化し、組織全体で健康と成果を両立する仕組みが鍵だ。 この問題についてどう考えるべきだろうか?

これに対して回答をいただいているので、そのデータをとってきて再現してみようじゃないか。

質問別の回答結果

15の質問が存在していて、それぞれに賛成・反対・どちらでもないが存在している。

一人一人の回答を見てみる

これが一人一人の回答を見た結果だ。Participantが参加者となっていて、列1つ1つが上記の質問となっている。ベクトル的なもので表現されるらしく、このままだと扱いきれない次元となっているらしい。そしてこの高次元のデータを2次元にするらしい。公式ページの中にあるこのYoutubeを見ればわかるはず。(私はわかったような気になりました)

高次元データを2次元に圧縮する

これはよくわからないけど・・2Dにしているはず。

意見を可視化する

2次元にした結果こうなるらしい。こうなってくるとさっきの多次元のデータ(意味不明)から、可読性のあるデータになっていると思いませんか。

グルーピングしてみようぜ 

このままだと一人一人が独立しているので、君と君にちょっと似てるじゃんっていうのをグルーピングするらしいですよ。結構おもろくなってきました。

コンセンサスを見つける

グルーピングした結果、グループごとで対立しているように見えるけど、実は共通の意見を持っている。そういうところを見つけていく。その結果こうなるらしいぜ。(コンセンサスって日常で聞いたことない)

今回は、0.3を閾値として設定しました。+ 0.3 を超えるか、- 0.3 を下回っている意見を、コンセンサスとするみたいです。(補足:1.0は賛成・-1.0は反対です)

=== コンセンサス YES(全グループが賛成傾向、閾値 > 0.3)===
S5: 個人の努力だけでは限界があるため、組織のルール整備と上司の意識改革をセットで進めるべきだ。
G0:+0.83 G1:+1.00 G2:+1.00
S10: 自分の成長より、ワークライフバランスを優先したい
G0:+1.00 G1:+1.00 G2:+1.00
S12: 仕事というものは、常に万全な状態で行えるわけではない。限られたリソースで成果を上げるのがプロの仕事だと思う
G0:+1.00 G1:+1.00 G2:+1.00

=== コンセンサス NO(全グループが反対傾向、閾値 < -0.3)===
S4: そんなに残業が嫌なら日本ではなく海外で働くべきだ。
G0:-0.43 G1:-1.00 G2:-0.67

Pythonって何?

Jupuyter Notebookのスクショを載せておきます。セルと呼ばれるところに処理をPythonで書くことによって、セル単位で実行することができます。1つ1つ処理を確認しながら実行できて、これも結構おもろいですね。今回は全てClaude CodeでPythonを書きました。私がやったことは細かい修正指示ぐらいです。

「ある種の諦めであり、ある種の希望」

Polisを使ってみて、改めてこのツールが面白いと感じた理由を言葉にすると、こうなります。

人間は白でも黒でもない、ということをまずは認める。

全員の意見が完全に一致することはない。でも、完全に真っ向から食い違っているわけでもない。どこかには「ここだけは、みんな大事にしている」という共通の土台があるはずだ——そういう前提で作られているのがPolisのように感じます。

全員の合意を取り付けようとするのではなく、対立の中にある共通項を浮かび上がらせる。これは人間という存在への、ある種の諦めであり、同時にある種の希望だと思います。

白か黒かという難題に対して、「そもそもその問いの立て方が違う」と返す。そのアプローチが、私はすごく好きです。いいですね。コンセンサスを届けて、対立しているように見えるけど、実は合意しているよねっていうところだけをまずはどうにかしていく。それってめっちゃおもろいアプローチなんじゃないかなと思います。


まとめ

今回やったことを振り返ると、こんな感じです。

  • Polisという合意形成ツールに興味を持った理由:人と議論するのが不毛であり苦手に感じるので、アルゴリズムでどうにかしたいじゃん
  • Claude Codeと一緒にJupyter NotebookでアルゴリズムをPythonで再現した
  • Polisのアルゴリズムは既存技術の組み合わせで、むしろ「何を解こうとしているか」がおもろい
  • 対立ではなくコンセンサスを見つけるという思想が、人間への一つの向き合い方としておもろい

機械学習の領域について詳しく理解できたわけではないです。

当たり前の認知を見直して、アルゴリズムで解決する。そんなことをしてみたいです。

tantan
tantan

いいねと思ったら、いいねお願いします。

Polisとの出会い

最近ハマっているYoutube「ゆるコンピュータ科学ラジオ」で出会いました。おすすめです笑!

ABOUT ME
tantan_tech
tantan_tech
淡々と改善している人
建設会社にて、現場の施工管理からDX推進、データ利活用や機械学習を経て、現在は社内の市民開発(Power Platform)を推進しています。
記事URLをコピーしました