2008-04-24

Webからの自動取得

この講義で勉強するインターネットからのデータ読み込み法は、株式指数のデータだけでなく気象庁から気温など環境データを読み込むことにも使えます。でも先週、株式データを例に挙げたので今週もその続きをやります。

自動連続読み込み

さて先週の方法では直近50日分しか読み込むことができません。Yahoo!には1991年1月4日からのデータがあるのです、それを50日分ずつ読み込むにはまず「 年 月 日から」を「1991年1月4日から」と書いて「表示」ボタンを押します。そして表示されたデータをコピーしてエクセルに張り付けてから「次の50件」を押して50日分表示してコピーしてエクセルに張り付ける、ということを何十回も繰り返さなければならず大変です。

そこでこの作業をVBAを使って自動化しようと思います。

作業の流れ

  1. 読み込むためのページはどれか。URL(インターネットのアドレス)を知る。
  2. そのアドレスで表示される表を、エクセルのシートに順番に貼り付ける。

アドレスの規則性

まず、インターネットのどのアドレスからこのデータを読み込んでいるのかを見ましょう。
「1991年1月4日から」と書いて「表示」ボタンを押したときにはこのアドレスから読み込んでいます。

「次の50件」を押したときにはこのアドレスから読み込んでいます。

二つのアドレスを見比べて、規則性を読み取りましょう。

http://table.yahoo.co.jp/t?c=1991&a=1&b=4&f=2008&d=4&e=23&g=d&s=998405.t&y=0&z=998405.t
http://table.yahoo.co.jp/t?s=998405.t&a=1&b=4&c=1991&d=4&e=23&f=2008&g=d&q=t&y=50&z=998405.t&x=.csv

http://table.yahoo.co.jp/t?までは共通です。その後に、
アルファベット一文字 = 数字か文字
が並んでいて、&で区切られています。

a「~から」の月
b「~から」の日
c「~から」の年
d「~までのデータ」の月
e「~までのデータ」の日
f「~までのデータ」の年
gdはデイリーだと思われます
q良く分かりませんが、最初のアドレスにはないので省いて大丈夫でしょう。
s998405.tはTOPIXのこと
xファイルの形式でしょうか、最初のアドレスにはないので省いて大丈夫でしょう。
yここが二つのアドレスで違っているので重要です。
zsと同じ
yの数字が0から50に増えています。おそらくもう一度「次の50件」を押すとy=100になると思われます。またd,e,fにはデータの最後の日付を書くのでVBAで今日の日付を得て記入するようにしても良いのですが、省略すると規定値として最新のデータまでが得られるようです。

以上より、おそらく
http://table.yahoo.co.jp/t?c=1991&a=1&b=4&g=d&s=998405.t&z=998405.t&y=0
http://table.yahoo.co.jp/t?c=1991&a=1&b=4&g=d&s=998405.t&z=998405.t&y=50
http://table.yahoo.co.jp/t?c=1991&a=1&b=4&g=d&s=998405.t&z=998405.t&y=100
でうまく行くと思われます。試してみてください。

プログラムで連続的に取得するには「マクロの記録」で保存したプログラムの
With ActiveSheet.QueryTables.Add(Connection:= _
から
End With
までを例えば
For i = 0 To 10

Next i
で囲って、
"URL;http://table.yahoo.co.jp/t?s=998405.t&g=d", Destination:=Range("$A$1"))
を "URL;http://table.yahoo.co.jp/t?c=1991&a=1&b=4&g=d&s=998405.t&z=998405.t&y=" & i*50, Destination:=Range("$A$1"))
に書き換えることで、取得するページを順次変化させられます。

これでは同じ場所に重ねて読み込んでしまいますので、読み込む場所を順次下に下げましょう。
最初(i=0のとき)は1行目、次(i=1のとき)は51行下の52行目…ですのでi+50+1行目に読み込めば良いです。従って
Destination:=Range("$A$1"))

Destination:=Cells(i * 51 + 1, 1))
に書き換えてください。

2008-04-17

Webクエリ

前回の訂正。

ファイルを保存する時にはP:ドライブに保存してください。
すると、保存したパソコンとは別のパソコンでも、ファイルを使うことが出来ます。

