広告/統計/アニメ/映画 等に関するブログ

広告/統計/アニメ/映画 等に関するブログ

TVCMが昨対比を何%押し上げたか?をGoogle Spread Sheet やEXCELで(敢えて乱暴に)分析する

「テレビCMやったけどさ、どんだけ効果があったのよ?」と質問されたときにどう回答するのが適切だろうか。

データ分析ができる人にとってはデータさえ揃えば難しい話ではない。投下したTVCMのGRPを説明変数として売上なり申込件数を目的変数とした予測モデルを作れば良い。しかし、データ分析の素養がない人に予測モデルの式本体を見せたところでチンプンカンプンだろうし、報告する人が普通の人だった場合、RやPythonモデリングしろ、というわけにもいかない。

例えば、緊急事態宣言下の4月にオンライン教材を売っていた企業が、TVCMを放映してみたエリアと放映してみなかったエリアでA/Bテストしていたとしよう。1 その場合、どのようなデータ分析をすればよいか考えてみたい

モデルの検討

報告すべき情報、わかりたい情報を決める

売上を予測するモデルを作ることも、TVCM効果の有無を検定する方法もあるだろう。しかし管理職以上は統計学もデータ分析の素養はないし、効果は”量的に”把握をしたいだろう。そして今回のケースは、「それって緊急事態宣言の影響もあるんじゃない?」とか「そもそも今年がオンライン学習元年でよそも伸びてない?」と指摘されるだろうから、それとも区別したい。

そこで、 昨対比で申込件数が何%あがったか を求めることにした。

取得できるデータを確認する

今回入手できる情報は、"各県で緊急事態宣言があったかどうか"と"TVCMを放映したかどうか" といういずれもゼロと1の数値。そして、本年度の申込件数と昨年度の前年同期の申込件数だ。2

f:id:yyhhyy:20200815212637j:plain

手法を決める

今回はEXCELGoogle Spread Sheetで可能な作業として、「線形の重回帰分析」とした。

  • 目的変数:申込件数の昨対比(本年度の申込件数/昨年度の申込件数*100:→%にした)
  • 説明変数:「TVCM放映の有無」と「緊急事態宣言の有無」
  • 切片:あり

これはハッキリ言って嘘である。

「y = a1x1 + a2x2 +b」といったお互いに独立の変数が線形で関係している、という式を検討しているわけだが、昨対比などというものは、

  • TVCMも緊急事態宣言もあった場合:a1 * a2倍(%)
  • TVCMを放映し緊急事態宣言がなかった場合:a1倍(%)
  • TVCM放映がなく緊急事態宣言はあった場合:a2倍(%)
  • TVCM放映がなく緊急事態宣言もなかった場合:1倍(100%)

というわけだから、2つの変数が「足し算」になっているはずがない。

とはいえ、掛け算を足し算に戻すには、対数を取らなければならないし、対数変換についてこれる文系役員などそうそう居ない。3 かといって再び「昨対比」を避けてしまうと、

「本年度の申込件数/一定人口辺り=昨年度の申込件数/一定人口辺り + TVCMが加えてくれる件数 + 緊急事態宣言が加えてくれる件数 + その他の要因」

という効果の量的なイメージが判断し辛いものが出来上がる4

だが、この手法であれば、TVCMと緊急事態宣言の効果は一応別々で出てくるし、EXCELGoogle Spread Sheetで結果が出てくるのだから、よくわからない人でも見様見真似で算出することができる。

分析の実際

Google Spread Sheetの作業

  • LINEST(目的変数の列,説明変数の列群,定数項の有無,出力結果の詳細の有無)

をシートに入力する

今回の場合は、

  • 目的変数:昨対比
  • 説明変数の列群:TVCM放映の有無 と 緊急事態宣言の有無

f:id:yyhhyy:20200815222551j:plain

となる。

結果の見方

このような出力が出てくる。重要なところに色付けをした。

f:id:yyhhyy:20200815222648j:plain

99.3 は切片に当たる。昨対比を%表記にしたので切片は本来100であるべきだが少しずれている。

31.3は一つめの変数「TVCM放映の有無」に掛かる係数だ。「TVCM放映は、約31%押し上げる効果があった」と読みとける

11.7は二つ目の変数「緊急事態宣言の有無」に掛かる係数で、「緊急事態宣言があったエリアでは、約12%押し上げることになった」と読める。

もう1箇所網掛けした0.994は、これらの変数2つによって目的変数(の分散)を約99%は説明できている、と解釈する。

なお、Google Spread Sheet のLINEST関数の出力はかなり直感に反している。1つ目の変数の係数→2つ目の変数の係数と左から並んで欲しいものだが、なぜか右から、切片→1つ目の変数→2つ目の変数の係数と並ぶ。わりと面倒だ。

その他の出力の値に興味がある人は公式ドキュメントを参照してほしい

support.google.com

EXCELの場合

EXCELにはもう少しグラフィカルインターフェイスな機能がある。EXCELの場合は丁寧にまとめている人が多いので割愛する。

sigma-eye.com

今回のデータを作った方法

EXCELで乱数を発生させた。

  • TVCM放映の有無と緊急事態宣言の有無:RANDBETWEEN(0,1)
    • ゼロと1の乱数を発生させてくれる。
  • 2019年度の申込件数:RANDBETWEEN(100,150)
    • 使用する関数は同じ。数値の上下を変えた

効果の数値設定と目的変数の作成

TVCMの効果を1.3倍、緊急事態宣言の効果を1.1倍として、

  • TVCM効果:IF(TVCM放映の有無=1,1.3,1)
    • 放映があった場合は1.3、なければ1を掛け算したいため
  • 緊急事態宣言効果:IF(緊急事態宣言の有無=1,1.1,1)
    • 放映があった場合は1.1、なければ1を掛け算したいため

