Bakulog

獏の夢日記的な何か。

きらら4コマ(スロウスタート)のキャラ相関解析をそれっぽくやろうとした

エセ数学記事です。

もくじ

  1. 要約
  2. 背景
  3. 関連研究
  4. 提案手法
  5. 結果と考察
  6. 今後の展望
  7. 謝辞

章立てで論文のフリをしてますが、中身は適当です。

 

 

0. 要約

下記の条件を満たすマンガについて、登場するキャラの組み合わせをもとに、 親密度が高く百合カップルっぽい組み合わせをキャラ相関として2次元空間に可視化する方法を考えました。

  • 条件1: 4コマ形式になっている
  • 条件2: 敵キャラが存在しない

手法は次元削減で簡単なやつ無いかなーと考えたものの多次元尺度法(MDS)に落ち着いています。 MDSを使うにはキャラどうしの距離感を表すパラメータを算出する必要があり、 本記事では百合要素の抽出に特化すべく「楽観的きらら偽距離」という距離もどきの値を使ってます。

適用先としては「スロウスタート」の単行本1巻から4巻を用いて可視化を行い、 その結果、「えーこちゃんと榎並先生の百合が尊い」という事が分かりました。

 

はい、嘘です。

 

えーこちゃんと榎並先生の百合が尊い」という結論が先にあり、 結論との矛盾が少なさそうな(つまりは直感に反しない)マッピングが出る方法を探った、というのが本来の流れです。

したがって、結論は以下の仮説が提唱できた、という話に集約されます。

仮説: 百合要素に着目してキャラの相関をマッピングしたい場合、上記の「楽観的きらら偽距離」と多次元尺度法の組み合わせは有効かもしれない。

ただし、同手法を「ご注文はうさぎですか?」で試したらイマイチだったという話も出てるので、 いささか締まりのない記事になっています。

なお、本記事はきらら作品の良さを紹介するのが主目的の記事ですが、ついでに「多次元尺度法はPython(というかsklearnmanifold)で数行で書ける」という話も一瞬だけします。

 

 

1. 背景

背景の要点だけかいつまんで言うと「スロウスタート 1 2 3 4の単行本を買ったら百合要素にドハマリしたため、人物相関図みたいのをマッピングして定量的に百合要素が可視化できないか?と思いました」、という話です。

より詳細な経緯を示します。

  1. メロンブックス企画で社畜ちゃんスポーツタオル(Twitterのコレとか参照)なる非売品が出る
  2. タオル入手のためには3万円分の商業マンガを買う必要があるのでマンガの選定作業に入る
  3. スロウスタートが17年秋から放送開始(※)なのは知ってたので購入決定
  4. スロウスタートが届く
  5. スロウスタートを読む
  6. スロウスタートを読み返す
  7. スロウスタートで、えーこちゃんと榎並先生が出てくる所を読み返す
  8. スロウスタートがとても良かったので布教したい
  9. 布教するには良いと思ったポイントを理解したい
  10. 定量的に良さが理解できると心が落ち着くので定量評価したい

(※正しくは2018年1月放送開始なので冬アニメですが、当時は2017年11月から放送だとカン違いしていました)

 

あんまり詳細な感じもしませんが、まあ、そういう感じです。

 

 

2. 関連研究

真面目な研究であれば関連研究をきちんと調べるのがスジですが、今回はそういう事をせずにノリでやりました。

とはいえ、何も書かないのもアレなので、私が背景知識として思い出した話題を単語レベルで掲載します。 どれも割と枯れた話題なので、ググったり本で探せば見つかるはずです。

  • 次元削減(Dimension reduction)
  • 主成分分析(Principal Component Analysis, PCA)
  • 多様体学習(Manifold Learning)
  • 多次元尺度法(Multi Dimensional Scaling, MDS)
  • グラフラプラシアン(Graph Laplacian)
  • スペクトラルクラスタリング(Spectral Embedding)

