ヘッダーをスキップ
Oracle® R Enterpriseユーザーズ・ガイド
リリース1.3 for Windows, Linux, Solaris, and AIX
E48232-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

3 Oracle R Enterpriseの使用方法

この章では、Oracle R Enterpriseを使用して、Oracle Databaseの表またはビューに格納されたデータを分析する方法を説明します。

この章の内容は次のとおりです。

この項の残りの部分では、Rに熟知していることを前提にします。

Oracle R Enterpriseの機能を使用する他の例については、「Oracle R Enterpriseの統計関数」を参照してください。Oracle Data Miningアルゴリズムを使用して作成したモデルを含む、統計モデルを構築する例については、「Oracle R Enterpriseでのデータベース内予測モデル」を参照してください。

Oracle Databaseの表

Oracle R Enterpriseを使用してデータベース表に格納されているデータを分析する前に、『Oracle R Enterpriseインストレーションおよび管理ガイド』で説明しているように、Oracle R Enterpriseをインストールし、クライアントを起動し、データベースに接続する必要があります。

ネーミング規則により、Oracle R Enterpriseで定義されたほとんどの関数およびメソッドは接頭辞oreで始まります。これは、他のRソフトウェアと名前が衝突することを避けるためです。ただし、これらの関数およびメソッドによって作成したオブジェクトには、ユーザーが任意の名前を付けることができます。エンド・ユーザーがオブジェクトの命名を全面的に制御します。

ore.ls()から返された任意のオブジェクトを選択し、class(OBJECTNAME)またはclass(OBJECTNAME$COLUMN_NAME)と入力します。たとえば、次のコードは、DF_TABLEのクラスがore.frameであることを示しています。DF_TABLEオブジェクトは、「例: データのロード」で作成します。

R> class(DF_TABLE)
[1] "ore.frame"

接頭辞oreは、そのオブジェクトが、Oracle Database内の対応するオブジェクトのメタデータを保持するOracle R Enterpriseによって作成されたオブジェクトであることを示しています。

ore.frameは、データベース表にマップするOracle R Enterpriseメタデータ・オブジェクトです。ore.frameオブジェクトは、Rのdata.frameに対応するものです。

ore.frameは、class()関数によって返すことができます。ore.frameデータの作成の例は、「データベースへのRデータ・フレームのロード」を参照してください。

Oracle R Enterpriseドキュメントの表示

Oracle R Enterpriseドキュメント・ライブラリを表示するには次のコマンドを使用してください。

R> OREShowDoc()

Oracle R Enterpriseのデータ

Oracle R Enterpriseは、この機能をサポートします。

詳細名

Oracle R Enterpriseは、ore.frame列を、より制限の厳しいデータベース名ではなく、Rネーミング規則で処理します。ore.frame列には、30バイトを超える、二重引用符を含む名前を指定することができ、重複が許可されます。

Rデータ・フレームのデータベースへのロード

システム上のRデータ・フレームからOracleデータベースにデータをロードするには、次の手順に従います。

  1. Rのオンライン・ヘルプに記載されているread.table()またはread.csv()関数を使用して、ファイルの内容をRデータ・フレームにロードします。

  2. 次に、ore.create()を使用して、データ・フレームを表にロードします。

    ore.create(data_frame, table="TABLE_NAME")
    

手順2によって、data_frameがデータベース表TABLE_NAMEにロードされます。

例は、「例: データのロード」を参照してください。

例: データのロード

この例では、数字と文字のペアで構成されるRデータ・フレームdfを作成し、そのデータ・フレームを表DF_TABLEにロードします。この例は、データ・フレームと表では、ディメンションおよび最初の数個の要素は同じであるが、クラスの値は異なることを示しています。DF_TABLEのクラスはore.frameです。この例の最後では、現行のスキーマにDF_TABLEが存在することを確認します。

R> df <- data.frame(A=1:26, B=letters[1:26])
R> dim(df)
[1] 26  2
R> class(df)
[1] "data.frame"
R> head(df)
  A B
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e
6 6 f
R> ore.create(df, table="DF_TABLE")
R> ore.ls()
[1] "DF_TABLE" 
R> class(DF_TABLE)
[1] "ore.frame"
attr(,"package")
[1] "OREbase"
R> dim(DF_TABLE)
[1] 26  2
R> head(DF_TABLE)
  A B
0 1 a
1 2 b
2 3 c
3 4 d
4 5 e
5 6 f
R> exists("DF_TABLE")[1] TRUE

SQL Developerなどのツールを使用してデータベースに接続する場合は、データベースでDF_TABLEを直接参照します。

