DATOR


iris data 분석 I



속성


> attributes(iris)

$names

[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"

 

$row.names

[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

..................

[115] 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

[134] 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150

 

$class

[1] "data.frame“

 

 

분포를 대표할 수 있는 대푯값:

평균 중위수가 동일하면==> 분포가 중심에 많은 값들이 모여있임

평균 중위수가 동일하지 않으면=> 높은 값이 많거나 적은 값이 많은 분포

> summary(iris)

Sepal.Length Sepal.Width Petal.Length Petal.Width

Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100

1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300

Median :5.800 Median :3.000 Median :4.350 Median :1.300

Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199

3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800

Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500

Species

setosa :50

versicolor:50

virginica :50

 

 

range()

 

최소값 최대값

Sepal.Length변수의 최대값과 최소값

> range(iris$Sepal.Length)

[1] 4.3 7.9

iris데이터셋의 첫 번째 변수의 범위

> range(iris[,1])

[1] 4.3 7.9

 

iris데이터셋의 두 번째변수와 세변째변수의 최소값과 최대값

> range(iris[,2:3])

[1] 1.0 6.9

 

quantile()

 

#[“$”

> quantile(iris$Sepal.Length)

0% 25% 50% 75% 100%

4.3 5.1 5.8 6.4 7.9

 

#30% 분위수?,
# 고객의 30%가 전체매출의 70%이상을 차지하는 경우

#고객의 분포. iris$Sepal.Length 고객특성변수

> p <- 0.3

> quantile(iris$Sepal.Length,p)

30%

5.27

 

# 10단위씩의 분위수

quantile(iris$Sepal.Length , seq(0, 1, by=0.1))

 

> quantile(iris$Sepal.Length , seq(0, 1, by=0.1))

0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%

4.30 4.80 5.00 5.27 5.60 5.80 6.10 6.30 6.52 6.90 7.90

 

 > iris[(length(iris$Sepal.Length)-5):length(iris$Sepal.Length),]

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

145 6.7 3.3 5.7 2.5 virginica

146 6.7 3.0 5.2 2.3 virginica

147 6.3 2.5 5.0 1.9 virginica

148 6.5 3.0 5.2 2.0 virginica

149 6.2 3.4 5.4 2.3 virginica

150 5.9 3.0 5.1 1.8 virginica



 

특정변수의 특정행에 있는 데이터 값을 보고자하는 경우

# 데이터가 입력된 순서대로 엘레먼트를 호출

> iris$Sepal.Length[1:6]

[1] 5.1 4.9 4.7 4.6 5.0 5.4

 

> iris[1:6,"Sepal.Length"]

[1] 5.1 4.9 4.7 4.6 5.0 5.4

 

#iris[,1:4]

#row단위로 출력

> apply(iris[,1:4] , 1, function(row) { print(row) })

Sepal.Length Sepal.Width Petal.Length Petal.Width

5.1 3.5 1.4 0.2

Sepal.Length Sepal.Width Petal.Length Petal.Width

4.9 3.0 1.4 0.2

.....

Sepal.Length Sepal.Width Petal.Length Petal.Width

6.2 3.4 5.4 2.3

Sepal.Length Sepal.Width Petal.Length Petal.Width

5.9 3.0 5.1 1.8

 

[,1] [,2] [,148] [,149] [,150]

Sepal.Length 5.1 4.9 6.5 6.2 5.9

Sepal.Width 3.5 3.0 3.0 3.4 3.0

Petal.Length 1.4 1.4 5.2 5.4 5.1

Petal.Width 0.2 0.2 2.0 2.3 1.8

 

 

adply()임의
Sepal.Length5.0
Speciessetosa
결과V1
> library(plyr)

> adply(iris, 1, function(row){ row$Sepal.Length >= 5.0 & row$Species=="setosa"})

Sepal.Length Sepal.Width Petal.Length Petal.Width Species V1

1 5.1 3.5 1.4 0.2 setosa TRUE

2 4.9 3.0 1.4 0.2 setosa FALSE

...............

147 6.3 2.5 5.0 1.9 virginica FALSE

148 6.5 3.0 5.2 2.0 virginica FALSE

149 6.2 3.4 5.4 2.3 virginica FALSE

150 5.9 3.0 5.1 1.8 virginica FALSE

 

위와 동일한 조건을 적용하고, data.frame object로 지정하여 출력

> adply(iris,1,function(row) {data.frame(sepal5upsetosa =c(row$Sepal.Length >= 5.0 & row$Species == "setosa"))})

Sepal.Length Sepal.Width Petal.Length Petal.Width Species sepal5upsetosa

1 5.1 3.5 1.4 0.2 setosa TRUE

2 4.9 3.0 1.4 0.2 setosa FALSE

............

149 6.2 3.4 5.4 2.3 virginica FALSE

150 5.9 3.0 5.1 1.8 virginica FALSE

ddply()

ddply()는 데이터 프레임(d)을 입력으로 받아 데이터 프레임(d)을 내보내는 함수

 

iris 데이터에서 Sepal.Length의 평균을 Species 별로 계산
데이터를 그룹짓는 변수는 .( )안에 입력한다.
> library(plyr)
> ddply (iris,.(Species),
+ function(sub) {
+ data.frame(sepal.width.mean = mean (sub$Sepal.Width))
+ })
Species sepal.width.mean
1 setosa 3.428
2 versicolor 2.770
3 virginica 2.974

 

조건 두 개를 그룹으로 두어서 Species, Sepal.Length>5.0
sepal.width.mean 변수의 평균을 산출
library(plyr)
> ddply (iris,.( Species , Sepal.Length>5.0),
+ function (sub) {
+ data.frame ( sepal.width.mean = mean (sub$ Sepal.Width ))
+ })
Species Sepal.Length> 5 sepal.width.mean
1 setosa FALSE 3.203571
2 setosa TRUE 3.713636
3 versicolor FALSE 2.233333
4 versicolor TRUE 2.804255
5 virginica FALSE 2.500000
6 virginica TRUE 2.983673
 

 

두 컬럼의 평균 계산하기

> with (iris , {

+ print (mean(Sepal.Length ))

+ print (mean (Sepal.Width ))

+ })

[1] 5.843333

[1] 3.057333

 

 

with()를 사용해서 iris 데이터셋의 열이름(Sepal.Length, Sepal.Width)에 직접접근하여

도표를 그리세요.

str(iris)

#with() agrwith(data, 명령어,..........)

#주의사항 형태가 with() 안에 plot() 들어가야한다.

# with( ...., plot())

> with(iris, plot(Sepal.Length, Sepal.Width, col=Species, pch=as.numeric(Species)))


 데이터프레임에서 NAmedian으로 치환

> iris_repl<-iris

> iris_repl[1, 1] = NA

> head(iris_repl)

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1 NA 3.5 1.4 0.2 setosa

2 4.9 3.0 1.4 0.2 setosa

3 4.7 3.2 1.3 0.2 setosa

4 4.6 3.1 1.5 0.2 setosa

5 5.0 3.6 1.4 0.2 setosa

6 5.4 3.9 1.7 0.4 setosa

> replasement_df <- sapply(split(iris_repl$Sepal.Length,iris_repl$Species),median, na.rm = TRUE )

> replasement_df

setosa versicolor virginica

5.0 5.9 6.5

 

> iris_repl <- within(iris_repl, {

+ Sepal.Length <- ifelse( is.na(Sepal.Length), replasement_df[Species], Sepal.Length )

+ })

 

> head(iris_repl)

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1 5.0 3.5 1.4 0.2 setosa

2 4.9 3.0 1.4 0.2 setosa

3 4.7 3.2 1.3 0.2 setosa

4 4.6 3.1 1.5 0.2 setosa

5 5.0 3.6 1.4 0.2 setosa

6 5.4 3.9 1.7 0.4 setosa

 

 

#
subset (iris , select =c( Sepal.Length , Species ))

Sepal.Length Species

1 5.1 setosa

2 4.9 setosa

3 4.7 setosa

............

51 7.0 versicolor

52 6.4 versicolor

53 6.9 versicolor

..............

101 6.3 virginica

102 5.8 virginica

103 7.1 virginica

...................

149 6.2 virginica

150 5.9 virginica

 

 

#특정열 제외

> subset (iris , select =-c(Sepal.Length, Species ))

> subset (iris , select =-c( Sepal.Length , Species ))

Sepal.Width Petal.Length Petal.Width

1 3.5 1.4 0.2

2 3.0 1.4 0.2

.......

149 3.4 5.4 2.3

150 3.0 5.1 1.8

 

 

> aggregate(Petal.Width ~ Species, summary, data=iris)

Species Petal.Width.Min. Petal.Width.1st Qu. Petal.Width.Median

1 setosa 0.100 0.200 0.200

2 versicolor 1.000 1.200 1.300

3 virginica 1.400 1.800 2.000

Petal.Width.Mean Petal.Width.3rd Qu. Petal.Width.Max.

1 0.246 0.300 0.600

2 1.326 1.500 1.800

3 2.026 2.300 2.500

 


iris$Sepal.Length 순서대로 정렬
> head(iris[order(iris$Sepal.Length), ])
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
14 4.3 3.0 1.1 0.1 setosa
9 4.4 2.9 1.4 0.2 setosa
39 4.4 3.0 1.3 0.2 setosa
43 4.4 3.2 1.3 0.2 setosa
42 4.5 2.3 1.3 0.3 setosa
4 4.6 3.1 1.5 0.2 setosa

 

 
복수정렬조건
Sepal.Length가같Petal.Length
 > head(iris[order(iris$Sepal.Length,iris$Petal.Length), ])
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
14 4.3 3.0 1.1 0.1 setosa
39 4.4 3.0 1.3 0.2 setosa
43 4.4 3.2 1.3 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
42 4.5 2.3 1.3 0.3 setosa
23 4.6 3.6 1.0 0.2 setosa

 

> order(iris$Sepal.Width)

[1] 61 63 69 120 42 54 88 94 58 81 82 70 73 90 99 107 109 114 147 80 91 93 119 135 60

[26] 68 83 84 95.........

 

> iris[order(iris$Sepal.Width),]

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

61 5.0 2.0 3.5 1.0 versicolor

63 6.0 2.2 4.0 1.0 versicolor

69 6.2 2.2 4.5 1.5 versicolor

120 6.0 2.2 5.0 1.5 virginica

42 4.5 2.3 1.3 0.3 setosa

........................

 

16 5.7 4.4 1.5 0.4 setosa

 

 

 

특정 컬럼을 기준으로 정렬,
복수개의 정렬기준으로 정렬,orderBy()

> library(doBy)

attach(iris)

summaryBy(Sepal.Width + Sepal.Length Species , iris)

#Sepal.Width를 기준으로 테이블 정렬

> orderBy(~ Sepal.Width , iris)

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

61 5.0 2.0 3.5 1.0 versicolor

63 6.0 2.2 4.0 1.0 versicolor

69 6.2 2.2 4.5 1.5 versicolor

120 6.0 2.2 5.0 1.5 virginica

42 4.5 2.3 1.3 0.3 setosa

54 5.5 2.3 4.0 1.3 versicolor

.......................

15 5.8 4.0 1.2 0.2 setosa

33 5.2 4.1 1.5 0.1 setosa

34 5.5 4.2 1.4 0.2 setosa

16 5.7 4.4 1.5 0.4 setosa

 

 

“Species + Sepal.Width”
Species순으로 먼저 정렬되고,
두 번째 우선순위 기준이 Sepal.Width 기준

> orderBy(~ Species + Sepal.Width , iris)

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

42 4.5 2.3 1.3 0.3 setosa

9 4.4 2.9 1.4 0.2 setosa

2 4.9 3.0 1.4 0.2 setosa

13 4.8 3.0 1.4 0.1 setosa

14 4.3 3.0 1.1 0.1 setosa

...........

149 6.2 3.4 5.4 2.3 virginica

110 7.2 3.6 6.1 2.5 virginica

118 7.7 3.8 6.7 2.2 virginica

132 7.9 3.8 6.4 2.0 virginica

 

 

> split (iris , iris $ Species )

$setosa

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1 5.1 3.5 1.4 0.2 setosa

2 4.9 3.0 1.4 0.2 setosa

...........

$versicolor

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

51 7.0 3.2 4.7 1.4 versicolor

52 6.4 3.2 4.5 1.5 versicolor

................

$virginica

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

101 6.3 3.3 6.0 2.5 virginica

102 5.8 2.7 5.1 1.9 virginica

103 7.1 3.0 5.9 2.1 virginica

..............

149 6.2 3.4 5.4 2.3 virginica

150 5.9 3.0 5.1 1.8 virginica

 



irisSepal.Length

 

> lapply(split(iris$Sepal.Length , iris$Species), mean )

$setosa

[1] 5.006

 

$versicolor

[1] 5.936

 

$virginica

[1] 6.588

 

 

수치형인지 확인

> sapply(iris,is.numeric)

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

TRUE TRUE TRUE TRUE FALSE

 

명목형인지 확인

> sapply(iris,is.factor)

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

FALSE FALSE FALSE FALSE TRUE

 

각 변수가 문자형인지 확인

> sapply(iris,is.character)

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

FALSE FALSE FALSE FALSE FALSE

 

 

수치형 속성의 데이터컬럼만 추출

-많은 변수들 중에 어떤 변수가 숫자인지 문자인지 모를때

> irisSa<- iris[,sapply(iris,is.numeric)]

> risSa<- iris[,sapply(iris,is.numeric)]

> risSa

Sepal.Length Sepal.Width Petal.Length Petal.Width

1 5.1 3.5 1.4 0.2

2 4.9 3.0 1.4 0.2

3 4.7 3.2 1.3 0.2

4 4.6 3.1 1.5 0.2

5 5.0 3.6 1.4 0.2

6 5.4 3.9 1.7 0.4

 

............이하생략

 

numeric type 가 아닌 컬럼만 추출
> risSanotnum<- iris[,!(sapply(iris,is.numeric))]
> risSanotnum
[1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
[15] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
[29] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
[43] setosa setosa setosa setosa setosa setosa setosa setosa versicolor versicolor versicolor versicolor versicolor versicolor
[57] versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor
[71] versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor
[85] versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor
[99] versicolor versicolor virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica
[113] virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica
[127] virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica
[141] virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica
Levels: setosa versicolor virginica
 

 

명목형 속성의 데이터만 추출,5

데이터셋명[행위치, 열위치]

데이터셋명[행위치, 열의 추출조건]

sapply(데이터셋,FUN)

> iris_fact<-iris[,sapply(iris,is.factor)]

>write.csv( iris_fact,“ iris_fact.csv”)

iris_fact.csvR에서 getwd() 실행시 나

타나는 폴더에서 확인

iris[,sapply(iris,is.factor)]

[1] setosa setosa setosa setosa setosa setosa setosa setosa

[9] setosa setosa setosa setosa setosa setosa setosa setosa

 

...........

[137] virginica virginica virginica virginica virginica virginica virginica virginica

[145] virginica virginica virginica virginica virginica virginica

Levels: setosa versicolor virginica

 


종별(factor)기준 여러변수(iris[,1:4])의 평균

> aggregate(iris[,1:4],by=list(iris$Species),FUN=mean)

Group.1 Sepal.Length Sepal.Width Petal.Length Petal.Width

1 setosa 5.006 3.428 1.462 0.246

2 versicolor 5.936 2.770 4.260 1.326

3 virginica 6.588 2.974 5.552 2.026

> aggregate(iris[,c(1,3)],by=list(iris$Species),summary)

> aggregate(iris[,c(1,3)],by=list(iris$Species),summary)

Group.1 Sepal.Length.Min. Sepal.Length.1st Qu. Sepal.Length.Median Sepal.Length.Mean

1 setosa 4.300 4.800 5.000 5.006

2 versicolor 4.900 5.600 5.900 5.936

3 virginica 4.900 6.225 6.500 6.588

Sepal.Length.3rd Qu. Sepal.Length.Max. Petal.Length.Min. Petal.Length.1st Qu. Petal.Length.Median

1 5.200 5.800 1.000 1.400 1.500

2 6.300 7.000 3.000 4.000 4.350

3 6.900 7.900 4.500 5.100 5.550

Petal.Length.Mean Petal.Length.3rd Qu. Petal.Length.Max.

1 1.462 1.575 1.900

2 4.260 4.600 5.100

3 5.552 5.875 6.900

 

 

 

 

iris

str(iris)

> str(iris)

'data.frame': 150 obs. of 5 variables:

$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...

$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...

$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...

$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...

$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...


> aggregate(iris[,c(1,3)],by=list(Species123=iris$Species),summary)

Species123 Sepal.Length.Min. Sepal.Length.1st Qu. Sepal.Length.Median Sepal.Length.Mean

1 setosa 4.300 4.800 5.000 5.006

2 versicolor 4.900 5.600 5.900 5.936

3 virginica 4.900 6.225 6.500 6.588

Sepal.Length.3rd Qu. Sepal.Length.Max. Petal.Length.Min. Petal.Length.1st Qu.

1 5.200 5.800 1.000 1.400

2 6.300 7.000 3.000 4.000

3 6.900 7.900 4.500 5.100

Petal.Length.Median Petal.Length.Mean Petal.Length.3rd Qu. Petal.Length.Max.

1 1.500 1.462 1.575 1.900

2 4.350 4.260 4.600 5.100

3 5.550 5.552 5.875 6.900

 

 

> aggregate(iris[,c(1,3)],by=list(Species=iris$Species),mean)

Species Sepal.Length Petal.Length

1 setosa 5.006 1.462

2 versicolor 5.936 4.260

3 virginica 6.588 5.552

> aggregate(iris[,c(1,3)],by=list(iris$Species),mean)

Group.1 Sepal.Length Petal.Length

1 setosa 5.006 1.462

2 versicolor 5.936 4.260

3 virginica 6.588 5.552

 

> lapply ( iris [, 1:4] , mean )

$ Sepal.Length

[1] 5 .843333

$ Sepal.Width

[1] 3 .057333

$ Petal.Length

[1] 3 .758

$ Petal.Width

[1] 1 .199333

 

> sapply(iris[, 1:4],mean)

Sepal.Length Sepal.Width Petal.Length Petal.Width

5 .843333 3 .057333 3 .758000 1 .199333

 

> class(sapply(iris[,1:4],mean))

[1] " numeric “

 

 

sapply()결과 data.frame 로 저장

 

> x <- sapply(iris[,1:4], mean)

> as.data.frame(x)

x

Sepal.Length 5 .843333

Sepal.Width 3 .057333

Petal.Length 3 .758000

Petal.Width 1 .199333

 

> as.data.frame(t(x))

Sepal.Length Sepal.Width Petal.Length Petal.Width

1 5 .843333 3 .057333 3 .758 1 .199333

 

 

sapply()를 각 열에 저장된 데이터의 클래스를 확인

 

> sapply(iris,class)

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

" numeric " " numeric " " numeric " " numeric " " factor “

 

 

 

sapply()에 인자로 주어진 함수의 출력이 여러행이라면 행렬이 반환.
다음 예에서는 iris의 숫자형 컬럼들에 대해 각 값이 3보다 큰지의 여부를 반환.
그리고 이때 반환된 결과의 클래스는 행렬.

> y <- sapply(iris[,1:4], function(x){ x > 3 })
> class(y)
[1] " matrix “

 

> head (y)

Sepal.Length Sepal.Width Petal.Length Petal.Width

[1 ,] TRUE TRUE FALSE FALSE

[2 ,] TRUE FALSE FALSE FALSE

[3 ,] TRUE TRUE FALSE FALSE

[4 ,] TRUE TRUE FALSE FALSE

[5 ,] TRUE TRUE FALSE FALSE

[6 ,] TRUE TRUE FALSE FALSE

 

예제

> apply(iris[,1:4],2,sum)

Sepal.Length Sepal.Width Petal.Length Petal.Width

876.5 458.6 563.7 179.9

> colSums(iris[,1:4])

Sepal.Length Sepal.Width Petal.Length Petal.Width

876.5 458.6 563.7 179.9

 

 

예제, data.frame 에 적용시

> lapply(iris[,1:4], mean )

$ Sepal.Length

[1] 5 .843333

$ Sepal.Width

[1] 3 .057333

$ Petal.Length

[1] 3 .758

$ Petal.Width

[1] 1 .199333

 
> colMeans(iris[,1:4])
Sepal.Length Sepal.Width Petal.Length Petal.Width
5 .843333 3 .057333 3 .758000 1 .199333
 
데이터 프레임을 처리한 결과를 리스트로 얻게되면,
그 리스트를 다시 데이터 프레임으로 변환
> d <- as.data.frame(matrix(unlist( lapply(iris [,1:4],mean)), ncol =4, byrow = TRUE ))
> names (d) <- names(iris[, 1:4])
> d
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5 .843333 3 .057333 3 .758 1 .199333
 

 

‘do.call(호출할 함수, 파라미터)’을 사용
>data.frame(do.call(cbind, lapply(iris [, 1:4],mean)))
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5 .843333 3 .057333 3 .758 1 .199333
 
iris $ Sepal.Length , iris $ Species , mean )


> tapply(iris$Sepal.Length, iris$Species, mean)

setosa versicolor virginica

5.006 5.936 6.588

 

mapply가 주어진 인자들을 하나씩 묶어 mean을 호출

첫번째 열끼리 묶어 평균을 구하고, 두번째 열끼리 묶어 평균을 구하는 작업을 반복

> mapply(mean,iris [1:4])

Sepal.Length Sepal.Width Petal.Length Petal.Width

5.843333 3.057333 3.758000 1.199333

 

중복값 확인과, missing의 확인

>install.packages(“Hmisc”)

> library (Hmisc)

> describe(iris)

iris

 

5 Variables 150 Observations

----------------------------

Sepal.Length

n missing unique Info Mean .05 .10 .25

150 0 35 1 5.843 4.600 4.800 5.100

.50 .75 .90 .95

5.800 6.400 6.900 7.255

 

lowest : 4.3 4.4 4.5 4.6 4.7, highest: 7.3 7.4 7.6 7.7 7.9

------------------------------

Sepal.Width

n missing unique Info Mean .05 .10 .25

150 0 23 0.99 3.057 2.345 2.500 2.800

.50 .75 .90 .95

3.000 3.300 3.610 3.800

 

lowest : 2.0 2.2 2.3 2.4 2.5, highest: 3.9 4.0 4.1 4.2 4.4

--------------------------------------------------------

Petal.Length

n missing unique Info Mean .05 .10 .25

150 0 43 1 3.758 1.30 1.40 1.60

.50 .75 .90 .95

4.35 5.10 5.80 6.10

 

lowest : 1.0 1.1 1.2 1.3 1.4, highest: 6.3 6.4 6.6 6.7 6.9

--------------------------------------------------

Petal.Width

n missing unique Info Mean .05 .10 .25

150 0 22 0.99 1.199 0.2 0.2 0.3

.50 .75 .90 .95

1.3 1.8 2.2 2.3

 

lowest : 0.1 0.2 0.3 0.4 0.5, highest: 2.1 2.2 2.3 2.4 2.5

----------------------------------------------------

Species

n missing unique

150 0 3

 

setosa (50, 33%), versicolor (50, 33%), virginica (50, 33%)

----------------------------------------



여러 집단을 함께 산점도에 표시

여러 집단을 하나의 산점도에 나태내려면 집단마다 다른 기호나 색으로 표시

plot 함수에 사용되는 pch, col 등의 옵션을 활용하여 도표의 이해.

 

예제

꽃잎의 길이와 넓이를 scatter plot 하였을 때 두 속성 간에 상관관계가 있는 것으로 산점되었다.

꽃의 종류에 따라 색상이나 모양을 달리하여 도표를 작성하면 종류에 따른 특성을 보다 상세히 확인할 수 있다.

> as.numeric(iris$Species)

[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

[66] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3

[131] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3

> plot(iris$Petal.Length, iris$Petal.Width,col=iris$Species, pch=as.numeric(iris$Species))

 

 

# 점 모양에 따른 범례 추가

> head(iris)

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1 5.1 3.5 1.4 0.2 setosa

2 4.9 3.0 1.4 0.2 setosa

3 4.7 3.2 1.3 0.2 setosa

4 4.6 3.1 1.5 0.2 setosa

5 5.0 3.6 1.4 0.2 setosa

6 5.4 3.9 1.7 0.4 setosa

 

 

> aggregate(iris[,c(1,3)],by=list(iris$Species),summary)

Group.1 Sepal.Length.Min. Sepal.Length.1st Qu. Sepal.Length.Median Sepal.Length.Mean

1 setosa 4.300 4.800 5.000 5.006

2 versicolor 4.900 5.600 5.900 5.936

3 virginica 4.900 6.225 6.500 6.588

Sepal.Length.3rd Qu. Sepal.Length.Max. Petal.Length.Min. Petal.Length.1st Qu. Petal.Length.Median

1 5.200 5.800 1.000 1.400 1.500

2 6.300 7.000 3.000 4.000 4.350

3 6.900 7.900 4.500 5.100 5.550

Petal.Length.Mean Petal.Length.3rd Qu. Petal.Length.Max.

1 1.462 1.575 1.900

2 4.260 4.600 5.100

3 5.552 5.875 6.900

 

#col=as.integer(factor(iris$Species)에 따라 점찍기

#Species 가 문자이므로 factor로 변환 후 as.integer로 정수 숫호자로 변환

> plot(iris$Petal.Length,

iris$Sepal.Length,

pch=as.integer(factor(iris$Species)),

col=as.integer(factor(iris$Species)))

 

# factor로 된 범주형 변수와 연속형 변수를 도표화 할 때 사용

# Species의 종류가 몇 개인지 모르므로, length(levels(factor(iris$Species))를 사용

#levels(factor(iris$Species)) iris$Speciesfacter로 받아들여서 level을 읽음

#> str(iris$Species)

# Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

# 1:length(levels(factor(iris$Species)1: level의 개수만큼

>legend(1, 8,

legend=levels(iris$Species),

pch=1:length(levels(factor(iris$Species)))

,col=1:length(levels(factor(iris$Species))))


 

> table(iris$Species)

 

setosa versicolor virginica

50 50 50

 

> pie(table(iris$Species))


중복 데이터를 해결하는 방법은 plot 함수 내에 jitter() 기능을 결합하는

것과 sunflowerplot() 함수를 사용하는 두 가지 방법이 있다.

jitter 의 기능은 점이 중복될 경우 아주 작은 랜덤 수자를 좌표에 가감하여 점이 비껴서 찍히도록 하는 기능

jitter() 함수에는 amount 옵션이 있는데 랜덤 수치의 범위를 결정하므로, 1이하의 작은 값을 일반적으로 지정

150개 점이 아니다. 그래서 jitter()

> names(iris)

> plot(iris[,3],iris[,4],xlab="Petal.Length",ylab="Petal.Width"

,xlim=c(0,7),ylim=c(0,3),pch=1)

 


 

jitter()

jitter 의 기능은 점이 중복될 경우 아주 작은 랜덤 수자를 좌표에 가감하여 점이 비껴서 찍히도록 하는 기능

jitter 함수에는 amount 옵션이 있는데 랜덤 수치의 범위를 결정하므로, 1이하의 작은 값을 일반적으로 지정


 

> plot(jitter(iris[,3],amount=0.2),jitter(iris[,4],amount=0.2)

,xlab="Petal.Length",ylab="Petal.Width"

,xlim=c(0,7),ylim=c(0,3),pch=2)



많은 데이터를 도식화 sunflowerplot() 함수를 사용

# 주위에 선이 나타나서 중복이 있음이 표시된다.

 

> sunflowerplot(iris[,3],iris[,4],xlab="Petal.Length",ylab="Petal.Width"

,xlim=c(0,7),ylim=c(0,3),pch=1)

 

 

 


삼차원 도표 그리기(수치형 3)

수치형인 속성 세 개의 상호관계를 시각화하는 방법.

가장 직관적인 방법은 3차원으로 데이터를 표현하는 것.

 

> install.packages("scatterplot3d")

 

> library(scatterplot3d)

 

>str(iris)

> summary(iris)

aggregate(Sepal.Length~Species, summary,data=iris)

> aggregate(Sepal.Length~Species, summary,data=iris)

Species Sepal.Length.Min. Sepal.Length.1st Qu. Sepal.Length.Median Sepal.Length.Mean Sepal.Length.3rd Qu.

1 setosa 4.300 4.800 5.000 5.006 5.200

2 versicolor 4.900 5.600 5.900 5.936 6.300

3 virginica 4.900 6.225 6.500 6.588 6.900

Sepal.Length.Max.

1 5.800

2 7.000

3 7.900


> levels(iris$Species)



#다른 데이터 셋으로 구분

> iris_setosa = iris[iris$Species=="setosa",]

> iris_versicolor = iris[iris$Species=="versicolor",]

> iris_virginica = iris[iris$Species=="virginica",]

 
#3D 틀그리기
# d3에는 Petal.Length,Sepal.Length,Sepal. Width가 축으로들어감
#범위를 자동으로 감지
#d3변수에 저장후 덧그리기시 불러와서 덧그림
> d3 <- scatterplot3d(iris$Petal.Length, iris$Sepal.Length, iris$Sepal.Width,type="n" )
 
 
# 데이터셋을 기준으로 xy, z축을 입력하여 점으로 그림
#검정동그라미:setosa 군집1의 변수Petal.Length,Sepal.Length,Sepal.Width를 그리기
> d3$points3d(iris_setosa$Petal.Length, iris_setosa$Sepal.Length,
iris_setosa$Sepal.Width,bg="black", pch=21)
 
#빨강네모:iris_versicolor 데이터셋을 기준으로 xy, z축을 입력하여 점으로 그림
> d3$points3d(iris_versicolor$Petal.Length, iris_versicolor$Sepal.Length,
iris_versicolor$Sepal.Width,bg="red", pch=22)
 
#파랑세모:_iris_virginica 데이터셋을 기준으로 xy, z축을 입력하여 점으로 그림
> d3$points3d(iris_virginica$Petal.Length, iris_virginica$Sepal.Length,
iris_virginica$Sepal.Width,bg="blue", pch=24)


다른 방법

library(scatterplot3d)

A 3D scatter plot can be produced with package scatterplot3d [Ligges and M¨achler, 2003].

 

> scatterplot3d(iris$Petal.Width, iris$Sepal.Length, iris$Sepal.Width)

 

다른 방법
Package rgl [Adler and Murdoch, 2012] supports interactive 3D scatter plot with plot3d().
마우스로 클릭을 하고 큐브를 회전시키면서 볼수.

> library(rgl)

> plot3d(iris$Petal.Width, iris$Sepal.Length, iris$Sepal.Width)

 


 

# 컬러로 구분되게
# 도표를 마우스로 끌기해서 변경할 수 있다.

library(rgl)

afcol<-as.integer(as.factor(as.character(iris$Species)))

plot3d(iris$Petal.Width, iris$Sepal.Length, iris$Sepal.Width,col=afcol)

 

 


음영예제

YSepal.Width

XSepal.Length

오른쪽 음영 Petal.Width

cuts=9 9개로 음영의 구간을 설정

> library(lattice)

> levelplot(Petal.Width~Sepal.Length*Sepal.Width, iris, cuts=9,col.regions=grey.colors(10)[10:1])


2차원 플러스 도표 활용하기,세개의 변수 플롯

다음은 세 개의 속성을 도해할 때,

두 개의 속성은 이차원 도표에 나타내고 남은 하나의 속성은 색깔의 강도로 표시.

가령, 꽃잎길이와 꽃잎폭을 2차원 평면에 도해한 후 꽃밭침의 길이를 표현한 것과

동일한 2차원 평면에 꽃밭침 폭을 표현하여 비교

둘을 비교해 보면 꽃밭침의 폭은 꽃잎길이와 상이한 패턴을 보이는 부분이 있음.
 

 print(levelplot(Sepal.Length ~ Petal.Length*Petal.Width, iris, cuts=9,

col.regions=grey.colors(10)[10:1]))

 

print(levelplot(Sepal.Width ~ Petal.Length*Petal.Width, iris, cuts=9,

col.regions=grey.colors(10)[10:1]))

 

 

 

개체(obs=레코드=표본)의 변화를 파악하기 쉬운 도표
개체별로 시각화하는 방법으로 Parallel coordinates 방식이 있는데,
이는 tablue 의 기능과 유사.
Parallel coordinates 방식은 parcoord () parallelplot() 함수를 이용하여 시각화 할 수 있으며 다양하게 응용될 수 있는 재밌는 기능.
 

>install.packages("lattice")

> library(lattice)

 

> parallelplot(~iris[1:4] | Species, data=iris)

 

> parallelplot(~iris[1:4], data=iris)

x축에 변수 평균 산포도에서 점들의 특성을 별도의 기호(pch)이나

색상(col)을 이용하여 나타내.
선을 이용하면 이들의 관계를 보다 쉽게 파악.
iris 데이터에서 4가지 속성을 Species에 따라 평균을 구한 후 이를 도표에 나타내
(Species)이 다른 종보다 크거나 작은 지 아니면 혼재되어 있는지 파악
점 모양 21에서 25(pch 번호)는 심볼의 내부 색상과 테두리의 색상을 다르게 지정할 수 있으므로, 여러 가지 정보를 쉽게 구분하기 유용.
기호의 내부 색상은 각 속성마다 서로 다르게 지정(bg=1, bg=2, bg=3, bg=4)하고테두리는 눈에 띄기 쉽도록 검은색을 사용(col=1)

# 빈 주도표 생성

> plot(x=c(1,3),y=c(0,12),pch=22,type="n",

xaxt="n",yaxt="n",ylab="Length",xlab="Species")

 

# 속성명, 4개 속성을 나타낼 기호(pch), 색상을 정리

> vAttr <- c("Sepal.Length","Sepal.Width","Petal.Length","Petal.Width")

> vSym <- c(21,22,23,24)

> vCol <- c(2,3,4,5)

 

# 보조 도포함수, x,

> axis(1,at=1:3,labels=levels(iris$Species))

 

# y축의 명칭 표시

> axis(2,at=0:12)

 

# 각 속성의 평균을 구한 후 라인 표시

> lines(aggregate(Sepal.Length ~ Species,mean,data=iris),type="b",col="gray")

> lines(aggregate(Sepal.Width ~ Species,mean,data=iris),type="b",col="gray")

> lines(aggregate(Petal.Length ~ Species,mean,data=iris),type="b",col="gray")

> lines(aggregate(Petal.Width ~ Species,mean,data=iris),type="b",col="gray")

 

# 각 속성의 평균을 구한 후 점을 표시

> points(aggregate(Sepal.Length ~ Species,mean,data=iris),pch=vSym[1],bg=vCol[1],col=1)

> points(aggregate(Sepal.Width ~ Species,mean,data=iris),pch=vSym[2],bg=vCol[2],col=1)

> points(aggregate(Petal.Length ~ Species,mean,data=iris),pch=vSym[3],bg=vCol[3],col=1)

> points(aggregate(Petal.Width ~ Species,mean,data=iris),pch=vSym[4],bg=vCol[4],col=1)

 

# 범례(legend)박스 표시

> legend(1,12,legend=vAttr,pch=vSym,pt.bg=vCol,cex=0.8)




#################################################


R파일과 pdf 파일 은 교육 과정 끝난 후에는 내렸습니다.


교육과정이 끝난 후에는


교육담당 부장님께 말씀하시면 파일 받으실 수 있으세요.


한 희 선

#########################################


Tag

Leave Comments