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

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

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

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

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

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

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

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

  • 主要コード(スリーコード)
  • 代理コード
    • 同じ役割の主要コードの直前には置かない
    • トニック: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")

人間の心は社会的に決まるということについての読書案内

最近はグローバルで活躍しかつSNSで情報発信をしていただける方が増えました。その為、日本の常識は海外では非常識ですよ、と教えてくれる人も増えてきました。

一方で、「海外では」とひと括りに言っても、「自分の行った海外では」という話であって、民族によってかなりバラツキのある話で、アングロサクソン系なら全部一緒だろう?と考えるのもかなり的外れです。人の心は社会的に決まるもので、所属する集団の社会規範に大きく左右されるものです。

丁度最近読んだ本でとてもわかりやすい本がありました

読書案内

ビジネスパーソンの視点

異民族同士の混成チームのマネジメントをコンサルティングされる方が長年、ビジネスの組織で実体験してきた事例の総まとめのような本。

特に企業内で上司と部下がどのようなコミュニケーションスタイルを望むか?という視点で情報を集めた本は少ないので重宝するかと思います。(私は生憎ドメスティックな会社に勤めていますので、ただの教養にしかなりませんが) 国別にどういうフィードバックを好むか?どういう時間意識を望むか?は千差万別で、聴衆が盛り上がっているのに公演時刻ピッタリに終えてしまうと「失礼だ」と捉える国の事例など、なかなか予め知っていないと対処が難しいことも多いでしょう。

学者の視点

ヒトとそれ以外の霊長類の大きな違いは何か?という点で、ヒトは技術を集団で記憶し伝承することで身体能力の一部を外部化してきた点に着目した本。

合理的な判断能力では人間はチンパンジーに負けるそうですが、人間は特に他人を模倣する癖がついていて、合理的な判断をせずに他人を真似るケースが他の霊長類より多いそうです。単独では狩りもできませんが、先人が鏃の作り方を伝授してくれるので集団としては強くなる、というモデルで人間は生き残ってきたようです。

例えば、複雑な調理工程をしないと毒素が抜けない食料品を食べてきた民族では、化学的な理由を理解をせずに”昔からこうやってきた”という調理工程を守らないと死んでしまうので、所属集団のルールを守る能力というのは死活問題になってきます。そういった人間の特徴を踏まえると、どれほど村八分が気持ち悪い風習に見えたとしても、村八分こそが人間が生き残ってきた強みであったのであれば避けようがない本能だ、ということが理解できるでしょう。

教養本としても面白いですが、チームに伝承しないスーパーマンが多い集団よりも、そこそこの能力ではあるが他人に伝承できる人が多い集団の方が、数世代経った後のチームとしての技術では後者の集団の方がスキルアップしているというモデルは企業体にも応用できる話ですし、”他人から尊敬されている火を尊敬したくなる(某本の”錯覚資産”)ことは人間の本能である”ということがわかれば、著名人に推奨して貰うと何故商品が売れやすいのか?といったプロモーションの経験則にも納得感が出てきますし、応用範囲の広い本です

ライトな本

どちらかというと上記2つの本を読んでからの方が良いかもしれませんが、もっとテクニック論に寄った本としては、藤田田氏の本や、瀧本哲史氏の本もとても参考になります。

藤田田氏の言う、みんなに憧れられているお金持ちから商売を始めろ!という指摘も正に人間の本能に従うと正しいジャッジですし、瀧本哲史氏の紹介する人が協力したくなるパターンについても、如何に自分が集団に認められているか?大切にされているか?を気にするのは人間が必要な生存本能であって、決して承認欲求に溺れた人が単純に愚かな人ではなく、みな平たくそういう気質はあるものだ、と理解することができます。

人の心が動くポイント

特に、テクニック論的な藤田田氏と瀧本哲史氏の本を読んで感じるのは、人間社会の原動力の多くは、合理性よりも情動的な意思決定ではないか?という点、ごくごく一部の”人気のある著名人”同士のコネクションで社会が動いているのではないか?という点です。

顕著な例は生き残った楽天と巨大化しそこなったライブドアグループで、経団連の偉い人に仲間だと思って貰えたかどうかで結末は変わりました。別にライブドアが球団を買っていてもおかしくなかったのでしょうけれど、偉い人に筋を通さずに行ったことで、味方が現れませんでした。 他にも瀧本哲史氏の本に出てくるのですが、「どうしてもこれを私はやりたいんだ」という熱意が伝わってJALの音声コンテンツに採用されたベンチャーが”JALに採用された’実績”を引っさげて、信用力を固めていった事例の紹介もわかりやすいと思います。この場合の説得はたまたま熱意ということでしたが、合理的な判断だけの連続であれば追い払われていたことでしょう。

