EPG's BLOG

某金融会社の社内SE。気になったことをちょいちょい書いていきます

データサイエンス講義 3章「アルゴリズム」

データサイエンス講義の第3章について。

※数式は、Texでも記述できるらしいが、まだブログ上での記載方法が分からないので、ひとまずプレーンテキストにて記述。

 

データサイエンス講義

データサイエンス講義

 

 

アルゴリズム:タスクを達成するための手続き、手順、ルールの集合
ベストなアルゴリズム:効率が良い、計算時間が短いetc.

データサイエンスに関して、知っておくべきアルゴリズム3つ。
1.データ変更、準備、処理のアルゴリズム
    - ソートやMapReduce、Pregal etc.
2.パラメータを推定する最適化アルゴリズム
    - 確率的勾配降下法ニュートン法、最小二乗法etc.
3.機械学習アルゴリズム


3.1 機械学習アルゴリズム

用途:予測、分類、クラスタリング

●統計モデリング機械学習アルゴリズムの違い

■生み出された分野
統計モデリング:統計の分野
機械学習アルゴリズム:計算機科学

■設計思想
統計モデリング事象の根底にある生成するプロセスを推論するよう設計
機械学習アルゴリズム:予測や分類精度が最も高くなるよう設計

■パラメータの解釈
統計モデリング:パラメータに対応する現実世界の減少や行動を説明できるようにしたい。
機械学習アルゴリズム:注力しない(つまり、ブラックボックス)。予測力を最適化することが目的のため。

■信頼区間
統計モデリング:パラメータ/推定量に対し、信頼区間と事後分布を計算し、変動性や不確実性を取り込むことに注力。
機械学習アルゴリズム:そのような概念はない。


3.2 3つの基本アルゴリズム
データで解決できる問題の多くは、数学的には分類問題や予測問題として扱うことが可能。
データサイエンティストの最も難しいこと;現実の問題から適切な方式を選ぶこと。

 

3.2.1 線形回帰
2つの変数、属性間の数学的関係を示したい時に利用。
※特に、どのような変数が明らかになっている場合に利用すると効果有。
結果変数(従属変数)、予測変数(説明変数)の間に線形関係を仮定。

モデルへ取り込みたい内容:傾向と変動

 

■傾向
線形回帰は決定論的であり、以下の数式によって、表現。
Y =β0 + β1 * X
Y:結果変数、X:予測変数

目的:最適な直線を探し当てること
最適な直線:予測と結果の差(残差平方和)が最も小さくなる直線
残差平方和(RSS(β)):Σ{(Y予(i) - Y(i))^2}
RSS(β):ある組み合わせβにおける残差平方和
Y予(i):データi番目の予測結果
Y(i):データi番目のY

2乗するのは、符号問題をなくすため。
「差」と書いているが、実際は予測データと実データの「距離」という言い方が良い。

 

■変動
傾向だけ分かったとしても、実際には同じ入力データに対して、結果にバラつきがある。
そこで、以下の数式のように誤差項を導入。

Y =β0 + β1 * X + ε
ε:誤差項

モデリングする際、誤差項は「○○分布に従う」という前提をおくのが定石。
特に、正規分布(平均0, 標準偏差σ)を仮定することが多い。

ε ~ N(0,σ^2)

誤差項の分散を推定は、予測データと実データの差を利用。

σ予 = Σ(e(i)^2)/(n-2)

e(i) = Y予(i) - Y(i)
n:全データ数

(n-2)で割るのは、不偏推定量を示すため。


■モデルの評価指標
決定係数(R-Squared):そのモデルで説明される分散の割合。1に近いほどよく表す。
p値(Pr(>|t|)):そのパラメータの有意性。帰無仮説として「パラメータ=0」を立て、値が0に近いほど帰無仮説を棄却することを示し、そのパラメータが有意であることを示す。

 

