More Related Content
More from Yoshiteru Kamiyama (7)
Listを串刺し
- 1. listを串刺し
manozo
Tokyo.R#25 LT
2012.8.4
付け⾜し2012.8.19(@dichika⽒に感謝)
さらに付け⾜し2012.8.21(@kos59125⽒に感謝)
- 3. リストを串刺したい
• 材料(順不同)
– unlist() リストをベクトル化
– apply() 要素に対して関数を適⽤
– NROW() ⾏数を得る
– lapply() リストのapply
– index() xtsから⽇付
– dim() ディメンジョン
– dimnames() 名前をつける
3
- 4. リストのapply
× apply(list, 1:2, sum)
•リストは何でも詰められる
•vector,data.frame,matrix,list何でも
•ファイリングみたいなもの
•しかし、いきなりapplyはダメだった。
4
- 6. 練 習
> a
, , z1
> (a<‐1:12) #①ベクトル
[1] 1 2 3 4 5 6 7 8 9 10 11 12 y1 y2
> dim(a)<‐c(2, 2, 3) #②ディメンジョン x1 1 3
> dimnames(a)<‐list(c("x1", "x2"), #③名札をつける x2 2 4
c("y1", "y2"),
c("z1", "z2", "z3")) , , z2
y1 y2
> apply(a, 1:2, sum) #x:1, y:2, z:3 x1 5 7
z x2 6 8
y1 y2 2:3
x1 15 21 , , z3
x2 18 24 串刺し! x 1:2 y1 y2
x1 9 11
c(1,3) 6
x2 10 12
y
- 7. 戦 略
1. unlist()
– リストをベクター化
2. dim()
– オブジェクトの次元を設定
3. dimnames()
– オブジェクトの次元名を設定
7
- 8. 実 際
• library(RFinanceYJ)を使う
– Tokyo.R勉強会の主催者作
– 某サイトから株価を抜くすばらしい
ライブラリ
• library(quantmod)
– ロウソク⾜とか描けるライブラリ
• 医薬品銘柄の株価を抜いてscaleして a[, , x["持田製薬"]]
Last 891
[2012-01-04/2012-07-18]
sumしてみる 950
900
850
25
Volume (10,000s):
20 188,000
15
10
5
1 04 2012 1 31 2012 2 21 2012 3 13 2012 4 03 2012 4 24 2012 5 22 2012
8
6 12 2012 7 03 2012
- 9. 準 備
• 東証のコードは?
– 東証上場銘柄⼀覧
• http://www.tse.or.jp/market/data/listed_companies/
– エクセルで⼿に⼊る
9
- 12. 例「医薬品」
> code
コード 銘柄名
1 4151.t 協和発酵キリン
2 4502.t 武⽥薬品⼯業
3 4503.t アステラス製薬
4 4506.t ⼤⽇本住友製薬
5 4507.t 塩野義製薬
6 4508.t ⽥辺三菱製薬
7 4512.t わかもと製薬
8 4514.t あすか製薬
9 4516.t ⽇本新薬
10 4519.t 中外製薬
> NROW(code)
[1] 36 12
- 14. 想像してください
> head(drug[[1]])
Open High Low Close Volume Adjusted
2012‐01‐04 944 953 942 945 1100000 945
2012‐01‐05 945 948 933 940 1200000 940
2012‐01‐06 938 940 921 928 971000 928
2012‐01‐10 927 936 915 918 1075000 918
2012‐01‐11 915 915 904 912 1770000 912
2012‐01‐12 912 913 902 907 1273000 907
...
> class(drug[[1]])
[1] "xts" "zoo"
東証医薬品銘柄のリスト
14
- 15. 条 件
• みな同じサイズでなくてはならない
– ベクターにしてdimするので
• 「練習」を思い出してください
> table(unlist(lapply(drug, NROW)))
127 133 134 135 ⾏数が揃っていない
1 1 1 34
cnd<‐unlist(lapply(drug, NROW)==135
drug2<‐drug[cnd]
135×6だけのテーブルを選ぶ(34銘柄)
x:135,y:6,z:34 覚えておいて下さい 15
- 18. dimnames()の準備
• ⽇付(x)
date<‐index(drug[[1]])
x<‐as.character(date)
• カラム名(y)
y<‐colnames(drug[[1]])
names(y)[6]<‐"Adjusted"
• 銘柄名(z)
z<‐names(code[,2][cnd])
18
- 21. 34銘柄を串刺し(合計)
> head(apply(drug.un,1:2,sum))
Open High Low Close Volume Adjusted
2012‐01‐04 62854 63544 62272 62875 20776300 62875
2012‐01‐05 62776 63002 62244 62506 16002200 62506
2012‐01‐06 62465 62697 61728 61941 18870100 61941
2012‐01‐10 62196 62901 61773 62100 18066600 62100
2012‐01‐11 62166 62385 61595 62016 18269400 62016
2012‐01‐12 61776 61981 60980 61298 18377500 61298
...
21
- 23. apply(apply(a, 1:2, sum), 1:2, sum) [2012-01-04/2012-07-18]
Last 68741
68000
66000
64000
62000
50
Volume (millions):
40 22,635,200
30
20
23
1 04 2012 1 31 2012 2 21 2012 3 13 2012 4 03 2012 4 24 2012 5 22 2012 6 12 2012 7 03 2012
- 29. こんな感じ
• リストに行列を入れる > lst
[[1]]
[,1] [,2] [,3]
[1,] 1 4 7
lst <‐ list() [2,] 2 5 8
[3,] 3 6 9
mat<‐matrix(1:9, 3) [[2]]
[,1] [,2] [,3]
for(i in 1:3) [1,] 1 4 7
[2,] 2 5 8
lst[[i]] <‐ mat [3,] 3 6 9
[[3]]
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
29
- 30. こいつにlaply()
• 配列にする > laply(lst,"[")
, , 1
laply(lst, "[") 1 2 3
[1,] 1 2 3
[2,] 1 2 3
[3,] 1 2 3
, , 2
1 2 3
[1,] 4 5 6
[2,] 4 5 6
[3,] 4 5 6
, , 3
1 2 3
[1,] 7 8 9
[2,] 7 8 9
[3,] 7 8 9
30
- 31. apply()で串刺し
> apply(laply(lst, "["), 2:3, sum)
1 2 3 > lst
[[1]]
1 3 12 21 [,1] [,2] [,3]
[1,] 1 4 7
2 6 15 24 [2,] 2 5 8
[3,] 3 6 9
3 9 18 27 [[2]]
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
めでたくsumになっている [3,] 3 6 9
[[3]]
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
31
- 33. drug4
> head(drug4)
Open High Low Close Volume AdjClose
2012‐01‐04 ‐11.11693 ‐8.891408 ‐10.94261 ‐9.86077 0.2462292 ‐9.86077
2012‐01‐05 ‐10.86592 ‐13.342024 ‐11.06719 ‐13.14939 ‐18.8736414 ‐13.14939
2012‐01‐06 ‐13.80675 ‐16.476652 ‐16.55394 ‐18.72217 ‐13.2619929 ‐18.72217
2012‐01‐10 ‐16.88440 ‐15.568659 ‐16.44554 ‐17.52046 ‐12.5594417 ‐17.52046
2012‐01‐11 ‐16.64755 ‐19.320562 ‐16.82423 ‐17.96469 ‐18.4883136 ‐17.96469
2012‐01‐12 ‐20.46076 ‐23.494666 ‐24.94043 ‐26.42570 ‐10.0137024 ‐26.42570
> names(drug4)[6]
[1] "AdjClose"
> names(drug4)[6]<‐"Adjusted"
> candleChart(drug4)
4⽉に薬価引き下げが
あるものの6⽉には復帰 33
- 34. Height
0 5 10 15 20
大塚ホールディングス
生化学工業
キョ ン製薬ホールディ
ーリ ングス
あすか製薬
キッ 薬品工業
セイ
ゼリア新薬工業
大幸薬品
日医工
ツムラ
協和発酵キリン
大日本住友製薬
科研製薬
エーザイ
東和薬品
第一三共
日水製薬
小野薬品工業
鳥居薬品
dist(drug3[, , 1])
富士製薬工業
hclust (*, "complete")
日本ケミ ァ
フ
樹形図
Cluster Dendrogram
中外製薬
ダ ト
イ
栄研化学
沢井製薬
日本新薬
持田製薬
3つぐらいのクラスタになっているようだ。
田辺三菱製薬
武田薬品工業
塩野義製薬
大正製薬ホールディングス
同じような株価の動きをするものがクラスタをつくる
アステラス製薬
久光製薬
扶桑薬品工業
34
- 36. おまけ
• xtsExtraライブラリを使って
# 画⾯に表⽰しきれないのでpdfに
pdf("open.pdf", w=8, h=20, family="Japan1GothicBBB")
plot.xts(t(drug3[,,1]))
dev.off()
• 株価のヒストグラム
# 株価は正規分布する?
hist(drug3[,,1], freq=F, ylim=c(0, 0.4))
plot(dnorm, xlim=c(‐3, 3), add=T, col=2)
36
- 40. Reduceのイメージ
• Rubyでいうとinject
– reduceはinjectのエイリアス
– [1, 2, 3, 4, 5].inject(:+) # => 15
+ + + + 間に差し込む感じ
•R
pstp <‐ function(x, y)paste(x, y, sep="+")
Reduce(pstp, 1:5)
[1] "1+2+3+4+5" pasteして
eval(parse(text=Reduce(pstp, 1:5)))
[1] 15 エバっみる 40
- 42. 参 考
• Rパッケージガイドブック
– RfinanceYJ, plyrパッケージの解説あり
– http://www.tokyo‐tosho.co.jp/books/ISBN978‐4‐489‐02097‐1.html
• RfinanceYJ
– http://www.okada.jp.org/RWiki/?RFinanceYJ%A5%B5%A5%F3%A5%D7%A5%EB
– http://d.hatena.ne.jp/yokkuns/20110324/1300922162
• plyrパッケージの使い⽅メモ
– http://d.hatena.ne.jp/teramonagi/20120806/1344255419
• quantmod
– youtubeあり
– http://www.youtube.com/watch?v=byymvwQye7E
42
以上