LoginSignup
2
8

More than 5 years have passed since last update.

【R】【tidyr】スクレイピングからデータのグラフ化までまとめて実行

Last updated at Posted at 2017-03-05

Rでデータフレームを縦長・横長・入れ子に変形・整形するためのライブラリ「tidyr」を使って、簡単な分析をしてみます

今回実行した環境

  • MacBook Pro (Retina, 13-inch, Early 2015)
  • プロセッサ: 3.1 GHz Intel Core i7
  • メモリ: 16 GB 1867 MHz DDR3
  • OSバージョン: 10.12.3
  • R : 3.3.1

準備

tidyrを入れる

はじめてtidyrを使用する場合は、パッケージをインストールしておきましょう

install.packages("tidyr")
library(tidyr)

使用するデータを取得する

今回は、漢検の受験者数のデータを使用します。
http://www.kanken.or.jp/kanken/investigation/transition.html

毎年の受験者数がシンプルなテーブルで記述されていますので、
ここは、readHTMLTableを使えば一発で抽出可能です

library(XML)
kanken = "http://www.kanken.or.jp/kanken/investigation/transition.html"
kanken.table = readHTMLTable(airline, header=T, which=1,stringsAsFactors=F)
# 列名を入れる
colnames(kanken.table) = c("年度","志願者数","合格者数")

テーブルの中身は以下のようになっています

                    年度    志願者数    合格者数
1 平成12年度(2000年度) 1,576,959人   686,388人
2 平成13年度(2001年度) 1,797,608人   859,902人
3 平成14年度(2002年度) 2,044,170人 1,067,356人
4 平成15年度(2003年度) 2,195,595人 1,203,597人
5 平成16年度(2004年度) 2,240,344人 1,133,875人
6 平成17年度(2005年度) 2,407,075人 1,227,430人
・・・

tidyrでデータを縦長に変換する

続いてtidyrのgather関数をつかってデータを縦長に変換します
この処理をおこなうことでggplot2でグラフ化がしやすくなります

kanken.g <- kanken.table %>% tidyr::gather(分類,人数,-年度)

データは以下のように変換されます

                     年度     分類        人数
1  平成12年度(2000年度) 志願者数 1,576,959人
2  平成13年度(2001年度) 志願者数 1,797,608人
3  平成14年度(2002年度) 志願者数 2,044,170人
・・・
・・・
・・・
17 平成12年度(2000年度) 合格者数   686,388人
18 平成13年度(2001年度) 合格者数   859,902人
19 平成14年度(2002年度) 合格者数 1,067,356人
・・・

このままだと、人数が数値として読み込めないので、
以下のように「,」と「人」を取り除きます

# 「,」の排除
kanken.g[,3] <- gsub(",","",kanken.g[,3])
# 「人」の排除とas.numericを用いて数値化
kanken.g[,3] <- as.numeric(gsub("人","",kanken.g[,3]))

ここまででデータ整形は完了です。

グラフの描画

続いてグラフの描画をしていきます
今回は、毎年の「志願者数」と「合格者数」をそれぞれ棒グラフにしてならべます

g <- ggplot(kanken.g, aes(x = 年度, y = 人数, fill = 分類))
# グラフのタイプを指定して棒グラフにする
g <- g + geom_bar(width = 0.8, stat = "identity", position = "dodge")
g <- g + scale_linetype_identity()
g <- g + theme_pander()
g <- g + theme(text = element_text(family = "HiraKakuProN-W3"),
               plot.margin= unit(c(1, 1, 1, 1), "lines"),
               axis.text.x = element_text(angle = 45, hjust = 1))
# Y軸を3桁毎のカンマ区切りで表示する
g <- g + scale_y_continuous(labels = scales::comma)
g

すると以下のようなグラフが書けます

Rplot21.png

2008年度をピークに、一気に志願者数が減少
その後、2010年に巻き返すものの近年は、微減トレンドにあるようです
合格率自体には大きな変化が無く、志願者数につられ合格者数も変動しています

2009年度に何かあったのか、調べたら「漢検協会事件」というのが起きていました
自分もなんとなく覚えているのでちょっと懐かしくなりました

2
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
8