読者です 読者をやめる 読者になる 読者になる

歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【メモ】三親等内の婚姻を禁止する制約上の親族関係ネットワークのシミュレーション

networkx Python 社会シミュレーション 社会科学 ネットワーク科学

クロード・レヴィ=ストロースという人類学者が『親族の基本構造』という本で、部族の婚姻関係を数学の群論を使って解析したという話を @KaitoSSS_ さんに聞きました。

親族の基本構造

親族の基本構造

 

 

人類学では、様々な部族のいとこ同士の結婚は、平行いとこ婚と交差いとこ婚の二つに分類することが多いようです。

交叉イトコ婚

◆交叉イトコと平行イトコ

  交叉イトコ:父の姉妹、母の兄弟の子ども(FZS,FZD,MBS,MBD)

  平行イトコ:父の兄弟、母の姉妹の子ども(FBS,FBD,MZS,MZD)

F:Father, M:Mother, S:Son, D:Daughter, B:Brother, Z:Sister, H:Husband, W:Wife[→親族名称(人を分類する)

◆一般的なコンセンサス

1.平行イトコ同士の婚姻の禁止

(同一リネージに属し、外婚制に反する/あるいは父系内婚的傾向をもちやすい)

2.[全体の傾向]母系制社会に父方交叉イトコ婚/父系制社会に母方交叉イトコ婚

3.交叉イトコ、とくに母方交叉イトコ婚が圧倒的に優先(MBS,MBD>FZS,FZD)   

[これは、父系制社会が多いという事実によって説明される]

4.父方交叉イトコ婚は、配偶者の非選択婚(規定婚)をとらず、選択的な形態になりやすい

5.母方交叉イトコ婚は、非選択的な規定婚をとる[選択婚が皆無とはいえない]

 

レヴィ=ストロースは、婚姻の法則として「交差いとこ婚」を見出した。:品川心療内科(品川駅港南口)こころの平和:So-netブログ

 

母方交叉イトコ婚に注目した人類学者
婚姻の歴史が書かれている文化人類学の書籍を見ると、必ずレヴィ=ストロースというフランスの人類学者の考えが載っています。構造主義と呼ばれる現代思想 の先駆者としても有名ですが、彼はきわめて広大な地域の未開部族を研究の対象としました。(その対象は、オーストラリア、南アジア、東南アジア、東アジ ア、東部シベリア、さらには南北アメリカにまで及んでいます。)
中でも、オーストラリアの伝統社会における「母方交叉イトコ婚」に着目し、一定方向に女性が交換(移籍・移行)する婚姻規則と、贈物が受け渡される互酬性 によって、複数の集団をつなぐ社会統合が構築されていると考えました。同時に、この婚姻規則(規範)が貫徹されることによって、近親者(親子や兄妹)の婚 姻を禁ずるインセスト・タブーが生まれたと考えました。
この考えは、現在でも人類学の学説の主流となっています。

 

こうしたものをうまく変数に落とし込み、親族関係の発展や、どういう婚姻規則のとき部族が生き残りやすいのか(例えば極端な近親婚を防ぎつつ、限られた人数でコミュニティを維持できるのか)みたいなことを数理モデルで解析できたら面白いんじゃないかという話を @KaitoSSS_ さんとしていました。

 

まずは簡単なシミュレーションを作ってみました。

  1. 男性と女性をランダムに選び出す。
  2. 彼らが三親等以内でなかった場合、婚姻関係となり、息子と娘に置き換わる(つまりコミュニティ全体の男女の人数は変わらない)
  3. 三親等以内であった場合、婚姻関係が成立せず、何も操作しない。

親等の計算は次のように行っています。Pythonのnetworkxで。私は一部の無向グラフで表現しましたが、もしかすると男女の二部グラフで表現したほうがシンプルだったかもしれません。

  1. 上記の2.の操作で、息子と娘の間の二親等としてネットワークのリンクを張る。
  2. 息子と娘は、父親と母親が持つ親戚の親等に+1したものを受け継ぐ。
  3. 六親等以上の枝は破棄する(遠い親戚関係は忘れられる/六親等という値は適当に決めました)。

もし平行/交差いとこ婚の解析がしたいなら、「父方の親戚」と「母方の親戚」の区別を付けなければならないでしょう。その場合リンクに別の父方/母方フラグ変数を追加するか、父方(母方)からのみ値を受け継ぐようにするとかすればいい気がします。

また、コメントアウトで隠していますが、父方と母方の両方に含まれる親戚がいた場合、より小さい親等を採用するロジックが必要です。意外に面倒そうだったので適当にしています(ひでー)。

また、「婚姻時に息子と娘に置き換える」ところでしか「人の死」や「寿命」の効果を入れられていません。そのため、高祖父母と玄孫が結婚する(一応四親等以上離れている)というファンタジーが度々起こっています。また婚姻できないまま一生を終えて人口が変わることや、性淘汰の効果が表現できていません。

 

あと適当に書いたのでどっかにバグがあると思います。もし使う場合は気をつけてください。英語では「親等(degree)」ですが、ネットワークの「次数(degree)」と被ってややこしいため、kinshipという変数名を用いています。

 

import numpy as np
import networkx as nx
from matplotlib.pyplot import *

male = 50 #男性の人数
female = 50 #女性の人数
N = male + female #全体の人数

#親族関係のネットワーク
G = nx.Graph() #最初は誰の間にも親族関係がない
G.add_nodes_from(range(N))

#父と母が結婚し、次の世代に置き換わる
def marriage(father,mother):
    G.add_edge(father, mother, kinship=2)
    fam_of_father = G.neighbors(father)
    fam_of_mother = G.neighbors(mother)
    for fam in fam_of_father: #父親の親族
        kin = G.get_edge_data(father,fam)["kinship"]
        #息子が父の親族関係を受け継ぐ
        G.remove_edge(father,fam)
        if kin+1 <= 6:
            G.add_edge(father,fam,kinship = kin+1)
        else:
            pass
        #娘が父の親族関係を受け継ぐ
        if G.get_edge_data(mother,fam) == None: #まだ親族関係が無い場合
            if kin+1 <= 6:
                G.add_edge(fam, mother, kinship=kin+1)
            else:
                pass
        #else:
        #    if kin+1 < G.get_edge_data(mother,fam)["kinship"]: #より短い親族関係がある場合
        #        G.remove_edge(mother,fam)
        #        G.add_edge(mother,fam,kinship=kin+1)
        #    else:
        #        pass
    for fam in fam_of_mother: #母親の親族
        kin = G.get_edge_data(mother,fam)["kinship"]
        G.remove_edge(mother,fam)
        #娘が母の親族関係を受け継ぐ
        if kin+1 <= 6:
            G.add_edge(mother,fam,kinship = kin+1)
        else:
            pass
        #息子が母の親族関係を受け継ぐ
        if G.get_edge_data(father, fam) == None:
            if kin+1 <= 6:
                G.add_edge(fam, father, kinship=kin+1)
            else:
                pass
        #else:
        #    if kin+1 < G.get_edge_data(father,fam)["kinship"]:
        #        G.remove_edge(father,fam)
        #        G.add_edge(father,fam, kinship=kin+1)
        #    else:
        #        pass

T = 10000 #試行回数
for t in range(T):
    father = int(np.float(np.random.randint(male))) #0~maleまでの人は男性
    mother = int(np.float(np.random.randint(female)) + male) #male~Nまでの人は女性
    close_or_not = G.get_edge_data(father,mother)
    if G.get_edge_data(father,mother) == None:
        marriage(father,mother)
    elif close_or_not["kinship"] >= 4:
        marriage(father,mother)
    else:
        pass

ちなみにシミュレーション後のネットワーク構造は次のようになっています。

nx.draw(G)
show()

f:id:takeshi0406:20141215003415p:plain

 

ひとつ余計なことを言うと、最近、シミュレーションや統計解析やるにも、その分野のオーソドックスな研究を把握しなきゃならないな〜と感じることが多いです。数理的なモデル以前の研究に接続できているのか、単純な記述で済んでいるものを、わざわざ難しいモデルでシミュレーションしているだけじゃないのかと感じることもあります。そのためにオーソドックスな社会学(哲学的にどうこう言うものじゃなく、もっと実践的なもの)を勉強したいんですが、自分に必要な部分を見出すのが難しいです。うまくつまみ食いできたら良いんですけどね。