各業界でのデータサイエンスの活用について調べてみた(随時追加)

仕事で、いろんな会社でデータサイエンスってどう使われているのですか?と聞かれることがあり、自分としてはなんとなくしか掴めていないな、知ったかぶりしたくないなと思うところがあったので、やや手厚くリサーチをしてみようと思いました。

2021/11/29の段階では8つの市場しかないですが、最終的には30市場を目指します。

【2021/11/27追記】
公開したところ、それなりにこの記事に関心を持ってくださった方が多かったようなので、少しずつ事例を埋めていこうと思います。

業界別にデータサイエンスの事例を集めてみる

・業界としては、市場規模マップの上位30の市場としてみる

事例の調べ方

各業界の売上1~2位の企業名とデータサイエンス系キーワードを掛け合わせGoogle検索ないしGoogle Scholar検索を行う。

  • Google検索を自動で行う。
    • 「かものはし製パン 機械学習」
    • 「かものはし製パン 人工知能」
    • 「かものはし製パン データサイエンス」
  • 30業界2社の3つのキーワードごとの検索結果上位30位を取得
    • 計5400の検索結果から求人などを除外
    • 不要なものを除外したリストから目視で精査、まとめ

検索自動化のソースコード

一応、Google Scholarの検索自動化のためのPythonコードを置いておきます。

総務省の白書に関してコメント

日本企業におけるデータ活用の現状」という総務省が出している2020年3月のアンケートに基づいたレポートがあるのですが、なかなか良い統計が載っていて、日本全体の会社におけるデータ活用度をある程度掴むことができると思いました。

どうやら大企業の半数近くは経営企画や製品企画、マーケティングにデータを活用していて、大企業の2割の企業で機械学習を用いたデータ活用を行なっており、大企業の5割の企業でデータ分析専門の部署があるようです。
データ分析が、かなり社会に浸透しているのだなと思われました。
そして、多くの企業の関心事がデータの質になってきているようです。データ分析で重要な観点にしっかり関心が高まっているのは良いことですね。

業界ごとの取り組み

以下では業界ごとに事例などをまとめていきます。結構長くなりそうです。

自動車・同附属品製造業

数理工学や群体数理、行動経済学など幅広い領域を研究対象としている。

  • シミュレーションを活用した制御ソフトの自動検証技術
    • サーチベーステスト(SBT):自律走行ロボットが充電ステーションへ帰還する際に、自己位置の推定に誤差が生じる課題を抱えていたが、SBTを用いることで推定誤差が生じる環境要件を特定してソフトの誤差80%減を実現していたりする。
  • 機械学習による性能テストの効率化
    • エンジンの燃焼に関するシミュレーションの実行時間の短縮を機械学習で行う。シミュレーションの効率化が積極的に行われている。
  • 歩行者保護性能の評価試験
    • ボンネットの設計効率化に向けて、CAE(computer-aided engineering)で構造解析を行う前に、ある程度の歩行者保護性能をAIで判定できるようにする取り組みが行われている。
  • Positive-confidence(Pconf)分類
    • アプローチとしては、正例の分布とその信頼度だけで、分類ミスによって生じる損失の期待値を最小化する手段。
    • ドライバーの心電情報から眠気を推定する際に用いた
  • 深層強化学習
    • 自動運転の際に、「ぶつからない」ことを学習する分散機械学習
  • 車内にカメラやマイク、脈拍センサーなどを置き、乗員の行動や会話、生体情報などを把握する開発
    • 自動運転車からデータを集めてAIで解析すると、人の行動や嗜好、健康状態、さらには感情まで推定
    • 感情エンジンを開発し、ドライバーの表情や声の調子からストレス状況を判断して安全運転をサポートしたり、ライフスタイルでの嗜好を学習して、状況に応じた選択肢を提案する。

建設

  • スマートハウス
    • 既存のIoT機器やWebサービス、建物内に設置するデータ収集サーバを連携し、個々の機器・サービスを統合するシステムを構築し、家電の遠隔操作や省エネアドバイスなどの生活サービスをユーザーの好みに応じてカスタマイズできるシステムや、音声認識による機器操作、情報配信等のサービスにつなげる。温度センサとエアコンや電動窓を連動し真夏の寝苦しさを解消するなども。
    • HEMS(Home Energy Management System)の規格のもと、IoTデバイスを起動させるケースが多い。音声認識を用いたアプリケーションや気象や様々なセンサーを基にした家電の最適化などが扱われる。
  • 施設内の映像解析
    • 施設内に設置したカメラ映像から利用者のマスク着用や施設内カフェテリアの混雑度を自動で検知する実証実験を行っている。モニターでリアルタイムの映像を確認できるが、個人情報保護の観点から人物はシルエット表示されないとのこと。なお、実証実験で利用するカメラ映像は2カ月間保存・利用し、期間終了後に消去する。
  • マンションにおける電力供給システムの最適化
    • 家庭向けの発電設備の稼働を、過去の電力使用データなどから最適制御を行い、遠隔でコントロールする。生活リズムごとに家庭をクラスタリングしている。
  • 在宅健康モニタリング
    • 在宅健康モニタリングと早期発見システム(Early Detection System = EDS) の推進に特化したプログラムを構築のために大学と共同研究

不動産

  • 不動産価格の算出のための機械学習システム
    • 所有マンションの推定成約価格を機械学習で算出して提示するシステムがWebサイトで提供されている。過去の制約事例のデータから予測している。
  • 賃料推定のための機械学習
    • 賃貸仲介データ等が少ない都心商業施設を対象に賃料を推定できるシステムが開発されている。
  • 間取りの検索システム
    • ユーザーに適した間取りの物件をレコメンドできるシステム。画像処理技術を間取りのデータに対して適用している。洋室や和室なども分類されている。

医療(医薬品の卸)

  • 機械学習を用いた、工場における医薬品の物流最適化(医薬品の卸の会社)
    • 商品(医薬品)の保管・払い出し・仕分けなどの作業を自動化する、ピッキングロボットを開発し、人間の2〜5倍の作業量をこなしている。
  • 医薬品の出荷予測
    • 過去数年分の医薬品の出荷データをもとにGCPで機械学習を行い、余剰在庫や欠品リスクを回避させようとしている。
  • 医薬品の配送の最適化
    • 医薬品の販売、物流、商品、需要トレンドのデータを用いて機械学習を行い、注文数や配送発生確率、納品時の滞在時間を予測できるようにした。

