「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

Rによるデータサイエンス(01/21)

 Rについて

をベースに学んでいく。

1. Rとデータマイニングの基礎

1.1 オブジェクト

 Rはオブジェクト言語である。Rのオブジェクトは

関数オブジェクト
:データ処理・解析のプログラムセット
データオブジェクト
:データセット

の2つがある。
 複数の関数オブジェクトがリンクしているオブジェクトグループをクラスという。
 関数オブジェクトを略して関数と呼ぶことにする。基本的に関数は

関数(引数)

という形で()の中の文字列を引数という。引数にはデータあるいはデータ解析のための条件などが入る。

1.2 自作関数

 Rで自作関数を作る際は関数\mathrm{function}を用いて関数オブジェクトを作成する。

関数の名前 <- \mathrm{function}(引数){
  プログラム本体
}

1.3 繰り返し文

 Rで繰り返し処理を行うには\mathrm{for},\mathrm{while},\mathrm{repeat}がある。

\mathrm{for}(変数 \mathrm{in} 変数の開始値:変数の終了値){
    繰り返し処理される部分
}

 ただし\mathrm{R}では繰り返し処理は遅い。実際、以下のスクリプトを実行したところ、相当な違いが出た。

n <- 100000000

x <- runif(n)
y <- runif(n)
z <- vector(length = n)

(t1 <- system.time(z <- x + y))
(t2 <- system.time(for(i in 1:n){z[i] <- x[i] + y[i]}))

 \mathrm{for}文は()と付いているように関数である。コロン:もまた関数である。

# 以下は等価
1:100
":"(1,100)

高速化するには、単にループを避けるだけでは難しい場合が多い。主にベクトル化により高速化する*1
 ベクトルフィルタリングはベクトル化の一種である。

# 以下の関数のスピードをfor文と比較する
oddcount <- function(x)return(sum(x%%2==1))

#
x <- sample(1:1000000000,10000000,replace = T)

system.time(oddcount)

system.time(
  {
    c <- 0
    for(i in 1:length(x)){
      if(x[i]==1){c <- c + 1}
    }
  }
)

 他には\mathrm{ifelse}(),\mathrm{which}(),\mathrm{where}(),\mathrm{any}(),\mathrm{all}(),\mathrm{cumsum}(),\mathrm{cumprod}()や、\mathrm{rowSums}(),\mathrm{colSums}()などが使える。他にも\mathrm{combin}(),\mathrm{outer}(),\mathrm{lower.tri}(),\mathrm{upper.tri}(),\mathrm{expand},\mathrm{grid}()が該当する。

2. データの入出力と編集

2.1 ベクトル

 1行または1列のデータセットベクトルという。

# ベクトル:以下はすべて等価
sales <- c(15,20,25,10,30)
sales = c(15,20,25,10,30)
assign("sales", c(15,20,25,10,30))
c(15,20,25,10,30) -> sales

2.2 データフレーム

 長さが同じであるような複数の行(あるいは列)のデータを並べたものを行列という。行列には\mathrm{matrix},\mathrm{data frame}という2つのオブジェクト形式が頻用される。
 

mt_one <- matrix(1,3,4) # 行数、列数がそれぞれ3,4ですべての要素が1であるような行列
mt_one[1,3] <- 2 #第1行3列を2にする

2.3 配列

 複数のデータ表を1つにまとめたものを配列という。\mathrm{array}関数を用いて生成できる。

2.4 リスト

 ベクトル、行列、配列およびリストなどの異なる方のデータを1つのオブジェクトとして扱うことが可能なオブジェクトである。\mathrm{list}関数を用いて作成する。

2.5 データ形式の確認

 \mathrm{class}関数および\mathrm{is.numeric}などの関数を用いてオブジェクトのデータ形式を確認できる。

2.6 データファイルの読込

 外部のテキストファイルを\mathrm{R}に読み込む関数には\mathrm{read.table},\mathrm{read.csv},\mathrm{scan}などがある。