今日の内容

エクセル:Webクエリ
VBA:While文、Until文

インターネットからのデータの取り込み

前回の講義を思い出しながら、次のプログラムを実行してみてください。書き写すと時間がかかるので、コピーしてください。

Sub 表の取り込み()
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;http://table.yahoo.co.jp/t?s=998405.t&g=d", Destination:=Range("$A$1"))
.Name = "t?s=998405.t&g=d"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "19"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
End Sub

これはYahoo!ファイナンスからTOPIXの日次データを取り込むためのプログラムです。そうは言っても、ここに書かれた言葉を全部覚える必要はありません。順を追って説明します。
Excelを立ち上げて「データ」の「Webクエリ」をクリックします。すると別の画面が開くので、アドレス欄にhttp://quote.yahoo.co.jp/と書きます。

右側の「TOPIX」をクリックして、次の画面中央の「時系列」をクリックします。

TOPIXの値の表の左上にチェックをつけて「取り込み」をクリックします。
ここですぐにOKを押さずに「プロパティ」を押します。


「既存のセルを新規データで上書きし、使用されていないセルはクリアする」に●をつけてOKを押し、前の画面に戻ったらもう一度OKを押します。
するとこのようにエクセルのシートに表がコピーされます。

ここまで出来たら、先週の「マクロの記録」を使って、この取り込む作業をマクロに記録すると、先ほどのプログラムが記録されます。
今後必要に応じて修正することにします。

While文とUntil文

読み込んだ表が何行あるか数えましょう。
最初の行からチェックし始めて、空白でなければ次の行をチェックする、空白なら終わり、というロジックで、行の数を数えます。空白でない限り次の行を見ることを繰り返すのですからWhile文を使います。

i=1
Do While cells(i,1) <> ""
  i = i + 1
Loop

MsgBox (i)

これで行数を正しく数えていますか?正しくない場合は理由を考えて、正しく数えるプログラムを書いてください。
出来た人は終値の平均を求めるプログラムを考えてください。

繰り返しには他の構文もありますので、まとめて紹介します。

  1. Do While 条件
      プログラム
    Loop
    最初に条件を判断し、条件が満たされている間(While)、Loopまでのプログラムを実行します。
  2. Do
      プログラム
    Loop While 条件
    まずプログラムを実行します。 その後条件が満たされている間(While)、Doに戻ってプログラムを実行します。
  3. Do Until 条件
      プログラム
    Loop
    最初に条件を判断し、条件が満たされるまで(Until)、Loopまでのプログラムを実行します。
  4. Do
      プログラム
    Loop Until 条件
    まずプログラムを実行します。 その後条件が満たされるまで(Until)、Doに戻ってプログラムを実行します。

今日の課題

Yahoo!ファイナンスから今度は日経平均株価の表を取り込み、そして取り込んだ表の行数を数えるプログラムを書いてメールで提出してください。「マクロの記録」を使って構いません。

2008-04-15

Willcom D4

発表を楽しみにしていたのですが(Willcomのサイト シャープのサイト)、通話機能もWindows上で提供されており、通話の際もWindowsを起動させる必要があるというのはちょっと… 着信出来るようにするにはWindowsを起動させっぱなしにする必要があるということでしょうか。
それなら、小型Windowsパソコンと普通のPHSを持ち歩いて、データ通信をするときだけUSBで繫いだ方が良いと思います。
そのような使い方をするなら、小型WindowsパソコンとしてこのD4を買っても良さそうですね。

070をもっと便利に使う方法もあります。また小型パソコンとしては Windows XPをEee PCに最適化するもあります。

2008-04-14

統計学I

自然環境,社会環境を問わず,世の中の現象は大なり小なり偶然変動を含んでいます。統計学はそのような偶然変動を含むデータから有用な情報を抽出する方法を提供します。講義では,データのまとめ方及び推測統計学の考え方について講述します。平均,分散,相関などデータの代表値の意味を理解するとともに,統計的推定や統計的仮説検定の概念を把握することを目標とします。

教科書は「入門 統計学」橋本智雄著 共立出版です。
ここには講義に関するコメントを気軽に書いてください。

