盆暗の学習記録

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

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

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

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)

データサイエンス(統計学・機械学習)を鳥瞰する

データサイエンス(ここでは統計学機械学習をまとめてこう呼ぶことにします)をざっくりと眺めることを考えてみます。

  1. 鳥瞰の仕方(分類の仕方)を考える
  2. 鳥瞰する(分類して,ざっくり解説していく)

の流れになります。本題は2.のほうです。

1. まず分類する方法を考える

データサイエンスをどういう切り口で分類していくかを模索しています。

いまのところ,①ジャンルで整理していく方法,②その手法が果たす役割・目的で整理していく方法,の2つを考えています。

(1) ジャンルで整理

統計学なら「記述統計」「推測統計」「多変量解析」「時系列分析」…などという分け方,機械学習なら「ニューラルネット系」「決定木系」などという分け方(この分け方はイマイチな気がするが),あるいは「教師あり」「教師なし」などという分け方

といった具合に教科書などを参考にジャンル分けしていく方法があるかなと。

たとえば以下のような感じです。(厳密な分け方ではありませんが,だいたい合ってると思います)

f:id:nigimitama:20181118002126p:plain

このタイプのアプローチでは工藤(2013)がいい感じの表を作っていました。 f:id:nigimitama:20180227171347p:plain

また,統計検定の出題範囲表もこのような分類方法ですね。

(2) 機能・目的で整理

分析結果として何が得られるかで整理していくアプローチもあるかなと思います。

例えば「記述」「予測」「因果推論」…といった具合に。これなら統計学の手法でも機械学習の手法でも統一して分類していくことができます。

表にするなら,例えばこんなかんじでしょうか。だいぶスッキリまとまりました。

f:id:nigimitama:20181116025229p:plain

また,機能ごとに分けるのであればジャンルで整理するアプローチに比べて紹介していく項目数も減るため,同じ紙幅であったとしても図を載せる余裕が出やすく,視覚的に説明しやすいことも利点でしょう。

2. 目的別に分類する方法でざっくり解説

前節の後者のアプローチでざっくり述べていきます。

f:id:nigimitama:20181116025229p:plain

記述的分析(Descriptive Analytics)

記述的分析はデータから「何が起きたのか」を知るための分析です。この手法は,データの分布から現実世界の事象を想像することになるため,「データ」「正しい分析」「事象に関する知識(ドメイン知識)」が必要になります。

以下で具体的な分析手法の例とその解説を行っていきます。

記述統計

f:id:nigimitama:20181116031116p:plain

グラフを描いたり,平均値や相関係数などを算出したりしてデータの関係性を把握する方法です。

回帰分析

f:id:nigimitama:20181116032628p:plain

回帰分析は変数間の関係を知ることや,予測のために使われる手法です。

例えば図のように2変数(横軸をX,縦軸をYとします)があり,線形に規則性のある分布をしているデータがあるとき,

 Y = \alpha + \beta X

という関係を仮定して,この傾きの係数 \betaを推定する手法です。

それによって,例えば「 Xが1増加したときに, Yは2増加している!」といった情報を得ることができます。

2変数だけでなく,もっと多くの変数の間の関係も同様に推定できるため,相関係数よりも強力な相関分析の手法です。

(回帰分析は(1)相関関係の分析,(2)因果関係の分析,(3)予測,のどれにも使える手法で,これは(1)の使い方をしています)

決定木

f:id:nigimitama:20181116032652p:plain

決定木は条件分岐によってデータの規則性を見つけていく方法です。

決定木は単体では「弱い学習器」と呼ばれる予測精度の低い分析手法ですが*1,条件分岐という人間の意思決定にも近いモデルでデータの関係を表現でき,記述的分析にも使われます。

f:id:nigimitama:20181116033613p:plain

分析の目的変数を表しているのが図の青い丸とオレンジの四角で,この例ではこの2つの値をとるものと想定しています。分析の説明変数は図の x_1, x_2の変数で,これらが「いくつ以上のとき」といった条件でyes,noに分岐して目的変数を説明します。

例えば,目的変数が「サービスを退会した/しなかった」の2つの値だとしてみましょう。例えば,「年齢が50歳以上」で「年収が600万円以上」の領域(ユーザーのセグメント)では「サービスを退会する人が多くなる(退会する確率が高くなる)」といった情報を得ることができます。