# Excelからコピーしたセルのデータを読み込む
read.delim("clipboard")

# 小・中規模のデータを読み込む
read.table("...ファイルパス...",header = T, row.names = 1, sep = ",") # ヘッダーありで第1列をヘッダーとする。データ区切りは,(カンマ)とする

# csv形式を読み込む
read.csv("...ファイルパス...")

# 大規模のデータを読み込む
scan("...ファイルパス...")

2.7 データの出力

write(data, "...ファイルパス...")

write.table(data, "...ファイルパス...")

write.csv(data, "...ファイルパス...")

# sinkによる出力
sink("...ファイルパス...") # 出力開始:ファイルパスに出力する
data1; data2               # 出力対象の指定
sink() # sink関数の終わり  # 出力終了

2.8 データの結合

 行列にデータ(行または列)を追加するには、\mathrm{rbind},\mathrm{cbind}関数を用いる。追加対象はベクトルまたは行列である。

rbind(df1,1:10)
cbind(df2,1:10)

2.9 データの並び替え

 ベクトル、行列の要素を並び替える関数として\mathrm{sort}がある。\mathrm{sort}は並び変わった引数を返り値とする。
 他方で行列をある行・列を基準にして並び替えるには\mathrm{sort.list},\mathrm{order}を用いる。

2.10 よく使われる関数

データ型とデータセットの操作  
\mathrm{array}
 
\mathrm{as.****}
配列型
\mathrm{c}
データをベクトルまたはリスト

として結合する。
\mathrm{character}
文字型
\mathrm{class}
オブジェクトの型を返す。
\mathrm{complex}
複素数
\mathrm{data.frame}
データフレーム型
\mathrm{integer}
整数型
\mathrm{is.****}
引数が指定したデータ型

かを判別する。
\mathrm{list}
リスト型
\mathrm{logical}
論理型
\mathrm{matrix}
行列型
\mathrm{null}
空データ型
\mathrm{numerical}
実数型
\mathrm{t}
データを転置する。
\mathrm{table}
個々のデータの出現頻度を返す。

分割表を作成する。
\mathrm{vector}
ベクトル型。
サイズ  
\mathrm{dim}
行列、配列のサイズを返す。
\mathrm{length}
データオブジェクトの長さを返す。
\mathrm{ncol}
列数を返す。
\mathrm{nrow}
行数を返す。
名前  
\mathrm{colnames}
列に名前を付ける。
\mathrm{names}
データ項目に名前を付ける。
\mathrm{rownames}
行に名前を付ける。
並べ替え
\mathrm{rank}
ランクを返す。
\mathrm{rev}
逆の順に並び替える。
\mathrm{sort}
昇順に並び替える。
\mathrm{sort.list, order}
昇順に並び替えたときの

元のデータの位置を返す。
結合と編集  
\mathrm{cbind}
列方向にデータを追加。
\mathrm{data.entry}
表計算風のデータエディタを起動する。
\mathrm{edit}
エディタを起動する。
\mathrm{edit.data.frame}
データオブジェクトを編集する。
\mathrm{fix}
オブジェクトを編集する。
\mathrm{rbind}
行方向にデータを追加。
その他  
\mathrm{rm}
\mathrm{rm(x)}でオブジェクト\mathrm{x}を削除する。
\mathrm{ls}
\mathrm{ls()}でオブジェクトのリストを返す。

補足 スペック情報

エディション Windows 10 Home
バージョン 20H2
プロセッサ Intel(R) Core(TM) i5-1035G4 CPU @ 1.10GHz 1.50 GHz
実装 RAM 8.00 GB
システムの種類 64 ビット オペレーティング システム、x64 ベース プロセッサ
R バージョン 3.6.3 (2020-02-29)
RStudio バージョン 1.2.5033

*1:以降は、Matloff, Norman(2012)「アート・オブ・Rプログラミング」(オライリー・ジャパン)PP.302-参照。

プライバシーポリシー お問い合わせ