Rの基本的な使い方(可視化、ライブラリの紹介)

とある学生団体内部勉強会の第3回目の内容となります。

1回目はというと自分は2回目からの参加で、
実はやってないので近い内に演習やって載せます。

本日の目標

  • 今回は主にデータ型やベクトル演算の紹介
  • csvファイルとExcelファイルからデータを読み込む方法を習得
  • データ分布の可視化手法を学ぶ

データ型

Rが保有するデータ型の一例

  • numeric : 数値(整数と小数、正数と負数、0を含む)

→現状、ザックリとcharacter・logical以外の"数"って考えると良さそう。

  • integer : 整数値
  • double : 浮動小数
  • character : 文字列
  • logical : 論理値…TRUE, FALSE

データ型を確かめる

今回は以下の関数を使用しました。

  1. class()
  2. is.numeric()
  3. is.integer()
  4. is.double()
  5. is.logical()

変数が保持するデータ型を確認する時はclass関数

> x <- 7
> class(x)
[1]numeric

変数がnumericかどうかをテストするにはis.numeric関数を使う

# numericであるときはTRUE(真)、
# そうでないときはFALSE(偽)と返ってくる
> x <- 7
> is.numeric(x)
[1]  TRUE

変数がintegerかどうかをテストするにはis.integer関数を使う。
同様に、他のデータ型かどうか確認する場合もis.(データ型名)関数

> x <- 5L     # 数字の後ろにLをつけると整数に指定できる
> is.integer(x)
[1]  TRUE
> is.logical(x)
[1]  FALSE

手元で検証した内容

# xはintegerの5、yはdoubleの2.0
> x <- 5L
> y <- 2.0
> is.double(y)
[1] TRUE
> is.double(x + y)
[1] TRUE

以上より、
2ではなく、2.0だとdouble扱いで代入してくれる
演算integer + double = doubleらしい

ベクトル演算

ベクトルは同じ型の要素を集めたもの