という新たな変数を作り

  • 2020年度の申込件数:ROUND(2019年度申込件数TVCM放映効果緊急事態宣言効果+RANDBETWEEN(-2,2),0)
    • 昨年度の申込件数にTVCM放映効果と緊急事態宣言効果を乗算、更に2件程度は上下にブレるように乱数を加えた上で、最後に小数点以下四捨五入している

を求めている。こんな感じだ。因みにリロードしてしまったので上で貼り付けた数値と乱数がまた更新されている。

f:id:yyhhyy:20200815225134j:plain

先程はかなり乱暴に線形の重回帰分析モデルにしてしまったのだが、31%や12%は上振れしているものの、そこまで真の値からは離れていない。統計学者やデータサイエンティストからすれば余りにも気持ち悪い話かもしれないが、"偉い人に普通の人が効果を説明する" 行為を日常的に行うことがデータドリブン経営なのだということとなると、この程度のいい加減さを我慢しないといつまでも組織として根付くことはないのではないだろうか。この先、データ分析の教養がある学生が社会人になってくれるようになれば話はべつかもしれないが、その間、今の20代~60代の文系社会人が何もしなくて良いということにもならないだろう。5


  1. 極めて当たり前だが、放映しなかったエリアが存在しなければ効果検証できない。そして多くの日本企業のマーケティング・プロモーションは、事前の効果検証もせずに一発で一か八かの勝負をするので、"TVCMを放映しないエリア"なんてものが存在しないことの方が寧ろ多い。この問題の根本原因はデータ分析リテラシーの欠如ではなく、「スケジュールに余裕がなくなるレベルの組織の意思決定の遅さ」「A/Bテストによって発生するエリア別の不公平を許容できないビジネスモデルや取引先との力関係」などの方だ。

  2. 簡単のため各エリアの人口は同じだとしている。実際には人口○○人辺りや、ターゲット○○人辺りなどにすればよい。

  3. 現実には多項ロジスティック回帰分析をしたいことも多いし、対数変換を避けてでも嘘をつくべきかは非常に悩ましい。

  4. 本当を言うとStanを使ってシミュレーションしてしまえば、効果量を設定して推定値を出せば良い。データ分析がわかる自分が毎回計算してあげれば良い、ということであればこれで構わないし、自分が効果の程を把握したいだけならそれで充分だ。だが組織としてそれで良いのか?というとそうではないだろう。

  5. “文系に統計学の教養がない"という前提も実は嘘だ。心理学・社会学では日常的に使うし、最近は経済学部でも因果推論という名称で社会学的アプローチを参照し始めている。更には文学部でも文献をデータ分析して文書の著者を推定するなど統計学をフル活用する分野もある。とはいえ、理系でデータ分析を使わないのは建築学部のデザイン系だとかかなり限られていると思うので、総じて文系がビジネスパーソンとしての教養不足で苦しむことになると思う。

『School Days』と『プリンセス・プリンセス』に泣いてしまう。

有名な『School Days』を観たことがないというのは教養不足ではないかと思って視聴した。想像以上に感動的な話で泣けてしまい、ついつい同じ監督(元永慶太郎)の作品を見始めて『プリンセス・プリンセス』にもはまってしまった。どちらもあまりにも良かったのでもっと観られて欲しい。雑多なメモで恐縮だが、良さそうだと思ったら是非視聴して欲しい。ドコモ・アニメストアでも配信中だ。

School Daysの魅力

ちょっとした掛け違いが悲しみを増大させるストーリー

本作(アニメ版)は、主人公が一目惚れした同級生と恋仲になるように隣の席の異性がサポートしてくれるところから始まる。だが想像の通りその手助けしてくれる異性も実は主人公に気がある、という青春小説のような甘酸っぱい設定だ。友情と社会的正義と恋愛と様々な心情が葛藤していくのだが、その組合せが登場人物が増える度に更に複雑になっていく。

最初はちょっとしたことだったのにそのすれ違いが引き返せないほど大きくなっていく。そして、それに全くもって誠実に対応しない主人公の子どものような我儘と残酷さに、益々ヒロイン達が不憫になっていく。話数を追うごとに悲しみと怒りが溜まっていく。一体、どこから彼らは間違えてしまったのか?どうしたらみんなが幸せになることができたのか?

テンポの良い演出

授業中に隣の席同士でノートの端っこにメモ書きをして会話するシーンが登場する。その画面の切り替わりのテンポが実に心地よい。テンポよく会話が進んでいつか片方が声を出してしまう、というのがお決まりなのだが、とにかく観ていて気持ちが良い。この演出で本作にハマってしまったと言っても過言ではない。

他にも文化祭の後のダンスシーンの美しさや、顔のドアップなど、アニメーションだからこそ生きる演出も多くて、観ていて飽きが来ない。

美しいエンディング楽曲

エンディングがほぼ毎回変わり、幾つかの曲がローテーションされている。映画でもドラマでも同じだがエンディング楽曲というのは作品の余韻を楽しむ時間だ。人によっては飛ばしてしまうかもしれない。しかし一度余韻を味わう楽しみを憶えてしまったら逃げられないだろう。毎週曲が違うだけでこうも深みが増すのか!というのを是非味わって欲しい。

プリンセス・プリンセス

前向きに成長していく友情の物語

3人のイケメンがそれぞれに悩みを抱えながらも与えられたミッション(女装して部活動を応援する)をこなす。(もう一人、生徒会のサポートをするという別のキャラもいる)。一人の力で改心して成長していったり、誰か先生役の人に指導されるのではない。先輩は「お前たちならできる」とミッションを下すだけで、友達からの激励で勇気を貰って心の弱さを克服していくところが実に熱く感動的だ。

