iPython notebookチャレンジ(カイ二乗検定)

IPython データサイエンスクックブック』の第7章のレシピ7.4を写経して、jupyterのdownload asでhtmlをはき出し、そのままブログに貼り付けてみました。色とかおかしいところがあるので、出力方法に関しては今後色々と調べなくてはなりません。ただ、実際に触ってみて、ユーザーインターフェースに関してRとの著しい乖離はない印象です。ここでは扱いませんが、ランダムフォレストを用いた重要な回帰特徴量などもRに比べてコードの長さも遜色ありませんでした。iPython jupyterはRからPythonへ手を広げるハードルを下げてくれる良い環境だと思いました。
以下では、Datasets used in the IPython Cookbook, the definitive guide to high-performance scientific computing and data science in Pythonのtennisという、テニス大会と選手に関するデータをもとに、ロジャー・フェデラーのエースと得点との関係を扱っています。手法としては相関係数の計算と、カイ二乗検定を行っています。








In [1]:
#NumPy,pandas,SciPy.stats,matplotlibをインポートする。
import numpy as np
import pandas as pd
import scipy.stats as st
import matplotlib.pyplot as plt
%matplotlib inline
In [2]:
#ロジャー・フェデラーのデータを読み込む。カレントディレクトリにデータを置いておきましょう。
player = 'Roger Federer'
filename = "data/{name}.csv".format(
                       name=player.replace(' ', '-'))
df = pd.read_csv(filename)
In [31]:
#データを確認する。
print("Number of columns: " + str(len(df.columns)))
df[df.columns[:8]].tail()
Number of columns: 70
Out[31]:
year tournament start date type surface draw atp points atp ranking
1174 2012 Australian Open, Australia 16.01.2012 GS Outdoor: Hard Draw: 128 720 3
1175 2012 Doha, Qatar 02.01.2012 250 Outdoor: Hard Draw: 32 90 3
1176 2012 Doha, Qatar 02.01.2012 250 Outdoor: Hard Draw: 32 90 3
1177 2012 Doha, Qatar 02.01.2012 250 Outdoor: Hard Draw: 32 90 3
1178 2012 Doha, Qatar 02.01.2012 250 Outdoor: Hard Draw: 32 90 3
In [4]:
#全ポイントに占める特典の割合とエースの割合だけを表示する。
npoints = df['player1 total points total']
points = df['player1 total points won'] / npoints
aces = df['player1 aces'] / npoints
In [5]:
plt.plot(points, aces, '.')
plt.xlabel('% of points won')
plt.ylabel('% of aces')
plt.xlim(0., 1.)
plt.ylim(0.)
Out[5]:
(0.0, 0.16)
In [6]:
#二つの列だけを持つDataFrameオブジェクトを新しく作る。
df_bis = pd.DataFrame({'points': points,
                      'aces': aces}).dropna()
df_bis.tail()
Out[6]:
aces points
1173 0.024390 0.585366
1174 0.039855 0.471014
1175 0.046512 0.639535
1176 0.020202 0.606061
1177 0.069364 0.531792
In [7]:
#ピアソン相関係数を計算する。
df_bis.corr()
Out[7]:
aces points
aces 1.000000 0.255457
points 0.255457 1.000000
In [9]:
#変数の二値化
df_bis['result'] = df_bis['points'] > df_bis['points'].median()
df_bis['manyaces'] = df_bis['aces'] > df_bis['aces'].median()
In [10]:
#それぞれの可能性の頻度からなる分割表を作る。
pd.crosstab(df_bis['result'], df_bis['manyaces'])
Out[10]:
manyaces False True
result
False 300 214
True 214 299
In [11]:
#カイ二乗検定の統計値とp値の計算(2番目の数値がp値)
st.chi2_contingency(_)
Out[11]:
(27.809858855369555,
 1.3384233799633629e-07,
 1,
 array([[ 257.25024343,  256.74975657],
        [ 256.74975657,  256.25024343]]))
In [ ]:
 

RstanでCVRの前後比較をするためのコード

目的

データサイエンス界隈の方がP値での意思決定に警鐘を鳴らしている昨今、施策実施に関するCVRの前後比較をχ2乗検定のP値を用いるのではなく、ベイズ統計学によるアプローチにチャレンジしてみたいと思いました。『基礎からのベイズ統計学』の8章で取り上げられていた比率データに対してのベイズ統計学的アプローチをもとに、stanを用いて事後分布から意思決定をするための進め方を紹介します。

