RM-BLOG

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

ストレイテナーと確率2

前回の続き(?)で再び「iPhoneシャッフルでストレイテナーを再生」するときの考察をしてみる。
今回は「60分という制限時間内でどのアルバム・曲が一番聴かれる可能性が高いのか?」という点に着目してみたい。
この「60分」という制限時間は前回書いた通り俺の会社への出勤(または帰宅)にかかるDoorToDoorの時間とほぼイコールである。
要するに「1回の出勤においてシャッフルで曲を聴いた場合一番よく聴いているのはどのアルバム・曲か?」というのを調べる。

これは普段何気なく聴いているだけだと実際のところあまり気に留めていないが、
巨視的な視点で見たときには数学における確率の諸法則に従っているはずである。
ここでは、シャッフル再生が完全ランダムな曲順を保証するという前提で、
乱数によりシミュレーションを行うプログラムを作成し、いわゆるモンテカルロ法で結果を評価する。

※ちなみに最新アルバム「Behind The scene」は検証の対象に入っていません


 

 
シミュレーションのプログラムは以下の構造になっている。

(1)引数に「試行回数」を渡す
 今回のシミュレーションにおける「試行」とは、
  ①手持ちのストレイテナー楽曲リストの中から乱数を使って1曲を選択、内部リストに詰め込む
  ②今まで選択した楽曲リストの合計演奏時間が60分を超えていればそこで内部リストの作成を終了
  ③60分を超えていなければ①に戻る
 という流れで行われる。
 これの回数を指定させる。
 当然多ければ多いほど結果の精度はあがるわけだが、その分時間もかかる。
 
(2)内部リストの情報を一時ファイルに書き出す
 (1)で作成した内部リストをローカルディスク上に出力する。
 テキストファイル形式で出力するのだが、
 「YES, SIR」等の楽曲名に","(カンマ)が含まれるため、出力形式はTSVにする。
 後続処理でこれを読み込んで集計する。
 
 ちなみに(2)で切り出してはいるが、実際には(1)の②の後にすぐ実行している。
 というかこれを一括で処理する場合はメモリ上でやりくりすればいいのであって、
 そもそもローカルディスクへの一時ファイル出力など不要だ。
 そういう考え方も当然あるので、最初はメモリ上で一括処理することを考えていたが、
 残念なことに個人パソコンでは豊富なメモリを使ったシミュレーションはできないので、
 面倒だが一時ファイル出力する方法に変更した。
 
(3)集計する
 (2)で作ったファイルを読み込んで、以下3観点の集計を行い、これもローカルディスク上にテキストファイルで出力する。
 (A)アルバム別集計
   アルバム別に、選択された回数を集計する。
 (B)楽曲別集計(シングル・アルバム区別あり)
   楽曲別に、選択された回数を集計する。
   この際、シングルとアルバムには区別をつけておく。
 (C)楽曲別集計(シングル・アルバム区別なし)
   楽曲別に、選択された回数を集計する。
   この際、シングルとアルバムには区別をつけない。
   
 (B)と(C)の詳細は後述する。


「手持ちのストレイテナー楽曲リスト」はiTunesiPhoneミュージック管理画面上で「ストレイテナー」の分を選択して、
テキストファイルに保存したものを使用する。(勝手にTSVになったのでTSVとして読込、使用する)
2014/11/5追記
ちなみに項目定義は以下のようになっている。

No項目名属性コメント

1 曲名 文字列 曲名。これはiTunes管理上のオリジナル曲名。今迄これを使って集計していた。
2 時間 時刻(mm:ssもしくはm:ss) 曲の演奏時間。文字列として読み込んだ後、DateFormatでパースしてDate型にして扱う。
3 アーティスト 文字列 アーティスト名。全部"ストレイテナー"なので今回の検証では使用しない。
余談だがFrom Noon Till Dawnも「feat」以降をとって"ストレイテナー"にしている。
4 アルバム 文字列 アルバム名。これもiTines管理上のもので、作品の位置づけとはイコールではない。シングルならシングル名の「アルバム」になっている。
5 ジャンル 文字列 ジャンル名。今回の検証では使用しない(使用しないが、値としては保持している)
6 レート 文字列 レート数。今回の検証では使用しない(使用しないが、値としては保持している)
7 再生回数 数値 再生回数。今回の検証では使用しない(使用しないが、値としては保持している)