Rデータの実体化

ore.push(data.frame)関数は、データベースに一時オブジェクトとしてRオブジェクトを格納し、そのオブジェクトのハンドルを返します。データ・フレーム、マトリクスおよびベクターのオブジェクトを表に変換し、リスト、モデルおよびその他のオブジェクトをシリアライズ・オブジェクトに変換します。

作成したオブジェクトはRセッション中は存在します。このデータを永続的に保存する方法については、「データベース内でのRオブジェクトの保持および管理」を参照してください。

この例では、Rコマンドc(1,2,3,4,5)によって作成された数値ベクトルをOracle R Enterpriseオブジェクトであるvにプッシュします。

R> v <- ore.push(c(1,2,3,4,5))
R> class(v)
[1] "ore.numeric"
attr(,"package")
[1] "OREbase"
R> head(v)
[1] 1 2 3 4 5

ore.frameの存在の確認

ore.exists()は、ore.frameオブジェクトがOREスキーマ環境内に存在するかどうかをチェックします。ore.exists()ore.frameオブジェクトを検出するには、最初にore.sync()を使用して、そのオブジェクトを同期化しておく必要があります。

ORE環境で使用できるオブジェクトが、データベース・オブジェクトと同一であるとはかぎりません。ore.exists()を使用して表の存在をチェックしないでください。

例は、「例: データのロード」を参照してください。

ore.exists(name, schema)には次の引数があります。

  • name: ore.frameオブジェクトの名前を指定した文字列

  • schema: チェックするデータベース・スキーマの名前を指定した文字列

ore.exists()は、オブジェクトがOREスキーマに存在する場合はTRUEを返し、存在しない場合はFALSEを返します。

データベース表の削除

データベースの表を削除するには、次のものを使用します。

ore.drop(table="NAMEOFTABLE")

たとえば、次のコマンドでは表vを削除して、存在しなくなったことを確認します。

R> ore.drop(table="v")
R> ore.exists("v")
[1] FALSE

存在しない表を削除した場合、エラー・メッセージは表示されません。

Rフレームへのデータベース表のプル

Oracle Databaseの表またはビューの内容を、メモリー内のRデータ・フレームにプルするには、ore.ls()によって返されるオブジェクトの名前のore.pull(OBJECT_NAME)を使用します。


注意:

表またはビューをRフレームにプルできるのは、データがRのメモリーに収まる場合のみです。

使用しているOracle Databaseに表NARROWがあるとします。ore.pull()で、表NARROWからデータ・フレームdf_narrowを作成します。df_narrowがデータ・フレームであることを確認します。表NARROWは索引付けされていないため、次の警告メッセージが表示されます。

R> df_narrow <- ore.pull(NARROW)
Warning message:
ORE object has no unique key - using random order 
R> class(df_narrow)
[1] "data.frame"

表の順序

Rのほとんどすべてのデータは、ベクターか、ベクターに基づいています(ベクター自体、リスト、マトリクス、データ・フレームなど)。ベクターの要素には明示的な順序があります。各要素には索引があります。Rコードは、この要素の順序をアクティブに使用します。

ただし、データベースでバックアップされたリレーショナル・データ(表およびビュー)は行の順序を定義せず、そのためRデータ構造に直接マップすることはできません。ORDER BY句を使用するとデータベースの表およびビューの順序を明示的に定義できます。この順序は、通常、一意の識別子(単一または複数列のキー)を持つことで実現されます。この方法による順序付けは不十分で、一部の操作の速度を低下させて不要なソートを発生させる可能性があります。

row.names<-は順序を定義しますが、実際に表に索引付けをすることはありません。この割当てオプションは、一意の列を指定する方法を提供します。最初は少なくとも1つの列をサポートしますが、複数列の指定もサポートできます。row.names<-を順序付けされていないフレームに適用すると、エラーが返されます。

「サンプリングとパーティショニング」で説明するように、順序付けのインフラストラクチャで作成した整数による索引付けを使用して、サンプリングとパーティショニングを実行できます。

表NARROWは索引付けされていないとします。次に、row.namesを使用して索引付きの表を作成する例を示します。

R> row.names(head(NARROW))
Error: ORE object has no unique key
In addition: Warning message:
ORE object has no unique key - using random order 
R> 
R> row.names(NARROW) <- NARROW$ID
R> 
R> row.names(head(NARROW[,1:3]))
[1] "101501" "101502" "101503" "101504" "101505" "101506"
R> 
R> head(NARROW[,1:3])
           ID GENDER AGE
