データベースのお話
 2012.07.07 Tokyo.R #24
   by @holidayworking
自己紹介

• Hidekazu Tanaka
• システムエンジニア
• 好きなもの
 • T-SQUARE
 • F1
Rを使っていると
こんな経験がありますよね?
ファイルがたくさん
どのファイルにデータが
 あるのか分からない
そんな人に今回紹介するのは
データベース
データベースとは?

• 大量のデータを一定の規則に従って蓄積し、一元
 的に管理できるようにしたもの

• データベースを構築することによって、データの
 重複や散逸を防ぎ、ある項目に着目して特定の
 データを抽出するといった、効率的なデータ利用
 が可能になる
データモデル
• データベースに格納するデータをどのように配置
 するか理論的・物理的な側面から規定するもの

• 代表的なデータモデル
 • 階層型データモデル
 • ネットワーク型データモデル
 • 関係モデル
 • オブジェクトデータモデル
データモデル
• データベースに格納するデータをどのように配置
 するか理論的・物理的な側面から規定するもの

• 代表的なデータモデル
 • 階層型データモデル
 • ネットワーク型データモデル
 • 関係モデル
 • オブジェクトデータモデル
関係モデル

• E.F.Codd が集合論と述語理論に基づいて考案し
 たモデル

• 基本的な前提は、あらゆるデータは n 項の関係で
 表現されるということ

• 詳細は Wikipedia で!!
RDBMS

• 関係モデルに基づいて設計されたデータが格納さ
 れ、管理されるシステムのこと

• データは2次元の表として格納し、データ間の関連
 をデータを使って表現される

• データの操作や定義を行うためには SQL と呼ば
 れる言語を使うのが一般的
RDBMS
• 商用、オープンソースを含め様々な実装が存在
 • Oracle Database
 • Microsoft SQL Server
 • MySQL
 • PostgreSQL
 • SQLite
SQL
• RDBMS において、データの操作や定義を行うた
 めの問い合わせ言語

• ISO で言語仕様の標準化が行われているため、異
 なる RDBMS でも同じように使うことができる

• 標準規格の対応の程度は RDBMS によって異な
 ることがあるため、特定の RDBMS では使えな
 い構文もあることもある
SQL

• DDL : Data Definition Language
 • CREATE
 • DROP
 • ALTER
 • TRUNCATE
SQL

• DML : Data Manipulation Language
 • SELECT
 • INSERT
 • UPDATE
 • DELETE
Rから操作する方法


• R から RDBMS を操作する方法は2種類存在
 • RODBC パッケージ
 • DBI パッケージ
RODBC パッケージ
• ODBC で RDBMS を操作するパッケージ
 • ODBC : Open Database Connectivity
 • Microsoft が提案した RDBMS にアクセス
   するための共通インターフェイス

 • Windows 環境で利用されることが多い
• Windows で R を使っている場合は、このパッ
 ケージを使ったほうが良い
DBI パッケージ

• R から RDBMS を操作するためのインターフェ
 イスを定義したパッケージ

• RDBMS に対応したパッケージのインストールが
 必要

• Mac OS X や Linux を使っている場合は、この
 パッケージを使ったほうが良い
ドライバパッケージ

• RMySQL
• RPostgreSQL
• RSQLite
• ROracle
• RJDBC
RDBMS への接続方法
# 接続
> conn <- dbConnect(MySQL(), host = "localhost",
            user = "scott", password = "tiger",
                       dbname = "ellison")

# 接続情報の確認
> summary(conn)
<MySQLConnection:(49423,0)>
  User: scott
  Host: localhost
  Dbname: ellison
  Connection type: localhost via TCP/IP
  No resultSet available

# 切断
> dbDisconnect(conn)
簡単な使用方法
# データフレームをテーブルに保存
> dbWriteTable(conn, name="iris", value=iris)
[1] TRUE

# テーブルからデータフレームを作成
> data <- dbReadTable(conn, name="iris")
> head(data)
  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
4          4.6         3.1          1.5         0.2 setosa
5          5.0         3.6          1.4         0.2 setosa
6          5.4         3.9          1.7         0.4 setosa

# テーブルの削除
> dbRemoveTable(conn, name="iris")
[1] TRUE
SQLの使用方法
# dbGetQuery 関数を使う方法
> data <- dbGetQuery(conn, "select * from quakes")
> dim(data)
[1] 1000    6



# 大規模なデータを扱う場合は、クエリを分割して取得する dbSendQuery を使うのが安全
> rs <- dbSendQuery(conn, "select * from quakes")
> data <- fetch(rs)
> dim(data)
[1] 500   6
# 残りの結果を全て取得
> data <- fetch(rs, n=-1)
> dim(data)
[1] 500   6
# 全て取得されているか
> dbHasCompleted(rs)
[1] TRUE
実践編

• R と RDBMS を組み合わせの例としてテキスト
 マイニングをやってみます

• 「Rによるテキストマイニング入門」の第9章のテ
 キスト分類

• 上記の本では新聞記事をファイルに保存し解析し
 ているが、今回は RDBMS に保存し解析をする
新聞記事収集スクリプト

• 某新聞の RSS から記事を取得、RDBMS に保存
• 収集スクリプトは Ruby で実装
• スクリプトは GitHub で公開
 • http://github.com/holidayworking/
   sankei
テーブル構成
テキスト分類
# 記事の取得
> news <- dbGetQuery(conn, "select news.id, news.title, news.content,
categories.name as category from news inner join categories on
news.category_id = categories.id order by news.id")

# ターム・文書行列の作成
> library(RMeCab)
> res <- docMatrixDF(news[,"content"], pos=c("名詞","動詞","形容詞"))


# クラスター分析
> hc <- hclust(dist(t(res)))
> library(ggdendro)

# デンドログラムの作成
> hcdata <- dendro_data(hc)
> ggplot() + geom_segment(data=segment(hcdata), aes(x, y, xend=xend,
yend=yend)) + geom_text(data=label(hcdata), aes(x, y, label=label,
hjust=0), size=3) +coord_flip() + scale_y_reverse(expand=c(0.2, 0))
データベースのお話
データベースのお話

データベースのお話