盆暗の学習記録

データサイエンス ,エンジニアリング,ビジネスについて日々学んだことの備忘録としていく予定です。初心者であり独学なので内容には誤りが含まれる可能性が大いにあります。

文系学部生・新卒からデータサイエンティストになれる業界は?

文系学部生というデータサイエンスの王道からはやや外れた立場から,「データ分析を仕事にする(総合職ではなく職種別採用で働く)」という軸で就職活動をするなかで見かけた業界についてメモします。

文系出身だと就職先が絞られ(とくに大手企業),業界の探し方に関して苦労した経験*1があるため,今回はデータサイエンティスト・アナリストを採用していて,「文系お断り」な雰囲気はなさそうだった業界について述べます。

まず,ビジネスにおけるデータ分析の使われ方を確認し,その次に具体的な「データ分析を使う業界」について述べていくという構成になっています。

ビジネスにおけるデータ分析の使われ方

データ分析のレベル

「データ分析」といってもレベルは様々です。「我が社ではデータ分析の業務ができます!データサイエンティストになりたい学生募集中!」みたいな企業があったとしても,話を聞いてみると集計して表やグラフを作り,解釈する業務だったり…なんてこともありました。

まずビジネスでのデータ分析の種類を把握する必要があります。

有名どころの「データ分析のレベル」の分類方法では,以下のような分け方をしているようです。

1. Descriptive Analytics(記述的分析)
データから,「何が起きたのか」を明らかにする。
グラフや表で可視化する,データを解釈するストーリーを考えるなど。

2. Diagnostic Analytics(診断的分析)
データから,「なぜ起きたのか」を明らかにする。相関関係を調べるなどして,より深く調べていく。

3. Predictive Analytics(予測的分析)
確率的な予測を行うモデルを構築する。

4. Prescriptive Analytics(処方的分析)
データから,「何をすべきか」を明らかにする。予測されたモデルから最適な方策を立案する。
例えばレコメンデーションシステムのように,予測結果から提案を最適化するようなもの。

とりわけ,「記述的・診断的な分析」をするレベルなのか,それともより高度に「予測的・処方的な分析」をするレベルなのかが業務の性質を大きく変えると思います。

就職活動の会社探し・業界探しの観点で言うと,私は就職活動を初めた頃にマーケティングリサーチ最大手の株式会社インテージを知り,そこのデータアナリストはマーケティングの分析だけでなく広告予算配分の最適化という「予測的・処方的な分析」も行っているようで,マーケティングリサーチ業界に興味を持つようになりました。

その後もマーケティングリサーチ業界を見ていたのですが,次第にミスマッチを感じるようになりました。というのもマーケティングの場合は予測して自動化とかよりも原因を診断するほうが重要なので,多くのマーケティングリサーチの企業のデータアナリスト職の仕事は「記述的・診断的な分析」がほとんどで,たまに回帰分析や決定木を使うとしても診断的分析の目的で使用しているようでした。

就職活動のときには,自分がやりたい「データ分析」とは「記述的・診断的な分析」なのか「予測的・処方的な分析」なのかを明らかにし,企業を探す時にはその企業の言う「データ分析」がどのレベルなのかを調べる必要があります。

統計学機械学習

すごくざっくりいうと,「予測」をする際には統計学的な手法(e.g. 線形回帰)よりも機械学習(e.g. GBDT, DeepLearning)の方が精度が良いことが多いです。 なので,「予測的・処方的な分析」をする場合は機械学習がほぼ必須になるかと思われます。

なんとなく「大学で学んだ統計学を使う仕事に就きたい(機械学習は興味ない)」と思っている方は仕事内容がどういうジャンルなのか注意が必要かなと思います。 (統計学の基礎知識があれば機械学習を独習することは可能なので,「今は統計学しか知らないけど機械学習を使う仕事がしたい」というスタンスはOKだと思います)

データ分析の職種

データ分析系の職種は主に以下の3種類があるかなと思います。

1. データアナリスト

  • 「記述的・診断的な分析」が主業務である企業が多い印象(仕事のアウトプットはレポート)
  • 必要なスキル:統計学+ビジネス力(経営学マーケティング論,プレゼンなど)
  • 分析はR,SPSSSAS,その他ツールを使う。プログラミングが必須でない企業も多い印象。

2. データサイエンティスト

  • 「記述的・診断的な分析」と「予測的・処方的な分析」の双方を行う(仕事のアウトプットはレポート)
  • 必要なスキル:統計学+ビジネス力+機械学習+プログラミング(分析)
  • R,Pythonなどのプログラミングの能力が必要な企業が多い印象

