「例のダウンローダー」の生態系をシミュレートする

今から、架空のサイトの話をする。

ある動画サイトがあり、そこには毎日大量の動画が投稿される。そして、その動画のダウンロードリンクを直接取得できるツールのようなサイトがあるとする。

さらにこのダウンローダーサイトは、単にダウンロードできるだけではなく、利用者がどんな動画をダウンロードしているか、という情報をサーバに記録している。そして、「ある一定の期間にそれぞれの動画が何回ダウンロードされたか」というデータからランキングを作成し、サイトのトップページにそのランキングを掲載しているものとする。

上記の仮定は、実際に存在するいかなるサイトとも関係のない、全くの架空の話ではあるが、このような「ダウンローダー兼ランキング」サイトがあったとしよう。
こういうものがあったとすれば、恐らく、そのダウンローダーの利用者は以下の二つの層に分かれる。

  • 何らかの動画を別経路から見つけてきて、サイトを単なるダウンローダーとして利用するユーザー

  • ランキングを探索して動画を探し、気に入ったものをダウンロードするユーザー

もちろん、あるユーザーが時には前者のような使い方をし、時には後者のように振る舞うということもあるだろう。
また、サイト自体が人気になるにつれて、後者のユーザー層がどんどん増えていくことが予想される。

このような構造があるとき、それぞれの動画のランキング内での振る舞いはなかなか興味深いものになる。
つまり、少数の「ダウンローダー利用」をするユーザーによって新しいトレンドがランキング内にまずもたらされ
大多数の「ランキング利用」ユーザーによってそのトレンドが強化される、という仕組みになるわけだ。
ランキング利用をするユーザーは、恐らく目につきやすい上位の動画をより多くダウンロードすると予想されるので、ダウンロードが増える→ランキングが上がって目につきやすくなる→ダウンロードが増えるというサイクルが発生する。
一方、そのサイクルを繰り返して非常に多くのユーザーにある動画が行き渡ってしまうと、今度はダウンロードされる機会が減っていき、ランキングに新陳代謝が発生することになる。
また、動画ダウンローダーというサイトの特性上、元の動画サイト内で動画が削除され、以降ダウンロードが出来なくなることもありそうだ。

こうしてみると、ここには、あまり他に似ているものがない生態系が成立しそうだ。
少数のユーザーによって新しいトレンドが生まれ、多数のユーザーがそれに乗っかるという意味では仕手株などは近い動きをしそうだが、「人気が高まっても入手コストは一定」「普及していくとどこかで飽和が発生する」という点が異なる。
逆に電子書籍の売り上げランキングなんかは、コストの一定さと二回目の入手が起こらないという点は共通するが、ランキングを見て購入する書籍を決めるユーザは、少なくとも利用者の大多数とは言えないだろう。

あくまで架空の想定であり、こんなサイトは実際には存在しないのだが、構造が特殊であり、だからこそ特殊な力学が成立するかもしれない、となれば少し興味が湧いてくる。

このサイトで最もダウンロード数が多くなる動画はどんな特徴を持ったものだろうか?
あるいは、
このサイトを最もうまく利用するユーザーの動画探索スタイルとはどういったものだろうか?

今回の記事では、そんな疑問について、この構造を粗く再現するシミュレータを作成して探求していきたい。

シミュレータの設計

データ構造

このダウンローダーの生態系を再現するにあたって必要なデータの種類は、動画とそれをダウンロードするユーザーだ。これをそれぞれmovie/userオブジェクトと呼ぶ。

movieオブジェクトはパラメータとして、

  • その動画の質(ダウンロードされやすさ)

  • その動画の削除されやすさ

の2つを持つものとする。

動画の質、とひと口に言っても、どんな動画をダウンロードしたいと感じるかはユーザーによって様々だろう。よくわからないが、動画を手元に残したいと感じるユーザーの目的は恐らく芸術鑑賞だろうから、その芸術の尺度は人によって異なる。
そのため本来はたくさんのパラメータを設定し、それぞれのパラメータごとにユーザーにも好みがあって…といった設計にするのが望ましいのだが、今回は話を簡単にするために、たった一つのパラメータのみがその動画の質を決定するものとしたい。
パラメータ名は、comparable(比較可能な)の頭文字を取って、c-quality(シークォリティ)としよう。