101501 101501   <NA>  41
101502 101502   <NA>  27
101503 101503   <NA>  20
101504 101504   <NA>  45
101505 101505   <NA>  34
101506 101506   <NA>  38

サンプリングとパーティショニング

「表の順序」で説明した表の順序付け(索引の作成)は、サンプリングとパーティショニングを実行するために使用できます。

この項では、次の操作の例を示します。

索引の作成

Rは、ベクターを索引として使用した強力な構造をサポートします。Oracle R Enterpriseは類似した機能をサポートしますが、次の違いがあります。

  • ore.vectorオブジェクトでは整数索引の作成はサポートされません。

  • 負の整数の索引はサポートされません。

  • 行の順序は保持されません。

この例では、索引の作成方法を示します。

R> tmp <- ASTHMA
R> tmp[c(1L, 2L, 1L),]
Error: ORE object has no unique key
R> rownames(tmp) <- tmp
R> tmp[c(1L, 2L, 1L),]
         CITY ASTHMA COUNT
1|0|65      1      0    65
1|0|65.1    1      0    65
1|1|35      1      1    35
R> tmp[c(1L, 2L, 1L),]@dataQry

サンプリング

このコードでは、いくつかのサンプリング手法を示します。

# Generate random data
set.seed(123)
N <- 1000000
mydata <- data.frame(x = rnorm(N, mean = 20, sd = 2),
                     group =
                     sample(letters, N, replace = TRUE,
                            prob = (26:1)/sum(26:1)))
mydata$y <-
    rbinom(N, 1,
           1/(1+exp(-(.5 - 0.25 * mydata$x + .1 * as.integer(mydata$group)))))
MYDATA <- ore.push(mydata)
rm(mydata)
 
# Create a function that creates random row indices from large tables
mysampler <- function(n, size, replace = FALSE)
{
    #' Random Whole Number Sampler
    #' @param n       number of observations in sample
    #' @param size    total number of observations
    #' @param replace indicator for sampling with replacement
    #' @return numeric vector containing the sample indices
    n    <- round(n)
    size <- round(size)
    if    (n < 0) stop("'n' must be a non-negative number")
    if (size < 1) stop("'size' must be a positive number")
    if (!replace && (n > size))
        stop("'n' cannot exceed 'size' when 'replace = FALSE'")
    if (n == 0)
        numeric()
    else if (replace)
        round(runif(n, min = 0.5, max = size + 0.5))
    else
    {
        maxsamp <- seq(size + 0.5, by = -1, length.out = n)
        samp <- round(runif(n, min = 0.5, max = maxsamp))
        while(length(bump1 <- which(duplicated(samp))))
            samp[bump1] <- samp[bump1] + 1
        samp
    }
}
 
# Data set and sample size
N <- nrow(MYDATA)
sampleSize <- 500
 
# 1. Simple random sampling
srs <- mysampler(sampleSize, N)
simpleRandomSample <- ore.pull(MYDATA[srs, , drop = FALSE])
 
# 2. Systematic sampling
systematic <- round(seq(1, N, length.out = sampleSize))
systematicSample <- ore.pull(MYDATA[systematic, , drop = FALSE])
 
# 3. Stratified sampling
stratifiedSample <-
    do.call(rbind,
            lapply(split(MYDATA, MYDATA$group),
                   function(y)
                   {
                       ny <- nrow(y)
                       y[mysampler(sampleSize * ny/N, ny), , drop = FALSE]
                   }))
 
# 4. Cluster sampling
clusterSample <- do.call(rbind, sample(split(MYDATA, MYDATA$group), 2))
 
# 5a. Accidental/Convenience sampling (via row order access)
convenientSample1 <- head(MYDATA, sampleSize)
 
# 5b. Accidental/Convenience sampling (via hashing)
maxHash <- 2^32 # maximum allowed in ore.hash
convenient2 <- (ore.hash(rownames(MYDATA), maxHash)/maxHash) <= (sampleSize/N)
convenientSample2 <- ore.pull(MYDATA[convenient2, , drop = FALSE])
Random

ランダム・パーティショニング

Oracle R Enterpriseのランダム・パーティショニングは、次に示す方法でore.frameオブジェクトにパーティション列またはグループ列を追加することによって、透過層内で生成できます。

nrowX <- nrow(x)
x$partition <- sample(rep(1:k, each = nrowX/k, length.out = nrowX), replace = TRUE)

これらのパーティションが元のデータ・セットに結合されたら、ore.groupApply関数を使用して小規模なブートストラップを実行します。

results <- ore.groupApply(x, x$partition, function(y) {...}, parallel = TRUE)

データベース内でのRオブジェクトの保持および管理

