裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

Web ページからデータスクレイピング

2020年01月08日 | ブログラミング

あるところで,代金 200 円也でデータスクレイピングしたデータファイルが売られている。

成人喫煙率(JT全国喫煙者率調査)
http://www.health-net.or.jp/tobacco/product/pd090000.html

つまり,以下は少なくとも 200 円の価値のある作業だということか(笑)。

上に示した URL を開き,ページを「別名で保存...」する。

次に以下の R プログラムで処理する。

# 対象ファイル
file.name = "最新たばこ情報|統計情報|成人喫煙率(JT全国喫煙者率調査).html"
# 保存された html ファイルを読み込む(エンコーディングに注意)
con = file(file.name, encoding = "cp932")
text = readLines(con) # 入力
data = character(858 - 47) # データ保管用のベクトル
count = 0 # 数値データの存在行のカウント
for (txt in text) { # 各行について
    txt = gsub("<.*?>", "", txt) # html タグを除去する
    if (nchar(txt) > 0) { # 本文もしくは数値(文字)など
        count = count + 1
        if (count >= 47 && count <= 857) { # この範囲なら目的のデータ
            data[count - 46] = txt # 保存
        }
    }
}
data = data[data != "平成元年"] # 不要な要素を除去する
data = as.data.frame(matrix(data,
    ncol = 15, byrow = TRUE), stringsAsFactors = FALSE) # データフレームに変換する
data = data[-c(2, 9)] # 2 列目と 9 列目は性別データなので消去
colnames(data) = c("year", # 列名(変数名)を付ける
    "male20-29", "male30-39", "male40-49", "male50-59", "male60-69", "male all",
    "female20-29", "female30-39", "female40-49", "female50-59", "female60-69", "female all")
data$year = 1965:2018 # 1 列目を西暦年にする
data = sapply(data, as.numeric) # 文字列を数値に変換する

これで,以下のようなデータフレームができあがる。

> head(data)
     year male20-29 male30-39 male40-49 male50-59 male60-69 male all
[1,] 1965      80.5      84.7      86.7      81.4      74.6     82.3
[2,] 1966      83.5      84.8      87.3      83.4      78.0     83.7
[3,] 1967      83.2      84.1      85.8      82.3      73.3     82.3
[4,] 1968      78.0      79.3      82.5      81.3      70.8     78.5
[5,] 1969      78.5      80.6      83.7      80.3      71.1     79.1
[6,] 1970      79.9      78.4      81.0      78.3      67.8     77.5

     female20-29 female30-39 female40-49 female50-59 female60-69 female all
[1,]         6.6        13.5        19.0        23.0        23.0       15.7
[2,]        10.6        14.3        22.0        24.1        24.1       18.0
[3,]        11.0        16.4        20.9        23.1        20.3       17.7
[4,]         8.1        13.6        17.8        21.1        20.4       15.4
[5,]         9.9        13.1        16.8        20.7        19.8       15.4
[6,]         9.8        13.0        16.1        23.3        20.0       15.6

長いなあ。面倒だなぁ。とお思いの方,次の記事で超簡単なデータスクレイピングをお見せします。

それはさておき,早速 graphics::matplot() で図を描いてみる。

old = par(mar = c(3.5, 3, 1.5, 5), mgp = c(1.5, 0.4, 0), tck = -0.01,
    bty = "n", las = 1)
colors = c("black", "red", "blue", "brown", "mediumseagreen", "magenta")
matplot(data[, -1], type = "l", lwd = 2, xaxt = "n", ylim = c(0, 100),
    lty = 1, col = colors,
    xlab = "年", ylab = "喫煙率", main = "性別・年代別喫煙率の推移")
mtext("JT全国喫煙者率調査", xpd=TRUE, side = 3, line = -0.8, cex=0.8)
axis(1, at = 1:nrow(data), label = data[, 1], pos = 0)
delta = c(0, -1, 0, 0, 0, 0,  -0.1, -0.1, 0.8, 0.5, -0.7, 0)*strheight("H")
text(55, data[54, 2:13]+delta, colnames(data)[2:13], col = colors, pos = 4,
    cex = 0.7, xpd = TRUE)
par(old)

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« e-Stat から入手したデータの... | トップ | Web ページからデータスクレ... »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事