講義中に説明した統計解析をパソコンを使って実行するための方法もこのブログに書いていきます。

講義で説明した度数分布表やヒストグラムを、表計算ソフトのエクセルを使って作成する方法を説明します。

準備

最初に一度だけ次の操作が必要です。
左上の丸いボタンを押して、「Excelのオプション」をクリックします。そして左側の「アドイン」をクリックして、下の「管理:Excelアドイン」の横の「設定」をクリックします。

するとアドインの画面に切り替わるので「分析ツール」にチェックをつけてOKをクリックします。 「インストールしますか」と聞かれたら「はい」と答えます。

例1.1 度数分布表とヒストグラム

教科書例1.1のデータをエクセルに入力します。
次に、階級の境界の数字をC2セル以降に入力します。

右上の「データ分析」をクリックして「ヒストグラム」をクリックしてOKを押します。
以下のように入力してOKを押します。

教科書で度数と書かれている部分が、エクセルでは頻度と表示されます。その右には累積相対度数が表示されます。
教科書と同じ結果になりましたか?もし違うなら、その理由を考えてみてください。

2008-04-11

統計学入門

自然環境,社会環境を問わず,世の中の現象は大なり小なり偶然変動を含んでいます。統計学はそのような偶然変動を含むデータから有用な情報を抽出する方法を提供します。講義では,データのまとめ方及び推測統計学の考え方について講述します。平均,分散,相関などデータの代表値の意味を理解するとともに,統計的推定や統計的仮説検定の概念を把握することを目標とします。

教科書は「入門 統計学」橋本智雄著 共立出版です。
ここには講義に関するコメントを気軽に書いてください。

シラバスにおいて未定だった計算機実習は、総合情報基盤センター情報実習室2にて行います。日程は講義の進捗に応じて、講義中にお知らせします。

第一章の内容が全て終わったら、情報基盤センターで実習を行いますが、既にエクセルを使える人で「第一章が終わるまで待てない!」という人は以下の方法でやってみてください。なお、今回はOffice2003までの使い方を説明していますが、情報基盤センターではOffice2007を使います。

準備

最初に一度だけ次の操作が必要です。
  1. エクセルを立ち上げて、ツール→アドインを選びます。

  2. 分析ツールにチェックをつけて、OKを押します。

例1.1 度数分布表とヒストグラム

教科書例1.1のデータをエクセルに入力します。
次に、階級の境界の数字をC2セル以降に入力します。

ツール→分析ツールを選びます。

ヒストグラムを選んでOKを押します。

以下のように入力してOKを押します。

教科書で度数と書かれている部分が、エクセルでは頻度と表示されます。 教科書と同じ結果になりましたか?もし違うなら、その理由を考えてみてください。

2008-04-10

Office2007とVBA

この講義では広く用いられているMicrosoft Excelを用いてデータ解析を行う方法を説明します。
まずExcelを立ち上げましょう。

初めて使う時にはいくつか聞かれますので、共にOKを押してください。


まず準備です。左上の丸いボタンを押して、「Excelのオプション」をクリックします。そして「[開発]タブをリボンに表示する」にチェックをつけてOKを押します。

すると右端に「開発」が表示されるのでクリックして、マクロのセキュリティをクリックして、「すべてのマクロを有効にする」に●をつけてOKを押します。


これで準備は完了です。
ではマクロでどんなことが出来るか見てみましょう。「マクロの記録」をクリックしてください。マクロの名前を聞かれますので、ここはそのままOKを押します。


何か適当にExcelの操作をしてください。ここでは1から5の数字を入力してみました。
そして、記録終了をクリックしてください。

すると、Excelは今の操作を全部覚えています。確かめるために、今入力したものを全部消してから、今度は「マクロ」をクリックしてください。するとどのマクロを実行するか聞かれます。今は一つしかないのでそのまま「実行」を押します。
すると、先ほど自分でやったことがそのまま繰り返されたはずです。


一体どんな仕組みになっているか見るために「Visual Basic」のボタンを押します。するとVisual Basicの画面が開くので、左側のModule1をダブルクリックするとこの画面になります。


