5 データベースでのデータの準備および探索

Oracle Machine Learning for Rの関数を使用して、分析用のデータを準備し、データの探索的分析を実行します。

これらの関数は、モデリングのための非常に大規模なエンタープライズのデータベース常駐データの準備を容易にします。次の各トピックで、これらについて説明します。

5.1 Oracle Machine Learning for Rを使用したデータベースのデータの準備

OML4Rを使用して、データベースで分析用のデータを準備できます。

データ準備については、次の各トピックで説明します。

5.1.1 データベースでのデータの準備について

Oracle Machine Learning for Rには、Rを使用して分析用のデータベース・データを準備できる関数が用意されています。

これらの関数を使用して、ore.frameおよびその他のOML4Rオブジェクトでの一般的なデータ準備タスクを実行できます。データ準備操作は、データベースにある大量のデータに対して実行でき、Comprehensive R Archive Network (CRAN)で入手可能なパッケージの関数を使用して分析用のローカルのRセッションに結果をプルできます。

データに対して次のような操作を実行できます。

  • 選択

  • ビニング

  • サンプリング

  • ソートおよび順序付け

  • 集計

  • 変換

  • 日時データに対するデータ準備操作の実行

これらの操作の実行については、この章の他の項で説明します。

5.1.2 データの選択

分析用のデータの準備の一般的なステップは、大規模なデータセットから対象の値を選択またはフィルタ処理することです。

このトピックの例では、ore.frameオブジェクトからの列、行および値でのデータの選択を示します。次の各トピックで例を示します。

5.1.2.1 列によるデータの選択

この例では、ore.frameオブジェクトから列を選択します。

例5-1 列によるデータの選択

まず、この例ではiris data.frameオブジェクトから、一時データベース表および対応するプロキシore.frameオブジェクトiris_ofを作成します。iris_ofの最初の3行を表示します。iris_ofから2行を選択し、それを使用してore.frameオブジェクトiris_projectedを作成します。その後、iris_projectedの最初の3行を表示します。

iris_of <- ore.push(iris)
head(iris_of, 3)

iris_projected = iris_of[, c("Petal.Length", "Species")]

