upaksta’s blog

忘れないうちにメモする備忘録です

データの標準化 R

ベクトル、行列、データフレームのデータを標準化する

①、ベクトルデータの場合

> x <- c(1,2,3,4,5)

> zx <- (x - mean(x))/sdx
> zx
[1] -1.2649111 -0.6324555 0.0000000 0.6324555 1.2649111

これをscale()関数でできる

> scale(x)
[,1]
[1,] -1.2649111
[2,] -0.6324555
[3,] 0.0000000
[4,] 0.6324555
[5,] 1.2649111
attr(,"scaled:center")
[1] 3
attr(,"scaled:scale")
[1] 1.581139

②、行列データ

> m <- matrix(1:9,3,3)
> m
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9

> scale(m)
[,1] [,2] [,3]
[1,] -1 -1 -1
[2,] 0 0 0
[3,] 1 1 1
attr(,"scaled:center")
[1] 2 5 8
attr(,"scaled:scale")
[1] 1 1 1

> m1 <- c(1,2,3)

> m2 <- c(4,5,6)
> m3 <- c(7,8,9)

> scale(m1)
[,1]
[1,] -1
[2,] 0
[3,] 1
attr(,"scaled:center")
[1] 2
attr(,"scaled:scale")
[1] 1

> scale(m2)
[,1]
[1,] -1
[2,] 0
[3,] 1
attr(,"scaled:center")
[1] 5
attr(,"scaled:scale")
[1] 1> scale(m3)
[,1]
[1,] -1
[2,] 0
[3,] 1
attr(,"scaled:center")
[1] 8
attr(,"scaled:scale")
[1] 1
→ 各列に対して標準化を行っている

③、データフレームの標準化

> zmtcars <- scale(mtcars)

> zmtcars (#各データの要素は多いので省略)

attr(,"scaled:center")
mpg cyl disp hp drat wt qsec vs
20.090625 6.187500 230.721875 146.687500 3.596563 3.217250 17.848750 0.437500
am gear carb
0.406250 3.687500 2.812500
attr(,"scaled:scale")
mpg cyl disp hp drat wt qsec vs
6.0269481 1.7859216 123.9386938 68.5628685 0.5346787 0.9784574 1.7869432 0.5040161
am gear carb
0.4989909 0.7378041 1.6152000

→ 行列と同じく、列ごとに標準化される

 

Rデータフレームから一部を抜き出す

いろいろやり方はあると思いますが、ここでは【subset()関数】を使います。

>?subset

subset(x, subset, select, drop = FALSE, ...)

x: データフレーム
subset: 条件式を書き、それを満たすものが抜き出される
select: 列を指定。その列が抜き出される。
drop: ?

mtcarsデータを使って試してみます。

f:id:upaksta:20140922012312p:plain

mpgが20以上のものを抜き出します。

f:id:upaksta:20140922012720p:plain

mpgが20以上で、cylとdratの列を抜き出す。

f:id:upaksta:20140922012757p:plain

mpgが20以上で、cylとdisp以外の列を抜き出す。

f:id:upaksta:20140922012845p:plain

という感じで、ほしい部分を指定できます。

 

 

データの種類

定性的データ:カテゴリカルデータ・質的データ

名義尺度:単に分類するために整理番号として数値を割り当てたもの。

→ 度数・最頻値

順序尺度:離散的な数値を用いる。順序には意味があるが、数値間の間隔には意味がない

→ 度数・最頻値・中央値

定量的データ:量的データ

間隔尺度:目盛りが等間隔になっているもの。間隔の和や差には意味があるが、比率には意味がない。

比例尺度:原点が決まっていて、間隔にも比率にも意味があるもの。和差積商が計算できる。

 

mtcarsデータの変数について考えてみます。

>?mtcars

A data frame with 32 observations on 11 variables.

[, 1] mpg Miles/(US) gallon     →比例尺度
[, 2] cyl Number of cylinders  →比例尺度
[, 3] disp Displacement (cu.in.) →比例尺度
[, 4] hp Gross horsepower   →比例尺度
[, 5] drat Rear axle ratio    →比例尺度
[, 6] wt Weight (lb/1000)    →比例尺度
[, 7] qsec 1/4 mile time     →比例尺度
[, 8] vs V/S          →名義尺度
[, 9] am Transmission (0 = automatic, 1 = manual) →名義尺度
[,10] gear Number of forward gears →比例尺度
[,11] carb Number of carburetors  →比例尺度

比例尺度と名義尺度の混ざったデータとなりました。

 

 

 

Rで箱ひげ図をかく

統計ソフトのRを使って、箱ひげ図を作成。

データはRに入ってるmtcarsというデータセットを用いた。

中身は11個の変数に対してそれぞれ32個のデータがある。

> str(mtcars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...

このデータの変数amは、0か1の値をとる。(オートマ=0、マニュアル=1)

この0と1でデータを分けて、それぞれの箱ひげ図を作成し、両者を比較する。

まずRに標準で入ってる【plot()関数】を使ってみる。

> plot(mtcars$am, mtcars$mpg)

f:id:upaksta:20140921210724j:plain

plot(x, y)のxにam変数、mpgをyに指定した。箱ひげ図にならなかった。

plot(x,y)のxに対応するmtcars$amは数値データ型。

数値データをxに使っても箱ひげ図にはならない。

因子型に変換してplot関数に入れると自動的に箱ひげ図になる。因子型に変換するために、factor()関数を使った。

> plot(factor(mtcars$am), mtcars$mpg)

 

f:id:upaksta:20140921205451j:plain

図の軸に名前をつける。xlab, ylabを使って指定。

> plot(factor(mtcars$am), mtcars$mpg, xlab="Transmission (0 = automatic, 1 = manual)", ylab="Miles per gallon")

f:id:upaksta:20140921210526j:plain

他にもいろいろ変えれると思いますが、plot関数で箱ひげ図は一応できました。

もう一つ練習してみます。

mtcarsデータのvsは0と1の数値をとっていて、

このvsとhp(馬力:Gross horsepower)について箱ひげ図を作成してみる。

> plot(factor(mtcars$vs), mtcars$hp, xlab="vs", ylab="Gross horsepower")

f:id:upaksta:20140921212011j:plain