Practice makes perfect

[R] lattice 패키지 본문

빅데이터/R

[R] lattice 패키지

kerpect 2020. 7. 6. 18:21

Lattice

: 래티스 시스템은 직교형태의 그래픽(Trellis graphic)을 생성하는 코드를 포함하고 있습니다. 여기서 말하는 기능은 R의 기본그래픽 시스템와는 다른 독립적인 것입니다. 주어지는 데이터 셋을 하나의 특징만 보여주는 것이 아니라 조건을 걸어서 조건별 데이터를 추가적으로 살펴볼 수 있도록 제공합니다. 

 

 

Lattice Plotting System 특징


- 다차원 데이터를 사용할 경우, 한번에 여러개의 plot 생성 가능
- 높은 밀도의 plot를 효과적으로 그림
- 직교형태의 그래픽(Trellis graphic) 생성

 

 

R 고급 시각화 도구 

- 제공 패키지 - graphics / lattice / ggplot2 등...

 

1) 패키지 설치와 실습 데이터 셋 가져오기 

install.packages("lattice")
library(lattice)

 

 

Chem97 - mlmRev패키지 에 저장되어 있습니다. 

더보기

Chem97 데이터 셋에 관한 설명
mlmRev 패키지에서 제공되는 데이터 셋으로 1997 년 영국 2,280 개 학교 31,022 명 학생을 대상으로 A 레벨 대학시험 화학점수를 기록한 데이터 셋이다. 전체 31,022 개의 관측치와 8 개의 변수로 구성되어 있다.

주요 변수 

- mlmRev패키지에서제공
- 1997년영국2,280개학교31,022명을대상으로A레벨(대학시험) 화학점수
- lea : Local Education Authority(지방교육청:1~131)

- school : 학교 id(범위 : 1~2,280)

- student : 학생 id(범위 : 1~31,022)
- score  : A레벨 화학점수(범위 : 0,2,4,6,8,10)
- gender : 성별 (범위 : M, F)
- age : 18.5세기준월수(범위: -6~+5)

- gcsescore : GCSE 개인평균성적 (범위 : 0 ~ 8 사이 실수)
- GCSE : General Certificate of Secondary Education)는 고등학교 재학 중에 치루는 수학능력인증시험을 의미한다

Chem97 의 데이터를 활용하여 Lattice()의 히스토그램과 밀도 그래프를 보도록 하겠습니다. 

 

 

str(Chem97) 
출력값 :  data.frame':	31022 obs. of  8 variables:

table(Chem97$score)
-출력값-
  0    2    4    6    8   10 
3688 3627 4619 5739 6668 6681 

range(Chem97$gcsescore)
출력값 :  [1] 0 8 / 0~8 

range(Chem97$age) 
출력값 :  [1] -6  5 / -6(1월생)~5(12월생) , 0(7월생)

 

 

2) 히스토그램 

 

histogram(y축컬럼~ x축 컬럼|조건, data...) 

- graphics의 hist와 유사 

histogram(~gcsescore, data = Chem97)

   점수의 분포도 확인 -  gcsescore 변수를 대상으로 적용 히스토그램

 

 

 

graphics의 hist와의 차이점 + 추가기능  

score 변수를 조건으로 지정. 
histogram(~gcsescore|score, data = Chem97) # score 단위 

score 점수(주황색 표시)를 기준으로 수능점수를 격자형으로 분리해서 분포를 보여줍니다. 

 

 

factor 활용

- 가시적 효과 상승 

factor 활용
histogram(~gcsescore|factor(score), data = Chem97)

 factor : 범주 값을 반환 (score - 범주 출력 : 0 ~ 10)

요인(factor) 수준은 그래픽 출력에 영향을 미칩니다. 예를 들면, score를 x축에 대입할 경우 score가 출력 되지만, factor로 변환 된 score를 x축에 대입 하면, 요인 수준이 순서로 적용 됩니다. (0,2,4,6,8,10)

 

 

3) 밀도 그래프

 

densityplot(~축커럼|조건, data, groups = 변수)

 

- 선으로 그어서 값을 계산하는 형태(밀도)로 표현 (graphics의 line 과 유사)

- 분포도를 빠르게 이해하는데 많이 사용

- 성별 변수를 그룹으로 지정하여 GCSE 점수를 score 단위로 밀도그램프를 프롤팅

densityplot(~gcsescore|factor(score), data = Chem97, 
                                      groups = gender, 
                                      plot.points=F, 
                                      auto.key = T)

