PCA
主成分分析 (principal components analysis) と呼ばれる手法を使って、日毎の 25 列のデータを組み合わせて日毎の動向が分かるような列を作る、とのこと。
具体的にどうなの、というあたりはスルーでざっくり理解しようとしてみます。テキスト曰く
- PCA の主な考え方は、データの生の情報をどのぐらいたくさん含んでいるかということに基づいて順に並んでいる新たな 25 列を作るというものである。
- 新しい最初の列は、第一主成分、もしくは単に主成分と呼ばれ、データセット全体の構造の大部分を含んでいることが多い。
- PCA はデータセットと列の間にすべて強い相関があるときに特に効果的である
- この場合、相関のある列同士を、両方の列の相関を説明する隠れたパターンに沿うような単一の列で置き換えることができる。
との事。むむむ。
とりあえず
テキストなナニを追い掛けてみることに。ええと、例のリモホに接続してカレントディレクトリ移動して
$ cd ML_for_Hackers/08-PCA
R 起動して setwd か。
$ R > setwd('~/ML_for_Hackers/08-PCA') >
で、データセット読み込み。
> prices <- read.csv('data/stock_prices.csv') > prices[1,] Date Stock Close 1 2011-05-25 DTE 51.12
で、日付文字列のエンコードのための前処理を、とのこと。
> library('lubridate') > prices <- transform(prices, Date = ymd(Date)) > prices[1,] Date Stock Close 1 2011-05-25 DTE 51.12
reshape ライブラリの cast 関数を使ってデータを操作とのことなんですが、cast て何だろ。別途確認だな。とりあえずそのまま進めます。
> library('reshape') Loading required package: plyr Attaching package: 'plyr' The following object(s) are masked from 'package:lubridate': here Attaching package: 'reshape' The following object(s) are masked from 'package:plyr': rename, round_any The following object(s) are masked from 'package:lubridate': stamp
む、大丈夫かな。そのまま進めます。
> date.stock.matrix <- cast(prices, Date ~ Stock, value = 'Close')
で、REPL に date.stock.matrix を食わせてみたのですが、確かに項目に抜けがありますね。以下でフィルタして再度 cast を、とのこと。
> prices <- subset(prices, Date != ymd('2002-02-01')) > prices <- subest(prices, Stock != 'DDR')
subset 要確認。あと cor という関数で調査できるとのことですがどうなるのか。
> cor.matrix <- cor(date.stock.matrix[,2:ncol(date.stock.matrix)]) > correlations <- as.numeric(cor.matrix) > ggplot(date.frame(Correlation = correlations), aes(x = Correlation, fill = 1)) + geom_density() + opts(legend.position = 'none')
あら、ggplot が無い、と言われますね。
> library('ggplot2') > ggplot(data.frame(Correlation = correlations), aes(x = Correlation, fill = 1)) + geom_density() + theme(legend.position = 'none')
む、正常終了してるようですが無言。乱暴ですがスルーで princomp してみます。
> pca <- princomp(date.stock.matrix[, 2:ncol(date.stock.matrix)]) > pca Call: princomp(x = date.stock.matrix[, 2:ncol(date.stock.matrix)]) Standard deviations: Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 29.1001249 20.4403404 12.6726924 11.4636450 8.4963820 8.1969345 5.5438308 Comp.8 Comp.9 Comp.10 Comp.11 Comp.12 Comp.13 Comp.14 5.1300931 4.7786752 4.2575099 3.3050931 2.6197715 2.4986181 2.1746125 Comp.15 Comp.16 Comp.17 Comp.18 Comp.19 Comp.20 Comp.21 1.9469475 1.8706240 1.6984043 1.6344116 1.2327471 1.1280913 0.9877634 Comp.22 Comp.23 Comp.24 0.8583681 0.7390626 0.4347983 24 variables and 2366 observations.
当り前ですがテキストの凡例と同じですね。一旦ここで止めて微妙な部分確認します。
cast
cast は reshapeでピボットテーブル によれば正規化されたテーブルに変換してくれる模様。例えば prices の一件目は以下なのですが
> prices[1,] Date Stock Close 1 2011-05-25 DTE 51.12
Date と Stock で Close な値を纏めた形に、なのかどうか (表現微妙)。
> date.stock.matrix <- cast(prices, Date ~ Stock, value = 'Close') > date.stock.matrix[1,] Date ADC AFL ARKR AZPN CLFD DDR DTE ENDP FLWS FR GMXR GPC 1 2002-01-02 17.7 23.78 8.15 17.1 3.19 18.8 42.37 11.54 15.77 31.16 4.5 36.09 HE ISSC ISSI KSS MTSC NWN ODFL PARL RELV SIGM STT TRIB UTR 1 40.41 7.82 12.78 70.23 10.03 26.2 13.4 1.92 1.3 1.75 52.11 1.5 39.34
一旦手を止めます。