平成28年11月
秋田工業高等専門学校 環境都市工学科
助教
長谷川 裕修
交通関連ビッグデータ活用に向けたデータの 前処理・クリーニングに関する研究
第
2014
-11
号(一財)日本建設情報総合センター研究助成事業
交通関連ビッグデータ活用に向けたデータの 前処理・クリーニングに関する研究報告書
平成
28
年9
月助成研究者紹介
ハセガワ ヒロノブ 長谷川 裕修
現職:秋田工業高等専門学校 環境都市工学科 准教授(博士(工学))
主要論文(審査付)
• 長谷川裕修,内藤利幸,有村幹治,田村亨:アンサンブル学習による交通機関選択モデルの構築とその評価,
土木学会論文集D3(土木計画学),Vol.68,No.5,pp.773-780 (2012)
• HASEGAWA Hironobu, FUJII Masaru, ARIMURA Mikiharu, TAMURA Tohru: A Basic Study on Traffic
Accident Data Analysis Using Support Vector Machine,Journal of the Eastern Asia Society of Trans- portation Studies, Vol.7, pp.2873-2880 (2007)
• 長谷川裕修,藤井勝,有村幹治,田村亨:北海道発着貨物のグリ−ン物流戦略,交通学研究,Vol.50,pp.219-228 (2007)
他8編の審査付論文に加えて,国際会議・国内学会発表多数
目 次
第I部 はじめに 1
1. 研究の背景と目的 1
2. 本報告書の構成 3
第II部 データの読み込み 4
3. テキストデータの読み込み 5
(1) 固定長テキストデータの読み込み . . . . 5
(2) CSVデータの読み込み . . . . 5
4. Excelファイルの読み込み 9 第III部 データの前処理・クリーニング 15 5. 欠損値への対応 16 (1) 欠損値の特定 . . . . 16
(2) 欠損値の補完 . . . . 18
a) 確率的回帰代入法. . . . 19
b) 完全情報最尤推定法 . . . . 20
(3) 欠損値の削除 . . . . 20
6. 連続データの離散化 22 (1) 等間隔区間による離散化 . . . . 22
(2) 等頻度区間による離散化 . . . . 24
(3) k-means法によるクラスタリング . . . . 27
(4) 離散変数のダミー化 . . . . 32
7. 次元削減 35 (1) 主成分分析による次元削減 . . . . 35
(2) k-means法による次元削減 . . . . 43
8. データの正規化 46 (1) データの平均が0,分散が1になるように正規化 . . . . 46
(2) データの最小値が0,最大値が1になるように正規化 . . . . 49
9. 標本抽出 52 (1) 単純無作為抽出法 . . . . 52
(2) 層別抽出法 . . . . 55
a) データフレームの操作による層別抽出 . . . . 56
b) subset()関数による層別抽出. . . . 58
第IV部 おわりに 60
第V部 補遺 61
10.データフレームの操作 61
11.データの概要を確認 64
(1) データの列数・行数・要約 . . . . 64
(2) データの簡単な集計・図化 . . . . 65
12.付属Rスクリプトの実行方法 68 (1) RscriptAndData.zipの解凍 . . . . 68
(2) Rスクリプトを読み込む . . . . 68
(3) 作業ディレクトリを設定 . . . . 71
(4) データの読み込み . . . . 71
(5) ライブラリの読み込み . . . . 71
図 目 次
1 データマイニングによる知識発見プロセス . . . . 1
2 7時台の交通量分布 . . . . 23
3 EWDによって離散化した7時台の交通量分布 . . . . 25
4 EFDによって離散化した7時台の交通量分布 . . . . 26
5 非階層型クラスタリング結果. . . . 28
6 k-meansによって離散化した7時台の交通量分布 . . . . 30
7 7時台の交通量分布の離散化 . . . . 31
8 ダミー変数作成のイメージ図. . . . 32
9 固有値のスクリープロット . . . . 37
10 主成分分析のバイプロット . . . . 42
11 クラスタ別時間帯別交通量(クラスタ1–6) . . . . 44
12 クラスタ別時間帯別交通量(クラスタ7–12) . . . . 45
13 時間帯別交通量(台/時) . . . . 67
14 付属Rスクリプトおよびデータのディレクトリ構造 . . . . 68
15 Windows版RでのRスクリプトの文字化け . . . . 69
16 Windows版Rstudioで開いたRスクリプト . . . . 70
表 目 次 1 sagamiharaデータ . . . . 8
2 平成22年度道路交通センサス一般交通量調査時間帯別交通量表(秋田県の一部を抜粋) . . . . 10
3 比較演算子・比較演算関数・論理演算子 . . . . 55
4 H22年度道路交通センサス 天候区分 . . . . 55
第
I
部はじめに
1. 研究の背景と目的
近年,センサ技術の発達とデータ保存コストの低下を背景に,システムによって自動的に記録・蓄積されるデー タ(=ビッグデータ)の量的・質的な増加が加速している.交通分野におけるビッグデータとしては,公共交通機 関の乗降履歴を記録する交通系ICカードデータが代表的であるが,それ以外にもトラフィックカウンターによっ て断面交通量を記録するトラカンデータ,車両に積んだGPSや加速度計を用いて詳細な移動経路を取得可能なプ ローブデータなど様々な交通現象が時々刻々と記録されている.
これら増大し続ける交通関連ビッグデータからマーケティング・政策立案等における意志決定に有用な知識を発 掘するためには,データマイニングによる知識発見プロセス(=広義のデータマイニング)が必要となる(図–1).
┠ⓗࢹ࣮ࢱ
๓ฎ⌮῭
ࢹ࣮ࢱ
ኚᚋ ࢹ࣮ࢱ
ࣃࢱ࣮ࣥ
⋓ᚓ࣭㑅ᢥ
๓ฎ⌮
ࢡ࣮ࣜࢽࣥࢢ
ኚ
ࣃࢱ࣮ࣥࡢⓎぢ ゎ㔘࣭ホ౯
▱㆑
ࢹ࣮ࢱ
図–1: データマイニングによる知識発見プロセス
(元田ら1)p.8図1.2を参考に筆者作成)
データマイニングプロセスのうち,データセットから頻出するパターンやルールを発見するパターンの発見は 狭義のデータマイニングとも呼ばれる中心的な過程であり,これまで筆者は交通関連データからのパターン発見 を目指した研究に取り組んできた2),3),4),5),6),7).また,国内外における交通関連データへのデータマイニング技術 適用事例の多くも,このパターン発見を主目的とするものであった(例えば,8),9),10),11)).
一方,パターン発見の前段階として行われるデータの前処理・クリーニングは,分析の一過程として,外れ値の 削除や変数変換,セグメント毎のデータ分割などが行われているものの,いずれも探索的に行われているのが実 情であり,交通分野において体系だった整理は行われていない.また,それぞれの論文等においてどのような前 処理・クリーニングが行われているかについては,紙幅の制約により詳しい説明は省略されることが多く,『科学 における再現性』という観点からも問題がある.
データの前処理・クリーニングは分析精度に大きく影響するだけでなく,増え続けるデータを現実的な計算時 間で取り扱うためにも重要である.交通関連データの持つ情報量の損失を抑えつつ,扱いやすい形に変換するた めには,統計や機械学習の知識・技術と共に,当該交通現象に関する領域知識が必要となる.
以上を踏まえて本研究では,交通系ビッグデータからの知識発見への応用を念頭に,交通関連データの前処理・
クリーニングの方法論を整理することを目的とする.
具体的には,オープンソースのデータ解析環境Rおよびその拡張パッケージを用いて,オープンデータとして
公開されているデータや,Web経由で簡単に入手可能な交通関連データへのデータの前処理・クリーニングの適 用例として整理を行った.
2. 本報告書の構成
本報告書は報告書本編と付属Rスクリプトからなる.
報告書本編の構成は以下の通りである.まず,第II部において,テキストデータとExcelファイルをRに読み 込む方法を説明する.次に,第III部において,読み込んだデータに欠損値がある場合の対応,連続データの離散 化,次元削減,データの正規化,標本抽出について説明する.最後に,第IV部において,本研究の成果と今後の 展望を述べる.なお,第V部に,Rの基本的な操作方法の説明と,付属Rスクリプトの実行方法をまとめている ので,Rに不慣れな読者の参考になれば幸いである.
本報告書はその性格上,本文とプログラムの記述が混在している.また,PDFファイル内にハイパーリンクを 多数設定している.これらはフォントの色や装飾,文書の装飾によって書き分けており,それぞれが意味すると ころは以下の通りである.
• 内部リンク
– 図へのリンク:図–1(p. 1)
– 脚注へのリンク:*1
– 部・章・節・項の見出しへのリンク:・III・5.・(2)・a) – 参考文献へのリンク:2)
– Rスクリプトへのリンク:Rスクリプト 2(p. 5)
• 外部リンク:日本建設情報総合センターホームページ
• 索引語:文末の索引に載っている語句は,本文中で索引語のように太字で表記されている.
• 引用文
引用元(文献名2))
引用文はこのように,ブロックの中に囲まれており,両端にスペースが入っている.引用元と なる文献名および末尾の参考文献へのリンクは右上にある.
• Rスクリプト文法の説明:ただし,この記述方法はあくまでも文法の説明であり,実際にそのまま動くスク リプトではないことに注意されたい.
Rスクリプト1: Rスクリプト文法の説明
1 getwd( ) # 現 在 の 作 業 デ ィ レ ク ト リ を 表 示 2 q( ) # Rコ ン ソ ー ル を 終 了
3 # シ ャ ー プ 以 下 は コ メ ン ト と し て 扱 わ れ る . 4 i f( 0 ){
5 複 数 行 に 渡 る コ メ ン ト は
6 こ の よ う にi f( 0 ){}の 間 に 記 入 す れ ば 良 い
7 }
• Rスクリプトの実行例:以下のように薄いグレーの背景となっているブロックがRスクリプトの実行例であ る.Rスクリプトとその実行結果からなり,実行結果は先頭に”$$”が追加されている.
# データの読み込み
data <- iris # Rに標準で組み込まれているirisデータセット
# 読み込んだデータを上から3行分表示 head(data, 3)
$$ Sepal.Length Sepal.Width Petal.Length Petal.Width Species
$$ 1 5.1 3.5 1.4 0.2 setosa
$$ 2 4.9 3.0 1.4 0.2 setosa
$$ 3 4.7 3.2 1.3 0.2 setosa
∗1本文を補足する記述は脚注に記載
第
II
部データの読み込み
交通分野におけるデータの獲得・選択方法は以下の4パターンに類型化できる.
(a) 新規に調査を行う
(b) 既存の統計調査結果を用いる
(c) システムによって自動的に記録されたログデータを用いる(ビッグデータ)
(d) 既存データ同士の紐付けによって新たな属性を付加したデータを生成する(データフュージョン)
今後はセンサ技術の更なる発達やデータフュージョン技術の一般化によって,それぞれの交通現象を記述する 変数が増えていくことが予想され,データの前処理・クリーニング技術の重要性も増していくものと考えられる.
以下,獲得したデータをRにおいて読み込む方法を説明する.
Rは基本的にメモリ上にデータを展開して,逐次計算処理を行うため,数TB規模の超大規模データの分析に そのまま使うには適していない.プローブデータやトラフィックカウンターデータなどデータサイズが非常に大 きいものであれば,リレーショナルデータベースに格納した方が良い.また,システムによって自動的に記録さ れるログデータも通常,データベースに格納される.データベースとRを連携させるRODBCパッケージもあ るが,本報告書では扱わない.
交通分野において通常用いられる,パーソントリップ調査や交通事故調査データ程度*2であれば,Rに読み込 んで使用することで,データの前処理・クリーニング,その後の解析まで連続的・統一的に行うことができ,便利 である.
Rのインストール方法や基本的な取扱い方は,既に多くの書籍が刊行されている*3ので,そちらを参照された い.なお,Web上にも多くの有益な情報が公開されているが,通常の検索エンジンでは検索が難しい場合がある.
この場合は情報が集積されたRjpWikiやR-Tipsを参照するか,seekRという検索エンジンを用いて検索すること が効率的である.
∗2マシンに登載しているメモリサイズにもよるが,筆者の経験では1GB程度までは問題ない.
∗3例えば,初学者向けとしては12),網羅的なものとしては13)など
3. テキストデータの読み込み
小規模なアンケート調査などであれば,Excelなどの表計算ソフトウェアを用いて結果をコード化し,そのまま 用いることが多いが,それ以上の規模(例えば,パーソントリップ調査や交通系ICカード履歴など)のデータで あれば,一度データベースに格納し,必要に応じてテキストファイルに書き出して用いることが多い.本節では テキストデータをRで読み込む方法について整理する.
Rに限らず,プログラムでテキストデータを読み込む際に一番多いトラブルは日本語などの非アスキー文字の 文字化けであるが,これは殆どの場合,データの入出力に際して文字エンコーディング指定が適切になされてい ないことで起きる.このようなトラブルに見舞われた際には,使用するテキストデータの文字エンコーディング を確認することを勧める.
(1) 固定長テキストデータの読み込み
固定長テキストデータの読み込みには,read.fwf()関数を使用する.なお,通常のWindows環境で作成し たテキストファイルをMacやLinux環境で読み込む場合には,文字エンコーディングを指定する必要があり,
fileEncoding引数で”cp932”を指定する*4.各フィールドの文字数はwidth引数に数字ベクトルの形で与えて 指定する.その他の引数についてはhelp(read.fwf )を参照のこと.
Rスクリプト2に3つのフィールドを持ち,それぞれのフィールドの文字数が1, 3, 5文字からなる*5input.txt という名称の固定長テキストを読み込む際のRスクリプトを示す.
Rスクリプト2: read.fwf()関数による固定長テキストの読み込み
1 read.fwf(f i l e=” i n p u t . t x t ” , f i l e E n c o d i n g=” c p9 32 ” , wi dt h=c( 1 , 3 , 5 ) )
固定長テキストに限らず他のテキストデータでも同様だが,Rに比較的大規模なテキストデータを読み込む際に Rの標準関数*6を使用すると,多くの時間がかかる.一例として,筆者が過去の研究2),5)で使用した108.4MB の固定長テキストファイル*7をread.fwf()関数で読み込むと,筆者環境では読み込みに3分以上かかる.一方,
readrパッケージが提供するread fwf()関数を用いると2秒弱で読み込みが終わる.
よって特別な理由がない限りはread fwf()関数を使う方が良いが,その際には (a) 引数の与え方が変わること
(b) 文字列が因子型(factor)ではなく,文字列型(character)として読み込まれること
(c) 文字エンコーディングの指定ができないため,非アスキー文字(日本語など)を含む場合にはあらかじめ文 字エンコーディングを使用する環境に適したもの*8に変更する*9必要があること
に注意が必要である.なお,readrパッケージは2015年8月20日現在,CRANからダウンロード可能である.
Rスクリプト 3にread fwf()関数による固定長テキストの読み込み例を示す.
Rスクリプト3: read fwf()関数による固定長テキストの読み込み
1 i n s t a l l.packages( ” r e a d r ” ) # r e a d r パ ッ ケ ー ジ が イ ン ス ト ー ル さ れ て い な い 場 合 2 l i b r a r y( r e a d r )
3 read fwf(f i l e=” i n p u t . t x t ” , fwf w i d t h s (c( 1 , 3 , 5 ) ) )
(2) CSVデータの読み込み
CSVはcomma-separated valuesの略で,いくつかのフィールドをカンマ「,」で区切ったテキストデータのこ
とを指す.表形式で表現されるデータをやり取りする際に最も多く用いられるデータ形式である.
∗4Shift-JISとCP932との関係はhttp://qiita.com/kasei-san/items/cfb993786153231e5413を参照
∗5一行当たり9文字(= 1 + 4 + 5)
∗6read.table()関数,read.csv()関数など
∗7 平成18年に札幌市およびその周辺市町村を対象として行われた第4回道央都市圏パーソントリップ調査結果を固定長テキストファイ ルとして保存したファイル.データは,目的トリップ毎に個人属性・トリップ属性・調査日など1レコード当たり162フィールド,全
233177レコードからなり,ファイルサイズは108.4MB
∗8Macや最近のLinuxであればUTF-8
∗9コマンドラインツールのnkfや文字エンコーディングを変更出来るテキストエディタ(VIM(Linux,Mac,Windows)やNotepad++
(Windows),Coteditor(Mac)など)を使う
RでCSVを読み込むには,標準のread.csv()関数を用いるか,readrパッケージのread csv()関数を用い る.以下に相模原市オープンデータライブラリーにて公開されている,相模原市内の各駅における一日当たりの 平均乗降人員の推移(ファイル名jyoukou 20141111.csv,表–1(p. 8)参照)をread.csv()関数を使って読 み込む例を示す*10.
# データの読み込み
sagamihara <- read.csv(file = "jyoukou_20141111.csv", header = TRUE, fileEncoding = "UTF-8")
# 列名の付け直し
colnames(sagamihara) <- c("路線名", "駅名", "1975年", "1980年", "1985年",
"1989年", "1993年", "1998年", "2003年", "2008年", "2009年", "2010年",
"2011年", "2012年", "2013年")
# 読み込んだデータを表示 sagamihara
$$ 路線名 駅名 1975年 1980年 1985年 1989年 1993年 1998年
$$ 1 横浜線 橋本駅 31954 35144 44758 57466 88988 94680
$$ 2 横浜線 相模原駅 29144 31732 39784 48172 52430 52812
$$ 3 横浜線 矢部駅 6706 9516 11562 16974 20532 20384
$$ 4 横浜線 淵野辺駅 27228 32378 39840 52544 59198 58794
$$ 5 横浜線 古淵駅 NA NA NA 14802 30840 37590
$$ 6 横浜線 相原駅(参考) 6488 7812 11278 16058 20530 22174
$$ 7 横浜線 町田駅(参考) 54506 79366 119620 171478 195652 197638
$$ 8 相模線 南橋本駅 2536 2006 2316 4244 9536 10176
$$ 9 相模線 上溝駅 4526 4562 3292 4210 8686 9910
$$ 10 相模線 番田駅 1218 2334 1928 2766 4558 5490
$$ 11 相模線 原当麻駅 1874 2930 3126 4164 5834 6616
$$ 12 相模線 下溝駅 836 856 1082 1184 1572 1652
$$ 13 相模線 相武台下駅 700 794 808 1114 1532 1798
$$ 14 中央本線 相模湖駅 NA NA NA NA NA NA
$$ 15 中央本線 藤野駅 NA NA NA NA NA NA
$$ 16 中央本線 高尾駅(参考) NA NA NA NA NA NA
$$ 17 中央本線 八王子駅(参考) NA NA NA NA NA NA
$$ 18 小田急線 相模大野駅 83267 84879 87864 95594 106006 109717
$$ 19 小田急線 小田急相模原駅 48952 50881 54001 61564 63542 57429
$$ 20 小田急線 東林間駅 19818 20921 22554 25316 27219 24346
$$ 21 小田急線 町田駅(参考) 154831 197393 236259 281813 297703 279498
$$ 22 小田急線 相武台前駅(参考) 32405 36235 39880 44960 47728 44228
$$ 23 小田急線 唐木田(参考) NA NA NA 2944 9190 12845
$$ 24 京王線 橋本駅(京王) NA NA NA 33755 55492 67917
$$ 25 京王線 多摩境駅(参考) NA NA NA NA 2947 4464
$$ 2003年 2008年 2009年 2010年 2011年 2012年 2013年
$$ 1 104522 118162 118098 120244 120482 122254 125510
$$ 2 53448 56370 55774 56158 55716 56566 57552
$$ 3 21220 22648 22348 22356 22646 22960 23594
$$ 4 72368 77154 78518 79600 78700 80870 74276
∗10この資料は以下の著作物を改変して利用しています. 相模原市駅別乗降人員の推移,相模原市,クリエイティブ・コモンズ・ライセンス 表示4.0
$$ 5 39480 42410 42404 42796 42626 43370 44614
$$ 6 21334 20330 20194 20422 20198 20392 20842
$$ 7 211864 216428 215598 218154 218084 221086 221880
$$ 8 9836 10886 10622 10622 10378 10426 10820
$$ 9 9798 11456 11206 11060 10702 11204 11600
$$ 10 5484 5980 6076 6388 6384 6630 7076
$$ 11 6890 8282 8266 8328 8266 8834 9030
$$ 12 1694 2002 1994 1968 2016 2128 2252
$$ 13 1856 2510 2404 2184 2070 2282 2406
$$ 14 6744 6914 6904 6746 6586 5118 5144
$$ 15 5898 5892 5742 5550 5382 5310 5352
$$ 16 65108 63334 61724 61034 59936 59766 60568
$$ 17 162546 164788 160546 160438 162948 165042 170382
$$ 18 108602 121338 119240 119166 120113 122453 128006
$$ 19 55944 55754 55392 55034 54366 55530 56767
$$ 20 22883 22176 21796 21422 21152 21420 21584
$$ 21 282772 291952 289622 290621 288884 291678 292779
$$ 22 41987 39977 39301 39160 37931 38110 38869
$$ 23 16037 19994 20539 21228 21096 21330 21719
$$ 24 78072 88320 88427 88065 87242 88377 91060
$$ 25 10727 16526 16678 17183 17184 17582 18471
以下,この操作によって読み込んだデータをsagamiharaデータと記す.sagamiharaデータはRの内部でデー タフレームと呼ばれる形式で保持されている.データフレームとはRにおける基本的なデータ形式であり,行列 形式のデータに行名と列名がつけられており,数値・因子・文字列など異なる型のデータが混在したまま扱える という特徴がある.データフレームの基本的な操作方法に関しては,V 10.(p. 61)を参照のこと.
表–1(次ページ)と読み込んだsagamiharaデータの出力を見比べると,1975年から1985年の古淵駅*11など,
表示されている値のいくつかにNAがあることが分かる.これは元のデータに値がない,すなわち欠損値である ことを表す.欠損値をどう取り扱うかについては5.(p. 16)を参照のこと.
∗111988年開業
表–1:sagamiharaデータ 路線名駅名1975年1980年1985年1989年1993年1998年2003年2008年2009年2010年2011年2012年2013年 1横浜線橋本駅319543514444758574668898894680104522118162118098120244120482122254125510 2横浜線相模原駅29144317323978448172524305281253448563705577456158557165656657552 3横浜線矢部駅670695161156216974205322038421220226482234822356226462296023594 4横浜線淵野辺駅27228323783984052544591985879472368771547851879600787008087074276 5横浜線古淵駅14802308403759039480424104240442796426264337044614 6横浜線相原駅(参考)648878121127816058205302217421334203302019420422201982039220842 7横浜線町田駅(参考)5450679366119620171478195652197638211864216428215598218154218084221086221880 8相模線南橋本駅25362006231642449536101769836108861062210622103781042610820 9相模線上溝駅4526456232924210868699109798114561120611060107021120411600 10相模線番田駅1218233419282766455854905484598060766388638466307076 11相模線原当麻駅1874293031264164583466166890828282668328826688349030 12相模線下溝駅83685610821184157216521694200219941968201621282252 13相模線相武台下駅7007948081114153217981856251024042184207022822406 14中央本線相模湖駅6744691469046746658651185144 15中央本線藤野駅5898589257425550538253105352 16中央本線高尾駅(参考)65108633346172461034599365976660568 17中央本線八王子駅(参考)162546164788160546160438162948165042170382 18小田急線相模大野駅83267848798786495594106006109717108602121338119240119166120113122453128006 19小田急線小田急相模原駅48952508815400161564635425742955944557545539255034543665553056767 20小田急線東林間駅19818209212255425316272192434622883221762179621422211522142021584 21小田急線町田駅(参考)154831197393236259281813297703279498282772291952289622290621288884291678292779 22小田急線相武台前駅(参考)32405362353988044960477284422841987399773930139160379313811038869 23小田急線唐木田(参考)294491901284516037199942053921228210962133021719 24京王線橋本駅(京王)33755554926791778072883208842788065872428837791060 25京王線多摩境駅(参考)2947446410727165261667817183171841758218471
4. Excelファイルの読み込み
Excel(エクセル)ファイルをRで読み込む方法としては,xlsxパッケージのread.xlsx()関数やXLConnect パッケージのreadWorksheetFromFile()関数を用いる方法がある.本節では,後者の方法について概略を紹介 する.読み込むデータは平成22年度全国道路・街路交通情勢調査(道路交通センサス)の調査結果のうち,秋田 県の時間帯別交通量表(ファイル名zkntrf05.xls)である.
元のエクセルファイルの一部を抜粋したものを表– 2(次ページ)に示す.
表–2:平成22年度道路交通センサス一般交通量調査時間帯別交通量表(秋田県の一部を抜粋)
以下にreadWorksheetFromFile()関数を用いて読み込む例を示す.
# パッケージの読み込み
#install.packages("XLConnect") # パッケージがインストールされていない場合 library(XLConnect)
# データの読み込み
AkitaPT <- readWorksheetFromFile(file="zkntrf05.xls", # 読み込むファイルを指定 sheet = 1, # 読み込むシート番号を指定
header = TRUE, # 最初の行を列名として読み込むか否か startCol = 1, # シートの何列目から読み込むか指定 startRow = 7, # シートの何行目から読み込むか指定 endCol = 33 # シートの何列目まで読み込むか指定 )
# 列名を表示 colnames(AkitaPT)
$$ [1] "Col1" "Col2" "Col3" "Col4" "Col5" "Col6" "Col7"
$$ [8] "Col8" "Col9" "Col10" "Col11" "Col12" "Col13" "Col14"
$$ [15] "Col15" "Col16" "Col17" "Col18" "Col19" "Col20" "Col21"
$$ [22] "Col22" "Col23" "Col24" "Col25" "Col26" "Col27" "Col28"
$$ [29] "Col29" "Col30" "Col31" "X.台." "X.台..1"
列名が自動的に付けられているが,ほとんどが連番で付いているだけなので,元のエクセルデータと同じにな るよう列名を付け直す.
# 列名を付け直す
colnames(AkitaPT) <- c("交通量調査単位区間番号", "道路種別",
"路線番号", "12・24時間観測の別", "天候", "上り・下りの別",
"車種区分", "7時台", "8時台", "9時台", "10時台", "11時台",
"12時台", "13時台", "14時台", "15時台", "16時台", "17時台",
"18時台", "19時台", "20時台", "21時台", "22時台", "23時台",
"0時台", "1時台", "2時台", "3時台", "4時台", "5時台", "6時台",
"昼間12時間自動車類交通量", "24時間自動車類交通量")
読み込んだデータがどのような構造になっているかをstr()関数を使って確認する.
# データ構造を表示 str(AkitaPT)
$$ 'data.frame': 2272 obs. of 33 variables:
$$ $ 交通量調査単位区間番号 : num 10 10 10 10 20 20 20 20 30 30 ...
$$ $ 道路種別 : num 1 1 1 1 1 1 1 1 1 1 ...
$$ $ 路線番号 : num 1040 1040 1040 1040 1040 1040 1040 1040 1040 1040 ...
$$ $ 12・24時間観測の別 : num 2 2 2 2 2 2 2 2 2 2 ...
$$ $ 天候 : num 1 1 1 1 2 2 2 2 2 2 ...
$$ $ 上り・下りの別 : num 1 1 2 2 1 1 2 2 1 1 ...
$$ $ 車種区分 : num 1 2 1 2 1 2 1 2 1 2 ...
$$ $ 7時台 : num 89 43 102 118 88 49 79 112 73 39 ...
$$ $ 8時台 : num 135 60 160 99 119 57 132 106 96 39 ...
$$ $ 9時台 : num 136 63 155 75 134 61 154 79 111 52 ...
$$ $ 10時台 : num 138 70 200 56 121 64 172 50 110 61 ...
$$ $ 11時台 : num 135 76 185 76 138 81 157 59 114 66 ...
$$ $ 12時台 : num 147 83 133 72 108 78 137 59 93 68 ...
$$ $ 13時台 : num 130 81 139 60 125 69 123 70 119 58 ...
$$ $ 14時台 : num 165 68 148 45 162 75 127 43 142 59 ...
$$ $ 15時台 : num 198 67 142 38 167 68 147 40 151 57 ...
$$ $ 16時台 : num 206 75 150 50 208 65 132 40 183 40 ...
$$ $ 17時台 : num 196 55 162 47 168 50 136 45 135 43 ...
$$ $ 18時台 : num 146 54 128 49 134 48 135 41 130 39 ...
$$ $ 19時台 : num 111 64 104 53 94 66 95 38 78 51 ...
$$ $ 20時台 : num 47 81 70 50 41 79 73 50 42 68 ...
$$ $ 21時台 : num 25 52 40 28 29 36 35 30 32 26 ...
$$ $ 22時台 : num 31 56 45 70 30 68 37 54 27 71 ...
$$ $ 23時台 : num 22 71 22 74 14 57 24 81 15 52 ...
$$ $ 0時台 : num 12 35 15 82 12 29 18 73 13 25 ...
$$ $ 1時台 : num 9 34 5 86 7 46 9 79 6 39 ...
$$ $ 2時台 : num 5 32 8 76 8 21 8 74 7 20 ...
$$ $ 3時台 : num 6 28 7 82 5 29 7 85 5 26 ...
$$ $ 4時台 : num 13 22 17 106 8 25 13 88 6 21 ...
$$ $ 5時台 : num 22 36 22 137 22 36 19 134 24 33 ...
$$ $ 6時台 : num 65 45 56 114 57 35 51 120 51 28 ...
$$ $ 昼間12時間自動車類交通量: num 1821 795 1804 785 1672 ...
$$ $ 24時間自動車類交通量 : num 2189 1351 2215 1743 1999 ...
全ての列がnum,すなわち実数(numeric)であることが分かる.しかし,7時台–24時間自動車類交通量ま での列は実数で良いが,交通量調査単位区間番号–車種区分までの列は順序無し因子とすることが適切である.
順序無し因子への変換にはas.factor()関数を,順序あり因子への変換にはas.ordered()関数を用いる.
# 順序無し因子に変換
# 1列目の交通量調査単位区間番号から7列目の車種区分までの7列 for (i in 1:7) {
AkitaPT[, i] <- as.factor(AkitaPT[, i]) # 順序無し因子で置き換え }
# データ構造を表示 str(AkitaPT)
$$ 'data.frame': 2272 obs. of 33 variables:
$$ $ 交通量調査単位区間番号 : Factor w/ 568 levels "10","20","30",..: 1 1 1 1 2 2 2 2 3 3 ...
$$ $ 道路種別 : Factor w/ 4 levels "1","3","4","6": 1 1 1 1 1 1 1 1 1 1 ...
$$ $ 路線番号 : Factor w/ 200 levels "2","3","4","7",..: 197 197 197 197 197 197 197 197 197 197 ...
$$ $ 12・24時間観測の別 : Factor w/ 2 levels "1","2": 2 2 2 2 2 2 2 2 2 2 ...
$$ $ 天候 : Factor w/ 4 levels "1","2","3","6": 1 1 1 1 2 2 2 2 2 2 ...
$$ $ 上り・下りの別 : Factor w/ 2 levels "1","2": 1 1 2 2 1 1 2 2 1 1 ...
$$ $ 車種区分 : Factor w/ 2 levels "1","2": 1 2 1 2 1 2 1 2 1 2 ...
$$ $ 7時台 : num 89 43 102 118 88 49 79 112 73 39 ...
$$ $ 8時台 : num 135 60 160 99 119 57 132 106 96 39 ...
$$ $ 9時台 : num 136 63 155 75 134 61 154 79 111 52 ...
$$ $ 10時台 : num 138 70 200 56 121 64 172 50 110 61 ...
$$ $ 11時台 : num 135 76 185 76 138 81 157 59 114 66 ...
$$ $ 12時台 : num 147 83 133 72 108 78 137 59 93 68 ...
$$ $ 13時台 : num 130 81 139 60 125 69 123 70 119 58 ...
$$ $ 14時台 : num 165 68 148 45 162 75 127 43 142 59 ...
$$ $ 15時台 : num 198 67 142 38 167 68 147 40 151 57 ...
$$ $ 16時台 : num 206 75 150 50 208 65 132 40 183 40 ...
$$ $ 17時台 : num 196 55 162 47 168 50 136 45 135 43 ...
$$ $ 18時台 : num 146 54 128 49 134 48 135 41 130 39 ...
$$ $ 19時台 : num 111 64 104 53 94 66 95 38 78 51 ...
$$ $ 20時台 : num 47 81 70 50 41 79 73 50 42 68 ...
$$ $ 21時台 : num 25 52 40 28 29 36 35 30 32 26 ...
$$ $ 22時台 : num 31 56 45 70 30 68 37 54 27 71 ...
$$ $ 23時台 : num 22 71 22 74 14 57 24 81 15 52 ...
$$ $ 0時台 : num 12 35 15 82 12 29 18 73 13 25 ...
$$ $ 1時台 : num 9 34 5 86 7 46 9 79 6 39 ...
$$ $ 2時台 : num 5 32 8 76 8 21 8 74 7 20 ...
$$ $ 3時台 : num 6 28 7 82 5 29 7 85 5 26 ...
$$ $ 4時台 : num 13 22 17 106 8 25 13 88 6 21 ...
$$ $ 5時台 : num 22 36 22 137 22 36 19 134 24 33 ...
$$ $ 6時台 : num 65 45 56 114 57 35 51 120 51 28 ...
$$ $ 昼間12時間自動車類交通量: num 1821 795 1804 785 1672 ...
$$ $ 24時間自動車類交通量 : num 2189 1351 2215 1743 1999 ...
以後,このデータをAkitaPTデータと記す.AkitaPTデータもsagamiharaデータと同様にデータフレーム形 式である.AkitaPTデータは2000行以上あるので,上から10行目までを抜粋して表示する.
# AkitaPTデータの行数を表示 nrow(AkitaPT)
$$ [1] 2272
# 読み込んだデータを上から10行表示 head(AkitaPT, 10)
$$ 交通量調査単位区間番号 道路種別 路線番号 12・24時間観測の別 天候
$$ 1 10 1 1040 2 1
$$ 2 10 1 1040 2 1
$$ 3 10 1 1040 2 1
$$ 4 10 1 1040 2 1
$$ 5 20 1 1040 2 2
$$ 6 20 1 1040 2 2
$$ 7 20 1 1040 2 2
$$ 8 20 1 1040 2 2
$$ 9 30 1 1040 2 2
$$ 10 30 1 1040 2 2
$$ 上り・下りの別 車種区分 7時台 8時台 9時台 10時台 11時台 12時台 13時台
$$ 1 1 1 89 135 136 138 135 147 130