3 データベースでのデータの準備および探索
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パッケージの関数を使用する場合、通常は、埋込みRの実行のコンテキストで行います。
3.1 Oracle Machine Learning for Rを使用したデータベースのデータの準備
OML4Rを使用して、データベースで分析用のデータを準備できます。
データ準備については、次の各トピックで説明します。
- データベースでのデータの準備について
Oracle Machine Learning for Rには、Rを使用して分析用のデータベース・データを準備できる関数が用意されています。 - データの選択
分析用のデータの準備の一般的なステップは、大規模なデータセットから対象の値を選択またはフィルタ処理することです。 - データの索引付け
整数ベクターまたは文字列ベクターを使用して、順序付けられたore.frameオブジェクトに索引付けできます。 - データの結合
merge関数を使用して、データベース表を表すore.frameオブジェクトのデータを結合できます。 - データの集計
aggregate関数を使用して、データを集計します。 - データの変換
分析用のデータの準備での一般的なステップは、データを再フォーマットするか新しい列を導出してデータセットに追加することによってデータを変換することです。 - データのサンプリング
サンプリングは統計分析の重要な機能です。 - データのパーティション化
大規模なデータセットの分析での通常の操作は、データセットをランダムにサブセットにパーティション化することです。 - 時系列データの準備
OML4Rでは、時系列データに対して、データのフィルタ処理、順序付け、変換などの多数のデータの準備操作を実行できます。
親トピック: データベースでのデータの準備および探索
3.1.1 データベースでのデータの準備について
Oracle Machine Learning for Rには、Rを使用して分析用のデータベース・データを準備できる関数が用意されています。
これらの関数を使用して、ore.frameおよびその他のOML4Rオブジェクトでの一般的なデータ準備タスクを実行できます。データ準備操作は、データベースにある大量のデータに対して実行でき、Comprehensive R Archive Network (CRAN)で入手可能なパッケージの関数を使用して分析用のローカルのRセッションに結果をプルできます。
データに対して次のような操作を実行できます。
-
選択
-
ビニング
-
サンプリング
-
ソートおよび順序付け
-
集計
-
変換
-
日時データに対するデータ準備操作の実行
これらの操作の実行については、この章の他の項で説明します。
3.1.2 データの選択
分析用のデータの準備の一般的なステップは、大規模なデータセットから対象の値を選択またはフィルタ処理することです。
- 列によるデータの選択
この例では、ore.frameオブジェクトから列を選択します。 - 行によるデータの選択
この例では、順序付けられたore.frameオブジェクトから行を選択します。 - 値によるデータの選択
この例では、データセットの一部を選択します。
3.1.2.1 列によるデータの選択
この例では、ore.frameオブジェクトから列を選択します。
例3-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親トピック: データの選択
3.1.2.2 行によるデータの選択
この例では、順序付けられたore.frameオブジェクトから行を選択します。
例3-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親トピック: データの選択
3.1.2.3 値によるデータの選択
この例では、データセットの一部を選択します。
例3-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親トピック: データの選択
3.1.3 データの索引付け
整数ベクターまたは文字列ベクターを使用して、順序付けられたore.frameオブジェクトに索引付けできます。
この索引付けを使用して、「データのサンプリング」および「データのパーティショニング」に記載されているように、サンプリングおよびパーティショニングを実行できます。
Oracle Machine Learning for RはRの索引付けに類似した機能をサポートしますが、次の違いがあります。
-
ore.vectorオブジェクトでは整数索引の作成はサポートされません。 -
負の整数の索引はサポートされません。
-
行の順序は保持されません。
例3-4 ore.frameオブジェクトの索引付け
この例は、文字の索引付けおよび整数の索引付けを示します。この例では、例2-13のore.frameオブジェクトの順序付けられたSPAM_PKを使用します。この例は、行に名前でアクセスできること、文字の行名のベクターを指定することで行のセットにアクセスできることも示します。次に、実際の整数値を指定できることを示します。例では、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.003.1.4 データの結合
merge関数を使用して、データベース表を表すore.frameオブジェクトのデータを結合できます。
例3-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
3.1.5 データの集計
aggregate関数を使用して、データを集計します。
例3-6 データの集計
この例では、irisデータセットをデータベース・メモリーにore.frameオブジェクトのiris_ofとしてプッシュします。length関数を使用して、iris_ofの値をSpecies列で集計します。その後、結果の最初の3行を表示します。
# Create a temporary database table from the iris data set and get an ore.frame.
iris_of <- ore.push(iris)
aggdata <- aggregate(iris_of$Sepal.Length,
by = list(species = iris_of$Species),
FUN = length)
head(aggdata, 3)この例のリスト# Create a temporary database table from the iris data set and get an ore.frame.
R> iris_of <- ore.push(iris)
R> aggdata <- aggregate(iris_of$Sepal.Length,
+ by = list(species = iris_of$Species),
+ FUN = length)
R> head(aggdata, 3)
species x
setosa setosa 50
versicolor versicolor 50
virginica virginica 503.1.6 データの変換
分析用のデータの準備での一般的なステップは、データを再フォーマットするか新しい列を導出してデータセットに追加することによってデータを変換することです。
この項の例では、データのフォーマットおよび列の導出のための2つの方法を示します。
例3-7 データのフォーマット
この例では、列のデータをフォーマットする関数を作成します。
# 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
例3-8 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
例3-9 派生列の追加
この例では、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.343.1.7 データのサンプリング
サンプリングは統計分析の重要な機能です。
通常、データのサイズを減らし、意味のある作業を実行するためにデータをサンプリングします。Rでは、通常、サンプリングするには、データをメモリーにロードする必要があります。ただし、データが非常に大きい場合、それは不可能です。
OML4Rでは、データベースからデータをプルしてサンプリングするかわりに、データベースで直接サンプリングしてそのサンプル部分であるレコードのみをプルできます。データベースでサンプリングすることで、データの移動を最小化するため、より大きなデータセットで作業できます。これは、この機能を可能にする透過層での順序付けフレームワークの整数行の索引付けであることに注意してください。
ノート:
サンプリングには、「順序付けられたおよび順序付けられていないore.frameオブジェクトの作成」で説明する順序付けられたore.frameオブジェクトを使用する必要があります。
この項の例に、いくつかのサンプリング手法を示します。
例3-10 簡単なランダム・サンプリング
この例では、行をランダムに簡単に選択する方法を示します。この例では、小規模な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
例3-11 分割データ・サンプリング
この例では、トレーニング・セットおよびテスト・セットへのデータのランダムなパーティショニングを示します。このデータの分割は通常、新しいデータに対するモデルの効果を評価するために、分類および回帰で行われます。この例では、前の例で作成した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
例3-12 系統的サンプリング
この例では、定期的に行が選択される系統的サンプリングを示します。この例では、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
例3-13 層別サンプリング
この例では、行が各グループ内で選択される層別サンプリングを示します(グループは、特定の列の値によって決まります)。この例では、各行がグループに割り当てられているデータセットを作成します。関数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
例3-14 クラスタ・サンプリング
この例では、グループ全体がランダムに選択されるクラスタ・サンプリングを示します。この例では、グループに応じてデータを分割してから、グループ内でサンプリングし、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
例3-15 割当てサンプリング
この例では、サンプルとして連続したレコード番号が選択される割当てサンプリングを示します。この例では、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.353.1.8 データのパーティション化
大規模なデータセットの分析での通常の操作は、データセットをランダムにサブセットにパーティション化することです。
次の例に示すとおり、OML4Rの埋込みRの実行を使用することでパーティションを分析できます。
例3-16 データのランダムなパーティショニング
この例では、data.frameオブジェクトを記号myDataを付けてローカルのRセッションに作成し、ランダムに生成された値のセットを含むそのオブジェクトに列を追加します。このデータセットをオブジェクトMYDATAとしてデータベース・メモリーにプッシュします。この例では、埋込みRの実行関数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.0010153.1.9 時系列データの準備
OML4Rでは、時系列データに対して、データのフィルタ処理、順序付け、変換などの多数のデータの準備操作を実行できます。
OML4Rは、Rデータ型をSQLデータ型にマップすることで、OML4Rオブジェクトを作成し、データ準備操作をデータベース・メモリーで実行できます。次の例では、時系列データに対する操作の一部を示します。
例3-17 日時データの集計
この例では、統計集計関数をいくつか示します。最初に、データセットに対して、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"
例3-18 日付および時間の計算の使用方法
この例では、前の例で作成した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
例3-19 日付および時間の比較
この例では、日付および時間の比較を示します。この例では、最初の例で作成した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
例3-20 日付および時間のアクセッサの使用方法
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
例3-21 日付および時間のデータ型の強制変換
この例では、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
例3-22 ウィンドウ関数の使用方法
この例では、ウィンドウ関数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.54457633.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つ以上の列によるデータ・フレームの柔軟なソートを可能にします。 - データの集計
aggregate関数を使用して、データを集計します。 - 数値変数の分布の分析
ore.univariate関数は、ore.frameの数値変数の分布分析を提供します。 - 主要コンポーネント分析
オーバーロードされたprcomp関数およびprincomp関数は、主要コンポーネント分析をデータベースで並行して実行します。 - 特異値分解
オーバーロードされたsvd関数は、特異値分解をデータベースで並行して実行します。
親トピック: データベースでのデータの準備および探索
3.2.1 探索的データ分析関数について
探索的データ分析用のOML4Rの関数は、OREedaパッケージにあります。
表3-1 OREedaパッケージの関数
| 関数 | 説明 |
|---|---|
|
|
|
|
|
オプションの集計、重み付けおよび順序付けオプションで複数の列をサポートすることで、 |
|
|
順序付けられた |
|
|
|
|
|
|
|
|
|
|
|
柔軟な行集約内の |
|
|
|
親トピック: データの探索
3.2.2 サンプルのNARROWデータセットについて
探索的データ分析関数の多くの例で、NARROWデータセットを使用します。
NARROWは、次の例に示すとおり、9列および1500行のore.frameです。一部の列は数値で、それ以外の列もあります。
例3-23 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"
親トピック: データの探索
3.2.3 データの相互関連付け
ore.corr関数を使用して相関分析を実行できます。
ore.corrを使用すると、次のことを実行できます。
-
ore.frameによる数値列のピアソン、スピアマンまたはケンドール相関分析を実行します。 -
制御列を指定することによる部分相関を実行します。
-
相関の前に一部のデータを集計します。
-
結果を後処理して、Rコード・フローに統合します。
ore.corr関数の出力をRのcor関数の出力に適合させることができ、これにより、任意のR関数を使用して出力を後処理したり、出力をグラフィック関数の入力として使用できます。
この関数の引数の詳細は、help(ore.corr)を呼び出してください。
次の例にこれらの操作を示します。
例3-24 基本的な相関計算の実行
この例では、異なる種類の相関統計を指定する方法を示します。
# 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>
例3-25 相関マトリクスの作成
この例では、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親トピック: データの探索
3.2.4 データのクロス集計
クロス集計は、値からなる2つの表の間の相互依存関係を見つける統計手法です。
ore.crosstab関数は、ore.frameのクロス列分析を可能にします。この関数は、Rのtable関数の高性能なバリアントです。
ore.freqを使用して頻度分析を実行する前にore.crosstab関数を使用する必要があります。
ore.crosstab関数呼出しの結果が単一のクロス集計の場合、この関数によってore.frameオブジェクトが返されます。結果が複数のクロス集計の場合は、この関数はore.frameオブジェクトのリストを返します。
この関数の引数の詳細は、help(ore.crosstab)を呼び出してください。
例3-26 単一列頻度表の作成
最も基本的な使用例は、この例に示すとおり、単一列頻度表を作成することです。
この例では、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
例3-27 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.
例3-28 行の重み付け
行を重み付けするには、この例に示すように、別の列に基づいたカウントを含めます。この例では、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
例3-29 クロス集計データの順序付け
クロス集計表の行の順序付けには、次に示すようないくつかの方法があります。
-
分析対象の列によるデフォルトまたは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
例3-30 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.
例3-31 列の範囲の指定
この例に示すように、すべての列の名前を入力するかわりに、列の範囲を指定できます。
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)
例3-32 別の列の値ごとに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
例3-33 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
例3-34 階層化によるクロス集計の拡張
前の例のすべてのクロス集計表は、この例に示すように、階層化で拡張できます。
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")
例3-35 ビニングおよびその後のクロス集計
この例では、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親トピック: データの探索
3.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)を呼び出してください。
例3-36 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
親トピック: データの探索
3.2.6 時系列データでの指数平滑法モデルの構築
ore.esm関数は、順序付けられたore.vectorオブジェクトで、インデータベース時系列観測のための単純または二重の指数平滑化モデルを構築します。
この関数は、時系列データ(観測が固定された均等な間隔)、またはトランザクション・データ(観測が均等な間隔ではない)で動作します。この関数は、トランザクション・データを指定された時間間隔で集計でき、モデル化フェーズに移る前に指定された方法で欠損値を処理することもできます。
ore.esm関数は、データベース・サーバーで動作している1つ以上のRエンジンのデータを処理します。この関数は、クラスore.esmのオブジェクトを返します。
predictメソッドを使用して、ore.esmによって構築される指数平滑法モデルの時系列を予測します。forecastパッケージをロード済の場合は、forecastメソッドをore.esmオブジェクトで使用できます。適合メソッドを使用して、トレーニングの時系列データセットの適合値を生成できます。
ore.esm関数の引数の詳細は、help(ore.esm)を呼び出してください。
例3-37 二重指数平滑法モデルの構築
この例では、統合時系列データセットに基づいて二重指数平滑法モデルを構築します。予測および適合値を生成するために、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)
例3-38 トランザクション・データを使用した時系列モデルの構築
この例では、トランザクション・データセットに基づいて単純平滑法モデルを構築します。事前処理として、平均を取ることで値を日レベルで集計し、欠損値に以前の集計値を設定して埋めます。このモデルは次に、集計された日次時系列に構築されます。関数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
x <- ts1$VAL
esm.mod <- ore.esm(x, "DAY", accumulate = "AVG", model="simple",
setmissing="PREV")
esm.predict <- predict(esm.mod)
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> x <- ts1$VAL
R> esm.mod <- ore.esm(x, "DAY", accumulate = "AVG", model="simple",
+ setmissing="PREV")
R> esm.predict <- predict(esm.mod)
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
例3-39 間隔を指定した二重指数平滑法モデルの構築
この例では、TTRパッケージの株のデータを使用します。これは、日ごとの株の終値に基づいて二重指数平滑法モデルを構築します。30日間の予測株価および元の観測を次の図に示します。
library(TTR)
stock <- "orcl"
xts.data <- getYahooData(stock, 20010101, 20131024)
df.data <- data.frame(xts.data)
df.data$date <- index(xts.data)
of.data <- ore.push(df.data[, c("date", "Close")])
rownames(of.data) <- of.data$date
esm.mod <- ore.esm(of.data$Close, "DAY", model = "double")
esm.predict <- predict(esm.mod, 30)
plot(of.data,type="l")
lines(esm.predict,col="red",lwd=4)
親トピック: データの探索
3.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データセットを使用します。
例3-40 2つの列のランキング
この例では、2つの列AGEおよびCLASSをランキングし、派生列としてその結果をレポートします。値は、デフォルトの順序(昇順)でランキングされます。
x <- ore.rank(data=NARROW, var='AGE=RankOfAge, CLASS=RankOfClass')
例3-41 ランキングでの同順位の処理
この例では、2つの列AGEとCLASSをランキングします。同順位がある場合、同順位のすべての値に最小値が割り当てられます。
x <- ore.rank(data=NARROW, var='AGE=RankOfAge, CLASS=RankOfClass', ties='low')
例3-42 グループ内のランキング
この例では、2つの列AGEおよびCLASSをランキングし、その結果の値をCOUNTRYに従ってランキングします。
x <- ore.rank(data=NARROW, var='AGE=RankOfAge, CLASS=RankOfClass', group.by='COUNTRY')
例3-43 十分位数へのパーティショニング
列を異なる数のパーティションにパーティショニングするには、groupsの値を変更します。たとえば、groups=4では、四分位数にパーティショニングされます。この例では、2つの列AGEおよびCLASSをランキングし、その列を十分位数(10パーティション)にパーティショニングします。
x <- ore.rank(data=NARROW, var='AGE=RankOfAge, CLASS=RankOfClass',groups=10)
例3-44 累積分布関数の見積り
この例では、2つの列AGEおよびCLASSをランキングし、両方の列の累積分布関数を見積もります。
x <- ore.rank(data=NARROW, var='AGE=RankOfAge, CLASS=RankOfClass',nplus1=TRUE)
例3-45 ランクのスコアリング
この例では、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')親トピック: データの探索
3.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データセットを使用します。
例3-46 降順での列のソート
この例では、列AGEおよびGENDERを降順でソートします。
x <- ore.sort(data=NARROW, by='AGE,GENDER', reverse=TRUE)
例3-47 列ごとに異なる順序でのソート
この例では、AGEを降順で、GENDERを昇順でソートします。
x <- ore.sort(data=NARROW, by='-AGE,GENDER')
例3-48 ソートおよび一意の値ごとに1行を返す
この例では、AGEを基準にソートし、AGEの一意の値ごとに1行を保持します。
x <- ore.sort(data=NARROW, by='AGE', unique.key=TRUE)
例3-49 重複列の削除
この例では、AGEを基準にソートし、重複する行を削除します。
x <- ore.sort(data=NARROW, by='AGE', unique.data=TRUE)
例3-50 重複列の削除および一意の値ごとに1列を返す
この例では、AGEを基準にソートし、重複する行を削除して、AGEの一意の値ごとに1行を返します。
x <- ore.sort(data=NARROW, by='AGE', unique.data=TRUE, unique.key = TRUE)
例3-51 出力での相対順序の維持
この例では、ソートされた出力で相対順序を維持します。
x <- ore.sort(data=NARROW, by='AGE', stable=TRUE)
例3-52 2つの列の異なる順序でのソート
この例では、ONTIME_Sをエアライン名を基準に降順で、出発の遅延を昇順でソートします。
sortedOnTime1 <- ore.sort(data=ONTIME_S, by='-UNIQUECARRIER,DEPDELAY')
例3-53 2つの列の異なる順序でのソートおよび一意の組合せの生成
この例では、ONTIME_Sをエアライン名と出発の遅延を基準にソートし、各組合せの1つを選択します(つまり、一意のキーを返します)。
sortedOnTime1 <- ore.sort(data=ONTIME_S, by='-UNIQUECARRIER,DEPDELAY',
unique.key=TRUE)親トピック: データの探索
3.2.9 データの集計
aggregate関数を使用して、データを集計します。
例3-54 データの集計
この例では、irisデータセットをデータベース・メモリーにore.frameオブジェクトのiris_ofとしてプッシュします。length関数を使用して、iris_ofの値をSpecies列で集計します。その後、結果の最初の3行を表示します。
# Create a temporary database table from the iris data set and get an ore.frame.
iris_of <- ore.push(iris)
aggdata <- aggregate(iris_of$Sepal.Length,
by = list(species = iris_of$Species),
FUN = length)
head(aggdata, 3)この例のリスト# Create a temporary database table from the iris data set and get an ore.frame.
R> iris_of <- ore.push(iris)
R> aggdata <- aggregate(iris_of$Sepal.Length,
+ by = list(species = iris_of$Species),
+ FUN = length)
R> head(aggdata, 3)
species x
setosa setosa 50
versicolor versicolor 50
virginica virginica 50親トピック: データの探索
3.2.10 数値変数の分布の分析
ore.univariate関数は、ore.frameの数値変数の分布分析を提供します。
ore.univariate関数では、次の統計が提供されています。
-
summary関数によってレポートされるすべての統計 -
符号順位検定、スチューデントのt-検定
-
極値のレポート
ore.univariate関数は、すべての場合に出力としてore.frameを返します。
この関数の引数の詳細は、help(ore.univariate)を呼び出してください。
例3-55 デフォルトの単変量統計の計算
この例では、AGE、YRS_RESIDENCEおよびCLASSのデフォルトの単変量統計を計算します。
ore.univariate(NARROW, var="AGE,YRS_RESIDENCE,CLASS")
例3-56 デフォルトの単変量統計の計算
この例では、YRS_RESIDENCEの位置統計を計算します。
ore.univariate(NARROW, var="YRS_RESIDENCE", stats="location")
例3-57 完全な分位統計の計算
この例では、AGEおよびYRS_RESIDENCEの完全な分位統計を計算します。
ore.univariate(NARROW, var="AGE,YRS_RESIDENCE",stats="quantiles")
親トピック: データの探索
3.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('ore.frame-prcomp')およびhelp('ore.frame-princomp')を呼び出してください。
ノート:
biplot 関数は、これらの透過層メソッドによって返されるオブジェクトではサポートされていません。
例3-58 prcompおよびprincomp関数の使用方法
USARRESTS <- ore.push(USArrests)
# Using prcomp
prcomp(USARRESTS)
prcomp(USARRESTS, scale. = TRUE)
# Formula interface
prcomp(~ Murder + Assault + UrbanPop, data = USARRESTS, scale. = TRUE)
# Using prcomp
princomp(USARRESTS)
princomp(USARRESTS, cor = TRUE)
# Formula interface
princomp(~ Murder + Assault + UrbanPop, data = USARRESTS, cor = TRUE)この例のリスト
R> USARRESTS <- ore.push(USArrests)
R>
R> # Using prcomp
R>
R> prcomp(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.親トピック: データの探索
3.2.12 特異値分解
オーバーロードされたsvd関数は、特異値分解をデータベースで並行して実行します。
svd関数は、ore.frameまたはore.tblmatrixオブジェクトをx引数として受け取ります。ore.frame-svdメソッドは、データベースで実行されるパラレル・プロセスにブロックSVD計算を分散します。このメソッドは、グローバル・オプションore.parallelを使用して、採用する並列度を決定します。
この関数は、引数xの特異値分解のdベクターおよびv行列成分を含むlistオブジェクトを返します。左特異ベクター行列uは返さないため、引数nuは使用されません。
この関数の引数の詳細は、help('ore.frame-svd')を呼び出してください。
例3-59 svd関数の使用方法
USARRESTS <- ore.push(USArrests)
svd(USARRESTS)この例のリスト
R> USARRESTS <- ore.push(USArrests)
R> svd(USARRESTS)
$d
[1] 1419.06140 194.82585 45.66134 18.06956
$v
[,1] [,2] [,3] [,4]
[1,] 0.04239181 -0.01616262 0.06588426 0.99679535
[2,] 0.94395706 -0.32068580 -0.06655170 -0.04094568
[3,] 0.30842767 0.93845891 -0.15496743 0.01234261
[4,] 0.10963744 0.12725666 0.98347101 -0.06760284
親トピック: データの探索
3.3 OREdplyrを使用したデータ操作
OREdplyrパッケージ関数は、ore.frameおよびore.numericオブジェクトで使用するdplyr関数を透過的に実装します。
これらの多くの関数には、標準以外の評価(NSE)および標準の評価(SE)インタフェースが含まれます。SE関数では、関数名にアンダースコア( _)が追加されます。NSE関数は、インタラクティブRセッションで役立ちます。SE関数は、プログラムでの使用に便利です。
OREdplyrパッケージの関数は、次のトピックで説明します。
- データの選択および順序付け
ore.frameオブジェクトの列と行のデータを選択および順序付けするOREdplyr関数。 - 行の結合
行を結合するOREdplyr関数。 - 列と行のグループ化
列と行をグループ化するOREdplyr関数。 - 列と行の集計
列と行を集計するOREdplyr関数。 - 行のサンプリング
行をサンプリングするOREdplyr関数。 - 行のランキング
行をランキングするOREdplyr関数。
親トピック: データベースでのデータの準備および探索
3.3.1 データの選択および順序付け
ore.frameオブジェクトの列と行のデータを選択および順序付けするOREdplyr関数。
表3-2 列と行の選択および順序付け
| 関数 | 説明 |
|---|---|
|
|
指定された列で行を順序付けします。 |
|
|
降順で |
|
|
指定された列で入力 |
|
|
指定された条件と一致する行をフィルタします。 |
|
|
新しい列を追加します。 |
|
|
指定された列の名前を変更し、すべての列を保持します。 |
|
|
指定された列のみを選択します。 |
|
|
位置で行を選択します。順序付けられた入力 |
|
|
新しい列を追加し、既存の列を削除します。 |
これらの関数の使用例を次に示します。
- 列の選択例
OREdplyrパッケージのselect関数およびrename関数の例。 - select_を使用したプログラミング例
OREdplyrパッケージのselect_関数の例。 - 個別列の選択例
OREdplyrパッケージのdistinct関数およびarrange関数の例。 - 位置による行の選択例
OREdplyrパッケージのslice関数およびfilter関数の例。 - 列の配置例
OREdplyrパッケージのarrange関数およびdesc関数の例。 - 列のフィルタ例
OREdplyrパッケージのfilter関数の例。 - 列の変更例
OREdplyrパッケージのmutate関数およびtransmute関数の例。
親トピック: OREdplyrを使用したデータ操作
3.3.1.1 列の選択例
OREdplyrパッケージのselectおよびrename関数の例。
例3-60 列の選択
次の例では、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"
親トピック: データの選択および順序付け
3.3.1.2 select_を使用したプログラミング例
OREdplyrパッケージのselect_関数の例。
例3-61 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
親トピック: データの選択および順序付け
3.3.1.3 個別列の選択例
OREdplyrパッケージのdistinctおよびarrange関数の例。
例3-62 個別列の選択
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
親トピック: データの選択および順序付け
3.3.1.4 位置による行の選択例
OREdplyrパッケージのsliceおよびfilter関数の例。
例3-63 位置による行の選択
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親トピック: データの選択および順序付け
3.3.1.5 列の配置例
OREdplyrパッケージのarrangeおよびdesc関数の例。
例3-64 列の配置
この例では、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
親トピック: データの選択および順序付け
3.3.1.6 列のフィルタ例
OREdplyrパッケージのfilter関数の例。
例3-65 列のフィルタ
この例では、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親トピック: データの選択および順序付け
3.3.1.7 列の変更例
OREdplyrパッケージのmutateおよびtransmute関数の例。
例3-66 列の変更
この例では、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親トピック: データの選択および順序付け
3.3.2 行の結合
行を結合するOREdplyr関数。
表3-3 行の結合
| 関数 | 説明 |
|---|---|
|
|
|
|
|
一致した列のxおよびyからすべての行の組合せを返します。 |
|
|
|
|
|
|
例3-67 行の結合
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を使用したデータ操作
3.3.3 列と行のグループ化
列と行をグループ化するOREdplyr関数。
表3-4 列と行のグループ化
| 関数 | 説明 |
|---|---|
|
|
指定された列の |
|
|
各グループの行数をリストします。 |
|
|
グループ化列の名前を表示します。 |
|
|
グループ数を返します。 |
|
|
入力 |
例3-68 グループ化関数の使用方法
次の例では、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を使用したデータ操作
3.3.4 列と行の集計
列と行を集計するOREdplyr関数。
表3-5 列と行の集計
| 関数 | 説明 |
|---|---|
|
|
グループ別に行をカウントします。 |
|
|
集計関数を使用して、列をまとめます。 |
tally |
グループ別に行を集計します。最初の集計か再集計に応じて |
例3-69 列の集計
次の例では、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を使用したデータ操作
3.3.5 行のサンプリング
行をサンプリングするOREdplyr関数。
表3-6 行のサンプリング関数
| 関数 | 説明 |
|---|---|
|
|
分数で |
|
|
固定数の行で |
例3-70 行のサンプリング
次の例では、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を使用したデータ操作
3.3.6 行のランキング
行をランキングするOREdplyr関数。
ランキング関数は、値によって順序付けられたore.vectorの要素をランキングします。ore.characterは、ore.factorに強制変換されます。ore.factorの値は、ファクタ・レベルに基づいています。ランキングの方向を逆にするには、desc関数を使用します。
表3-7 行のランキング
| 関数 | 説明 |
|---|---|
cume_dist |
累積分布関数は、現在のランク以下のすべての値の割合を返します。 |
dense_rank |
|
|
|
順序付けられた |
|
|
順序付けられた |
min_rank |
|
|
|
順序の指定された位置の値を取得します。 |
ntile |
入力ベクターをnバケットに分割する大まかなランキング。 |
|
|
順序付けられた |
percent_rank |
|
|
|
|
|
|
行の最上位または最下位の数を選択します。 |
例3-71 行のランキング
次の例では、ランキング関数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を使用したデータ操作
3.4 クライアントでのサード・パーティのパッケージの使用について
Oracle Machine Learning for Rでは、Comprehensive R Archive Network (CRAN)のオープン・ソースのRパッケージまたは他のサード・パーティのRパッケージの関数を使用する場合、通常は、埋込みRの実行のコンテキストで行います。
埋込みRの実行を使用すると、データベース・サーバー上の多量である可能性の高いメモリーを利用できます。
ただし、Oracle Database表のデータに対してローカルのRセッションでサード・パーティのパッケージを使用する場合は、ore.pull関数を使用して、データをore.frameオブジェクトからローカル・セッションにdata.frameオブジェクトとして取得する必要があります。これは、DBAの協力なしにデータベースからデータを抽出できることを除いて、オープン・ソースRを使用する場合と同様です。
データベース表からローカルのdata.frameにデータをプルする場合、ローカル・マシンのメモリーに適合するデータ量に使用が制限されます。ローカル・マシンでは、埋込みRの実行で提供される利点を利用できません。
サード・パーティのパッケージを使用するには、システムにインストールして、Rセッションでロードする必要があります。
kernlabパッケージの使用例は、例2-13を参照してください。
例3-72 クライアントへのサード・パーティ・パッケージのダウンロード、インストールおよびロード
この例では、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")
例3-73 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
親トピック: データベースでのデータの準備および探索

