暇人の研究室

金融工学やR言語・統計学について書いてます。

<

【R言語】Rでの単位根検定 その1

 

 

時系列データは大きく「定常過程」と「非定常過程」の2つに分けることできます。そして、分析するデータが「定常過程」であるか「非定常過程」であるかを検定するのが、「単位根検定」というやつです。

 

Rで単位根検定を行うには、元からRにインストールされているts(Timeseries)パッケージの中にあるadf.test()という関数を使用します。

 

この検定の帰無仮説H₀は「単位根が存在する」そして、対立仮説H₁は「単位根は存在しない」です。つまり、p値(p-value)の解釈方法としては、「帰無仮説が棄却できなかった=非定常過程」ということになります。

 

 p値???という方は↓記事参照

www.tkstock.site

 

 

というわけで実際に単位根検定を行っていきます。使うデータは2005年から2016年までのTOPIX(日経平均株価)です。

 

 

※Rを使った株価データの取得方法は↓を参照

【R言語】 Yahoo!ファイナンスから株価データを取得する方法 その2 - 株初心者が本気で儲けるブログ

 

 

> head(TOPIX)
Open High Low Close
2005-01-04 11458.27 11547.02 11431.57 11517.75
2005-01-05 11458.92 11461.10 11416.97 11437.52
2005-01-06 11372.35 11492.26 11372.21 11492.26
2005-01-07 11528.69 11528.69 11432.19 11433.24
2005-01-11 11495.46 11580.69 11495.46 11539.99
2005-01-12 11537.60 11548.89 11449.49 11453.39

 

> library(tseries)  ## tsパッケージのインストール

‘tseries’ version: 0.10-37

‘tseries’ is a package for time series analysis and
computational finance.

See ‘library(help="tseries")’ for details.

 

> adf.test(TOPIX[,4])  

Augmented Dickey-Fuller Test

data: TOPIX[, 4]
Dickey-Fuller = -1.2466, Lag order = 14, p-value = 0.8973
alternative hypothesis: stationary

 

 

 

結果はP値が0.8973とめちゃくちゃ大きいので、有意水準も糞もなく「帰無仮説H0は棄却できない=対立仮説を採用する」となるので、この時系列データは単位根がある=非定常性ということになります。

 

このように単位根検定の結果、分析しようと思っていたTOPIXのデータは非定常性だということになってしまったのですが、No probremです。

 

そもそもリアルのデータでそのまま定常性があるやつなんてほとんど存在しません。なので、基本的にデータを加工することで定常性を持たせることが一般的です。

 

そして、その方法は大きく5つあります

 

①データの差分を取る

②データを対数変換する

③データを対数変換して差分を取る

④データを指標(変化率など)に変換する

⑤データを指標に変換して差分を取る

 

 

 

 ↓続き

www.tkstock.site

 

 

 

非定常過程のデータ同士で回帰分析をすると「見せかけの回帰」が起こってしまったりするので、時系列データ分析において単位根検定は大切です。

 

 

www.tkstock.site

 

 

 

【R言語】時系列分析にオススメパッケージまとめ

 

まず時系列データとは時間と共に変化するデータの事を指し、代表的なものとしては株価データや気象データがあります。

 

時系列データ解析はデータの数値だけではなく、時間的な位置も意味合いを持つので他のデータ解析とは少し異なるアプローチで分析していかなければなりません。

 

 

www.dmjtmj-stock.com

 

 

Rでは時系列データを分析するための様々なパッケージが存在しており、時系列分析で便利なパッケージは↓の6つです。

 

 

ts…規則的間隔の時系列データの処理にうってつけ、Rに元からインストール済み

quantmod…金融データ解析にめっちゃ便利

xts…tsの進化形でzooの拡張形、欠損値などがある不規則間隔な時系列データ処理に便利、quantmodをインストールするとついて来る

dplyr…データ処理を簡易かつ高速化してくれる

forecast…計算した線形モデルの予測などを可視化する

lubridate…データ年月日を直感で操作できる

 

 

 

www.dmjtmj-stock.com

www.tkstock.site