この辺の事項はいちおう念頭に置いてました、ということでご理解下さい。 今回MDSを選んだ理由については提案手法のほうで簡単に触れます。

それともう一つ。キャラの相関可視化にはあんまり関係ないですが、 まんがタイムきらら作品が適用先になっている応用研究の事例、という意味では ごちうサーチは知っておいて損しないと思います。

https://www.slideshare.net/ksasao/ss-72025009

 

 

3. 提案手法

ここから本題です。まず、大前提として、次の仮定を置きます。

仮定: 同一の場面で一緒に登場する頻度の高いキャラどうしは親密であると考えられる。

この仮定は単純接触効果とかと照らし合わせればイケてそうな気がします。

ただし注意として、マンガの世界では上記の仮定が誤りである例があります。 それは「主人公と悪役」という敵対関係があるケースです。 敵が居るようなマンガでは、同じ場面に居るからと言って仲がいいとは限りません。

まあしかし、今回はマンガの百合要素を抽出したいわけで、 手法の適用先も主にまんがタイムきらら等の日常4コマを想定しています。 こういったマンガでは敵対関係が存在しません。 4コマ以外のきらら作品ではがっこうぐらし!5とか有名な反例があるのは注意すべきですが、 基本的に本記事の範囲では上記の仮定が成り立つ範囲の問題を考える、ということにします。

そこで、登場頻度をもとにした可視化手順として、大まかに次のような手順でのマッピングを考えます。

3.1. キャラがd人いるマンガの4コマがN個ある状態で、Nd列のデータ行列Xを作成 3.2. X(i, j)(ij列要素)の値は「i個目の4コマ作品中で、4コマのいずれかのコマにキャラjが居れば1、どこにも居なければ0」とする 3.3. dd列の行列Lを作成し、L(i, j)に「Xを基に計算した、キャラiとキャラjの親密度」を代入(計算方法は後述) 3.4. 行列Lからdd列の距離行列Dを作成 3.5. Dを多次元尺度法に叩き込むことで、d人のキャラをキャラどうしの距離感ベースで2次元上にマッピング 3.6. マッピング結果を見て、直感に沿っているかどうかを直感で判定

以下、順番に詳細を示します。

 

3.1と3.2. 二値化されたデータ行列の作成

以下の2手順について議論します。

  • 3.1. キャラがd人いるマンガの4コマがN個ある状態で、Nd列のデータ行列Xを作成
  • 3.2. X(i, j)(ij列要素)の値は「i個目の4コマ作品中で、4コマのいずれかのコマにキャラjが居れば1、どこにも居なければ0」とする

ここで言う「4コマ」とは4枚の絵を一括りにした単位のことです。

4コマを構成する4枚の絵をあえてバラさずに一つのカタマリとして扱う理由ですが、 カタマリで考えた方が「同じ場面に誰が居て誰が居ないのか」の情報として妥当だろう、という判断に基づいています。 コマごとの絵だと情報として粒度が小さすぎる、という判断です。

このあたりを判断した背景ですが「実際にコマごとに区切ったら結果がイマイチっぽかった」とか、 自然言語的に見て1コマよりも4コマのカタマリの方が文に近いから良いんじゃないの、程度のざっくりした発想です。

また、「居る=1、居ない=0」で簡略化するのは単に煩雑さを避けるためです。 二値化が妥当かどうかはイマイチ確証がないですが、 そもそも今回作っているデータ行列はBag of Words(BoW)とほぼ同じで、 BoWでも二値化したりするらしいので「まあいっか」としています。