その他、多重線形回帰(複数の予測変数から1つの結果変数を算出)、多項式回帰等が存在。
(e.g.)
多重線形回帰: Y = β0 + β1 * X1 + β2 * X2 + β3 * X3
多項式回帰: Y = β0 + β1 * X1 + β2 * X1^2 + β3 * X1^3


■演習と結果
【内容】
真のモデルと正規分布に従う乱数から、データセットを作成。
そのデータセットから線形回帰を行う。

 

# # # # # # # # # # # # # # # # # # # # # # # # # 

#真のデータが線形性を持っているとして、線形回帰
#真のデータ: Y = β0 + β1 * X1

#データ数
dataNum = 1000

#説明変数の平均と標準偏差
ave = 5
std = 7

#誤差項の標準偏差
stderror = 2

#真値
true_beta0 <- 1.1
true_beta1 <- -8.2

#予め入ってるデータの削除
rm(X_1,Y,test_error)

#説明変数の作成
X_1 <- rnorm(dataNum,ave,std)
hist(X_1, col = "grey")

#誤差項
test_error <- rnorm(dataNum,0,stderror)

#真のデータ作成(誤差込)
Y <- true_beta0 + true_beta1 * X_1 + test_error

#パラメータ推定
estY <- lm(Y~X_1)
summary(estY)

#データと推定モデルの可視化
plot(X_1,Y,pch = 20, col = "black")
abline(estY, lwd=2, col="red")

# # # # # # # # # # # # # # # # # # # # # # # # # 

 

summary(estY)を実行した結果は以下。

Call:
lm(formula = Y ~ X_1)

Residuals:
Min 1Q Median 3Q Max
-5.4472 -1.2846 0.0063 1.3065 6.5014

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.979700 0.075828 12.92 <2e-16 ***
X_1 -8.196586 0.008733 -938.58 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.939 on 998 degrees of freedom
Multiple R-squared: 0.9989, Adjusted R-squared: 0.9989
F-statistic: 8.809e+05 on 1 and 998 DF, p-value: < 2.2e-16

 

決定係数が0.99なので、このモデルでほぼ正解ってことが言えてます。

また、p値もほぼ0なので、有意のあるパラメータってことです。

f:id:EPG:20141103144753p:plain

 

■参考にしたページ(コーディング)

データセットと線を同じ図に表示する方法。

Rで線形単回帰分析 - matsuou1の日記

 

■参考になるページ(学術的部分)
図も数式もあるので分かりやすい。

データマイニングの基礎:線形回帰分析とは|インターネット広告代理店で働くデータサイエンティストのブログ

具体例があるので良いかと。

Teradata|マーケターのためのデータマイニング・ヒッチハイクガイド:第9回:線形回帰分析

 

ちゃんと学びたい人は、PRMLの3章を読んだら良いかと。

パターン認識と機械学習 上

パターン認識と機械学習 上

 

 

データサイエンス講義 2章「統計的推論、探索的データ分析、データサイエンスのプロセス」 その3

2章の例題のプログラミングについて。

※書籍記載のコードをほぼそのままパクリ。

※コードの後半はコーディングした箇所もあるが、まだまだしょぼい。

※記事の最後に、参考にしたページのまとめ有。

 

データサイエンス講義

データサイエンス講義

 

 

2.2.2 演習問題:EDA

【対象データ】

2012年5月のニューヨーク・タイムズのHPで各ユーザに対する広告表示回数、及びクリック回数について。

 

【利用言語】

R言語

 

【コードと一部結果】

# # # # # # # # # # # # # # # # # # # # # 

#Program1

#ユーザの広告表示回数とクリック回数

#Age,Gender(0:女性,1:男性),Impressions(広告表示回数),Clicks,Signed_In
data1<-read.csv("http://stat.columbia.edu/~rachel/datasets/nyt1.csv")

#最初の数行だけ表示
head(data1)
#変数data1にカラムagecatを追加
#Ageをカテゴリに分類
data1$agecat<-cut(data1$Age,c(-Inf,0,18,24,34,44,54,64,Inf))
summary(data1)