また、削除されやすさのパラメータはそのままriskと呼ぶことにする。
それぞれのパラメータは、まずc-qualityを乱数で取り、riskはシークォリティとゆるく比例するような形にしたい。

全く理由は分からないが、多くの人にダウンロードされやすい動画ほど、なぜか削除されるリスクが高い気がする。
ただしそれらは完全に比例するとは限らない気もするので、riskの値を決定する要因のうち、半分は乱数、半分はシクォリティに比例するということにする。

userオブジェクトを構成するパラメータは4種類想定したい。内訳は、

  • サイトへの来訪頻度

  • 一度の来訪でダウンロードする動画の数

  • ランキングの何位から動画を見始めるか

  • スタート位置からランキングを上に見ていくか下に見ていくか

の4つだ。

前2つの値については、頻度が高いほどダウンロードする動画の数は少ない、ということにする。来訪頻度が低いユーザーは溜まっているはずなので、より多くの動画を必要としていると考えられるためだ。芸術鑑賞欲も発散しなければ溜まるだろう。

後ろ二つの値はユーザーの行動パターンが良質な動画の収集効率にどういう影響を与えるかを確かめるためのもので、これらはランダムに決定するものとするが、すべてのユーザーに対してランダムにこれを割り振ってしまうと、この生態系の特徴の一つである「ダウンロードが増えれば増えるほどランキングが上がってダウンロードされやすくなる」が再現しなくなってしまう。
ランキングが上がるほどダウンロードされやすくなるためには、大多数のユーザーは1位から下向きにランキングを探索する、という前提が必要だ。

そのため、ユーザーデータを作成する際、90パーセントの確率で通常の(1位から下向きに探索する)ユーザーとなるようにし、残りの10パーセントのみ、これらの値がランダムなユーザーが生成されるようにした。
これによりランキング全体の挙動に大きな影響を与えず、多様な行動パターンのユーザーデータを作成できる。

シミュレート仕様

動画ダウンローダーの挙動を再現するため、シミュレータの一回分の試行は以下の一連の動きとして定義する。

①ユーザを一人抽選(来訪頻度の高いユーザほど選ばれやすい)

②そのユーザのスタート位置にある動画を確認

③既に所持済み/削除済みでなければ、生成した乱数と動画のc-qualityを比較
(所持済み/削除済みであれば⑥へ)

④c-qualityの方が大きければその動画をダウンロード

⑤ユーザの離脱指数と乱数を比較し、離脱指数の方が大きければ⑧へ

⑥ユーザの探索方向に応じて次に見るべき動画の順位を計算

⑦次に見るべき動画について③を実行(離脱するまで繰り返し)

⑧一定の確率で動画削除フラグがオンになり、ランキング内の動画が一本削除(riskの高い動画ほど選ばれやすい)

⑨一定の確率で動画新規作成フラグがオンになり、ランキング最下位にランダムな一本の動画がランクイン

この一連の試行を、回数にして10万回行う。
また、ユーザー数は2000、ランキングは1-100位まで、ランキングの集計対象は直近1000回の試行とし、動画削除が発生する確率、新規作成が発生する確率はともに試行1回ごとに10%と設定してシミュレーションを行う。

なお、このシミュレータはJavascript(Typescript)を用いて実装するが、Javascriptの仕様上小数の計算で微細な誤差が生じてしまうため、少数の演算が必要な場合には10000倍してから四捨五入して整数にし、計算後結果を10000で割ることとした。(つまり、小数第4位までしか値に精度がない。)

一応、シミュレータのコードを以下に公開する。なおあくまでシミュレートが実際にどんな形で行なわれたかを示すための公開であり、活用したり、参考にしてもらったりすることを目的とはしていない。(つまり、コードの品質が著しく低い。)