plot.points = F : 밀도 점 표시 여부, auto.key = T : 범례 표시 여부

 

성별을 기준으로 그룹핑을 통한 데이터의 분포도를 확인할 수 있습니다.

(성별로 GCSE 점수를 score 단위로 밀도 플로팅)

 

 

 

4) 막대 그래프

 

barchart(y축 컬럼~x축 컬럼|조건, data, layout)

(graphics의 barplot( ) 업그에드 버전으로 볼 수 있습니다)

 

VADeaths

더보기

VADeaths 데이터 셋에 관한 설명
R 에서 기본으로 제공되는 데이터 셋으로 1940 년 미국 버지니아주의 하위계층 사망비율을 기록한 데이터 셋이다. 전체 5 행 4 열의 numeric 자료형의 matrix 자료구조를 갖고 있다 . 

변수 구성

- Rural Male( 시골출신 남자 )

- Urban Male( 도시출신 남자 )
- Rural Female( 시골출신 여자 )

- Urban Female( 도시출신 여자 )

VADeaths 활용 하여 진행하도록 하겠습니다.

 

 

① 데이터 셋 구조보기 

데이터셋 구조보기

mode(VADeaths) 
출력값 : "numeric"

class(VADeaths)
출력값 : "matrix"

데이터 형식 변경 = matrix -> dataframe 변환

df <- as.data.frame(VADeaths)
str(df)
출력값 : 'data.frame':	5 obs. of  4 variables:

class(df)
출력값 : "data.frame"

 

② 데이터 형식 변경(matrix 형식을 table 형식으로 변경)

dfs <- as.data.frame.table(VADeaths)

str(dfs) 
출력값: 20 obs. of  3 variables:

class(dfs)
출력값: "data.frame"

dfs  
출력값 : Var1 Var2 Freq -> 1열 기준으로 data.table 생성

 

5행 4열의 데이터 셋 

                       ↓

20행 3열 데이터 셋 

as.data.frame.table( ) : metrix -> table 

 

넓은 형식(5행 4열) -> 긴 형식(20행 3열) 변환

= 행(나이)을 기준으로 열 항목을 반복하면서 빈도수를 출력 ( melt형식과 동일 ) 

 

 

※ 변형을 통해서 데이터셋의 의미를 분석, 특징을 직관적으로 파악하기 위함인데, 지금의 형태 변형을 통해서

   막대그래프로 사용하기 위함입니다. 

 

 

 

③ - 1 막대그래프 그리기 

barchart(Var1~Freq|Var2, data=dfs)

y축 나이, x축 빈도수 

 

 

 

③ - 2 막대그래프 그리기 

layout 활용

: 시각화의 효과를 조정할 수 있도록 합니다.

(4,1) = 4개를 1행에 출력

barchart(Var1~Freq|Var2, data=dfs, layout=c(4,1))

Var2변수 값을 기준으로 가로 막대차트 플로팅

 

Var2 변수 단위(그룹화:시골과 도시 출신의 남녀)로 x축 Freq(사망비율),  y축 - Var1(사망연령대)으로 막대차트 프롤팅layout=c(4,1) 속성은 4개의 패널을 1행에  나타내주는 역할을 제공합니다. 

 

 

③ - 3 막대그래프 그리기 

barchart(Var1~Freq|Var2, data=dfs, layout=c(4,1), origin = 0)

origin : x축의 구간을 0부터 표시해주는 역할

 

 

 

5) 점 그래프

 

dotplot(y축컬럼 ~ x축컬럼|조건, data, layout

 

① - 1점 그래프 그리기  

layout 속성 생략시 기본 : 2행 2열 구조의 패널

dotplot(Var1~Freq|Var2, dfs)

① - 2 점 그래프 그리기

layout = c(4,1) : 1행 4열 출력  

dotplot(Var1~Freq|Var2, dfs,layout = c(4,1)) 

 

① - 3 점 그래프 그리기

Var2 변수 단위로 그룹화하여 점을 연결하여 프로팅 (그룹화:시골과 도시 출신의 남녀)

dotplot(Var1 ~ Freq, data=dfs, groups=Var2, type="o",
                     auto.key=list(space="right", points=T, lines=T))

산점도 타입 : type="o" : 점(point) 타입으로 실선이 통과하는 유형으로 그래프의 타입 지정

범례 : auto.key = list (배치위치, 점 추가, 선 추가) : 범례를 나타내는 속성으로 위치를 그래프에서 나타내고, 점과 선을 추가. 

 

 

 

 

6) 산점도 그래프

