データサイエンス講義 3章「アルゴリズム」
データサイエンス講義の第3章について。
※数式は、Texでも記述できるらしいが、まだブログ上での記載方法が分からないので、ひとまずプレーンテキストにて記述。
- 作者: Rachel Schutt,Cathy O'Neil,瀬戸山雅人,石井弓美子,河内崇,河内真理子,古畠敦,木下哲也,竹田正和,佐藤正士,望月啓充
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/10/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
アルゴリズム:タスクを達成するための手続き、手順、ルールの集合
ベストなアルゴリズム:効率が良い、計算時間が短いetc.
データサイエンスに関して、知っておくべきアルゴリズム3つ。
1.データ変更、準備、処理のアルゴリズム
- ソートやMapReduce、Pregal etc.
2.パラメータを推定する最適化アルゴリズム
- 確率的勾配降下法、ニュートン法、最小二乗法etc.
3.機械学習アルゴリズム
用途:予測、分類、クラスタリング
■生み出された分野
統計モデリング:統計の分野
機械学習アルゴリズム:計算機科学
■設計思想
統計モデリング:事象の根底にある生成するプロセスを推論するよう設計
機械学習アルゴリズム:予測や分類精度が最も高くなるよう設計
■パラメータの解釈
統計モデリング:パラメータに対応する現実世界の減少や行動を説明できるようにしたい。
機械学習アルゴリズム:注力しない(つまり、ブラックボックス)。予測力を最適化することが目的のため。
■信頼区間
統計モデリング:パラメータ/推定量に対し、信頼区間と事後分布を計算し、変動性や不確実性を取り込むことに注力。
機械学習アルゴリズム:そのような概念はない。
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なので、有意のあるパラメータってことです。
■参考にしたページ(コーディング)
データセットと線を同じ図に表示する方法。
■参考になるページ(学術的部分)
図も数式もあるので分かりやすい。
データマイニングの基礎:線形回帰分析とは|インターネット広告代理店で働くデータサイエンティストのブログ
具体例があるので良いかと。
Teradata|マーケターのためのデータマイニング・ヒッチハイクガイド:第9回:線形回帰分析
ちゃんと学びたい人は、PRMLの3章を読んだら良いかと。
- 作者: C.M.ビショップ,元田浩,栗田多喜夫,樋口知之,松本裕治,村田昇
- 出版社/メーカー: 丸善出版
- 発売日: 2012/04/05
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 33回
- この商品を含むブログ (15件) を見る
データサイエンス講義 2章「統計的推論、探索的データ分析、データサイエンスのプロセス」 その3
2章の例題のプログラミングについて。
※書籍記載のコードをほぼそのままパクリ。
※コードの後半はコーディングした箇所もあるが、まだまだしょぼい。
※記事の最後に、参考にしたページのまとめ有。
- 作者: Rachel Schutt,Cathy O'Neil,瀬戸山雅人,石井弓美子,河内崇,河内真理子,古畠敦,木下哲也,竹田正和,佐藤正士,望月啓充
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/10/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
2.2.2 演習問題:EDA
【対象データ】
2012年5月のニューヨーク・タイムズのHPで各ユーザに対する広告表示回数、及びクリック回数について。
【利用言語】
【コードと一部結果】
# # # # # # # # # # # # # # # # # # # # #
#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)
# # # # # # # # # # # # # # # # # # # # #
結果は、以下のような図が出力。
# # # # # # # # # # # # # # # # # # # # #
#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()
# # # # # # # # # # # # # # # # # # # # #
年齢カテゴリ別にクリック率密度を表示。
# # # # # # # # # # # # # # # # # # # # #
#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))
# # # # # # # # # # # # # # # # # # # # #
クリックしたユーザを対象として、クリック率をプロット。
データ整形のコーディング、可視化の方法がまだまだしょぼい気がする。
■参考にしたページ
○cut関数の使い方。
○データ加工と抽出について。
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/44.html
○factor関数(因子型への変換)について。
○ggplot関数の使い方(散布図しか見てないが、具体例もあり良さそう)。
ggplotで散布図を作る geom_point()の使い方 | Memo on the Web
○NULL,NA等の欠損値確認、及びその対処法
データサイエンス講義 2章「統計的推論、探索的データ分析、データサイエンスのプロセス」 その2
前回の続き。
※2014/11/2追記:「2.3 データサイエンスのプロセス」の画像を修正。
- 作者: Rachel Schutt,Cathy O'Neil,瀬戸山雅人,石井弓美子,河内崇,河内真理子,古畠敦,木下哲也,竹田正和,佐藤正士,望月啓充
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/10/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
2.2 探索的データ分析
John Tukeyが考案。
モデル化や仮説に係る確認的データ分析と対照のもの。
探索的データ分析(EDA)の基本的ツールは、以下。
・プロット
・グラフ
・要約統計量
2.2.1 探索的データ分析の理念
EDA(探索的データ分析)の過程で、以下が可能。
・データ理解、分散比較、データ欠損値・外れ値の確認
・データ/ログの取得プロセスのデバッグ
2.3 データサイエンスのプロセス
一番大きなポイントは、モデル等で算出された結果に基づき意思決定した結果が
現実世界にフィードバックされ、反映されること。
※以下では、Web上に掲載されていたプロセスの紹介。
書籍に掲載されていたプロセス。
(2014/11/2追記:画像が間違っておりましたので、修正)
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
データサイエンス講義 2章「統計的推論、探索的データ分析、データサイエンスのプロセス」
更新タイミングは不定期ですが、少し読む時間ができたので。
今回は、データサイエンス講義の第2章について。
- 作者: Rachel Schutt,Cathy O'Neil,瀬戸山雅人,石井弓美子,河内崇,河内真理子,古畠敦,木下哲也,竹田正和,佐藤正士,望月啓充
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/10/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
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章「はじめに:データサイエンスとは」
自分の備忘録も兼ねて、そしてブログ継続に向けて。
対象の本。
- 作者: Rachel Schutt,Cathy O'Neil,瀬戸山雅人,石井弓美子,河内崇,河内真理子,古畠敦,木下哲也,竹田正和,佐藤正士,望月啓充
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/10/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
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)等
・趣味:音楽、旅行
について書いていこうと思います。
ただ、ブログの設定や利用方法がまだ分かってないので、記事を書きながら、方法を習得していこうかと思っております。
では、よろしくお願いいたします。