シミュレート結果

結果として出た値を以下のスプレッドシートに公開している。
https://docs.google.com/spreadsheets/d/1ci-5CXlbAIYpTBezzx9swg8bZvwG-EjcYBOk3EWDy_k/edit?usp=sharing

なお、userシートがユーザの元データ、user-0-excludedはデータを作成したものの一度も抽選されなかったユーザを除外したデータ、user-abnormalは特殊な探索パターンを採用しているおよそ1割のユーザのデータだ。movieについてはとくにそうした処理が必要なかったので元データのシートのみ載せている。

ちなみに、自分の統計学の知識はお粗末なもので、データの見方もそれに準ずる程度のものとなっている。それぞれの値に対して並べ替えて観察したり、せいぜい相関係数を求めるぐらいしか行っていない。
なので誤りなどあったら気軽にご指摘いただけると嬉しい。

多くダウンロードされる動画はどんな特徴を持つか?

まずはmovieシートから見ていこう。このサイトの構造に関して、動画について知りたいことは、「どんな性質を持った動画がダウンロードされているか?」だ。それを確かめるため、ダウンロード数と他のパラメータの相関係数を求めていく。すると、最も相関係数が高くなるのは、純粋なc-qualityで値は0.1584418647となった。

どのパラメータも思ったより低い値となったため、結果のデータから求められる指数を3つほど追加した。

  • シークォリティをriskで割った値

  • idとdeleted_at(動画が何回目の試行で削除されたか)から疑似的に求めた「動画の生存期間」(※10回に1つ動画が追加されたという前提に基づいている)

  • その生存期間とシクォリティを掛けたもの

一つ目については、「シコリティが高い割に削除されづらい」動画ほど高くなる、という指数だ。もしもランキングの集計期間が全期間で、無限のユーザー数がある(つまり、ユーザー間で同じ動画が飽和しない)のであれば、恐らくこれダウンロード数は強く相関するものと思われる。
二つ目は、動画の削除頻度があまり高くない為に、偶然長く生き残った動画がダウンロード数を稼いでいるのではないかと考えて追加したものだ。
三つ目も削除のランダム性を考慮に入れた指数となっている。本来、指数の意味としては一つ目のものとほぼ同じになるはずだ。

どれも本来総ダウンロード数と比較的強い相関を持ちそうな指数だが、結果はあまり芳しくない。
どの相関係数も0.3を超えるようなものがなく、総ダウンロード数の動画ごとの差を説明できるものとは言えなさそうだ。
ちなみに、一つ目と三つ目の指数の相関係数は約0.4となった。意味的にかなり近い指数であることを考えると、本来はもっと強い相関が欲しいところだ。少々、削除のランダム性は強すぎると言えるかもしれない。

この結果から言えることがあるとすれば、それは、

  • このシミュレータがポンコツ

  • この生態系における動画のダウンロード数の多寡は、かなりランダム性に支配されている

のいずれかになるだろう。

ポンコツではない、と思いたい理由

もちろん、統計学の素人がやっつけ仕事で作ったシミュレータなので、数値の設定に問題があったり、実装にバグがあってシミュレータ自体がうまく機能していない可能性は大いにある。それはもちろんそうだが、あるいはもしかすると、そもそも仕組み上どのパラメータもダウンロード数をあまり説明できなくなる、という可能性もあるのではないだろうか?

というのも、そうなる理由のようなものが一応想定できなくもないのだ。鍵となるのは、「ランキングの集計範囲が一定の期間に限られること」と、「それぞれのユーザーは既に所持している動画をもう一度ダウンロードしないこと」の二つだ。

このダウンローダーにおいては、一度動画がランキング上位に入ると、1位からランキングを探索する大多数のユーザーの目に触れることになる。多くのユーザーの目に触れるほどダウンロードされる確率は高まる。これは、前提としても説明したとおりだ。

