RでHTMLのデータを使ってみよう〜非オープンデータ化を突っきれ〜(1)
日本はオープンデータ化が遅れていると言われておりますが、データがないわけではない。あるんです。Webに。PDFやpng, jpegなどの図になっていたら少しきついですが、HTMLでTABLEタグで書かれたデータだったらなんとか使えないか、ということです。そんなこんなのメモです。
今回は「R」言語というものを使いますので、こちらからダウンロードしてください。インストールの仕方なんかは、こちらとかが詳しいです。
ということで、Rがインストールして立ち上がっている状態からスタートいたします。
そもそも、Rという言語はデータ分析、統計、機械学習などに特化した言語であり、これらに必要なパッケージが日々開発され続けています。そのパッケージのお陰で難しい機械学習もほんの数行で書けたりするのです。
今回はそのパッケージの中から、XMLなどのマークアップ言語を用いるためのパッケージ「XML」と、グラフを描くのに便利な「ggplot2」というパッケージをインストールします。
> install.packages
(
"XML", dependencies =
TRUE
)
> install.packages
(
"ggplot2", dependencies =
TRUE
)
> library
("XML")
> library("ggplot2")
これで準備は万端です。
では、今回は気象庁の東京の今日の天気のページ(http://www.jma.go.jp/jp/amedas_h/today-44132.html?areaCode=000&groupCode=30)をデータとして使うことを想定しましょう。リンク先をご覧いただいたらわかる通り、表形式で東京の気象状況が1時間ごとに記述されています。これを取ってきてデータ分析に使うという例です。とりあえず、Rから上記のページを呼んでみましょう。
> readHTMLTable('http://www.jma.go.jp/jp/amedas_h/today-44132.html?areaCode=000&groupCode=30')
$global
NULL
$`NULL`
V1
1 再読込ボタンかブラウザの更新ボタンをクリックして最新の情報をお使いください。
2
3 気象警報・注意報
4 気象情報
5 海上警報
6 台風情報
7 指定河川洪水予報
8 土砂災害警戒情報
9 土砂災害警戒判定メッシュ情報
10 竜巻注意情報
11
12 大津波警報・津波警報・津波注意報、津波情報、津波予報
13 地震情報
14 東海地震関連情報
15 噴火警報・予報
16
17 天気予報
18 天気分布予報 / 時系列予報
19 週間天気予報
20 海上予報
21 異常天候早期警戒情報 / 季節予報
22 解析雨量・降水短時間予報
23
24 天気図
25 レーダー・ナウキャスト(降水・雷・竜巻)
26 高解像度降水ナウキャスト
27 気象衛星
28 アメダス 地図形式 / 表形式
29 空港の気象
30 ウィンドプロファイラ(上空の風)
31 黄砂情報 実況図 / 予測図
32 紫外線情報
33
34 潮位観測情報
35 波浪観測情報
$`NULL`
NULL
$`NULL`
NULL
$tbl_title
V1
1 2015年02月04日 東京(トウキョウ)
2 北緯: 35 度 41.5 分 東経: 139 度 45.0 分 標高: 25 m\n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t昨日の観測データ\n\t\t\t\t\t\t\t\t 最低・最高気温
$tbl_list
時刻 気温 降水量 風向 風速 日照時間 積雪深 湿度 気圧
1 時 ℃ mm 16方位 m/s h cm % hPa
2 1 3.2 0.0 北 1.8 0 53 1021.7
3 2 3.5 0.0 北西 1.6 0 48 1021.8
4 3 3.0 0.0 北 1.8 0 52 1021.4
5 4 2.4 0.0 北 1.2 0.0 0 55 1021.3
6 5 2.3 0.0 北 1.6 0.0 0 55 1021.4
7 6 1.9 0.0 北北東 1.6 0.0 0 56 1021.7
8 7 2.2 0.0 北北東 2.2 0.0 0 57 1022.2
9 8 2.9 0.0 北 1.5 0.3 0 55 1022.4
10 9 4.1 0.0 北北西 2.7 1.0 0 50 1022.3
11 10 6.1 0.0 北東 1.7 1.0 0 43 1022.1
12 11 6.5 0.0 北 2.2 1.0 0 36 1021.4
13 12 7.7 0.0 北北東 1.6 1.0 0 35 1020.1
14 13 8.7 0.0 北北東 2.0 1.0 0 30 1019.2
15 14 8.7 0.0 北北東 1.9 1.0 0 31 1018.2
16 15 8.1 0.0 南東 1.5 0.6 0 32 1018.0
17 16 7.8 0.0 南南東 3.9 0.4 0 38 1018.1
18 17 7.1 0.0 南東 4.2 0.3 0 45 1018.2
19 18 6.3 0.0 南東 2.7 0.0 0 55 1018.8
20 19 5.7 0.0 東 2.1 0.0 0 60 1019.3
21 20 5.5 0.0 東 2.3 0.0 0 61 1019.4
22 21
23 22
24 23
25 24
$tbl_temperature
データ 時刻
1 最低気温(℃) 1.1 05:52
2 最高気温(℃) 9.6 14:02
3 最大瞬間風速(m/s)(風向(16方位)) 7.6(南) 17:31
>
なにかいっぱい出てきましたが、つまり、"$tbl_list"のテーブルさえあればいいですね。さらに単位が記述されている行が邪魔です。その行を消して、todayという変数に格納しときましょう。
> today <- readHTMLTable('http://www.jma.go.jp/jp/amedas_h/today-44132.html?areaCode=000&groupCode=30')$tbl_list[2:25,]
> today
時刻 気温 降水量 風向 風速 日照時間 積雪深 湿度 気圧
2 1 3.2 0.0 北 1.8 0 53 1021.7
3 2 3.5 0.0 北西 1.6 0 48 1021.8
4 3 3.0 0.0 北 1.8 0 52 1021.4
5 4 2.4 0.0 北 1.2 0.0 0 55 1021.3
6 5 2.3 0.0 北 1.6 0.0 0 55 1021.4
7 6 1.9 0.0 北北東 1.6 0.0 0 56 1021.7
8 7 2.2 0.0 北北東 2.2 0.0 0 57 1022.2
9 8 2.9 0.0 北 1.5 0.3 0 55 1022.4
10 9 4.1 0.0 北北西 2.7 1.0 0 50 1022.3
11 10 6.1 0.0 北東 1.7 1.0 0 43 1022.1
12 11 6.5 0.0 北 2.2 1.0 0 36 1021.4
13 12 7.7 0.0 北北東 1.6 1.0 0 35 1020.1
14 13 8.7 0.0 北北東 2.0 1.0 0 30 1019.2
15 14 8.7 0.0 北北東 1.9 1.0 0 31 1018.2
16 15 8.1 0.0 南東 1.5 0.6 0 32 1018.0
17 16 7.8 0.0 南南東 3.9 0.4 0 38 1018.1
18 17 7.1 0.0 南東 4.2 0.3 0 45 1018.2
19 18 6.3 0.0 南東 2.7 0.0 0 55 1018.8
20 19 5.7 0.0 東 2.1 0.0 0 60 1019.3
21 20 5.5 0.0 東 2.3 0.0 0 61 1019.4
22 21
23 22
24 23
25 24
>
todayというところに、無事、各時刻の気温、降水量、風向、風速、日照時間、積雪深、湿度、気圧をデータ化することができました。が、これら一つ一つのデータが文字列であったり数値であったらいいのですが、Factor型というまだデータとして扱えない状態になっているのです。面倒ですが、文字列や数値に変換してあげましょう。(注意:Factor型から直接、数値に変換すると、思ってたのと違う!となるので、文字列にしてから数値にしてあげましょう。)
> today$時刻<-as.numeric(as.character(today$時刻))
> today$気温<-as.character(today$気温)
> today$降水量<-as.character(today$降水量)
> today$風向<-as.character(today$風向)
> today$風速<-as.character(today$風速)
> today$日照時間<-as.character(today$日照時間)
> today$積雪深<-as.character(today$積雪深)
> today$湿度<-as.character(today$湿度)
> today$気圧<-as.character(today$気圧)
> today
時刻 気温 降水量 風向 風速 日照時間 積雪深 湿度 気圧
2 1 3.2 0.0 北 1.8 0 53 1021.7
3 2 3.5 0.0 北西 1.6 0 48 1021.8
4 3 3.0 0.0 北 1.8 0 52 1021.4
5 4 2.4 0.0 北 1.2 0.0 0 55 1021.3
6 5 2.3 0.0 北 1.6 0.0 0 55 1021.4
7 6 1.9 0.0 北北東 1.6 0.0 0 56 1021.7
8 7 2.2 0.0 北北東 2.2 0.0 0 57 1022.2
9 8 2.9 0.0 北 1.5 0.3 0 55 1022.4
10 9 4.1 0.0 北北西 2.7 1.0 0 50 1022.3
11 10 6.1 0.0 北東 1.7 1.0 0 43 1022.1
12 11 6.5 0.0 北 2.2 1.0 0 36 1021.4
13 12 7.7 0.0 北北東 1.6 1.0 0 35 1020.1
14 13 8.7 0.0 北北東 2.0 1.0 0 30 1019.2
15 14 8.7 0.0 北北東 1.9 1.0 0 31 1018.2
16 15 8.1 0.0 南東 1.5 0.6 0 32 1018.0
17 16 7.8 0.0 南南東 3.9 0.4 0 38 1018.1
18 17 7.1 0.0 南東 4.2 0.3 0 45 1018.2
19 18 6.3 0.0 南東 2.7 0.0 0 55 1018.8
20 19 5.7 0.0 東 2.1 0.0 0 60 1019.3
21 20 5.5 0.0 東 2.3 0.0 0 61 1019.4
22 21
23 22
24 23
25 24
>
見た目は変わっていませんが、型を変えることができました。まだ、今日が終わっていませんが、今日の平均気温を出しましょう。
> mean(as.numeric(today$気温[1:20]))
[1] 5.185
5.185℃だそうです。寒いですね。こんな感じで、データ分析できます。
> summary(as.numeric(today$気温[1:20]))
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.900 2.975 5.600 5.185 7.250 8.700
R言語がお得意のsummary()も求められます。今日の最高気温が8.7℃、最低気温が1.9℃と分かりますね。
さて、本日の気温の動向を見てみましょう。
> qplot(today$時刻,today$気温)
>
なるほど。。。では、気圧の変動を見てみましょう。
> qplot(today$時刻,today$気圧)
>
気圧はお昼から15時にガクンと下がっています。あ、そういえば、明日の東京地方の天気予報は雪でしたね。
なんか、面倒とお感じになったかもしれませんが、慣れれば結構便利です。いろんなサイトのいろんなTABLEタグで書かれたデータを使って、データサイエンスを楽しんでください。