#!/usr/bin/env python # coding: utf-8 # # 中間発表(20141128) # 早稲田大学先進理工学部物理学科4年 山崎研究室 藤本將太郎 # # Outline # - 前回まで # - 先行研究 # - 会議に最適な人数について # - モデル化 # - 構想と定式化 # - 今後の課題 # - 参考文献 # # 前回まで # アロメトリー則(Kleiber則) # 「組織は大きくなると個々は働かなくなる」という主張。 # # # # - 実際に組織の大きさと生産性が関連しているような事例の具体例 # # → 会議、グループワーク # # # - モデル化 # # 先行研究 # - 学術論文にはなっていないが、gooアンケートの結果などから、一般的には会議の最適な人数は4〜8人くらいであり、多くても10人くらいが会議を行うのに適した人数だと言われている。 # # >有意義な議論ができるための適正人数は、4~6人が48.9%と最も多く、次が7人から10人(36.5%)、3番目がぐっと下がって、会議に適正な人数があるとは思えない(8.5%)という答えでした。 # # - また、いくつかの論文にも、観察結果として同様のことが述べられている。 # # # - 会議参加の適正人数は4人から10人 1000人調査「議論の9割はムダ!」悪い見本【5】:PRESIDENT Online - プレジデント:http://president.jp/articles/-/692 # - 会議に関する意識調査 - NTTコム リサーチ 調査結果:http://research.nttcoms.com/database/data/001053/ (全国の20歳以上の正社員1046人より回答を得た。男女比は、87:13。調査期間は2009年6月24~25日。) # # ## 良いグループワークとは -最適人数と相乗効果から- # - 簡単な評価関数と数値的解析 # # # - グループワーク評価関数 # # $$f(n) = \alpha (\text{意見の質}) - \beta (\text{必要時間})$$ # # # - 2つの場面を考慮 # 1. メンバー間コミュニケーションがない場合 # 2. メンバー間コミュニケーションがある場合 # # # - 意見の質 # - それぞれのメンバーの提出する意見を[0,1]の間の実数値と考え、最終的な結論はその最大値とする。 # ### 1.メンバー間コミュニケーションがない場合: # それぞれのメンバーはそれぞれ[0,1]の間の値をランダムに取る。 # # 順序統計量の最大値$X(1)$の確率密度関数: # # $$p^{(1)}(x) = n[P(x)]^{n-1}p(x)$$ # # 一様分布の累積分布関数$P(x) = x$より # # 期待値: # # $$E(X(1)) = 1- \frac{1}{n+1}$$ # ### 2.メンバー間コミュニケーションがある場合: # 既出の意見を聴いて、より良い意見を出すことができる。 # # $k$番目の発言者は、既出の意見より質の高い領域[$X_{k-1}, 1$]の値を一様な確率で出す。 # # $X_{k}$の期待値: # # $$ E(X_{k}) = \frac{X_{k-1}+1}{2}$$ # # 意見の最大値の期待値: # # $$E(X(n)) = E(X_{(n)}) = 1- \left( \frac{1}{2} \right)^{n}$$ # ### 合意までの必要時間 # グループコミュニケーションのリンク数に比例する # # - コミュニケーションなし: $n$ # - コミュニケーションあり: $_{n}C_{2}$ # $f(n) = \alpha (\text{意見の質}) - \beta (\text{必要時間})$を、適当な$\alpha, \beta$についてグラフにした([図1](#fig1))。 # # [fig1]: ref1.png "コミュニケーション有無の比較" #
![ref1.png][fig1]
#
[図1](#fig1). コミュニケーション有無の比較
# # コミュニケーションありの方が少ない人数で最適で、評価関数の取る値は大きい # $\beta = 1$と固定して$\alpha$の値を変えたときの最適人数の変化([図2](#fig2)) # # [fig2]: ref2.png "意見の質の係数と最適人数" #
![ref2.png][fig2]
#
[図2](#fig2). 意見の質の係数と最適人数
# # 意見の質が重要である場合でも、コミュニケーションありの方が、ない場合に比べて最適人数が少ない。 # ## 会話に関するいくつかの研究 # >通常の会議では順に意見を述べていくことになるが、そこには一定のパターンが見受けられる。それは、会議への関心が強い者から順に発言してゆくというケースである。 # # - Turn-taking # # >日常会話では、一度に一人が発話し、その後順番(ターン)が変わった後も一度に一人が発語する、という規則が見られる(Sacks, Schegolff & Jefferson, 1974). # # >また、Clark & Carlson (1982) は聞き手を分化させ、三者以上の会話における会話者を"話し手(Speaker)"、"受信者(Addressee)"、"傍参与者(side-participant)"に分類している。 # # モデル化 # ## 構想 # シチュエーション: # # - はじめに議題が与えられる # - 参加者はそれまでに提出された意見に関連して自分の意見を述べる # - 沈黙も考慮 # # 仮定: # # - 一度に発言できるのは一人まで # - 参加者の意見の引き出しは有限(人が多いほど多様性が確保される) # - 結論は議題やある一定数以上の意見に関連した意見である(たとえば参加者の数の2倍程度)。 # - 結論が出るまでにかかる時間が長いほど評価は低くなる。 # # ## 定式化 # 評価関数について: # # 評価関数は参加者の人数$n$に対して # # $L(n)$:結論までに張られたリンクの数 # # $T(n)$:結論までにかかった時間 # # として、 # # $$f(n) = f_L(n) - f_T(n)$$ # # とできるだろう。$f_{L},f_{T}$は~~連続な~~正値関数 # # 発言が、それを特徴づけるパラメータ(発言者、思想、賛成反対、重要度など)$a$個で表現できるとした時、各離散時刻$t_{k}$(全体で$k$番目の発言の開始された時刻)になされる発言$x_{k}$は$R^{a}$上の有界集合$X\subset R^{a}$における1点とみなすことができる。 # # 発言者の人数を$n$人とすると、$x$のパラメータの一つである発言者は、アルファベット$N = \{1, 2, \dots n\}$に、沈黙を意味する\{0\}を加えて表すことができる(これを$N'$とする)。 # # ここで、$i$の持っている意見すべての集合は$X_{i}$と表し、その要素数は$I_{i}$と表すことにする。 # # すなわち # # $$X_{i} = \{\text{person}(x)=i) | x \in X\}$$ # # # また、定義より # # $$X_{i} \cap X_{j} = \emptyset,\ \ \,\ ^{\forall} i, j \in \{i\neq j | i, j \in N'\}$$ # # # $$\bigcup_{i=0}^{n} X_{i} = X$$ # # である。 # # 次に、時刻$k$に$i$が発言した後、時刻$k+1$に$j$が発言する条件付き確率$P(x_{k+1}^{j}|x_{k}^{i})$は、以下のように書けるだろう。 # # $$P(x_{k+1}^{j}|x_{k}^{i}) = p_{i}(k,j)q(x_{k+1}^{j},X_{j}(k)),\ \ \ \ ^{\forall} i, j \in N'$$ # # ここで、$p_{i}(k,j)$は発言者$i$のあとに$j$が発言する確率であり、$q(x_{k+1}^{j},X_{j}(k))$は、$j$の発言のうち、$k$番目までに出現していない発言を選ぶ確率である。条件付き確率の定義から、$X_{j}(k) = \emptyset$の時、$p_{i}(k,j)$は再定義される必要がある。$p$と$q$の具体的な形については後で述べることとする。 # 時間発展は以下のようなプロセスで進展する。 # # 初期条件としての意見$x_{0}$は議題であり、このときの発言者は$0$であるとする。 # # 時刻$t_{1}$で確率$P(x_{1}^{i}|x_{0}^{0})$のもと点$x_{1}^{i}$が選ばれ、このとき議題$x_{o}^{0}$との間の関係があれば(すなわち適当に定めた距離において、ある閾値$r$より小さければ)、この二つの要素の間にリンクを張ることにする。一度選ばれた点は、再び選ばれることはない。 # # 以後同様に確率的に点を選んでいき、それまでに発言された点で距離が近い点はすべてリンクで結んでゆく。 # # シミュレーションの終了条件は、ある発言がなされた時、その発言がある閾値より大きいリンク数を持つような場合と、すべての参加者が発言し尽くしてしまった場合である。 # # ### $p,q$の具体例 # $p$は、ある人$i$の発言が$j$に向けられることによる効果や、声の大きさ、立場、実際の物理的距離、親密度、関心などの要素を含んでいる。 # # 一番簡単な定式化は、すべての人に関して等確率で話すことを促進するというものである。 # # $$ p_{i}(k,j) = \frac{1}{m}$$ # # ここで$m$は、時刻$t_{k}$の終わった時点で発言することのできる人(発言のストックがある人)の数+(沈黙)である。 # 次に現実的な定式化として、各参加者の実際の位置を用いて、その距離に応じて重みを付けるというものが考えられる。 # # すなわち、$i$から$j$の実際の物理的距離が$d_{ij}$で書けるとすると、 # # $$ p_{i}(k,j) = \frac{g(d_{ij})}{\sum_{v \in N'} g(d_{iv})}$$ # # のようにできる。このとき関数$g$は$[0, +\infty)$の領域で連続で有界な正値単調減少関数と考えていいだろう。また、この場合には$d_{i0}$には正の有界値を任意に与える必要があるだろう(他の値との相対的な大小は、声の大きさ、場所の声の通りやすさなどを表すことになる)。 # # ex1)$$g(x) = \frac{1}{x+1}$$ # # ex2)$$g(x) = e^{-x}$$ # # # $q$は、発言者が定まった上で、その中から一つ発言を選ぶ確率である。これも最も簡単な式としては # # $$q(x_{k+1}^{j}, X_{j}(k)) = \frac{1}{\#X_{j}(k)}$$ # # が考えられる。ここで$\#$は集合内の要素数である。また、先程も述べたように$\#X_{j}(k)=0$のときはこれは定義できない。 # 次に考えられるのは、それまでの意見をできるだけ反映するように発言するような場合で、このとき、 # # $$\# \{d(x_{l}^{s}, x_{k+1}^{j}) < r \ |\ ^{\forall} l \le k, s \in N\}$$ # # を最大にするような$x_{k+1}^{j}$が選ばれる。 # もしくは、直前の意見のみに関連するように発言するとすれば、 # # $x_{k+1}^{j}$の選び方は、$d(x_{k}^{i}-x_{k+1}^{j})$を最小とするように選べば良い。 # # ## シミュレーション # In[1]: import matplotlib.pyplot as plt import numpy as np # In[2]: N = 6 radius = 3 def accumulate(iterable): 'Return running totals' # accumulate([1,2,3,4,5]) --> 1 3 6 10 15 # accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120 it = iter(iterable) total = next(it) yield total for element in it: total += element yield total class Person(object): def __init__(self, ideas_num=10, place=(0., 0.), **kwargs): # 意見は0~1の間の値を一様に取りうる self.ideas = list(np.random.random(ideas_num) # 発言者の実際の位置が2次元の座標として表せる self.place = place # その他の特徴量 for (k, v) in kwargs.items(): setattr(self, k, v) def distance(self, p): # 人pと自分との間の距離(ユークリッド距離) d = np.sqrt((self.place[0]-p.place[0])**2 + (self.place[1]-p.place[1])**2) return d class meeting(object): def __init__(self): # 意見の時系列(今の場合0〜1の乱数の値そのもの) self.ideas = [] # 発言者の時系列 self.speaker = [] # 時刻 self.k = 0 # 張られたリンク(時刻, 時刻)のタプルで表現する self.links = [] # はじめの意見(議題) x0 = 0. self.ideas.append(x0) # 議題は沈黙の意見だとする self.speaker.append(0) # 会議のメンバーとして沈黙を加える self.members = {0: Person(place=(0., 0.)),} # 沈黙を中心とした円周上に等間隔で参加者が存在する deg = np.linspace(0., 360., N, endpoint=False) for n in range(1, N+1): rad = np.radians(deg[n-1]) self.members[n] = Person(place=(radius*np.cos(rad), radius*np.sin(rad))) def p(self, i): # 発言者の物理的距離に対する関数 def g(x): return 1./(1.+x) # 参加者の中で話せる人のみを対象に _N = [] for k, v in self.members.items(): if len(v.ideas): _N.append(k) # それらの人たちに対し、重み付けの確率を付与 w = [] for n in _N: d = self.members[n].distance(i) w.append(g(d)) w = np.array(w) sum_ = np.sum(w) _p = list(w/sum_) p = accumulate(_p) rn = np.random.rand() nm = 0 while True: if p[nm] > rn: break else: nm += 1 # その確率で選ばれた人の名前を返す return _N[nm] def q(self, j): # 発言者jが選ばれた時、持っている意見から等確率で意見を取り出す x_j = self.members[j] return x_j.ideas.pop() def distance(self, x, y): d = np.abs(x - y) return d def connect(self, idea): for i, v in enumerate(self.ideas): if self.distance(v, idea) < radius: def progress(self): j = self.p(self.members[self.speaker[-1]]) self.ideas.append(self.q(j)) def test_plot(self): x = [0,] y = [0,] for n in range(N+1): x.append(self.members[n].place[0]) y.append(self.members[n].place[1]) return x,y # In[3]: a = meeting() a.progress() # In[4]: print a.speaker print a.ideas # # 今後の課題 # - シミュレーションの実行と解析 # # - 様々な状況を再現し、現実の現象と対応しているかどうか # # # # - 他の現象(代謝ネットワーク等)との関連付け # # 参考文献 # - 赤澤邦夫, 良いグループワークとは〜最適人数と相乗効果から〜, http://toshisv.sk.tsukuba.ac.jp/thesis/H25_2013/inter/201011245.pdf, 2013. # - 石川 正純・足立 にれか・岡本 浩一, 会議分析のための数値シミュレーション技法-組織内集団に見られる意思決定モデルの開発-, 社会技術研究論文集, 2004. # - 城 綾実・細馬 宏通, 多人数会話における自発的ジェスチャーの同期, Congnitive Studies, __16__(1), 103-119, 2009. # - 藤本 学・大坊 郁夫, 小集団の会話の展開に及ぼす会話者の発話行動傾向の影響, The Japanese Journal of Experimental Social Psychology, __47__(1), 51-60, 2007. # - 高良 美樹, 集団討議の参加者の人数が集団決定および個人決定に及ぼす影響について, 人間科学, __1__, 67-84, 1998. # # # 発表を終えて -フィードバック- # ## 今後の課題 # - 具体的な簡単な例について、解析的に解いてみる、あるいは数値シミュレーションを行う # - 数値シミュレーションの際は、様々な関数系や項の効果について、その効果が分かるように、他の条件は揃えてやる(基本) # - 確率論の問題に帰着できているので、数学的な基礎手法を確認する # - こうすると他の現象に関して適用しやすい