ある動画に対してそうやってトレンドが強化され続け、その動画がランキング上位に居座り、ついには大多数のユーザーがすでに所持することになったとする。すると、今度は、ほとんどのユーザーが来訪してもその動画がダウンロードしなくなる。いわば、ユーザー間でその動画が飽和してしまう。

このダウンローダーのランキングは直近1000回の試行におけるダウンロード回数が指標となっているので、飽和し、ダウンロード数が減った動画はゆっくりとランキングを落としていく。ランキング上位から転落すると、せっかくまだダウンロードしていないユーザーが来訪したとしても、注目されることもダウンロードされることもほとんどなくなってしまう

いわば、ランキングが上がっていく過程にはもともと再生産性があるが、一度飽和状態に達してしまうと、ランキングが下がっていく過程にも再生産性が生まれるのだ。

スプレッドシート内の「downloads-2910」シートは、最多の1461回ダウンロードされたid:2910の動画に関するダウンロードログを抽出したものだが、「その動画が何回目の試行でダウンロードされたか」を示すcreated_at列の値を数えてみると、生成されてから7000-9000回目までの2000試行でのダウンロード数が全体の43パーセントを占めていた。

また、現在のランキング順位を決定しているのはpopularityという値なのだが、これが下限値の0になっていて、なおかつ最後まで削除されなかった動画がダウンロード数上位10個の中に4つも存在している点も、このランキングの趨勢の移り変わりの激しさを示している。
全体で10番目までに入るほど多くダウンロードされている動画が、10万試行時点では100位以内に全くランク入り出来ていない、ということだ。しかも、動画自体は削除されておらず、いずれかのユーザがダウンロードしようとすればできる状態にあるのに、である。

そういえば、筆者はダウンロードするかどうか迷った動画は一旦ブラウザの「お気に入り」に入れておく、といった行動を取ることがあるが、ダウンローダーの上位で見つけた動画をそうしたまますっかり忘れ、数か月経った頃に開いてみると削除されずに残ったまま、しかしランキングにはもう全く登場していない、ということが何度もあった記憶がある。間違えた、仮にこんなサイトがあれば、そういうことも何度もありそうな気がする。
こうした激しい変動は、このシミュレータの中でだけ起こるわけではないと言えそうだ。

ランキング上昇がさらなる上昇を呼び、下降がさらなる下降を呼ぶとすると、ある動画の総ダウンロード数の決定要因の多くを占める要因が「めぐり合わせ」になってもおかしくない

もちろん、多くのユーザーの目に触れればダウンロードされるだけのシコリティがあることは前提としつつ、来訪するユーザの抽選の綾、同時期にランクインしていた動画の人気度の綾、そういったランダム性によって大きく数が変わるということも考えられるのかもしれない。

ユーザにとって効率の良い動画探索スタイルはどんなものか?

続いて、ユーザの最適な動画探索戦略に話を移そう。
ここでは、ユーザが達成したい目的は所持動画の平均シコリティの最大化であると仮定する。
そのため、所持する全動画のシコリティの合計値であるtotal_c_qualityを、全ダウンロード数を示すtotal_downloadで割った数値avgと各パラメータの関係を見ていくことにする。

各ユーザが取る戦略の幅には以下の2つの軸がある。

  • 何位から探索を初め、上下どちらにランキングを辿るか

  • 頻繁に来て少なくダウンロードするか、たまに来て多くダウンロードするか

userシートを見てまず第一に感じることは、恐らく、1位から下向き以外の探索戦略はあまり有効でなさそうであるということだろう。
平均シコリティの順にユーザデータを並べてみると、1位以外のスタート地点を採用しているユーザは647番目まで出てこない。そうしたユーザが全体の一割程度しかいないということを差し引いても、あまり芳しい成績とは言えなさそうだ。
その全体の1割を抽出した「user-abnormal」シートを見ても、その感想は変わらない。
平均シコリティとスタート地点順位の相関係数を求めてみると、-0.8を超える。
かなり強い逆相関があるということで、1位以外からスタートしたユーザだけを抜き出しても、スタート順位が低いほど良質な動画を得られている、ということはまず間違いないと言えそうだ。