xyplot(y축컬럼 ~ x축컬럼 | 조건변수,  data = data.frame or list, layout)

(graphics의 plot( )과 유사)

 

airquality

더보기

airquality 데이터 셋
airquality 데이터 셋은 R에서 기본으로 제공되는 데이터 셋으로 New York시의 대기에 대한 질을 측정한 데이터 셋이다. 전체 153개의 관측치와 6개의 변수로 구성되어 있다. (153일 데이터 - 단위(일))

주요 변수: 

Ozone(오존 수치)

Solar.R(태양열)

Wind(바람)

Temp(온도),
Month(측정 월: 5~9)

Day(측정 날짜: 1~31일)

airquality 데이터를 활용하여 설명하도록 하겠습니다. 

 

 

airquality 데이터 형태 

head(airquality) # Ozone Solar.R Wind Temp Month Day

- 출력값 - 
   Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6

 

 

① - 1 산점도 그래프 그리기 

xyplot(Ozone ~ Wind, data = airquality)

분석 결과 : 바람이 강해질수록 오존의 수치가 낮아진다. 

 

 

① - 2 산점도 그래프 그리기 

월별로 데이터의 분포도 확인하기 (layout=c(5, 1):5개의 패널을 1행으로 , factor(Month) : 범주값으로 출력)

xyplot(Ozone ~ Wind | factor(Month), data = airquality, layout=c(5, 1)) 

 

분석 결과 : 월별로 봤을 때, 바람이 강해질수록 오존의 수치가 낮아진다고 이야기 하기 어렵다. 

               더울수록 오존이 수치가 높은건 아닐까? 

 

 

②  airquality 데이터셋의 Month 타입 변경(factor)

convert <- transform(airquality, Month=factor(Month))

str(convert)  
출력값:  $ Month : Factor w/ 5 levels "5","6","7","8",..:

head(convert)

- 출력값 - 
   Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6

xyplot(Ozone ~ Wind | Month, data = convert, layout=c(5, 1))

 

transform : 컬럼 항목을 추가해주는 기능

 

 

quakes 

더보기

quakes 데이터 셋
R에서 제공하는 기본 데이터 셋으로, 1964년 이후 피지(태평양) 섬 근처에서 발생한 지진 사건에 관한 기록으로 전체 1,000개의 관측치와 5개의 변수로 구성되어 있다.


주요
변수 : lat(위도), long(경도), depth(수심 : km), mag(리히터 규모), stations(관
측소)

quakes를 활용하여 출력 결과를 보여드리겠습니다. 

 

 

quakes 데이터 형태 

head(quakes)
 lat   long depth mag stations depth2
1 -20.42 181.62   562 4.8       41      6
2 -20.62 181.03   650 4.2       15      6
3 -26.00 184.10    42 5.4       43      1
4 -17.97 181.66   626 4.1       19      6
5 -20.42 181.96   649 4.0       11      6
6 -19.68 184.31   195 4.0       12      2

str(quakes)  
'data.frame':	1000 obs. of  5 variables:

range(quakes$stations) 
10~132(관측소)

 

① 지진 발생 위치(위도와 경도) 그리기 

xyplot(lat~long, data=quakes, pch="o")

 

② 그래프 변수에 저장, 제목 추가

tplot <- xyplot(lat~long, data=quakes, pch=".")
tplot2 <- update(tplot, main="1964년 이후 태평양에서 발생한 지진위치")
tplot2

update( ) : 제목을 추가 

pch( ) :  점(point) 타입 속성 

③ 산점도 그래프 그리기

 

③ -1  depth 이산형 변수 범위 확인

range(quakes$depth) 
출력값 : 40 680 <= depth # depth 범위 

 

③ - 2  depth 변수 리코딩 : 6개의 범주(100단위)로 코딩 변경

quakes$depth2[quakes$depth >= 40 & quakes$depth <= 150] <- 1
quakes$depth2[quakes$depth >= 151 & quakes$depth <= 250] <- 2
quakes$depth2[quakes$depth >= 251 & quakes$depth <= 350] <- 3
quakes$depth2[quakes$depth >= 351 & quakes$depth <= 450] <- 4
quakes$depth2[quakes$depth >= 451 & quakes$depth <= 550] <- 5
quakes$depth2[quakes$depth >= 551 & quakes$depth <= 680] <- 6

 

 

③ - 3  리코딩 변수(depth2)를 조건으로 산점도 그래프 그리기

