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.

当り前ですがテキストの凡例と同じですね。一旦ここで止めて微妙な部分確認します。

追記

確認必要な R の手続きが以下。

  • cast
  • subset
  • cor

あと、ggplot が動かないのもアレ。あ、これってリモホでヤッてるから、なのかorz

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

一旦手を止めます。