> x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
> x
[1] 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
> y <- c(“R”, “Excel”, “Python”, “SAS”)
> y
[1] “R”, “Excel”, “Python”, “SAS”
> is.character(y)
[1]  TRUE
> x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
> x * 3 # xの要素それぞれに3をかける
[1]  3  6  9  12  15  18  21  24  27  30
> x / 4 # xの要素それぞれに4を割る
[1] 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50
> x^2 # xの要素それぞれを二乗する
[1]   1   4   9  16  25  36  49  64  81 100
> sqrt(x) # xの平方根
[1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751
[8] 2.828427 3.000000 3.162278
> x <- 1:10    # 1から10までの数字からなるベクトルを生成
[1]  1  2  3  4  5  6  7  8  9 10
> length(x)    # ベクトルxの長さを確認
[1] 10
> x > 4    # ベクトルxの各要素に対して比較演算子を使う
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
> x[1]     # ベクトルxの1番目の要素を取り出す
[1] 1
> x[3:7]    # ベクトルxの3番目から7番目の要素を取り出す
[1] 3 4 5 6 7

Rのベクトル演算便利やん。

CSVファイルとExcelファイルを読み込んでみる

RではCSVファイルからデータを読み込む際、read.table関数を使う。
read.table関数はread.table(ファイル, ヘッダー有無, 区切り文字)のように指定してあげるとテーブルとしてデータを成形してくれる。

url <- "https://hoge/fuge.csv" # 変数urlにURLを代入
piyo <- read.table(file = url, header  = T, sep =",") 

Excelデータ(.xls・.xlsx)をreadxlパッケージを使って読み込む。

# readxlパッケージをインポート&ロード
install.packages("readxl")
library(readxl)

今回の演習では, 以下のJared P. Lander氏のデータセットを使う。
https://www.jaredlander.com/data/
これを参考にワークスペースの指定(移動)をした。
qiita.com

# ExcelExample.xlsxファイルのシートを確認
# シングルクォーテーション'と
# ダブルクォーテーション"を間違わないように
> excel_sheets('ExcelExample.xlsx')
[1] "Tomato" "Wine"   "ACS" 
# TomatoシートとWineシート、ACSシートがあることがわかる。

ExcelExample.xlsxからトマトのデータを読み込む

> tomatoXL <- read_excel(‘ExcelExample.xlsx’)
#どこのシートか指定しない場合は、
# read_excelは1枚目のシートを読み込む。
# 読み込むシートを選択したい場合は、
# シートの位置を数値で指定するか、
> wineXL <- read_excel('ExcelExample.xlsx', sheet = 2)
# シート名を文字として指定する
> wineXL <- read_excel('ExcelExample.xlsx', sheet = "Wine")

基本グラフィックス

今回の演習では、ダイヤモンドのデータを使用。
図やグラフをプロットするパッケージはggplot2を使用。
diamondsデータはggplot2パッケージに含まれる

ggplot2

ggplot2とは, グラフィックスをより簡単にするために作られたもの

RSstudio公式サイトにチートシートがあった。
現状見ても象形文字の如く、解読できないからからゴリゴリに使い倒せるようになりたい。
https://www.rstudio.com/wp-content/uploads/2016/10/ggplot2-cheatsheet-2.0-ja.pdf

ggplot2を使ったグラフィックでは, グラフを構成する要素をパズルのように組み合わせて, 1枚の絵を描くようにグラフを描く

> g <- ggplot()    # 新しいキャンパスを用意
> print(g)

上のコードを実行すると、何も描かれていないキャンパスが表示される

このキャンバスにグラフのレイヤを重ねていく

geomオブジェクト(geometric object)

データを特定のgeomに渡すことで,
データがそれぞれのグラフとして表現される

f:id:s2h0:20190421231856p:plain
geomの例

ヒストグラム

ヒストグラムは1変数データの最も基本的なグラフであり,
ある変数の分布を示す。
diamondsデータのcarat列に対するヒストグラム

> hist(diamonds$carat, main = "Carat Histgram", xlab = "Carat")


f:id:s2h0:20190421193438p:plain
diamonds(carats)ヒストグラム

散布図

散布図は2つの変数を比べてみる際によく使われる。
描画されている全ての点が2つの変数に関するデータを表す。
x軸がある変数を、y軸がもう一方の変数を表す。

> plot(price~carat, data = diamonds)

f:id:s2h0:20190421193909p:plain
ダイアモンドの価格とカラット数の散布図

箱ひげ図

箱ひげ図はデータのばらつき具合をわかりやすく表現するためのグラフ

f:id:s2h0:20190421194117p:plain
ダイアモンドカラットの箱ひげ図

演習1

演習用のExcelファイル「0420ex.xlsx」ファイルを読み込み,
1番目のシートにある50人の数学と国語のテストの結果について
それぞれヒストグラムと箱ひげ図を作ってみよう

前回でも申し上げましたが、
「>」は打ち込む必要がなく、「+」も同様です

> hist(score$数学, 
+      main = "The Score of Math Histgram", 
+      xlab = "Score")

f:id:s2h0:20190421230221j:plain
数学成績のヒストグラム

> hist(score$国語, 
+      main = "The Score of  Histgram", 
+      xlab = "Score")

f:id:s2h0:20190421230556j:plain
国語成績のヒストグラム

> boxplot(score$数学)

f:id:s2h0:20190421230847j:plain
数学成績の箱ひげ図

> boxplot(score$国語)

f:id:s2h0:20190421231017j:plain
国語成績の箱ひげ図

演習2

ggplotとデータセットmpgを使っていろいろなグラフを描いてみよう

以下のコードを実際に実行してみて, 結果がどのようになるのかを確認する

車の燃費に関するデータセットmpg

車の燃費に関するデータセットmpgはggplot2に含まれる

f:id:s2h0:20190421233104p:plain
車の燃費のデータセット

ggplot2の使用例①(エンジンの大きさのデータ分布)

ヒストグラム

> ggplot() + geom_histogram(data = mpg, mapping = aes(x = displ))

※このままだとビン幅(棒グラフの幅)を指定した方が良きとエラーの如く言われるので、以下参考に直してみましょう。(筆者は就活が...読者に丸投げ)
ggplot2でビン幅を自動的に決めたヒストグラム - Qiita

f:id:s2h0:20190421235122j:plain
displのヒストグラム

> ggplot() + geom_density(data = mpg, mapping = aes(x = displ))

f:id:s2h0:20190421235221j:plain
displの密度表示
エンジンの大きさのデータ自体は小さいものが多くて、大きいものが少ないことがわかりますね

補足:
geom_histogram()とgeom_density()では, X軸に変数をマッピングすると, 自動的に対応するY軸の値が計算されて描画されるため, Y軸の変数を指定する必要がない

ggplot2の使用例②(エンジンの大きさと燃費の関係)

エンジンの大きさdisplと燃費ctyの関係を散布図で確かめてみよう

> ggplot() + geom_point(data = mpg, mapping = aes(x = displ, y = cty))

f:id:s2h0:20190422001305j:plain
エンジンの大きさと燃費の分布図
この図より、
x軸がエンジンの大きさ、y軸が燃費とされているので、
エンジンが大きくなるに連れて、燃費が低くなる
という相関関係があることがわかりますね。