進め方

・データの整形
・stanコード作成
・rstanでの引数の指定
・rでの可視化

データの特徴

Webマーケティング界隈では大変に多用するデータだと思いますが、実験を行ったユーザーに対しての開封・非開封、これまで通りのユーザーの開封・非開封の自然数からなるデータです。

スクリーンショット 2016-03-13 22.30.16

stanコード

stanコードは
・dataブロック
・parametersブロック
・transformed parametersブロック(今回は不使用)
・modelブロック
・generated quantitiesブロック
からなります。
今回は自然数のデータであることから、ディリクレ分布を事前分布に設定するために、parametersブロックにおいてsimplexを指定しています。(教科書の比率データのものをそのまま使っています。)
modelは二項データしか出てこないので、二項分布を用いています。generated quantitiesブロックでは各々の比率、比率の差、比率の差が0を超える確率・0.01を超える確率、リスク比、リスク比が1を超える確率、オッズ比などを出力するようにしています。

rコード

以下は、stanをrで実行し、ggplot2などで可視化するためのコードが記されています。

推定結果&可視化

今回の例では、実験を行ったユーザーのCVRの差が0以上の確率(delta_over)が1.0なので、ほぼ確実に差があると言えそうです。0.01以上差がある確率も1.0なので1%以上は差があると言えそうです。リスク比(RR)に関しては2.47と実験しない場合と比べて2.47倍程度CVを高めています。オッズ比(OR)は2.63とあるので、実験によるCV増大効果が2.63倍あると考えることができます。χ2乗検定では、二つの集団が独立かどうかを検定していますが、ベイズ統計学に従えば、「1%を超える確率」を算出することが容易なので、ディレクターなどに説明する際は圧倒的に理解を得られそうな気がします。

posterior_distribution_2

参考文献

基礎からのベイズ統計学: ハミルトニアンモンテカルロ法による実践的入門
rstanでちょこちょこ

ディープラーニングの基礎まとめ

【目次】
・ディープラーニングとは
・ディープラーニングでできること
・ディープラーニング実行のためのライブラリ
・参考文献

ディープラーニングとは