生命保険

  • 保障設計のレコメンドシステム
    • 保障設計予測モデルを構築し、顧客の意向に基づいて保障プランをレコメンドする。過去の大量なデータを用いて、保険において重視したい保障内容や保険料の予算をもとに、保障プランを自動生成。
  • 保険の保障見直しのためのレコメンドシステム
    • 未熟練な保険のプランナーの業務を支援するアプリケーション。年齢、性別、家族構成はもちろん、保険の保障設計書などのテキストも学習用データにしている。
  • Human in the loop
    • 機械学習システムは完璧なものではないので、人間の仕事を補助するなど、飛行機における管制システムのような存在として共存するという考え方。営業職員が多い生命保険会社では重要な観点。営業職員がベテラン層の営業職員と比肩するコンサルティングをより適切なタイミングで実施しやすくするリコメンド機能などがそれにあたる。
    • 最適な提案のタイミング、最適な活動レコメンド、最適な教材・資料探しなど、営業活動の支援のための分析に取り組む事例がそれなりになる。最適な顧客訪問、最適なメッセージなどを見つける。
  • 入院日数予測モデル
    • 保険加入時の健康状態(告知事項や健診結果など)と保険給付実績を分析し、加入時の健康状態から将来の生活習慣病における入院日数を予測するモデルを開発。このモデルを用いてリスクを評価できるようになり、これまで引き受けれなかった顧客からの申し込みを引き受けることが可能になった。
  • 営業の教育支援ツール
    • AIを相手にしたロールプレイング演習などを行い、新人の育成を支援するツールなどが作られている。
  • 保険の引き受け査定の自動化
    • 健康診断結果報告書や人間ドック成績表をもとに、OCRでデータを抽出し、それらのデータをもとに機械学習を用いて自動での医務査定を行えるように訓練。これまで2〜3日かかっていた査定業務が3分以内に完了するように。

    外食

    • 配送員向けアプリ
      • 機械学習を用いて、ベテラン配達員のデータから学習し、配送員にとって効率の良いルートを提案するアプリ。
    • 機械学習を用いたクーポン配布
      • 顧客ごとの来店確率を計算し、その確率が上位の顧客にクーポンを送付するという施策を試験的に展開している。コンバージョンレートが通常の3倍になったケースもあるとのこと。天候や気温などのデータとも連動しているとのこと。
    • 注文の需要予測
      • 過去の注文履歴を分析し、宅配需要を10分単位で予測したり、配達ルートの最適化を行う取り組み。フードロスを減らすこともモチベーションとしてある。
    • レコメンドとしてのデジタルメニュー
      • 顧客の登録情報や来店時刻や立地ないし季節・天候に応じて、客ごとにメニューが変わるようなレコメンデーションを試験導入しているとのこと。

      物流

      • 強化学習を用いた船舶の航路の最適化
        • 膨大な数の航海シミュレーションを通して、徐々に最適な避航行動を学習し、様々な状況下で安全性と経済性に優れた避航操船行動を選択できるプログラムの開発などが進められている。航路作成は人間だと3時間かかるらしい。
      • 画像解析による船舶の見張り支援システム(衝突回避のため)
        • 船上で撮影された映像に対して、サーバー上で画像を解析し機械学習を実施後、その物体との距離を求めてから、遠隔で船上ソフトウェアを更新することで、利用しながら認識率等の性能が向上する仕組み。
      • 船体の異常検知の自動化
        • IoTで航海データ・機関データを取得し、船舶の運航管理者が船舶の異常を検知できるように機械学習の導入を進めている。これまでは人間が24時間体制で管理していた。
      • 業務量の予測
        • 宅急便の拠点における、数ヶ月先の業務量を予測するため、機械学習モデルを毎月アップデートし、需要に応じた効率的な経営資源の最適配置とコスト適正化を推進することを目指している。
      • 作業員の業務日報のOCR
        • 紙の作業日報の情報のシステム入力を自動化するために、機械学習を用いたOCR技術を適用している。

      BtoC-EC

      • 商品の非構造化データを構造化データにする、あるいは商品情報の自動生成
        • 機械学習を用いて金融サービスを使って購買をしそうなユーザーを分類するモデルを作成し、予測スコアが一定以上のユーザーに介入するなどを行っている。
      • 潜在的に購買する可能性があるユーザーの推定
        • 機械学習(CNN、RNN)や自然言語処理をもちいて、商品から情報を抽出したり、レビューを分析したり、商品のカテゴリを分類したりしている。商品の画像のデータからカテゴリを予測するなども行われている。
      • 動画コンテンツの翻訳
        • アテンションの伴ったRNNでの機械学習を行い、中国語を英語に変換している。
      • 商品推薦システム・パーソナライズドクーポンアルゴリズム
        • 商品データ、購買履歴データ、閲覧履歴データを対象とし、古典的な相関ルール抽出、あるいはMatrix Factorizationを適用させたり、商品やユーザなどを固定長の Vector に変換
          して距離を計算するEmbeddingなども行い、RNNなどの深層学習アルゴリズムを適用している。
      • チャットボットによるサービス利便性の向上
        • ユーザーが知りたい問い合わせの多くにチャットボットが回答している。FAQを情報源としてNLPなどを用いてその中から一番近い答えを返している。
      • 多椀バンディットアルゴリズムを用いたABテストの最適化
        • T.B.A
      • 在庫数の最適化のための商品需要予測
        • T.B.A
      • 異常検知
        • T.B.A
      • 不正検知
        • T.B.A

      今さら”Recommendations as Treatments: Debiasing Learning and Evaluation”を読みソースコードを眺めるなど

      はじめに

      最近、『施策デザインのための機械学習入門〜データ分析技術のビジネス活用における正しい考え方』が流行っていると思いますが、私も少しずつ読んでいます。

      2019年ごろから勉強会などで知る機会のあったCountefactual Machine Learningですが、仕事で機械学習を使えば使うほどにその必要性を強く感じます。
      書籍は体系的にまとまっていて非常に良いのですが、せっかく関心を持ったのでその源流と思われる論文やソースコードを漁ってみようと思いました。

      今回、深ぼるのはこちらの論文です。
      Recommendations as Treatments: Debiasing Learning and Evaluation
      https://arxiv.org/abs/1602.05352

      情報を漁る

      arXivの方はAppendixついてなかったのでこちらの方がいいと思います。
      https://www.cs.cornell.edu/people/tj/publications/schnabel_etal_16b.pdf

      著者のスライドもありました。
      https://www.cs.cornell.edu/~schnabts/downloads/slides/schnabel2016mnar.pdf

      まずは読む

      以下に読んだ際のメモを箇条書きします。

      • レコメンドのデータは大体偏っている。偏ってアイテムの評価がされる。
      • レコメンドに因果推論のアプローチを適用する。
      • 傾向スコア(ランダムっぽさ)を用いた学習の重み付け
      • バイアスの最小化?のアプローチ
      • 行列分解による欠損値補完に対する重み付けをした。
      • 色々なデータで試した。
      • IPS(Inverse Propensity Score)で重み付けしたら誤差の不偏推定量を手に入れれる。
      • 評価方法はMAE(Mean Absolute Error)とかDCG(Discounted Cumulative Gain)など
      • 比較は一様に評価のデータが観察されると仮定したナイーブなモデルとで行う。
      • 行列分解の次元数dとか、正則化項のラムダはハイパーパラメータとして扱う。
      • 行列分解かつIPSで重みづけしたモデルはロバストに良い性能になった。

      既出の参考資料を読む

      ソースコード読む

      コーネル大学のサイトに論文のソースコードがあったので、そちらの解読を試みます。
      https://www.cs.cornell.edu/~schnabts/mnar/

      そんなにソースコードは多くなかったです。

      train.sh

      学習のバッチ処理

      train.py

      python ../bin/train.py –lambdas 0.008,25 –numdims 40 –ratings data/train.ascii –propensities data/propensities.ascii

      • コマンドライン引数たち
        • lambda:正則化パラメータ。デフォルトは’0.008,0.04,0.2,1,5,25,125′
        • numdims:行列分解の次元数。デフォルトは’5,10,20,40′
        • ratings:訓練用データの指定を行う(ASCII formatの行列)
        • propensities:傾向スコアのデータの指定を行う(ASCII formatの行列)
        • metric:デフォルトは’MSE’、MAEかMSEを選べる

      MetricsのMSE/MAE関数を呼び出し、
      Expt3のlearn関数を使って学習を実行する。

      Metrics.py

      • MSE関数
        • ITEMWISE_METRICSを呼び出している
      • MAE関数
        • ITEMWISE_METRICSを呼び出している
      • ITEMWISE_METRICS関数
        • MSEかMAEかでnumpyのデータの形式を指定している。
        • SET_PROPENSITIES関数を呼び出している
        • 観測された評価と予測した評価の差分にIPWを掛け、観測誤差とする
        • 累積の観測誤差を出す
        • IPWの合計値で累積の観測誤差を割ったglobalNormalizerを計算して返す
        • ユーザー単位での観測誤差の推定値をユーザー数で割ったuserNormalizedMetricを計算して返す
        • アイテム単位での観測誤差の推定値をアイテム数で割ったitemNormalizedMetricを計算して返す
      • SET_PROPENSITIES関数
        • IPWがあればそれを使い、ない場合は出現割合を返している
        • 観察されたデータを考慮して補間を行う(numpy.ma.arrayのmask)

      Expt3.py

      Expt2のINIT_PARAMS、MF_TRAIN、FINAL_TRAINを実行する
      MFのPREDICTED_SCORESを実行する

      • 処理の流れ
        • もろもろの引数で学習の際の設定を受け取り
        • 傾向スコアの逆数からIPWを計算し
        • そのスコアを学習用データで補間し
        • ランダムに並び替える
        • 4-foldsでのクロスバリデーションを行う
        • 学習を並列処理を行う
        • 予測スコアから一番いいスコアのモデルを選ぶ
        • 行列分解での機械学習を行う
        • 行列分解での予測値を計算する
        • 予測結果を返す

      Expt2.py

      MFのGENERATE_MATRIX、PREDICTED_SCORESを実行

      • MF_TRAIN関数
        • IPWを受け取って、上限下限などを調整
        • それをMFのGENERATE_MATRIX関数に適用
      • FINAL_TRAIN関数
        • MF_TRAIN関数と似たような処理
        • 交差検証してベストだったパラメータに適用する想定
      • INIT_PARAMS関数
        • 評価行列の欠損値を補間している
        • 行列特異値分解を行っている
        • その結果をstartTuple(初期値)として与えている

      MF.py

      • PREDICTED_SCORES関数
        • バイアスがあるかどうかで分岐
        • バイアスがあれば、元のスコアにユーザーのバイアス、アイテムのバイアス、グローバルなバイアスを足し合わせる
        • バイアスがなければそのまま返す
      • GENERATE_MATRIX関数
        • 指標がMSEかMAEかで分岐
        • MetricsのSET_PROPENSITIES関数を実行
        • ユーザー単位での標準化やアイテム単位での標準化、全体での標準化のための計算をする
        • 標準化の方法で分岐、傾向スコアを標準化する
        • バイアスのモードで分岐
        • 学習のための初期値としてのデータを設定
        • 目的関数の最適化(最小化)を行う
        • その結果を返す
      • Mat2Vec関数
        • 行列をパラメータのベクトルにする
      • Vec2Mat関数
        • パラメータベクトルを入力する
        • ユーザーベクトル、アイテムベクトル、ユーザーバイアス、アイテムバイアス、グルーバルバイアスを返す

      test.sh

      テストのバッチ処理

      test.py

      python ../bin/test.py –test data/test.ascii –completed completed_ratings.ascii

      • コマンドライン引数たち
        • test:テスト用の評価データを指定する(ASCII formatの行列)
        • completed:評価を埋めたい行列のファイル名を指定

      MSEやらMAEの結果を返す。

      所感

      まず論文の内容ですが、大体のビジネスデータはRCTな状況で生み出されたものではないので、偏って観測されるのは当然ですが、その結果としてレコメンドのアルゴリズムの性能が落ちてしまうということが論文に記されていました。性能を落とさないためにも、傾向スコアを用いた重み付けによる機械学習が大事に思いました。ただ、傾向スコアの推定自体の精度も大事に思われるので、銀の弾丸ではないですが、バイアスから抜け出るヒントをいただけたという気持ちです。
      そして、思ったよりもソースコードが長いと思ったのと、普段あまり使わないNumpyの関数を知ることができたのもよかったです。
      理論の理解だけでなく、それを実現するためのソースコードを眺めるのも大事ですね。今後も論文をただ読むだけでなくソースコードの海に飛び込んでみようと思います。

      参考リンク

      numpy.reciprocal
      maskedarray.generic
      numpy.ma.getmask
      numpy.clip
      scipy.sparse.linalg.svds
      numpy.ma.filled
      scipy.optimize.minimize

      警察庁オープンデータの前処理と死亡事故発生予測のための機械学習について

      はじめに

      先日、近所の幹線道路の信号付き横断歩道を横断しようとした際に、2メートルほど先で回避不能な速度で車が赤信号を無視して横断歩道を突っ切きるという非常に恐ろしいイベントに遭遇しました。
      そこで、私は「このイベント、何回かあったら死亡事故が起きるぞ」と思いました。警察署に近隣道路の不満について電話をしてみたのですが、「警察もちゃんと考えて取り締まっていたり対策してますので」と言われ、何の成果も獲れない電話となりました。
      そのようなモヤモヤの中、私は民間でできることは「客観的なデータでもって、エリア、曜日、天候、時間帯ごとの、死亡事故のリスクを見積もり、それを公開して注意喚起していくこと」なのではないかと思うに至りました。
      よって、警察庁が公開している交通事故のオープンデータについて、その前処理と機械学習によるエリアの死亡事故の発生予測などについて記していきます。

      前処理のためのデータやコードはこちらのGitHubにあります。
      https://github.com/KamonohashiPerry/traffic_accident_analysis
      スターを10個以上いただけて、データ作って良かったなと思いました。

      目次

      ・データについて
      ・先行研究について
      ・前処理について
      ・EDAからわかること
      ・機械学習
      ・さいごに

      データについて

      2019年と2020年の交通事故に関するデータが警察庁よりオープンデータとして公開されています。
      オープンデータ 2020年(令和2年)
      オープンデータ 2019年(平成31年/令和元年)

      どのようなデータかというと、
      それぞれ2019年と2020年の間に発生した全国の事故について、発生した状況(時、場所、天候)やその結果に関するデータからなり、項目の数としては58個とオープンデータとしてはかなり豊富な情報量となっています。

      データは本票、補充票、高速票の3つからなるのですが、今回は本票だけを用います。
      高速道路の精緻な分析をしようと思うと、高速票を繋ぐ必要がありますが、私の目的は一般道にあるので、繋がないものとします。

      先行研究について

      事故の予測に関する先行研究

      交通事故の分析に関する研究は以下のものがあり、参考にしました。
      死亡事故を予測するという問題設定として、その特徴量としては場所、時間帯、曜日、場所かつ時間、場所かつ曜日かつ時間、天候、季節、風速・風向き、車線の数、歩道の有無、制限速度などを用いていることがわかりました。
      そして、データをクラスタリングするためにDBSCANを用いたり、不均衡データであることから、アンダーサンプリングを行ったりしているようです。
      最後に、アルゴリズムはSVMやロジスティック回帰、深層学習と色々と使われているようです。

      ・Live Prediction of Traffic Accident Risks Using Machine Learning and Google Maps

      ・Data-Driven Urban TrafficAccidentAnalysis and Prediction Using
      Logit and Machine Learning-Based Pattern Recognition Models

      ・A Deep Learning Approach for Detecting Traffic
      Accidents from Social Media Data

      ・A BASIC STUDY ON TRAFFIC ACCIDENT DATA ANALYSIS USING
      SUPPORT VECTOR MACHINE

      ・Predicting Crash Injury Severity with Machine Learning Algorithm Synergized with Clustering Technique: A Promising Protocol

      ・Comparison Analysis of Tree Based and Ensembled Regression Algorithms for Traffic
      Accident Severity Prediction

      その他

      ・Taxi Demand Prediction System

      ・2019年04月号トピックス 警察庁のオープンデータを活用した独自AIによる犯罪発生予測

      前処理について

      ソースコードに関しては、GitHubに上げておりますので、
      .pyなら
      https://github.com/KamonohashiPerry/traffic_accident_analysis/blob/main/src/preprocess.py
      https://github.com/KamonohashiPerry/traffic_accident_analysis/blob/main/src/preprocess_second.py

      .ipynbなら
      https://github.com/KamonohashiPerry/traffic_accident_analysis/blob/main/Traffic_Accident_Analysis.ipynb
      を参照ください。

      基本方針

      ・天候、時間帯、曜日、平日、道路の形状、スピード制限など、事故の結果(死亡の有無)を明らかに予測できそうなもの以外を特徴量にします。
      ・メッシュ単位での過去の事故に関する情報に関する特徴量の作成(学習を行う時点よりも過去の時点のデータのみ利用)

      詳細

      ・事故の発生日時のdatetime化(列で年・月・日・時・分が分かれているため)
      ・マスタ情報(PDF)をもとにマスタのIDを名前に変換
      ・緯度経度のデータについて、度分秒から度への変換を行い、3次メッシュ(1km四方)のデータを作成
      ・メッシュ単位での特徴量として、過去の事故発生件数、死亡数などを集計
      ・メッシュ単位での特徴量として、過去に発生した事故に関するもろもろのデータの集計(そのメッシュで事故を起こした平均年齢や事故が発生してきた時間帯など)
      ・もろもろの変数のダミー変数化

      EDAからわかること

      EDAに関しては.ipynbのみで行っております。
      https://github.com/KamonohashiPerry/traffic_accident_analysis/blob/main/Traffic_Accident_Analysis.ipynb

      私がよく分析で使うのは、データの該当件数とカテゴリごとの率の可視化なのですが、以下の図の見方としては、青の棒グラフが各カテゴリの件数、赤の折れ線グラフが死亡率となっています。

      都道府県


      福井県、鳥取県、秋田県、島根県、岩手県などは死亡率が高そうです。

      道路種別


      農道(815件)や林道(88件)で起きる事故非常に死亡率が高くなるようです。

      時間帯


      夜間や明け方は死亡率が高くなるようです。

      天候


      霧の天候(294件)では死亡率が高くなるようです。

      人口密集地かどうか


      市街地ではないところでは死亡率が高くなるようです。

      道路の形状


      踏切-第一種(254件)はかなり死亡率が高くなるようです。カーブも死亡率が高くなります。そういえば実家の近くにも魔のカーブと呼ばれるところはありますし、事故も起きていました。

      信号機のタイプ


      点滅-3灯式(2566件)や点灯-押ボタン式(7703件)は死亡率が高いようです。

      道路の幅


      大きな交差点では死亡率が高い傾向にあります。単路に関しては一様な傾向ではないですが、小さい方が死亡率が高そうです。

      道路の区切り


      道路の区切りがペイントだけのケースは、中央分離帯がある場合よりも死亡率が高い傾向にあります。あと、中央線がポストコーン(チンアナゴみたいなやつ)だと死亡率が上がるようです。

      歩道との区別


      道路について歩道との区分がない場合に死亡率が高くなるようです。

      速度制限


      速度域が高くなるにつれ、死亡率が高くなるようです。あと、速度規制がされていないところも高くなっています。

      曜日


      土日の死亡率が高い。

      祝日・その前日


      祝日とその前日の死亡率は高い傾向にある。

      以上のことから、得られた考察としては、
      ・土日や祝前日の道路はいつもより危ない
      ・夜間や明け方の道路は危ない
      ・制限速度の高い道路は危ない
      ・大きな交差点は危ない
      ・点滅信号は危ない
      ・カーブは危ない
      ・霧は危ない
      でした。普段、出歩く際に意識しておくといいと思います。

      機械学習

      教師データを事故発生からの死亡有無(1or0)、特徴量を先行研究を参考にオープンデータから作れるものとして、
      基本的には、LightGBMでの学習、ハイパーパラメータ探索、モデルの訓練(メッシュ番号でグループ化したクロスバリデーション)、テストデータ(学習は2020年11月まで、テストは2020年12月以降としている)での予測、日本地図への可視化を行っています。

      ソースコードはGitHubに上げてあるので、ここでは記しません。

      .pyなら(学習のみ)
      https://github.com/KamonohashiPerry/traffic_accident_analysis/blob/main/src/train_model.py

      .ipynbなら(学習だけでなく、予測と日本地図への可視化もしている)
      https://github.com/KamonohashiPerry/traffic_accident_analysis/blob/main/Traffic_Accident_Analysis.ipynb

      10-foldのCVをメッシュ番号でグループ化して学習させた際のAUCです。高い部類に入りますが、今回は不均衡データなので、抜群に当たっている感じではないです。


      事故の死亡率は、0.9%なので、この予測の場合、2.2%が死亡すると当てれているということになります。また、予測から、全体の72%の死亡事故を当てているという結果です。
      この性能に関しては今後、もっと高めていく余地はいくらでもあると思います。

      こちらは、テストデータでの予測スコアの階級値(青い棒グラフ)と実際の死亡率(赤い線グラフ)を示したものです。スコアが高いものは信じてもいいかなぁと思いました。

      特徴量重要度の上位10件は以下の通りです。

      時間帯とか、防護策とか、信号機のタイプとか、市街地かどうかなどが予測に役立っているようです。

      死亡事故発生を予測した確率を日本地図の関東エリアにプロットしたものが以下の図になります。

      市街地のほうが死亡事故が起きやすいように見えますね。

      東京都だけに絞ってみましたが、危険なエリアは都心に点在はしていますが、郊外のほうが死亡率が高そうです。

      さいごに

      交通事故にあいかけて、その怒りの感情を警察庁のデータにぶつけてみましたが、死亡事故が起きやすい条件などがある程度見えてきたと思いました。もちろん、なんとなく思っていた傾向もあったのですが、数字でハッキリと出せるのは良いですね。今後、旅行などをする際に、確率の高いエリアを警戒して行動するようにしたいです。
      そして、地図への可視化は普段の仕事でほとんど行わないのですが、こうしてデータに触れて可視化の練習ができたのも有意義に思いました。
      この警察庁のデータは分析するまでに工数がかかるデータとも言えるので、この記事をとっかかりとして、オープンデータの分析に挑戦して安全な生活を送る上での知見をシェアしていけると良いな、というか民間としてはこれくらいしかできないなと思っています。

      参考情報

      ・[第3版]Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)
      ・Pythonでプロットした地図を出力する
      ・Pythonで度と度分秒を相互に変換する

      Bias Correction For Paid Search In Media Mix Modeling[A4一枚まで備忘録]

      A4用紙1枚にまとめるイメージでメモを残そうという取り組みです。
      今回は2018年のGoogleのMedia Mix Modeling(マーケティング・ミックス・モデリング)に関する論文です。Bias Correction For Paid Search In Media Mix Modeling前回と違い、因果推論の観点で考察などが書かれています。前回のものがモデリングのテクニカルな側面を描いたものとすると、今回はテクニカルな話は置いておいて、因果関係について様々なケーススタディを扱うというものとなります。

      目次

      Abstract
      1.Introduction and problem description
      2.Related work
      3.Preliminary to Pearl’s causal theory
      4.Methodology
      5.Implementation
      6.Case studies in simple scenarios
      7.Case study with complex scenario
      8.Discussion

      Abstract

      バイアスを回避するようなMedia Mix Modeling(以下、MMM)のモデルの推定について、バックドア基準に基づき、因果ダイアグラムを用いたアプローチをする。
      ランダム化実験の結果との比較をすることで推定のバイアスについて考察を行なっている。
      シンプルなモデルなら大丈夫だが、複雑なMMMのモデルに関しては不偏推定量は得られていないらしい。

      1.Introduction and problem description

      ・MMMの歴史は長く、1964年のBordenの研究に始まるらしい。
      ・Fortune500にいるような色々な企業がMMMを試してきたが、課題が色々(データ収集、セレクションバイアス、広告の長期効果、季節性、ファネル効果など)ある。
      ・ターゲットとしているユーザー群の需要や関心が高まっているとき、広告支出と売上は共に伸びるので、セレクションバイアスが発生する。(実際のところ、儲かっているから広告を打つという場合がありうる。)
      ・この論文ではMMMにおける検索広告のセレクションバイアスについて扱う。Pearl流の因果推論のアプローチに従い、バックドア基準を満たすようなMMMの推定を行う。
      ・実験結果と照らし合わせて、不偏推定量がもとまることがわかった。(検索広告に関してだが。)

      2.Related work

      広告効果の検証などは以下の3つの研究がなされているとのこと。
      ・1.ユーザー単位のデータを利用して広告を触れたか触れていないかを比較する。傾向スコアなどを計算してマッチングや共変量の調整などを行う。
      ・2.キャンペーン単位で集計したデータを用いたアプローチで、KPIに関してキャンペーンを打たなかった場合の反事実との比較を行う。
      ・3.クエリ単位でオーガニック検索とペイド検索をランダムに出し分けてその増分を推定する方法。

      この論文で扱うMMMは2つ目のアプローチに近い。違いとしては複数のメディアのキャンペーンを扱うこと。

      なお、回帰不連続デザインを用いたケースなどの研究もあるそうな。

      3.Preliminary to Pearl’s causal theory

      以下のようなDAGを考える。

      ・Aはクエリに関するGoogle広告のオークション
      ・Qはユーザーの検索するクエリ
      ・Pはペイド広告でのインプレッション
      ・Oはオーガニック検索結果
      ・Yは売上

      ようは、 Qが与えられたもとでOが決まり、QとAに影響を受けPが決まり、OとPによってYが決まると言う構図となります。
      MMMにおいて広告効果を測るために因果ダイアグラムを理解することは大事と書かれています。
      ここではPearl流の因果推論のフレームワークが紹介されています。
      $$ X_i = f_i(pa_{i} , \epsilon_i) $$
      \( X_i \)は子を表し、\( pa_{i} \)は親を表します。なお、\( f_i \)は関数、\( \epsilon_i \)は任意に決まるランダムな項で他の変数と独立するものとしています。

      「因果効果の定義」
      二つの変数XとYについて、XのYにおける因果効果は\( Pr(y | \check{x} ) \)で表現できる。Xがxとして与えられたもとで、\( X_i = f_i(pa_{i} , \epsilon_i) \)を解くことで\( Y=y \)の確率を計算できる。ここでの\( \check{x} \)はXをxに設定するという介入を意味している。

      「識別性」
      ダイアグラムで互換性のある、観測された変数の正の確率から、\( Pr(y | \check{x} ) \)を一意に計算することができるのであれば、XのYにおける因果効果は識別可能となる。

      「d-分離」
      因果ダイアグラムの二つのノードの間のパスについて、以下の二つの条件のいずれかが満たされる場合についてZノードによって分離されている、あるいはブロックされていると表現する。
      ・1.\( m \in Z \)として、そのパスが「\( i \to m \to j \)」あるいは、「\( i \gets m \to j \)」を含んでいる。
      ・2.\( m \notin Z \)として、mがZに依存しないものとして、そのパスが「\( i \to m \gets j \)」を含んでいる。

      「バックドア基準」
      ダイアグラムにおいて以下の二つを満たす場合、変数Zはバックドア基準を満たす。
      ・1.変数ZのノードがXの子孫でない。(Xの共変量を除外することに関する基準)
      ・2.変数ZがXとY(Xへの矢印を含んだもの)の間の全てのパスをブロックしている。(交絡因子の適切な集合をZが含んでいるための基準)

      もし、変数Zのバックドア基準が満たされるのであれば、XのYにおける因果効果は以下のように表現することができる。つまりZでXのYにおける因果効果を計算できる。
      $$ Pr(Y | \check{x}) = \sum_{z} Pr(Y | x, z) Pr(z) $$

      図を再掲しますが、ここでペイド広告の売上への因果効果を知りたいとします。

      その場合、QはPの子孫のYを持たないため、バックドア基準の1つ目を満たし、「\( P \gets Q \to O \to Y \)」であることからd分離の条件の1つ目を満たすことからバックドア基準の2つ目を満たす。
      つまり、バックドア基準を満たすことから、検索クエリを使うことでペイド広告の売上への因果効果を測れることになります。

      Pearl流の因果推論のフレームワークの3つの課題
      ・1.因果ダイアグラムをどう構築するのか?
      ・2.全ての必要な変数を正確に観測、計測することができるのか?
      ・3.識別が可能だとして、有限であるサンプルサイズにおいて、\( Pr(Y | X, Z) \)の関数系はどうなるか?

      広告まわりのデータは潤沢にデータがあるわけではないし計測できないものもあるため、どの課題も無視できない。

      4.Methodology

      「シンプルなシナリオ」
      売上への他のメディアの貢献は無視できるものとして、広告のみをチャネルとして想定する。

      $$Y_{t}=\beta_0 + \beta_1 X_t + \epsilon_t$$

      \( X_t \)はあるプロダクトの検索広告の支出、\( Y_t \)はあるプロダクトの売上。\( \beta_1 \)は広告の売り上げにもたらす効果でROASと呼ばれる、\( \epsilon_t \)は\( X_t \)では説明づけることができなかった売上への影響を指す。計量経済学などで問題として扱われる内生性はこの\( \epsilon_t \)と\( X_t \)の相関によって起きる。

      実際に、\( \epsilon \)がXと相関するとして式を変形すれば、不偏推定ができないことがわかります。

      ここで、潜在的にプロダクトの売上に影響を与える検索クエリを集約した\(V\)という統計量を考えます。
      誤差項\( \epsilon \)が以下のように、オーガニックサーチによる影響(\( \epsilon_1 \))と経済要因(\( \epsilon_0 \))によるものからなるとします。

      $$ \epsilon = \epsilon_0 + \epsilon_1 $$

      ここで、
      $$ \epsilon_1 \perp X | V $$

      $$ \epsilon_0 \perp X | V $$
      を満たすようなVを見つけることができれば、因果効果を測れることになります。


      ※想定1:検索広告の予算はないとする。
      ※想定2:検索クエリで条件付けした際に、広告主の入札や競合の行動の影響は無視できる。

      理論1
      ペイド広告ついて上の図を想定した際に、XとY(sales)が完全に相関していないならば、正則化条件のもとで、検索広告のROAS(\( \beta_1 \))を推定することができる。

      $$Y = \beta_0 + \beta_1 X + f(V) + \eta$$

      ここで\( f(\cdot) \)は未知の関数、\( \eta\)はXや\(f(V)\)と相関しない残差とします。

      上の図において、変数ZのノードがXの子孫でないというバックドア基準の一つ目はクリアしていることは明らかで、d分離の観点に関しても一つ目を満たしているためブロックしているため、バックドア基準の二つ目もクリアしている。

      $$ E(Y | X, V) = \beta_0 + \beta_1 X + E(\epsilon | X, V)$$

      Vで条件付けるとXは誤差項と直交することから、
      $$E(\epsilon|X,V)=E(\epsilon|V)$$
      となり、
      $$ E(Y | X, V) = \beta_0 + \beta_1 X + f(V) $$
      と表すことができる。
      この式で回帰分析をすることでROASである\(\beta_1\)を推定することができる。

      「複雑なシナリオ」
      ここでは検索広告以外(\( X_2 \))も売上に影響を与えるというケースを扱っています。

      まず、予算に関して検索広告と検索広告以外の広告(\( X_2 \))の両方に制約がある場合を考えます。以下の図が、今回のダイアグラムですが、先程の図に予算が追加されていることがわかります。

      なお、ここでは広告のヒストリカルな影響などの複雑さは考慮していません。

      一方で、予算が検索広告に関しては制約となっていないケースだと以下のダイアグラムになります。

      理論2
      1.広告予算が検索広告に制約を設けているケースで、広告のラグ効果が無視できるとして、もし\(X_1\)が\(V\)や\(X_2\)と完全に相関しておらず、正則化条件を満たすなら検索広告のROAS(\( \beta_1 \))は以下の回帰モデルで推定することができる。

      $$ Y = \beta_0 + \beta_1 X_1 + f(V, X_2) + \eta$$
      ここで

      $$f(v, x_2) = E(\epsilon_0 | V = v, X_2 = x_2) + E(\epsilon_1 | V = v) + E(\epsilon_2 | X_2 = x_2)$$

      となり、\( \eta\)は残差で\(X_1\)と\(f(V,X_2)\)と相関しない。

      ダイアグラムを再掲します。

      2.広告予算が検索広告に制約を設けていないケースで、正則化条件を満たすなら検索広告のROAS(\( \beta_1 \))は以下の回帰モデルで推定することができる。

      $$Y = \beta_0 + \beta_1 X_1 + f(V) + \eta$$
      ここでfは未知の関数とする。

      ダイアグラムを再掲します。

      以上、因果ダイアグラムを描き、バックドア基準を満たしバイアスのないパラメータ推定をするということが書かれていました。

      ここではシンプルに特定の広告の効果を見ていましたが、MMMにおいては複数のメディアの効果を求めなければならないです。

      考えられるアプローチとしては、最初にバイアス補正を行い\( X_1 \)の影響を推定し、それを使って\( X_2 \)を推定するというもの。

      5.Implementation

      ・検索クエリのデータの集計の仕方
      ・STEP1:広告主と競合のサイトを識別する。
      ・STEP2:特定のエリアで自然検索でURLが見つかる回数をカウントする。
      ・STEP3:クエリを3つのグループに分類。おのおの閾値を設ける。
      ・STEP4:クエリをグループごとに分けたものを推定の際に誤差項と直交するものとして扱う。(閾値は50%がいいらしい。)
      ・TBA

      6.Case studies in simple scenarios

      ・ナイーブな推定手法では過大に効果を推定していることがわかった。
      ・需要による調整だけではバイアスを十分にとりきれないことがわかった。
      ・SBC(search bias correction)の手法によりROASがランダム化実験の結果に近くなった。
      ・TBA

      7.Case study with complex scenario

      ・TBA
      ・TBA
      ・TBA

      8.Discussion

      ・TBA
      ・TBA
      ・TBA

      DAG描くのに使ったコード

      DAG_draw.ipynb

      [PRの巻]RユーザのためのRStudio[実践]入門(改訂2版)

      今回はご献本PRの巻です。お題はこちらの本、『改訂2版 RユーザのためのRStudio[実践]入門〜tidyverseによるモダンな分析フローの世界』です。

      リアルでもバーチャルでも大変お世話になっているy__mattuさんより、ありがたく献本いただけました。どうやら、今回の改訂では56ページほどページ数が増えているようです。

      目次やら詳細は技術評論者のページをご覧ください。

      端的に言うと、データ分析でR言語を使ったことがあるユーザーで、Rの比較的新しいライブラリの使い方を知りたい方、RStudioを使って生産性高く分析をしたい方にピッタリの本です。データ収集・前処理・可視化・レポーティングを学ぶことができます。

      元よりこの本のユーザーであったことから、これまで色々なマーケター・エンジニアにこの本を勧めてきました。

      社内にデータ分析に関心のある人が一定数いて、そのような人にR言語を勧める際にこの本はちょうど良いと思っています。
      この本は、統計学や機械学習などについて触れてはいないですが、データ分析のほとんどの工程は前処理や可視化ですし、それを行えずして統計学も機械学習も成し遂げることはできないので、現実を知ってもらう上でも良い本です。
      この本で自由自在に前処理・EDAができるようになったら、統計学や機械学習について書かれたR言語の本をやるように伝えています。

      ここでは、初めてこの本を手に取る方、1版をすでにお持ちの方のそれぞれのお気持ちになって見どころを述べていきます。

      • 初めてこの本を手に取る方
        • 見どころ1
          RStudioの画面の説明やショートカットの説明などが丁寧で、最初の段階で生産性の高いコーディングのための準備が捗る。
        • 見どころ2
          Webスクレイピングにしっかりと章が割かれている。
          データ分析を学ぶに際して、多くのケースで手元にデータがなかったり、関心のあるデータが表形式で提供されていなかったりします。そのため、Webスクレイピングをしっかりと学べるのはデータ分析を自分でやっていくために不可欠な技術だろうと思います。
        • 見どころ3
        • モダンなR言語のツール、dplyr・tidyr・ggplot2・rmarkdownなどについて学ぶことができます。前処理して可視化してレポートするという一連の操作をこの本で学ぶことができます。

      • 1版をすでにお持ちの方
        • 見どころ1
          stringrやlubridateなどのライブラリの使い方についてAppendixで40ページ以上が割かれています。RやPythonを行ったり来たりする生活をしていると忘れがちなので、充実のAppendixは嬉しいと思います。stringrは何が出来たっけ?てなりますし、lubridateも非常にしばしば忘れる気がします。
        • 見どころ2
          tidyrの記述が増えていました。Pythonに浮気をしていると、Rのモダンな書き方に付いていけなくなるかもしれないので、こういった本でキャッチアップできるのは良いことに思います。

      1版を会社のデスクに置いたまんまにしているので、今度しっかり比較して追記しようと思います。

      Bayesian Methods for Media Mix Modeling with Carryover and Shape Effects[A4一枚まで備忘録]

      A4用紙1枚にまとめるイメージでメモを残そうという取り組みです。

      今回はメディアミックスモデリングに関して仕事があった際に参照できるメモの一つとして残します。
      先日、Python/STAN Implementation of Multiplicative Marketing Mix Modelに参考文献としてBayesian Methods for Media Mix Modeling with Carryover and Shape Effectsの存在を知りました。時系列の重回帰の一種じゃないかと思っていたんですが、天下のGoogle様がどのようにマーケティングの成果を測ろうとしているのか、この論文から知ってみようと思います。

      ちなみに、Python/STAN Implementation of Multiplicative Marketing Mix Modelの写経したものはMarketingMixModelingに残しています。

      このコードでマーケティングにおけるチャネルごとのROAS(Return On Advertising Spend)を推定することができます。

      以下の図はコードを回すことで得られるものですが、チャネルごとのROASの事後分布となります。

      この図もコードを回すことで得られるものですが、広告などの支出に関する売上の関数をフィットしたものになります。精度高くこれらの関数を求めれば、過剰に広告に投資している可能性のあるチャネルを見つけることが可能になります。

      目次

      Abstract
      Introduction
      Model Specification
      Estimating the Bayesian Model
      Attribution Metrics and Optimal Media Mix
      Application to a Simulated Data Set
      Impact of Sample Size on Estimation Accuracy
      Choice of Priors
      Application to Real Data and Model Selection
      Conclusion

      Abstract

      ROASやmROASに関するアトリビューション分析をベイズモデリングで行い、事後分布から効果を推定している。
      広告関連のデータが、売上などに対して、数ヶ月後に遅れて効果が現れるキャリーオーバー効果の想定、支出を増やしても効果がなくなる収獲低減の想定などをモデルに置いている。
      モデルの識別に関してはBICを評価基準として用いている。

      Introduction

      • Media mix models(MMM)はメディア支出が売上にどのように影響を与えるのかを理解するために、最適なメディア投資を行うための支出の配分を決めるために使われる。
      • 扱うデータとしては売上、物価、プロダクトの分布、様々なメディアの支出、マクロ経済や天候、季節性、競合の情報などの外部要因が含まれる。
      • RCTが難しいため、あるいは傾向スコアなどのモデリングもデータが少なく難しいため、回帰分析が行われることが多い。
      • 線形回帰だと、広告がサチっている効果(広告が飽和している状態)や収獲低減の効果も表現できない。
      • 広告にはキャリーオーバー効果と言って、売上への効果が遅れて現れるという可能性が広く信じられている。
      • 事前分布に広告に関する様々なノウハウを反映させることで、データ数に比して推定するパラメータの数が多い分析に向きあう。

      Model Specification

      • モデル構築には週次データが使われるケースが多い。
      • 売上のデータ、メディア支出のデータ、コントロール変数として売上と関係してそうなデータが扱われる。コントロール変数は業界によって異なる。
      • キャリーオーバー効果
        $$ adstock(x_{t-L+1, m}, \dots, x_{t, m} ; w_{m} ,L) = \frac{\sum_{t=0}^{L-1} w_m(l) x_{t-l, m} }{\sum_{l=0}^{L-1} w_m(l)} $$

        \( w_m(l) \)は非負のウェイトでラグ期間の関数になっている。
        \( L \)はキャリーオーバー効果の最大期間。
        \( x_{t, m} \)はある期間のあるメディアへの支出。
        論文ではL=13とされている。
        ウェイトの関数について、メディアの売上に対する効果は徐々に減っていくが、効果が遅れて生じることもあるので、効果のピークをずらした表現も扱われている。
        ウェイトの関数で最初にピークがくる場合、

        $$ w_{m}^{g} (l; \alpha_{m}) = \alpha_{m}^{l}, \\ l = 0, \dots, L-1 , \\ 0 < \alpha_m < 1 $$

        ウェイトの関数で遅れてピークがくる場合、

        $$ w_{m}^{d} (l; \alpha_{m}, \theta_m) = \alpha_{m}^{(l – \theta)^2}, \\ l = 0, \dots, L-1 , \\ 0 < \alpha_m < 1 ,\\ 0 \leq \theta_m \leq L -1 $$

        となる。
        \( \alpha_m \)はメディアの効果の、ある期から次の期への維持率。
        \( \theta_m \)は遅れてピークが現れる程度に関するパラメータ。

      • 形状効果
        $$Hill(x_{t,m};\mathcal{K}_m, \mathcal{S}_m) = \frac{1}{1+ \left (
        \frac{x_{t, m}}{\mathcal{K}_m} \right )^{- \mathcal{S}_m} }, \\ x_{t, m} \geq 0 $$

        \( x_{t, m} \)はある期間のあるメディアへの支出。
        \( \mathcal{S}_m \)は形状に関するパラメータで傾きに関わるもの。
        \( \mathcal{K}_m \)は形状に関するパラメータでサチるポイントに関わるもの。
        分子に\( \mathcal{K}_m ^{\mathcal{S}_m} \)を足して引くことで、

        $$ \beta_{m} Hill_{m} (x_{t, m}) = \beta_{m} – \frac{\mathcal{K}_m^{\mathcal{S}_m}\beta_{m}}{x_{t,m}^{\mathcal{S}_m}+\mathcal{K}_m^{\mathcal{S}_m}} $$

        に変換できる。
        なお、\( \beta_m \)は各メディアの回帰係数となる。これでもって各メディア支出の売上に対する効果を見れる。パラメータの大きさによって様々な形状をとりうる。

      • キャリーオーバー効果と形状効果をモデルで一緒に表現する。
        シンプルにするためにメディア間のシナジー効果を無視している。

        $$ y_t = \tau + \sum_{m=1}^{M} \beta_m Hill(x_{t, m }^{*}; \mathcal{K}_m,\mathcal{S}_m) + \sum_{c=1}^{C} \gamma_{c}z_{t, c} + \epsilon_t $$

        \( y_t \)は売上。
        \( x_{t, m }^{*} = adstock(x_{t-L+1, m}, \dots, x_{t, m} ; w_{m}, L) \)は前述の広告支出のキャリーオーバー効果を表現したもの。
        \( \tau \)は広告支出によらないベースラインの売上。
        \( z_{t,c} \)はコントロール変数。
        \( \gamma_c \)はコントロール変数の係数。
        \( \epsilon_t \)はホワイトノイズ。

      Estimating the Bayesian Model

      • 階層ベイズに拡張することもできる。
      • ハイパーパラメータはメディアの効果が非負であるとか、割合は0から1だとか色々と事前情報として設定する。

      Attribution Metrics and Optimal Media Mix

      • 経路ごとのROSAやmROASを計算してメディアの最適化をしたい。
      • メディアに投資することでの予測売上と、投資なかった場合の売上の差分でもって成果を測る。
      • ROASの定義式
        $$ ROAS_{m} = \frac{\sum_{t_{0} \leq t \leq t_{1} + L – 1 } \hat Y_{t}^{m} (x_{t-L+1, m}, \dots, x_{t, m}; \Phi) – \hat Y_{t}^{m} (\tilde{x}_{t-L+1, m}, \dots, \tilde{x}_{t, m}; \Phi) }{\sum_{t_{0} \leq t \leq t_{1}} x_{t, m} } $$

        \( \hat{Y} \)は売上の予測。
        \( \tilde{x} \)はメディアの支出の変化。

      • mROASの定義式
        $$ mROAS_{m} = \frac{\sum_{t_{0} \leq t \leq t_{1} + L – 1 } \hat Y_{t}^{m} (\tilde{\tilde{x}}_{t-L+1, m}, \dots, \tilde{\tilde{x}}_{t, m}; \Phi) – \hat Y_{t}^{m} (x_{t-L+1, m}, \dots, x_{t, m}; \Phi) }{ 0.01 \times \sum_{t_{0} \leq t \leq t_{1}} x_{t, m} } $$

        \( \hat{Y} \)は売上の予測。
        \( \tilde{\tilde{x}} \)はメディアの支出の1%の変化。

      • ROASの分布は事後分布と上述の定義式から得られる。
      • メディアミックスの最適化
        予算という制約付きの極値問題を解く。ラグランジュ未定乗数法を用いる。

      Application to a Simulated Data Set

      • シミュレーションしたデータを使っている。2年間の週次のデータで、売上、3つのメディア、一つのコントロール変数からなる。

      Impact of Sample Size on Estimation Accuracy

      • 単一のデータセットのみで評価することが難しいので、それぞれが独立した500個のデータセットを生成し、それぞれ推定をしている。

      Choice of Priors

      • サンプルサイズが小さい場合、事後分布が事前分布の影響を大きく受けるため、事前分布に関して色々と考察している。
      • \( \beta \)に関する事前分布。設定次第で結構変わる。メディアの支出にかかってくるので分析に与える影響は大きい。
      • \( \mathcal{K}_m \)に関する事前分布。要はサチるポイントに関するもの。設定次第でグラフの挙動が結構変わる。

      Application to Real Data and Model Selection

      • シャンプーの広告主の実際のデータを使って分析。
      • 2.5年の週次データで、反応変数として売上、メディアデータとしてTV・雑誌・ディスプレイ・YouTube・検索、コントロール変数として小売のデータ(平均オンスあたり価格)・重み付けされた全商品の流通量や広告量が扱われている。
      • BICを頼りにモデルを選択した。BICは事後分布のデータから計算できる。

      Conclusion

      • メディアミックスモデルはモデルの識別によって結果が大きく変わる。
      • ベイズモデルでキャリーオーバー効果や形状効果を考慮したモデルを求め、それらの事後分布からROASやmROASを計算した。
      • データ数が少ないとバイアスの伴った推定となる。事前情報の選定にも慎重になるべき。
      • BICでモデルを識別した結果、キャリーオーバー効果や形状効果を想定した設定が選ばれた。
      • 残差に自己相関があったため、今回のモデルはまだ不完全で改善の余地がある。

      Recommender Systems: The Textbookの要点まとめ(随時更新)

      はじめに

      レコメンド関連の書籍を探していた際に、
      Recommender Systems: The Textbook (English Edition)の無料公開されているPDFを見つけたので、それについて読んでは追記するスタイルでメモを残していこうと思います。(すごく長くなる予感)

      これまで読んできたレコメンド関連の本の中では、説明が丁寧だったり事例が豊富に思います。数式はあまり出てこないですが、言葉でちゃんと説明しようとしているのが感じられます。『AIアルゴリズムマーケティング 自動化のための機械学習/経済モデル、ベストプラクティス、アーキテクチャ (impress top gear)』のレコメンドの章もわかりやすく幅広いトピックが扱われていますが、それに匹敵する本にも思います。

      第1章(An Introduction to Recommender Systems)

      Goals of Recommender Systems

      • 1.ユーザーとアイテムの組み合わせの評価値の予測問題
        過去のユーザーのプリファレンスデータを使って学習する。未知のアイテムに関しては行列補完問題とも見なせる。
      • 2.上位k個の推薦問題
        あるアイテムに対して、あるユーザーの上位k個のアイテムを推薦する。

      推薦システムの第一の目的はプロダクトの売上向上。

      • 推薦システムの運営上ないし技術的な目的
        1.関連性(Relevance)
        2.新規性(Novelty)
        3.意外性(Serendipity)
        4.推薦の多様性(Diversity)
      • 推薦システムの例
        1.GroupLensの推薦
        2.Amazon.comの推薦
        3.Netflixの映画推薦
        4.Googleニュース推薦
        5.Facebookの友達推薦

      Basic Models of Recommender Systems

      • 協調フィルタリング(Collaborative Filtering)
        1.メモリーベース
        ・ユーザーベース協調フィルタリング
        ・アイテムベース協調フィルタリング
        2.モデルベース
      • コンテンツベース(Content-Based)
      • ナレッジベース(Knowledge-Based)
        滅多に買われないようなアイテム(自動車、不動産)の際に考える。評価は使わない。その代わり、ユーザーの要望とアイテムの近さや、ユーザーの制約などを用いる。
        1.制約ベースの推薦システム
        2.条件ベースの推薦システム
      • デモグラフィック(Demographic)
      • ハイブリッド、アンサンブルベース(Hybrid and Ensemble-Based)
      • 評価の種類
      • 明示的な評価と暗黙的な評価
      • 欠損値分析との関係性

      Domain-Specific Challenges in Recommender System

      • コンテキストベース(Context-Based)
        時間や場所、ソーシャルデータを使う。季節性を考慮したりする。
      • 時間依存(Time-Sensitive)
        1.時間と共に評価は変わる。流行りすたりがある。
        2.特定の時期だけ、特定のアイテムの評価があがることはある。(レインコート、ダウン)
      • 位置情報(Location-Based)
      • ソーシャル(Social Recommender System)
        ネットワーク構造やソーシャルでの繋がり、タグ、組み合わせに基づいている。

      Advanced Topics and Applications

      • コールドスタート問題(Cold-Start Problem)
      • 攻撃耐性(Attack-Resistant)
        アルゴリズムをハックされると情報推薦の効率性が阻害される。本来、上がってくるべきものが上がらないので。
      • 集団への影響(Group)
        推薦アルゴリズムは個々人よりも集団のプリファレンスに影響を与える。
      • 複数の基準(Multi-Criteria)
        ユーザーは単一の基準でアイテムを評価はしない。
      • アクティブラーニング(Active Learning)
        ユーザーが評価をしやすいようにするための取り組み、たくさん過去に評価したユーザーがいた場合は、新しい映画に関して評価をしやすいように予測するとか色々。
      • プライバシー(Privacy)
      • 様々な適用領域
        小売、音楽、コンテンツ、web検索、クエリ、デジタル広告

      第2章

      TBD

      第3章

      TBD

      第4章

      TBD

      第5章(Knowledge-Based Recommender Systems)

      • コンテンツベースは新しいアイテムの推薦には良いが、新しいユーザーには推薦できない。協調フィルタリングやコンテンツベースは過去の履歴といったデータをベースに扱うが、ナレッジベースはユーザーが何を求めているのかに基づいている。
      • 不動産や自動車、旅行商品などは滅多に購入しないため、評価のデータは十分に得ることができない。
      • 映画はレコメンドされた際に、その理由が明示されなくとも受け入れるが、不動産や自動車は詳細な情報抜きには、そのレコメンドを受け入れることは難しい。
      • ナレッジベースのレコメンドが有効なケース
        1.ユーザーの要望が明確なケース。協調フィルタリングやコンテンツベースでは満たせない。
        2.選択肢が幅広く商品の複雑さが大きい商品のケース。詳細な評価を得にくい。
        3.商品の評価が時間と共に大きく変わるケース。パソコンとか車はすぐ新しいものが出てきたりして評価が変わってしまう。
      • ナレッジベースのレコメンドにおけるユーザーとのコミュニケーション
        1.対話システム
        対話でのフィードバックループのコンテキストからユーザーのプリファレンスを把握する。
        2.検索ベースシステム
        質問に答えることでプリファレンスを把握していく。
        3.ナビゲーションベース
        ユーザーがアイテムに対して反応をしてしていき、その結果に応じて望んでいるアイテムに到達できる。

      Constraint-Based Recommender Systems

      • アイテムの属性に関する強い要望や制約を識別する。
      • 制約ベースのレコメンドシステムにおける3つのインプット
        1.ユーザー固有の情報(デモグラ、リスク嗜好)、必須要件(バストイレ別とか)
        2.ナレッジベースの属性情報。アイテムに応じた属性を顧客の属性にマッピングする。
        直接:都心か郊外か→郊外→近隣のものを推薦
        間接:家族の人数→5人以上→寝室が2つ以上のものを推薦
        3.アイテムに関するデータを全部使う
      • 関連した結果を返す際の3つのアプローチ
        1.ユーザーの回答をもとに条件を類推し、ユーザーの要望に加える。(例えば、家族の人数が5以上と回答された場合に、寝室の数は3以上必要だろうとして要望に加える。)
        2.要望をもとにデータベースのクエリを生成
        3.ユーザーの要望に関連したカタログを抽出する
      • 対話のアプローチ
        1.インターフェースを通してユーザーのプリファレンスの初期値を得る。
        2.マッチさせたアイテムを並べてユーザーに示す。なぜそれを表示したのかの理由も付ける。
        3.条件緩和や追加の要望を受け付ける。レコメンドの件数が多すぎたら要件を増やして、少なすぎたら要件を減らす。
      • マッチしたアイテムの並べ方
        効用関数を使ったりする。
        $$ U( \overline V ) = \sum_{j=1}^{d}w_j \cdot f_j(v_j) $$
        \( w_j \)は評価のウェイト、\( v_j \)はマッチした属性の値。
      • 受け入れられない結果や空集合への対応
      • 制約の追加

      Case-Based Recommenders

      • 制約ベースのレコメンドとは違い、強い制約がない。良いレコメンド結果になるまでユーザーの要望を繰り返し修正していくアプローチとなる。
      • ケースベースのレコメンドの場合の重要な要素
        1.類似度の指標

        $$f(\overline{T}, \overline{X}) = \frac{\sum_{i \in S}w_i \cdot Sim(t_i, x_i)}{\sum_{i \in S} w_i} $$

        Sは属性の集合で、属性ごとに重みが違う。tはターゲット。xはあるアイテム。

        ・対称
        $$ Sim(t_i, x_i) = 1 – \frac{|t_i – x_i|}{max_i – min_i} $$
        ・非対称

        $$ Sim(t_i, x_i) = 1 – \frac{|t_i – x_i|}{max_i – min_i} + \alpha_i \cdot I( x_i > t_i ) \cdot \frac{|t_i – x_i|}{max_i – min_i} $$

        ・多様性
        1から類似度を差し引いたものが多様性の尺度となる。
        $$D(\overline{X}, \overline{Y}) = 1 – f(\overline{X}, \overline{Y})$$
        2.批評
        ・推薦結果がユーザーに示されてから、批評を通じてフィードバックを受ける。
        ・単純な批評:特徴の一つを変更してもらう
        ・複合的な批評:複数の特徴量を変更してもらう
        ・動的な批評:データマイニングからフィードバックを掴み取る(アソシエーション分析とか)

      Persistent Personalization in Knowledge-Based Systems

      • ナレッジベースのレコメンドでの過去ログの蓄積があれば、効用関数や類似度関数、制約の提案、動的な批評に関してパーソナライズすることが可能。

      第6章

      TBD

      第7章

      評価の目標に正確度がよく使われるが、ユーザー体験において重要な指標は目新しさや信頼度やカバー範囲やセレンディピティなど、それ以外の指標によるところが多い。正確度は大事な指標ではあるが、それだけでは良いレコメンドシステムを作ることは難しい。

      Evaluation Paradigms

      レコメンドシステムの評価方法にはユーザースタディ、オンライン評価、オフライン評価の3つがある。

      • ユーザースタディ
        特定のタスクを行い、レコメンドシステムを触ってもらい質問をするなどして、ユーザーからのフィードバックをもらう。ただし大規模に行うとコストもかかるし、参加する時点でユーザーの性質が違う可能性もあり、バイアスが含まれる可能性がある。
      • オンライン評価
        レコメンドシステムを実装したサイトなどで、ユーザーのグループをAとBに分け、アルゴリズムAとアルゴリズムBをそれぞれ用いて、その結果としてコンバージョンレートなどを比較する。バンディットアルゴリズムを使うのも良い。ただ、オンライン評価は実装含めコストがかかる。
      • オフライン評価
        レコメンドアルゴリズムにおいて最もポピュラーな評価方法で、過去のデータにおける評価を行う。当然、オンライン評価のほうが望ましいが、統計的にロバストであろうと観点で非常によく使われる。ただし、セレンディピティや目新しさを評価することは難しい。

      General Goals of Evaluation Design

      • Accuracy
        モデルの訓練にも、評価にも使われる。レコメンドシステムにおいても、機械学習の分類や回帰タスクと同様に、ホールドアウトや交差検証などを行って評価する。
        あるユーザーのあるアイテムに対する評価の誤差を以下の式で表す。
        \(e_{uj} = \hat r_{uj} – r_{}uj \)
        なお、Eは評価対象の集合とする。その際、正確度の評価は以下のようになる。

        $$ MSE = \frac{\sum_{(u, j) \in E} e_{uj}^2 }{|E|} $$

        $$ RMSE = \sqrt{ \frac{\sum_{(u, j) \in E} e_{uj}^2 }{|E|} }$$

        なお、他にもランキングベースの評価方法もある。
        ただ、精度が高くても、ユーザーが絶対に買うであろうアイテムしかレコメンドできない場合は、レコメンドシステムの意味合いとしては薄れる。

      • Coverage
        レコメンドシステムが精度が高すぎる場合、一部のアイテムは一部のユーザーに全く推薦されなくなる。
        k点以上の評価を付けるであろうと予測したユーザーの割合は、ユーザー空間でのカバレッジと呼ばれる。
        一般的に、近傍ベースの手法を考えた際に、近傍を広げた場合、精度は落ちてしまうが、カバレッジは高くなる。ようは、精度とカバレッジはトレードオフの関係にある。
      • Confidence and Trust
        予測した評価の範囲として信頼区間が与えられる。予測した値の誤差が信頼区間にマッチしているかどうかで測る。同じアルゴリズムにおいて、信頼区間が狭いものほど良いと判断する。ただし、予測が正確だとしても、評価をユーザーに信じてもらえないと役に立たない。推薦理由がロジカルかどうかが重要となる。
      • Novelty
        ユーザーがこれまで気づかなかったような推薦ができているかどうかを表す指標。オンライン評価として画面上でユーザーに回答してもらうという方法で測るケースが多いが、いつでもその評価を実行することはできない。
        一方、オフラインであれば、それが可能となる。現時点よりも将来に選びそうなアイテムを推薦できるようになれば、それがノベルティに繋がる。
        過去に評価されているアイテムを、正しく推薦されてしまうとノベルティに関するペナルティが与えられるとする。将来時点で評価されるアイテムを正しく推薦できたらノベルティに関してリワードが与えられると考える。ようは将来と過去の予測の正確度の差分でもってノベルティを測ることとなる。
      • Serendipity
        セレンディピティは幸運な発見を意味する。レコメンドの成功における驚きのレベルを測る。セレンディピティはノベルティよりも強い条件で、セレンディピティがある場合、そのアイテムは目新しいが、逆は真ではない。
        オンライン評価の場合、ユーザーからのフィードバックで意外性があったかどうかを測ればいい。
        オフライン評価の場合、コンテンツベースで選んだものではないアイテムがユーザーに選ばれた場合に、セレンディピティがあると見なすことができる。コンテンツベースのレコメンドとそうでないレコメンドの結果の二つを用意する必要がある。
      • Diversity
        推薦リストの中でのアイテムの多様性を測る。多様性が高まれば、ユーザーのニーズを捉える可能性が高まると考えられる。
        多様性はコンテンツを元にしたアイテム間の類似度で測る。全てのアイテムのペアに対しての平均的な類似度が多様性を表す。
      • Robustness and Stability
        偽の評価や時間とともに急激にデータが変化した際に、レコメンドシステムが影響をあまり受けない場合、そのレコメンドシステムはロバストで安定していると見なすことができる。レコメンドシステムの利用者の中には、ランキングを不正に高めることが自身の利益に繋がることがある。
      • Scalability
        近年、暗黙フィードバックも考慮すれば、レコメンドシステムを構築するためのデータは比較的簡単に入手できるようになった。そこで、データの大きさがもたらす問題に関して注意を払う必要がある。
        1.機械学習モデルの訓練時間
        2.予測(推論)時間
        3.計算の際に要求するメモリの量

      Design Issues in Offline Recommender Evaluation

      • レコメンドシステムを開発するに際して、データは3つのパーツに分割される。
        1.訓練データ(モデルの構築)
        2.検証データ(モデル選択・パラメータチューニング)
        3.テストデータ(二度漬け禁止)
      • ※豆知識:Netflix Prizeのデータは学習データとテストデータがかなり違っていたらしい。学習データに古いレーティングが入っていて、テストデータに新しいレーティングがあるという状態だったとのこと。
      • Segmenting the Rating for Training and Testing
        ・Hold-Out
        ・Cross-Validation
      • Comparison with Classification Design
        回帰や分類タスクと同様にサンプルセレクションバイアスの問題がはらんでいる。

      Accuracy Metrics in Offline Evaluation

      • レコメンドシステムの評価方法としてはランキング系のものが良いが、わかりやすさを重視するならばRMSEが良い。
      • Measuring the Accuracy of Ratings Prediction
        ・MSE
        ・RMSE
        ・MAE
        ・NRMSE
        ・NMAE
      • RMSE versus MAE
        RMSEは異常の影響を受けやすい。一方でMAEは影響を受けにくい。
      • Impacr of the Long Tail
        主要なアイテムによって評価は影響を受けるが、売り上げの大半はロングテールなアイテムであり、主要なアイテムがロングテールなアイテムに悪影響を与えることがありうる。
      • Evaluating Ranking via Correlation
        レコメンドシステムはユーザーに対しアイテムのランキングを提供し、上位k個のアイテムが推薦されることとなる。
        ランキングのための評価指標について。
        1.スピアマン順位相関係数
        2.ケンドール順位相関係数
      • Evaluating Ranking via Utility
        効用関数ベースのランキング評価指標。
        $$ F(u, j) = \frac{max\{ r_{uj} – C_{u} , 0 \}}{2^{\frac{v_j – 1}{\alpha}}} $$
        ここで、\( C_{u} \)はユーザーの平均的な評価とされる。

        $$ R-score(u) = \sum_{j \in I_{u} F(u, j) } $$

        ・DCG(discounted cumulatiove gain)
        $$ DCG = \frac{1}{m} \sum_{u=1}^{m} \sum_{j \in I_u, v_j \leq L } \frac{g_{uj}}{log_2 (v_j + 1)} $$
        \( v_j \)はアイテムjの順位を表す。
        $$ g_{uj} = 2^{rel_{uj} – 1 } $$
        ここで\( rel_{uj} \)は実際の評価が使われることが多いとのこと。

        ・NDCG(normalized discounted cumulatiove gain)
        $$ NDCG = \frac{DCG}{IDCG} $$

      Limitations of Evaluation Measures

      第8章

      TBD

      第9章

      TBD

      第10章

      TBD

      第11章

      TBD

      第12章

      TBD

      第13章

      TBD

      [Python]Music×AnalyticsというイベントでLTをやってきましたレポート

      今回はゆるめで、あるイベントのLTに参加してきた感想やら、資料やら動画やらソースコードを共有するだけの記事となっております。

      ことの成り行き

      Tokyo.Rでお世話になっているy__mattuさんから、「Music×Analytics Meetup Vol.4」のイベントのことを教えていただき、せっかくなのでLTをさせてもらえることになりました。

      音楽の分析に関して入門レベルなので果たして参加者が盛り上がってくれる何かを提供できるか不安でした。

      納期的にも、今の実力的にも過去に書いたブログ([Python]スペクトグラムで楽器の試奏データを比較(プロ奏者とも))の延長線上のことでいいなと思ったんですが、
      先行研究は欲しいし、分析対象の音楽もスケール(音階)ではなく何かの曲が良いと思いました。あと、意外な情報も載せたい、分析結果を活かして便益を得たいとも思いました。

      なので、LTまでに先行研究を見つけ、意外な情報としてjupyter notebookで録音する機能を見つけ、分析対象の曲にギャツビーのCMのものを採用しました。
      そして、この研究から自分の楽器の演奏の腕前を向上させることができました。
      これならLTとして発表しても入門レベルでも楽しいのではないかなと思いました。

      LT内容

      Google Presentationと事前に録音したYoutubeをこちらに載せておきます。

      発表音声の文字起こし

      LTを7分以内に抑えるリハーサルをした際の音声があったので、それをGoogle Speech To Text APIを使って文字起こしをしておきます。
      「それではその音に近づくための研究と練習ということで江口さん自己紹介ですが名前は救えバックグランドは経済学や統計学仕事では同席部のマネージャー兼データ分析さんはこんな感じで趣味はトランペットブログ作成をやってるので良かったみてください結局どうしたんですけどその他データ分析関連のかって言いよったでどうやって勝手の音消したいなって思いますがここまでのホスピスがまずあって写真撮って進度が速い遅いである時と言うとって治ってるということですが音の長さが変わりますなのでお体変わります秘密のピストンだけなので発送の仕方ありませんのでコントロールして40種類ぐらいのレベルからは死んだことに帰って前記処理学会のそれの大会でスペクトルグラムを使ってプロのアクセスをしたのとの比較ではその方向の出来不出来を判定すると犬が行われていました鬼時間に周波数色の濃淡で信号ってなっちゃったから明日グラフとなりますがこの場合は時間が12秒まであって周波数が8000まで行ってあのね精神旺盛な強さが違ってます本当の鳴き声何もとしてるの俺も行ってここだったから体操マット耐熱耐酸プルマンちょっと寄りますよねプレイヤーの力も貸したして自分との違いを明らかにして違いがある場合とならそこによるそれが産めるのかお話していきたいと思ってます結果こんな感じえーとまずはサイトメトロ ffmpeg をインストールしてああいパイソン mrtg をインストールしたギターの音は愛想の良いしらすを呼び出してこういう形で書くことでノートブックので他のところでエロ金ボタンが現れますこれ音声は録音開始でもう一度録音するようになっていますその後に録音したファイルを保存 SMS でまあ16000hz 2のファイルに変換してまた再読み込みという形があってもはい録音環境としてはわからないぞマイクでして何楽器はちょっと古いので今回あったのがという音楽などの分析見ております玄関のために必要なセッティングってのがあるんでは基本的なセッティングで言っても実際に自分のそれかしたら私に出てきますね自分のやってみようと思いますまず聞いてみましょう第4フォルマント信号の強さがえっと Pro は赤いんですけど強いんですけど出してもらうわいえ私なってます遅く音源第4フォルマントの方がやっぱり行けないなっていうのが分かれば鼻が詰まってるから行けないっていましたねと自分ではまあ剛てる所間違いが分かりましたどうしたら強い信号になってるのかその女お腹に力を入れる行きの数量変えるとかありますもうなんかの力を入れて強いわ強い力を込めてもっと明るくならなかったにやと言われるとも出てこなくなったよ沢山入ったとこですねこれで第4子が赤くなるのはこれまで行きの量が足りてなかった自分じゃなかったじゃないかっていうので行ってみましょう早くなりましたねでスタグラムに従ってくると自分の音が帰宅したところ息を吸う量を多くすることで気分良くなることがわかりました待機するのって管楽器重要な今なってどれぐらい剃ったらいいのか分かんなかったり根性論だったりするんでこれは便利だねまあは管楽器にも分からなくなって鳴るんですけど G 計り方とかあると結婚もしないからっても行きたいのでくれてありがとうございました」

      ソースコード(LT)

      こちらではLTのために使ったスペクトログラムを表示するためのコードを共有します。

      ソースコード(文字起こし)

      Google Speech To Text APIで文字起こしをする際のコードをここに載せておきます。

      GCSのバケットを作っておきます。今回はperry_voiceという名前のバケットを作っておきました。先ほど作ったaudio_only_filtered_441.wavを、このバケットにあげておきます。

      APIの認証用のjsonファイルをcloud shellにアップロードしておきます。jsonファイルはGCPのコンソールの認証情報からサービスアカウントキーを作成し、「鍵を追加」の項目からjsonファイルを選択して手に入れることができます。(当然、Google Speech To Text APIのAPIを有効にしておく必要があります。)
      1ヶ月につき60分までは無料なので、今回の処理も無料でできます。(GCSは数円かかると思いますが。)

      文字起こし結果はGCSのperry_voiceの中にあります。

      他の発表から学んだこと

      深層学習を用いたJazz音楽の研究や、音楽の理論、DJプレイの自動化の研究、声の変換技術など同じ音という題材ながらも幅広く話を聞くことができました。私だけ入門な内容で申し訳ない気持ちが生じましたが、これからこの分野を深めるのもプレイヤーとして面白いなと思ったので、長く学ばせてもらおうと思います。

      懇親会で学んだこと

      ・NVIDIAのノイズリダクション技術は文字起こしの際にやってみる価値あり
      ・賃貸の場合、防音の部屋は家賃相場の2~3万円アップ
      ・口周辺の筋肉の研究をされている方がいる(論文でその分野があるのは知っていたが、実験をやっていた方に会えた)
      ・みな、条件を揃えるためにマイクや集音の仕方にこだわりがあった。
      ・いい音の定義にやはり答えはない。

      [Python]仕事で使えそうな確率まとめ


      本来、正月の企画物としてアイデアを出していたものの、作成する時間がとれなかったのですが、日常的にもっと確率に従って生活できたら面白いなと思って作ってみることにしました。

      二項分布

      • やりたいこと
        オフィスにおいて、チームごとにデスク周辺の掃除当番を毎日乱数で決めているとして、1ヶ月で自分がどれくらい掃除をやらなくてはいけないのかを知りたい。あるいは、1回の掃除で済む確率とか、10回掃除する確率とかを知りたい。

        これは、成功確率p(掃除当番になる確率 = 1÷チームの人数 )でのN回の独立なベルヌーイ試行となり、自分が掃除当番になった場合X=1で、そうでない場合はX=0となる。
        N回ベルヌーイ試行した際のXの合計は二項分布従うので、N回試行して、Xがkになる確率は以下のように示される。(チームの人数はHとする。)

        $$ P(Y_N = k ) = {}_N C _k \left (\frac{1}{H} \right )^k \left ( 1- \frac{1}{H} \right )^{N-k} \\
        (0 \leq k \leq N )$$
      • コード


        平均では20営業日で2回は掃除することになりますが、4回以上掃除しないといけない確率が10%以上はあることがわかります。掃除が嫌いな人は、苦しみの上限をイメージできると楽なのではないかと思うので、確率に従い掃除当番を甘んじて受け入れましょう。
      • 参考情報
        scipy.stats.binom
      • matplotlib.pyplot.grid

      多項分布

      • やりたいこと
        先ほどのように乱数で掃除当番を割り当て、それをランキングにし、一位を掃除大臣として称号を付与するものとする。10名いるもののうち、上位のメンバーA・メンバーBとで累積の掃除回数がそれぞれ10回、6回としたもとで次の月に掃除大臣が入れ替わる確率を計算したい。
      • コード

        計算したところ、1.2%くらいになった。このケースにおいてAさんがBさんに次の月に掃除大臣の座を奪われる可能性は低いらしい。
      • 参考情報
        scipy.special.comb

      誕生日の問題

      • やりたいこと
        あまりにも有名な確率の話で、誕生日のパラドックスとも呼ばれています。誕生日が同じ人が部署内にいる確率が0.5を超える人数は何人か?
      • コード

      • 参考情報
        誕生日のパラドックス
        matplotlib.pyplot.hlines

      ファーストサクセス分布

      • やりたいこと
        アルバイトの面接を受けるとして、その合格率が1/30だとして、何回くらい面接しても合格できないものだろうか。苦しみの上限を知りたい。20回、30回面接を受けた時に合格できてない確率はどれくらいだろうか。何回くらい面接を受けたら合格できていない確率を1%未満に下げれるだろうか。
        成功確率がpのベルヌーイ試行を独立に何回も行うとき、初めて成功数までに失敗した回数をXとして、初めて成功した際の試行回数をYとした場合、その確率は\( k \geq 1 \)として、

        $$ P(Y = k) = P(X=k-1)=p(1-p)^{k-1} $$

        と表すことができる。これをパラメータpのファーストサクセス分布と呼ぶ。(幾何分布とも呼ぶ。)

      • コード

        20回面接をしても合格できない確率はおよそ50%。30回面接しても合格できない確率はおよそ36%。合格できない確率が1%を切るのは面接回数が135回になった時。このレベルを追い求めると心が折れる面接回数なのかもしれない。

      • 参考情報
        弱点克服 大学生の確率・統計

      負の二項分布

      • やりたいこと
        ある営業がリンゴを売る仕事をしておりタウンページで飲食店に電話をかけているとする、商談の予約が取れる確率(p)が0.05として、商談予約が5(n)回起きるまでに失敗がk回生じる確率について知りたい。いったい、この営業は飲食店にどれくらい商談をお断りをされる覚悟で臨めばいいのか。

        このような事象は負の二項分布に従うので、
        $$ P(X = k) = {}_{n – 1 + k} C _k p^{n-1}(1-p)^k $$
        という確率に従う。
        なお、この分布の期待値は
        $$ E(X) = \frac{n(1-p)}{p} $$
        に従う。

      • コード


        75回くらいの失敗で確率自体のピークがきている。期待値だと95回だが、確率のピークはもっと手前にある。

        累積確率を知りたい場合はこちらのコード


        80%のところで125回なので、5人に一人は期待値の95回を30回くらいは超えてしまってもおかしくないということになる。そして、5人に一人くらいは50〜60回で達成できるラッキーな人もいる。

      • 参考情報
        弱点克服 大学生の確率・統計

      ポアソン分布

      • やりたいこと
        先ほど、営業が飲食店に売ったリンゴの中に芋虫が住み付いているケースが500回に1回の頻度で発生し、営業と顧客の間でトラブルに発展するとする。年間に1200の飲食店と取引を行うが、トラブルはどれくらい発生するものなのか。
        顧客とのトラブルが発生する回数がYだとした際に、ポアソン分布に従うとした場合、
        $$P(Y = k) = \frac{\lambda^k}{k!} e^{-\lambda} $$
        となる。ここで、
        $$ \lambda = 1200 \times \frac{1}{500} $$
        とおく。
        なお、期待値と分散はともに
        $$ E(Y) = V(Y) = \lambda $$
        となる。
      • コード


        トラブルが2回の時が確率が一番高い。0回で済む確率も0.1に近いくらいはある。


        5人に一人は4回以上のトラブルに巻き込まれる気の毒な営業がいそうですね。まぁ、リンゴの中は開けてみないとわかりませんから、顧客トラブルがあっても恨みっこなしで頑張りましょう。
      • 参考情報
        弱点克服 大学生の確率・統計

      フィギュア集め問題

      • やりたいこと
        現場猫フィギュアのガチャポンに関心があるとする。N回ガチャポンを回した時に、N種類の現場猫フィギュアが全部揃う確率はどれくらいだろうか?(どの現場猫のフィギュアも出現確率は同じものとする。)
        また、N+1回ガチャポンを回したとき、N種類の全部が揃う確率はどれくらいだろうか?あるいは、m回ガチャポンを回してそろったフィギュアの数の期待値は?そして、Y回目のガチャポンではじめてN種類の現場猫の全部揃う、Yの期待値は?

        ・N回ガチャポンを回した時に、N種類の現場猫フィギュアが全部揃う確率:
        $$\frac{N!}{N^N}$$

        ・N+1回ガチャポンを回したとき、N種類の全部が揃う確率:
        $$ N \times \frac{(N+1)!}{2} \times \frac{1}{N^{N+1}} $$

        ・m回ガチャポンを回してそろったフィギュアの種類\( X_m \)の期待値:
        m回ガチャポンを回してそろったフィギュアの種類\( X_m \)を以下のように表す。
        $$X_m = Z_1 + Z_2 + \dots + Z_N$$
        m回ガチャポンを引いて、当たらないということは
        $$ P(Z_i = 0) = \left ( \frac{N – 1}{N} \right )^m $$
        ということになる。
        これをもとに\( Z_i \)の期待値を計算すると

        $$ E(Z_i) = 1 \times \left ( 1 – \left ( \frac{N – 1}{N} \right )^m \right ) + 0 \times \left ( \frac{N – 1}{N} \right )^m \\
        = 1 – \left( \frac{N-1}{N} \right )^m $$
        よって、\( X_m \)の期待値は
        $$ E(X_m) = E( Z_1 + \dots + Z_N) \\
        = N \left ( 1 – \left( \frac{N-1}{N} \right )^m \right )$$

        となる。

        ・Y回目のガチャポンではじめてN種類のフィギュアが揃う際のYの期待値:
        i-1種類からi種類になるまでのガチャポンの回す回数を\( T_i \)として、その階差がファーストサクセス分布に従うとする。
        $$ T_i – T_{i-1} \sim F_s \left ( \frac{N – i + 1}{N} \right ) $$
        その場合、Yの期待値は以下のようになる。

        $$ E(Y) = E( T_N ) \\
        = E( (T_{N} – T_{N-1}) + (T_{N-1} – T_{N-2}) + \dots + (T_{2} – T_{1}) + T_{1} ) \\
        = E \left ( F_s \left ( \frac{1}{N} \right ) + F_s \left ( \frac{2}{N} \right ) \dots + F_s \left ( \frac{N-1}{N} \right ) + 1 \right ) \\
        = N \left ( 1 + \frac{1}{2} + \dots + \frac{1}{N} \right )
        $$
      • コード

        N回ガチャポンを回した時に、N種類の現場猫フィギュアが全部揃う確率:
        0.0384
        N+1回ガチャポンを回した時、N種類の現場猫フィギュア全部が揃う確率:
        0.1152
        m回ガチャポンを回して揃った現場猫フィギュアの種類Xの期待値:
        3.3615
        Y回目のガチャポンではじめてN種類の現場猫フィギュアが揃う際のYの期待値:
        11.4166
      • 参考情報
        弱点克服 大学生の確率・統計

      [Python]スペクトグラムで楽器の試奏データを比較(プロ奏者とも)


      以前、トランペットのマウスピース選びで音声解析をしてみましたが、今回は楽器選びで行ってみます。
      前回の調査でf1値とかでは良い音の判断がつかなかったので、スペクトログラムを出してみたいと思います。
      管楽器はそこそこに高い買い物なので、色々と比較見当をしてから意思決定したいですね。


      今回の楽器たちはヤマハの800GS(所持品)、Bach 180ML37SP、Bach 180ML37GL、Bach AL190GLです。ヤマハのやつは20万円くらいですが、Bachのは30万円くらいします。ちなみにBachはアメリカの楽器メーカーで、私の感覚値ではあるのですが、音大生はだいたい持っているような気がします。10万円の差は大きいのか小さいのか。そしてプロの演奏家のスペクトグラムとも比較します。

      スペクトログラムとは

      パワースペクトルの値の高低を画像の濃淡で表現し、縦軸に周波数、横軸に時間を取った座標上にプロットしたものをスペクトグラムと呼びます。スペクトグラムでは、周波数が低いところ(下)から、第1フォルマント、第2フォルマント、第3フォルマント・・・と呼びます。フォルマントは周りの周波数と比べて突出している部分のことを指します。

      $$ S(\omega) = \int_{-\infty}^{\infty}s(t) e^{-jft}dt$$

      さて、いきなりの数式ですが、フーリエ変換の式となります。\( S(\omega) \)を二乗したものがパワースペクトルとなります。(二乗するは複素平面上で絶対値を取りたいため。)
      tは時刻、fは基本周波数(最も低い周波数)、jは虚数単位を表します。ここで登場する\( s(t) \)は定常波と呼ばれ、以下の式で定まります。

      $$s(t) = \frac{a_0}{2} + \sum_{n=1}^{\infty}a_n \cos (2 \pi n ft + \theta_n)$$
      \( a_n \)は元の信号\( s(t) \)にどの周波数の波がどの程度の強さで含まれているかという情報を表します。
      フーリエ変換のモチベーションとしては、周波数の周期関数を周波数の異なる単純な波の重み付き和で表現できることですが、トランペットの音波を色々な周波数に分解できるのは面白いです。良い奏者の周波数がどうなっているのか調べてみるのは面白そう。

      Pythonでの計算&比較

      音声データはFFMpegで変換とか切り取りをするなどして作成しました。作成方法は簡単で、以前のブログにも記しましたので、試してみたい方はそちらを参考にしてみてください。

      まずはヤマハですが、この楽器になれている分、スムーズに吹けています。最初のほうのリップスラーは5つくらいのフォルマントがありそうです。音階が上がるにつれてフォルマントが減っているのがわかります。最後のHigh Bでは細めのフォルマントが3つあります。


      次は、Bach 180ML37SPという楽器です。鳴らすのに慣れていないので、ゆっくり吹きました。最初のほうのリップスラーは5つくらいのフォルマントがありそうで、それはヤマハと同じですが、最後のHigh Bで2つくらいしかフォルマントがありません。楽器に十分息が吹き込めておらず、鳴らせていないのだろうと思われます。可視化できるって面白いですね。


      次は、Bach 180ML37GLという楽器です。さっきの楽器との違いは銀メッキがなされているかどうかくらいです。最初のリップスラーは同じ感じで5つくらいのフォルマントがありそうですが、リップスラーで戻ったところで5つ目のフォルマントが消えています。ただ、最後のHigh Bで3つほどフォルマントがありそうです。慣れてきたのでしょうか?


      次は、Bach AL190GLという高級モデルです。40万円くらいします。より技術力の高い職人が手掛けた楽器だそうです。ベルに一手間加わっていたり、専用パーツがあったりするみたいです。実際、30万円のよりも吹きやすい印象がありました。
      最初のリップスラーは同じ感じで5つくらいのフォルマントがありそうですが、最後のHigh Bでフォルマントが2つになっています。やっぱ鳴らすの難しいのでしょうか。


      最後に、プロの方の音源です。最初のBで私のグラフと明らかにフォルマントの数が違うことがわかります。楽器を鳴らせているというのはこういうレベルなのかなと思ってしまいました。High Bでフォルマントが4つはありそうです。このレベルになるにはどういう吹き方をすればいいのか、色々研究のしがいがありそう。

      参考文献

      イラストで学ぶ 音声認識 (KS情報科学専門書)