最近のアニメには異世界に転生して主人公1人だけが激励役というパターンも多いのだが、それぞれがちゃんとキャラが立っているのが素晴らしいし、とってつけたような表面的な激励でもけんか腰の言葉でもない。優しさに溢れる応援で涙が出てしまう

メリハリのある演出

そもそも監督が「School Days」と同じだから観たのだが、本作でも演出が効いている。急に二頭身になったり背景がイメージ画像に変わったりというメリハリが良い。深刻な場面とギャグの場面の切り替えが心地よい。

特に題1話で、女装した生徒が空から舞い降りて来るシーンの美しさは、少女漫画でよく出てくる登場の仕方を美しくアニメーションにした印象だ。第1話からの引き込み力が凄い。

美しいBGM

クラシックを崩したBGMが多用されていて美しさを倍増させている。

URL

School Days Blu-ray BOX

School Days Blu-ray BOX

  • 発売日: 2013/03/22
  • メディア: Blu-ray

School Days オリジナルサウンドトラック

School Days オリジナルサウンドトラック

  • アーティスト:TVサントラ
  • 発売日: 2007/09/26
  • メディア: CD

「ブランディング」という言葉の解像度を上げる

ブランディング という言葉はマーケティングを支援する会社にとっては非常に都合の良い言葉だが、金を払う立場からすると余りにも抽象的な言葉で掴みどころがない。もう1段階解像度を上げてこの言葉を理解するとどうなるだろうか?

ブランディング」という言葉の使用実態

例えば、こちらの本では、バズワード的に流行った手法の賞味期限が切れたときに 「ブランディング」という言葉使用されると指摘している。

この山口さんの指摘は、広告業界に居る自分からしても実感に近い印象だ。より自分の感覚に近い言葉にすると

上手く効果を数値化して説明できないときに「ブランディング」という言葉に逃げるマーケティング支援会社の人が居る という印象だ。彼らにとっては、ブランディングという言葉の共通理解が事業会社と支援会社の間に存在していなくても構わない。施策の意図がブランディングだと思ってもらうことが重要ではなく、幾らの売上貢献になるか説明できないことの言い訳をしているだけだからだ。

ブランディング」の定義は探るべきではない

この言葉の定義を探すのは恐らく不毛である。「自分の飼育動物を区別するための焼印ですよね?」という理解であれば、”コピーライト”や”ロゴマーク”ということで事足りるし、「差別化して高い収益率を維持する、超過収益みたいなものですよね?」という理解であれば、”差別化戦略”、”セグメンテーションとターゲティングとポジショニング”ということで事足りる。「ブランディングってなんですか?」と質問しても十人十色の答えが返ってくるだろう。一般的な理解は、ウィキペディアでも参照いただきたい。

ブランディング - Wikipedia

ブランディングとは?」を 誰かと不毛に議論することよりも、目の前に解決すべき課題がある。マーケティング支援会社からの提案時に「ブランディングすべきです。そのため○ま○の施策を提案します!」と言われたときに、 このマーケティング支援会社が煙に巻こうとして「ブランディング」と言っているが、本当は何を言語化したかったんだ? と探ることの方が重要だ。

メインの「ブランディング」の用途は「イメージアップ」

恐らくマーケティング支援会社、中でも広告代理店が「ブランディング」という言葉を使うとき、その実態はただの「イメージアップ」ということだ。具体的な機能やメリットを説明するのではなく、何となくのカッコいい映像や美しいタレントとイケているキャッチコピーが載ったコマーシャルフィルムの目的として提示される場合はこれだ。

誰かがダンスをしているだけのCMとか、具体的な効果効能や顧客メリットを提示しない類の広告を思い浮かべて欲しい。上司や役員に説明するとき「うーん、カッコいいのはわかるんだけどさ」と言われかねない。確かに仕上がりは良さそうだし自分もやってみたいが、本当に意味があるのかはよくわからない、そういうタイプの企画だ。

「イメージアップ」が効く理由

広告代理店の営業とクリエイターは比較的不勉強だ。なぜ効果効能を謳わない「イメージアップ」のコマーシャルフィルムを放映する意味があるのか、ちゃんと説明してくれることはないだろう。「商品CMとブランディングCMの効果の違いを数値化してくれないか?例えば、商品CMは毎度キャンペーン的に出稿しないといけないが、ブランディングをしておくと数年後も効くとかさ」という依頼を何度受けたことかわからない。残念ながら勉強熱心な担当者でも数値化はできない。

なぜならイメージアップが効くのは「単純接触効果(ザイアンス効果)」だからだ。大学生に異性の写真を見せて好みを質問するとき、こっそり何度も同じクラスに主席させていた異性(直接の会話もない)に対しては好感度が上がったという例がよくでてくる。具体的なメリットを提示しなくても、何度も目にして印象に残すことさえできれば好感度が上がるということだ。身も蓋もない理論だが、マスプロモーションは全てこの効果を基礎にしていて、メディアプランニングの基礎はいかにリーチ&フリークエンシーを効率よく獲得するかの線形計画問題のようなものだ。

単純接触効果 - Wikipedia

さて、「イメージアップ」が目的の場合、その根拠はコマーシャルフィルムの中身というよりも、その映像が一体何人に何回接触させられるのか、ということの方が寧ろ重要だ。充分な予算を投下できたり、充分な期間同じ映像を流し続けたりすることができるなら考えても良い施策だ

差別化戦略」の場合

ブランディングが目的です”と言うときのもう一つのパターンが、「差別化戦略」だ。”競合との違いを明確にして新しいパーセプションを獲得しましょう”というものだ。象徴的なのはハズキルーペのコマーシャルフィルムだろう。

xtrend.nikkei.com

著名タレントも使っているし、インパクトのある映像でもあるが、”小さい字が多すぎて辛い”や”座っても割れない”といった顧客の課題を解決できることを明示している。