3. 機械学習エンジニア

  • 「予測的・処方的な分析」を自動化するシステムを作る職(仕事のアウトプットはシステム)
  • 必要なスキル:統計学機械学習+プログラミング(分析)+ プログラミング(システム開発
  • 深層学習の論文に登場する数式をプログラミングして実装できる能力が必要とされることも

※この解説は私の個人的な印象に基づきます。誤りがあるかも‥
※職種の定義は企業によって結構異なります。

ちなみに,これらの3職種の新卒1年目の年収は,

  • データアナリストとデータサイエンティストは同程度(~420万円)
    • 一般的な総合職と比べても,そこまで高いわけでもない
  • 機械学習エンジニアは上限が高い(~1,000万円)

という感じです。

f:id:nigimitama:20180415193030p:plain

企業の例としては以下のような感じ。機械学習エンジニアが最も市場から求められている感じがします。

f:id:nigimitama:20180415193022p:plain

しかし,文系学部卒ではこれらの高給な機械学習エンジニアになるのは難しいと思います。
ソフトウェア開発(Java等)ができることが必要であったり,機械学習についての高い専門性を要求する企業もあります。
大学の専攻と関係なく趣味でソフトウェア開発をしているような人であれば良いですが‥

データ分析の職種別採用がある業界

「データ分析人材を必要としていて積極的に雇用しようとしている企業はどこなのか」という点は就活中にとても悩まされました。なのでここでは会社選びのヒントとなるようにデータ分析を使う業界について述べていきます。

以下の図は,私がデータ分析職の職種別採用を行っているのを見かけた企業の業界を,事業の「コンサル / 事業会社」,業務内容の「アナリスト寄り / エンジニア寄り」の2軸で散布したものです(業界というか部門もありますが…)。

f:id:nigimitama:20180415192909p:plain

なお,「コンサル / 事業会社」という軸を設けたのは,それぞれ一長一短あり重要な軸であるためです。
現在私は以下のようなメリット・デメリットがあるのではないかと想像しています。

f:id:nigimitama:20180415192849p:plain

より具体的な例として,私が就活中に出会った業界を以下に述べていきます。

マーケティングリサーチ(市場調査)業界

  • 業界の概要

    • ざっくりいうと「今,人々は何を求めているのか。何が売れそうなのか。」を調査するのが市場調査
    • データを保有している / アンケートの協力者を保有している ことを活かして企業のマーケティングコンサルティングする。
    • 主に「記述的・診断的な分析」を行う
    • 基礎的な統計学と社会調査士のスキル(実査や分析のスキル)が直接的に役立つ可能性がある業界
  • この業界の企業の例

    • 株式会社インテージ
      • 国内1位,世界9位の売上高(479億円,社員1000名ほど。平均年収746万円/39歳)
      • 事業は広告業界にもまたがっており,データサイエンティストは階層ベイズモデルを用いた広告の最適配分の推定といった仕事も行なう
    • 株式会社マクロミル
      • 売上高355億円,1946名。平均年収528万円(32.4歳)
      • 規模は国内2位くらい,インターネットリサーチに特化。
    • 株式会社ロイヤリティ・マーケティング
      • Ponta」のポイントカード事業によって得た購買行動データを基にコンサルティングを行なう
      • 顧客に要因を説明できるアルゴリズムが重視され,回帰分析と決定木を使う仕事がほとんどらしい
    • 株式会社ヴァリューズ

デジタルマーケティング業界

  • 業界の概要

  • 事例

    • Web解析:行動ログを確認して,つれてきたい人が来てくれているかを調べてPDCAを回す
    • ソーシャルリスニング:Twitterやブログなどからテキストを収集し(収集するツールがある),その企業がどう見られているかを分析する
    • 広告のROI分析:何人がCMを見て,何人が買っているのか調べる,クライアントが保有する出稿料データと売り上げデータの重回帰分析などで相関分析を行なう,など
  • この業界の企業の例

    • 株式会社D2C(ドコモと電通の子会社)
    • 電通アイソバー株式会社(電通とアイソバーの子会社)

総合コンサルティングファーム

  • 業界の概要

    • テクノロジーやデータ分析による問題解決も含めた幅広いコンサルティングを行なう
    • 「記述的・診断的な分析」と「予測的・処方的な分析」の双方を行う
    • 企業によっては分析を市販のツールで済ませる事例も多い模様?
  • 事例

    • 決定木によるマーケティングのためのセグメント分類とキャンペーン提案
      :保険会社において,「契約更新しにくい客」の特徴を分析し,マーケティングのキャンペーンを検討
    • CRM(Customer Relationship Management:顧客関係管理)のための顧客分析
    • 製造工場における品質向上
      • 海外の工場の「操業監視」「異常検知」「故障の予測」を行なう
      • 製造途中の仕掛品の各種データから完成までに不良品になることを予測し,工場の不調を検知・制御
  • この業界の企業の例

データ分析コンサルティング

  • 業界の概要

    • データ分析による課題解決を請け負う
    • 「記述的・診断的な分析」と「予測的・処方的な分析」の双方を行う
  • 事例

    • 深層学習による画像解析を用いた,工場における不良品検知
    • 状態空間モデルを用いた商品の需要予測
  • この業界の企業の例

    • 株式会社ブレインパッド
      • 2004年創業。この業界では古参で最大手。
      • 売上高35億円,216名:社員一人あたり1600万円の売上高,平均年収640万円(34.1歳)
    • 株式会社ALBERT
      • 売上高8.7億円,88名:社員一人あたり約1000万円の売上高,平均年収655万円(33.7歳)
      • 技術はありそうだが稼ぐ力は微妙?。営業キャッシュフローもマイナスが目立つ
    • 株式会社ホットリンク:SNSネット掲示板データの分析に強み。平均年収595万円(35.1歳)
    • 株式会社ダブルスタンダード:売上高14億円,平均年収527万円(35.6歳)
    • データセクション:売上高6億円,平均年収337万円(30.5歳)
    • スカイディスク:製造業の工場に対するデータ分析コンサルに特化したベンチャー

システムインテグレーターSIer

  • 業界の概要

    • クライアント企業に対してIT面でのコンサルティングを行なう業界
    • データ分析がやりたい人にとってのデメリットとしては,分析だけでなくエンジニアの仕事もしなければいけない企業も多いこと
    • 「予測的・処方的な分析」を行う
  • この業界の企業の例

事業会社のマーケティング部門

  • 業界の概要

    • メーカーのマーケティング部門などに所属し,自社のマーケティングのためにデータ分析を使う仕事
    • 大手企業の場合,希望の部門に行くことができるかという「配属リスク」がある
    • 「記述的・診断的な分析」と「予測的・処方的な分析」の双方を行う
  • 事例・企業の例

    • 本田技研工業(ホンダ),ビジネス開発統括部ビジネスアナリティクス課
      • 事例①:車のデザインの評価:SNSでの評価を感情分析し,新しいデザインがどう評価されるかを予測
      • 事例②:乗り心地の評価:車に乗っている人の脳波などの生体反応データと車の速度などのデータの関係から,クルマの状態によって乗っている人の感情がどう変化するかを分析
      • (参考:クルマのデザインや乗り心地……「感性」も科学的に評価するホンダの取り組み - 日経BigData http://business.nikkeibp.co.jp/atclbdt/15/258684/041900073/

事業会社のデータ分析部門

  • 業界の概要

    • マーケティングだけでなく新規事業の提案も含めて様々な部分にデータ分析を活用する仕事
    • 「記述的・診断的な分析」と「予測的・処方的な分析」の双方を行う
  • 事例

  • 物件仕入れの最適化:入ってくる物件情報から「売れない物件」を予測して排除し,「売れそうな物件」のみを仕入れる

  • この業界の企業の例

    • エムスリー株式会社
      • 医師向けのWebサイトを運営。日本に30万人いる医師のうち,25万人が会員登録をしている。
      • データ分析部門があり,データアナリスト職採用を行っている
    • 株式会社GA technologies
    • Sansan株式会社
      • Sansanは日本に4人しか居ない「Kaggle Grandmaster」という称号を持つトップクラスのデータサイエンティストが2人在籍している,データ分析に注力しているベンチャー
      • 研究開発部門ではなくビジネス部門でのデータ活用を行なう人材として「データアナリスト」職採用がある

アドテクノロジー業界

  • 業界の概要

    • 広告配信の最適化に統計学などのデータ分析を活用する
    • デジタル広告は「どんな人に送った結果,どれだけ効果がでた」という情報がわかり効率が良いため,市場は拡大傾向(広告市場自体は縮小しているものの,デジタル広告の比率は増加)
    • 「予測的・処方的な分析」を行う
  • 事例

    • 広告の買い付けシステム
      • ユーザーがWebサイト等を閲覧して広告枠を表示するときに,背後では広告枠のオークションが行われている。
      • 広告の枠のオークションが始まった時,「広告の種類」「広告の枠」「ユーザーの属性」といったデータから,広告のCTR(クリック率)やROI(費用対効果)を予測し,「何円で買う」とオークションに参加する
        → 広告を出した結果,どれだけクリックされ,どれだけ買ってもらえたかがわかる
        → そのデータをもとに,より良いCTR予測モデルを構築する
      • このシステムは瞬時に行われる広告枠の売買で使われる関係上,計算がすぐに終わるロジスティック回帰を使う事が多い
  • この業界の企業の例

    • ユナイテッド株式会社(データサイエンティスト採用がある)

事業会社のシステム開発部門・研究開発部門

  • 業界の概要

    • 研究開発やシステム開発だけでなく,機械学習などのデータ分析も活用していく
    • デメリット・留意点:エンジニアの仕事をすることになる場合もある,という配属リスクがある。
    • 「予測的・処方的な分析」を行う
  • 事例

    • 深層学習によるSNS画像解析を用いた「自社製品の使われ方」の分析やマーケティングへの応用
    • 研究開発過程で得たDNAデータの解析
  • この業界の企業の例

    • DeNA
      • データ分析に注力しており,Kaggleの優秀者は業務時間中にKaggleができるほどの注力ぶり
      • 日本に数十名しか居ないKaggle Masterのうち4名が在籍
    • Sansan
      • 名刺の画像認識が主要事業なので画像認識を専門にした機械学習エンジニアがいる
      • 日本に4人しか居ないKaggle Grandmasterという称号を持つトップクラスのデータサイエンティストが2人在籍
    • メルカリ
    • サントリーシステムテクノロジーサントリーグループのシステム部門)
      • 一部のエンジニアは「先端技術部」に配属され,機械学習エンジニアとして働く
    • ヤフー
      • 「データプラットフォーム&サイエンス領域エンジニア」という職種別採用がある。
      • しかし,データ分析は㈱ブレインパッドに委託することが多い模様。採用で出会った面接官も「kaggle?なにそれ?」みたいな反応だった。
      • 2018年頃から「データの会社」を標榜し始めたので,もしかしたら今後はデータ分析に注力するかもしれない。データは大量に保有しており,ディープラーニング用に作った世界2位のスパコン「kukai」を保有しているため解析できる環境もある。

参考

データ分析のレベルに関しての参考文献です

Prescriptive Analytics

アナリティクスの進化(Descriptive からPrescriptiveへ) | 欧州進出のIT支援はNewton IT

私が就活で体感した情報ばかりなので全く網羅的ではないと思いますが,データ分析を仕事にしたいと考えている就活生のお役に立つことがあれば幸いです。

*1:例えば自動車メーカーは自動運転の関係もありAI人材のニーズを持っているものの,「文系お断り」状態だった。

[読書メモ]津川 友介『世界一シンプルで科学的に証明された究極の食事』

世界一シンプルで科学的に証明された究極の食事

世界一シンプルで科学的に証明された究極の食事

を読みました。

この著者は過去に『「原因と結果」の経済学―――データから真実を見抜く思考法』という計量経済学・統計的因果推論の本を書いていて,そちらの本も面白かったので,今回の本も買ってみました。

この本は,初めにエビデンス(科学的根拠)のレベル(RCTのメタアナリシスが最もエビデンスレベルが高い,など)について述べて,その後本題に入ってからもエビデンスとそのレベルに基いて述べていたので(「こういう研究結果もあるが観察研究なので参考程度にしよう」みたいな),その点が学者らしい誠実な書き方だと思いました。

色々書かれているのですが,高いエビデンスレベルで分析されていて特に気をつけるべき食品は以下のものでした。

  • 高いエビデンスレベルで『健康に良い』ことがわかっている食品

    1. 野菜と果物(ジュース,じゃがいもは除く)
    2. 茶色い炭水化物(玄米や全粒粉など精製されていない炭水化物)
    3. オリーブオイル
    4. ナッツ
  • 高いエビデンスレベルで『健康に悪い』ことがわかっている食品

    1. 牛肉・豚肉などの「赤い肉」(鶏肉は含まない)とハムやソーセージなどの「加工肉」
    2. 白い炭水化物(白米や小麦粉などの精製された炭水化物及びじゃがいも)
    3. バターなどの飽和脂肪酸

野菜・果物と魚を摂取するように心がけ,それでは満腹感が足りないなら玄米や全粒粉の炭水化物やナッツ(ピーナッツも良いらしい)を食べよう,という感じですね。

以前に私が受講した栄養学の授業で聴いた話と近いものも多かったので,私にとっては結構受け入れられる内容でした。

[読書メモ]『やり抜く力 GRIT』

『やり抜く力 GRIT』

やり抜く力 GRIT(グリット)――人生のあらゆる成功を決める「究極の能力」を身につける

やり抜く力 GRIT(グリット)――人生のあらゆる成功を決める「究極の能力」を身につける

日本では2016年に出版され,その頃流行っていた本を2年遅れで読みました。

流行りの本にはなんとなく懐疑的で,この本も名前だけ知っていて読みはしなかったのですが,読んでみると,この本は学者が書いたものであり,中身は学術的な実証研究の結果を基に論じているため,非常に説得力がある本になっています。

この本の要点をざっくりまとめると,以下のような感じです。

  1. 成功に必要なのは「才能」ではなく,「情熱を持って努力し続ける力(やり抜く力:GRIT)」である
    • やり抜く力 = 情熱 + 粘り強さ
    • 情熱 := 一つの目標に継続的に取り組むこと。
    • 粘り強さ := 挫折してもあきらめずやり遂げること。
  2. 「やり抜く力(GRIT)」は伸ばすことができる
    • (1) GRITを自分自身で「内側から伸ばす」方法
      • 興味を掘り下げる:なにかに興味を持ち,疑問をもって学び,同じ興味を持つ仲間を探す
      • 「自分のスキルを上回る目標」を設定してはそれをクリアする練習を習慣化する
      • 自分が取り組んでいることが,自分よりも大きな目的(人々の役に立つこと)と繋がっていることを意識する
      • 絶望的な状況でも希望を持つことを学ぶ:失敗しない人はいない。失敗から学ぶことが重要。
    • (2) GRITを「外側から伸ばす」方法
      • 親・上司・メンターなど周りの人々が,GRITを伸ばすために重要な役割を果たす。
  3. GRITが強いほど,「幸福感」も強い
    • 成功(コンテストでの優勝,部署でのトップの業績など)と幸せは関係があるものの,同じものではない。
    • 2000人に対するアンケートでは,GRITが高いほど「人生への満足度」も高かった。
  4. GRITだけが重要なわけではない
    • 人の性格は複数の特徴からなる
    • 「偉大さ」と「善良さ」は異なるものであり,どちらかといえば「善良さ」のほうが重要だと筆者は思っている.
    • 過去の研究でも,人々が人を評価するときに最も重要なのは「道徳性」だった

「能力よりも努力(費やした時間)が重要だ」といった話は時折見かけますし,私も経験的にそう思うことはありますが,それを実証した研究結果とともに述べてくれているので,「自分の認識は正しかったんだ!」と納得できます。

著者が元教師であることもあり,人のGRITをどう育てたらよいかといった点についても過去の研究結果を引用しつつ述べていたりするので,人を育てる立場にいる人にとっても良い本だと思います。

ネット上の他の紹介記事でもこの本の内容の概要を掴めると思います:

内容の密度も結構高くて,買って損のない良い本でした。興味があったら買ってみてください。

Kindle Unlimitedが非常に便利なことに気づいた

大学生活の中で専門書ばかり読んでいて知識の狭さ・視野の狭さに危機感を感じてきたので,もう少し一般向けの書籍を読むように心がけようと考えています。

読み方としては,「じっくり読むのではなくざっと中身を読み,沢山の本に目を通していく」といった読み方を考えています。

そうした乱読をしていく際に,AmazonKindle,とりわけKindle Unlimitedというサービスが便利に思いました。

KindleとはAmazon電子書籍サービスで,Kindle Unlimitedとは月額980円でKindleの25%程度の本が読み放題になるサービスです。)