www.dmjtmj-stock.com

 

 

 

・日付の処理


時系列データは1970年1月1日を基準としたPOSIX time(ポジックスタイム:コンピューターシステム上での時刻表現の一種)が大抵基準となっています。

 

そして日付データはDateクラスのオブジェクトとして保存されます。Dateクラスは1970年1月1日からの経過日数を内部で保持しています。

 

というわけで、文字列を日付データにしてみます。

 

> today<-as.Date("2017-04-28") ##文字列から時系列への変換
> class(today)
[1] "Date"

 

> as.numeric(today) ##1970年1月1日からの経過日数を表示
[1] 17284

 

 

 

【R言語】Rでのプログラミング  その2

・条件式と論理記号

 

==:等しい !=:等しくない !:~でない

 

・条件ごとに異なる処理を行う

 

条件ごとに異なる処理を行う場合はswitch()を使います。

 

> x<-2
> y<-5
> z<-"+"
> switch(z,
+ "*"={print("掛け算");x*y},
+ "+"={print("足し算");x+y})
[1] "足し算"
[1] 7

 

第1引数には条件を指定します。次に続くのが実行式であり、文字列と「;」を挟んだ右側にあるやつです。

 

 

・繰り返し文

 

次はスクリプトを書く上で絶対必須である繰り返し分を取り上げていきます。Rでは、for()で繰り返し処理ができます。

 

試しに1から10000までの数字の合計を繰り返しで計算してみます。

 

> x<-1:10000
> i<-0
> for(a in x){
+ i<-i+a
+ }
> i
[1] 50005000

 

これは足し算の結果を「i」というオブジェクトに保存し、そしてループで「i」を上書きしていくというものです。

 

また繰り返す回数をしてしないときはwhile()を使います。

 

> i<-0
> while(i<100){
+ i<-i+1
+ }
> print(i)
[1] 100

 

ここで「i」の更新方法(上の式の i<-i+1 の部分)を指定忘れると無限にループになりRを強制終了しないといけなくなるので注意しましょう。

 

 

・ループの終了とスキップの指定

 

nextbreakを使えば条件が満たされた場合にループを終了したりスキップすることができます。

 

 

 

> i<-0
> while(i<100){
+ i<-i+1
+ if(i%%30!=0)next
+ if(i%%90==0){
+ cat("\n")
+ break
+ }
+ cat(i,"\t")
+ }
30 60

 

この式は30の倍数になったら画面に表示し90で打ち切るというものです。30で割れるかどうかは%%演算子(余りを求める演算子)で調べられます。

 

もちろん割り切れる場合は0ですが、割り切れない場合は0ではありません。なので、条件式の後にnextを加えることによって、割り切れなかったら次に行くとしています。

 

そしてiが90になったら、cat()で結果を画面に出力させ、breakでループを打ち切るとしています。

 

【R言語】Rでのプログラミング  その1

 

・条件文(if文)

 

Rでは、ifとelseを使って条件文が書けます。

 

書式は>if (条件式) (処理) else (処理) といった感じです。

 

簡単な例としてxが10未満かどうかを判定し結果を表示します

 

> if(x<10)"YES"else"NO"
[1] "YES"

 

ちなみにRにおいて不等号(≦・≧)は<=,>=と表されます。

そして当たり前ですが、条件式は改行したほうが分かりやすいです。

 

>if(x >= 10) ## xが10以上ならyes、そうでないならno
"YES"
else
"NO"

 

すると、エラー: 予想外の 'else' です。と返されます。Rではelseは先頭におけません。

elseを使う場合は{}を使います。

 

> if(x >= 10){
+ "YES"
+ }else{
+ "NO"}
[1] "NO"

 

とまあ変数xが一つの数字であればこんな感じでできるのですが、Rの良く挙げられる長所はオブジェクトにベクトルやデータフレームを入れて効率的なデータ処理ができるという点です。

 

次はxにベクトルを入れた場合を見ていきます。

 

 

・ベクトルを使った条件文

 

ベクトルにおける条件式を描きたいときはifelse関数を使います。おそらくこれがRでスクリプトを描くときに一番使います。

 