という本も非常に面白いエピソードです。スポーツ界のフィクサーのような数人が大きなイベントのお金の流れを決定づけています。

これらはあくまでも例示に過ぎませんが、「アイデアを思いつく人は無限にいる」「実行する人は少ないがそれでも沢山いる」「やり遂げられた人が少ないのだ」とはよく言いますが、重要な局面で非合理的なジャッジをどれくらい乗り切ることができたか?ということが重要なのではないかと思います。

合理的な判断ではない意思決定をAIが促進できるようになっとき、始めてAIが「ヒト」に近づいたと言えるでしょう。合理的な判断のサポートをしているうちはチンパンジー止まりということかもしれません。

ffmpegでYahoo!入稿規定用の動画を変換する

動画広告を入稿する際、Youtubeはチャンネルにアップロードするだけですし、Teasもそんなに難しくありません。多くのケースが「mp4 h.264 AAC」程度を守っていれば大丈夫です。

しかし、Yahoo!はそうはいきません。

レスポンシブ(動画) - ヘルプ - Yahoo!広告

  • メジャーブランド:mp42、M4V
  • moov atom位置指定:ファイル先頭
  • 最大ボリューム(db):-3dB以下

など、結構細かい指定があります。

ここまで来ると、動画編集ソフトに付随している書き出し設定では限界があります。

ffmpegをインストールする

コマンドプロンプトで動画を変換できる便利なソフトです。

Windowsの場合、自分でPATHを通す必要があります。解凍したママですとフォルダ名が長いので、適当に変えておくほうが良いでしょう。

web.plus-idea.net

実行するコマンド

結論から言うと、以下のようおなコマンドをコマンドプロンプトで打つことになります。

  • before.mp4 が、変換したい元の動画ファイル名
  • after.mp4 が、変換した後の動画ファイル名

としています

ffmpeg -i before.mp4 -brand mp42 -af loudnorm=I=-24:TP=-3:LRA=1 -movflags +faststart -profile:v baseline -level 3.0 -s 640x360 after.mp4

以下に、それぞれのオプションの説明をします

アスペクト比を変える

-s 640x360

のオプション部分です。

Yahoo!では解像度を下げさせられるケースが多いです。

qiita.com

ベースラインを変える

-profile:v baseline -level 3.0

多様なデバイスに対応するためにベースラインの推奨を入稿審査で指摘される場合があります。

trac.ffmpeg.org

moov atomを先頭に記述する

-movflags +faststart

moov atomを先頭に記述しなければなりません

nyanshiba.hatenablog.com

音声ピークレベルとラウドネス対応

-af loudnorm=I=-24:TP=-3:LRA=1

ラウドネスの規定があります

x1.inkenkun.com

メジャーブランドをmp42にする

-brand mp42

isomでは受け付けてくれません

superuser.com

確認するコマンドとその他のコマンド

変換したい内容になっているかどうか?を確認するには

ffmpeg -i after.mp4

と入力ファイルの指定だけして出力を指定しなければ、内容が記述されます。

その他にももっと色んなことができるソフトであることを知りました。これはとてつもなく便利なソフトですね。

qiita.com

qiita.com

Markdownから直接PowerPointを作成する

ちょっと前までは、MarkdownからPDFやワードファイルにできてもPpwerPointにするのは再現性が厳しいものがありました。

※以前の記事

yyhhyy.hatenablog.com

しかしいつの間にかPandocがPowerPointへの変換もサポートしていました。

使い方

※ Pandocのインストールまでは様々なサイトがありますので割愛します。あともうちょっとこういうことができたら良いな、の部分を以下に抜粋しました。

PowerPointのフォーマットを指定したい

自分1人でスライド作成が完結するならPDFでもHTMLスライドでも問題ありません。しかし敢えてPowerPointファイルにする必要がある、ということは、パワポにして誰かと共有する必要があるというケースだと思われます。

その際、課題となるのが、スライドマスタをあわせたい、フォントを併せたいといったニーズでしょう。

こちらで紹介されていました。

bitware-blog.com

Bemaerに変換するときと同じようにコマンドプロンプトで参照ファイルをつければよく、しかも普通のPPTXファイルでOKです。これは便利です。

たとえば、こんな感じのPPTを「hogehoge.pptx」として保存しておきます

f:id:yyhhyy:20191021223809j:plain

以下のようなMarkdownで書いたmarkdownファイルを用意しておきます

% hogehoge
% hoge
% 2019/10/22

## Slide 1
- hogehoge
- hogehoge


## slide 2
- hoge

# seleciton2
## slide 3