実はアップルのコマーシャルも同じだ。薄くて軽い(軽そうに見えるだけだが)マックブックエアや、カメラが高性能なスマートフォンなど、ただカッコいいだけの映像ではないタイプのコマーシャルフィルムが案外多いことに気がつくだろう。

差別化戦略」が効く理由

こちらの場合は「セグメンテーションとターゲティングとポジショニング(STP)」や「ユニークセリングプロポジション(USP)」という言葉も同時に使われるが、

  1. 顧客の解決したい課題は金を払いたいだけの大きなニーズか?(ターゲットのインサイトを掴んでいるか?)
  2. 商品が解決できる課題は競合では実現できない内容か?或いは圧倒的に安く提供できるか?

などが重要になる。

コマーシャルフィルムで言及している課題解決が顧客が喉から手が出るほど欲しいものであるかどうか?の検証が必要だ。何ならこれはマーケティング支援会社の仕事というより事業会社のマーケターの仕事だろう。

一方で、2つ目の”競合が真似できない”という点については、残念ながらコモディティなこともあるだろう。その場合は、「シェアオブボイス」が重要になる。結局は単純接触効果を競合と競い合うということなのだが、競合よりも多い出稿量を出し続けて、「~といえば○○社」という記憶を残して貰うのだ。競合との出稿量を競う指標を「シェアオブボイス」という。故に、USPが無い場合は、これまた、出稿量を競合より多くするだけの金が必要な施策ということになる。

ブランディング」は紐解くと「ターゲットインサイト」と「媒体費にかけられる金の量」

ブランディング」という言葉からはついつい”いかにかっこよく見えているか”が重要になるかのように思えるかもしれない。実際、”印象に残す”・”記憶に残す”という意味ではそれも重要だ。だが、カッコいい・カッコよくないを議論する前に、”大量に出稿するお金が用意できるのかどう”或いは”顧客の課題を理解しているかどうか”なども平行して検討できていないと、高い制作費を払っただけで終わってしまいかねない。

ワークマンの「高機能・低価格」に至る構造の図解

最近読んだこの本は、とてもよく取材された良い本でした。

本書で学んだ詳しいことを記載すると本が売れなくなってしまうので、読後に整理した図解を貼るにとどめます。

f:id:yyhhyy:20200723200330p:plain
ワークマンにおける「より良いものを、より安く」の仕組み

書籍のタイトルはキャッチーにするために、あたかも小手先の対応で売れ行きを伸ばしたかのようにミスリードしていますが、中身を読むともっと深いことが分かります。

「より良いものを、より安く」とは汎ゆる業界で言われていることだと思いますが、実現することは容易ではありません。多くの大企業は研究開発と言っても外部のサプライヤーと共同開発している筈ですので、如何に協力関係を結べるか?というマネジメントやコントロールの技術(俗な言い方をすると”ソフトスキル”)が重要になってきます。

人間は群れをなして知恵を伝承することで他の生物に勝ってきた生物ですので、如何に群れ全体の効率化をはかることができるか?というスキルが、個人のスキルアップより遥かに重要です。

コード進行のルールに則ってコード案をランダムに出力するプログラム

作曲の本を勉強していると突如として「さぁ自由に作ってみよう!」と高度な創造力を要求されることがあります。

創造力の乏しい自分にとっては「コード進行のルールに則ってコードを作ってみよう」という行為もなかなか難しいのです。(自由というのは扱いにくいです)

そこで、プログラムで楽をすることにしました

採用するコード進行のルールについて

作曲理論については何度もトライをして諦めて来ました。今はまずこちらの本で紹介されている「最もオーソドックスなルール」を採用することにしました。

  • 主要コード(スリーコード)
  • 代理コード
    • 同じ役割の主要コードの直前には置かない
    • トニック:Em,Am→F,G,Em,Am,Dm ※Cには行かない
    • サブドミナント:Dm→G,C,Em,Am

一つずつ入力値に対して次のコードを排出する

特定のリストからランダムにリストの要素を排出するにはrandom.choiceを使う

note.nkmk.me

import random
def code_maker (x):
    if x == "C":
        x2 = random.choice(["C","F","G","Em","Am","Dm"])
    if x == "F" or x == "Dm":
        x2 = random.choice(["G","C","Em","Am"])
    if x == "G":
        x2 = random.choice(["C","Em","Am"])
    if x == "Em" or x == "Am":
        x2 = random.choice(["F","G","Em","Am","Dm"])
    else:
        x2 = "入力エラー"
    return x2
code_maker(x="Am")
'G'

これを繰り返していくことは可能なものの、メモしていくのは面倒です。

ランダムな結果を繋げたものを排出したい

リストに要素を加えるappendを使った関数に書き変えます。

import random

最初は「C」から始める想定とする(外でも良い)

list_input = ["C"]
list_output = ["C"]
def code_list_maker (x,output):
    if x == "C":
        x2 = random.choice(["C","F","G","Em","Am","Dm"])
        output.append(x2)
    if x == "F" or x == "Dm":
        x2 = random.choice(["G","C","Em","Am"])
        output.append(x2)
    if x == "G":
        x2 = random.choice(["C","Em","Am"])
        output.append(x2)
    if x == "Em" or x == "Am":
        x2 = random.choice(["F","G","Em","Am","Dm"])
        output.append(x2)

これを繰り返しできるようにする。

qiita.com

for i in range(0,6):
    code_list_maker(x=list_input[0],output=list_output)
print(list_output)
['C', 'C', 'Am', 'Em', 'C', 'G', 'G']

ファイルへの書き込み

テキストファイルの書き込みはこちらを参考にしました