なぜ使おうと思ったのか

これまで私がKindleに対して抱いていたイメージとしては,「変な専用タブレット買わないと使えないんでしょ?」というものでした。

しかし,実際は専用アプリを入れればPCやスマホなど一般の端末でも使用できるようで,試しにPCにアプリを入れて使ってみた所使い勝手も悪くなかったので,かなり印象が変わりました。

また,Kindle Unlimitedに関しては,「どうせゴミみたいな本しか読み放題じゃないんでしょ?」と思っていたのですが,

Unlimited(無料で読み放題)の書籍が意外に多く,雑誌やコミックなどジャンルも幅広いため,月額980円ならかなり安いかなと思います。

Kindle / Kindle Unlimitedを使うメリットは?

現在感じているメリットは

  • 電子書籍なので本の置き場所に困らない
  • PC,スマホタブレットなど,様々な端末からアクセスできる
  • 本文をコピペできるので,サポートサイトがない技術書のコードの写経がしやすい
  • Kindle Unlimitedで支出を抑えつつ気軽に色んな分野の書籍に手を出すことができる

です。

デメリットとしては,「ディスプレイだと紙に比べて読みにくい」というものがあると思いますが,精読ではなく多読乱読していく場合は1ページ毎にじっくり読むことはないでしょうし,使い方によっては問題ないのかなと思います。