Rオブジェクトは、明示的に保存されないかぎり、現行のセッション中のみ保持されます。たとえば、特定のRセッションでモデルを構築した場合、明示的に保存していないかぎり、セッションをクローズするとそのモデルは使用できなくなります。

Oracle R Enterpriseは、データベース上でRオブジェクトの永続性をサポートします。

永続性には次のメリットがあります。

  • 異なるRセッション間で、同じRオブジェクトおよびOracle R Enterpriseオブジェクト(モデルなど)にアクセスできます。

  • Rでモデルを構築して、埋込みOracle R Enterpriseでの予測とスコアリングに使用できます。

Oracle R Enterpriseはデータストアを作成して、そこに保持オブジェクトを格納します。

保持オブジェクトはデータストア内にあります。Oracle R Enterpriseの次の機能によって永続性を管理できます。

ore.save()

ore.save()は、RオブジェクトまたはRオブジェクトのリストを、現行のユーザーのスキーマにある接続データベースの指定されたデータストアに保存します。

ore.save({...}, list = character(0), name, envir = parent.frame(), overwrite = FALSE, append = FALSE, description = character(0)))

ore.save()のパラメータは、次のとおりです。

  • {...}は、保存するRオブジェクトのリストです。保存するオブジェクトの名前を(記号または文字列で)指定します。

  • listは、保存するオブジェクトの名前を含む文字ベクターです。

  • envirは、保存するオブジェクトを検索する環境です。

  • overwriteは、すでに存在する場合にデータストアを上書きするかどうかを指定する論理値で、デフォルトはFALSE(上書きしない)です。

  • nameはデータストアの名前です。nameの指定は必須です。

  • descriptionはデータストアについて説明するコメントです。

  • appendは、すでに存在する場合にデータストアにオブジェクトを追加するかどうかを指定する論理値で、デフォルトはFALSE(追加しない)です。

ore.save()の例

現行の作業領域環境にあるすべてのオブジェクトを、ユーザーの現行のスキーマにあるデータストアds_1に保存します。

ore.save(list=ls(), name="ds_1", description = "example datastore")

既存のデータストアds_2を、現行の作業領域環境にあるオブジェクトxyおよびzで上書きします。

ore.save(x, y, z, name="ds_2", overwrite=TRUE)

現行の作業領域環境にあるオブジェクトxyおよびzを、既存のデータストアds_3に追加します(データストアへのオブジェクトの追加)。

ore.save(x, y, z, name="ds_3", append=TRUE)

ore.load()

ore.load()は、接続データベースで現行のユーザーのスキーマにある、指定されたデータストアに保存されたすべてのRオブジェクトをRにロードします。

ore.load(name, list = character(0), envir = parent.frame())

ore.load()のパラメータは次のとおりです。

  • nameは、オブジェクトのロード元になるデータストアの名前を指定する文字列です。nameの指定は必須です。

  • listは、ロードするオブジェクトの名前を含む文字ベクターです。

  • envirは、オブジェクトのロード先になるR環境です。

ore.load()は、データストアからロードしたオブジェクトの名前を含む文字ベクターを返します。

ore.load()の例

データストアds_1にあるすべてのオブジェクトをロードします。

ore.load("ds_1")

データストアds_1からオブジェクトxyおよびzのみをロードします。

ore.load("ds_1", list=c("x", "Y", "z"))

ore.delete()

ore.delete()は、接続データベースで現行のユーザーのスキーマにある、指定されたデータストア(およびそこにあるすべてのRオブジェクト)を削除します。

ore.delete(name)

ore.delete()のパラメータは次のとおりです。

  • nameは、削除するデータストアの名前を指定する文字列です。nameの指定は必須です。

ユーザーのOracle Databaseスキーマにあるデータストアのリストを表示するには、ore.datastore()を使用します。

ore.delete()の例

ユーザーの現行のスキーマからデータストアds_1を削除します。

ore.delete("ds_1")

ore.datastore()

ore.datastore()は、現行のスキーマにあるデータストアと各データストアの基本情報のリストを表示します。

ore.datastore(name, pattern)

ore.datastore()のパラメータは次のとおりです。

  • nameは、リストを表示するデータストアの名前を指定する文字列です。

  • patternは、リストを表示するデータストアの名前を指定する正規表現の文字列です。

ore.datastore()は、nameに指定した名前を持つデータストアの情報、またはpatternに指定した正規表現に一致する名前を持つデータストアの情報を表示します。

namepatternのいずれも指定しない場合、ore.datastore()はユーザーのスキーマにあるすべてのデータストアの情報を返します。