そのほか、キャラが居る/居ないの判定もけっこう微妙な問題です。 本記事で使ってるデータはマンガを全部読んで手作業で各コマをアノテーションしてるんですが、このときの基準は次の通り。

  • 居る: 顔がハッキリ描かれている
  • 居る: 顔は描かれてないが、後ろ姿や髪型がそれなりに大きく描かれており、容易にキャラの判別がつく
  • 居る: 回想イメージで出てきており、キャラの顔や体がじゅうぶん大きく描かれている
  • 居ない: 完全にキャラが映っていない
  • 居ない: キャラが描かれているが、極端に小さい
  • 居ない: キャラが描かれているが、吹出に隠れてほとんど見えない
  • 居ない: 回想イメージで出てくるが、小さいデフォルメで出てくるだけ
  • 居ない: キャラが映っておらず、吹出の隅に「このキャラが喋ってるよ」を示す目的でデフォルメ顔が載っている
  • 居ない: 体の端(手とか)だけが描かれている(※前後関係から誰なのか分かる場合でも「いない」扱い)

ここの加減でキャラのいる/いない判定が変化するため、親密度の計算方法によっては結果がかなり変わってきます。

さらに、「誰をキャラとして数えるか」問題もあります。 たとえば「ご注文はうさぎですか?6 の場合、うさぎキャラ(ティッピー、あんこ、ワイルドギース)を 登場キャラとしてカウントするか?というのも意外に難しいです。 ここも親密度の計算方法によっては結果に効きます。

3.3と3.4. 親密度行列を求め、距離行列にする

以下の2手順を議論します。

  • 3.3. dd列の行列Lを作成し、L(i, j)に「Xを基に計算した、キャラiとキャラjの親密度」を代入(計算方法は後述)
  • 3.4. 行列Lからdd列の距離行列Dを作成

おもに前者のLの作成方法がポイントであり、本記事のキモでもあります。

まず、何でもアリにするとキリが無くなってしまうため、今回はLを次のような指標にします。

  • 親密度は最小値が0、最大値が1になるような値である。
  • 各キャラにとって、自分自身への親密度は1である。つまりL(i, i) = 1が成り立つような指標を考える。
  • Lは対称行列となる。

こう決めると距離行列は割とかんたんに定義できます。

  • D(i, j) = 1 - L(i, j)

要するに親密なほど距離が近く、親密度MAXなら距離は0、と考えます。距離の最大値が1になるのが少し直感に反しますが、そこは目をつぶります。

まあともかく、距離は定義できそうに見えるので、Lの計算方法の話題に戻ります。

今回計算したいのは「一緒に出てくる頻度の高さ」という指標なので、 例えば次のような値は親密度の指標と言えそうです。

  • L(i, j) = (キャラijが同時に登場した4コマの総数) / (キャラiまたはjが登場した4コマの総数)

これは発明でもなんでもなくて、Jaccard係数と呼ばれるよく知られた指標です。英語Wikipediaの記事もちゃんとあります。

この指標を用いた場合、対称性L(i, j) = L(j, i)が備わり、しかも距離についてはD(i, j) = 1 - L(i, j)が三角不等式を満たすというよい性質があります。 このD(i, j)はJaccard距離と呼びます。計算がしやすいし割と知られた指標でもあるため、Jaccard距離を用いた評価は行うことにします。

が、しかし。

Jaccard係数には一つ大きな欠点があります。

それは百合要素の抽出にあたって重視すべき「二人きりのシーンに対するウェイトが全く考慮されない」という点です。

極端な例ですが、たとえば5人の主要キャラがいる日常4コマがあったとして、 すべての4コマに主要5キャラが全員登場すると、Jaccard係数は1になります。 しかし、多人数でわちゃわちゃしてるシーンは「仲良しグループ」として解釈すべきであり、 このようなケースを「百合カップル的な意味で親密度が高い」と評価するのは適切ではありません。

本記事の目的はあくまで百合要素の抽出なので、「二人だけで絡んでいるシーン」がとても重要です。 そこで、Jaccard係数ではなく「きらら係数(Kirara Index)」というのを定義します。定義はこう。

  • Ki(i, j) = (キャラijだけが登場する4コマの総数) / (キャラiが登場する4コマの総数)

「二人だけが登場するシーン」をカウントするのがポイントで、今回の目的に即したきわめて極端な指標です。