教師なし学習

上の「回帰分析」や「決定木」は「教師あり学習」とも呼ばれるもので,「目的変数」が存在している状況での分析に使われます。

一方,「教師なし学習」は,目的変数が存在しない状況で,純粋にデータの分布から特徴を探索していく手法になります。

例えば主成分分析(principal component analysis:PCA)という手法があります。これはたくさんの変数があるデータから,それぞれの変数のもつ情報をまとめ,変数の数を減らす手法です。

変数の数を減らして何が嬉しいのかというと,例えば2変数にまで減らすことができれば,散布図などにすることができるためです。

例えば,自社の商品と他社の商品を比べたいとき,商品の特徴に関するデータをとってきたとしても,変数の数が多いと比較する基準が多すぎてよくわからなくなります。そこで,主成分分析などを使って変数の数を減らすことができれば,散布図を作ってポジショニングマップとして市場での立ち位置の異同を把握することができます。

f:id:nigimitama:20181116035501p:plain

診断的分析(Diagnostic Analytics)

データから,「なぜ起きたのか」を明らかにするのがこの分析の目的です。

データサイエンスでは,統計的因果推論という,データから物事の因果関係を推し量る方法があります。

医学など学術ではランダム化比較試験(RCT)というものが有名で,これはビジネスの世界ではA/Bテストという名前で呼ばれています。どういう手法かを以下で述べていきます。

まず,「因果関係がわかる理想的な状態とは何か」について考えてみましょう。例えば薬の効果を知りたいとき,ある時点のある人物(仮にAさんとします)を2人用意して,両者への処置を変えて「薬を与えられるAさん」,「薬を与えられないAさん」を用意して両者を比較すれば,Aさんにとっての薬の効果を知ることができそうです。

ただし,これは理想的な状態を考えているにすぎず,実際はある時点に同一人物を2人用意するのは不可能です(これを因果推論の根本問題といいます)。

この問題を回避するために,RCTでは,「薬を与えられるグループ」「薬を与えられないグループ」の2グループを用意し,被験者を両グループをへとランダムに割り振り,両グループでの効果を比較して薬の効果を推定します。

(同一時点に同一人物を2人用意することはできないが,ランダム割付を使えばグループの個体差を均等化して同一時点に同一グループと見なせるものを2つ用意することはできる,という考え)

予測的分析(Predictive Analytics)

「何が起こりそうか」など,予測を行う分析です。

教師あり学習

上で述べた回帰分析や決定木のように,予測の目的変数(回帰分析でいうと Y)がある場合の機械学習教師あり学習と呼びます。

「次期に仕入れるべき商品の数量の予測」も,「画像に何が写っているかを予測(識別)」するのにもこのタイプの分析が使われています。

処方的分析(Prescriptive Analytics)

「何をすべきか」を明らかにするための分析です。予測的分析のあとの具体的な最適化を行います。

レコメンデーション

レコメンデーションシステムによる「おすすめ」の表示のことです。

レコメンデーションエンジンについては種類が豊富なので割愛します

異常検知

工場での不良品の検知や,インフラ整備現場において収集された画像データから亀裂箇所の発見など,異常な値を検知してアラートを出すための分析のことです。

その他予測的分析の結果の応用

他にも,「広告の閲覧者の情報("20代,女性"など)を説明変数にしてクリック率の予測を行い,予測値が最も高い広告を配信する」,「顧客ごとの情報から成約率を予測し,予想成約率が高い顧客から優先的にセールスを投入する」などもあります。

参考

これからデータ分析を始めたい人のための本

これからデータ分析を始めたい人のための本

*1:ちなみに,多数の決定木をまとめあげる派生手法が多数存在し,それらはきわめて強力な予測手法です

ブログはじめます

ブログを開設した経緯

データサイエンスを中心に,日々色々なことを学び,覚えきれないためwordやmarkdownにメモしてプライベートな記録領域に残していますが,もう少し別の記録方法を模索してみようと思いました。

 

 

基本的に自分の備忘録とすることを目的としていますが,誰かの役に立つこともあれば幸いです。

 

ジャンルは統計学計量経済学機械学習,その他プライベートな分野,について書いていこうかと思います。