また,大きいディスプレイで読めば比較的読みやすかったりするので,大きいディスプレイを使う人とは相性がいいと思います。

私はデスクトップPCで2画面を使用しており,片方のディスプレイは縦置きにしているので見開き表示でも片面表示でも十分な大きさで閲覧できています。
(縦置きのほうはiiyamaのディスプレイを使っています:iiyama モニター ディスプレイ XB2481HSU-B1 (23.8インチ/フルHD/AMVA/HDMI,D-sub,DVI-D/昇降/ピボット/3年保証)

乱読してサっと内容を知る目的で読んでいく場合は安いほうがいいと思いますので,Kindle Unlimitedは有力な選択肢かなと思います。

一方で,ベストセラーの本やそのときの流行りの本はUnlimitedになっていない場合が多いと思いますので,そこは普通に買う ようにして,「その本の性質や格」や「読書の目的」にあわせて選択していけば良いと思います。

Webアプリ開発の入門の仕方を探索中

実装したい

以前,Rで予測モデルなどを作っても,他の人に使ってもらうときなどにどうやったら「RstudioからプログラムをRunしなくても実行できる形」にしたらいいのかがわからず苦労した経験があり,「分析だけでなく実装もできるようになりたい」と思うようになった。

「Webアプリに限らずアプリを自分で作れるようになりたい」と思ってしらべてみたところ,ローカル環境で動くアプリ(正しい呼称がわからないけど,Webアプリじゃないほうのアプリ)を作るには,それを動かすOSごとに別の言語で作る必要があるらしい(「Mac OSならSwift」とか)*1

一方でWebアプリなら,サーバーを用意する必要はあるものの,一つの言語で作ったものを多様なOSで動作させることができるらしい。

Webアプリをつくりたい

Rの{shiny}という,Javascriptで動くWebアプリをRから簡単に作ってくれるパッケージを使うことを覚えたが,簡単である反面カスタマイズ性は落ちるのと,便利である反面「中でどう動いているのか全然わからん」という状態になっていた。 f:id:nigimitama:20180324020055p:plain

PythonはしっかりしたWebアプリを作ることもできるようなので,PythonのWebアプリを勉強することに決めた。

Djangoに入門

Webフレームワークなるものを使っていくのがよいらしいのでDjangoというフレームワークを使っていきたい。

私のようなプログラミング初心者にとって,環境構築が最初の関門になるが,

PaizaCloudというサービスを使うと環境構築の手順をすっとばして使えるらしい。 この記事に簡単なチュートリアルもあるので雰囲気がつかめた。

とはいえ環境構築も避けられないのでこのあたりの記事を見ながら勉強していきたい。

*1:【入門者必見】アプリ開発のはじめの一歩とは | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト https://www.sejuku.net/blog/2619

松尾研究室の無料公開コンテンツがすごい

私のスマホにはニュースアプリが複数入っているのですが,その複数のアプリで最近ハイライトされていたニュースが「松尾研 講座の演習問題を無料公開」という話でした。

AIブームのために世間からの注目がそれだけ強いのか,それともニュースアプリが私向けにレコメンドしているのか…

松尾研の公開コンテンツ

私の知る限り松尾研は2つコンテンツを公開してくれています。

  1. Deep Learning基礎講座演習コンテンツ 公開ページ | 東京大学松尾研究室 - Matsuo Lab
  2. グローバル消費インテリジェンス寄附講座演習コンテンツ 公開ページ | 東京大学松尾研究室 - Matsuo Lab

どちらも演習コンテンツといってもかなりレジュメに近い部分があり,(私にとっては)非常に勉強になりそうです。読んでみることにします。

相関とその指標(相関係数)についての勉強

今回は相関についてメモします。

相関

2つ変数があるときに,
「片方の変数の値が大きいほど,もう一方の変数の値も大きい」という傾向がある時,2つの変数間には正の相関があるという。
「片方の変数の値が大きいほど,もう一方の変数の値が小さい」という傾向がある時,2つの変数間には負の相関があるという。
(本橋,2015,『Rで学ぶ統計データ分析』)

相関の指標

f:id:nigimitama:20180302101026p:plain

アンスコムの例 - Wikipedia

2変数間の関係を見たいとき,変数が多い場合などは相関係数というひとつの指標にまとめたほうが便利なときもあります。

ただ,やっぱり目視で確認するのが一番良くて,相関係数だけを見て判断するのは危険だということを留意した上で使う必要はあります(上の図のようなケースもあるので)。

ピアソンの積率相関係数

一般的に,「相関係数」といったときはこれを指します。

数式的な定義は以下の通り。

2つの変数x,yがあるとき,その平均を\bar{x},\bar{y},共分散をs_{xy}標準偏差s_x,s_yとおく。このとき相関係数

r_{xy} = \displaystyle\frac{s_{xy}}{s_x s_y} = \frac{\displaystyle \sum^n_{i=1}(x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\displaystyle \sum^n_{i=1}(x_i-\bar{x})^2}\sqrt{\displaystyle \sum^n_{i=1}(y_i-\bar{y})^2}}

上の図のデータ(anscombe)をピアソンの積率相関係数を使って算出すると以下のようになります

pearson = c(cor(anscombe$x1, anscombe$y1),
            cor(anscombe$x2, anscombe$y2),
            cor(anscombe$x3, anscombe$y3),
            cor(anscombe$x4, anscombe$y4))
> pearson
[1] 0.8164205 0.8162365 0.8162867 0.8165214

ピアソンの相関係数は2つの変数の直線的な関係を測る指標であり,非線形な関係は評価出来ません。

スピアマンの順位相関係数

変数の線形性を仮定しないノンパラメトリック相関係数もあります。

経済学分野では見かけることがなく,私の手元にある統計学の入門書にも載っていない相関係数です(分野によってはたくさん使うのかな?)。

2つの変数を順位に変換し,順位の差などを使って計算を行なうそうです。nはペアの数。

\rho = 1-\displaystyle\frac{6\displaystyle\sum^n_{i=1}(x_i-y_i)^2}{n^3-n}

上の図のデータ(anscombe)をスピアマンの順位相関係数を使って算出すると以下のようになります。

spearman = c(cor(anscombe$x1, anscombe$y1, method = "spearman"),
             cor(anscombe$x2, anscombe$y2, method = "spearman"),
             cor(anscombe$x3, anscombe$y3, method = "spearman"),
             cor(anscombe$x4, anscombe$y4, method = "spearman"))
> spearman
[1] 0.8181818 0.6909091 0.9909091 0.5000000

ケンドールの順位相関係数

(x_i,y_i), (x_j,y_j)という2個のペアのデータについて, (x_i<x_j), (y_i<y_j)のように順位の大小関係が一致している場合,すなわち(x_i − x_j)(y_i − y_j)>0のペアの数をK
(x_i<x_j), (y_i>y_j) のように順位の大小関係が不一致の場合,すなわち(x_i − x_j)(y_i − y_j)<0のペアの数をL としてK-L{}_n\mathrm{C}_2で割った値をケンドールの順位相関係数\tauとする。

  \displaystyle \tau =\frac{K-L}{{}_n\mathrm{C}_2} = \frac{K-L}{\frac{1}{2}n(n-1)}

上の図のデータ(anscombe)をケンドールの順位相関係数を使って算出すると以下のようになります。

kendall = c(cor(anscombe$x1, anscombe$y1, method = "kendall"),
             cor(anscombe$x2, anscombe$y2, method = "kendall"),
             cor(anscombe$x3, anscombe$y3, method = "kendall"),
             cor(anscombe$x4, anscombe$y4, method = "kendall"))
> kendall
[1] 0.6363636 0.5636364 0.9636364 0.4264014

また,最近登場した指標では,MICやHSICといったものもあるらしいです。

MIC ( Maximal information coefficient )

MICの解説は,林先生のブログやLogics of Blueさんの解説が分かり易かったです。

"相関"の話&そのついでに"21世紀の相関(MIC)"の話(ややマニア向け) - Take a Risk:林岳彦の研究メモ

http://takehiko-i-hayashi.hatenablog.com/entry/20130426/1366948560

MICはピアソンの相関係数のようには単純な数式では表せず、コンピュータによってゴリゴリと計算されます。基本的なアルゴリズムとしては、データ散布図を様々な数のグリッド(=解像度)で区切っていきながら、様々な解像度の値において相互情報量が最大(=各グリッド内に含まれるデータ密度のコントラストが最大となるようなイメージ)となるような区切り方を決定し、それらを規格化したのちの最大の情報量をMICの値として選択しているようです

MICの解説

https://www.slideshare.net/logics-of-blue/mic-31810194

f:id:nigimitama:20180302120813p:plain

相互情報量(Mutual Information)は

I(X;Y)=\displaystyle \sum_{y\in{Y}}\sum_{x\in{X}}p(x,y)\log{\frac{p(x,y)}{p(x)p(y)}}

であり,独立p(x,y)=p(x)p(y)のときには相互情報量はゼロになります。

上の図のデータ(anscombe)の算出結果

library(minerva)
mic = c(mine(anscombe$x1, anscombe$y1)$MIC,
        mine(anscombe$x2, anscombe$y2)$MIC,
        mine(anscombe$x3, anscombe$y3)$MIC,
        mine(anscombe$x4, anscombe$y4)$MIC)
> mic
[1] 0.9940302 0.6394725 0.9940302 0.4394970

ただし,MICはノイズに弱いという欠点があるようです。 - 21世紀の手法対決 (MIC vs HSIC) https://www.slideshare.net/motivic/tokyo-r-lt-25759212

HSIC ( Hilbert-Schmidt Independence Criteria )

データを再生核ヒルベルト空間(RKHSs)に飛ばし、そこでの関係性を見ることで非線形でも関係性を見出す手法のようです。

私は数学の勉強不足により理論のほうは理解できていません…

HSICは相関係数というよりも独立性の検定として使われるようです。

参考

Rで行う場合,{dHSIC}や{hsicCCA}や{EMD}といったパッケージがあるようです。

# dHSICのp.value
library(dHSIC)
hsic_test_pvalue = c(dhsic.test(anscombe$x1, anscombe$y1, kernel = 'gaussian')$p.value,
                     dhsic.test(anscombe$x2, anscombe$y2, kernel = 'gaussian')$p.value,
                     dhsic.test(anscombe$x3, anscombe$y3, kernel = 'gaussian')$p.value,
                     dhsic.test(anscombe$x4, anscombe$y4, kernel = 'gaussian')$p.value)
> hsic_test_pvalue
[1] 0.008991009 0.000999001 0.000999001 0.087912088

HSIC以降の独立性の検定

HSICも新たな手法に上回られているようで,より良い指標の研究はどんどん進んでいるようですね

第50回R勉強会@東京で発表してきた - INPUTしたらOUTPUT!

http://estrellita.hatenablog.com/entry/2015/09/05/232731

  • MICの課題
    • ノイズに弱い
    • グリッドでやるやり方はオワコン
    • これからは再生核ヒルベルト空間
    • と思ってた時代がありました(2年前)
  • HSIC/dCorよりもTICを使った方がよい
  • SDDPも良いかも

An Empirical Comparison of the Maximal and Total Information Coefficients to Leading Measures of Dependence

Regarding equitability, our analysis finds that MIC_e is the most equitable method on functional relationships in most of the settings we considered.

Regarding power against independence, we find that TIC_e and Heller and Gorne's S^{DDP} [Heller et al., 2016] share state-of-the-art performance, with several other methods achieving excellent power as well.

TIC_e

total information coefficient(総情報係数)でTIC_eらしいです。

原文

  • Yakir A. Reshef, David N. Reshef, Hilary K. Finucane, Pardis C. Sabeti, and Michael Mitzenmacher. Measuring dependence powerfully and equitably. Journal of Machine Learning Research, 17(212):1-63, 2016. http://jmlr.org/papers/v17/15-308.html

…理論はいつか時間のあるときに勉強してみたいと思います。

Rでは{minerva}でmine()を使えばMICなどと一緒に出力されるようなので,使う事自体は簡単にできます。

library(minerva)
tic = c(mine(anscombe$x1, anscombe$y1)$TIC,
        mine(anscombe$x2, anscombe$y2)$TIC,
        mine(anscombe$x3, anscombe$y3)$TIC,
        mine(anscombe$x4, anscombe$y4)$TIC)
> tic
[1] 0.9940302 0.6394725 0.9940302 0.4394970

アンスコムの例くらいのデータではノイズが少ないのか結果はMICと同じでした

> data.frame(mic, tic, 'equal' = (mic == tic))
        mic       tic equal
1 0.9940302 0.9940302  TRUE
2 0.6394725 0.6394725  TRUE
3 0.9940302 0.9940302  TRUE
4 0.4394970 0.4394970  TRUE

S^{DDP}

原文

Rでの実装はlibrary(HHG)でできます。 これもいつかちゃんと理論を理解して実行したいところです。

まとめ:アンスコムのデータと各手法

ちょこちょことアンスコムのデータの相関係数を算出していたものをまとめると以下のようになります。

> data.frame(pearson, spearman, kendall, mic, tic)
    pearson  spearman   kendall       mic       tic
1 0.8164205 0.8181818 0.6363636 0.9940302 0.9940302
2 0.8162365 0.6909091 0.5636364 0.6394725 0.6394725
3 0.8162867 0.9909091 0.9636364 0.9940302 0.9940302
4 0.8165214 0.5000000 0.4264014 0.4394970 0.4394970

f:id:nigimitama:20180302163703p:plain

f:id:nigimitama:20180302164859p:plain

x2,y2のグラフは非線形ながらはっきりした傾向があるように思いますがMICはおもったより低いですね。

おまけ:もう少し複雑なデータで相関係数を比較

f:id:nigimitama:20180302175605p:plain

アンスコムのほうでは順位相関係数もいい感じでしたが,こちらだとだめですね。 MICの凄さが際立ちます。

(もしグラフのコードに関心のある方がいたらこちらをどうぞ)

棒グラフ

anscor <- data.frame(pearson, spearman, kendall, mic, tic)
anscor['datasets'] <- as.factor(rownames(anscor))
library(ggplot2)
library(reshape2)
anscor_melted <- melt(anscor)
colnames(anscor_melted) <- c('dataset','method','value')
ggplot(anscor_melted, aes(x = dataset, y = value, fill = method))+
  geom_col(position = 'dodge')+
  geom_label(aes(label = round(value, digits = 3), y = value + 0.01), alpha = 0.3, position = position_dodge(0.9), vjust = 0)+
  labs(y = 'correlation coefficient')

グラフを4つまとめて表示する関数: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/

multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) {
  library(grid)
  
  # Make a list from the ... arguments and plotlist
  plots <- c(list(...), plotlist)
  
  numPlots = length(plots)
  
  # If layout is NULL, then use 'cols' to determine layout
  if (is.null(layout)) {
    # Make the panel
    # ncol: Number of columns of plots
    # nrow: Number of rows needed, calculated from # of cols
    layout <- matrix(seq(1, cols * ceiling(numPlots/cols)),
                     ncol = cols, nrow = ceiling(numPlots/cols))
  }
  
  if (numPlots==1) {
    print(plots[[1]])
    
  } else {
    # Set up the page
    grid.newpage()
    pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout))))
    
    # Make each plot, in the correct location
    for (i in 1:numPlots) {
      # Get the i,j matrix positions of the regions that contain this subplot
      matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE))
      
      print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row,
                                      layout.pos.col = matchidx$col))
    }
  }
}

