あるところで,代金 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)
※コメント投稿者のブログIDはブログ作成者のみに通知されます