馬場さん教科書 第2部 - 1
# データ分析を体験する|R言語ではじめるプログラミングとデータ分析
# 馬場真哉
setwd("/Users/gakugaku/Desktop/BioStat2020/")
# 単回帰分析 -------------------------------------------------------------------
data_height <- read.csv("2-1-1-height.csv")
mod_lm <- lm(children ~ parents, data = data_height)
summary(mod_lm)
##
## Call:
## lm(formula = children ~ parents, data = data_height)
##
## Residuals:
## Min 1Q Median 3Q Max
## -11.677 -3.148 1.236 3.016 6.417
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 90.5770 29.5947 3.061 0.0156 *
## parents 0.4581 0.1745 2.626 0.0304 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.777 on 8 degrees of freedom
## Multiple R-squared: 0.4629, Adjusted R-squared: 0.3958
## F-statistic: 6.895 on 1 and 8 DF, p-value: 0.03037
馬場さん教科書 第2部 - 2
# 3行プログラミングを構成する要素|R言語ではじめるプログラミングとデータ分析
# 馬場真哉
# 変数 ----------------------------------------------------------------------
# aという容れ物に「3」という数値を格納する
a <- 3
# 変数の中身を確認する
a
## [1] 3
# 変数を使った演算
a * 4
## [1] 12
# これはOK
a_1 <- 3
# これはダメ
# 1_a <- 3
# 変数の使用例 ------------------------------------------------------------------
# 書籍の価格
book_price <- 2000
# 割引額
discount_amount <- 200
# 割引後の書籍の価格
book_price - discount_amount
## [1] 1800
# 対数の計算 -------------------------------------------------------------------
# 数値の「8」の自然対数
log(8)
## [1] 2.079442
# 数値の「8」の、2を底とした対数
log(8, 2)
## [1] 3
# 数値の「8」の、2を底とした対数
log(x = 8, base = 2)
## [1] 3
# 引数の順番を変える
log(2, 8)
## [1] 0.3333333
log(base = 2, x = 8)
## [1] 3
# 変数の活用 -------------------------------------------------------------------
# 書籍の金額の自然対数を得る
log(x = book_price)
## [1] 7.600902
# 計算結果の格納
log_book_price <- log(x = book_price)
# print関数による結果の出力 -----------------------------------------------------------------
# 普通の出力
print(log_book_price)
## [1] 7.600902
# 表示桁数の指定
print(log_book_price, digits = 4)
## [1] 7.601
# help関数 ------------------------------------------------------------------
help(log)
?log
馬場さん教科書 第2部 - 3
# データの型|R言語ではじめるプログラミングとデータ分析
# 馬場真哉
# データの型の判断とclass関数 --------------------------------------------------------
# データの型の確認
class(2)
## [1] "numeric"
# 数値:numericとinteger ------------------------------------------------------
# 整数型
class(2L)
## [1] "integer"
# 論理値型 --------------------------------------------------------------------
# 論理値型
class(TRUE)
## [1] "logical"
class(FALSE)
## [1] "logical"
# memo:TRUEやFALSEの省略形
# 省略形
T
## [1] TRUE
F
## [1] FALSE
# 中身の書き換え
T <- 930
# Tの中身の確認
T
## [1] 930
# Tのデータ型の確認
class(T)
## [1] "numeric"
# 文字列型 --------------------------------------------------------------------
# 文字列型
class("A")
## [1] "character"
# ファクター -------------------------------------------------------------------
# ファクター
class(factor("A"))
## [1] "factor"
# 参考:数値をfactorにする
factor(1)
## [1] 1
## Levels: 1
# 欠損など ----------------------------------------------------------------
## NA
# NA:あるべきデータがそこにない
NA
## [1] NA
## NULL
# NULL:空である
NULL
## NULL
## NaN
# 計算できない
NaN
## [1] NaN
0 / 0
## [1] NaN
## Inf
# 無限
Inf
## [1] Inf
1 / 0
## [1] Inf
# データの型の変換 ----------------------------------------------------------------
## データ型の変換の基本
# 数値
num <- 1
class(num)
## [1] "numeric"
# factorに変換
num_to_fac <- as.factor(num)
class(num_to_fac)
## [1] "factor"
# 参考:関数一覧
class(as.numeric("2")) # 数値に変換
## [1] "numeric"
class(as.integer(2)) # 整数に変換
## [1] "integer"
class(as.logical(2)) # 論理値型に変換
## [1] "logical"
class(as.character(2)) # characterに変換
## [1] "character"
class(as.factor(2)) # factorに変換
## [1] "factor"
## numericとlogicalの変換
# numeric→logical
as.logical(0)
## [1] FALSE
as.logical(1)
## [1] TRUE
as.logical(2)
## [1] TRUE
# logical→numeric
as.numeric(FALSE)
## [1] 0
as.numeric(TRUE)
## [1] 1
# データの型のチェック --------------------------------------------------------------
# numericかどうかのチェック
num <- TRUE
is.numeric(num)
## [1] FALSE
# 論理値型への足し算
num <- TRUE
num + 5
## [1] 6
# 参考:関数一覧
is.numeric(1) # 数値判定
## [1] TRUE
is.integer(1) # 整数判定
## [1] FALSE
is.logical(1) # 論理値判定
## [1] FALSE
is.character(1) # 文字列判定
## [1] FALSE
is.factor(1) # factor判定
## [1] FALSE
is.na(1) # NA判定
## [1] FALSE
is.null(1) # NULL判定
## [1] FALSE
is.nan(1) # Nan判定
## [1] FALSE
is.infinite(1) # Inf判定
## [1] FALSE
馬場さん教科書 第2部 - 4
# ベクトル・行列・配列|R言語ではじめるプログラミングとデータ分析
# 馬場真哉
# ベクトルの作成 ----------------------------------------------------------------
## ベクトル作成の基本
# 3つの要素を持つベクトルを作る
vec_num <- c(1, 2, 3)
# 確認
vec_num
## [1] 1 2 3
## 数値以外のベクトルの作成
# character型のベクトル
vec_char <- c("A", "B", "C")
vec_char
## [1] "A" "B" "C"
# logical型のベクトル
vec_logical <- c(TRUE, FALSE, TRUE)
vec_logical
## [1] TRUE FALSE TRUE
# ベクトルは単一のデータ型しか格納できない ------------------------------------------------------------
# numericとcharacterを混ぜてはいけない
vec_num_char <- c(1, 2, "A")
vec_num_char
## [1] "1" "2" "A"
# 3日間の平均気温の計算 -------------------------------------------------------------
# 3日間の気温の平均値を計算する
temperature <- c(20, 19, 23)
mean_temperature <- mean(temperature)
print(mean_temperature, digits = 3)
## [1] 20.7
# ベクトルの個別の要素にラベルを付ける ------------------------------------------------------
# ベクトルの個別の要素にラベルを付ける
temperature <- c(20, 19, 23)
names(temperature) <- c("Osaka", "Tokyo", "Nagoya")
temperature
## Osaka Tokyo Nagoya
## 20 19 23
# 等差数列の作成 -----------------------------------------------------------------
# 等差数列の作成
1:5
## [1] 1 2 3 4 5
# 様々な等差数列
2:4
## [1] 2 3 4
# 規則性のある繰り返しを持つベクトルの作成 ----------------------------------------------------
## rep関数による繰り返し
# 1を10回繰り返す
rep(x = 1, times = 10)
## [1] 1 1 1 1 1 1 1 1 1 1
# 「1,2」を5回繰り返す
rep(x = c(1, 2), times = 5)
## [1] 1 2 1 2 1 2 1 2 1 2
# 各々の要素を5回ずつ繰り返す
rep(x = c(1, 2), each = 5)
## [1] 1 1 1 1 1 2 2 2 2 2
## seq関数による規則性のあるベクトルの作成
# 1から5の等差数列
seq(from = 1, to = 10, by = 1)
## [1] 1 2 3 4 5 6 7 8 9 10
# 0から1まで、0.25ずつ増やす
seq(from = 0, to = 1, by = 0.25)
## [1] 0.00 0.25 0.50 0.75 1.00
# 1から10までを4等分
seq(from = 1, to = 10, length.out = 4)
## [1] 1 4 7 10
# もともと用意されているベクトル ---------------------------------------------------------
# 大文字のアルファベット
LETTERS
## [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
## [20] "T" "U" "V" "W" "X" "Y" "Z"
# 小文字のアルファベット
letters
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
## [20] "t" "u" "v" "w" "x" "y" "z"
# 月の名称
month.abb
## [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
# ベクトルの個別の要素の取得 -----------------------------------------------------------
# 抽出対象
vec_char
## [1] "A" "B" "C"
## 要素番号を指定する
# 1番目の要素だけを取得する
vec_char[1]
## [1] "A"
# 1,3番目の要素を取得する
vec_char[c(1, 3)]
## [1] "A" "C"
# 2番目の要素を省く
vec_char[-2]
## [1] "A" "C"
# 要素数を超える場合
vec_char[4]
## [1] NA
## ラベルを指定する
# ラベルで指定
temperature["Osaka"]
## Osaka
## 20
# ラベルのベクトルを指定することもできる
temperature[c("Osaka", "Nagoya")]
## Osaka Nagoya
## 20 23
## TRUEかFALSEで指定する
# 1番目と3番目の要素を取得
vec_char[c(TRUE, FALSE, TRUE)]
## [1] "A" "C"
# lengthによる要素数の取得 ---------------------------------------------------------
# 要素数の取得
length(vec_char)
## [1] 3
# 単一の数値が相手の場合は、長さは1になる
num <- 2
length(num)
## [1] 1
# ベクトル同士の演算 ---------------------------------------------------------------
# 同じ要素数を持つベクトル通しの足し算
vec_num_1 <- c(1, 2, 3)
vec_num_2 <- c(10, 20, 30)
vec_num_1 + vec_num_2
## [1] 11 22 33
# 参考:引き算
vec_num_1 - vec_num_2
## [1] -9 -18 -27
# 参考:掛け算
vec_num_1 * vec_num_2
## [1] 10 40 90
# 参考:割り算
vec_num_1 / vec_num_2
## [1] 0.1 0.1 0.1
# 長さが異なるベクトル同士の演算 ---------------------------------------------------------
# ベクトルの長さが異なるとき
vec_num_3 <- c(4, 5, 6)
vec_num_4 <- c(40, 50)
vec_num_3 + vec_num_4
## Warning in vec_num_3 + vec_num_4: 長いオブジェクトの長さが短いオブジェクトの長さ
## の倍数になっていません
## [1] 44 55 46
# 単一の数値は、長さ1のベクトルとして扱われる
vec_num_1 + 5
## [1] 6 7 8
# 行列の作成 -------------------------------------------------------------------
# 3行2列の行列を作る
# 列数を指定
mat_num <- matrix(
data = c(1, 2, 3, 4, 5, 6),
ncol = 2
)
# 確認
mat_num
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
# 行数を指定
mat_num_row <- matrix(
data = c(1, 2, 3, 4, 5, 6),
nrow = 3
)
# 確認
mat_num_row
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
# memo:行単位でデータを格納する
mat_num_by_row <- matrix(
data = c(1, 2, 3, 4, 5, 6),
nrow = 3,
byrow = TRUE
)
# 確認
mat_num_by_row
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
## [3,] 5 6
# 行ラベルと列ラベルの指定 ------------------------------------------------------------
# 行名と列名の指定
colnames(mat_num) <- c("col1", "col2")
rownames(mat_num) <- c("row1", "row2", "row3")
# 結果の確認
mat_num
## col1 col2
## row1 1 4
## row2 2 5
## row3 3 6
# 行列の個別の要素の取得 -------------------------------------------------------------
## 行番号と列番号を指定する
# 2行1列目の取得
mat_num[2, 1]
## [1] 2
# 2行目の取得
mat_num[2, ]
## col1 col2
## 2 5
# 1列目の要素を取得
mat_num[, 1]
## row1 row2 row3
## 1 2 3
# 特定の行や列を除く
mat_num[-1, -2]
## row2 row3
## 2 3
# 要素番号にはベクトルを指定できる
mat_num[2:3, ]
## col1 col2
## row2 2 5
## row3 3 6
## ラベルを指定する
# 行名と列名を指定して、要素を取得
mat_num["row2", "col1"]
## [1] 2
# ラベルのベクトルを指定
mat_num[c("row2", "row3"), "col1"]
## row2 row3
## 2 3
## TRUEかFALSEで指定する
# 1行目と2行目でかつ、2列目のデータのみを取得
mat_num[c(TRUE, TRUE, FALSE), c(FALSE, TRUE)]
## row1 row2
## 4 5
# nrow・ncol・dimによる行数と列数の取得 ---------------------------------------------------
# 行数
nrow(mat_num)
## [1] 3
# 列数
ncol(mat_num)
## [1] 2
# 行数と列数を両方出力
dim(mat_num)
## [1] 3 2
# memo:matrixに対してlength関数を適用したときの結果
length(mat_num)
## [1] 6
# rbindとcbindによる行列の結合 -----------------------------------------------------
## 結合対象となる行列の作成
# 結合の対象となる行列
mat_1 <- matrix(
data = 1:6,
ncol = 2,
byrow = TRUE
)
mat_2 <- matrix(
data = (11:16) * 10,
ncol = 2,
byrow = TRUE
)
# 作成結果
mat_1
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
## [3,] 5 6
mat_2
## [,1] [,2]
## [1,] 110 120
## [2,] 130 140
## [3,] 150 160
## 行の結合
# 縦に伸ばす(行数が増える)
rbind(mat_1, mat_2)
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
## [3,] 5 6
## [4,] 110 120
## [5,] 130 140
## [6,] 150 160
## 列の結合
# 横に伸ばす(列数が増える)
cbind(mat_1, mat_2)
## [,1] [,2] [,3] [,4]
## [1,] 1 2 110 120
## [2,] 3 4 130 140
## [3,] 5 6 150 160
# 配列の作成 -------------------------------------------------------------------
# 「『2行3列の行列』を2つ持つ配列」を作る
array_num <- array(
data = 1:12,
dim = c(2, 3, 2), # 行数・列数・行列の数
)
# 確認
array_num
## , , 1
##
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] 7 9 11
## [2,] 8 10 12
# 配列の個別の要素の取得 -------------------------------------------------------------
# 指定する要素番号が1つ増える
array_num[2, 3, 2]
## [1] 12
馬場さん教科書 第2部 - 5
# 整然データとはなにか -------------------------------------------------------------------
# 整然データではないデータ
vec_dame <- c("オス:13.8cm", "オス:14.3cm", "メス:6.8cm")
# データフレームの作成 --------------------------------------------------------------
# データフレームの作成
df_crab <- data.frame(
sex = c("male", "male", "male", "female", "female", "female"),
shell_width = c(13.8, 14.3, 14.1, 6.8, 7.2, 6.5),
scissors_width = c( 2.8, 3.2, 3.1, 1.8, 2.3, 2.1)
)
# 確認
df_crab
# memo:rep関数を使う
# 参考:rep関数を使う
rep(c("male", "female"), each = 3)
## [1] "male" "male" "male" "female" "female" "female"
# 整然データと雑然データ -------------------------------------------------------------
# 整然データではないデータ
df_crab_dame <- data.frame(
male_shell = c(13.8, 14.3, 14.1),
female_shell = c( 6.8, 7.2, 6.5),
male_scissors = c( 2.8, 3.2, 3.1),
female_scissors = c( 1.8, 2.3, 2.1)
)
# 確認
df_crab_dame
# $記号を使った列の取得 ------------------------------------------------------------
# $記号を使って性別の列のみを取得
df_crab$sex
## [1] "male" "male" "male" "female" "female" "female"
# 甲羅の大きさのみ
df_crab$shell_width
## [1] 13.8 14.3 14.1 6.8 7.2 6.5
df_crab$shell
## [1] 13.8 14.3 14.1 6.8 7.2 6.5
# ハサミの幅のみ
df_crab$sc
## [1] 2.8 3.2 3.1 1.8 2.3 2.1
# データフレームの個別の要素の取得 -----------------------------------------------------------------
## 二重角カッコを使った列の取得
# 列番号を指定
df_crab[[1]]
## [1] "male" "male" "male" "female" "female" "female"
# 性別のみ
df_crab[["sex"]]
## [1] "male" "male" "male" "female" "female" "female"
## 一重角カッコを使った列の取得
# 角カッコを使う
df_crab[, 1]
## [1] "male" "male" "male" "female" "female" "female"
# 角カッコに列名を指定する
df_crab[, "sex"]
## [1] "male" "male" "male" "female" "female" "female"
# 角カッコに列名のベクトルを指定する
df_crab[, c("sex", "shell_width")]
# 列番号のベクトルを指定
df_crab[, c(1, 2)]
## 行と列の両方を指定した要素の取得
# 行列ともに指定
df_crab$scissors_width[2]
## [1] 3.2
df_crab[2, "scissors_width"]
## [1] 3.2
# memo:抽出結果をdata.frameにする
# 抽出結果はfactorのベクトル
df_crab[, 1]
## [1] "male" "male" "male" "female" "female" "female"
class(df_crab[, 1])
## [1] "character"
# 抽出結果をdata.frameにする
df_crab[, 1, drop = FALSE]
class(df_crab[, 1, drop = FALSE])
## [1] "data.frame"
# headとtailによる先頭行と末尾行の抽出 ------------------------------------------------
# 先頭行の取り出し
head(df_crab, n = 2)
# 末尾行の取り出し
tail(df_crab, n = 2)
# subsetによる条件を用いたデータの抽出 ---------------------------------------------------
# 性別がmaleのデータだけを抽出する
subset(df_crab, subset = df_crab$sex == "male")
# nrow・ncol・dimによる行数と列数の取得 ----------------------------------------------------
# 行数の取得
nrow(df_crab)
## [1] 6
# 列数の取得
ncol(df_crab)
## [1] 3
# 行数と列数を両方出力
dim(df_crab)
## [1] 6 3
# データフレームにおける文字列の扱い -------------------------------------------------------
# 通常の作成方法だと、文字列はfactorになっている
class(df_crab$sex)
## [1] "character"
## データを作成する際に、factorになるのを防ぐ
# factorにしない
df_crab_char <- data.frame(
sex = c("male", "male", "male", "female", "female", "female"),
shell_width = c(13.8, 14.3, 14.1, 6.8, 7.2, 6.5),
scissors_width = c( 2.8, 3.2, 3.1, 1.8, 2.3, 2.1),
stringsAsFactors = FALSE
)
# characterに戻った
class(df_crab_char$sex)
## [1] "character"
# sex列を確認
df_crab_char$sex
## [1] "male" "male" "male" "female" "female" "female"
## データを読み込んだ後に、データ型を変換する
# 変換:factorからcharacterへ
as.character(df_crab$sex)
## [1] "male" "male" "male" "female" "female" "female"
# 変換:characterからfactorへ
as.factor(df_crab_char$sex)
## [1] male male male female female female
## Levels: female male
# 変換結果を格納
df_crab_char$sex <- as.factor(df_crab_char$sex)
# factor型に変換された
class(df_crab_char$sex)
## [1] "factor"
# str関数によるデータフレームの構造の確認 ---------------------------------------------------
# データフレームの構造の確認
str(df_crab)
## 'data.frame': 6 obs. of 3 variables:
## $ sex : chr "male" "male" "male" "female" ...
## $ shell_width : num 13.8 14.3 14.1 6.8 7.2 6.5
## $ scissors_width: num 2.8 3.2 3.1 1.8 2.3 2.1
# names関数による列名の取得 --------------------------------------------------------
# 要素名の取得
names(df_crab)
## [1] "sex" "shell_width" "scissors_width"
# 列名の取得
colnames(df_crab)
## [1] "sex" "shell_width" "scissors_width"
馬場さん教科書 第2部 - 6
# リストの作成 ------------------------------------------------------------------
# リストの作成
list_college_member <- list(
school_year = 2,
member = c("Taro", "Hanako")
)
# 確認
list_college_member
## $school_year
## [1] 2
##
## $member
## [1] "Taro" "Hanako"
# 様々なリスト ------------------------------------------------------------------
# 複雑なリスト
list_complexly <- list(
mark = data.frame(member = c("Taro", "Hanako"),
point = c(75, 86)),
member = list_college_member
)
# 確認
list_complexly
## $mark
## member point
## 1 Taro 75
## 2 Hanako 86
##
## $member
## $member$school_year
## [1] 2
##
## $member$member
## [1] "Taro" "Hanako"
# リストの個別の要素の取得 ------------------------------------------------------------
# 学年のみを取得
list_college_member$school_year
## [1] 2
# メンバーだけを取得
list_college_member$member
## [1] "Taro" "Hanako"
# 要素番号を指定する
list_college_member[[2]]
## [1] "Taro" "Hanako"
# names関数やstr関数も適用できる
names(list_college_member)
## [1] "school_year" "member"
str(list_college_member)
## List of 2
## $ school_year: num 2
## $ member : chr [1:2] "Taro" "Hanako"
# データフレームとリストの関係 ----------------------------------------------------------
# リストかどうかの判断
is.list(list_college_member)
## [1] TRUE
# データフレームの作成
df_sample <- data.frame(
member = c("Taro", "Hanako"),
point = c(75, 86)
)
df_sample
# リストかどうかの判断
is.list(df_sample)
## [1] TRUE
# 行列→ベクトルの変換 --------------------------------------------------------------
# 変換対象となる行列
mat_1 <- matrix(1:6, ncol=2)
# 確認
mat_1
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
# ベクトルに変換
vec_by_mat <- as.vector(mat_1)
# 確認
vec_by_mat
## [1] 1 2 3 4 5 6
# データフレーム→行列の変換 -----------------------------------------------------------
# 変換対象となるデータフレーム
df_1 <- data.frame(
col_1 = c(1, 3, 8),
col_2 = c(5, 7, 9)
)
# 確認
df_1
# 変換
mat_by_df <- as.matrix(df_1)
mat_by_df
## col_1 col_2
## [1,] 1 5
## [2,] 3 7
## [3,] 8 9
# 確認
class(mat_by_df)
## [1] "matrix" "array"
# 行列→データフレームの変換 -----------------------------------------------------------
# 変換
df_by_mat <- as.data.frame(mat_by_df)
df_by_mat
# 確認
class(df_by_mat)
## [1] "data.frame"
# リスト→ベクトルの変換 -------------------------------------------------------------
# リストの中身をベクトルにして出力
unlist(list_college_member)
## school_year member1 member2
## "2" "Taro" "Hanako"
馬場さん教科書 第2部 - 7