> y<-1:100
> y
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
[19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
[37] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
[55] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
[73] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
[91] 91 92 93 94 95 96 97 98 99 100

 

> ifelse(y<10,"yes","no")
[1] "yes" "yes" "yes" "yes" "yes" "yes" "yes" "yes" "yes" "no" "no" "no"
[13] "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no"
[25] "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no"
[37] "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no"
[49] "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no"
[61] "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no"
[73] "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no"
[85] "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no"
[97] "no" "no" "no" "no"

 

 

ifelseの書式はこんな感じです。

>ifelse(条件式,"条件を満たしたときの処理","条件を満たしていなかった時の処理")

 

 

ただifelse()は、条件に合った場合だけ処理を行うのではなく、ベクトル内のすべての要素に、真の場合と偽の場合の両方の処理を行ってから条件式に当てはまる結果を返しているので、条件に当てはまっていないベクトル内の要素の数値が変わってしまいます。

 

 

 

 

【R言語】rvestパッケージによるウェブスクレイピング その1

 

 

Rで実際にウェブ上のHTML・XML形式のデータをスクレイピングするには、rvestパッケージがオススメです。

 

rvestパッケージは何をしてくれるパッケージなのかというと、HTMLやXMLからデータを検索・抽出するための言語であるxpath(XML Path Language)をRで簡単に実行するために作られたパッケージです。

 

このパッケージによってWebサイトの情報をRに取り込むと共にその情報を整理することが簡単に行えるようになります。

 

 

【Web技術】スクレイピングする上で抑えておきたいHTMLの基本的な仕組み 

【Web技術】XMLとは何なのか? - 暇人の研究室

 

 

・インストールと読み込み

 

>install.packages("rvest")
>library(rvest)

 

まず例として簡単なHTML(https://ishidamotohiro.github.io/sample_check/simple.html)を読み込みます。

 

 

f:id:oruka199665:20170421174451j:plain

 

アクセスすれば分かりますが、なんか仕込んでるのか疑うレベルの本当に単純なやつです。

 

 

では実際にこのサイトのHTMLを収集します。

 

rvestパッケージではread_html()という関数でやってくれます。そして、収集したデータをsimpleというオブジェクトに保存します。

 

 

> simple <- read_html("https://IshidaMotohiro.github.io/sample_check/simple.html")

 

 

これでできたはずなので、オブジェクトにアクセスして確認してみます。

 


> simple
{xml_document}
<html>
[1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF ...
[2] <body>\n <h1>大見出し</h1>\n <a href="http://www.okadajp.org/RWiki/"> ...
>

 

 

Rのデータってサンプルデータみたいな行列で区切られたデータが一般的なので、ちょっと意味が分からないというのが初めて見た感想だと思います。

 

これはHTMLをツリー状で表現するDOMという形式で保存されています。そしてDOM内の要素をノードと言います。

 

 

html

→head

  →title(ページタイトル)

→body

  →h1(見出し)

 

 

 

www.tkstock.site

 

 

それではRを使ってノード(要素)を検索していきます。

 

rvestパッケージではhtml_nodes()という関数でノードの検索・抽出ができます。

 

またDOMの操作には、dplyrパッケージをインストールすると使えるパイプ演算子

(%<%)が便利です。

 

 

www.tkstock.site

 

 

 

まず見出し要素(h1)を抽出してみます。

 

> simple %>% html_nodes("h1")
{xml_nodeset (1)}
[1] <h1>大見出し</h1>

 

タグを抜いて文字列だけを抽出したい場合は、html_text()関数を使います。

 

 

> simple %>% html_nodes("h1") %>% html_text()
[1] "大見出し"

 

 

次にリンクを抽出します。

 

リンクはノード内では<a=href~”リンクURL”>リンクタイトル</a>という形で保存されており、これを取り出すにはhtml_attrs()関数を使います。

 

> simple %>% html_nodes("a") %>% html_attrs()
1
href
"http://www.okadajp.org/RWiki/"

2
href target
"http://rmecab.jp" "_blank"

>
> simple %>% html_nodes("a") %>% html_attr("href")
[1] "http://www.okadajp.org/RWiki/" "http://rmecab.jp"
>

 

 

見出しとリンクはこのようにして抽出することができます。

 

 

次は実際にWikipedia のサイトを抽出していきます。

 

【R言語】rvestパッケージによるウェブスクレイピング その2 - 暇人の研究室

 

 

 

追記:スクレイピングについて本格的に勉強するならばこちらのRによるスクレイピング入門という本がオススメです。入門と書いてますが実務で使えるレベルのことが分かりやすく書いてあります。

 

 

 

 

まとめ

 

Webスクレイピングするには、rvest

HTMLの読み込み⇨read_html()

特定タグの抽出⇨html_nodes("h1")

パイプ演算子 %>%

タグを抜いて文字列だけを抽出したいとき⇨html_text()

リンク抽出⇨html_attrs()

 

【Web技術】スクレイピングする上で抑えておきたいHTMLの基本的な仕組み

 

 

近頃はビックデータの時代でデータ集めや分析が簡単になりました。そしてデータの収集先で一番多いのがインターネットです。

 

インターネットからデータを集める方法の1つとしてサイトの情報をそのまま引っ張ってくるスクレイピングというものがあります。

 

そしてスクレイピングを行うためには、まずWEBページの仕組みについて理解しておかなければなりません。

 

 

ですが、HTMLについて知らなければデータを引っ張って来ても扱い方が全然わからないということになります。(私がそうでした)なので、今回はHTMLについてざっくり見ていきたいと思います。

 

 

 

HTMLとは?

 

 HTMLとはHyper text markup languageの略で文書を構造化するために形式で、国際的な基準となっているフォーマットです。

 

これはW3C(World wide Web)という国際組織によって標準化されています。

 

 

 

HTMLの形式

 

HTMLはタグで構成されます。ブログとかをやってた人はなんとなく分かると思いますが、HTMLはざっくり表すとこんな形式です。

 

基本としては<html>~</html>の中に要素を詰め込みます。

 

 

<html ...>
<head>
ヘッド要素の内容
</head>
<body>
ボディ要素の内容
</body>
</html>

 

見てか分かるように、HTMLは<html>という開始タグで始まり、最後に</html>というタグで終わります。

 

タグ名のアルファベットは大文字でも小文字でも関係ありませんので<HTML>でも認識してくれますが、小文字が一般的です。

 

このようにHTMLは文書を構成するパーツを「要素」と呼んで、この要素の組合せとしてページを作り上げていきます。

 

ですが、私たちが勝手に「これは要素だ」と決めても、それを何らかの方法で明示してあげないことには、コンピューターにはその区別がつきません。

 

なので、文中に「ここからここまでがこの要素だ」という目印を付けることにします。この目印が「タグ」なのであり、目印を付けていくことを「マークアップ」といいます。

 

 

 

HTMLの要素

 

1番目の部分をHTMLのhead要素といい、2番目の部分をbody要素といいます。この2つをあわせたもの、つまりHTMLの本体をhtml要素といいます。

 

<head></head>内はサイトの情報を記述する部分で、即に『ヘッダー』といわれています。


<head></head>内で記述するタグの中で重要なのは「タイトルタグ」です。(タイトルタグはHTMLでは<title></title>と記述します。)

 

<head>

<title>【Web技術】HTMLについての分かりやすい解説</title>

</head>

 

タイトルタグはWebブラウザの上に反映され、検索エンジンで検索した時の検索結果一覧に表示されます。

 

このタイトルはSEO的にも判断基準の一つになるので、もしあなたがブログを書くのであればタイトルはよく考えて決めましょう。

 

次に<body></body>で挟まれた部分は、記事の中身である文章や画像など、実際にブラウザの画面上に表示される内容です。

 

つまり、<body>タグの中に書かれたテキストや画像などがブラウザの画面上に表示されます。

 

 

 

タグの種類

 

タグは役割の違いから『要素(element)』『属性(attribute)』『値(value)』の3つに区別されます。

 

今回はあくまでサイト作成ではなく、Webスクレイピングを行う上での基本的理解を目的としているので、HTMLで絶対に使われる骨組みのようなタグしか紹介していませんが、

 

HTMLタグは他にもたくさん種類があるので、興味のある方はより専門的なサイトで調べてみてください。

  

このように、HTMLは「タグ」で構成されているので、スクレイピングしたデータを分析する際はタグの文字で検索を掛けていくことになります。

 

 

Rなどほとんどのプログラミング言語では収集したWEBページのデータ(HTML)はDOMという形式に変換されて保存されます。そしてDOMではHTML内の要素をノード(Node)と言い、ここから必要な部分を検索したり抽出したりしてデータ分析を行うのです。

 

次は実際にRで簡単なスクレイピングを行っていきます。

 

【R言語】XMLパッケージでWebスクレイピングしてみる - 暇人の研究室

 

 

 

ちなみに、スクレイピングについてはこちらの本が解説しているのでオススメです。入門と書いてますが、実務でも使えるレベルです。

 

 

 

【R言語】dplyrパッケージの使い方

 

今回はRでデータ処理を効率的に行うのを手助けしてくれるパッケージの一つであるdplyrパッケージの使い方を紹介していきます。この記事ではざっくりとした説明で、詳しく知りたい方はこちらの本に書いてあるので是非どうぞ

 

 

 

 

パッケージのインストールと読み込み

>install.packages("dplyr")

>library(dplyr)

 

 

www.dmjtmj-stock.com

 

 

内臓データの呼び出し

> head(ToothGrowth)
len supp dose
1 4.2 VC 0.5
2 11.5 VC 0.5
3 7.3 VC 0.5
4 5.8 VC 0.5
5 6.4 VC 0.5
6 10.0 VC 0.5

 

 

>?オブジェクト名で確認すると、このデータは60匹のネズミにビタミンCを与えた場合の歯の長さを図ったデータだそうです。

 

 

条件を満たすものの抽出

> ToothGrowth[ToothGrowth$supp=="OJ",]
len supp dose
31 15.2 OJ 0.5
32 21.5 OJ 0.5
33 17.6 OJ 0.5
34 9.7 OJ 0.5


 

これはsuppの列でOJと書いてあるデータを抽出しろという意味になります。==は等しいを意味し、,はカンマ前が行、カンマ後が列を示しています。[行,列]というイメージです。
 
 
この場合、カンマ後を空欄にして]で閉じることでOJと書いてある列の行を全部取り出せということになります。
 
 

他にもsubset()を使って抽出する方法もあります。subsetの場合は

 

>subset(ToothGrowth,supp=="OJ")

 

まあ単一条件の場合ならこの書き方でもいいのですが、もし、性別が女で身長が160以下で体重が50kg以下みたいな複数条件で抽出したい場合は、この書き方だととても汚くなってしまいます。

 

 

そのため複数条件で抜き出すときは%>%演算子を使うのがオススメです。パイプ処理というやつです。

 

>ToothGrowth %>% filter(supp == "OJ") %>% head()

 

 

 

・データ操作に必須の関数一覧

 

 

・ filter()

また列の数値が〇〇以上などの指定した条件で抽出をかけたい場合は filter()が有効です。長さが25以上でdoseが1以上のデータを抽出したい時はこんな感じです。

 

>ToothGrowth %>% filter(length > 25, dose == 1)

 

 

・mutate()

 データフレーム内の値を操作したいときはmutateを使います。mutateで新たに列を追加することができます。今回はlengthの長さをインチ表記にしたlen2という列を新たに作ります。

 

> ToothGrowth %>% mutate(len2 = length * 0.039) %>% head()

 

 

またデータを上書きしたいとき、dplyrでは%<>%演算子で上書きが可能となります。

 

>library(magrittr)
>ToothGrowth %<>% mutate(len = length * 0.039) %>% head()

 

 

dplyrには他にも、arrannge()やgroupby()など便利な関数がたくさんあります、dplyrについては使う機会があればまたメモします。

 

 

 

追記:Rで株価や決算書のデータを処理・分析したい方はこちらの本がとてもオススメです。