もう少しマイルドな指標を考えるなら、 「キャラijが一緒にいる4コマについて、キャラが計K人いたら、重みづけ1/(K-1)で親密度として数える」 というふうに、少人数シーンであるほど親密度を高く評価する手も考えられますが、 こういった計量の洗練化は今後の研究で考えることにして、今は「きらら係数」でやっていきます。

さて、上記の「きらら係数」の性質ですが、キャラijに対して式が対称ではないため、 Ki(i, j)Ki(j, i)は基本的に一致しません。

この指標自体はわざと非対称な親密度になるように定義しています。 直感的な意味付けは「キャラiがキャラjをどのくらい好きか」です。 たとえばKi(i, j) = 0.5の場合、キャラiは登場シーンの半分がキャラjとの二人きり、ということになります。 これに対し、例えばKi(j, i) = 0.1だった場合、キャラjから見るとキャラiとの二人きりシーンは全体の10%だけです。 若干片想いっぽい感じですね。

で。きらら係数はこういう性質の指標ですが、さきほど定義した距離行列は

  • D(i, j) = 1 - L(i, j)

これで決めると言ってしまいました。 Dは距離行列なので対称になっているべきであり、 したがってLを対称行列にする必要があります。 つまり、きらら係数の対称版みたいなのが必要です。

もちろん、手っ取り早く対称性を実現するには平均をとればいいです。

  • L(i, j) = (Ki(i, j) + Ki(j, i)) / 2
  • D(i, j) = 1 - (Ki(i, j) + Ki(j, i)) / 2

このようにすると対称性は確保されます。このL(i, j)は単純に「対称化きらら係数(Symmetric Kirara Index)」とし、 D(i, j)のほうを勝手に「きらら偽距離」と命名します。 「偽距離」としているのは、この定義では三角不等式が(多分)成り立たず、距離とは呼べないと考えられるためです。

この指標も十分それっぽいのですが、今回コレは使いません。 対称な指標を得るための別の観点として「楽観性」というのを考えます。 楽観性とは次のような考えです。

考え: 百合マンガは優しい世界なので片想いは存在せず、基本的に両想いである。

この考えによると、キャラiがキャラjを好きな場合、キャラjもキャラiを好きである、と考えられます。 このアイデアをきらら係数の対称化に生かすと、平均値ではなく単に「高い方の値を採用する」という指標が作れます。

  • L(i, j) = Max(Ki(i, j), Ki(j, i))
  • D(i, j) = 1 - Max(Ki(i, j), Ki(j, i))

このL(i, j)を「楽観的きらら係数(Optimistic Kirara Index)」と呼び、 K(i, j)を「楽観的きらら偽距離」と命名します。 定義から自明ですが、楽観的きらら係数は対称化きらら係数より大きく、 楽観的きらら偽距離はきらら偽距離より小さくなります。 つまり指標の変更によってい、全員がより親密であるように計算されます。優しい世界ですね。

後の結果の節でも示しますが、「スロウスタート」の場合、この「楽観的きらら偽距離」だと 良い感じにマッピングされます。

 

3.5と3.6. 多次元尺度法を適用し、結果を見る

以下の2点を議論します、というか前者のマッピング手法を議論します。

  • 3.5. Dを多次元尺度法に叩き込むことで、d人のキャラをキャラどうしの距離感ベースで2次元上にマッピング
  • 3.6. マッピング結果を見て、直感に沿っているかどうかを直感で判定

まず、マッピング手法の選定理由について。

今回行うのはキャラの関係マッピングなので、dはだいたい6程度から、多くても20くらいになります。 この条件では普段ならコスパのいい多様体学習っぽい次元削減の手法、つまり

  • 主成分分析(PCA)
  • Locally Linear Embedding(LLE)
  • Spectral Embedding

この辺の手口がパッとしません。 なぜなら、これらの手法は「データ点が実際に何かの多様体上に載っている」かつ、 「教師なしデータがそこそこ沢山ある」という状況でないと本来の能力を発揮しないからです。 今回はデータ点の数というのはキャラ数に対応するので、 点が少なすぎてやりづらい、という話です。