install.packages("doBy")
library("doBy")
siterange<-function(x){c(length(x),min(x),mean(x),max(x))}
#agecatを軸にImpressionsの特徴量を分析
summaryBy(Impressions~agecat, data = data1, FUN = siterange)

# # # # # # # # # # # # # # # # # # # # # 

 

最後のコードを実行すると、以下のような結果が。

agecat Gender.mean Signed_In.mean Impressions.mean Clicks.mean

1 (-Inf,0] 0.0000000 0 4.999657 0.14207985
2 (0,18] 0.6421151 1 4.998961 0.13105132
3 (18,24] 0.5338531 1 5.006635 0.04845478
4 (24,34] 0.5321621 1 4.993829 0.05048647
5 (34,44] 0.5316963 1 5.021507 0.05167937
6 (44,54] 0.5289790 1 5.010406 0.05027377
7 (54,64] 0.5361885 1 5.022308 0.10183736
8 (64, Inf] 0.3632664 1 5.012347 0.15128856

 

agecat(-Inf,0]にデータがある理由は、非ログインユーザの年齢が取れないことで、0を置いているためかと。

子供や高齢者はクリック率が高いが、大学生や社会人は、クリック率が低い。

 

# # # # # # # # # # # # # # # # # # # # # 

#Program2(Program1の続きに挿入)

install.packages("ggplot2")
library("ggplot2")
#x軸がImpression数、y軸はレコード数、agecat毎に表示
ggplot(data1, aes(x = Impressions, fill = agecat))+ geom_histogram(binwidth=1)

# # # # # # # # # # # # # # # # # # # # # 

 

結果は、以下のような図が出力。

f:id:EPG:20141102171733p:plain

 

 

# # # # # # # # # # # # # # # # # # # # # 

#Program3(Program2の続きに挿入)

#Impression数で判別
data1$hasimps<-cut(data1$Impressions,c(-Inf,0,Inf))
summaryBy(Clicks~hasimps,data=data1,FUN=siterange)

#クリック率の算出
data1$rate<-ifelse(is.na(data1$Clicks/data1$Impressions),0,data1$Clicks/data1$Impressions)
summaryBy(rate~agecat, data = data1, FUN = siterange)

#Impressionsが0より大きいレコード(広告を表示したユーザ)に対し、クリック率をグラフ化
ggplot(subset(data1, Impressions>0), aes(x=rate, colour=agecat)) + geom_density()
#クリックがあったレコードに対し、クリック率をグラフ化
ggplot(subset(data1, Clicks>0), aes(x=rate, colour=agecat)) + geom_density()

# # # # # # # # # # # # # # # # # # # # # 

 

年齢カテゴリ別にクリック率密度を表示。

f:id:EPG:20141102171913p:plain

 

 

# # # # # # # # # # # # # # # # # # # # # 

#Program4(Program3の後に挿入)

#広告非表示、広告表示(未クリック)、広告表示(クリック)の3カテゴリに分類
data1$scode[data1$Impressions == 0] <- "NoImps"
data1$scode[data1$Impressions > 0] <- "Imps"
data1$scode[data1$Clicks > 0] <- "Clicks"

#因子型データに変換
data1$scode<-factor(data1$scode)

clen<-function(x){c(length(x),mean(x))}
(etable<-summaryBy(Impressions+rate~scode+agecat+Gender,data=data1,FUN=clen))

#クリックしたユーザを抽出
baretable<-subset(etable,scode=="Clicks")
(baretable<-data.frame(baretable$agecat,baretable$rate.FUN2,baretable$Gender))
baretable$baretable.Gender<-factor(baretable$baretable.Gender)
#年齢別クリック率
ggplot(baretable,aes(x=baretable.agecat,y=baretable.rate.FUN2)) +
geom_point(aes(colour=baretable.Gender))

# # # # # # # # # # # # # # # # # # # # # 

 

クリックしたユーザを対象として、クリック率をプロット。

f:id:EPG:20141102172229p:plain

 

データ整形のコーディング、可視化の方法がまだまだしょぼい気がする。

 