head (iris_projected, 3)
この例のリスト
iris_of <- ore.push(iris)
head(iris_of, 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

R> iris_projected = iris_of[, c("Petal.Length", "Species")]

R> head (iris_projected, 3)
  Petal.Length Species
1          1.4  setosa
2          1.4  setosa
3          1.3  setosa
5.1.2.2 行によるデータの選択

この例では、順序付けられたore.frameオブジェクトから行を選択します。

例5-2 行によるデータの選択

この例では最初に、順序付けられたore.frameオブジェクトの作成に使用するために、irisdata.frameオブジェクトに列を追加します。データベース表IRIS_TABLEが存在する場合は、ore.drop関数を実行して削除します。次に、irisdata.frameから、対応するプロキシore.frameオブジェクトのIRIS_TABLEとともに、データベース表を作成します。この例では、ore.exec関数を実行して、RID列をデータベース表の主キーにするためのSQL文を実行します。次にore.sync関数を実行して、IRIS_TABLEore.frameオブジェクトをこの表と同期化させ、プロキシore.frameオブジェクトの最初の3行を表示します。

例では次に、IRIS_TABLEから行番号で51行を選択し、それを使用して順序付けられたore.frameオブジェクトのiris_selrowsを作成します。この例では、iris_selrowsの最初の6行を表示します。その後、行名で3行を選択して結果を表示します。

# Add a column to the iris data set to use as row identifiers.
iris$RID <- as.integer(1:nrow(iris) + 100)
ore.drop(table = 'IRIS_TABLE')
ore.create(iris, table = 'IRIS_TABLE')
ore.exec("alter table IRIS_TABLE add constraint IRIS_TABLE 
          primary key (\"RID\")")
ore.sync(table = "IRIS_TABLE")
head(IRIS_TABLE, 3)

# Select rows by row number. 
iris_selrows <- IRIS_TABLE[50:100,]
head(iris_selrows)

# Select rows by row name.
IRIS_TABLE[c("101", "151", "201"),]
この例のリスト
R> # Add a column to the iris data set to use as row identifiers.
R> iris$RID <- as.integer(1:nrow(iris) + 100)
R> ore.drop(table = 'IRIS_TABLE')
R> ore.create(iris, table = 'IRIS_TABLE')
R> ore.exec("alter table IRIS_TABLE add constraint IRIS_TABLE 
+            primary key (\"RID\")")
R> ore.sync(table = "IRIS_TABLE")
R> head(IRIS_TABLE, 3)
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species RID
101          5.1         3.5          1.4         0.2  setosa 101
102          4.9         3.0          1.4         0.2  setosa 102
103          4.7         3.2          1.3         0.2  setosa 103
R> # Select rows by row number. 
R> iris_selrows <- IRIS_TABLE[50:100,]
R> head(iris_selrows)
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species RID
150          5.0         3.3          1.4         0.2     setosa 150
151          7.0         3.2          4.7         1.4 versicolor 151
152          6.4         3.2          4.5         1.5 versicolor 152
153          6.9         3.1          4.9         1.5 versicolor 153
154          5.5         2.3          4.0         1.3 versicolor 154
155          6.5         2.8          4.6         1.5 versicolor 155
R> # Select rows by row name.
R> IRIS_TABLE[c("101", "151", "201"),]
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species RID
101          5.1         3.5          1.4         0.2     setosa 101
151          7.0         3.2          4.7         1.4 versicolor 151
201          6.3         3.3          6.0         2.5  virginica 201
5.1.2.3 値によるデータの選択

この例では、データセットの一部を選択します。

例5-3 値によるデータの選択

この例では、irisデータセットをデータベースにプッシュし、ore.frameオブジェクトのiris_ofを取得します。データをフィルタ処理してiris_of_filteredを生成しますが、これには、花弁の長さが1.5より短いもので、Sepal.Length列およびSpecies列にあるiris_ofの行の値が含まれています。この例ではさらに、条件を使用してデータをフィルタ処理して、iris_of_filteredがsetosa種または虹色の種で、花弁の幅が2.0より短いiris_ofの値を含むようにします。

iris_of <- ore.push(iris)
# Select sepal length and species where petal length is less than 1.5.
iris_of_filtered <- iris_of[iris_of$Petal.Length < 1.5,
                            c("Sepal.Length", "Species")]
names(iris_of_filtered)
nrow(iris_of_filtered)
head(iris_of_filtered, 3)
# Alternate syntax filtering.
iris_of_filtered <- subset(iris_of, Petal.Length < 1.5)
nrow(iris_of_filtered)
head(iris_of_filtered, 3)
# Using the AND and OR conditions in filtering.
# Select all rows with in which the species is setosa or versicolor.
# and the petal width is less than 2.0.
iris_of_filtered <- iris_of[(iris_of$Species == "setosa" |
                             iris_of$Species == "versicolor") &
                             iris_of$Petal.Width < 2.0,]
nrow(iris_of_filtered)
head(iris_of, 3)
この例のリスト
R> iris_of <- ore.push(iris)
R> # Select sepal length and species where petal length is less than 1.5.
R> iris_of_filtered <- iris_of[iris_of$Petal.Length < 1.5,
+                              c("Sepal.Length", "Species")]
R> names(iris_of_filtered)
[1] "Sepal.Length" "Species"
R> nrow(iris_of_filtered)
[1] 24
R> head(iris_of_filtered, 3)
  Sepal.Length Species
1          5.1  setosa
2          4.9  setosa
3          4.7  setosa
R> # Alternate syntax filtering.
R> iris_of_filtered <- subset(iris_of, Petal.Length < 1.5)
R> nrow(iris_of_filtered)[1] 24
R> head(iris_of_filtered, 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
R> # Using the AND and OR conditions in filtering.
R> # Select all rows with in which the species is setosa or versicolor.
R> # and the petal width is less than 2.0.
R> iris_of_filtered <- iris_of[(iris_of$Species == "setosa" |
+                              iris_of$Species == "versicolor") &
+                              iris_of$Petal.Width < 2.0,]
R> nrow(iris_of_filtered)[1] 100
R> head(iris_of, 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

5.1.3 データの索引付け

整数ベクターまたは文字列ベクターを使用して、順序付けられたore.frameオブジェクトに索引付けできます。

「データのサンプリング」および「データのパーティション化」の説明に従って、サンプリングおよびパーティション化を実行するために索引付けを使用できます。

Oracle Machine Learning for RはRの索引付けに類似した機能をサポートしますが、次の違いがあります。

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

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

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

例5-4 ore.frameオブジェクトの索引付け

この例は、文字の索引付けおよび整数の索引付けを示します。この例では、第2章のキーを使用した順序付けに関する項の例に示すように、順序付けされたSPAM_PK ore.frameオブジェクトを使用します。この例は、行に名前でアクセスできること、文字の行名のベクターを指定することで行のセットにアクセスできることも示します。次に、実際の整数値を指定できることを示します。例では、USERID値が1ではなく1001で始まるため、結果は様々な行のセットになります。

# Index to a specifically named row.
SPAM_PK["2060", 1:4]
# Index to a range of rows by row names.
SPAM_PK[as.character(2060:2064), 1:4]
# Index to a range of rows by integer index.
SPAM_PK[2060:2063, 1:4]
この例のリスト
R> # Index to a specifically named row.
R> SPAM_PK["2060", 1:4]
       TS USERID make address
2060 2060    380    0       0
R> # Index to a range of rows by row names.
R> SPAM_PK[as.character(2060:2064), 1:4]
       TS USERID make address
2060 2060    380    0       0
2061 2061    381    0       0
2062 2062    381    0       0
2063 2063    382    0       0
2064 2064    382    0       0
R> # Index to a range of rows by integer index.
R> SPAM_PK[2060:2063, 1:4]
       TS USERID make address
3060 3060    380 0.00    0.00
3061 3061    381 0.00    1.32
3062 3062    381 0.00    2.07
3063 3063    382 0.34    0.00

5.1.4 データの結合

merge関数を使用して、データベース表を表すore.frameオブジェクトのデータを結合できます。

例5-5 2つの表のデータの結合

この例では、2つのdata.frameオブジェクトを作成してそれをマージします。次に、ore.create関数をコールして、それぞれのdata.frameオブジェクトにデータベース表を作成します。ore.create関数は、ore.frameオブジェクトを表のプロキシ・オブジェクトとして自動的に生成します。ore.frameオブジェクトには表と同じ名前が付けられます。この例では、ore.frameオブジェクトをマージします。2つのmerge操作の結果の順序は、ore.frameオブジェクトが順序付けられていないために同じでないことに注意してください。

# Create data.frame objects.
df1 <- data.frame(x1=1:5, y1=letters[1:5])
df2 <- data.frame(x2=5:1, y2=letters[11:15])

# Combine the data.frame objects.
merge (df1, df2, by.x="x1", by.y="x2")

# Create database tables and ore.frame proxy objects to correspond to
# the local R objects df1 and df2.
ore.create(df1, table="DF1_TABLE")
ore.create(df2, table="DF2_TABLE")

# Combine the ore.frame objects.
merge (DF1_TABLE, DF2_TABLE, by.x="x1", by.y="x2")
この例のリスト
R> # Create data.frame objects.
R> df1 <- data.frame(x1=1:5, y1=letters[1:5])
R> df2 <- data.frame(x2=5:1, y2=letters[11:15])

R> # Combine the data.frame objects.
R> 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

R> # Create database tables and ore.frame proxy objects to correspond to
R> # the local R objects df1 and df2.
R> ore.create(df1, table="DF1_TABLE")
R> ore.create(df2, table="DF2_TABLE")

R> # Combine the ore.frame objects.
R> merge (DF1_TABLE, DF2_TABLE, by.x="x1", by.y="x2")
  x1 y1 y2
1  5  e  k
2  4  d  l
3  3  c  m
4  2  b  n
5  1  a  o
Warning message:
ORE object has no unique key - using random order

5.1.5 ore.summaryによるデータの集計

ore.summary関数は、記述統計を計算し、柔軟な行の集計とともに、ore.frame内の列の広範な分析をサポートします。

ore.summary関数では、次の統計がサポートされています。

  • 平均、最小、最大、モード、欠損値の数、合計、加重和

  • 二乗の補正および未補正合計、値の範囲、stddevstderrvariance

  • 母平均が0であるという仮定をテストするためのt検定

  • 尖度、歪度、変動係数

  • 分位: p1、p5、p10、p25、p50、p75、p90、p95、p99、qrange

  • 平均の片側および両側信頼限界: clmrclmlclm

  • 極値のタグ付け

ore.summary関数は、同じ結果を生成するSQL問合せと比べて比較的単純な構文を提供します。

ore.summary関数は、group.by引数が使用されている場合を除くすべての場合にore.frameを返します。group.by引数が使用されている場合、ore.summaryは、階層ごとにore.frameを1つずつore.frameオブジェクトのリストを返します。

この関数の引数の詳細は、help(ore.summary)をコールしてください。

例5-6 デフォルトの統計の計算

この例では、列AGEおよびCLASSの平均値、最小値および最大値を計算し、GENDER列をロールアップ(集計)します。

ore.summary(NARROW, class = 'GENDER', var = c('AGE', 'CLASS'), order = 'freq')

例5-7 歪度およびt-検定の可能性の計算

この例では、AGEの歪度と、CLASSのスチューデントのt分布の可能性を計算します。

ore.summary(NARROW, class = 'GENDER', var = c('AGE', 'CLASS'), c('skew', 'probt'))

例5-8 重み付け合計の計算

この例では、YRS_RESIDENCEを重みとしてGENDERによって集計されたAGEの重み付けされた合計を計算します。つまりsum(var*weight)を計算します。

ore.summary(NARROW, class = 'GENDER', var = 'AGE', stats = 'sum', weight = 'YRS_RESIDENCE')

例5-9 2つの列によるグループ化

この例では、GENDERおよびMARITAL_STATUSでCLASSをグループ化します。

ore.summary(NARROW, class = c('GENDER', 'MARITAL_STATUS'), var = 'CLASS', ways = 1)

例5-10 すべての適用可能な方法でのグループ化

この例では、GENDERおよびMARITAL_STATUSによってすべての適用可能な方法でCLASSをグループ化します。

ore.summary(NARROW, class = c('GENDER', 'MARITAL_STATUS'), var = 'CLASS', ways = 0:length(NARROW['CLASS']))

例5-11 ore.summaryを使用した列の最大値の取得

この例では、IRIS ore.frame内のSepal.Length列とSepal.Width列の最大値および対応する種をリストします。

IRIS <- ore.push(iris)
ore.summary(IRIS, c("Sepal.Length", "Sepal.Width"), 
                    "max", 
                    maxid=c(Sepal.Length="Species", Sepal.Width="Species"))

この例のリスト

R> IRIS <- ore.push(iris)
R> ore.summary(IRIS, c("Sepal.Length", "Sepal.Width"),
+                      "max",
+                      maxid=c(Sepal.Length="Species", Sepal.Width="Species"))
  FREQ MAX(Sepal.Length) MAX(Sepal.Width) MAXID(Sepal.Length->Species) MAXID(Sepal.Width->Species)
1  150               7.9              4.4                    virginica                      setosa
Warning message:
ORE object has no unique key - using random order 

5.1.6 データの変換

分析用のデータの準備での一般的なステップは、データを再フォーマットするか新しい列を導出してデータセットに追加することによってデータを変換することです。

この項の例では、データのフォーマットおよび列の導出のための2つの方法を示します。

例5-12 データのフォーマット

この例では、列のデータをフォーマットする関数を作成します。

# Create a function for formatting data.
petalCategory_fmt <- function(x) {
    ifelse(x > 5, 'LONG',
    ifelse(x > 2, 'MEDIUM', 'SMALL'))
  }
# Create an ore.frame in database memory with the iris data set.
iris_of <- ore.push(iris)
# Select some rows from iris_of.
iris_of[c(10, 20, 60, 80, 110, 140),]
# Format the data in Petal.Length column.
iris_of$Petal.Length <- petalCategory_fmt(iris_of$Petal.Length)
# Select the same rows from iris_of.

この例のリスト

R> # Create a function for formatting data.
R> petalCategory_fmt <- function(x) {
+    ifelse(x > 5, 'LONG',
+    ifelse(x > 2, 'MEDIUM', 'SMALL'))
+ }
R> # Create an ore.frame in database memory with the iris data set.
R> iris_of <- ore.push(iris)
R> # Select some rows from iris_of.
R> iris_of[c(10, 20, 60, 80, 110, 140),]
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
10           4.9         3.1          1.5         0.1     setosa
20           5.1         3.8          1.5         0.3     setosa
60           5.2         2.7          3.9         1.4 versicolor
80           5.7         2.6          3.5         1.0 versicolor
110          7.2         3.6          6.1         2.5  virginica
140          6.9         3.1          5.4         2.1  virginica
R> # Format the data in Petal.Length column.
R> iris_of$Petal.Length <- petalCategory_fmt(iris_of$Petal.Length)
R> # Select the same rows from iris_of.
R> iris_of[c(10, 20, 60, 80, 110, 140),]
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
10           4.9         3.1        SMALL         0.1     setosa
20           5.1         3.8        SMALL         0.3     setosa
60           5.2         2.7       MEDIUM         1.4 versicolor
80           5.7         2.6       MEDIUM         1.0 versicolor
110          7.2         3.6         LONG         2.5  virginica
140          6.9         3.1         LONG         2.1  virginica

例5-13 transform関数の使用方法

この例では、データセットの列にあるデータを再フォーマットするためにtransform関数を使用することを除いて、前の例と同じことを行います。

# Create an ore.frame in database memory with the iris data set.
iris_of2 <- ore.push(iris)
# Select some rows from iris_of.
iris_of2[c(10, 20, 60, 80, 110, 140),]
iris_of2 <- transform(iris_of2,
                  Petal.Length = ifelse(Petal.Length > 5, 'LONG',
                                 ifelse(Petal.Length > 2, 'MEDIUM', 'SMALL')))
iris_of2[c(10, 20, 60, 80, 110, 140),]

この例のリスト

R> # Create an ore.frame in database memory with the iris data set.
R> iris_of2 <- ore.push(iris)
R> # Select some rows from iris_of.
R> iris_of2[c(10, 20, 60, 80, 110, 140),]
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
10           4.9         3.1          1.5         0.1     setosa
20           5.1         3.8          1.5         0.3     setosa
60           5.2         2.7          3.9         1.4 versicolor
80           5.7         2.6          3.5         1.0 versicolor
110          7.2         3.6          6.1         2.5  virginica
140          6.9         3.1          5.4         2.1  virginica
R> iris_of2 <- transform(iris_of2,
+                  Petal.Length = ifelse(Petal.Length > 5, 'LONG',
+                                 ifelse(Petal.Length > 2, 'MEDIUM', 'SMALL')))
R> iris_of2[c(10, 20, 60, 80, 110, 140),]
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
10           4.9         3.1        SMALL         0.1     setosa
20           5.1         3.8        SMALL         0.3     setosa
60           5.2         2.7       MEDIUM         1.4 versicolor
80           5.7         2.6       MEDIUM         1.0 versicolor
110          7.2         3.6         LONG         2.5  virginica
140          6.9         3.1         LONG         2.1  virginica

例5-14 派生列の追加

この例では、transform関数を使用して派生列をデータセットに追加した後に、追加の列を追加します。

# Set the page width.
options(width = 80)
# Create an ore.frame in database memory with the iris data set.
iris_of <- ore.push(iris)
names(iris_of)
# Add one column derived from another
iris_of <- transform(iris_of, LOG_PL = log(Petal.Length))
names(iris_of)
head(iris_of, 3)
# Add more columns.
iris_of <- transform(iris_of,
                    SEPALBINS = ifelse(Sepal.Length < 6.0, "A", "B"),
                    PRODUCTCOLUMN = Petal.Length * Petal.Width,
                    CONSTANTCOLUMN = 10)
names(iris_of)
# Select some rows of iris_of.
iris_of[c(10, 20, 60, 80, 110, 140),]

この例のリスト

R> # Set the page width.
R> options(width = 80)
R> # Create an ore.frame in database memory with the iris data set.
R> iris_of <- ore.push(iris)
R> names(iris_of)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species" 
R> # Add one column derived from another
R> iris_of <- transform(iris_of, LOG_PL = log(Petal.Length))
R> names(iris_of)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
[6] "LOG_PL"
R> head(iris_of, 3)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species    LOG_PL
1          5.1         3.5          1.4         0.2  setosa 0.3364722
2          4.9         3.0          1.4         0.2  setosa 0.3364722
3          4.7         3.2          1.3         0.2  setosa 0.2623643
R> # Add more columns.
R> iris_of <- transform(iris_of,
                    SEPALBINS = ifelse(Sepal.Length < 6.0, "A", "B"),
                    PRODUCTCOLUMN = Petal.Length * Petal.Width,
                    CONSTANTCOLUMN = 10)
R> names(iris_of)
[1] "Sepal.Length"   "Sepal.Width"    "Petal.Length"   "Petal.Width"   
[5] "Species"        "LOG_PL"         "CONSTANTCOLUMN" "SEPALBINS"     
[9] "PRODUCTCOLUMN"
R> # Select some rows of iris_of.
R> iris_of[c(10, 20, 60, 80, 110, 140),]
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species    LOG_PL
10           4.9         3.1          1.5         0.1     setosa 0.4054651
20           5.1         3.8          1.5         0.3     setosa 0.4054651
60           5.2         2.7          3.9         1.4 versicolor 1.3609766
80           5.7         2.6          3.5         1.0 versicolor 1.2527630
110          7.2         3.6          6.1         2.5  virginica 1.8082888
140          6.9         3.1          5.4         2.1  virginica 1.6863990
    CONSTANTCOLUMN SEPALBINS PRODUCTCOLUMN
10              10         A          0.15
20              10         A          0.45
60              10         A          5.46
80              10         A          3.50
110             10         B         15.25
140             10         B         11.34

5.1.7 データのサンプリング

サンプリングは統計分析の重要な機能です。

通常、データのサイズを減らし、意味のある作業を実行するためにデータをサンプリングします。Rでは、通常、サンプリングするには、データをメモリーにロードする必要があります。ただし、データが非常に大きい場合、それは不可能です。

OML4Rでは、データベースからデータをプルしてサンプリングするかわりに、データベースで直接サンプリングしてそのサンプル部分であるレコードのみをプルできます。データベースでサンプリングすることで、データの移動を最小化するため、より大きなデータセットで作業できます。これは、この機能を可能にする透過層での順序付けフレームワークの整数行の索引付けであることに注意してください。

この項の例に、いくつかのサンプリング手法を示します。

例5-15 簡単なランダム・サンプリング

この例では、行をランダムに簡単に選択する方法を示します。この例では、小規模なdata.frameオブジェクトを作成し、それをデータベースにプッシュしてore.frameオブジェクトであるMYDATAを作成します。20行のうちの5行をサンプリングします。Rのsample関数を使用して、MYDATAからサンプルを取得するために使用する索引のランダムなセットを生成します。このサンプル(simpleRandomSample)はore.frameオブジェクトです。

set.seed(1)
N <- 20
myData <- data.frame(a=1:N,b=letters[1:N])
MYDATA <- ore.push(myData)
head(MYDATA)
sampleSize <- 5
simpleRandomSample <- MYDATA[sample(nrow(MYDATA), sampleSize), , drop=FALSE]
class(simpleRandomSample)
simpleRandomSample

この例のリスト

R> set.seed(1)
R> N <- 20
R> myData <- data.frame(a=1:N,b=letters[1:N])
R> MYDATA <- ore.push(myData)
R> head(MYDATA)
  a b
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e
6 6 f
R> sampleSize <- 5
R> simpleRandomSample <- MYDATA[sample(nrow(MYDATA), sampleSize), , drop=FALSE]
R> class(simpleRandomSample)
[1] "ore.frame"
attr(,"package")
[1] "OREbase"
R> simpleRandomSample
    a b
2   2 b
7   7 g
10 10 j
12 12 l
19 19 s

例5-16 分割データ・サンプリング

この例では、トレーニング・セットおよびテスト・セットへのデータのランダムなパーティショニングを示します。このデータの分割は通常、新しいデータに対するモデルの効果を評価するために、分類および回帰で行われます。この例では、前の例で作成したMYDATAオブジェクトを使用します。

この例では、テスト・データセットとして使用するための索引のサンプル・セットを生成します。次に、論理ベクターgroupを作成します(索引がサンプルにある場合はTRUE、そうでない場合はFALSE)。次に、行の索引付けを使用して、トレーニング・セット(groupがFALSE)およびテスト・セット(groupがTRUE)を生成します。sample関数の呼出し時に指定したとおり、トレーニング・セットの行数は15でテスト・セットの行数は5であることに注意してください。

set.seed(1)
sampleSize <- 5
ind <- sample(1:nrow(MYDATA), sampleSize)
group <- as.integer(1:nrow(MYDATA) %in% ind)
MYDATA.train <- MYDATA[group==FALSE,]
dim(MYDATA.train)
MYDATA.test <- MYDATA[group==TRUE,]
dim(MYDATA.test)

この例のリスト

R> set.seed(1)
R> sampleSize <- 5
R> ind <- sample(1:nrow(MYDATA), sampleSize)
R> group <- as.integer(1:nrow(MYDATA) %in% ind)
R> MYDATA.train <- MYDATA[group==FALSE,]
dim(MYDATA.train)
[1] 15  2 
R> MYDATA.test <- MYDATA[group==TRUE,]
R> dim(MYDATA.test)
[1] 5 2

例5-17 系統的サンプリング

この例では、定期的に行が選択される系統的サンプリングを示します。この例では、seq関数を使用して、2から始まり3ずつ増加する一連の値を作成します。この順序の値の数はMYDATAの行数と同じです。MYDATAオブジェクトは最初の例で作成しています。

set.seed(1)
N <- 20
myData <- data.frame(a=1:20,b=letters[1:N])
MYDATA <- ore.push(myData)
head(MYDATA)
start <- 2
by <- 3
systematicSample <- MYDATA[seq(start, nrow(MYDATA), by = by), , drop = FALSE]
systematicSample

この例のリスト

R> set.seed(1)
R> N <- 20
R> myData <- data.frame(a=1:20,b=letters[1:N])
R> MYDATA <- ore.push(myData)
R> head(MYDATA)
  a b
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e
6 6 f
R> start <- 2
R> by <- 3
R> systematicSample <- MYDATA[seq(start, nrow(MYDATA), by = by), , drop = FALSE]
systematicSample
    a b
2   2 b
5   5 e
8   8 h
11 11 k
14 14 n
17 17 q
20 20 t

例5-18 層別サンプリング

この例では、行が各グループ内で選択される層別サンプリングを示します(グループは、特定の列の値によって決まります)。この例では、各行がグループに割り当てられているデータセットを作成します。関数rnormはランダムの正規値を生成します。引数4は分布の目標平均です。グループに応じてデータを分割し、各パーティションに比例してサンプリングします。最後に、サブセットore.frameオブジェクトのリストを1つのore.frameオブジェクトに行バインドし、結果の値stratifiedSampleを表示します。

set.seed(1)
N <- 200
myData <- data.frame(a=1:N,b=round(rnorm(N),2),
                     group=round(rnorm(N,4),0))
MYDATA <- ore.push(myData)
head(MYDATA)
sampleSize <- 10
stratifiedSample <- do.call(rbind,
                            lapply(split(MYDATA, MYDATA$group),
                                   function(y) {
                                   ny <- nrow(y)
                                   y[sample(ny, sampleSize*ny/N), , drop = FALSE]
                              }))
stratifiedSample

この例のリスト

R> set.seed(1)
R> N <- 200
R> myData <- data.frame(a=1:N,b=round(rnorm(N),2),
+                       group=round(rnorm(N,4),0))
R> MYDATA <- ore.push(myData)
R> head(MYDATA)
  a     b group
1 1 -0.63     4
2 2  0.18     6
3 3 -0.84     6
4 4  1.60     4
5 5  0.33     2
6 6 -0.82     6
R> sampleSize <- 10
R> stratifiedSample <- do.call(rbind,
+                              lapply(split(MYDATA, MYDATA$group),
+                                function(y) {
+                                  ny <- nrow(y)
+                                  y[sample(ny, sampleSize*ny/N), , drop = FALSE]
+                             }))
R> stratifiedSample
          a     b group
173|173 173  0.46     3
9|9       9  0.58     4
53|53    53  0.34     4
139|139 139 -0.65     4
188|188 188 -0.77     4
78|78    78  0.00     5
137|137 137 -0.30     5

例5-19 クラスタ・サンプリング

この例では、グループ全体がランダムに選択されるクラスタ・サンプリングを示します。この例では、グループに応じてデータを分割してから、グループ内でサンプリングし、1つのore.frameオブジェクトに行バインドします。生成されるサンプルには、6および7の2つのクラスタのデータが含まれます。

set.seed(1)
N <- 200
myData <- data.frame(a=1:N,b=round(runif(N),2),
                     group=round(rnorm(N,4),0))
MYDATA <- ore.push(myData)
head(MYDATA)
sampleSize <- 5
clusterSample <- do.call(rbind,
                         sample(split(MYDATA, MYDATA$group), 2))
unique(clusterSample$group)

この例のリスト

R> set.seed(1)
R> N <- 200
R> myData <- data.frame(a=1:N,b=round(runif(N),2),
+                       group=round(rnorm(N,4),0))
R> MYDATA <- ore.push(myData)
R> head(MYDATA)
  a    b group
1 1 0.27     3
2 2 0.37     4
3 3 0.57     3
4 4 0.91     4
5 5 0.20     3
6 6 0.90     6
R> sampleSize <- 5
R> clusterSample <- do.call(rbind,
+                           sample(split(MYDATA, MYDATA$group), 2))
R> unique(clusterSample$group)
[1] 6 7

例5-20 割当てサンプリング

この例では、サンプルとして連続したレコード番号が選択される割当てサンプリングを示します。この例では、head関数を使用してサンプルを選択します。tail関数も使用できます。

set.seed(1)
N <- 200
myData <- data.frame(a=1:N,b=round(runif(N),2))
MYDATA <- ore.push(myData)                     
sampleSize <- 10
quotaSample1 <- head(MYDATA, sampleSize)
quotaSample1

この例のリスト

R> set.seed(1)
R> N <- 200
R> myData <- data.frame(a=1:N,b=round(runif(N),2))
R> MYDATA <- ore.push(myData)                     
R> sampleSize <- 10
R> quotaSample1 <- head(MYDATA, sampleSize)
R> quotaSample1
    a    b
1   1 0.15
2   2 0.75
3   3 0.98
4   4 0.97
5   5 0.35
6   6 0.39
7   7 0.95
8   8 0.11
9   9 0.93
10 10 0.35

5.1.8 データのパーティション化

大規模なデータセットの分析での通常の操作は、データセットをランダムにサブセットにパーティション化することです。

次の例に示すとおり、OML4RのEmbedded R Executionを使用することでパーティションを分析できます。

例5-21 データのランダムなパーティション化

この例では、data.frameオブジェクトを記号myDataを付けてローカルのRセッションに作成し、ランダムに生成された値のセットを含むそのオブジェクトに列を追加します。このデータセットをオブジェクトMYDATAとしてデータベース・メモリーにプッシュします。この例では、Embedded R Execution関数ore.groupApplyをコールし、パーティション列に基づいてデータをパーティション化した後に、各パーティションにlm関数を適用します。

N <- 200
k <- 5
myData <- data.frame(a=1:N,b=round(runif(N),2))
myData$partition <- sample(rep(1:k, each = N/k,
                               length.out = N), replace = TRUE)
MYDATA <- ore.push(myData)
head(MYDATA)
results <- ore.groupApply(MYDATA, MYDATA$partition,
                          function(y) {lm(b~a,y)}, parallel = TRUE)
length(results)
results[[1]]
この例のリスト
R> N <- 200
R> k <- 5
R> myData <- data.frame(a=1:N,b=round(runif(N),2))
R> myData$partition <- sample(rep(1:k, each = N/k,
+                             length.out = N), replace = TRUE)
R> MYDATA <- ore.push(myData)
R> head(MYDATA)
  a    b partition
1 1 0.89         2
2 2 0.31         4
3 3 0.39         5
4 4 0.66         3
5 5 0.01         1
6 6 0.12         4
R> results <- ore.groupApply(MYDATA, MYDATA$partition,
+                            function(y) {lm(b~a,y)}, parallel = TRUE)
R> length(results)
[1] 5
R> results[[1]]
 
Call:
lm(formula = b ~ a, data = y)
 
Coefficients:
(Intercept)            a  
   0.388795     0.001015

5.1.9 時系列データの準備

OML4Rでは、時系列データに対して、データのフィルタ処理、順序付け、変換などの多数のデータの準備操作を実行できます。

OML4Rは、Rデータ型をSQLデータ型にマップすることで、OML4Rオブジェクトを作成し、データ準備操作をデータベース・メモリーで実行できます。次の例では、時系列データに対する操作の一部を示します。

例5-22 日時データの集計

この例では、統計集計関数をいくつか示します。最初に、データセットに対して、2001年全体に均等に分散された一連の日付をローカル・クライアントに500個生成します。次に、ランダムのdifftimeおよびランダムの正規値のベクターを使用します。その後、ore.push関数を使用してデータのインデータベース版であるMYDATAを作成します。この例では、MYDATAore.frameオブジェクトであること、およびdatetime列がクラスore.datetimeであることを示すためにclass関数をコールします。この例では、生成されたデータの最初の3行を表示します。次に、minmaxrangemedianおよびquantileの統計の集計操作をMYDATAdatetime列で使用します。

N <- 500
mydata <- data.frame(datetime = 
                seq(as.POSIXct("2001/01/01"),
                    as.POSIXct("2001/12/31"),
                    length.out = N),
                difftime = as.difftime(runif(N),
                                 units = "mins"),
                x = rnorm(N))
MYDATA <- ore.push(mydata)
class(MYDATA)
class(MYDATA$datetime)
head(MYDATA,3)
# statistical aggregations
min(MYDATA$datetime)
max(MYDATA$datetime)
range(MYDATA$datetime)
quantile(MYDATA$datetime,
         probs = c(0, 0.05, 0.10))

この例のリスト

R> N <- 500
R> mydata <- data.frame(datetime = 
+             seq(as.POSIXct("2001/01/01"),
+                 as.POSIXct("2001/12/31"),
+                 length.out = N),
+             difftime = as.difftime(runif(N),
+                              units = "mins"),
+             x = rnorm(N))
R> MYDATA <- ore.push(mydata)
R> class(MYDATA)
[1] "ore.frame"
attr(,"package")
[1] "OREbase"
R> class(MYDATA$datetime)
[1] "ore.datetime"
attr(,"package")
[1] "OREbase"
R> head(MYDATA,3)
             datetime       difftime           x
1 2001-01-01 00:00:00 16.436782 secs  0.68439244
2 2001-01-01 17:30:25  8.711562 secs  1.38481435
3 2001-01-02 11:00:50  1.366927 secs -0.00927078

R> # statistical aggregations
R> min(MYDATA$datetime)
[1] "2001-01-01 CST"
R> max(MYDATA$datetime)
[1] "2001-12-31 CST"
R> range(MYDATA$datetime)
[1] "2001-01-01 CST" "2001-12-31 CST"
R> quantile(MYDATA$datetime,
+           probs = c(0, 0.05, 0.10))
                       0%                        5%                       10% 
"2001-01-01 00:00:00 CST" "2001-01-19 04:48:00 CST" "2001-02-06 09:36:00 CST"

例5-23 日付および時間の計算の使用方法

この例では、前の例で作成したMYDATA ore.frameオブジェクトのdatetime列を使用し、1日分のdifftimeを追加することにより、1日分のずれを作成します。結果はday1Shiftで、この例の表示ではore.datetimeクラスです。この例では、MYDATAdatetime列およびday1Shiftの最初の3要素を表示します。day1Shiftの最初の要素は2001年1月2日です。

この例ではさらに、オーバーロードされたdiff関数を使用して遅れの差を計算します。MYDATAの500日は2001年全体で均等に分散されているため、日付間の差はすべて同じです。

day1Shift <- MYDATA$datetime + as.difftime(1, units = "days")
class(day1Shift)
head(MYDATA$datetime,3)
head(day1Shift,3)
lag1Diff <- diff(MYDATA$datetime)
class(lag1Diff)
head(lag1Diff,3)

この例のリスト

R> day1Shift <- MYDATA$datetime + as.difftime(1, units = "days")
R> class(day1Shift)
[1] "ore.datetime"
attr(,"package")
[1] "OREbase"
R> head(MYDATA$datetime,3)
[1] "2001-01-01 00:00:00 CST" "2001-01-01 17:30:25 CST" "2001-01-02 11:00:50 CST"
R> head(day1Shift,3)
[1] "2001-01-02 00:00:00 CST" "2001-01-02 17:30:25 CST" "2001-01-03 11:00:50 CST"
R> lag1Diff <- diff(MYDATA$datetime)
R> class(lag1Diff)
[1] "ore.difftime"
attr(,"package")
[1] "OREbase"
R> head(lag1Diff,3)
Time differences in secs
[1] 63025.25 63025.25 63025.25

例5-24 日付および時間の比較

この例では、日付および時間の比較を示します。この例では、最初の例で作成したMYDATAore.frameオブジェクトのdatetime列を使用します。この例では、2001年4月1日より前の日付を含むMYDATAの要素を選択します。生成されるisQ1はクラスore.logicalで、最初の3エントリの結果はTRUEです。この例では、isQ1に一致する日付が3月に何日あるかを検出します。次に、論理ベクターを集計して結果(3月には43行)を表示します。この例では次に、その年の12月27日以降の最後の日付に基づいて行をフィルタします。この結果はeoySubsetで、これはore.frameオブジェクトです。この例では、eoySubsetで返された最初の3行を表示します。

isQ1 <- MYDATA$datetime < as.Date("2001/04/01")
class(isQ1)
head(isQ1,3)
isMarch <- isQ1 & MYDATA$datetime > as.Date("2001/03/01")
class(isMarch)
head(isMarch,3)
sum(isMarch)
eoySubset <- MYDATA[MYDATA$datetime > as.Date("2001/12/27"), ]
class(eoySubset)
head(eoySubset,3)

この例のリスト

R> isQ1 <- MYDATA$datetime < as.Date("2001/04/01")
R> class(isQ1)
[1] "ore.logical"
attr(,"package")
[1] "OREbase"
R> head(isQ1,3)
[1] TRUE TRUE TRUE
R> isMarch <- isQ1 & MYDATA$datetime > as.Date("2001/03/01")
R> class(isMarch)
[1] "ore.logical"
attr(,"package")
[1] "OREbase"
R> head(isMarch,3)
[1] FALSE FALSE FALSE
R> sum(isMarch)
[1] 43
R> eoySubset <- MYDATA[MYDATA$datetime > as.Date("2001/12/27"), ]
R> class(eoySubset)
[1] "ore.frame"
attr(,"package")
[1] "OREbase"
R> head(eoySubset,3)
               datetime      difftime          x
495 2001-12-27 08:27:53 55.76474 secs -0.2740492
496 2001-12-28 01:58:18 15.42946 secs -1.4547270
497 2001-12-28 19:28:44 28.62195 secs  0.2929171

例5-25 日付および時間のアクセッサの使用方法

OML4Rには、datetimeオブジェクトから年、月、月の日付、時間、分、秒などの様々なコンポーネントの抽出に使用できるアクセッサ関数があります。この例では、これらの関数の使用方法を示します。この例では、最初の例で作成したMYDATAore.frameオブジェクトのdatetime列を使用します。

この例では、datetime列の年要素を取得します。unique関数をyearに対して呼び出すと、列内の唯一の年の値である2001が表示されます。ただし、値の範囲を持つore.mdayなどのオブジェクトの場合は、range関数は月の日付を返します。この結果には、1から31の間の値を持つベクターが含まれています。他のアクセッサ関数で示すように、range関数を呼び出すと、値の範囲が簡潔にレポートされます。

year <- ore.year(MYDATA$datetime)
unique(year)
month <- ore.month(MYDATA$datetime)
range(month)
dayOfMonth <- ore.mday(MYDATA$datetime)
range(dayOfMonth)
hour <- ore.hour(MYDATA$datetime)
range(hour)
minute <- ore.minute(MYDATA$datetime)
range(minute)
second <- ore.second(MYDATA$datetime)
range(second)

この例のリスト

R> year <- ore.year(MYDATA$datetime)
R> unique(year)
[1] 2001
R> month <- ore.month(MYDATA$datetime)
R> range(month)
[1]  1 12
R> dayOfMonth <- ore.mday(MYDATA$datetime)
R> range(dayOfMonth)
[1]  1 31
R> hour <- ore.hour(MYDATA$datetime)
R> range(hour)
[1]  0 23
R> minute <- ore.minute(MYDATA$datetime)
R> range(minute)
[1]  0 59
R> second <- ore.second(MYDATA$datetime)
R> range(second)
[1]  0.00000 59.87976

例5-26 日付および時間のデータ型の強制変換

この例では、as.oreサブクラス・オブジェクトを使用して、ore.datetimeデータ型を他のデータ型に強制変換します。この例では、最初の例で作成したMYDATAore.frameオブジェクトのdatetime列を使用します。この列にはore.datetime値が含まれています。この例では、最初にMYDATA$datetime列から日付を抽出します。生成されるdateOnlyオブジェクトには、年、月および日のみを含み時間を含まないore.date値が含まれます。この例では次に、ore.datetime値を、日の名前、年の日数および年の四半期を表すore.character値およびore.integer値を持つオブジェクトに強制変換します。

dateOnly <- as.ore.date(MYDATA$datetime)
class(dateOnly)
head(sort(unique(dateOnly)),3)
nameOfDay <- as.ore.character(MYDATA$datetime, format = "DAY")
class(nameOfDay)
sort(unique(nameOfDay))
dayOfYear <- as.integer(as.character(MYDATA$datetime, format = "DDD"))
class(dayOfYear)
range(dayOfYear)
quarter <- as.integer(as.character(MYDATA$datetime, format = "Q"))
class(quarter)
sort(unique(quarter))

この例のリスト

R> dateOnly <- as.ore.date(MYDATA$datetime)
R> class(dateOnly)[1] "ore.date"
attr(,"package")[1] "OREbase"
R> head(sort(unique(dateOnly)),3)
[1] "2001-01-01" "2001-01-02" "2001-01-03"
R> nameOfDay <- as.ore.character(MYDATA$datetime, format = "DAY")
R> class(nameOfDay)
[1] "ore.character"
attr(,"package")
[1] "OREbase"
R> sort(unique(nameOfDay))
[1] "FRIDAY " "MONDAY " "SATURDAY " "SUNDAY " "THURSDAY " "TUESDAY " "WEDNESDAY"
R> dayOfYear <- as.integer(as.character(MYDATA$datetime, format = "DDD"))
R> class(dayOfYear)
[1] "ore.integer"
attr(,"package")
[1] "OREbase"
R> range(dayOfYear)
[1]   1 365
R> quarter <- as.integer(as.character(MYDATA$datetime, format = "Q"))
R> class(quarter)
[1] "ore.integer"
attr(,"package")
[1] "OREbase"
R> sort(unique(quarter))
[1] 1 2 3 4

例5-27 ウィンドウ関数の使用方法

この例では、ウィンドウ関数ore.rollmeanおよびore.rollsdを使用して、ローリング平均およびローリング標準偏差を計算します。この例では、最初の例で作成したMYDATAore.frameオブジェクトを使用します。この例では、datetime列の値をMYDATAの行名として割り当てることで、MYDATAが順序付けられたore.frameであることを確認します。この例では、5期間のローリング平均およびローリング標準偏差を計算します。次に、statsパッケージでRの時系列機能を使用するために、クライアントにデータをプルします。クライアントにプルするデータを制限するために、3番目の例のベクターis.Marchを使用して3月をポイントするデータのみを選択します。この例では、ts関数を使用して時系列オブジェクトを作成し、Arimaモデルを構築し、3点を予測します。

row.names(MYDATA) <- MYDATA$datetime
MYDATA$rollmean5 <- ore.rollmean(MYDATA$x, k = 5)
MYDATA$rollsd5 <- ore.rollsd (MYDATA$x, k = 5)
head(MYDATA)
marchData <- ore.pull(MYDATA[isMarch,])
tseries.x <- ts(marchData$x)
arima110.x <- arima(tseries.x, c(1,1,0))
predict(arima110.x, 3)
tseries.rm5 <- ts(marchData$rollmean5)
arima110.rm5 <- arima(tseries.rm5, c(1,1,0))
predict(arima110.rm5, 3)

この例のリスト

R> row.names(MYDATA) <- MYDATA$datetime
R> MYDATA$rollmean5 <- ore.rollmean(MYDATA$x, k = 5)
R> MYDATA$rollsd5 <- ore.rollsd (MYDATA$x, k = 5)
R> head(MYDATA)
                               datetime       difftime
2001-01-01 00:00:00 2001-01-01 00:00:00 39.998460 secs
                                                     x   rollmean5   rollsd5
                                            -0.3450421 -0.46650761 0.8057575
                               datetime       difftime
2001-01-01 17:30:25 2001-01-01 17:30:25  37.75568 secs
                                                     x   rollmean5   rollsd5
                                            -1.3261019  0.02877517 1.1891384
                               datetime       difftime
2001-01-02 11:00:50 2001-01-02 11:00:50  18.44243 secs
                                                     x   rollmean5   rollsd5
                                             0.2716211 -0.13224503 1.0909515
                               datetime       difftime
2001-01-03 04:31:15 2001-01-03 04:31:15 38.594384 secs
                                                     x   rollmean5   rollsd5
                                             1.5146235  0.36307913 1.4674456
                               datetime       difftime
2001-01-03 22:01:41 2001-01-03 22:01:41  2.520976 secs
                                                     x   rollmean5   rollsd5
                                            -0.7763258  0.80073340 1.1237925
                               datetime       difftime
2001-01-04 15:32:06 2001-01-04 15:32:06 56.333281 secs 
                                                     x   rollmean5   rollsd5
                                             2.1315787  0.90287282 1.0862614
R> marchData <- ore.pull(MYDATA[isMarch,])
R> tseries.x <- ts(marchData$x)
R> arima110.x <- arima(tseries.x, c(1,1,0))
R> predict(arima110.x, 3)
$pred
Time Series:
Start = 44 
End = 46 
Frequency = 1 
[1] 1.4556614 0.6156379 1.1387587
 
$se
Time Series:
Start = 44 
End = 46 
Frequency = 1 
[1] 1.408117 1.504988 1.850830
 
R> tseries.rm5 <- ts(marchData$rollmean5)
R> arima110.rm5 <- arima(tseries.rm5, c(1,1,0))
R> predict(arima110.rm5, 3)
$pred
Time Series:
Start = 44 
End = 46 
Frequency = 1 
[1] 0.3240135 0.3240966 0.3240922
 
$se
Time Series:
Start = 44 
End = 46 
Frequency = 1 
[1] 0.3254551 0.4482886 0.5445763

5.2 データの探索

Oracle Machine Learning for Rには、探索的データ分析を実行できる関数があります。

これらの関数を使用して、一般的な統計操作を実行できます。

関数およびその使用について、次の各項で説明します。

5.2.1 探索的データ分析関数について

探索的データ分析用のOML4Rの関数は、OREedaパッケージにあります。

表5-1 OREedaパッケージの関数

関数 説明

ore.corr

ore.frameによる数値列の相関分析を実行します。

ore.crosstab

オプションの集計、重み付けおよび順序付けオプションで複数の列をサポートすることで、xtabs関数上で展開します。クロス集計の構築はore.freq関数の使用における前提条件です。

ore.esm

順序付けられたore.vectorオブジェクトのデータで指数平滑法モデルを構築します。

ore.freq

ore.crosstab関数からの出力を操作して、表に関連する手法を自動的に判断します。

ore.rank

ore.frameオブジェクトの数値列による値の分散の調査を可能にします。

ore.sort

ore.frameオブジェクトの柔軟なソートを提供します。

ore.summary

柔軟な行集約内のore.frameオブジェクトの記述統計を提供します。

ore.univariate

ore.frameオブジェクトの数値列の分布分析を提供します。ore.summary関数プラス符号順位検定および極値からすべての統計をレポートします。

5.2.2 サンプルのNARROWデータセットについて

探索的データ分析関数の多くの例で、NARROWデータセットを使用します。

NARROWは、次の例に示すとおり、9列および1500行のore.frameです。一部の列は数値で、それ以外の列もあります。

例5-28 NARROWデータ・セット

この例では、NARROWオブジェクトのクラス、ディメンションおよび名前を表示します。

R> class(NARROW)
R> dim(NARROW)
R> names(NARROW)

この例のリスト

R> class(NARROW)
[1] "ore.frame"
attr(,"package")
[1] "OREbase"
R> dim(NARROW)[1] 1500    9
R> names(NARROW)
[1] "ID"             "GENDER"         "AGE"            "MARITAL_STATUS"
[5] "COUNTRY"        "EDUCATION"      "OCCUPATION"     "YRS_RESIDENCE" 
[9] "CLASS"

5.2.3 データの相互関連付け

ore.corr関数を使用して相関分析を実行できます。

ore.corrを使用すると、次のことを実行できます。

  • ore.frameによる数値列のピアソン、スピアマンまたはケンドール相関分析を実行します。

  • 制御列を指定することによる部分相関を実行します。

  • 相関の前に一部のデータを集計します。

  • 結果を後処理して、Rコード・フローに統合します。

    ore.corr関数の出力をRのcor関数の出力に適合させることができ、これにより、任意のR関数を使用して出力を後処理したり、出力をグラフィック関数の入力として使用できます。

この関数の引数の詳細は、help(ore.corr)をコールしてください。

次の例にこれらの操作を示します。

例5-29 基本的な相関計算の実行

この例では、異なる種類の相関統計を指定する方法を示します。

# Before performing correlations, project out all non-numeric values 
# by specifying only the columns that have numeric values.
names(NARROW)
NARROW_NUMS <- NARROW[,c(3,8,9)]
names(NARROW_NUMS)
# Calculate the correlation using the default correlation statistic, Pearson.
x <- ore.corr(NARROW_NUMS,var='AGE,YRS_RESIDENCE,CLASS')
head(x, 3)
# Calculate using Spearman.
x <- ore.corr(NARROW_NUMS,var='AGE,YRS_RESIDENCE,CLASS', stats='spearman')
head(x, 3)
# Calculate using Kendall
x <- ore.corr(NARROW_NUMS,var='AGE,YRS_RESIDENCE,CLASS', stats='kendall')
head(x, 3)

この例のリスト

R> # Before performing correlations, project out all non-numeric values 
R> # by specifying only the columns that have numeric values.
R> names(NARROW)
 [1] "ID" "GENDER" "AGE" "MARITAL_STATUS" "COUNTRY" "EDUCATION" "OCCUPATION"
 [8] "YRS_RESIDENCE" "CLASS" "AGEBINS"
R> NARROW_NUMS <- NARROW[,c(3,8,9)]
R> names(NARROW_NUMS)
[1] "AGE" "YRS_RESIDENCE" "CLASS"

R> # Calculate the correlation using the default correlation statistic, Pearson.
R> x <- ore.corr(NARROW_NUMS,var='AGE,YRS_RESIDENCE,CLASS')
R> head(x, 3)
            ROW           COL PEARSON_T PEARSON_P PEARSON_DF
1           AGE         CLASS 0.2200960     1e-15       1298
2           AGE YRS_RESIDENCE 0.6568534     0e+00       1098
3 YRS_RESIDENCE         CLASS 0.3561869     0e+00       1298
R> # Calculate using Spearman.
R> x <- ore.corr(NARROW_NUMS,var='AGE,YRS_RESIDENCE,CLASS', stats='spearman')
R> head(x, 3)
            ROW           COL SPEARMAN_T SPEARMAN_P SPEARMAN_DF
1           AGE         CLASS  0.2601221      1e-15        1298
2           AGE YRS_RESIDENCE  0.7462684      0e+00        1098
3 YRS_RESIDENCE         CLASS  0.3835252      0e+00        1298
R> # Calculate using Kendall
R> x <- ore.corr(NARROW_NUMS,var='AGE,YRS_RESIDENCE,CLASS', stats='kendall')
R> head(x, 3)
            ROW           COL KENDALL_T    KENDALL_P KENDALL_DF
1           AGE         CLASS 0.2147107 4.285594e-31       <NA>
2           AGE YRS_RESIDENCE 0.6332196 0.000000e+00       <NA>
3 YRS_RESIDENCE         CLASS 0.3362078 1.094478e-73       <NA>

例5-30 相関マトリクスの作成

この例では、irisデータセットをデータベースの一時表にプッシュしますが、これにはプロキシore.frameオブジェクトのiris_ofがあります。種ごとにグループ化された相関マトリクスを作成します。

iris_of <- ore.push(iris)
x <- ore.corr(iris_of, var = "Sepal.Length, Sepal.Width, Petal.Length",
              partial = "Petal.Width", group.by = "Species")
 class(x)
 head(x)

この例のリスト

R> iris_of <- ore.push(iris)
R> x <- ore.corr(iris_of, var = "Sepal.Length, Sepal.Width, Petal.Length",
+                partial = "Petal.Width", group.by = "Species")
R> class(x)
[1] "list"
R> head(x)
$setosa
           ROW          COL PART_PEARSON_T PART_PEARSON_P PART_PEARSON_DF
1 Sepal.Length Petal.Length      0.1930601   9.191136e-02              47
2 Sepal.Length  Sepal.Width      0.7255823   1.840300e-09              47
3  Sepal.Width Petal.Length      0.1095503   2.268336e-01              47
 
$versicolor
           ROW          COL PART_PEARSON_T PART_PEARSON_P PART_PEARSON_DF
1 Sepal.Length Petal.Length     0.62696041   7.180100e-07              47
2 Sepal.Length  Sepal.Width     0.26039166   3.538109e-02              47
3  Sepal.Width Petal.Length     0.08269662   2.860704e-01              47
 
$virginica
           ROW          COL PART_PEARSON_T PART_PEARSON_P PART_PEARSON_DF
1 Sepal.Length Petal.Length      0.8515725   4.000000e-15              47
2 Sepal.Length  Sepal.Width      0.3782728   3.681795e-03              47
3  Sepal.Width Petal.Length      0.2854459   2.339940e-02              47

5.2.4 データのクロス集計

クロス集計は、値からなる2つの表の間の相互依存関係を見つける統計手法です。

ore.crosstab関数は、ore.frameのクロス列分析を可能にします。この関数は、Rのtable関数の高性能なバリアントです。

ore.freqを使用して頻度分析を実行する前にore.crosstab関数を使用する必要があります。

ore.crosstab関数呼出しの結果が単一のクロス集計の場合、この関数によってore.frameオブジェクトが返されます。結果が複数のクロス集計の場合は、この関数はore.frameオブジェクトのリストを返します。

この関数の引数の詳細は、help(ore.crosstab)をコールしてください。

例5-31 単一列頻度表の作成

最も基本的な使用例は、この例に示すとおり、単一列頻度表を作成することです。

この例では、GENDERによってグループ化されたNARROW ore.frameをフィルタします。

ct <- ore.crosstab(~AGE, data=NARROW)
head(ct)

この例のリスト

R> ct <- ore.crosstab(~AGE, data=NARROW)
R> head(ct)
   AGE ORE$FREQ ORE$STRATA ORE$GROUP
17  17       14          1         1
18  18       16          1         1
19  19       30          1         1
20  20       23          1         1
21  21       22          1         1
22  22       39          1         1

例5-32 2つの列の分析

この例では、GENDERによってAGEを、CLASSによってAGEを分析します。

ct <- ore.crosstab(AGE~GENDER+CLASS, data=NARROW)
head(ct)

この例のリスト

R> ct <- ore.crosstab(AGE~GENDER+CLASS, data=NARROW)
R> head(ct)
$`AGE~GENDER`
     AGE GENDER ORE$FREQ ORE$STRATA ORE$GROUP
17|F  17      F        5          1         1
17|M  17      M        9          1         1
18|F  18      F        6          1         1
18|M  18      M        7          1         1
19|F  19      F       15          1         1
19|M  19      M       13          1         1
# The remaining output is not shown.

例5-33 行の重み付け

行を重み付けするには、この例に示すように、別の列に基づいたカウントを含めます。この例では、YRS_RESIDENCEの値を使用してAGEおよびGENDERの値に重み付けします。

ct <- ore.crosstab(AGE~GENDER*YRS_RESIDENCE, data=NARROW)
head(ct)

この例のリスト

R> ct <- ore.crosstab(AGE~GENDER*YRS_RESIDENCE, data=NARROW)
R> head(ct)
     AGE GENDER ORE$FREQ ORE$STRATA ORE$GROUP
17|F  17      F        1          1         1
17|M  17      M        8          1         1
18|F  18      F        4          1         1
18|M  18      M       10          1         1
19|F  19      F       15          1         1
19|M  19      M       17          1         1

例5-34 クロス集計データの順序付け

クロス集計表の行の順序付けには、次に示すようないくつかの方法があります。

  • 分析対象の列によるデフォルトまたはNAMEの順序付け

  • 頻度カウントによるFREQの順序付け

  • -NAMEまたは-FREQは、順序を逆転します

  • INTERNALは、順序付けをバイパスします

この例では、頻度カウントによって順序付けした後、頻度カウントで順序を逆にします。

ct <- ore.crosstab(AGE~GENDER|FREQ, data=NARROW)
head(ct)
ct <- ore.crosstab(AGE~GENDER|-FREQ, data=NARROW)
head(ct)

この例のリスト

R> ct <- ore.crosstab(AGE~GENDER|FREQ, data=NARROW)
R> head(ct)
     AGE GENDER ORE$FREQ ORE$STRATA ORE$GROUP
66|F  66      F        1          1         1
70|F  70      F        1          1         1
73|M  73      M        1          1         1
74|M  74      M        1          1         1
76|F  76      F        1          1         1
77|F  77      F        1          1         1

R> ct <- ore.crosstab(AGE~GENDER|-FREQ, data=NARROW)
R> head(ct)
     AGE GENDER ORE$FREQ ORE$STRATA ORE$GROUP
27|M  27      M       33          1         1
35|M  35      M       28          1         1
41|M  41      M       27          1         1
34|M  34      M       26          1         1
37|M  37      M       26          1         1
28|M  28      M       25          1         1

例5-35 3つ以上の列の分析

この例では、3つ以上の列の分析を示します。結果は、SQLのGROUPING SETS句の実行に似ています。

ct <- ore.crosstab(AGE+COUNTRY~GENDER, NARROW)
head(ct)

この例のリスト

R> ct <- ore.crosstab(AGE+COUNTRY~GENDER, NARROW)
R> head(ct)
$`AGE~GENDER`
     AGE GENDER ORE$FREQ ORE$STRATA ORE$GROUP
17|F  17      F        5          1         1
17|M  17      M        9          1         1
18|F  18      F        6          1         1
18|M  18      M        7          1         1
19|F  19      F       15          1         1
19|M  19      M       13          1         1
# The rest of the output is not shown.
$`COUNTRY~GENDER`
                             COUNTRY GENDER ORE$FREQ ORE$STRATA ORE$GROUP
Argentina|F                Argentina      F       14          1         1
Argentina|M                Argentina      M       28          1         1
Australia|M                Australia      M        1          1         1
# The rest of the output is not shown.

例5-36 列の範囲の指定

この例に示すように、すべての列の名前を入力するかわりに、列の範囲を指定できます。

names(NARROW)
# Because AGE, MARITAL_STATUS and COUNTRY are successive columns, 
# you can simply do the following:
ct <- ore.crosstab(AGE-COUNTRY~GENDER, NARROW)
# An equivalent invocation is the following:
ct <- ore.crosstab(AGE+MARITAL_STATUS+COUNTRY~GENDER, NARROW)

この例のリスト

R> names(NARROW)
[1] "ID"             "GENDER"         "AGE"            "MARITAL_STATUS"
[5] "COUNTRY"        "EDUCATION"      "OCCUPATION"     "YRS_RESIDENCE" 
[9] "CLASS"    
R> # Because AGE, MARITAL_STATUS and COUNTRY are successive columns, 
R> # you can simply do the following:
R> ct <- ore.crosstab(AGE-COUNTRY~GENDER, NARROW)
R> # An equivalent invocation is the following:
R> ct <- ore.crosstab(AGE+MARITAL_STATUS+COUNTRY~GENDER, NARROW)

例5-37 別の列の値ごとに1つのクロス集計表の作成

この例では、別の列COUNTRYの一意の値ごとに1つのクロス集計表(AGE、GENDER)を作成します。

ct <- ore.crosstab(~AGE/COUNTRY, data=NARROW)
head(ct)

この例のリスト

R> ct <- ore.crosstab(~AGE/COUNTRY, data=NARROW)
R> head(ct)
                            AGE ORE$FREQ ORE$STRATA ORE$GROUP
Argentina|17                 17        1          1         1
Brazil|17                    17        1          1         3
United States of America|17  17       12          1        19
United States of America|18  18       16          1        19
United States of America|19  19       30          1        19
United States of America|20  20       23          1        19

例5-38 2つの列の値のセットごとに1つのクロス集計表の作成

(COUNTRY、GENDER)の一意の組合せごとに1つの(AGE、EDUCATION)表を作成するこの例に示すように、クロス集計を複数の列に拡張できます。

ct <- ore.crosstab(AGE~EDUCATION/COUNTRY+GENDER, data=NARROW)
head(ct)

この例のリスト

R> ct <- ore.crosstab(AGE~EDUCATION/COUNTRY+GENDER, data=NARROW)
R> head(ct)
                                   AGE EDUCATION ORE$FREQ ORE$STRATA ORE$GROUP
United States of America|F|17|10th  17      10th        3          1        33
United States of America|M|17|10th  17      10th        5          1        34
United States of America|M|17|11th  17      11th        1          1        34
Argentina|M|17|HS-grad              17   HS-grad        1          1         2
United States of America|M|18|10th  18      10th        1          1        34
United States of America|F|18|11th  18      11th        2          1        33

例5-39 階層化によるクロス集計の拡張

前の例のすべてのクロス集計表は、この例に示すように、階層化で拡張できます。

ct <- ore.crosstab(AGE~GENDER^CLASS, data=NARROW) 
head(ct)
R> head(ct)
# The previous function invocation is the same as the following:
ct <- ore.crosstab(AGE~GENDER, NARROW, strata="CLASS")

この例のリスト

R> ct <- ore.crosstab(AGE~GENDER^CLASS, data=NARROW) 
R> head(ct)
R> head(ct)
       AGE GENDER ORE$FREQ ORE$STRATA ORE$GROUP
0|17|F  17      F        5          1         1
0|17|M  17      M        9          1         1
0|18|F  18      F        6          1         1
0|18|M  18      M        7          1         1
0|19|F  19      F       15          1         1
0|19|M  19      M       13          1         1
# The previous function invocation is the same as the following:
ct <- ore.crosstab(AGE~GENDER, NARROW, strata="CLASS")

例5-40 ビニングおよびその後のクロス集計

この例では、AGEによってカスタム・ビニングを実行した後、GENDERおよびビンのクロス集計を計算します。

NARROW$AGEBINS <- ifelse(NARROW$AGE<20, 1, ifelse(NARROW$AGE<30,2,
                  ifelse(NARROW$AGE<40,3,4)))
ore.crosstab(GENDER~AGEBINS, NARROW)

この例のリスト

R> NARROW$AGEBINS <- ifelse(NARROW$AGE<20, 1, ifelse(NARROW$AGE<30,2,
+                    ifelse(NARROW$AGE<40,3,4)))
R> ore.crosstab(GENDER~AGEBINS, NARROW)
    GENDER AGEBINS ORE$FREQ ORE$STRATA ORE$GROUP
F|1      F       1       26          1         1
F|2      F       2      108          1         1
F|3      F       3       86          1         1
F|4      F       4      164          1         1
M|1      M       1       29          1         1
M|2      M       2      177          1         1
M|3      M       3      230          1         1
M|4      M       4      381          1         1

5.2.5 クロス集計の頻度の分析

ore.freq関数は、ore.crosstab関数の出力を分析し、ore.crosstabの結果に関連する手法を自動的に判別します。

この手法は、次に示すようなクロス集計表の種類に応じて異なります。

  • 2方向のクロス集計表

    • クロス集計における列の間の関係を記述する様々な統計

    • カイ二乗検定、Cochran-Mantel-Haenzsel統計、属性相関、関連の強固性、リスクの相違、オッズ比および2x2表の相対リスク、トレンドの検定

  • N方向のクロス集計表

    • N 2方向のクロス集計表

    • 階層内または階層にわたる統計

ore.freq関数は、使用可能な場合はOracle DatabaseのSQL関数を使用します。

ore.freq関数は、すべての場合にore.frameを返します。

ore.freqを使用する前に、次の例に従ってクロス集計を計算する必要があります。

この関数の引数の詳細は、help(ore.freq)をコールしてください。

例5-41 ore.freq関数の使用方法

この例では、irisデータセットをデータベースにプッシュし、ore.frameオブジェクトのiris_ofを取得します。この例では、クロス集計を取得し、そこでore.freq関数をコールします。

IRIS <- ore.push(iris)
ct <- ore.crosstab(Species ~ Petal.Length + Sepal.Length, data = IRIS)
ore.freq(ct)

この例のリスト

R> IRIS <- ore.push(iris)
R> ct <- ore.crosstab(Species ~ Petal.Length + Sepal.Length, data = IRIS)
R> ore.freq(ct)
$`Species~Petal.Length`
  METHOD     FREQ DF       PVALUE              DESCR GROUP
1 PCHISQ 181.4667 84 3.921603e-09 Pearson Chi-Square     1
 
$`Species~Sepal.Length`
  METHOD  FREQ DF      PVALUE              DESCR GROUP
1 PCHISQ 102.6 68 0.004270601 Pearson Chi-Square     1

5.2.6 時系列データでの指数平滑法モデルの構築

ore.esm関数は、順序付けられたore.vectorオブジェクトで、インデータベース時系列観測のための単純または二重の指数平滑化モデルを構築します。

この関数は、時系列データ(観測が固定された均等な間隔)、またはトランザクション・データ(観測が均等な間隔ではない)で動作します。この関数は、トランザクション・データを指定された時間間隔で集計でき、モデル化フェーズに移る前に指定された方法で欠損値を処理することもできます。

ore.esm関数は、データベース・サーバーで動作している1つ以上のRエンジンのデータを処理します。この関数は、クラスore.esmのオブジェクトを返します。

predictメソッドを使用して、ore.esmによって構築される指数平滑法モデルの時系列を予測します。forecastパッケージをロード済の場合は、forecastメソッドをore.esmオブジェクトで使用できます。適合メソッドを使用して、トレーニングの時系列データセットの適合値を生成できます。

ore.esm関数の引数の詳細は、help(ore.esm)をコールしてください。

例5-42 二重指数平滑法モデルの構築

この例では、統合時系列データセットに基づいて二重指数平滑法モデルを構築します。予測および適合値を生成するために、predict関数およびfitted関数がそれぞれ呼び出されます。次の図に、観測、適合値および予測を示します。

N <- 5000
ts0 <- ore.push(data.frame(ID=1:N,
                           VAL=seq(1,5,length.out=N)^2+rnorm(N,sd=0.5)))
rownames(ts0) <- ts0$ID
x <- ts0$VAL
esm.mod <- ore.esm(x, model = "double")
esm.predict <- predict(esm.mod, 30)
esm.fitted <- fitted(esm.mod, start=4000, end=5000)
plot(ts0[4000:5000,], pch='.')
lines(ts0[4000:5000, 1], esm.fitted, col="blue")
lines(esm.predict, col="red", lwd=2)

図5-1 esm.modモデルに基づいた適合値および予測値

図5-1の説明が続きます
「図5-1 esm.modモデルに基づいた適合値および予測値」の説明

例5-43 トランザクション・データを使用した時系列モデルの構築

この例では、トランザクション・データセットに基づいて単純平滑法モデルを構築します。事前処理として、平均を取ることで値を日レベルで集計し、欠損値に以前の集計値を設定して埋めます。このモデルは次に、集計された日次時系列に構築されます。関数predictは、日毎に予測値を生成するためにコールされます。

ts01 <- data.frame(ID=seq(as.POSIXct("2008/6/13"), as.POSIXct("2011/6/16"), 

                   length.out=4000), VAL=rnorm(4000, 10))

ts02 <- data.frame(ID=seq(as.POSIXct("2011/7/19"), as.POSIXct("2012/11/20"),

                   length.out=1500), VAL=rnorm(1500, 10))

ts03 <- data.frame(ID=seq(as.POSIXct("2012/12/09"), as.POSIXct("2013/9/25"),

                   length.out=1000), VAL=rnorm(1000, 10))

ts1 = ore.push(rbind(ts01, ts02, ts03))

rownames(ts1) <- ts1$ID

esm.mod <- ore.odmESM(VAL~., ts1, odm.settings = list(case_id_column_name = "ID", exsm_interval = "EXSM_INTERVAL_DAY",  EXSM_ACCUMULATE = "EXSM_ACCU_AVG", EXSM_MODEL="EXSM_SIMPLE", EXSM_SETMISSING = "EXSM_MISS_PREV"))

esm.predict <- esm.mod$prediction

esm.predict

この例のリスト

R> ts01 <- data.frame(ID=seq(as.POSIXct("2008/6/13"), as.POSIXct("2011/6/16"), 

                   length.out=4000), VAL=rnorm(4000, 10))

R> ts02 <- data.frame(ID=seq(as.POSIXct("2011/7/19"), as.POSIXct("2012/11/20"),

                   length.out=1500), VAL=rnorm(1500, 10))

R> ts03 <- data.frame(ID=seq(as.POSIXct("2012/12/09"), as.POSIXct("2013/9/25"),

                   length.out=1000), VAL=rnorm(1000, 10))

R> ts1 = ore.push(rbind(ts01, ts02, ts03))

R> rownames(ts1) <- ts1$ID

R> esm.mod <- ore.odmESM(VAL~., ts1, odm.settings = list(case_id_column_name = "ID", exsm_interval = "EXSM_INTERVAL_DAY",  EXSM_ACCUMULATE = "EXSM_ACCU_AVG", EXSM_MODEL="EXSM_SIMPLE", EXSM_SETMISSING = "EXSM_MISS_PREV"))

R> esm.predict <- esm.mod$prediction

R> esm.predict
           ID      VAL
1  2013-09-26 9.962478
2  2013-09-27 9.962478
3  2013-09-28 9.962478
4  2013-09-29 9.962478
5  2013-09-30 9.962478
6  2013-10-01 9.962478
7  2013-10-02 9.962478
8  2013-10-03 9.962478
9  2013-10-04 9.962478
10 2013-10-05 9.962478
11 2013-10-06 9.962478
12 2013-10-07 9.962478

例5-44 間隔を指定した二重指数平滑法モデルの構築

この例では、TTRパッケージの株のデータを使用します。これは、日ごとの株の終値に基づいて二重指数平滑法モデルを構築します。30日間の予測株価および元の観測を次の図に示します。

library(TTR)
stock_list <- c("ORCL") 
start_date <- Sys.Date()-365
end_date <- Sys.Date()
getSymbols(stock_list, verbose = TRUE, src = "yahoo",from=start_date,to=end_date)
xts.data <- get(stock_list)
df.data <- data.frame(xts.data)
df.data$date <- index(xts.data)
of.data <- ore.push(df.data[, c("date", "ORCL.Close")])
rownames(of.data) <- of.data$date
esm.mod <- ore.odmESM(ORCL.Close~., of.data, odm.settings = list(case_id_column_name = "date", exsm_interval = "EXSM_INTERVAL_DAY",EXSM_MODEL="EXSM_SIMPLE"))
value <- ore.pull(summary(esm.mod)$prediction$"PREDICTION")
esm.fitted=value[1:251]
esm.predict <- value[251:252]
plot(esm.fitted,type="l")
lines(251:252,esm.predict,col="red",lwd=4)

5.2.7 データのランキング

ore.rank関数は、ore.frameの数値列の値の分布を分析します。

ore.rank関数では、次のような便利な機能がサポートされています。

  • グループ内のランキング

  • ランク・タイルに基づいた、グループへの行のパーティショニング

  • 累積パーセンテージおよびパーセンタイルの計算

  • 同順位の処理

  • ランクからの標準スコアの計算

ore.rank関数の構文は、対応するSQL問合せより単純です。

ore.rank関数は、すべてのインスタンスでore.frameを返します。

次のRスコアリング・メソッドをore.rankとともに使用できます。

  • ランクから指数スコアを計算するには、savageを使用します。

  • 正規スコアを計算するには、blomtukeyまたはvw (ファン・デル・ヴェルデン)のいずれかを使用します。

この関数の引数の詳細は、help(ore.rank)をコールしてください。

次の例では、ore.rankの使用方法を示します。この例では、NARROWデータセットを使用します。

例5-45 2つの列のランキング

この例では、2つの列AGEおよびCLASSをランキングし、派生列としてその結果をレポートします。値は、デフォルトの順序(昇順)でランキングされます。

x <- ore.rank(data=NARROW, var='AGE=RankOfAge, CLASS=RankOfClass')

例5-46 ランキングでの同順位の処理

この例では、2つの列AGEとCLASSをランキングします。同順位がある場合、同順位のすべての値に最小値が割り当てられます。

x <- ore.rank(data=NARROW, var='AGE=RankOfAge, CLASS=RankOfClass', ties='low')

例5-47 グループ内のランキング

この例では、2つの列AGEおよびCLASSをランキングし、その結果の値をCOUNTRYに従ってランキングします。

x <- ore.rank(data=NARROW, var='AGE=RankOfAge, CLASS=RankOfClass', group.by='COUNTRY')

例5-48 十分位数へのパーティション化

列を異なる数のパーティションにパーティショニングするには、groupsの値を変更します。たとえば、groups=4では、四分位数にパーティショニングされます。この例では、2つの列AGEおよびCLASSをランキングし、その列を十分位数(10パーティション)にパーティショニングします。

x <- ore.rank(data=NARROW, var='AGE=RankOfAge, CLASS=RankOfClass',groups=10)

例5-49 累積分布関数の見積り

この例では、2つの列AGEおよびCLASSをランキングし、両方の列の累積分布関数を見積もります。

x <- ore.rank(data=NARROW, var='AGE=RankOfAge, CLASS=RankOfClass',nplus1=TRUE)

例5-50 ランクのスコアリング

この例では、2つの列AGEとCLASSをランキングし、2つの異なる方法でそのランクをスコアリングします。最初のコマンドは、列を百分位数(100グループ)にパーティショニングします。savageスコアリング・メソッドが指数スコアを計算し、blomスコアリングが正規スコアを計算します。

x <- ore.rank(data=NARROW, var='AGE=RankOfAge, 
          CLASS=RankOfClass', score='savage', groups=100, group.by='COUNTRY')
x <- ore.rank(data=NARROW, var='AGE=RankOfAge, CLASS=RankOfClass', score='blom')

5.2.8 データのソート

ore.sort関数は、by引数で指定した1つ以上の列によるデータ・フレームの柔軟なソートを可能にします。

ore.sort関数は、他のデータ事前処理関数とともに使用できます。ソートの結果を、Rの視覚化への入力に使用できます。

ore.sort関数によるソートは、Oracleデータベースで実行されます。ore.sort関数は、データベースのnls.sortオプションをサポートします。

ore.sort関数は、ore.frameを返します。

この関数の引数の詳細は、help(ore.sort)をコールしてください。

次のほとんどの例では、NARROWデータセットを使用します。一部の例では、ONTIME_Sデータセットを使用します。

例5-51 降順での列のソート

この例では、列AGEおよびGENDERを降順でソートします。

x <- ore.sort(data=NARROW, by='AGE,GENDER', reverse=TRUE)

例5-52 列ごとに異なる順序でのソート

この例では、AGEを降順で、GENDERを昇順でソートします。

x <- ore.sort(data=NARROW, by='-AGE,GENDER')

例5-53 ソートおよび一意の値ごとに1行を返す

この例では、AGEを基準にソートし、AGEの一意の値ごとに1行を保持します。

x <- ore.sort(data=NARROW, by='AGE', unique.key=TRUE)

例5-54 重複列の削除

この例では、AGEを基準にソートし、重複する行を削除します。

x <- ore.sort(data=NARROW, by='AGE', unique.data=TRUE)

例5-55 重複列の削除および一意の値ごとに1行を返す

この例では、AGEを基準にソートし、重複する行を削除して、AGEの一意の値ごとに1行を返します。

x <- ore.sort(data=NARROW, by='AGE', unique.data=TRUE, unique.key = TRUE)

例5-56 出力での相対順序の維持

この例では、ソートされた出力で相対順序を維持します。

x <- ore.sort(data=NARROW, by='AGE', stable=TRUE)

例5-57 2つの列の異なる順序でのソート

この例では、ONTIME_Sをエアライン名を基準に降順で、出発の遅延を昇順でソートします。

sortedOnTime1 <- ore.sort(data=ONTIME_S, by='-UNIQUECARRIER,DEPDELAY')

例5-58 2つの列の異なる順序でのソートおよび一意の組合せの生成

この例では、ONTIME_Sをエアライン名と出発の遅延を基準にソートし、各組合せの1つを選択します(つまり、一意のキーを返します)。

sortedOnTime1 <- ore.sort(data=ONTIME_S, by='-UNIQUECARRIER,DEPDELAY', 
                          unique.key=TRUE)

5.2.9 ore.summaryによるデータの集計

ore.summary関数は、記述統計を計算し、柔軟な行の集計とともに、ore.frame内の列の広範な分析をサポートします。

ore.summary関数では、次の統計がサポートされています。

  • 平均、最小、最大、モード、欠損値の数、合計、加重和

  • 二乗の補正および未補正合計、値の範囲、stddevstderrvariance

  • 母平均が0であるという仮定をテストするためのt検定

  • 尖度、歪度、変動係数

  • 分位: p1、p5、p10、p25、p50、p75、p90、p95、p99、qrange

  • 平均の片側および両側信頼限界: clmrclmlclm

  • 極値のタグ付け

ore.summary関数は、同じ結果を生成するSQL問合せと比べて比較的単純な構文を提供します。

ore.summary関数は、group.by引数が使用されている場合を除くすべての場合にore.frameを返します。group.by引数が使用されている場合、ore.summaryは、階層ごとにore.frameを1つずつore.frameオブジェクトのリストを返します。

この関数の引数の詳細は、help(ore.summary)をコールしてください。

例5-59 デフォルトの統計の計算

この例では、列AGEおよびCLASSの平均値、最小値および最大値を計算し、GENDER列をロールアップ(集計)します。

ore.summary(NARROW, class = 'GENDER', var = c('AGE', 'CLASS'), order = 'freq')

例5-60 歪度およびt-検定の可能性の計算

この例では、AGEの歪度と、CLASSのスチューデントのt分布の可能性を計算します。

ore.summary(NARROW, class = 'GENDER', var = c('AGE', 'CLASS'), c('skew', 'probt'))

例5-61 重み付け合計の計算

この例では、YRS_RESIDENCEを重みとしてGENDERによって集計されたAGEの重み付けされた合計を計算します。つまりsum(var*weight)を計算します。

ore.summary(NARROW, class = 'GENDER', var = 'AGE', stats = 'sum', weight = 'YRS_RESIDENCE')

例5-62 2つの列によるグループ化

この例では、GENDERおよびMARITAL_STATUSでCLASSをグループ化します。

ore.summary(NARROW, class = c('GENDER', 'MARITAL_STATUS'), var = 'CLASS', ways = 1)

例5-63 すべての適用可能な方法でのグループ化

この例では、GENDERおよびMARITAL_STATUSによってすべての適用可能な方法でCLASSをグループ化します。

ore.summary(NARROW, class = c('GENDER', 'MARITAL_STATUS'), var = 'CLASS', ways = 0:length(NARROW['CLASS']))

例5-64 ore.summaryを使用した列の最大値の取得

この例では、IRIS ore.frame内のSepal.Length列とSepal.Width列の最大値および対応する種をリストします。

IRIS <- ore.push(iris)
ore.summary(IRIS, c("Sepal.Length", "Sepal.Width"), 
                    "max", 
                    maxid=c(Sepal.Length="Species", Sepal.Width="Species"))

この例のリスト

R> IRIS <- ore.push(iris)
R> ore.summary(IRIS, c("Sepal.Length", "Sepal.Width"),
+                      "max",
+                      maxid=c(Sepal.Length="Species", Sepal.Width="Species"))
  FREQ MAX(Sepal.Length) MAX(Sepal.Width) MAXID(Sepal.Length->Species) MAXID(Sepal.Width->Species)
1  150               7.9              4.4                    virginica                      setosa
Warning message:
ORE object has no unique key - using random order 

5.2.10 数値変数の分布の分析

ore.univariate関数は、ore.frameの数値変数の分布分析を提供します。

ore.univariate関数では、次の統計が提供されています。

  • summary関数によってレポートされるすべての統計

  • 符号順位検定、スチューデントのt-検定

  • 極値のレポート

ore.univariate関数は、すべての場合に出力としてore.frameを返します。

この関数の引数の詳細は、help(ore.univariate)をコールしてください。

例5-65 デフォルトの単変量統計の計算

この例では、AGE、YRS_RESIDENCEおよびCLASSのデフォルトの単変量統計を計算します。

ore.univariate(NARROW, var="AGE,YRS_RESIDENCE,CLASS")

例5-66 デフォルトの単変量統計の計算

この例では、YRS_RESIDENCEの位置統計を計算します。

ore.univariate(NARROW, var="YRS_RESIDENCE", stats="location")

例5-67 完全な分位統計の計算

この例では、AGEおよびYRS_RESIDENCEの完全な分位統計を計算します。

ore.univariate(NARROW, var="AGE,YRS_RESIDENCE",stats="quantiles")

5.2.11 主要コンポーネント分析

オーバーロードされたprcompおよびprincomp関数は、主要コンポーネント分析をデータベースで並行して実行します。

prcomp関数では、変数間の共分散および相関の特異値分解が使用されます。princomp関数では、サンプル間の共分散および相関の固有分解が使用されます。

透過層メソッドore.frame-prcompおよびore.frame-princompを使用すると、ore.frameオブジェクト内のデータに対して汎用関数prcompおよびprincompを使用できます。これにより、これらの関数をデータベースでパラレル・プロセスで実行できます。

どちらの関数についても、これらのメソッドは、x引数としてore.frameを受け取る関数シグネチャおよび式を受け取るシグネチャをサポートします。ore.frameには、数値データのみが含まれている必要があります。式は、数値変数のみを参照し、レスポンス変数が含まれていないことが必要です。

関数prcompprcompオブジェクトを返し、関数princompprincompオブジェクトを返します。

この関数の引数の詳細は、help(princomp)をコールしてください。

ノート:

biplot 関数は、これらの透過層メソッドによって返されるオブジェクトではサポートされていません。

例5-68 princomp関数の使用

USARRESTS <- ore.push(USArrests)

princomp(USARRESTS)
princomp(USARRESTS, scale. = TRUE)

# Formula interface
princomp(~ Murder + Assault + UrbanPop, data = USARRESTS, scale. = TRUE)

princomp(USARRESTS)
princomp(USARRESTS, cor = TRUE)

# Formula interface
princomp(~ Murder + Assault + UrbanPop, data = USARRESTS, cor = TRUE)

この例のリスト

R> USARRESTS <- ore.push(USArrests)

Standard deviations:
[1] 83.732400 14.212402  6.489426  2.482790

Rotation:
                PC1         PC2         PC3         PC4
Murder   0.04170432 -0.04482166  0.07989066 -0.99492173
Assault  0.99522128 -0.05876003 -0.06756974  0.03893830
UrbanPop 0.04633575  0.97685748 -0.20054629 -0.05816914
Rape     0.07515550  0.20071807  0.97408059  0.07232502

R> prcomp(USARRESTS, scale. = TRUE)
Standard deviations:
[1] 1.5748783 0.9948694 0.5971291 0.4164494

Rotation:
               PC1        PC2        PC3         PC4
Murder   0.5358995 -0.4181809  0.3412327  0.64922780
Assault  0.5831836 -0.1879856  0.2681484 -0.74340748
UrbanPop 0.2781909  0.8728062  0.3780158  0.13387773
Rape     0.5434321  0.1673186 -0.8177779  0.08902432
R> 
R> # Formula interface
R> prcomp(~ Murder + Assault + UrbanPop, data = USARRESTS, scale. = TRUE)
Standard deviations:
[1] 1.3656547 0.9795415 0.4189100

Rotation:
               PC1         PC2        PC3
Murder   0.6672955 -0.30345520  0.6801703
Assault  0.6970818 -0.06713997 -0.7138411
UrbanPop 0.2622854  0.95047734  0.1667309
R>
R> # Using princomp
R>
R> princomp(USARRESTS)
Call:
princomp(USARRESTS)

Standard deviations:
   Comp.1    Comp.2    Comp.3    Comp.4 
82.890847 14.069560  6.424204  2.457837 

 4  variables and  50 observations.
R> princomp(USARRESTS, cor = TRUE)
Call:
princomp(USARRESTS, cor = TRUE)

Standard deviations:
   Comp.1    Comp.2    Comp.3    Comp.4 
1.5748783 0.9948694 0.5971291 0.4164494 

 4  variables and  50 observations.
R> 
R> # Formula interface
R> princomp(~ Murder + Assault + UrbanPop, data = USARRESTS, cor = TRUE)
Call:
princomp(~Murder + Assault + UrbanPop, data = USARRESTS, cor = TRUE)

Standard deviations:
   Comp.1    Comp.2    Comp.3 
1.3656547 0.9795415 0.4189100 

 3  variables and  50 observations.

5.2.12 特異値分解

オーバーロードされたsvd関数は、特異値分解をデータベースで並行して実行します。

svd関数は、ore.frameまたはore.tblmatrixオブジェクトをx引数として受け取ります。ore.odmSVDメソッドは、データベースで実行されるパラレル・プロセスにブロックSVD計算を分散します。このメソッドは、グローバル・オプションore.parallelを使用して、採用する並列度を決定します。

この関数は、引数xの特異値分解のdベクターおよびv行列成分を含むlistオブジェクトを返します。左特異ベクター行列uは返さないため、引数nuは使用されません。

この関数の引数の詳細は、help(ore.odmSVD)をコールしてください。

例5-69 svd関数の使用方法

IRIS <- ore.push(cbind(Id = seq_along(iris[[1L]]), iris))
     
     svd.mod <- ore.odmSVD(~. -Id, IRIS)
     summary(svd.mod)
     d(svd.mod)
     v(svd.mod)
     head(predict(svd.mod, IRIS, supplemental.cols = "Id"))
     
     svd.pmod <- ore.odmSVD(~. -Id, IRIS, 
                   odm.settings = list(odms_partition_columns = "Species"))
     summary(svd.pmod)
     d(svd.pmod)
     v(svd.pmod)
     head(predict(svd.pmod, IRIS, supplemental.cols = "Id"))

この例のリスト

R> summary(svd.pmod)
     R> d(svd.pmod)
     R> v(svd.pmod)
     R> head(predict(svd.pmod, IRIS, supplemental.cols = "Id"))
Call:
ore.odmSVD(formula = ~. - Id, data = IRIS)

Settings: 
                                               value
odms.details                             odms.enable
odms.missing.value.treatment odms.missing.value.auto
odms.sampling                  odms.sampling.disable
prep.auto                                         ON
scoring.mode                             scoring.svd
u.matrix.output                     u.matrix.disable

d: 
  FEATURE_ID      VALUE
1          1 96.2182677
2          2 19.0780817
3          3  7.2270380
4          4  3.1502152
5          5  1.8849634
6          6  1.1474731
7          7  0.5814097
v: 
  ATTRIBUTE_NAME ATTRIBUTE_VALUE        '1'         '2'          '3'
1   Petal.Length            <NA> 0.51162932  0.65943465 -0.004420703
2    Petal.Width            <NA> 0.16745698  0.32071102  0.146484369
3   Sepal.Length            <NA> 0.74909171 -0.26482593 -0.102057243
4    Sepal.Width            <NA> 0.37906736 -0.50824062  0.142810811
5        Species          setosa 0.03170407 -0.32247642  0.184499940
6        Species      versicolor 0.04288799  0.04054823 -0.780684855
7        Species       virginica 0.05018593  0.16796988  0.551546107
          '4'         '5'         '6'          '7'
1  0.05479795 -0.51969015  0.17392232 -0.005674672
2  0.46553390  0.72685033  0.31962337 -0.021274748
3 -0.49272847  0.31969417 -0.09379235 -0.067308615
4  0.69139828 -0.25849391 -0.17606099 -0.041908520
5 -0.12245506 -0.14348647  0.76017824  0.497502783
6  0.19827972  0.07363250 -0.12354271  0.571881302
7 -0.07177990  0.08109974 -0.48442099  0.647048040

5.3 OREdplyrを使用したデータ操作

OREdplyrパッケージ関数は、ore.frameおよびore.numericオブジェクトで使用するdplyr関数を透過的に実装します。

これらの多くの関数には、標準以外の評価(NSE)および標準の評価(SE)インタフェースが含まれます。SE関数では、関数名にアンダースコア( _)が追加されます。NSE関数は、インタラクティブRセッションで役立ちます。SE関数は、プログラムでの使用に便利です。

OREdplyrパッケージの関数は、次のトピックで説明します。

5.3.1 データの選択および順序付け

ore.frameオブジェクトの列と行のデータを選択および順序付けするOREdplyr関数。

表5-2 列と行の選択および順序付け

関数 説明

arrange

arrange_

指定された列で行を順序付けします。

desc

降順でore.numberore.factorまたはore.characterオブジェクトをソートします

distinct

distinct_

指定された列で入力ore.frameオブジェクトの一意の行を選択します。

filter

filter_

指定された条件と一致する行をフィルタします。

mutate

mutate_

新しい列を追加します。

rename

rename_

指定された列の名前を変更し、すべての列を保持します。

select

select_

指定された列のみを選択します。

slice

slice_

位置で行を選択します。順序付けられた入力ore.frameオブジェクトのグループ化を無視します。

tranmute

tranmute_

新しい列を追加し、既存の列を削除します。

これらの関数の使用例を次に示します。

5.3.1.1 列の選択例

OREdplyrパッケージのselectおよびrename関数の例。

例5-70 列の選択

次の例では、iris data.frameオブジェクトでore.push関数を使用して作成されるIRIS ore.frameオブジェクトの列を選択します。

IRIS <- ore.push(iris)
# Select the specified column
names(select(IRIS, Petal.Length))
names(select(IRIS, petal_length = Petal.Length))

# Drop the specified column
names(select(IRIS, -Petal.Length))

# rename() keeps all variables
names(rename(IRIS, petal_length = Petal.Length))

この例のリスト


R> IRIS <- ore.push(iris)
R> # Select the specified column
R> names(select(IRIS, Petal.Length))
[1] "Petal.Length"
R> names(select(IRIS, petal_length = Petal.Length))
[1] "petal_length"
R>
R> # Drop the specified column
R> names(select(IRIS, -Petal.Length))
[1] "Sepal.Length" "Sepal.Width"  "Petal.Width"  "Species" 
R>
R> # rename() keeps all variables
R> names(rename(IRIS, petal_length = Petal.Length))
[1] "Sepal.Length" "Sepal.Width"  "petal_length" "Petal.Width"  "Species"
5.3.1.2 select_を使用したプログラミング例

OREdplyrパッケージのselect_関数の例。

例5-71 selectを使用したプログラミング

次の例では、select_関数を使用して、iris data.frameオブジェクトでore.push関数を使用して作成されるIRIS ore.frameオブジェクトの列を選択します。

IRIS <- ore.push(iris)
# Use ~, double quote, or quote function to specify the column to select
head(select_(IRIS, ~Petal.Length))
head(select_(IRIS, "Petal.Length"))
head(select_(IRIS, quote(-Petal.Length), quote(-Petal.Width)))
head(select_(IRIS, .dots = list(quote(-Petal.Length), quote(-Petal.Width))))

この例のリスト

R> IRIS <- ore.push(iris)
R> # Use ~, double quote, or quote function to specify the column to select
R> head(select_(IRIS, ~Petal.Length))
  Petal.Length
1          1.4
2          1.4
3          1.3
4          1.5
5          1.4
6          1.7
R> head(select_(IRIS, "Petal.Length"))
  Petal.Length
1          1.4
2          1.4
3          1.3
4          1.5
5          1.4
6          1.7
R> head(select_(IRIS, quote(-Petal.Length), quote(-Petal.Width)))
  Sepal.Length Sepal.Width Species
1          5.1         3.5  setosa
2          4.9         3.0  setosa
3          4.7         3.2  setosa
4          4.6         3.1  setosa
5          5.0         3.6  setosa
6          5.4         3.9  setosa
R> head(select_(IRIS, .dots = list(quote(-Petal.Length), quote(-Petal.Width))))
  Sepal.Length Sepal.Width Species
1          5.1         3.5  setosa
2          4.9         3.0  setosa
3          4.7         3.2  setosa
4          4.6         3.1  setosa
5          5.0         3.6  setosa
6          5.4         3.9  setosa
5.3.1.3 個別列の選択例

OREdplyrパッケージのdistinctおよびarrange関数の例。

例5-72 個別列の選択

df <- data.frame(
  x = sample(10, 100, rep = TRUE),
  y = sample(10, 100, rep = TRUE)
)
DF <- ore.push(df)
nrow(DF)
nrow(distinct(DF))
arrange(distinct(DF, x), x)
arrange(distinct(DF, y), y)

# Use distinct on computed variables
arrange(distinct(DF, diff = abs(x - y)), diff)

この例のリスト

R> df <- data.frame(
+   x = sample(10, 100, rep = TRUE),
+   y = sample(10, 100, rep = TRUE)
+ )
R> DF <- ore.push(df)
R> nrow(DF)
[1] 100
R> nrow(distinct(DF))
[1] 66
R> arrange(distinct(DF, x), x)
    x
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10 10
R> arrange(distinct(DF, y), y)
    y
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
R> 
R> # Use distinct on computed variables
R> arrange(distinct(DF, diff = abs(x - y)), diff)
   diff
1     0
2     1
3     2
4     3
5     4
6     5
7     6
8     7
9     8
10    9
5.3.1.4 位置による行の選択例

OREdplyrパッケージのsliceおよびfilter関数の例。

例5-73 位置による行の選択

MTCARS <- ore.push(mtcars)
# Display the names of the rows in MTCARS
rownames(MTCARS)
# Select the first row
slice(MTCARS, 1L)

# Arrange the rows by horsepower, then select the first row by position
MTCARS <- arrange(MTCARS, hp)
slice(MTCARS, 1L)

by_cyl <- group_by(MTCARS, cyl)
# Grouping is ignored by slice.
slice(by_cyl, 1:2)
# Use filter and row_number to obtain slices per group.
filter(by_cyl, row_number(hp) < 3L) 

この例のリスト

R> MTCARS <- ore.push(mtcars)
R> # Display the names of the rows in MTCARS
R> rownames(MTCARS)
 [1] "Mazda RX4"           "Mazda RX4 Wag"       "Datsun 710"          "Hornet 4 Drive"      "Hornet Sportabout"  
 [6] "Valiant"             "Duster 360"          "Merc 240D"           "Merc 230"            "Merc 280"           
[11] "Merc 280C"           "Merc 450SE"          "Merc 450SL"          "Merc 450SLC"         "Cadillac Fleetwood" 
[16] "Lincoln Continental" "Chrysler Imperial"   "Fiat 128"            "Honda Civic"         "Toyota Corolla"     
[21] "Toyota Corona"       "Dodge Challenger"    "AMC Javelin"         "Camaro Z28"          "Pontiac Firebird"   
[26] "Fiat X1-9"           "Porsche 914-2"       "Lotus Europa"        "Ford Pantera L"      "Ferrari Dino"       
[31] "Maserati Bora"       "Volvo 142E"  
R> # Select the first row
R> slice(MTCARS, 1L)
          mpg cyl disp  hp drat   wt  qsec vs am gear carb
Mazda RX4  21   6  160 110  3.9 2.62 16.46  0  1    4    4
R>
R> # Arrange the rows by horsepower, then select the first row by position
R> MTCARS <- arrange(MTCARS, hp)
R> slice(MTCARS, 1L)
   mpg cyl disp hp drat    wt  qsec vs am gear carb
1 30.4   4 75.7 52 4.93 1.615 18.52  1  1    4    2
R>
R> by_cyl <- group_by(MTCARS, cyl)
R> # Grouping is ignored by slice
R> slice(by_cyl, 1:2)
   mpg cyl  disp hp drat    wt  qsec vs am gear carb
1 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
Warning message:
In slice_.ore.frame(.data, .dots = .ore.dplyr.exprall(..., env = parent.frame())) :
  grouping is ignored
R> # Use filter and row_number to obtain slices per group
R> filter(by_cyl, row_number(hp) < 3L)
   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
2 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
3 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
4 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
5 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
6 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
5.3.1.5 列の配置例

OREdplyrパッケージのarrangeおよびdesc関数の例。

例5-74 列の配置

この例では、mtcars data.frameオブジェクトでore.push関数を使用して作成されるore.frameオブジェクトMTCARSの列を配置します。2番目のarrange()呼出しは、desc()関数をコールして降順で値を配置します。

MTCARS <- ore.push(mtcars)
head(arrange(mtcars, cyl, disp))
head(arrange(MTCARS, desc(disp)))

この例のリスト

R> MTCARS <- ore.push(mtcars)
R> head(arrange(MTCARS, cyl, disp))
   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
2 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
3 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
4 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
5 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
6 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
R> head(arrange(MTCARS, desc(disp)))
   mpg cyl disp  hp drat    wt  qsec vs am gear carb
1 10.4   8  472 205 2.93 5.250 17.98  0  0    3    4
2 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4
3 14.7   8  440 230 3.23 5.345 17.42  0  0    3    4
4 19.2   8  400 175 3.08 3.845 17.05  0  0    3    2
5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
6 14.3   8  360 245 3.21 3.570 15.84  0  0    3    4
5.3.1.6 列のフィルタ例

OREdplyrパッケージのfilter関数の例。

例5-75 列のフィルタ

この例では、mtcars data.frameオブジェクトでore.push関数を使用して作成されるMTCARS ore.frameオブジェクトの列をフィルタします。

MTCARS <- ore.push(mtcars)
head(filter(MTCARS, cyl == 8))
# Using multiple criteria
head(filter(MTCARS, cyl < 6 & vs == 1))

# Using multiple arguments is the equivalent to using &
head(filter(MTCARS, cyl < 6, vs == 1))

この例のリスト

R> MTCARS <- ore.push(mtcars)
R> head(filter(MTCARS, cyl == 8))
   mpg cyl  disp  hp drat   wt  qsec vs am gear carb
1 18.7   8 360.0 175 3.15 3.44 17.02  0  0    3    2
2 14.3   8 360.0 245 3.21 3.57 15.84  0  0    3    4
3 16.4   8 275.8 180 3.07 4.07 17.40  0  0    3    3
4 17.3   8 275.8 180 3.07 3.73 17.60  0  0    3    3
5 15.2   8 275.8 180 3.07 3.78 18.00  0  0    3    3
6 10.4   8 472.0 205 2.93 5.25 17.98  0  0    3    4
R> head(filter(MTCARS, cyl < 6 & vs == 1))
   mpg cyl  disp hp drat    wt  qsec vs am gear carb
1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1
R>
R> # Using multiple arguments is the equivalent to using &
R> head(filter(MTCARS, cyl < 6, vs == 1))
   mpg cyl  disp hp drat    wt  qsec vs am gear carb
1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1
5.3.1.7 列の変更例

OREdplyrパッケージのmutateおよびtransmute関数の例。

例5-76 列の変更

この例では、mtcars data.frameオブジェクトでore.push関数を使用して作成されるMTCARS ore.frameオブジェクトを使用します。

mutate関数は、列dispから導出された値とともに別のcolumn displ_1を追加します。列をNULLに設定すると、列が削除されます。

MTCARS <- ore.push(mtcars)
head(mutate(MTCARS, displ_l = disp / 61.0237))
head(transmute(MTCARS, displ_l = disp / 61.0237))
head(mutate(MTCARS, cyl = NULL))
head(mutate(MTCARS, cyl = NULL, hp = NULL, displ_l = disp / 61.0237))

この例のリスト

R> MTCARS <- ore.push(mtcars)
R> head(mutate(MTCARS, displ_l = disp / 61.0237))
   mpg cyl disp  hp drat    wt  qsec vs am gear carb  displ_l
1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4 2.621932
2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4 2.621932
3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1 1.769804
4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1 4.227866
5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 5.899347
6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1 3.687092
R> head(transmute(MTCARS, displ_l = disp / 61.0237))
   displ_l
1 2.621932
2 2.621932
3 1.769804
4 4.227866
5 5.899347
6 3.687092
R> head(mutate(mtcars, cyl = NULL))
   mpg disp  hp drat    wt  qsec vs am gear carb
1 21.0  160 110 3.90 2.620 16.46  0  1    4    4
2 21.0  160 110 3.90 2.875 17.02  0  1    4    4
3 22.8  108  93 3.85 2.320 18.61  1  1    4    1
4 21.4  258 110 3.08 3.215 19.44  1  0    3    1
5 18.7  360 175 3.15 3.440 17.02  0  0    3    2
6 18.1  225 105 2.76 3.460 20.22  1  0    3    1
R> head(mutate(mtcars, cyl = NULL, hp = NULL, displ_l = disp / 61.0237))
   mpg disp drat    wt  qsec vs am gear carb  displ_l
1 21.0  160 3.90 2.620 16.46  0  1    4    4 2.621932
2 21.0  160 3.90 2.875 17.02  0  1    4    4 2.621932
3 22.8  108 3.85 2.320 18.61  1  1    4    1 1.769804
4 21.4  258 3.08 3.215 19.44  1  0    3    1 4.227866
5 18.7  360 3.15 3.440 17.02  0  0    3    2 5.899347
6 18.1  225 2.76 3.460 20.22  1  0    3    1 3.687092

5.3.2 行の結合

行を結合するOREdplyr関数。

表5-3 行の結合

関数 説明

full_join

left_joinおよびright_joinから行の結合を返します。

inner_join

一致した列のxおよびyからすべての行の組合せを返します。

left_join

inner_joinの行およびxと一致しないyの行を返します。一致しないyの行の場合、NAが返されます。

right_join

inner_joinの行およびyと一致しないxの行を返します。一致しないxの行の場合、NAが返されます。

例5-77 行の結合

2つの表を結合するため、join関数は、同じ名前を持つ各表の列を選択するか、引数byを使用して列を指定します。

MTCARS <- ore.push(mtcars)
M1 <- filter(select(MTCARS, mpg, cyl, carb), carb < 6L)
M2 <- filter(select(MTCARS, cyl, hp, carb), carb > 2L)

names(inner_join(M1, M2))
nrow(left_join(M1, M2))
nrow(right_join(M1, M2))
nrow(full_join(M1, M2))

names(M2) <- c("cyl", "hp", "carb2")
names(inner_join(M1, M2, by = c("cyl", carb="carb2")))
nrow(inner_join(M1, M2, by = c("cyl", carb="carb2")))
nrow(left_join(M1, M2, by = c("cyl", carb="carb2")))
nrow(right_join(M1, M2, by = c("cyl", carb="carb2")))
nrow(full_join(M1, M2, by = c("cyl", carb="carb2")))

この例のリスト

R> MTCARS <- ore.push(mtcars)
R> M1 <- filter(select(MTCARS, mpg, cyl, carb), carb < 6L)
R> M2 <- filter(select(MTCARS, cyl, hp, carb), carb > 2L)
R>
R> names(inner_join(M1, M2))
[1] "cyl"  "carb" "mpg"  "hp"  
R> nrow(left_join(M1, M2))
[1] 78
R> nrow(right_join(M1, M2))
[1] 63
R> nrow(full_join(M1, M2))
[1] 80
R> 
R> names(M2) <- c("cyl", "hp", "carb2")
R> names(inner_join(M1, M2, by = c("cyl", carb="carb2")))
[1] "cyl"  "carb" "mpg"  "hp"
R> nrow(inner_join(M1, M2, by = c("cyl", carb="carb2")))
[1] 61
R> nrow(left_join(M1, M2, by = c("cyl", carb="carb2")))
[1] 78
R> nrow(right_join(M1, M2, by = c("cyl", carb="carb2")))
[1] 63
R> nrow(full_join(M1, M2, by = c("cyl", carb="carb2")))
[1] 80

5.3.3 列と行のグループ化

列と行をグループ化するOREdplyr関数。

表5-4 列と行のグループ化

関数 説明

group_by

group_by_

指定された列のore.frameオブジェクトをグループ化します。

group_size

各グループの行数をリストします。

groups

グループ化列の名前を表示します。

n_groups

グループ数を返します。

ungroup

入力ore.frameオブジェクトからグループ化を削除します。

例5-78 グループ化関数の使用方法

次の例では、mtcars data.frameオブジェクトでore.push関数を使用して作成されるore.frameオブジェクトMTCARSを使用します。グループ化関数group_bygroup_sizegroupsn_groupおよびungroupの使用例を示します。また、OREdplyr関数arrangerenameおよびsummarizeも使用します。

MTCARS <- ore.push(mtcars)
by_cyl <- group_by(MTCARS, cyl)

# Apply the summarise function to each group
arrange(summarise(by_cyl, mean(disp), mean(hp)), cyl)

# Summarise drops one layer of grouping
by_vs_am <- group_by(MTCARS, vs, am)
by_vs <- summarise(by_vs_am, n = n())
arrange(by_vs, vs, am)
arrange(summarise(by_vs, n = sum(n)), vs)

# Remove grouping
summarise(ungroup(by_vs), n = sum(n))

# Group by expressions with mutate
arrange(group_size(group_by(mutate(MTCARS, vsam = vs + am), vsam)), vsam)

# Rename the grouping column
groups(rename(group_by(MTCARS, vs), vs2 = vs))

# Add more grouping columns
groups(group_by(by_cyl, vs, am))
groups(group_by(by_cyl, vs, am, add = TRUE))

# Drop duplicate groups
groups(group_by(by_cyl, cyl, cyl))

# Load the magrittr library to use the forward-pipe operator %>%
library(magrittr)
by_cyl_gear_carb <- MTCARS %>% group_by(cyl, gear, carb)
n_groups(by_cyl_gear_carb)
arrange(group_size(by_cyl_gear_carb), cyl, gear, carb)

by_cyl <- MTCARS %>% group_by(cyl)
# Number of groups
n_groups(by_cyl)

# Size of each group
arrange(group_size(by_cyl), cyl)

この例のリスト

R> MTCARS <- ore.push(mtcars)
R> by_cyl <- group_by(MTCARS, cyl)
R>
R> # Apply the summarise function to each group
R> arrange(summarise(by_cyl, mean(disp), mean(hp)), cyl)
  cyl mean.disp.  mean.hp.
1   4   105.1364  82.63636
2   6   183.3143 122.28571
3   8   353.1000 209.21429
R>
R> # Summarise drops one layer of grouping
R> by_vs_am <- group_by(MTCARS, vs, am)
R> by_vs <- summarise(by_vs_am, n = n())
R> arrange(by_vs, vs, am)
  vs am  n
1  0  0 12
2  0  1  6
3  1  0  7
4  1  1  7
R> arrange(summarise(by_vs, n = sum(n)), vs)
  vs  n
1  0 18
2  1 14
R>
R> # Remove grouping
R> summarise(ungroup(by_vs), n = sum(n))
 n 
32 
R> 
R> # Group by expressions with mutate
R> arrange(group_size(group_by(mutate(MTCARS, vsam = vs + am), vsam)), vsam)
  vsam  n
1    0 12
2    1 13
3    2  7
R> 
R> # Rename the grouping column
R> groups(rename(group_by(MTCARS, vs), vs2 = vs))
[1] "vs2"
R> 
R> # Add more grouping columns
R> groups(group_by(by_cyl, vs, am))
[[1]]
[1] "vs"

[[2]]
[1] "am"

R> groups(group_by(by_cyl, vs, am, add = TRUE))
[[1]]
[1] "cyl"

[[2]]
[1] "vs"

[[3]]
[1] "am"
R> 
R> # Drop duplicate groups
R> groups(group_by(by_cyl, cyl, cyl))
[1] "cyl
R> 
R> # Load the magrittr library to use the forward-pipe operator %>%
R> library(magrittr)
R> by_cyl_gear_carb <- MTCARS %>% group_by(cyl, gear, carb)
R> n_groups(by_cyl_gear_carb)
[1] 12
R> arrange(group_size(by_cyl_gear_carb), cyl, gear, carb)
   cyl gear carb n
1    4    3    1 1
2    4    4    1 4
3    4    4    2 4
4    4    5    2 2
5    6    3    1 2
6    6    4    4 4
7    6    5    6 1
8    8    3    2 4
9    8    3    3 3
10   8    3    4 5
11   8    5    4 1
12   8    5    8 1
R> 
R> by_cyl <- MTCARS %>% group_by(cyl)
R> # Number of groups
R> n_groups(by_cyl)
[1] 3
R> # Number of groups
R> n_groups(by_cyl)
[1] 3
R>
R> # Size of each group
R> arrange(group_size(by_cyl), cyl)
  cyl  n
1   4 11
2   6  7
3   8 14

5.3.4 列と行の集計

列と行を集計するOREdplyr関数。

表5-5 列と行の集計

関数 説明

count

count_

グループ別に行をカウントします。tallyと似ていますが、group_byを実行します。

summarise

summarise_

集計関数を使用して、列をまとめます。ore.frameオブジェクトをグループ化すると、集計関数がグループ単位で適用されます。結果のore.frameは、入力ore.frameの1つのグループ化を削除します。

tally

グループ別に行を集計します。最初の集計か再集計に応じてnまたはsum(n)をコールするsummariseの便利なラッパーです。

例5-79 列の集計

次の例では、mtcars data.frameオブジェクトでore.push関数を使用して作成されるore.frameオブジェクトMTCARSを使用します。集計関数countsummarizeおよびtallyの使用例を示します。また、OREdplyr関数arrangeおよびgroup_byも使用します。

MTCARS <- ore.push(mtcars)
arrange(tally(group_by(MTCARS, cyl)), cyl)
tally(group_by(MTCARS, cyl), sort = TRUE)

# Multiple tallys progressively roll up the groups
cyl_by_gear <- tally(group_by(MTCARS, cyl, gear), sort = TRUE)
tally(cyl_by_gear, sort = TRUE)
tally(tally(cyl_by_gear))

cyl_by_gear <- tally(group_by(MTCARS, cyl, gear), wt = hp, sort = TRUE)
tally(cyl_by_gear, sort = TRUE)
tally(tally(cyl_by_gear))

cyl_by_gear <- count(MTCARS, cyl, gear, wt = hp + mpg, sort = TRUE)
tally(cyl_by_gear, sort = TRUE)
tally(tally(cyl_by_gear))

# Load the magrittr library to use the forward-pipe operator %>%
library(magrittr)
MTCARS %>% group_by(cyl) %>% tally(sort = TRUE)

# count is more succinct and also does the grouping
MTCARS %>% count(cyl) %>% arrange(cyl)
MTCARS %>% count(cyl, wt = hp) %>% arrange(cyl)
MTCARS %>% count_("cyl", wt = hp, sort = TRUE)

この例のリスト

R> MTCARS <- ore.push(mtcars)
R> arrange(tally(group_by(MTCARS, cyl)), cyl)
  cyl  n
1   4 11
2   6  7
3   8 14
R> tally(group_by(MTCARS, cyl), sort = TRUE)
  cyl  n
1   8 14
2   4 11
3   6  7
R> 
R> # Multiple tallys progressively roll up the groups
R> cyl_by_gear <- tally(group_by(MTCARS, cyl, gear), sort = TRUE)
R> tally(cyl_by_gear, sort = TRUE)
Using n as weighting variable
  cyl  n
1   8 14
2   4 11
3   6  7
R> tally(tally(cyl_by_gear))
Using n as weighting variable
Using n as weighting variable
 n 
32 
R>
R> cyl_by_gear <- tally(group_by(MTCARS, cyl, gear), wt = hp, sort = TRUE)
R> tally(cyl_by_gear, sort = TRUE)
Using n as weighting variable
  cyl    n
1   8 2929
2   4  909
3   6  856
R> tally(tally(cyl_by_gear))
Using n as weighting variable
Using n as weighting variable
   n 
4694 
R> 
R> cyl_by_gear <- count(MTCARS, cyl, gear, wt = hp + mpg, sort = TRUE)
R> tally(cyl_by_gear, sort = TRUE)
Using n as weighting variable
  cyl      n
1   8 3140.4
2   4 1202.3
3   6  994.2
R> tally(tally(cyl_by_gear))
Using n as weighting variable
Using n as weighting variable
     n 
5336.9 
R> 
R> # Load the magrittr library to use the forward-pipe operator %>%
R> library(magrittr)
R> MTCARS %>% group_by(cyl) %>% tally(sort = TRUE)
  cyl  n
1   8 14
2   4 11
3   6  7
R> 
R> # count is more succinct and also does the grouping
R> MTCARS %>% count(cyl) %>% arrange(cyl)
  cyl  n
1   4 11
2   6  7
3   8 14
R> MTCARS %>% count(cyl, wt = hp) %>% arrange(cyl)
  cyl    n
1   4  909
2   6  856
3   8 2929
R> MTCARS %>% count_("cyl", wt = hp, sort = TRUE)
  cyl    n
1   8 2929
2   4  909
3   6  856

5.3.5 行のサンプリング

行をサンプリングするOREdplyr関数。

表5-6 行のサンプリング関数

関数 説明

sample_frac

分数でore.frameオブジェクトをサンプリングします。

sample_n

固定数の行でore.frameオブジェクトをサンプリングします。

例5-80 行のサンプリング

次の例では、mtcars data.frameオブジェクトでore.push関数を使用して作成されるore.frameオブジェクトMTCARSを使用します。サンプリング関数sample_nおよびsample_fracの使用例を示します。また、OREdplyr関数arrangeおよびsummarizeも使用します。

MTCARS <- ore.push(mtcars)
by_cyl <- group_by(MTCARS, cyl)

# Sample fixed number per group of rows from the entire dataset
sample_n(MTCARS, 10)
nrow(sample_n(MTCARS, 50, replace = TRUE))
sample_n(MTCARS, 10, weight = mpg)
sample_n(MTCARS, 10, weight = MTCARS[["mpg"]])

# Sample fixed number of rows per group with replacement and weight 
arrange(sample_n(by_cyl, 3), cyl, mpg)
arrange(summarise(sample_n(by_cyl, 10, replace = TRUE), n = n()), cyl)
arrange(summarise(sample_n(by_cyl, 3, weight = mpg/mean(mpg)), n = n()), cyl)
arrange(summarise(sample_n(by_cyl, 3, 
                           weight = by_cyl[["mpg"]]/mean(by_cyl[["mpg"]])), n = n()), cyl) 

# Sample fixed fraction per group
nrow(sample_frac(MTCARS, 0.1))
nrow(sample_frac(MTCARS, 1.5, replace = TRUE))
nrow(sample_frac(MTCARS, 0.1, weight = 1/mpg))

この例のリスト

R> MTCARS <- ore.push(mtcars)
R> by_cyl <- group_by(MTCARS, cyl)
R> 
R> # Sample fixed number per group of rows from the entire dataset
R> sample_n(MTCARS, 10)
                  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Datsun 710|4     22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Ford Pantera L|2 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
Honda Civic|10   30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Lotus Europa|6   30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Maserati Bora|3  15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
Mazda RX4|5      21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag|9  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Merc 280|8       19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Toyota Corolla|7 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Toyota Corona|1  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
R> nrow(sample_n(MTCARS, 50, replace = TRUE))
[1] 50
R>
R> # Sample fixed number of rows per group with replacement and weight 
R> arrange(sample_n(by_cyl, 3), cyl, mpg)
  cyl  mpg  disp  hp drat    wt  qsec vs am gear carb
1   4 22.8 108.0  93 3.85 2.320 18.61  1  1    4    1
2   4 24.4 146.7  62 3.69 3.190 20.00  1  0    4    2
3   4 30.4  95.1 113 3.77 1.513 16.90  1  1    5    2
4   6 19.2 167.6 123 3.92 3.440 18.30  1  0    4    4
5   6 19.7 145.0 175 3.62 2.770 15.50  0  1    5    6
6   6 21.4 258.0 110 3.08 3.215 19.44  1  0    3    1
7   8 10.4 460.0 215 3.00 5.424 17.82  0  0    3    4
8   8 15.2 304.0 150 3.15 3.435 17.30  0  0    3    2
9   8 15.2 275.8 180 3.07 3.780 18.00  0  0    3    3
R> arrange(summarise(sample_n(by_cyl, 10, replace = TRUE), n = n()), cyl)
  cyl  n
1   4 10
2   6 10
3   8 10
R> arrange(summarise(sample_n(by_cyl, 3, weight = mpg/mean(mpg)), n = n()), cyl)
  cyl n
1   4 3
2   6 3
3   8 3
R> arrange(summarise(sample_n(by_cyl, 3, weight = by_cyl[["mpg"]]/mean(by_cyl[["mpg"]])), n = n()), cyl)
  cyl n
1   4 3
2   6 3
3   8 3
R> 
R> nrow(sample_frac(MTCARS, 0.1))
[1] 3
R> nrow(sample_frac(MTCARS, 1.5, replace = TRUE))
[1] 48
R> nrow(sample_frac(MTCARS, 0.1, weight = 1/mpg))
[1] 3

5.3.6 行のランキング

行をランキングするOREdplyr関数。

ランキング関数は、値によって順序付けられたore.vectorの要素をランキングします。ore.characterは、ore.factorに強制変換されます。ore.factorの値は、ファクタ・レベルに基づいています。ランキングの方向を逆にするには、desc関数を使用します。

表5-7 行のランキング

関数 説明
cume_dist

累積分布関数は、現在のランク以下のすべての値の割合を返します。

dense_rank

min_rankと似ていますが、ランク間のギャップがありません。

first

順序付けられたore.vectorオブジェクトの最初の値を取得します。

last

順序付けられたore.vectorオブジェクトの最後の値を取得します。

min_rank

rank(ties.method = "min")と同じです。

nth

順序の指定された位置の値を取得します。

ntile

入力ベクターをnバケットに分割する大まかなランキング。

n_distinct

順序付けられたore.vectorオブジェクトのn番目の値を取得します。

percent_rank

min_rankのサイズを[0, 1]に変更して計算される0と1の間の数値を返します。

row_number

rank(ties.method = "first")と同じです。

top_n

行の最上位または最下位の数を選択します。

例5-81 行のランキング

次の例では、ランキング関数row_numbermin_rankdense_rankpercent_rankcume_distおよびntileを使用します。

X <- ore.push(c(5, 1, 3, 2, 2, NA))

row_number(X)
row_number(desc(X))

min_rank(X)

dense_rank(X)

percent_rank(X)

cume_dist(X)

ntile(X, 2)
ntile(ore.push(runif(100)), 10)

MTCARS <- ore.push(mtcars)
by_cyl <- group_by(MTCARS, cyl)

# Using ranking functions with an ore.frame
head(mutate(MTCARS, rank = row_number(hp)))

head(mutate(MTCARS, rank = min_rank(hp)))

head(mutate(MTCARS, rank = dense_rank(hp)))

# Using ranking functions with a grouped ore.frame
head(mutate(by_cyl, rank = row_number(hp)))

head(mutate(by_cyl, rank = min_rank(hp)))

head(mutate(by_cyl, rank = dense_rank(hp)))

この例のリスト

R> X <- ore.push(c(5, 1, 3, 2, 2, NA))
R> 
R> row_number(X)
[1] 5 1 4 2 3 6
R> row_number(desc(X))
[1] 1 5 2 3 4 6
R> 
R> min_rank(X)
[1] 5 1 4 2 2 6
R> 
R> dense_rank(X)
[1] 4 1 3 2 2 6
R> 
R> percent_rank(X)
[1] 0.8 0.0 0.6 0.2 0.2 1.0
R> 
R> cume_dist(X)
[1] 0.8333333 0.1666667 0.6666667 0.5000000 0.5000000 1.0000000
R> 
R> ntile(X, 2)
[1] 2 1 2 1 1 2
R> ntile(ore.push(runif(100)), 10)
  [1]  6 10  5  2  1  1  8  3  8  8  7  3 10  3  7  9  9  4  4 10 10  7  2  3  7  4  5  5  3  9  4  6  8  4 10  6  1  5  5  4  6  9
 [43]  5  8  2  7  7  1  2  9  1  2  8  5  6  5  3  4  7  1  3  1 10  1  5  5 10  9  2  3  9  6  6  8  8  6  3  7  2  2  8  4  1  9
 [85]  6 10  4 10  7  2  9 10  7  2  4  9  6  3  8  1
R>
R> MTCARS <- ore.push(mtcars)
R> by_cyl <- group_by(MTCARS, cyl)
R>
R> # Using ranking functions with an ore.frame
R> head(mutate(MTCARS, rank = row_number(hp)))
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb rank
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4   12
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4   13
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1    7
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1   14
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2   20
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1   10
R> 
R> head(mutate(MTCARS, rank = min_rank(hp)))
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb rank
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4   12
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4   12
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1    7
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1   12
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2   20
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1   10
R> 
R> head(mutate(MTCARS, rank = dense_rank(hp)))
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb rank
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4   11
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4   11
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1    6
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1   11
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2   15
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1    9
R> 
R> # Using ranking functions with a grouped ore.frame
R> head(mutate(by_cyl, rank = row_number(hp)))
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb rank
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4    2
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4    3
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1    7
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1    4
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2    3
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1    1
R>
R> head(mutate(by_cyl, rank = min_rank(hp)))
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb rank
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4    2
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4    2
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1    7
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1    2
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2    3
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1    1
R>
R> head(mutate(by_cyl, rank = dense_rank(hp)))
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb rank
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4    2
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4    2
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1    6
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1    2
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1    1

5.4 クライアントでのサード・パーティのパッケージの使用について

Oracle Machine Learning for Rでは、Comprehensive R Archive Network (CRAN)のオープン・ソースのRパッケージまたは他のサード・パーティのRパッケージの関数を使用する場合、通常は、Embedded R Executionのコンテキストで行います。

埋込みRの実行を使用すると、データベース・サーバー上の多量である可能性の高いメモリーを利用できます。

ただし、Oracle Database表のデータに対してローカルのRセッションでサード・パーティのパッケージを使用する場合は、ore.pull関数を使用して、データをore.frameオブジェクトからローカル・セッションにdata.frameオブジェクトとして取得する必要があります。これは、DBAの協力なしにデータベースからデータを抽出できることを除いて、オープン・ソースRを使用する場合と同様です。

データベース表からローカルのdata.frameにデータをプルする場合、ローカル・マシンのメモリーに適合するデータ量に使用が制限されます。ローカル・マシンでは、埋込みRの実行で提供される利点を利用できません。

ノート:

ADBでOMLノートブックを使用する場合、Conda環境はオブジェクト・ストレージに格納されます。詳細は、Conda環境を作成および保存するための管理タスクを参照してください。

サード・パーティのパッケージを使用するには、システムにインストールして、Rセッションでロードする必要があります。

kernlabパッケージの使用例は、例3-15を参照してください。

例5-82 クライアントへのサード・パーティ・パッケージのダウンロード、インストールおよびロード

この例では、CRANパッケージkernlabのダウンロード、インストールおよびロードを示します。kernlabパッケージには、カーネル・ベースの機械学習手法が含まれています。この例では、install.packages関数を呼び出してこのパッケージをダウンロードしてインストールします。次に、library関数を呼び出してパッケージをロードします。

install.packages("kernlab")
library("kernlab")

この例のリスト

R> install.packages("kernlab")
trying URL 'http://cran.rstudio.com/bin/windows/contrib/3.0/kernlab_0.9-19.zip'
Content type 'application/zip' length 2029405 bytes (1.9 Mb)
opened URL
downloaded 1.9 Mb
 
package 'kernlab' successfully unpacked and MD5 sums checked
 
The downloaded binary packages are in
	C:\Users\oml_user\AppData\Local\Temp\RtmpSKVZql\downloaded_packages
R> library("kernlab")

例5-83 kernlabパッケージ関数の使用方法

この例では、demo関数を呼び出して、kernlabパッケージ内のサンプル・プログラムを検索します。このパッケージにはサンプルが含まれていないため、この例ではksvm関数のヘルプを取得します。このヘルプからサンプル・コードを呼び出します。

demo(package = "kernlab")
help(package = "kernlab", ksvm)
data(spam)
index <- sample(1:dim(spam)[1])
spamtrain <- spam[index[1:floor(dim(spam)[1]/2)], ]
spamtest <- spam[index[((ceiling(dim(spam)[1]/2)) + 1):dim(spam)[1]], ]
filter <- ksvm(type~.,data=spamtrain,kernel="rbfdot",
+              kpar=list(sigma=0.05),C=5,cross=3)
filter
table(mailtype,spamtest[,58])

この例のリスト

> demo(package = "kernlab")
no demos found
> help(package = "kernlab", ksvm)    # Output not shown.
> data(spam)
> index <- sample(1:dim(spam)[1])
> spamtrain <- spam[index[1:floor(dim(spam)[1]/2)], ]
> spamtest <- spam[index[((ceiling(dim(spam)[1]/2)) + 1):dim(spam)[1]], ]
> filter <- ksvm(type~.,data=spamtrain,kernel="rbfdot",
+                kpar=list(sigma=0.05),C=5,cross=3)
> filter
Support Vector Machine object of class "ksvm" 
 
SV type: C-svc  (classification) 
 parameter : cost C = 5 
 
Gaussian Radial Basis kernel function. 
 Hyperparameter : sigma =  0.05 
 
Number of Support Vectors : 970 
 
Objective Function Value : -1058.218 
Training error : 0.018261 
Cross validation error : 0.08696 
> mailtype <- predict(filter,spamtest[,-58])
> table(mailtype,spamtest[,58])
         
mailtype  nonspam spam
  nonspam    1347  136
  spam         45  772