階層の深いニューラルネットワークを利用したアルゴリズムの総称。
様々なアルゴリズムが存在する。

  • Convolution Neural Network(CNN)
  • 畳み込み層とプーリング層と呼ばれる層を持つニューラルネットワークの総称
    CNNは画像認識に良く利用され、畳み込み層やプーリング層が画像における局所的な情報の抽象化や位置の不変性を持たせる役割を担っています。人間の視野の構造にも近いとされているらしいです。

      畳み込み層
      前の層の中で近くにあるノード同士の集合が、次の層のノードと接続するような構造を持つ層のこと。画像の局所的な部分の特徴を様々な方法で浮き立たせる役割を果たす。

    スクリーンショット 2016-03-05 15.28.10

      プーリング層
      前の層のノードの局所的な部分をまとめあげる処理のこと。局所的な部分の最大化を取る処理は「最大プーリング」と呼ばれる。プーリング層の役目は位置変更への感度を下げることで、小さな平行移動に対する不変性を持たせることにあります。

    スクリーンショット 2016-03-05 15.36.42

  • AutoEncoder
  • 入力層(画像データなどの特徴量)と出力層(判別したいカテゴリなど)が同一のサイズのノードを持つ層となるニューラルネットワークを利用したアルゴリズム。利用する隠れ層は一般的に、入力層や出力層よりも小さいものにするそうです。隠れ層は1層である必要性はなく、複数置くこともできます。AutoEncoderの役割としては、入力層と出力層の値がなるべく同じ値を出力しながら、欠損を極力少なくして、情報を圧縮することです。その結果として、データをよく表す特徴を獲得したり(なんだか主成分分析的なものを感じますね。)、深いネットワークを解く際の初期値を手にいれることができます。圧縮することで、深い階層のネットワークでもうまく計算できるということになります。

    スクリーンショット 2016-03-05 15.57.52

  • Recurrent Neural Network(RNN)
  • 先ほど挙げたCNNやAutoEncoderの前提となるデータは固定長と呼ばれ、つまり画素数などのピクセルが一定のものを値としてとります。しかしながら、画像のデータ以外は固定長データではないものが多いので、扱うことができません。実際、音声の長さやテキストの文字数はデータによってバラバラです。そこで、可変長のデータを扱えるようにしたものが、Recurrent Neural Network(RNN)です。音声認識処理や自然言語処理で利用されているそうです。
    RNNの特徴は、Recurrent(再帰)の字面の通り、隠れ層において再帰的な構造を持つことで前の状態を再び使いながら計算を行うことです。どうして再帰によって可変長が扱えるようになるのかは、理解が追いついていないですが、同じデータの長さでなくても、隠れ層で得た知見を活かせるという仕組みのようです。

    スクリーンショット 2016-03-05 16.34.49

    ディープラーニングでできること

  • 画像認識
  • 不適切なコンテンツ検知
    画像の意味分析
    画像のキャプション
    CLOUD VISION API
    Cloud Vision APIの凄さを伝えるべくRasPi botとビデオを作った話

  • 音声認識
  • iOSのSiriなどに活用されている。従来の手法である隠れマルコフを利用した場合はエラー率が25.8%であったのに対して、ディープラーニングでは16%のエラー率に改善されているそうです。

    CRMのデータとかアクセスログデータにおいての活用に関心がありますが、数は少ないものの、活用している企業はあるようです。ディープラーニングとアクセス解析の事例はググっても出てこなかったのは残念です。
    (基礎調査)Deep Learning は、ビジネス や 産業の現場で どこまで使われているのか?

    ディープラーニング実行のためのライブラリ

    実行するためのライブラリですが、非常に多くのものが用意されているようです。私はTensorFlowやChainerやTheano・Caffe・Pylearn2くらいしか目にしかことはなかったです。インストールも簡単ですし、Pythonを用いるという観点からはChainerが一番興味があります。

    ・TensorFlow
    ・Chainer
    ・Theano
    ・Pylearn2
    ・PyBrain
    ・nolearn
    ・Cuda-convnet2
    ・Torch7
    ・deeplearning4j
    ・Caffe
    ・DeepDream

    ディープラーニングの有名ライブラリ5種を最短距離で試す半日コース(TensorFlow, Chainer, Caffe, DeepDream, 画風変換) – Over&Out その後

    参考文献

    初めてのディープラーニング –オープンソース”Caffe”による演習付き

    機械学習プロフェッショナルシリーズ輪読会 #2 Chapter 5 「自己符号化器」 資料

    OS X YosemiteへのTensorFlowのインストールと簡易な分類モデルの実行

    遅ればせながらTensorFlowをインストールしてみようと思います。
    環境はOSX Yosemite version 10.10.5です。

    まずは、こちらのサイトにあるように、ターミナル(Windowsでいうところのコマンドプロンプト)にて、
    以下のコードを実行します。(前提として、Python2.7とpipが入っているものとします。)

    こちらを実行すれば、インストールされます。

    次に、画像を格納しておくためのディレクトリを作成します。
    同じくターミナルにて以下のコードを実行します。

    次に、こちらのgithubより、MNISTの画像を取得するコードをコピーします。

    コピーしたものを、先ほどのターミナル上で表示されているvimにて、
    i
    を押してからペーストし、Escを押してコマンドモードに移り、
    :wq
    を入力することで上書きしてファイルを閉じます。
    詳しくはvimコマンド一覧をご覧ください。

    そして、ターミナル上でpythonを開き、以下のコードを実行します。

    そうすることで、フォルダが作られデータが格納されていることが確認できると思います。
    だいたい11MBくらいのボリュームです。元の画像は手書き文字で、28×28ピクセルの画素だそうです。

    さて、このデータに対する機械学習による分類の実行ですが、
    TensorFlow 畳み込みニューラルネットワークで手書き認識率99.2%の分類器を構築」こちらで紹介されているコードを丸々引用させていただきます。これの初級者用のロジスティック回帰モデルのものを扱います。(試行回数を1000回から50000回に変更しています。)

    こちらを実行したところ、

    ****MNISTデータ読み込み****
    Extracting MNIST_data/train-images-idx3-ubyte.gz
    Extracting MNIST_data/train-labels-idx1-ubyte.gz
    Extracting MNIST_data/t10k-images-idx3-ubyte.gz
    Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
    ****Start Tutorial****
    ****init****
    ****50000回学習と結果表示****
    0.914

    と試行回数を50000まで増やしても、Qiita初級者向けモデルの1000回試行の0.91と比べてあまり良くなりませんでした。
    紹介されていたQiitaの上級者向けモデルでは0.992まで持って行っていましたので、上級版もチャレンジしてみたいですね。
    勉強しないとここらへんの改良はできないので、今後学習していこうと思います。