■参考にしたページ

○cut関数の使い方。

9. 2変量データの要約 - 統計ソフトRの使い方

 

○データ加工と抽出について。

http://cse.naro.affrc.go.jp/takezawa/r-tips/r/44.html

 

○factor関数(因子型への変換)について。

7. ベクトルデータの操作 - 統計ソフトRの使い方

 

○ggplot関数の使い方(散布図しか見てないが、具体例もあり良さそう)。

ggplotで散布図を作る geom_point()の使い方 | Memo on the Web

 

○NULL,NA等の欠損値確認、及びその対処法

http://itbc-world.com/home/rfm/r%E3%81%AE%E6%A9%9F%E8%83%BD/null%E3%83%BBna%E7%AD%89%E3%81%AE%E7%A2%BA%E8%AA%8D/

データサイエンス講義 2章「統計的推論、探索的データ分析、データサイエンスのプロセス」 その2

前回の続き。

2014/11/2追記:「2.3 データサイエンスのプロセス」の画像を修正。

 

データサイエンス講義

データサイエンス講義

 

2.2 探索的データ分析

John Tukeyが考案。
モデル化や仮説に係る確認的データ分析と対照のもの。

探索的データ分析(EDA)の基本的ツールは、以下。
・プロット
・グラフ
・要約統計量


2.2.1 探索的データ分析の理念
EDA(探索的データ分析)の過程で、以下が可能。
・データ理解、分散比較、データ欠損値・外れ値の確認
・データ/ログの取得プロセスのデバッグ

EDAにより、抽象的な事象を定量的に把握可能。


2.3 データサイエンスのプロセス

一番大きなポイントは、モデル等で算出された結果に基づき意思決定した結果が

現実世界にフィードバックされ、反映されること。

※以下では、Web上に掲載されていたプロセスの紹介。

書籍に掲載されていたプロセス。

(2014/11/2追記:画像が間違っておりましたので、修正)

http://semanticommunity.info/@api/deki/files/27075/Figure2-2.png

NECの説明では、分析の要点整理⇒仮説検証のPDCA(その過程で分析モデル生成)という流れ。

Decision Navigator/DS: 情報活用ソリューション・BI | NEC

AtMarkitでは、物事の発見⇒データ準備/モデリング⇒結果の伝達⇒運用という流れ。

Database Expertレポート(1):シゴトで使える「データサイエンティスト」に必要なスキルセットってどんなもの? - @IT


2.3.1 データサイエンスのプロセスにおけるデータサイエンティストの役割
大きな役割としては、以下。
・課題設定と仮説設定
・どのようなデータを収集するか
・そのデータ(生データ)の収集
 - 外れ値、異常値、データ重複、欠損値等の確認
・生データの整形
 - 分析しやすくするため。
・データ分析と仮説検証
 - EDA、モデル構築等。
・結果報告

大抵のデータサイエンティストは、
・緊急性が高く、
・曖昧な課題に対し、
・汚い(整形されていない)データを利用し、
分析を行う。

※Rでのデータ整形方法については、以下に幾つか記載。

http://cse.naro.affrc.go.jp/takezawa/r-tips/r/44.html

秩序と情報とブロッコリー: R言語のcut関数の使い方

Rデータフレーム自由自在 - SSSSLIDE

 

データサイエンス講義 2章「統計的推論、探索的データ分析、データサイエンスのプロセス」

更新タイミングは不定期ですが、少し読む時間ができたので。

今回は、データサイエンス講義の第2章について。 

データサイエンス講義

データサイエンス講義

 

 

2.1 ビッグデータ時代の統計的思考

2.1.1 統計的推論

データを解析する理由は、生活の様々なプロセスを理解するため。
データはプロセスを理解する手がかり。
また、最近では、生活からデータ生成されることが増えてきている。

データには、データを生み出すプロセスと収集過程で「不確実性」が存在。