エンコーディングSJISで、改行コードはCRLF。
ヘッダ行なしのTSVファイル。
No.5~7は行によって空文字の可能性がある。(String#splitの返却配列数が行によって異なることもある)
この形式のテキストファイルをjava実行クラスファイルと同階層に「STRAIGHTENER_ALL_MUSIC_LIST_20141008.TXT」というファイル名で保存しておけば、あとはプログラムがいい感じで読み込んでくれる。
ちなみに内部的には、読み込んだ行は「StraightenerMusic」という内部クラスのインスタンスとして保持する。

この後いくつか同シリーズのプログラム検証が発生するが、その中でもこのファイルとその読み込みプログラムは流用し続ける。




「60分を超えたか」の判定は、long型の比較で行う。すなわちミリ秒である。
上述した楽曲リストの「演奏時間」の部分をDateFormatでDate型にパースした後、
Calendar.getTimeZone().getRawOffset()を加算して実際のミリ秒に変換、内部的に加算していく。
それが60分(=1000*60*60=3600000)を超えたら内部リストの作成は終了。

リピートの設定をしていないから、1度選択された曲は次回以降、選ばれることはない。
これは内部的にはList.remove()によって実現する。

個別の仕様として、楽曲に関しては、「内部リスト」作成の際にインスト曲を除外している。
これは実際の出勤・帰宅時における聴き方がそうだからである。
インスト曲が流れたと分かった時点でその曲はSKIPして次の曲を選択している。
インスト曲には対になるオリジナルのNONインストの曲も当然存在しており、
その曲に関してはイントロを聴くだけで判断が付く(例えばMan-like Creatures)。
別に注釈する必要もないのだが、一応書いておくと、これは別に自慢でもなんでもない(テナースレやLIVEを見てるとファンとしては自然に身につくものなんだろうと解釈している)から俺の日常動作の一つとして書いてあるだけに過ぎないと思っていただきたい
イントロ時点で「インストの疑いがある曲」だとわかったら、すぐにポケットの中のiPhoneを取り出して楽曲名を見て、
インストかどうかを判断した後、インストだとわかったらSKIP、という流れである。
よって厳密には、「インストだと判断が着くまでのイントロ数秒」はインスト曲であろうと「聴いた」ことになるのだが、
このあたりは感覚に依存することもあるのでプログラム上は一定して0秒という(聴いてない)ことにして、
次の楽曲選択ルーチンにまわるように実装する。
ただSKIPとはいえ「一度選択された」ので、選択対象の楽曲リストからはremoveされる(次回以降、選ばれることがないようにする)。
てか聴かないんならインスト全部iPhoneから除外しろボケって話ですねすいません。


こうして作成された「内部リスト」が1回の出勤で聴くことになるストレイテナーの楽曲一覧に相当する。
これは(2)の一時ファイルに情報として残るが、
試行回数が多くなるとこの「一時ファイル」自体が異常に膨れ上がるので、あまり見ることはないだろう。

集計のKEYはアルバム名、または楽曲名を表すString型の変数になる。
これに対して選択された回数がいくつかというInteger型オブジェクトを対にして持つHashMapが(A)~(C)用に3つ存在している形になる。

最終的に(3)で出力されたファイルの中身を確認してシミュレーションの結果を評価する形になる。
実際にプログラムを実行する前に、結果予想をしてみようと思う。



まずはアルバムの方の予想から。

とはいっても、「アルバム」という単位でみると、
普通に考えて”収録曲の多いアルバムがもっとも聴かれやすい”というのは簡単に予想できる。
⇒なお、この「アルバム」というのは検証の都合上、あくまでiTunesでの管理上の括りであって、
 必ずしもオリジナルアルバム、ベストアルバムといった作品の位置づけとイコールではない。
 例えばFrom Noon Till Dawnはシングルとして発売されているが「From Noon Till Dawn」という名前の「アルバム」で管理されている。
 この点において、こと「アルバム」という単位での確率検証では、シングルは当然不利になる(聴く機会が実際のアルバムに比べて極端に少なくなる)ことも容易に予想できる。

手持ちのストレイテナー全曲をアルバムの括りで集計し、収録曲の多い順に3位まで並べると以下の通りとなる。

順位アルバム名収録曲数(全曲中の構成比)備考・コメント等

1位 Early Years 22曲(8.59%) インディーズ時代のベスト版。公式には載ってないから検証対象外とすべきという意見も俺の中ではある…
といいつつも今回は検証の対象に含めている。曲数は多いが1曲1曲が短いものが多い。ちなみに収録時間でいっても3位。
2位 21st CENTURY ROCK BAND 18曲(7.03%) 公式ベスト版。何気に18曲も入っていたのか。そんなに入ってるイメージはなかった。
余談だが、全曲別途所有しているので実は通しで聴いたことは一度もない。どっちかというとDVDの方に意味を求めて購入したのだった。
3位 SOFT 16曲(6.25%) アコースティック版。STOUTと違って4人編成になってからの曲も含んでアレンジしてあるから曲数が多い。
CREATURESツアーの前後?にひそかにやってたアコースティックライブからの収録らしくて曲によっては最後のフェードアウト部分に観客の拍手が入っている。
SAD CODEが入ってないのは「やっちまった系」だ。

「全曲中の構成比」とは、俺のiPhoneにあるストレイテナー257曲の中でそのアルバムが占める割合のこと。
Early Yearsなら22/257で計算されている。

ちなみに、SOFTに関しては、SOFT購入者用の初回特典で公式HPからDLできた2曲(奇跡の街とネクサス)も持っているが、
これはアルバムの括り(名前)を"「SOFT」初回特典"にしているので、上のSOFTの括りからは除外されている。
逆に言えば"「SOFT」初回特典"という2曲だけはいったアルバムとして検証対象になっている。
同じようなケースで、NexusのDVDに付属していたBonus Discも、インポート直後から何もしていないので、
オリジナルアルバムのNexusとは別物で集計されることになる。

シミュレーションの結果も、何万回と行えば、その確率分布はこの「構成比」に近づくはずであるが、
毎日行きと帰りにストレイテナーをシャッフルで聴き続けている俺の個人的な感覚でいうと、
Early Yearsをそれほど聴いているイメージはなく、
一方でSOFTの方はよく聴いているイメージがある。
また、21st CENTURY ROCK BANDはベスト版という都合上、
収録されている曲は必ず別のアルバムなりシングルに収録されているから、
その曲を聴いても21st CENTURY ROCK BANDのものかどうか(音だけでは)判別がつかず、
やはりこれもまた「そんなに聴いてるっけ?」という感覚が強い。

はたしてシミュレーションの結果と一致するだろうか?



続いてシングルである。

シングルについては、アルバム程の偏りはないにせよ、同じ曲をシングルとアルバムで両方もっているものもあるので、
これらをまとめると偏りが出てくるものがある。
つまり、アルバムにしか入ってない曲や、シングルのカップリングにしか登場しない曲などは、当然確率的に聴く機会が少なくなる。

ただ、こうして集計してしまうと同一楽曲の再生回数の内訳がわからなくなるので、
収録アルバムまで含めた区別をつけた形で別途集計も行う。
例えば「CLONE」が100回再生されたとしても、
シングルのCLONEがn回、CREATURESのCLONEがm回、ベスト版のCLONEがl回だったとして、
n、m、lの内訳がわからない。
この内訳を、「CLONE100回」とは別に集計しておく必要がある、ということである。

なお、「シングル・アルバムの区別なく集計」といっても、実際にはプログラムでは限度があり、
また一方で「(区別をつけずに)一緒に集計してしまっていいのか」という括りのものもある。
この区別はプログラムによる集計上では基本的に楽曲名でしか行わないため、このあたりのジレンマが生まれてしまう。

例えばMelodic Stormだが、
シングルでは"Melodic Storm"だが、アルバム(Dear Deadman)収録版では"Melodic Storm -DEAR EDIT-"になっていて、
これだけ見ると「別の曲」になってしまうが、実際にはイントロがちょっと違うだけでほぼ同じである。
「~EDIT」には、曲名の後部に"-"等のハイフンや長音が入っているパターン(Melodic Storm等)もあれば、
"奇跡の街 (RADIO FREAK EDIT)"(LOST WORLD'S ANTHOLOGY収録)のように"("で区別がつけられているものもある。
要するに別バージョンの同楽曲との、曲名上での区別の付け方が一定ではないため、プログラムでその判定をいれるのにも限度がある、ということである。

その逆に、"REBIRTH"は、TITLE収録版でもSOFT収録版でもこの文字列なので「同じ曲」とみなされるが、
実際には原曲とアコースティックアレンジで大分異なる。(SOFTに入ってる曲の対には大体同じことが言える)
これは集計のKEYにアルバム名までいれることで区別が付けられるはずだが、
それをすると今度は上述した「内訳の集計」との区別がつけられなくなる。
「おもにSOFTの収録曲ではこのようなことが懸念される」ということであれば
「シングル・アルバムの区別なしで集計する対象の中でも、SOFTだけはアルバムまで入れて集計」とすれば回避可能だが、
別にSOFTに限った話じゃない(Early YearsとROCK END ROLLでは同じ「ROCKSTEADY」が存在する)から一般的な対応として正しいかは疑問である。
⇒自分で書いといてなんだが、これは少しSE的な言い回しになっている気がする。
 現状把握できるだけのパターンに対する実装は可能であるはずだが、
 それを("それすら")しないのは、将来的に別パターンになったときに対処することが出来ず、
 最終的にもめる要因の一つになるからである。
 厳密にはデータ発生元との仕様の詰めと関係者間での合意形成が必要だが、
 そんなのは仕事の話しであってこれは単なる個人的な趣味なので要するに「面倒だから」で行きつくのである


なお個人的な感覚では、どうもCLONEをよく聴くような気がする。
CLONEは、シングル・CREATURES・ベストの3つに収録されていて、
その意味だと他の、アルバムにしか収録されていない曲などに比べて選択確率は高い傾向にあるのは確かだろう。
シミュレーション結果にもそれが現れるだろうか?



試行回数は多いほどいいが、あまりに長い時間実行し続けるのも嫌なので、とりあえず試行回数10万回にてシミュレーション。
結果は以下の通りとなる。
(結果が長いので途中省略している)

(A)アルバム別集計

アルバム選択回数(構成比)

Early Years 135132 (9.160%)
21st CENTURY ROCK BAND 107653 (7.297%)
SOFT 96252 (6.524%)
Melodic Storm 12053 (0.817%)
YOU and I / 羊の群れは丘を登る 12012 (0.814%)
「SOFT」初回特典 11927 (0.808%)
ASIAN KUNG-FU GENERATION presents NANO-MUGEN COMPILATION 2014 5976 (0.405%)



(B)楽曲別集計(シングル・アルバム区別あり)

曲名(収録アルバム名)選択回数

EAGLE SHARK PANTHER(Early Years) 6349
MOTIONS(ROCK END ROLL) 6305
プロローグ(STRAIGHTENER) 6272
I'm O,K(Early Years) 6270
瞬きをしない猫(CREATURES) 6256
UNDER ATTACK(Early Years) 6253
TRAVELING GARGOYLE(LOST WORLD'S ANTHOLOGY) 6252
MOUNT(Early Years) 6251
NON TITLE(Early Years) 6247
SING -LIVE-(SIX DAY WONDER) 6237
Toneless Twilight(CREATURES) 5827
REST(LINEAR) 5825
The World Record(冬の太陽 / The World Record) 5824
Sad Code [Live](Nexus Tour Final [Bonus Disc]) 5815
Sad Code(Dear Deadman) 5778
シンクロ(21st CENTURY ROCK BAND) 5759
ネクサス(Nexus) 5598
MARCH(LINEAR) 5576
LIVE TRACKS from 'Super Magical Illusion Show'(冬の太陽 / The World Record) 5181
LIVE TRACKS from '21st CENTURY ROCK BAND TOUR 2013'(Super Magical Illusion) 4719



(C)楽曲別集計(シングル・アルバム区別なし)

曲名選択回数

SIX DAY WONDER 24091
ROCKSTEADY 18458
TRAVELING GARGOYLE 18336
REMINDER 18166
MAN-LIKE CREATURES 18127
VANDALISM -PROTOTYPE- 18073
羊の群れは丘を登る 18067
LITTLE MISS WEEKEND 17865
TRAIN 17847
TONELESS TWILIGHT 17681
BLACK HOLE 5838
DARK BLUE DAY 5837
REST 5825
THE WORLD RECORD 5824
SAD CODE [LIVE] 5815
SAD CODE 5778
ネクサス 5598
MARCH 5576
LIVE TRACKS FROM 'SUPER MAGICAL ILLUSION SHOW' 5181
LIVE TRACKS FROM '21ST CENTURY ROCK BAND TOUR 2013' 4719



■(A)に関しては概ね予想通り、やはり「収録楽曲数の多いアルバム」が上位に連なる形になった。
 注目すべきは「Melodic Storm」と「YOU and I / 羊の群れは丘を登る」である。
 「Melodic Storm」はカップリングのDIVEとあわせても2曲しかないが、
 「YOU and I / 羊の群れは丘を登る」は単純な収録楽曲数でいうと4曲である。
 にも関わらず「YOU and I / 羊の群れは丘を登る」の方が「Melodic Storm」より下位であるのは、
 「YOU and I / 羊の群れは丘を登る」4曲のうち2曲がインストであるため、実質2曲になったということであろう。
 ”インストのぞく”ロジックが正常動作しているように見えることが結果から見える。
■(B)は選択回数の最大(6349)と最小(4719)でそれほど大きな開きがない。
 収録アルバムまで含めて区別をつけたことでどの曲も同じように選択されたことの表れといえそうである。
 ただ、1位の「EAGLE SHARK PANTHER(Early Years)」の演奏時間が1:11なのに対し、
 最下位の「LIVE TRACKS from '21st CENTURY ROCK BAND TOUR 2013'(Super Magical Illusion)」の演奏時間は18:10で、
 演奏時間に実に20倍近い開きがある。
 これは今回の検証において「60分」という制限時間が存在していたことにより、
 内部リスト作成中の残り時間の関係でどうしても選択されづらくなった曲があったことによるだろう。
 よく見ると(B)の最下位付近は演奏時間が長い曲が多い。
 その逆に(B)の上位は演奏時間が短い曲が多い。
 「60分」という縛りの中ではどうしても短い曲が選ばれやすい傾向になることがわかる。
■(C)は個人的な予想と少し外れていて、ほぼダントツといっていいくらいSIX DAY WONDERが堂々の1位。
 よく考えると、シングル・LINEAR・SOFT・ベストと、(SOFTだけ毛色が少し違うが)合計4曲も存在していて、
 手持ちのストレイテナーの中では一番存在確率が高いのがSIX DAY WONDERだったのだ。
 2位以下の、選択回数17000~18000周辺の曲は、いずれも次点で存在箇所3つ。
 あとは(B)にも表れていた時間の関係で、やはり演奏時間が短い曲が選ばれやすい傾向にあるようだ。
 感覚では感じていたCLONEは11位に位置しており、それほどシミュレーション結果とのずれはないように見える。
■余談だが、「試行回数10万回」といったのにも関わらず、「選択回数」の合計数が10万を軽く超えてしまっている。
 例えばアルバム別集計1位のEarly Yearsは135132回も選択されたことになっている。
 これは、集計の元データが試行回数ではなく「内部リスト」だからだ。
 試行1回につき、(60分を超えない範囲で)複数の楽曲で構成された「内部リスト」が紐づく。
 この「内部リスト」の各要素を全件走査して集計しているから、必然的に10万を大きく超えてしまうのだ。
 逆に言うと選択回数の合計数を試行回数で割れば、1試行における平均的な内部リストの曲数がわかる。
 今回の10万回試行での合計選択回数は1475278であった。
 よって1475278÷100000=14.75…となり、1試行における平均的な内部リストは14~15曲前後になる。
 言い換えれば、1回の出勤や帰宅時(60分)では、ストレイテナーの曲を大体14~15曲くらい聴いているということだ。
 今回はインストを除いたが、インストを含めてもこの数は変わらないだろう。
 ちなみに手持ちのストレイテナー257曲の演奏時間の平均は3:58で、これに先の計算結果14.75…をかけると58:31になり、
 (あくまで統計的な平均の観点からでは)60分以内の曲選定が正しく行われていることが確認できる。



以上の通りになったわけだが、個人的に意外だったのは(C)の結果である。
あくまで確率的なものだが、SIX DAY WONDERをよく聴いている印象がない。
ただ、シミュレーションの結果や実際に重複して所持している状態を見る限りでも、
もっとも確率が高いのは確かなようである。
意識してないだけで、実際にはよく聴いているのだろう。
にも関わらずCLONEの方が印象に残るのは、曲調などが影響しているのだろうか?
このあたりまで来ると心理学的な要素が含まれそうなので最早わからない。
CLONEが選択される確率は決して低くはないし、今までたまたまCLONEだけに当たっていたのかもしれない。

まあ、しょせん机上の計算結果だから、どこまで現実世界に応用できるかというのも考え出すときりがない。
実際には電車の遅延具合や何やらで60分というのもずれてくる(会社や家に着いて初めて「何分かかった」という結果からしか厳密な値はわからない)し、
電車中に電話が入ったから、音楽停めて最寄の駅で降りて電話する、というようなこともまれにある。
ただ趣味にしてはなかなか面白い考察が出来たので良しとしよう。