コマンドプロンプトからPandocで変換します

pandoc -s hoge.md -o hoge2.pptx --reference-doc=hogehoge.pptx

同じフォーマットで出てきます。配色も好きに参照元パワポを調整すれば良いでしょう。

f:id:yyhhyy:20191021224337j:plain

画像のリサイズがしたい

PandocでのPowerPoint化はHTML化とは違いますのでHTMLタグを使うことができません。

<img src="hogehoge.jpg" width="hogehoge.px">

といった記述をしても残念ながら画像のサイズは変更されず、1スライドに1画像という固定のフォーマットにされてしまいます。

しかし、解決方法はあります。

Beamerで2カラムにするように、Markdownで2カラムにすれば良いそうです。

↓この手法を画像配置の方法として考えられた方、素晴らしいと思います。 qiita.com

::::::::::::::: {.columns}
::: {.column}
- hogehoge
- hogehoge
:::

::: {.column}
![hoge](images/hogehoge.jpg)
:::
::::::::::::::::::::::::::

ただしこれ、プレビューやPDF・ワードファイル化ではうまく機能しませんので気をつけてください。

f:id:yyhhyy:20191021223302j:plain

% hogehoge
% hoge
% 2019/10/22

## Slide 1
::::::::::::::: {.columns}
::: {.column}
- hogehoge
- hogehoge
:::

::: {.column}
![hoge](images/hogehoge.jpg)
:::
::::::::::::::::::::::::::

## slide 2
hoge

# seleciton2
## slide 3

f:id:yyhhyy:20191021224644j:plain

になります。

必要以上に見栄えにこだわらなければこれで充分でしょう。

GoogleAnalyticsの週次レポートを自動化する方法

Google Analyticsはとても人気があり、アクセス解析はしないけれどサイトの訪問状況の概要を知りたい、というニーズに於いては最も手軽で便利なツールです。

一方で、使い方を検索しても、公式ガイドのコピペのようなサイトばかりヒットしてしまい、なかなかあと一歩、知りたい情報にたどり着けないことも多いのではないでしょうか?特に、週次レポートを課せられ毎回毎回ブラウジングから作成している人も多いのではないか?と思い、レポート自動化のコツをまとめておくことにしました。

レポート自動化の意義

レポートを自動化していない最悪のケースでは以下の工程が発生しているはずです。

  1. Google Analyticsのページへログインする(アカウントを切り替える)」
  2. 左のメニューから「行動>●●」とクリックしていく
  3. 表示されたレポートにディメンションを追加していく
  4. 期間を設定して集計する
  5. 表示が1ページで切れているので5000行にする
  6. レポートをエクセルでダウンロード
  7. エクセルのデータをエクセルでグラフ化
  8. パワポにエクセルのグラフを貼る

2,3 部分の解消やフィルターが必要な方は「カスタムレポート」も使っていると思いますが、いずれにせよこんなことを毎週月曜日にやっていたら週明け早々非生産的です。

Google スプレッドシートのアドオンでデータを取得する

Google スプレッドシートにはGoogle Analyticsと連携したアドオンがあります。アドオンを取得したらアドオンメニューで表示できるようになりますので、Create Reportから新しくレポートを作成します。1

f:id:yyhhyy:20191019182738j:plain

自分が知りたい指標を選んでいきます。英語ですが対照表も検索すれば出てきます。

例えば、

  • 知りたい数値類
    • Page Views
    • New User
    • User
  • 知りたい軸
    • 週の単位
    • 流入
    • ページのタイトル

などを設定します

f:id:yyhhyy:20191019183002j:plain

無事レポートができるとこのような画面になります。ここでは期間設定を変更したり、フィルターやセグメントもこのシート上で変更できます。ディメンションを追加することも可能です。2

f:id:yyhhyy:20191019183628j:plain

作成したらアドオンから「Run Report」を押すと、別シートに集計結果が出力されます

f:id:yyhhyy:20191019183753j:plain

f:id:yyhhyy:20191019183908j:plain

このときスプレッドシート側で何行の何列から何行の何列まで使っているか?をメモしておく必要があります。

Google Data Portal でデータをグラフ化する

データソースの連携

グーグルのサービスの中では比較的マイナーかもしれません。Google Data Portal(旧:Google Data Studio)からレポートを作ります。

f:id:yyhhyy:20191019184143j:plain

するとレポート作成画面ができますが、右下の「新しいデータソースを作成」から、先程のスプレッドシートのデータを設定していきます。

f:id:yyhhyy:20191019184251j:plain