先ほど「マクロの記録」をクリックしてから「記録終了」をクリックするまでの操作が全てプログラムに書かれたのです。今すぐ覚える必要はありませんが、ActiveCell.FormulaR1C1 = "1"は選択しているセルに1を代入しなさい、Range("A2").SelectはA2セルを選択しなさい、という命令です。
このように自分の操作をプログラムに記録するのではなくて、今度は自分でプログラムを書いてみましょう。今、人によって色々違うことを書いたと思うので、一旦Excelを終了させて、もう一度立ち上げて、先ほど同様「開発」をクリックして「Visual Basic」をクリックしてください。
プログラムを書く部分を用意したいので「挿入」をクリックして「標準モジュール」をクリックしてください。

現れた画面にプログラムを書きます。
まず
sub 練習
とだけ書いて、Enterキーを押してください。すると自動的に

Sub 練習()

End Sub

となり、カーソルは真ん中の空行にあります。そこに
cells(1,1)=1
と書いてください。これは上から1番目、左から1番目のセルに1を代入しなさい、という命令です。
プログラムを書いたら、上の右向きの三角をクリックしてください。するとさっきと同じように、どのプログラムを実行するか聞かれます。今は一つしか書いていないのでそのまま実行を押すと、A1セルに1が代入されます。Excelの画面で「マクロ」を押しても実行できます。

このプログラムを保存する時の注意。
左上の「上書き保存」を押すと、どの形式でファイルを保存するか尋ねられます。ファイルの種類として「Excelマクロ有効ブック」を指定してください。
2階実習室で保存するときは、P:ドライブに保存してください。

さてこれでプログラムを書いて実行できるようになったので、具体的なプログラミングを始めましょう。
先ほどのCells(1,1)=1とEnd Subの間に
cells(2,1)=2
cells(3,1)=3
と書き込んで実行してみてください。
あるいは
cells(1,2)=-2
cells(1,3)=-3
と書いて、cellsの二つの添え字がExcelのどのセルに対応しているか確認しましょう。

10個続けて書くには、
cells(1,1)=1
cells(2,1)=2
cells(3,1)=3
cells(4,1)=4
cells(5,1)=5
cells(6,1)=6
cells(7,1)=7
cells(8,1)=8
cells(9,1)=9
cells(10,1)=10

と書くのは大変なので、これをFor文を使って

for i=1 to 10
 cells(i,1)=i
next i

と書きます。

次に下のような九九の表ができるようにプログラムを考えて見ましょう。

作成したプログラムのSub ...からEnd Subまでをメールの本文にコピーして提出してください。

レポートの提出先は fuedareport@ems.okayama-u.ac.jp です。

Office TANAKAにも詳しく書かれています。

Windowsからメールを送る方法

実習室のWindowsからメールを送る方法を説明します。
ますOutlook Expressを立ち上げます。「通常使用するメールクライアントとして選択しますか」と聞かれたら「はい」と答えてください。

自分の名前と、大学で使っているメールアドレスを書きます。

受信メールサーバーの種類は「POP3」のままにしてください。その下の「受信メールサーバー」「送信メールサーバー」に何を書くかは講義のときに説明します。

「アカウント名」欄にはログオンする時に使った名前を書いてください。「パスワード」欄には何も書かず「パスワードを保存する」のチェックを外してください。最後に「完了」をクリックしてください。

次に「ツール」の「アカウント」をクリックします。「メール(既定)」「使用可能な接続」と書かれた行が、恐らくこの図とは違って一番上にあると思いますが、その左端をクリックしてから「プロパティ」をクリックします。

「詳細設定」をクリックして「サーバーにメッセージのコピーを置く」にチェックをつけます。付け忘れると、このソフトを使っている時に受信したメールが他のパソコンやLinuxからは読めなくなってしまいます。チェックをつけたら「OK」をクリックします。

次に「ツール」の「オプション」をクリックして「送信」の「メール送信の形式」として「テキスト形式」を選んで「OK」をクリックします。
メールを送るときは、まず「メールの作成」をクリックします。宛先はfuedareport@ems.okayama-u.ac.jp、件名欄には講義の日付と学籍番号を書いてください。最後に「送信」をクリックするとメールが送信されます。