convert <- transform(quakes, depth2 = factor(depth2))
xyplot(lat~long | depth2, data=convert)

수심, 경도, 위도 세가지의 형태를 가지고 비교할 수 있습니다. 

 

 

 

7) 데이터 범주화

 

equal.count(변수, number=n, overlap=n)

: 변수값을 대상으로 지정한 영역 만큼 수량 카운터(균등)

 

① 1~150을 대상으로 겹쳐치지 않게 4개 영역으로 범주화

numgroup <- equal.count(1:150, number=4, overlap=0) 
numgroup  

 

 

② 지진의 깊이를 5개 영역으로 범주화, 산점도 그래프 그리기

depthgroup <- equal.count(quakes$depth, number=5, overlap=0)

xyplot(lat~long | depthgroup, data = quakes,
       main="Fiji Earthquakes(depthgroup)",
       ylab="위도", xlab="경도",pch="@", col="red")

 

③  수심과 리히터규모(강도) 변수를 동시에 적용하여 산점도 그래프 그리기 

magnitudegroup <- equal.count(quakes$mag, number=2, overlap=0)

xyplot(lat~long | magnitudegroup, data = quakes,
       main="Fiji Earthquakes(magnitude)",
       ylab = "latitude", xlab = "longitude",
       pch="@", col="blue")

④ 수심과 리히터 규모를 동시에 표현(2행 5열 패널 구조) 

- ( * ) 를 사용하여 연결

xyplot(lat~long | depthgroup*magnitudegroup, data=quakes,
       main="Fiji Earthquakes",
       ylab = "latitude", xlab = "longitude",
       pch="@", col=c("red", "blue"))

 

⑤ 이산형 변수로 리코딩한 뒤에 factor형으로 변환하여 산점도 그래프 그리기 

depth 변수 리코딩분 
 
quakes$depth3[quakes$depth >= 39.5 & quakes$depth <= 80.5] <- 'd1'
quakes$depth3[quakes$depth >= 79.5 & quakes$depth <= 186.5] <- 'd2'
quakes$depth3[quakes$depth >= 185.5 & quakes$depth <= 397.5] <- 'd3'
quakes$depth3[quakes$depth >= 396.5 & quakes$depth <= 562.5] <- 'd4'
quakes$depth3[quakes$depth >= 562.5 & quakes$depth <= 680.5] <- 'd5'

mag(지진의 강도) 변수 리코딩 
quakes$mag3[quakes$mag >= 3.95 & quakes$mag <= 4.65] <- 'm1'
quakes$mag3[quakes$mag >= 4.55 & quakes$mag <= 6.45] <- 'm2'
View(quakes)


convert <- transform(quakes, depth3=factor(depth3), mag3=factor(mag3))

xyplot(lat ~ long | depth3*mag3, data=convert,
       main="Fiji Earthquakes",
       ylab = "latitude", xlab = "longitude",
       pch="@", col=c("red", "blue"))

 

 

 

8) 3차원 산점도 그래프 

cloud - 3차원(z ~ y * x) 산점도 그래프 플로팅 = depth ~ lat * long : depth(z축), lat(y축) * long(x축) 

 

① 위도, 경도, 깊이를 이용하여 3차원 산점도 그래프 그리기 

cloud(depth ~ lat * long, data = quakes,
      zlim = rev(range(quakes$depth)),
      xlab = "경도", ylab = "위도", zlab = "깊이")

zlim=rev(range(quakes$depth)) : z축값 범위 지정

panel.aspect=0.75 : 테두리 사이즈 

screen=list(z=105,x=-70) : z, x축회전
xlab="Longitude“ : x축이름
ylab="Latitude“ : y축이름
zlab="Depth" : z축이름

② 테두리와 회전 속성을 추가하여 3차원 산점도 그래프 그리기 

cloud(depth ~ lat * long, data = quakes,
      zlim = rev(range(quakes$depth)),
      panel.aspect=0.9,
      screen=list(z=45, x=-25),
      xlab = "경도", ylab = "위도", zlab = "깊이")

panel.aspect : 테두리 사이즈

screen : 회전각 

 

'빅데이터 > R' 카테고리의 다른 글

[R] 정형 데이터 처리(DB 연결)  (0) 2020.07.08
[R] 기하학적 기법 시각화 - ggplot2 패키지  (0) 2020.07.07
[R] 코딩 변경  (0) 2020.07.06
[R] 이상치(극단치)  (0) 2020.07.06
[R] 결측치(NA) 처리  (0) 2020.07.06