また、探索が上向きか下向きかは、あまり探索の良しあしを左右しなかった。
user-abnormal内の上向きに探索を行ったユーザ全体の平均シコリティは0.744….。下向きのユーザは0.737….と、ほとんど誤差とも言えるし、あるいはそりゃ順位が高いほうに探索する方がちょっとよくなるよね、という結果になった。

余談だが、「1位から上向き」、つまり必ず1位のみをダウンロードする、という戦略はもしかすると一考の余地があるかもしれない。
実は、この10万回のシミュレートは実行してデータが揃ってからシミュレータの実装の不備に気づいてやり直す、ということを何度か繰り返しているのだが、今回記事を書く直前の失敗試行の際、そうしたユーザがかなりいい成績を残していた。(2000人中2人だけそうなっていたのだが、一人は平均シコリティで2位、もう一人は9位にランクインしていた。)
もちろん偶然の可能性が高く、確かめるためにはさらなる実験が必要ではあるが、その時のシミュレータに必要な修正は大勢に影響を与えるものではなかった(上述の小数点計算の対応漏れ)ため、これが有効な戦略である可能性はある。


では、来訪頻度の方はどうかと言うと、その値と平均シコリティの値との相関係数は0.07。
この数値は、ここからはほとんど何も言えない、ということを示している。

つまり、高い頻度で少数の動画をダウンロードしようが、たまに来て多数の動画をダウンロードしようが、得られる動画の質に大きな差はない、というわけだ。

ということで、入手する動画の質を高めるためにユーザとしてとれる最高の戦略は以下の通りだ。

1位から順番に動画を探していき、チェックする頻度は多くても少なくてもよい。

実につまらない結論になってしまった。

ランキングが変動に乏しい場合は?

実装失敗

と、いうところで終えてしまうのはあまりにも肩透かしなのでもう少し話を続けよう。

前述のスプレッドシートにまだ触れていない、「user-concrete」というシートが存在する。
このシートは、さっきも少し余談として触れたような失敗シミュレーションによって作成されたユーザのデータなのだが、この時自分が犯した失敗は、「1試行ごとのpopularityの減少幅を過少に設定してしまう」だった。

このシミュレータはランキングの計算の際、毎回過去1000試行分の全ダウンロードデータを取得してそれを動画ごとに集計して…とやるのではなく、1ダウンロードで1増えるpopularityという数値を、1回の試行ごとに0.001×過去1000試行でのダウンロード回数分ずつ差し引いて行くという形式をとっている。減価償却のような挙動だと思ってもらえばいい。

パフォーマンス面を考慮してこういう少々面倒な実装を採用しているのだが、分かりにくいことをやっているがために、この差し引く数値にダウンロード数をかけるのを忘れてしまった。

つまりこのデータは、本来の意図よりもずっと長いスパンでランキング集計を行った場合のデータに近いものとなっている。他にも、ダウンロード数が多いほど優遇されることになっていたりと、かなり意図したものとは異なる挙動になってしまうため、本来であれば没にして公開しないはずのデータである。(また、そもそもユーザ数が5000人いるという違いもある。)

ただ、このデータを例によって平均シコリティ順に並べてみると、少し面白い結果が見えてくる。

明らかに、1位以外の地点からスタートしたユーザが上位に多くランクインしているのだ。

最も平均が高いユーザは27位から上向きに探索したユーザ。その後も上位-中位をスタート地点にするユーザが続き、1位から下向きに探索するユーザが初めて登場するのは実に20番目となる。
全体の1割しかいない特殊ユーザが、上位0.4パーセントを独占しているのだ。

まず間違いなく、何らかの傾向があると見てよいだろう。

集計期間の差がこの違いをもたらした?

直近1000試行を集計対象とする本来の挙動では全くと言っていいほど役に立たなかった戦略が、この誤ったシミュレート結果では華々しい成果を挙げている。
一体この違いはどこから来たのか。
もちろん、そもそも実装のミスがあったバージョンでのシミュレートであるため、バグとバグの相互作用でおかしな結果が出ただけ、という可能性も十分にある。ただ、もしもそうではないとすると、この結果は非常に興味深いものとなる。