2.1.3 ビッグデータの母集団と標本
目的に応じ、データの必要量が異なる。
(e.g.) ある1人のユーザのUIに性格な情報を表示したい⇒特定ユーザに関する全データが必要。

現在のデータサイエンティストは、様々な種類のデータを扱える必要がある。
(e.g.) テキスト、レコード、画像、位置データ


2.1.4 ビッグデータの大きな仮定
ビッグデータ解析においては、サンプル数N = ALLを仮定。
しかし、対象全てをデータとして取得できているわけではないので、
必ずしも客観的に分析できるかは疑問。


2.1.5 モデル
モデル:特定のレンズ(観点)を通して、現実の性質を表現する試みのこと。
モデルの作り方:モデリングプロセスの一部。まずは、EDA(探索的データ分析)が有効。
いきなり、闇雲に分析手法(回帰分析や決定木etc.)を利用するのはあまり良くない。
確率分布:上記モデルの構成する部品。
モデルのフィッティング:最尤推定等によるパラメータ推定が必要。
ただし、過学習によるオーバーフィッティングに要注意。

データサイエンス講義 1章「はじめに:データサイエンスとは」

自分の備忘録も兼ねて、そしてブログ継続に向けて。

 

対象の本。

 

データサイエンス講義

データサイエンス講義

 

 

 

1.3 なぜいまなのか

なぜ今、データサイエンスが注目を浴びてるのか。

データ収集が容易となり、データ関連製品(e.g. Amazonの推薦システム、Facebookの友達推薦)の構成要素となったため。

メモリやネットワーク技術の向上により、「データ化」が容易となることで、身の回りの様々な場面にて、データ収集が可能となったことが背景。

「データ化」:生活のあらゆる場面を取り出し、データに変換するプロセス(by Kenneth Neil Cukier, Viktor Mayer-Schoenberger)

 

1.4 現状(および多少の歴史)

データサイエンスは、統計学の単なる名前の付け替えであるという一説も。(Cosma Shalizi)

New "data scientist" is but old "statistician" writ large

 

1.4.1 データサイエンスの仕事

データサイエンティストに求められるスキルは以下。

・計算機科学、統計、通信、データ可視化の専門家であること

・特定分野での豊富な専門知識をもつ

⇒1人でこんなスキルを持っている人はなかなかいないので、チームを組むことがほとんど。

 

ちなみに、色々なページで必要なスキルについて紹介有。

 

①ビジネススキル、②ITスキル、③統計解析スキルが必要とのこと。

データサイエンティストに必要なスキル | IT業界職種研究 | IT転職 エージェント リーベル

 

こちらでは、①ビジネススキル、②DBスキル、③モデリングとのこと。

特別インタビュー 『データサイエンティストに必要なスキルとお客様の接点とは』 | ビッグデータ時代のソリューション探しとスキルアップのためのサイト

 

こちらは「データサイエンティスト養成読本」について。

『データサイエンティスト養成読本』はゼロからデータサイエンティストを目指す人なら絶対に読むべき一冊 - 銀座で働くData Scientistのブログ

 

1.7 データサイエンティストとは本当は何か

1.7.2 産業界

チーフデータサイエンティストは、データに関する事柄を全て決定。

(e.g.) データ収集の方法、データの利用方法、データから成果の導き方

また、①データから意味を抽出し、解釈する方法を知っている人であること、②統計や機械学習ツールや手法に精通していること。

ブログ開設してみました

はじめまして、EPGです。

 

新年度ということで、ブログを開設してみました。

あまり自分自身から情報を発信する人間ではないのですが、このブログを通し、自分の気になったニュースや情報をみなさまと共有していければと思っております。

※更新頻度は全く分かりません。。。

 

このブログでは主に、

・IT系:最新技術/サービス、データ分析、プロジェクトマネジメント(仕事が社内SE)

・趣味:音楽、旅行

について書いていこうと思います。

ただ、ブログの設定や利用方法がまだ分かってないので、記事を書きながら、方法を習得していこうかと思っております。

 

では、よろしくお願いいたします。