これとは対照的に、多次元尺度法(MDS)はデータ数が少なくても特段問題のない手法なので、 今回のようなケースでも心臓に優しく使えます。

また今回の場合、データどうしの距離は表せても座標表現は難しい、という事情も考えるべきです。 前節で計算した親密度とかきらら偽距離といったパラメータは意味付けがそれなりに理解できますが、 こうした計算を行う前のN次元座標での表現は直感的に意味がある、とは若干考えにくいです。 このため、PCAみたいな座標値ありきの手法はボツにしとこう、となります。

ともかく、以上のような理由から採択したのはMDSです。 採択した以上は計算を行う必要がありますが、実装方法としてここではPythonsklearnを使います。 Pythonsklearnの導入手順は「sklearn インストール」とかでググればそんなに苦労はしません。 ただしWindowsでは面倒な可能性もあります。私の場合はWindowsVMwareを突っ込んでUbuntu上でやっています。 どのみち今回の計算は大したものでもないので、仮想環境でやっても特に問題は無いです。

詳細は公式ドキュメントを読んでもわかりますが、 今回はすでに求めた距離行列をMDSにかけるだけなので、例えばこんな感じ。

import pprint
import numpy as np
from sklearn import manifold

raw_data = [
    0,0.883708173,0.868564253,0.805084746,0.987311178,0.92781457,0.889593909,
    0.883708173,0,0.814070352,0.851333333,0.990621336,1,0.992456897,
    0.868564253,0.814070352,0,0.722073757,0.888,0.996591684,0.973751601,
    0.805084746,0.851333333,0.722073757,0,0.99112426,0.998467433,0.983026874,
    0.987311178,0.990621336,0.888,0.99112426,0,1,1,
    0.92781457,1,0.996591684,0.998467433,1,0,0.929896907,
    0.889593909,0.992456897,0.973751601,0.983026874,1,0.929896907,0
    ]

person_count = 7

distance = np.array(raw_data).reshape((person_count, person_count))
mds = manifold.MDS(n_components=2, dissimilarity="precomputed")
pos = mds.fit_transform(distance)
pprint.pprint(pos)

ポイントはdissimilarity"precomputed"を指定する所くらいですかね。

ちなみに、ここではボツにしていますが、他の手法も多様体学習のドキュメントから辿れば参照可能です。 どれもそんなに複雑ではない(ハズ)です。

 

 

4. 結果と考察

長々と前フリをしましたが、ようやく結果の話です。 本手法の適用先を以下に示します。

  • スロウスタート」単行本1巻から4巻
  • メインの4コマはすべてデータ源とするほか、以下も含める
    • カバー裏描き下ろし4コマ
    • 巻頭カラー描き下ろし4コマ
    • 話と話のあいだに描かれた描き下ろし4コマ
    • 巻末の描き下ろし4コマ
  • 巻頭マンガが4コマ形式でないものはデータに含めない

アノテーションの内容とかはExcelにぶち込んだのでGoogle Driveに置くだけ置きました。 本来は他人に見せない想定だったファイルなのでExcelの癖にファイルデカいとか色々メチャクチャですが、 何やってこうなったのかの参考程度にはなると思います。

以下にいくつかのマッピング結果を示します。 座標には目盛を入れていませんが、これは目盛の値そのものに大して意味がなく、 「近い」「遠い」の関係が適切なのかだけに注目するためです。 (縦軸と横軸のスケールとかはさすがに揃えてます)

まず、Jaccard距離で求めたやつ。

 

この出力の長所と短所はこんな感じ。

  • OK: 主人公の花名ちゃんが中央に来ている
  • OK: 榎並先生にいちばん近いのはえーこちゃん
  • OK: 志温ちゃん、万年さんにいちばん近いのは花名ちゃん
  • NG: えーこちゃんと榎並先生が離れすぎ
  • NG: 万年さんと花名ちゃんが離れすぎ