この実装のミスは、本来の挙動よりもずっと長いスパンでのランキング集計を行った場合に近い結果となったことが考えられる、というのは上述した。現実的なものとして考えれば、全期間ランキングに近い性質と言えるのではないだろうか。

今回対象としたダウンローダーの実物には全期間ランキングは備わっていない、いや、想定していないが、似たような目的で用いられるサイトがそれを備えているケースもあるだろう。

期間が限定されたランキングでの最適行動は上記のようにつまらない結果になったが、期間を限定しない場合には異なった結果が出る可能性があるのかもしれない。
そして、もしも本当にそうなのであれば、その結果には意義があり、もしかすると利用価値もあるかもしれない。

そういう訳で、一部の仕様を変更して再度10万回のシミュレーションを実行する。
ランキングの集計対象は10万回、つまり全期間
純粋なダウンロード回数のランキングとして再シミュレートだ。

再シミュレートの結果

再シミュレート結果のスプレッドシートを以下のURLで公開している。

movieのシートを見ればよく分かるように、案の定、上位陣がかなり固定化されたランキングになった。しかも、通常のランキング同様、上位になるかどうかを左右する要素は不透明なようだ。

userのシートのほうに目を移すと、平均シコリティ順に並べたとき、1位以外から探索しているユーザがちらほらと目に入ってくる。
上位の顔ぶれが固定化されたランキングにおいては、やはり中途半端な位置から始めるほうが有効な戦略ということになるのだろうか。

確かめるために、2000ユーザー全ての平均シコリティの平均値と、特殊な探索パターンを採用したユーザーのそれを比較する。
前者は0.4067582799。そして後者は、0.4453995603となった。
1割程度ではあるが、これは差があると言っていいのではないだろうか?
全期間ランキングにおいては、「1位から下向き」以外の探索手法を取るほうが質のいい動画に出会える可能性が高いようだ。

では具体的にはどんな探索パターンが最もいい成果を挙げているのだろうか?
user-abnormalシートに目を移すと、まず、来訪頻度の相関係数は-0.1強。これは今回もあまり関係ないようだ。
スタート位置の相関係数は-0.55….。概ね上位の方から始めたほうが成績がよさそうではあるようだが、通常のランキングの-0.8という値と比較するとかなり差がある。
上向きの探索と下向きの探索で平均値を比べると、上向きは0.4670….。下向きは0.4206….と、10パーセントほど上向き探索のほうが成績が良いようだ。
更に今回は、スタート位置の順位帯ごとに平均シコリティを見ていく。
最も高いのは、10-19位で、その数値は0.4853…となった。

もちろん、あまりサンプルサイズが大きくなく、極端な条件での実験であるため、これが確かな結果とは言えない。しかし、この結果から結論を述べるのであれば、

  • 「全期間ランキング」を見る場合には、20位前後から上向きに辿っていくと良質なコンテンツを手に入れやすい

ということになるだろう。


今回は存在しない架空のダウンローダーサイトに働く力学・あるいは生態系について、簡単なシミュレーションを通して考察していった。

もう一度、今回の結果を見て得られた内容をまとめておくと、

  • ランキングの集計期間を問わず、動画のダウンロード数の多寡はその動画の質や削除リスクといったものにあまり影響を受けない

  • 期間の定まったランキングをユーザが探索する場合、順当に1位から下向きに見ていくのがベスト

  • 全期間ランキングなど、上位の固定化が目立つようなランキングを探索する際には、全体の上位10-20%程度の位置から上向きに見ていくのがベスト

ということになった。

結果にどの程度信頼がおけるか、といった部分には大いに疑問符が付くが、ここまで読んでくださった皆様に役立てていただければ幸いだ。

あ、そうだった、実在しないから役立てるとか無理なんでした。間違えました。そんなサイト、僕は知らないです。

いいなと思ったら応援しよう!