馬場さん教科書 第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