5 データベースでのデータの準備および探索
Oracle Machine Learning for Rの関数を使用して、分析用のデータを準備し、データの探索的分析を実行します。
これらの関数は、モデリングのための非常に大規模なエンタープライズのデータベース常駐データの準備を容易にします。次の各トピックで、これらについて説明します。
- Oracle Machine Learning for Rを使用したデータベースのデータの準備
OML4Rを使用して、データベースで分析用のデータを準備できます。 - データの探索
Oracle Machine Learning for Rには、探索的データ分析を実行できる関数があります。 - OREdplyrを使用したデータ操作
OREdplyr
パッケージ関数は、ore.frame
オブジェクトおよびore.numeric
オブジェクトで使用するdplyr
関数を透過的に実装します。 - クライアントでのサード・パーティのパッケージの使用について
Oracle Machine Learning for Rでは、Comprehensive R Archive Network (CRAN)のオープン・ソースのRパッケージまたは他のサード・パーティのRパッケージの関数を使用する場合、通常は、Embedded R Executionのコンテキストで行います。
5.1 Oracle Machine Learning for Rを使用したデータベースのデータの準備
OML4Rを使用して、データベースで分析用のデータを準備できます。
データ準備については、次の各トピックで説明します。
- データベースでのデータの準備について
Oracle Machine Learning for Rには、Rを使用して分析用のデータベース・データを準備できる関数が用意されています。 - データの選択
分析用のデータの準備の一般的なステップは、大規模なデータセットから対象の値を選択またはフィルタ処理することです。 - データの索引付け
整数ベクターまたは文字列ベクターを使用して、順序付けられたore.frame
オブジェクトに索引付けできます。 - データの結合
merge
関数を使用して、データベース表を表すore.frame
オブジェクトのデータを結合できます。 - ore.summaryによるデータの集計
ore.summary
関数は、記述統計を計算し、柔軟な行の集計とともに、ore.frame
内の列の広範な分析をサポートします。 - データの変換
分析用のデータの準備での一般的なステップは、データを再フォーマットするか新しい列を導出してデータセットに追加することによってデータを変換することです。 - データのサンプリング
サンプリングは統計分析の重要な機能です。 - データのパーティション化
大規模なデータセットの分析での通常の操作は、データセットをランダムにサブセットにパーティション化することです。 - 時系列データの準備
OML4Rでは、時系列データに対して、データのフィルタ処理、順序付け、変換などの多数のデータの準備操作を実行できます。
親トピック: データベースでのデータの準備および探索
5.1.1 データベースでのデータの準備について
Oracle Machine Learning for Rには、Rを使用して分析用のデータベース・データを準備できる関数が用意されています。
これらの関数を使用して、ore.frame
およびその他のOML4Rオブジェクトでの一般的なデータ準備タスクを実行できます。データ準備操作は、データベースにある大量のデータに対して実行でき、Comprehensive R Archive Network (CRAN)で入手可能なパッケージの関数を使用して分析用のローカルのRセッションに結果をプルできます。
データに対して次のような操作を実行できます。
-
選択
-
ビニング
-
サンプリング
-
ソートおよび順序付け
-
集計
-
変換
-
日時データに対するデータ準備操作の実行
これらの操作の実行については、この章の他の項で説明します。
5.1.2 データの選択
分析用のデータの準備の一般的なステップは、大規模なデータセットから対象の値を選択またはフィルタ処理することです。
- 列によるデータの選択
この例では、ore.frame
オブジェクトから列を選択します。 - 行によるデータの選択
この例では、順序付けられた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
オブジェクトの作成に使用するために、iris
のdata.frame
オブジェクトに列を追加します。データベース表IRIS_TABLEが存在する場合は、ore.drop
関数を実行して削除します。次に、iris
のdata.frame
から、対応するプロキシore.frame
オブジェクトのIRIS_TABLE
とともに、データベース表を作成します。この例では、ore.exec
関数を実行して、RID列をデータベース表の主キーにするためのSQL文を実行します。次にore.sync
関数を実行して、IRIS_TABLE
のore.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
関数では、次の統計がサポートされています。
-
平均、最小、最大、モード、欠損値の数、合計、加重和
-
二乗の補正および未補正合計、値の範囲、
stddev
、stderr
、variance
-
母平均が0であるという仮定をテストするためのt検定
-
尖度、歪度、変動係数
-
分位: p1、p5、p10、p25、p50、p75、p90、p95、p99、qrange
-
平均の片側および両側信頼限界:
clm
、rclm
、lclm
-
極値のタグ付け
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
を作成します。この例では、MYDATA
がore.frame
オブジェクトであること、およびdatetime
列がクラスore.datetime
であることを示すためにclass
関数をコールします。この例では、生成されたデータの最初の3行を表示します。次に、min
、max
、range
、median
およびquantile
の統計の集計操作をMYDATA
のdatetime
列で使用します。
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
クラスです。この例では、MYDATA
のdatetime
列および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 日付および時間の比較
この例では、日付および時間の比較を示します。この例では、最初の例で作成したMYDATA
のore.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
オブジェクトから年、月、月の日付、時間、分、秒などの様々なコンポーネントの抽出に使用できるアクセッサ関数があります。この例では、これらの関数の使用方法を示します。この例では、最初の例で作成したMYDATA
のore.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
データ型を他のデータ型に強制変換します。この例では、最初の例で作成したMYDATA
のore.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
を使用して、ローリング平均およびローリング標準偏差を計算します。この例では、最初の例で作成したMYDATA
のore.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には、探索的データ分析を実行できる関数があります。
関数およびその使用について、次の各項で説明します。
- 探索的データ分析関数について
探索的データ分析用のOML4Rの関数は、OREeda
パッケージにあります。 - サンプルのNARROWデータセットについて
探索的データ分析関数の多くの例で、NARROW
データセットを使用します。 - データの相互関連付け
ore.corr
関数を使用して相関分析を実行できます。 - データのクロス集計
クロス集計は、値からなる2つの表の間の相互依存関係を見つける統計手法です。 - クロス集計の頻度の分析
ore.freq
関数は、ore.crosstab
関数の出力を分析し、ore.crosstab
の結果に関連する手法を自動的に判別します。 - 時系列データでの指数平滑法モデルの構築
ore.esm
関数は、順序付けられたore.vector
オブジェクトで、インデータベース時系列観測のための単純または二重の指数平滑化モデルを構築します。 - データのランキング
ore.rank
関数は、ore.frame
の数値列の値の分布を分析します。 - データのソート
ore.sort
関数は、by
引数で指定した1つ以上の列によるデータ・フレームの柔軟なソートを可能にします。 - ore.summaryによるデータの集計
ore.summary
関数は、記述統計を計算し、柔軟な行の集計とともに、ore.frame
内の列の広範な分析をサポートします。 - 数値変数の分布の分析
ore.univariate
関数は、ore.frame
の数値変数の分布分析を提供します。 - 主要コンポーネント分析
オーバーロードされたprcomp
関数およびprincomp
関数は、主要コンポーネント分析をデータベースで並行して実行します。 - 特異値分解
オーバーロードされたsvd
関数は、特異値分解をデータベースで並行して実行します。
親トピック: データベースでのデータの準備および探索
5.2.1 探索的データ分析関数について
探索的データ分析用のOML4Rの関数は、OREeda
パッケージにあります。
表5-1 OREedaパッケージの関数
関数 | 説明 |
---|---|
|
|
|
オプションの集計、重み付けおよび順序付けオプションで複数の列をサポートすることで、 |
|
順序付けられた |
|
|
|
|
|
|
|
柔軟な行集約内の |
|
|
親トピック: データの探索
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-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
を使用します。 -
正規スコアを計算するには、
blom
、tukey
または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
関数では、次の統計がサポートされています。
-
平均、最小、最大、モード、欠損値の数、合計、加重和
-
二乗の補正および未補正合計、値の範囲、
stddev
、stderr
、variance
-
母平均が0であるという仮定をテストするためのt検定
-
尖度、歪度、変動係数
-
分位: p1、p5、p10、p25、p50、p75、p90、p95、p99、qrange
-
平均の片側および両側信頼限界:
clm
、rclm
、lclm
-
極値のタグ付け
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
には、数値データのみが含まれている必要があります。式は、数値変数のみを参照し、レスポンス変数が含まれていないことが必要です。
関数prcomp
はprcomp
オブジェクトを返し、関数princomp
はprincomp
オブジェクトを返します。
この関数の引数の詳細は、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
パッケージの関数は、次のトピックで説明します。
- データの選択および順序付け
ore.frame
オブジェクトの列と行のデータを選択および順序付けするOREdplyr
関数。 - 行の結合
行を結合するOREdplyr
関数。 - 列と行のグループ化
列と行をグループ化するOREdplyr
関数。 - 列と行の集計
列と行を集計するOREdplyr
関数。 - 行のサンプリング
行をサンプリングするOREdplyr
関数。 - 行のランキング
行をランキングするOREdplyr
関数。
親トピック: データベースでのデータの準備および探索
5.3.1 データの選択および順序付け
ore.frame
オブジェクトの列と行のデータを選択および順序付けするOREdplyr
関数。
表5-2 列と行の選択および順序付け
関数 | 説明 |
---|---|
|
指定された列で行を順序付けします。 |
|
降順で |
|
指定された列で入力 |
|
指定された条件と一致する行をフィルタします。 |
|
新しい列を追加します。 |
|
指定された列の名前を変更し、すべての列を保持します。 |
|
指定された列のみを選択します。 |
|
位置で行を選択します。順序付けられた入力 |
|
新しい列を追加し、既存の列を削除します。 |
これらの関数の使用例を次に示します。
- 列の選択例
OREdplyr
パッケージのselect
関数およびrename
関数の例。 - select_を使用したプログラミング例
OREdplyr
パッケージのselect_
関数の例。 - 個別列の選択例
OREdplyr
パッケージのdistinct
関数およびarrange
関数の例。 - 位置による行の選択例
OREdplyr
パッケージのslice
関数およびfilter
関数の例。 - 列の配置例
OREdplyr
パッケージのarrange
関数およびdesc
関数の例。 - 列のフィルタ例
OREdplyr
パッケージのfilter
関数の例。 - 列の変更例
OREdplyr
パッケージのmutate
関数およびtransmute
関数の例。
親トピック: OREdplyrを使用したデータ操作
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 行の結合
関数 | 説明 |
---|---|
|
|
|
一致した列のxおよびyからすべての行の組合せを返します。 |
|
|
|
|
例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
親トピック: OREdplyrを使用したデータ操作
5.3.3 列と行のグループ化
列と行をグループ化するOREdplyr
関数。
表5-4 列と行のグループ化
関数 | 説明 |
---|---|
|
指定された列の |
|
各グループの行数をリストします。 |
|
グループ化列の名前を表示します。 |
|
グループ数を返します。 |
|
入力 |
例5-78 グループ化関数の使用方法
次の例では、mtcars data.frame
オブジェクトでore.push
関数を使用して作成されるore.frame
オブジェクトMTCARSを使用します。グループ化関数group_by
、group_size
、groups
、n_group
およびungroup
の使用例を示します。また、OREdplyr
関数arrange
、rename
および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
親トピック: OREdplyrを使用したデータ操作
5.3.4 列と行の集計
列と行を集計するOREdplyr
関数。
表5-5 列と行の集計
関数 | 説明 |
---|---|
|
グループ別に行をカウントします。 |
|
集計関数を使用して、列をまとめます。 |
tally |
グループ別に行を集計します。最初の集計か再集計に応じて |
例5-79 列の集計
次の例では、mtcars data.frame
オブジェクトでore.push
関数を使用して作成されるore.frame
オブジェクトMTCARSを使用します。集計関数count
、summarize
および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
親トピック: OREdplyrを使用したデータ操作
5.3.5 行のサンプリング
行をサンプリングするOREdplyr
関数。
表5-6 行のサンプリング関数
関数 | 説明 |
---|---|
|
分数で |
|
固定数の行で |
例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
親トピック: OREdplyrを使用したデータ操作
5.3.6 行のランキング
行をランキングするOREdplyr
関数。
ランキング関数は、値によって順序付けられたore.vector
の要素をランキングします。ore.character
は、ore.factor
に強制変換されます。ore.factor
の値は、ファクタ・レベルに基づいています。ランキングの方向を逆にするには、desc
関数を使用します。
表5-7 行のランキング
関数 | 説明 |
---|---|
cume_dist |
累積分布関数は、現在のランク以下のすべての値の割合を返します。 |
dense_rank |
|
|
順序付けられた |
|
順序付けられた |
min_rank |
|
|
順序の指定された位置の値を取得します。 |
ntile |
入力ベクターをnバケットに分割する大まかなランキング。 |
|
順序付けられた |
percent_rank |
|
|
|
|
行の最上位または最下位の数を選択します。 |
例5-81 行のランキング
次の例では、ランキング関数row_number
、min_rank
、dense_rank
、percent_rank
、cume_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
親トピック: OREdplyrを使用したデータ操作
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
親トピック: データベースでのデータの準備および探索