要するに、Jaccard距離で測った結果では「花名ちゃん、冠ちゃん、えーこちゃん、たまてちゃんの4人が仲良し」という、 百合要素ではない点を抽出している感じになります。 これ自体は想定通りの結果と言えますね。

いっぽう、楽観的きらら偽距離を使った出力はこうなります。

 

こっちが所望の結果です。

  • OK: えーこちゃんと榎並先生が近い
  • OK: 花名ちゃんと志温ちゃんが近い
  • OK: 花名ちゃんと万年さんが近い

代償として仲良しグループの花名ちゃん、えーこちゃん、冠ちゃん、たまてちゃんの間に 距離が出来てますが、この4人はあくまで仲良しであってガチ百合ではないはずなので、 今回の狙いだった「百合要素の観点でマッピング」という点ではこれで特に問題ないと考えられます。

以上はうまく行った例です。

これで「わーい」で終わりでもいいんですが、 こういう研究(?)で成功例ばかり示して欠点に言及しないのは不誠実なので、 公正を期すために別のきらら作品へ適用し、コケた例も見てみましょう。 「ご注文はうさぎですか?」1巻から5巻に対して同様の手法を実施した結果を示します。

Jaccard距離

 

  • OK: チノちゃんが真ん中に来る
  • OK: ココアちゃんとチノちゃんが近い
  • OK: シャロちゃんと千夜ちゃんが近い
  • OK: マヤとメグが近い
  • NG: ココアとモカねえが遠い
  • NG: リゼちゃんとシャロちゃんが(ちょっと)遠い

ラビットハウスの3人組が近くにマッピングされるあたり、Jaccard距離の特性が出ている感じがします。

楽観的きらら偽距離

 

  • OK: ココアちゃんとチノちゃんが近い
  • OK: シャロちゃんとリゼちゃん、千夜ちゃんが(全体傾向のなかでは比較的)近い
  • NG: マヤがシャロちゃん以上にリゼちゃんに近く、直感に反する
  • NG: 千夜ちゃんとメグちゃんの距離もなんか不自然

はい、残念ながら失敗です。

失敗した原因はいくつか考えられます。

  • そもそもごちうさではキャラが2人だけ、というシチュエーションが珍しい
  • したがって、2人きりのシーンに着目した指標ではノイズ耐性が低すぎる
  • セリフのテキストをデータとして見ていないので、人間関係を理解するために必要な情報が取れてない
  • ごちうさはガチ百合ではなかった…?

少なくとも、「楽観的きらら偽距離は指標としてはちょっと極端だ」という事はいえそうです。

 

 

5. 今後の展望

ここでいう「今後の展望」は、本記事のことではなくスロウスタートの今後の展望という意味です。

スロウスタートの今後ですが、アニメが始まったら知名度上がるだろうなーという事で、 個人的には非常に期待しています。 内容も文句ないです(たまに花名ちゃん見ててウッてなる事はありますが)。

本音は「とりあえずコミックを買え」ですが、 今すぐ買わない人もスロウスタートのアニメが始まるので、 とりあえず観てからコミックを買えばいいんじゃないでしょうか。

あと蛇足ですが、一応本記事の今後の展望も。

  • ここでは2作品しか試していないので、他の(きららの)作品で試したらどうなるかの検証もすべき
    • 本手法と相性が良さそうな例: 桜Trick 7
    • 本手法と相性が悪そうな例: ゆゆ式(基本的に3人以上で一緒だから) 8
  • MDSではキャラ関係が無向性になるが、人物相関はふつうに考えたら有向性があるので、有向性が活用できる手法があったら使いたい
  • 考察で触れたとおり「楽観的きらら偽距離」は二人きりシーンのみに注目する極端な指標なので、もう少し緩和したものを定義して比較できるとしたい

 

 

6. 謝辞

本記事のネタ元にさせていただいた、 「スロウスタート」原作者の篤見唯子先生、および 「ご注文はうさぎですか?」原作者のKoi先生にこの場を借りてお礼申し上げます。