[https://note.nkmk.me/python-file-io-open-with/:title]

((何故かリンク表示が上手くいかない))

path_w = 'code_output.txt'

文字の羅列のまま書き込むと読みづらいので「/」を加えるようにした

with open(path_w, mode='w') as f:
    f.write("/".join(list_output))

できたのは

C/C/Am/Em/C/G/G

のコード

本当は、このようなランダムな文字列を複数作成して、規定の数まで行って「C」で終わるとか、同じ繰り返しをさせるだとか、もっと複雑なことをするべきなのでしょうけれど、そこまで考える余力がありませんでした。

元気な方、お願いします。

自分の嫉妬心と向かい合う

最近読んだ本に、好きなことが見つからない人は自分が嫉妬するものにヒントがあるかもしれない、という指摘があった。

今読み始めている本にも同様の記載があり、醜いネガティブな欲望であっても回り回ってポジティブなことに還元されうるのだから先ずは自分の欲望と向かい合え、というアドバイスがある。

自分自身の嫉妬事例など人に公開するものでもないものだが、オープンに書き出すことで棚卸しをしてみたい。

諦めたことはしこりになる

アニメプロデューサーだった時代(嫉妬の出発点)

社会人になって数年間、アニメ番組のプロデューサーを補佐していたことがある。(実務はやるがジャッジは上に仰ぐという立場だ。)

そのとき関わった作品はどれも素晴らしい出来で、今も好きだ。サンプルが会社に届くのに、自分でビデオグラムのBOXを買ったりサウンドトラックのCDを買ったりしている。しかし、自分の会社にとってはいずれも赤字だった。

  • 「こんなに良いものを作っているのに何故、ヒットしないのか?」
  • 「広告代理店に居るのにヒットのさせかた、宣伝の仕方のノウハウが自分にはない。そのせいに違いない。」

ということで、定期ローテーションのタイミングに併せて、勉強のつもりで営業に異動した。

意外かもしれないが広告代理店の中で一番宣伝に詳しくなるのは営業だ。商品のプロモーションの司令塔は、広告主のプロモーション担当や開発担当だが、広告代理店の中でそこに一番近くで補佐するのは営業で、クリエイターやプランナーはどちらかというと各専門分野(映像やグラフィックを作る、セールスプロモーションの会社をコントロールする、媒体社とのリレーションを維持するetc...)の知識と人脈に特化していく。1

因みに、暫くするとマーケティング分野が興味深く、番組プロデュース業専業に戻る気持ちは薄れてしまった上に、当時居た部署は赤字がたたって早々に縮小・再生産となり役割も変わってしまった。

コンテンツビジネスでヒットを続ける会社への嫉妬

暫く金融・物流といった堅い企業の担当を挟みながら、いつの間にかエンターテインメント系企業の担当営業に偶然にもなってしまった。そしてその頃、一番嫉妬していたのが、「ANIPLEX」という会社だ。いや、今でも嫉妬する。

エンタメ作品のプロモーションを手伝う中、コンテンツビジネスでヒットするしないは運の要素が大きいと自分の中で結論づけていたのだが、そのような中、ANIPLEXという会社だけは何故かヒットを安定的に出せていたし、今もまだ出し続けているのだ。

なお、アニメ業界で儲け続けるには主に2つの方法がある。

  1. 良い土地(放送時間帯)を持っている。
    • 嘗て最もオーソドックスだったのはこの手法だ。プライムタイムより若干早いタイミングは子ども向けの番組なら世帯視聴率が取れるという時代があり、安定して子どもにコンテンツを刷り込むことができた。一等地にいつも自社宣伝枠があるような状態だ。一等地は利権でもあり、注意してみるといつも同じ製作会社であったり、同じスポンサーであったりした筈だ。少子化で夕方の世帯視聴率が取れなくなった今でも日曜日の朝の戦隊・ライダー・プリキュアの人気は絶大である。
      • 因みにアニメ業界で安定した会社が減っているのは夕方の土地の価値が下がったことも大きい。キングレコードバンダイビジュアル角川書店が幾つかの制作会社と緩やかにタッグを組みながら安定して儲けていたわけだが、今はその効果はなく、土地を持っていることよりも作品を話題化するテクニックの方がより重要になり、浮き沈みが激しい。
  2. 過去の人気作の著作権を持っている。
    • ガンダムを毎年何らかの形で収益化している総通・サンライズと、マクロスを数年に一回作り直しているビッグウエストがこのパターンだ。逆にタツノコプロダクションは作り直しのタイミングが遅かったり、作り直した作品がいまいちヒットしなかったし、何より前述の3社ほどに商売が上手くない。また、このパターンはそこそこリスクや投資もしないといけないので、そのコンテンツなら高い権利料でも自社で商品化して商売したい!というパトロンが見つかっているかどうか?も重要だ
    • アンパンマンドラえもんも過去の人気作に頼っているパターンだが現役で毎年ファンが増えているので(1)とのハイブリッドだ。テレビ放送では儲かっていないかもしれないが、子ども向けアンパンマングッズ市場は安定しているし、ドラえもんの映画は毎年ヒットする。名探偵コナンもそろそろこの仲間入りだろうし、ポケットモンスターは元はゲームだが方式は似ている。逆にこのポジションになれそうでなれなかったのは、イナズマイレブンや妖怪ウオッチだ。人気作になるまでの辛抱が重要だ。

そして、このどちらの王道パターン(或いは既得権益)に属さずにヒット作を出し続け始めたのが「ANIPLEX」だ。「シティーハンター」や「るろうに剣心」の頃から違う社名で存在はしていたが、「おおきく振りかぶって」「黒執事」といった作品を早々に目をつけて番組化したり、特に舌を巻いたのは「夏目友人帳」で、自分が漫画を読んだとき”映像化には向いてない”と思ったのにアニメ化された作品の出来上がりが感動するほど素晴らしかった。

  • たまたま目利きが居るだけだ
  • 売れなかったオリジナル作品も多い
  • 運良く腐女子ブームの乗っかれただけでしょう?

という邪悪な嫉妬心を持っていたものだが、2019年度もFGOが大ヒットしていて遂にSONYの決算に貢献するまでになっている。

かつて自分は「コンテンツビジネスは博打すぎる」と見限った筈なのに、今でも自分にはできなかったことをこの人たちはできているという事実に嫉妬する気持ちは強い。

なお、ヒットには運が大きいという説はエンタメ業界に限らず真実だと思っている。勿論ベースの品質の良さは大切なのだが、運良くジャスティン・ビーバーにイイネ!と言ってもらえるかどうかでメジャーになるかどうかが決まる。一番わかり易い本はこれだろう。

エンターテインメント業界の周辺で儲ける人への嫉妬

ANIPLEXの次に嫉妬するようになったのは、エンターテインメント業界の周辺で儲ける人が増えたことへの嫉妬だ。

その前に少しだけ背景を遡る。

音楽リズムゲームのプロモーションを担当していた頃に如実に変化を感じたことの一つが「初音ミクの子どもへの浸透」だった。アニメコンテンツはまだまだ一部の気持ち悪いオタクが楽しむものだというイメージは強かったものの、ニコニコ動画でアップされた初音ミクYoutubeに転載されることが増えてくると、子どもはYoutubeには接触していて、初音ミクは一般的なキャラクターとしてオタクでもオタクでない人にも受け入れられていることがわかった。(雑誌のタイアップで子どものモデルにヒアリングした。)

その世代辺りからは必ずしもオタクでない人もテレビアニメを見ることにさほど抵抗がない人の割合が多い。オタクでないというのはどういう意味かというと、本編以外のアンソロジーの物語を渇望する、創作する、こんなエピソードがあったら良いなとか勝手に拡大解釈を増やしていく、世界観を消費する、Ver違いの差異にこだわって収集する、元ネタを探し始める、あるシーンを作った作り手やキャラクター設計をした人の別の作品に手を伸ばし始める等々、やたらと深ぼっていくタイプではない人ということだ。

アニメが好きな人が増えたことによって、徐々に周辺のビジネスが儲かるようになってきた。

  • 今ヒットしている作品が何か?をSNSの盛り上がり等をウォッチし企業にレポーティングしてタイアップやキャラクター使用を検討する企業からお金を貰う
  • ユーザー心理をアドバイスしてタイアップのコーディネートのサポートをして企業からお金を貰う
  • アニメソング中心のクラブイベントで儲ける
  • オタクと関係ない商品プロモーションに声優の声を使って再生回数を伸ばすプランナーも好きじゃない

何故自分がそこに嫉妬心があるのかは自分でも謎だが、創作している人ではなく、「アドバイス」や「コーディネート」だけしている人が儲かっているという話を聞くと腹立たしい。

当初、それは自分の正義感からくる怒りではないか?と思っていたものの、自分の嫉妬心を深ぼると自分が儲けることを諦めた業界で素人ですら儲けられているということへの嫉妬なのだと思う。

嫉妬の本質な点を探る

このように振り返ると、エンターテインメント業界へのルサンチマンがあるように思うのだが、そのように単純に総括してしまうことへも違和感がある。

エンターテインメント業界の精神的な苦しさ

人は儲けなければならない。理想的な世界では、良いコンテンツが多くの人に観られて収益化することで、ディズニーの映画やハリウッド映画のパターンは美しい形だ。しかし現実には、良い作品を作れば儲かる筈だと信じると、サムライチャンプルーのようなストイックな作品ばかり作って倒産したマングローブのようなことになる。

安定した収益を狙うには、

  • まだ欲望のコントロールができない子どもの物欲を刺激し親の財布からお金を巻きあげる
  • 物欲の制限が外れたオタクに手を変え品を変え買わせる。(ソーシャルゲームの廃課金をイメージするとわかりやすい)

の2点のどちらかから逃れることはできない。

ディズニークラスのワールドワイドなヒット作にするには制作費もかかるし営業力も宣伝力も必要で、結局はどこかのタイミングでう2つのような心を鬼にして収益に拘る時期を経ないと始めることすらできない領域だ。2

恐らく儲けることに一切抵抗のない東京の私立大学出身の人には向いているビジネスだと思うが、反資本主義的な地方の国立大学を出た人間にとって、他人の欲望に漬け込んで消費させることには激しく抵抗がある。

リアルなイベントをやってみるとわかるが、

  • レアカードを求めてイベント会場でカードを広げている子どもの狂ったような目
  • アイドルと握手や撮影するイベントへ「先行予約に申込める権利(当たるわけではない)」だけがついたDVDを買わされて会場に来た人の目

に直面すると、こんな人達からお金を巻き上げて良いものだろうか?と苦しくなる。3

本当に嫉妬しているのは、業界に対してではなく、「できなかったことを実現している人」に対して

実はエンターテインメント業界担当営業を離れて急速にコンテンツ消費欲が減退してしまった。一時は、毎日テレビアニメ放映を見ていた筈の自分が、たまに一気観したり映画館で見る程度にまで減り、かなり一般人と同じ頻度にまで低下した。自分が好きだと思っていたものが言うほど好きでもなかった、と認識するのはアイデンティティの崩壊にも繋がる。

一方で、どの作品が今期ヒットするか?どの漫画がこの後ヒットするか?を考察しアンテナを貼らねばならない、というプレッシャーから開放されて純粋にユーザーとして楽しめるようにもなった。4

エンターテインメント業界・コンテンツビジネスで儲けている企業や人に嫉妬しているからといって、その業界で一旗揚げたいという強い野心も責任感もあるわけではなく、自分が無理だと諦めた分野で成功している人がいて悔しいとプライドが傷ついていると認識する方が正しい。自分の場合の野心は寧ろ、単に「成功者になりたい」というレベルの身も蓋もない欲求だ。

恐らく自分の場合は「何かの分野で自分の思う正統派の範囲で成功する」までは、ずっとこれらの嫉妬から逃れられないのだと思う。


  1. もしかすると広告業界以外の人にはクリエイティブディレクターが全て決めているように見えるかもしれないし、そう言い張る独立したクリエイターの書籍も多い。しかし残念ながら施策の予算配分や投下タイミングを決めているのはだいたい営業だ。広告業界に限らず、ソリューション型営業と呼ばれる職業の営業は大方、プロジェクトマネジメント業務とセールス活動とを並行してどちらもやる。

  2. 最近読んだDeNA南場さんの「不格好経営」でもあるときから収益に拘ることへ転換したということを仰られていた。

  3. 補足をしておくと全てのエンターテインメント製品がこのような手法に頼っているわけではない。儲かるタイトルの横でそこそこの儲けで生きているようなタイトルはもっと健全だし、例えばチーム制で戦うゲーム大会でも、お金を払ったもん勝ち、になると一気にユーザーは狂い始めるが、チームプレイが上手い人が勝ちのこれる、という健全な設計にすると急にユーザー層が健全になる。この手のエンターテインメント業界のプロモーションは圧倒的に楽しい。TVCMで消費財を刷り込むことよりも断然に楽しい。ただ、それでは圧倒的に儲けることが難しいので貪欲に儲ける別タイトルの恩恵にもあずからないといけない。

  4. 因みに自分は、「物語を広めることが好きだ」と自分で思い込んでいた時期もあった。小説でも映画でもラジオドラマでも、人を感動させる物語を提供してそれで儲けたい、と。その気持ちは今でも嘘ではないが、冷静に考えると殆どの人が他人の物事に感動して勇気を貰うものであり、スピーチでも自叙伝でも起こせることだ。自分固有の欲望というよりも衣食住に次いで誰もが持つ普通の欲求であり、”自分の好きなこと”にカテゴライズするものではない。「みんな美味しい食事は好きさ!」というレベルの自己分析だった。

キーワードプランナーで大量に取得したキーワード情報Pythonで簡単に集約する

Pythonが例えばどういうときに役に立つか?という事例として、広告のターゲティングやバナーに必要なキーワードをリサーチする場合を考えてみます。

キーワードプランナー

バナーの訴求文言やサーチターゲティング等のキーワードを考えるときに、自分の頭だけで考えるのは賢くありません。先ずは既に存在する競合サイトを分析したり、競合のバナー出稿を確認したりするべきです。

広告会社であれば何かしら競合バナークリエイティブを収拾しているサービスと契約していると思いますが、そのような手段がない場合、少なくともGoogleのキーワードプランナーは誰もが無料で使えるサービスです。

ads.google.com

細かい数値を得るには広告出稿が必要ですが、概算値で良ければその必要はありません

キーワードプランナーで競合サイトの分析をする

例えば自分が人事組織関連のSaaSを提供していたとします。 私はこの分野のことは担当したことがないのでどこが一大勢力なのか知りませんが、

boxil.jp

boxil.jp

などを参考に仮想で競合となる企業のサイトを選定しました

キーワードプランナーの「新しくみつける」からURLをコピペして、候補を探すと、直近1ヶ月等の検索ボリュームが計測できます。

f:id:yyhhyy:20200208155654j:plain

ディレクトリ全体やページ単体指定を必要に応じて使い分けながら、ロボット的に大量に競合となるサービスのURLを押してはリストをダウンロードしていきます。

f:id:yyhhyy:20200208155738j:plain

f:id:yyhhyy:20200208155754j:plain

10ファイルくらいになりました。

f:id:yyhhyy:20200208155807j:plain

もっと真面目に探すと恐らくもっとファイル数は増えるでしょう。 これをエクセルで一枚一枚開いてセルに貼り付けるのは意外と時間がかかります

Pythonを使って簡単な前処理をする

ディレクトリ内のデータをロボット的に読み取る

ファイル数が多い場合、一つ一つファイル名を記述して指定することは非効率です。

globライブラリのglob関数を使いフォルダ内のCSVファイル情報をワイルドカード指定で一覧を取得します。

使い方に不慣れだったので幾つかのブログを参考に使い方を確認しました。

note.nkmk.me

qiita.com

import glob
files = glob.glob('data/*.csv')

これで一覧が取得できました

(files)
['data\\Keyword Stats 2020-02-08 at 14_43_20.csv',
 'data\\Keyword Stats 2020-02-08 at 14_43_43.csv',
 'data\\Keyword Stats 2020-02-08 at 14_44_08.csv',
 'data\\Keyword Stats 2020-02-08 at 14_44_31.csv',
 'data\\Keyword Stats 2020-02-08 at 14_46_29.csv',
 'data\\Keyword Stats 2020-02-08 at 14_48_12.csv',
 'data\\Keyword Stats 2020-02-08 at 14_48_51.csv',
 'data\\Keyword Stats 2020-02-08 at 14_49_14.csv',
 'data\\Keyword Stats 2020-02-08 at 14_49_37.csv',
 'data\\Keyword Stats 2020-02-08 at 14_49_53.csv',
 'data\\Keyword Stats 2020-02-08 at 14_50_56.csv',
 'data\\Keyword Stats 2020-02-08 at 14_51_33.csv',
 'data\\Keyword Stats 2020-02-08 at 14_52_47.csv',
 'data\\Keyword Stats 2020-02-08 at 14_53_11.csv',
 'data\\Keyword Stats 2020-02-08 at 14_53_23.csv',
 'data\\Keyword Stats 2020-02-08 at 14_53_36.csv',
 'data\\Keyword Stats 2020-02-08 at 14_53_46.csv',
 'data\\Keyword Stats 2020-02-08 at 14_54_19.csv']

空のリストを作り、データフレームとして読み込んではリストに追加。最後に1つのデータフレームとして結合します。

この発想はこちらのサイトを参照させて頂きました。

[http://pidgeott0.com/engineer/816/:embed:cite]

list = []
#import numpy as np
import pandas as pd
for f in files:
    list.append(pd.read_csv(f,encoding="utf-16",header=0, skiprows=2,sep='\t'))
df = pd.concat(list)

なおGoogle系のサービスでありがちなのですが、文字コードが「utf-16」と特殊です。私は最初これに気がつくまで随分とかかりました。 また冒頭に説明行が入っているので、2行スキップします。

また、CSVファイルのフリをしていますが、タブ区切りなので区切り文字としてタブを指定する必要があります。

df.head()
Keyword Currency Avg. monthly searches Min search volume Max search volume Competition Competition (indexed value) Top of page bid (low range) Top of page bid (high range) Ad impression share ... Searches: Mar 2019 Searches: Apr 2019 Searches: May 2019 Searches: Jun 2019 Searches: Jul 2019 Searches: Aug 2019 Searches: Sep 2019 Searches: Oct 2019 Searches: Nov 2019 Searches: Dec 2019
0 リンク アンド モチベーション クラウド JPY 該当なし 10 100 14.0 177.0 815.0 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 リンク アンド モチベーション モチベーション クラウド JPY 該当なし 10 100 17.0 281.0 1217.0 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 motivation cloud JPY 該当なし 100 1,000 20.0 599.0 2235.0 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 モチベーション クラウド と は JPY 該当なし 100 1,000 23.0 127.0 2160.0 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 モチベーション cloud JPY 該当なし 10 100 36.0 281.0 1143.0 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

5 rows × 26 columns

len(df)
9379

9000行からなるリストになりした

データを絞り込む

9000件、指定するわけいにもいきませんし、この中には重複もあります。 サーチボリュームが小さいものは削除すべきでしょう。

df.dtypes
Keyword                          object
Currency                         object
Avg. monthly searches            object
Min search volume                object
Max search volume                object
Competition                      object
Competition (indexed value)     float64
Top of page bid (low range)     float64
Top of page bid (high range)    float64
Ad impression share             float64
Organic impression share        float64
Organic average position        float64
In account?                     float64
In plan?                        float64
Searches: Jan 2019              float64
Searches: Feb 2019              float64
Searches: Mar 2019              float64
Searches: Apr 2019              float64
Searches: May 2019              float64
Searches: Jun 2019              float64
Searches: Jul 2019              float64
Searches: Aug 2019              float64
Searches: Sep 2019              float64
Searches: Oct 2019              float64
Searches: Nov 2019              float64
Searches: Dec 2019              float64
dtype: object

ここでまたトラップですが、「Min search volume」「Max search volume」ともに数値ではなくオブジェクトとして認識されています。

df["Min search volume"] = df["Min search volume"].astype(str).str.replace(',','').astype(int)
df["Max search volume"] = df["Max search volume"].astype(str).str.replace(',','').astype(int)
df.dtypes
Keyword                          object
Currency                         object
Avg. monthly searches            object
Min search volume                 int32
Max search volume                 int32
Competition                      object
Competition (indexed value)     float64
Top of page bid (low range)     float64
Top of page bid (high range)    float64
Ad impression share             float64
Organic impression share        float64
Organic average position        float64
In account?                     float64
In plan?                        float64
Searches: Jan 2019              float64
Searches: Feb 2019              float64
Searches: Mar 2019              float64
Searches: Apr 2019              float64
Searches: May 2019              float64
Searches: Jun 2019              float64
Searches: Jul 2019              float64
Searches: Aug 2019              float64
Searches: Sep 2019              float64
Searches: Oct 2019              float64
Searches: Nov 2019              float64
Searches: Dec 2019              float64
dtype: object

これで整数に変わりました

数値に変換できたことで、絞り込みが可能となります

df_select_1000 = df[df["Min search volume"] >= 1000]
df_select_1000.head()
Keyword Currency Avg. monthly searches Min search volume Max search volume Competition Competition (indexed value) Top of page bid (low range) Top of page bid (high range) Ad impression share ... Searches: Mar 2019 Searches: Apr 2019 Searches: May 2019 Searches: Jun 2019 Searches: Jul 2019 Searches: Aug 2019 Searches: Sep 2019 Searches: Oct 2019 Searches: Nov 2019 Searches: Dec 2019
8 the team JPY 該当なし 1000 10000 54.0 42.0 66.0 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
87 hr tech JPY 該当なし 1000 10000 31.0 433.0 1026.0 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 ラフール JPY 該当なし 1000 10000 0.0 NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 wevox JPY 該当なし 1000 10000 16.0 399.0 958.0 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 geppo JPY 該当なし 1000 10000 15.0 502.0 656.0 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

5 rows × 26 columns

len(df_select_1000)
159

これで150行です。玉石混交ですのでこれくらいから絞り込むのは目視が良いでしょう

キーワードだけ取り出して、重複を排除すればキーワードリストの完成です。

pd.DataFrame(df_select_1000["Keyword"].unique())
0
0 the team
1 hr tech
2 ラフール
3 wevox
4 geppo
... ...
124 タイム カード アプリ
125 indeed 求人 掲載
126 勤怠 管理 アプリ
127 タイ 求人
128 タッチ オン タイム ログイン

129 rows × 1 columns

目視の際はエクセルかCSVで見るのが良いでしょう

pd.DataFrame(df_select_1000["Keyword"].unique()).to_excel("df_select_1000.xlsx")