namepatternは、いずれか一方を指定できます。両方を指定することはできません。

ore.datastore()data.frameオブジェクトを返します。このオブジェクトには次の列があります。

  • datastore.nameは、データストアの名前です。

  • object.countは、datastore.nameで識別されるデータストア内のオブジェクトの数です。

  • sizeは、データストアのバイト単位のサイズです。

  • creation.dateは、データストアの作成日です。

  • descriptionは、データストアについてのコメントです(コメントはore.savedescriptionパラメータで指定します)。

data.frameの各行は1つのデータストアを示します。行は、列datastore.nameによってアルファベット順にソートされます。

ore.datastore()の例

接続スキーマのすべてのデータストアを表示します。

ore.datastore()

ore.datastoreSummary()

ore.datastoreSummary()は、接続データベースのスキーマにある指定されたデータストアに保存されたRオブジェクトの名前とサマリー情報がリストされたdata.frameを返します。

ore.datastoreSummary(name)

ore.datastoreSummary()のパラメータは次のとおりです。

  • nameは、サマリーを表示するデータストアの名前を指定する文字列です。nameの指定は必須です。

指定されたデータストアが存在しない場合は、エラー・メッセージが返されます。

ore.datastoreSummary()data.frameオブジェクトを返します。このオブジェクトには次の列があります。

  • object.nameは、Rオブジェクトの名前です。

  • class.nameは、Rオブジェクトのクラス名です。

  • sizeは、Rオブジェクトのバイト単位のサイズです。

  • lengthは、Rオブジェクトの長さです。

  • row.countは、Rオブジェクトの行数です。

  • col.countは、Rオブジェクトの列数です。

data.frameの各行は1つのRオブジェクトを示します。行は、列datastore.nameによってアルファベット順にソートされます。

ore.datastoreSummary()の例

データストアds_1内のすべてのRオブジェクトのサマリー情報を表示します。

ore.datastoreSummary(name = "ds_1")

Oracle R Enterpriseのデータ型でのRの使用方法