凝ったことしないのであればGoogle Analyticsを直接連携しても良いのですが、普段カスタムレポートでフィルターを細かく設定している人や、Google Analyticsのレポートそのままではなくスプレッドシート上で簡単な前処理が必要な場合などを考えると、現時点のサービスのクオリティではスプレッドシート連携の方が便利でしょう。

f:id:yyhhyy:20191019184423j:plain

データソースの選択で、自分のスプレッドシートの「シート」を選択し、データが記載された範囲を入力します。この際、週次レポートなどであればどんどん下に行が増えていくはずですので、必要以上に多くしておくほうがベターです。

f:id:yyhhyy:20191019185029j:plain

注意点

たまに数値が数値として認識されていないことがありますので、各データの設定は必ず確認します。

f:id:yyhhyy:20191019185231j:plain

また、今回ISOの週を指標に選びましたのでこれも設定しておきます。そうでないとグラフ化の際に謎の6桁の数字が並んでしまいます。

f:id:yyhhyy:20191019185214j:plain

データのグラフへの描画

いよいよデータのグラフ化です。今回は週次レポートに求められるケースをピックアップしています。

時系列棒グラフ

先ず、週単位のページビューを時系列でグラフ化してみましょう。「アクセスが伸びているのか?落ちているのか?最近上がったのはいつか?」といったことは、意思決定の有無とは別に、よく質問される項目だと思われます。

「グラフを追加」から時系列グラフを選びます。

f:id:yyhhyy:20191019185630j:plain

デフォルトでは折れ線グラフですが、週単位集計のページビューは非連続データだと思っていますので、個人的に棒グラフにするべきものだと思っています。右側のパネルで変更ができます。

f:id:yyhhyy:20191019185842j:plain

f:id:yyhhyy:20191019185900j:plain

軸のフォントのサイズなどを調整して見やすいグラフにしてきます。エクセルのように細かく設定はできませんがデフォルトでも見やすく作られているので、許容範囲でしょう。

f:id:yyhhyy:20191019190039j:plain

表とスコアカード

「どのページがよく見られれているのか?」も問われやすい項目です。表の中に棒グラフと数値が入るパターンを選びましょう。残念ながら表示できる行が往々にして制限が出ます。どこかで足切りを良しとする必要があります。

f:id:yyhhyy:20191019190530j:plain

また、「トータルで今、何人来ているんだ?」もよく聞かれることですので、「スコアカード」でPV,UUなどを表示しています。

棒グラフ

また、流入元の分析であれば、流入元別に棒グラフも必要かもしれません。私の拙いサイトでは何もパラメータを付与していませんが、ここでGoogle推奨のパラメータを表記していれば、綺麗に分類できるはずです。

f:id:yyhhyy:20191019190648j:plain

スケジュール化

Data Portal

Google Data Portalの結果は、このページ自体を共有設定することもできますが、なかなか現実的には外部企業とダッシュボード共有はしないと思われます。ダウンロードしてPDFにすることができますので、このPDFを共有するようにします

f:id:yyhhyy:20191019190946j:plain

共有から自分のアカウントに転送できます。この際には、PDFが添付されたメールになります。

f:id:yyhhyy:20191019191028j:plain

この先は、自分でメールを送るもよし、Gmailに転送設定するもよしです。ただしファイル名が文字化けされるので注意してください。

Google スプレッドシート

また、Data Portalのスケジュール化と同時に、Google スプレッドシートの方でも定期レポート化設定が必要です。Schedule Report から設定します。

f:id:yyhhyy:20191019191310j:plain

Data Portalよりも前の時間帯で更新されるようにしておきます。

f:id:yyhhyy:20191019191427j:plain

以上で設定は終わりです。

後は、毎週決まった時刻にこのPDFがメールで来るようになります。


Google Data Studioについての本は少なく、私もスプレッドシートをソースにできると知ったのはこの本でした。この本では、説明相手によって出すべきレポートが異なることなど、もう少し前段階から説明されているただの紹介本とは異なる良い本です。

同じグラフ作成・レポート作成という意味では以下の本がシンプルで良いでしょう。3

最後に、Google Analyticsに関する本も紹介しておきます。正直Google Analyticsに関してはすぐに指標も変わりますので、書籍は概略を掴む程度で、後はひたすら実際に触って、ヘルプの解答をGoogle検索して、というのが良いでしょう。


  1. 連携方法を紹介していると煩雑になりますのでそこまではググッて下さい。そんなに難しくありません。

  2. 詳細を知りたければこちらもググると出てきます。

  3. 私はこの本を読んでから、色盲色弱への配慮として強調色をブルーに変えました。なかなか「私、色盲なんです」と自ら申告はして頂けないものです。特に赤はグレーと見分けがつかないことで有名で、強調色としていつまでも使うのは恥ずかしいことです。