アンスコムのグラフ

p1 <- ggplot(anscombe, aes(x = x1, y = y1))+
  geom_point(color = 'orange', size = 3)+
  geom_smooth(method = "lm", se = F)+
  annotate("text", x = 6, y = 11, label = "pearson : 0.816")+
  annotate("text", x = 6, y = 10.5, label = "spearman : 0.818", color = 'darkorange')+
  annotate("text", x = 6, y = 10, label = "kendall : 0.636", color = 'darkgreen')+
  annotate("text", x = 6, y = 9.5, label = "MIC : 0.994", color = 'darkblue')
p2 <- ggplot(anscombe, aes(x = x2, y = y2))+
  geom_point(color = 'orange', size = 3)+
  geom_smooth(method = "lm", se = F)+
  annotate("text", x = 12, y = 4.5, label = "pearson : 0.816")+
  annotate("text", x = 12, y = 4, label = "spearman : 0.691", color = 'darkorange')+
  annotate("text", x = 12, y = 3.5, label = "kendall : 0.564", color = 'darkgreen')+
  annotate("text", x = 12, y = 3, label = "MIC : 0.639", color = 'darkblue')
p3 <- ggplot(anscombe, aes(x = x3, y = y3))+
  geom_point(color = 'orange', size = 3)+
  geom_smooth(method = "lm", se = F)+
  annotate("text", x = 6, y = 13,  label = "pearson : 0.816")+
  annotate("text", x = 6, y = 12.5, label = "spearman : 0.991", color = 'darkorange')+
  annotate("text", x = 6, y = 12,  label = "kendall : 0.964", color = 'darkgreen')+
  annotate("text", x = 6, y = 11.5, label = "MIC : 0.994", color = 'darkblue')
p4 <- ggplot(anscombe, aes(x = x4, y = y4))+
  geom_point(color = 'orange', size = 3)+
  geom_smooth(method = "lm", se = F)+
  annotate("text", x = 10, y = 13, label = "pearson : 0.816")+
  annotate("text", x = 10, y = 12.5, label = "spearman : 0.500", color = 'darkorange')+
  annotate("text", x = 10, y = 12, label = "kendall : 0.426", color = 'darkgreen')+
  annotate("text", x = 10, y = 11.5, label = "MIC : 0.439", color = 'darkblue')
multiplot(p1, p3, p2, p4, cols=2)