次の例では、Oracle R Enterpriseデータ型でのRの使用方法を示します。

  • Rでの単純な列および行の選択:

    # Push built-in R data set iris to database
    R> ore.create(iris, table="IRIS")
    R> head(iris)
      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
    R> iris_projected = IRIS[, c("PETAL_LENGTH", "SPECIES")]
    R> head (iris_projected)
      PETAL_LENGTH SPECIES
    0          1.4  setosa
    1          1.4  setosa
    2          1.3  setosa
    3          1.5  setosa
    4          1.4  setosa
    5          1.7  setosa
    
  • Rを使用したデータベースの結合:

    df1 <- data.frame(x1=1:5, y1=letters[1:5])
    df2 <- data.frame(x2=5:1, y2=letters[11:15])
    merge (df1, df2, by.x="x1", by.y="x2")
     x1 y1 y2
    1  1  a  o
    2  2  b  n
    3  3  c  m
    4  4  d  l
    5  5  e  k
    # Create database objects to correspond to in-memory R objects df1 and df2
    ore.df1 <- ore.create(df1, table="DF1")
    ore.df2 <- ore.create(df2, table="DF2")
    # Compare results
    R> merge (DF1, DF2, by.x="X1", by.y="X2")
      X1 Y1 Y2
    0  1  a  o
    1  2  b  n
    2  3  c  m
    3  4  d  l
    4  5  e  k
    
  • Rを使用したデータベースの集計:

    # Push built-in data set iris to database
    ore.create(iris, table="IRIS")
    aggdata <- aggregate(IRIS, by = list(IRIS$SPECIES), FUN = summary)
    class(aggdata)
    head(aggdata)
    
  • Rでのデータのフォーマット設定および派生列の作成

    派生列を追加しても、データベース表は変更されません。「Oracle R Enterpriseでの派生列」を参照してください。

    diverted_fmt <- function (x) {
    ifelse(x==0, 'Not Diverted',
    ifelse(x==1, 'Diverted',''))
    }
    cancellationCode_fmt <- function(x) {
    ifelse(x=='A', 'A CODE',
    ifelse(x=='B', 'B CODE',
    ifelse(x=='C', 'C CODE',
    ifelse(x=='D', 'D CODE', 'NOT CANCELLED'))))
    }
    delayCategory_fmt <- function(x) {
    ifelse(x>200,'LARGE',
    ifelse(x>=30,'MEDIUM','SMALL'))
    }
    zscore <- function(x) {
    (x-mean(x,na.rm=TRUE))/sd(x,na.rm=TRUE)
    # ONTIME_S is a database table
    ONTIME_S$DIVERTED <- diverted_fmt(DIVERTED)
    ONTIME_S$CANCELLATIONCODE <- cancellationCode_fmt(CANCELLATIONCODE)
    ONTIME_S$ARRDELAY <- delayCategory_fmt(ARRDELAY)
    ONTIME_S$DEPDELAY <- delayCategory_fmt(DEPDELAY)
    ONTIME_S$DISTANCE_ZSCORE <- zscore(DISTANCE)
    

Oracle R Enterpriseでの派生列

Oracle R Enterpriseを使用して派生列を追加する場合、その派生列によって、データベース内の基礎となっている表が影響を受けることはありません。選択リストに追加の派生列を持つSQL問合せが生成されますが、表は変更されません。

Oracle R EnterpriseでのCRANパッケージの使用

この例では、Oracle R EnterpriseでCRANからダウンロードした標準Rパッケージを使用する方法を示します。

回帰モデルの構築および使用

この例では、CRANパッケージを使用した回帰モデルの構築方法を示します。データベース内のトレーニングに使用するデータを準備できます(不要な観測データをフィルタで除外し、属性を選択し、欠落している値を帰属させるなど)。表ONTIME_S_PREPROCESSED_SUBSETに事前処理したデータがあるとします。準備したトレーニング・セット(通常、デスクトップのRメモリーに収まる大きさ)をRクライアントにプルし、モデルの構築を実行します。

結果のモデルを使用して、Oracle Database内の多数の行を並列してスコアリング(予測)できます。データはONTIME_S_FINAL_DATA_TO_BE_SCOREDに格納されます。

1つの行を他の行から独立して、並列してスコアリングできるため、スコアリングは、簡単に並列処理できる操作です。デスクトップで構築されたモデルは、データベースに送られ、データベース内で膨大な数の行に対してスコアリングを実行します。

計算は、次のステップに分かれています。

  1. デスクトップでモデルを構築します。

    dat <- ore.pull(ONTIME_S_PREPROCESSED_SUBSET)
    mod <- glm(ARRDELAY ~ DISTANCE + DEPDELAY, dat)
    mod
    summary(mod)
    
  2. 埋込みRを使用してデータベース内で並列してスコアリングします。

    prd <- predict(mod, newdata=ONTIME_S_FINAL_DATA_TO_BE_SCORED)
    class(prd)
    # Add predictions as a new column
    res <- cbind(newdat, PRED = prd)
    head(res)
    

Rは、これ以外にも、回帰モデルを構築する多くの方法を提供します(lm()など)。

回帰モデルを構築するその他の方法については、「Oracle R EnterpriseのRモデルのバージョン」および「Oracle R Enterpriseでのデータベース内予測モデル」を参照してください。

Oracle R Enterpriseのデータベース埋込みRエンジン

Oracle Databaseの埋込みRエンジンによって、Rユーザーは、デスクトップではより多くのリソース(Oracle Databaseで使用可能なものなど)を必要したりデータベース駆動型のデータの並列性を必要とする計算をデスクトップからオフロードできます。埋込みRエンジンは、SQLまたはPL/SQLプログラムに埋め込まれたRスクリプトも実行します(完全自動処理)。

次の例では、Oracle R Enterprise埋込みRエンジンでCRANからダウンロードした標準Rパッケージを使用する方法を示します。

Oracle DatabaseでのR計算の実行

この例では、R計算をオフロードし、埋込みRエンジンを実行する方法を示します。R計算をオフロードするには、Rコードを閉包(つまりfunction() {})内に含め、ore.doEval()を起動するだけです。ore.doEval()によって、そのRコードのデータベース埋込みRエンジンでの実行がスケジュールされ、結果が、その後の分析のためにデスクトップに返されます。

library(biglm)
mod <- ore.doEval(
   function() {
      library(biglm)
      dat <- ore.pull(ore.get("ONTIME_S"))
      mod <- biglm(ARRDELAY ~ DISTANCE + DEPDELAY, dat)
      mod
     }, ore.connect = TRUE);
print(mod)
mod=ore.pull(mod)
print(mod)

データの並列性を使用した一連の回帰モデルの構築

この例では、CRANパッケージを使用した一連の回帰モデルの構築におけるデータベース駆動型のデータの並列性を示します。ファクタの一意の値ごとに1つのモデルが構築されます。データベースによるオーケストレーションの下に、1つのファクタに1つずつのモデルが並列かつ同時に構築され、構築されたすべてのモデルのリストが、その後の分析のためにユーザーのデスクトップに送信されます。

modList <- ore.groupApply(
  # Organize input to the R script – This is always an Oracle R Enterprise   
  # data frame
   X=ONTIME_S,
  # Specify the grouping column. Here we request one model per unique value of
  # ONTIME_S$DEST
   INDEX=ONTIME_S$DEST,
  # Model building code goes inside the closure. Input and grouping 
  # conditions can be referenced as parameters to the function
    function(x) {
     library(biglm)
     biglm(ARRDELAY ~ DISTANCE + DEPDELAY, x)
     });

   modList_local <- ore.pull(modList)
# Print the model for just one destination - BOSTON
summary(modList_local$BOS)

Oracle R Enterpriseの例

Oracle R Enterpriseには、Oracle R Enterpriseの使用方法を示す一連のデモおよび例が同梱されています。これらの例は、自己完結型Rスクリプトの集まりです。

大部分のサンプル・プログラムでは、Rディストリビューションに含まれているデータ・フレームirisが使用されます。irisは、「表へのデータ・フレームのロード」の説明に従って表にロードされます。

この項の残りの部分では、2つの例について詳しく説明し、すべての例のリストを示します。

表へのデータ・フレームのロード

Rを起動し、library(ORE)を使用してOREパッケージをロードし、データベースに接続します。

Rデータ・フレームをデータベース表にロードするには、次の手順に従います。

  1. この例では、Rデータ・セットirisを使用します。

    irisデータ・セットは、Rディストリビューションに含まれるデータセット・パッケージ内にあります。

    R> find("iris")
    [1] "package:datasets"
    

    Rコマンドclassを使用してirisがRデータ・フレームであること確認します。

    R> class(iris)
    [1] "data.frame"
    

    irisは、植物のアヤメの各部の測定値で構成されています。Rコマンドheadを使用して、irisのデータの少量のサンプルを表示します。

    R> head(iris)
          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
    
  2. ここで、接続しているデータベースに、データ・フレームirisをロードします。

    irisのデータベース表バージョンの名前はIRIS_TABLEであるとします。IRIS_TABLEを削除し、接続しているスキーマにこの名前の表がないことを確認します。

    ore.drop(table = "IRIS_TABLE")
    

    IRIS_TABLEが存在しない場合、メッセージは表示されません。

  3. ここで、irisに含まれているデータでデータベース表を作成します。

    ore.create(iris, table = "IRIS_TABLE")
    

    ore.ls()を使用して、表が作成されたことを確認します。

    R> ore.ls()
    [1] "IRIS_TABLE" "NARROW"     "ONTIME_S" 
    
  4. IRIS_TABLEは、データベースに格納されている表であり、R側のメタデータのみが含まれています。

    R> class(IRIS_TABLE)
    [1] "ore.frame"
    attr(,"package")
    [1] "OREbase"
    
  5. headを使用して、IRIS_TABLE内の列名および最初の数個の値を表示します。

    R> head(IRIS_TABLE)
      SEPAL_LENGTH SEPAL_WIDTH PETAL_LENGTH PETAL_WIDTH SPECIES
    0          5.1         3.5          1.4         0.2  setosa
    1          4.9         3.0          1.4         0.2  setosa
    2          4.7         3.2          1.3         0.2  setosa
    3          4.6         3.1          1.5         0.2  setosa
    4          5.0         3.6          1.4         0.2  setosa
    5          5.4         3.9          1.7         0.4  setosa
    
  6. classを使用して列SPECIESのデータ型を表示します。

    R > class(IRIS_TABLE$SPECIES)
    [1] "raw"
    

R関数を使用して、表のデータを分析します。次に、例basic.Rからの単純な例をいくつか示します。

  • uniqueを使用して、列内の一意のエントリのリストを取得します。この例では、一意のSPECIESを見つけます。

    R> unique(IRIS_TABLE$SPECIES)
    [1] setosa     versicolor virginica 
    Levels: setosa versicolor virginica
    
  • PETAL_LENGTHの最小値、最大値、および平均を見つけます。

    R> min(IRIS_TABLE$PETAL_LENGTH)
    [1] 1
    R> max(IRIS_TABLE$PETAL_LENGTH)
    [1] 6.9
    R> mean(IRIS_TABLE$PETAL_LENGTH)
    [1] 3.758
    

R関数の情報が必要な場合は、コマンドhelp(function-name)を使用します。

空気質を使用したNULL値の処理

Oracle Databaseには、TRUE、FALSE、NULLの論理値があります。ANDおよびORを使用した命題の真理値を定義した3x3の表があります。NULLは不明な値として扱われます。一部の演算の結果は、決定的(たとえばTRUE OR NULL)または未知(TRUE AND NULL)のいずれかになります。WHERE句で論理値を使用すると、条件がTRUEの行のみが選択されて、FALSEおよびNULLは無視されます。一方、Rでは、TRUEおよびNAが保持されます。値NAによって、NAの行が選択されます。

オプションore.na.extractは、NAが選択されるかどうかを制御します。デフォルトでは、SQLでFALSEを取り扱うのと同様にNAを取り扱います。

デモnulls.Rは、データとしてirisを使用しない唯一のサンプルです。nulls.Rは、SQLでのNULLの処理とRでのNAの処理を比較します。

Rでは、NAは、欠落値インジケータを含む長さ1の論理定数です。データベースでは、NULLは、1つの行の1つの列における1つの値の欠落を示します。NULLは、データがない、不明である、または適切でないことを示します。

デモnulls.Rを理解するには、次の手順に従ってください。

  1. このデモでは、データ・フレームairqualityを使用します。データ・セットがデータ・フレームであり、そのデータ・フレームの数行を調べていることを確認します。

    R> class(airquality)
    [1] "data.frame"
    R> head(airquality)
      Ozone Solar.R Wind Temp Month Day
    1    41     190  7.4   67     5   1
    2    36     118  8.0   72     5   2
    3    12     149 12.6   74     5   3
    4    18     313 11.5   62     5   4
    5    NA      NA 14.3   56     5   5
    6    28      NA 14.9   66     5   6
    
  2. airqualityをAIRQUALITYとしてデータベースにロードします。

    ore.drop(table = "AIRQUALITY")
    ore.create(airquality, table = "AIRQUALITY")
    

    ore.ls()を使用して、表が作成されたことを確認します。必要であれば、class(AIRQUALITY)を使用して、AIRQUALITYが、データベースに格納されている表であり、R側のメタデータのみが含まれていることを確認します。

  3. RによってNAがどのように処理されるのかを確認します。ozone < 30がTRUEである、すべての観測データを返します。

    R> nrow(airquality[airquality$Ozone < 30,])[1] 92
    

    これを、NAを明示的に除外したときの結果と比較します。

    R> nrow(airquality[airquality$Ozone < 30 & !is.na(airquality$Ozone),])
    [1] 55
    
  4. SQL表のデフォルトの動作は、出力でNULLを除外することです。

    nrow(AIRQUALITY[AIRQUALITY$OZONE < 30,])
    [1] 55
    

    NULLを、RでのNAの処理と同じように処理するには、その動作を明示的に要求します。

    options(ore.na.extract = TRUE)
    nrow(AIRQUALITY[AIRQUALITY$OZONE < 30,])
    [1] 92
    

Oracle R Enterpriseのデモ

これらのスクリプトは、OREパッケージにデモとして追加されています。

Oracle R Enterpriseに含まれるすべてのデモを表示するには、次のように入力します。

R> demo(package = "ORE")

これらのスクリプトの1つを実行するには、demoファンクション・コールにそのデモの名前を指定します。たとえば、aggregate.Rを実行するには、次のように入力します。

R> demo("aggregate", package = "ORE")

Oracle R Enterpriseに同梱されているデモは、次のとおりです。

aggregate      Aggregation
analysis       Basic analysis & data processing operations
basic          Basic connectivity to database
binning        Binning logic
columnfns      Column functions
cor            Correlation matrix
crosstab       Frequency cross tabulations
datastore      DataStore operations
datetime       Date/Time operations
derived        Handling of derived columns
distributions  Distribution, density, and quantile functions
do_eval        Embedded R processing
freqanalysis   Frequency cross tabulations
graphics       Demonstrates visual analysis
group_apply    Embedded R processing by group
hypothesis     Hyphothesis testing functions
matrix         Matrix related operations
nulls          Handling of NULL in SQL vs. NA in R
odm_ai         Oracle Data Mining: attribute importance
odm_dt         Oracle Data Mining: decision trees
odm_glm        Oracle Data Mining: generalized linear models
odm_kmeans     Oracle Data Mining: enhanced k-means clustering
odm_nb         Oracle Data Mining: naive Bayes classification
odm_svm        Oracle Data Mining: support vector machines
push_pull      RDBMS <-> R data transfer
rank           Attributed-based ranking of observations
reg            Ordinary least squares linear regression
row_apply      Embedded R processing by row chunks
sampling       Random row sampling and partitioning of an ore.frame
sql_like       Mapping of R to SQL commands
stepwise       Stepwise OLS linear regression
summary        Summary functionality
table_apply    Embedded R processing of entire table