R 기초 2 데이터 시각화 한국어 정보의 전산 처리 2019. 4. 9.
ggplot2 기초: 함수 호출의 기초적 방법 Grammar of Graphics를 구현. Hadley Wickam이 만들었음. ggplot이라는 기본 함수와 geom(geometry) function이라는 layer를 결합 하여 plot을 그림. 함수 호출의 기본 개요 ggplot(data=<data>) + geom_<...>(mapping=aes(x=…, y=…)) geometry function의 mapping argument에 aes(aesthetics) 함수를 연결함. aes 함수에서는 x, y 좌표축에 연결할 변수를 제시하고 그 외의 변수도 추가로 지정할 수 있음. mapping은 ggplot 함수의 argument로 제시할 수도 있음. 붉은색 부분은 고정된 것이므로, 생략해도 됨. ggplot(mpg) + geom_point( aes(displ, hwy) ) mpg(자동차 모델별 정보)라는 데이터(테이블)에서 displ 변수(엔진 크기: 리터 수)를 x축으로, hwy(고속도로 연비)를 y축으로 하여, 각 모델을 이 좌표축 위에 점으로 나 타냄.
aes 함수의 mapping, attribute aes 함수에 x, y 좌표뿐 아니라, 기타 변수의 값에 따른 구분을 색깔(color), 모양(shape. 6개까지), 농도(alpha), 크기(size) 등으로 나타낼 수 있음. ggplot(mpg) + geom_point( aes(displ, hwy, color=class) ) class 구분(SUV, 2-seat, compact 등)을 색깔로 구분 ggplot(mpg) + geom_point( aes(displ, hwy, shape=drv) ) drv 구분(4륜구동, 전륜구동, 후륜구동)을 모양으로 구분 ggplot(mpg) + geom_point( aes(displ, hwy, alpha=cyl) ) cyl(실린더 수)을 농도로 구분 ggplot(mpg) + geom_point( aes(displ, hwy, size=year) ) year(출시 연도)를 크기로 구분 ggplot(mpg) + geom_point( aes(displ, hwy, color=class, shape=drv)) class를 색깔로, drv를 모양으로 구분 ggplot(stu) + geom_point(aes(kor,math, color=job, shape=gender, size=class)) 국어(x축), 수학(y축), 직업(색), 성별(모양), 계층(크기)
Facet을 이용한 多패널 plot aes 함수 내에서 x, y 좌표 외에 제3의 변수를 색깔 등으로 나타내는 방법 외에, 제3의 변수가 범주형 변수인 경우, 이 변수의 값에 따라 facet을 나누어 그래프를 따로 그릴 수도 있음. ggplot(mpg) + geom_point(aes(displ, hwy)) + facet_wrap(~class, nrow=2) x축=displ, y축=hwy로 하되, class의 값에 따라 7개의 facet으로 나누어 제시 ggplot(stu) + geom_point(aes(kor,math)) + facet_wrap(~job, nrow=2) x축=kor, y축=math로 하되, job의 값에 따라 7개의 facet으로 나누어 제시 제3 변수, 제4 변수를 조합하여 grid 형태로 제시할 수도 있음. ggplot(mpg) + geom_point(aes(displ, hwy)) + facet_grid(drv~cyl) drv(3가지 값)×cyl(4가지 값)=12가지 facet으로 나누어 제시 ggplot(stu) + geom_point(aes(kor,math)) + facet_grid(party~class) party(2가지 값)×class(3가지 값)=6가지 facet으로 나누어 제시
geom function들 scatterplot을 그려 주는 geom_point 함수 외에도 여러 geom 함수들이 있음. 함수의 이름은 plot의 종류와 대개 일치. geom_smooth: 두 수치 변수의 관계를 보여 주는 추이선(smooth) 및 표 준오차범위(standard error)를 보여줌 geom_boxplot: 관측치들의 분포를, 범주형 변수의 값 별로 boxplot으로 보여줌 geom_histogram geom_freqpoly geom_bar: 범주형 변수의 분포를 보여줌. geom_path, geom_line: 관측치들의 시간에 따른 변화 추이 양상을 선으 로 나타냄. 후자는 좌→우만 가능. 전자는 어느 방향이든 가능.
geom_smooth ggplot(stu) + geom_smooth(aes(math,phy)) x축=수학점수, y축=물리점수, 청색 선=smooth, 회색 띠=smooth를 중심으로 한 오차범위. 두 변수가 대체로 비례 ggplot(mpg) + geom_smooth(aes(displ,hwy)) x축=엔진크기, y축=고속도로연비, 이 둘이 대체로 반비례 geom_point와 geom_smooth를 함께 쓸 수도 있음. ggplot(stu) + geom_point(aes(math,phy)) + geom_smooth(aes(math,phy)) 수학점수와 물리점수의 관측치들에 대한 scatterplot과 smooth를 함께 제시 aes 함수의 mapping 내용이 두 geom 함수에 공통되므로, 공통 부분을 ggplot 함수의 argument로 몰아서 제시할 수도 있음. ggplot( stu, aes(math,phy) ) + geom_point() + geom_smooth() ggplot( mpg, aes(displ,hwy) ) + geom_point() + geom_smooth()
geom_smooth의 attribute geom_point 함수에서 색깔, 모양, 농도, 크기 등의 attribute를 사용할 수 있듯이, geom_smooth에서도 linetype 등의 attribute를 사용할 수 있음. ggplot( stu, aes( math, phy ) ) + geom_point() + geom_smooth( aes( linetype=gender ) ) 수학, 물리 smooth 곡선을 그리되, 성별에 따라 선 모양을 구분하여 그림 linetype 대신 group을 사용하면, 선 모양은 같되, smooth 곡선을 따로 그림 ggplot( stu, aes( math, phy, color=gender ) ) + geom_point() + geom_smooth( aes( linetype=gender ) ) color=gender가 ggplot 함수의 argument 속에 들어 있으므로, geom_point와 geom_smooth 양쪽에 다 적용됨. ggplot( stu, aes( math, phy ) ) + geom_point() + geom_smooth() + facet_wrap( ~gender, nrow=2 ) 수학, 물리 사이의 관계 그래프를 성별에 따라 두 facet으로 나누어 따로 그림
geom_smooth의 method geom_smooth 함수의 method parameter: smooth 곡선을 fitting할 때 사용할 통계모델과 방법을 지정함. default argument: loess n(관측치의 개수)이 작을 때 적당. local regression(최소제곱법)을 사용 곡선의 구불구불한 정도(wiggliness)를 span parameter로 지정. 0(매우 구불구 불)~1(구불구불하지 않고 매끈함) ggplot(stu,aes(math,phy)) + geom_point() + geom_smooth(span=0.7) ggplot(stu,aes(math,phy)) + geom_point() + geom_smooth(span=0.2) lm(linear model) method: 두 변수 사이의 관계가 선형 관계라고 전제 ggplot(stu,aes(math,phy)) + geom_point() + geom_smooth(method=lm) gam(generalized additive model) method: mgcv 패키지 load 필요 ggplot(stu,aes(math,phy)) + geom_point() + geom_smooth(method=gam, formula = y~s(x))
geom_boxplot 범주형 변수를 x축에, 수치형 변수를 y축에 표시. ggplot( stu, aes( job, avg ) ) + geom_boxplot() job별로 avg의 boxplot을 그림 ggplot( stu, aes( job, avg ) ) + geom_boxplot() + coord_flip() 90도 돌려서 제시함. x축 각 범주의 이름이 길어서 겹칠 때 유용. ggplot( stu, aes( job, avg ) ) + geom_violin() box 모양 대신 violin 모양으로 보여줌 어느 수치대에 관측치들이 몰려 있는지를 알아보고 싶을 때 유용 ggplot( stu, aes( gender, avg ) ) + geom_boxplot() ggplot( stu, aes( party, avg ) ) + geom_boxplot() ggplot( stu, aes( class, avg ) ) + geom_boxplot()
geom_bar 범주형 변수의 빈도를 barplot으로 보여줌. ggplot( stu, aes( job ) ) + geom_bar() 모든 geom_*** 함수는 stat_*** 함수를 자동 호출하며 default로 연결된 stat_*** 함수가 있음. geom_bar와 default로 연결된 것은 stat_count stat_count 함수는 범주형 변수의 빈도를 계산해 줌. stat_*** 함수를 호출해도, 마찬가지로 이와 default로 연결된 geom_*** 함수가 함께 자동 호출됨. geom_***와 stat_*** 사이의 이러한 default 연결을 바꿔 줄 수도 있음. ggplot( stu, aes( name, avg ) ) + geom_bar( stat="identity" ) + coord_flip() name의 값의 빈도를 보여주는 게 아니라, y축을 avg로 명시했음. ggplot(stu) + geom_bar(aes(x=job, y=..prop.., group=1)) job의 값의 빈도 대신 비율을 보여줌.
geom_bar의 attribute들 color: 막대의 윤곽선에 색깔이 추가됨. fill: 막대 내부에 색깔이 채워짐. ggplot(stu) + geom_bar( aes(job, color=job) ) fill: 막대 내부에 색깔이 채워짐. ggplot(stu) + geom_bar( aes(job, fill=job) ) x축 변수와 attribute에 연결하는 변수를 달리하면, 막대 내부에서 구분을 보여줌. ggplot(stu) + geom_bar( aes(job, fill=gender) ) position이라는 parameter는 “dodge”, “fill”, “identity” 값을 가질 수 있음. position parameter의 default는 “stack” 주의: color, fill은 aes 내부에 제시하는 반면에, position은 aes 바깥에 제시. identity: 막대들이 겹치게 됨. 2D geom에 적당. fill: 각 막대의 길이를 동일하게 함. 비율 비교에 적당. ggplot(stu) + geom_bar(aes(job, fill=gender), position="fill" ) dodge: x축 범주형 변수의 각 값마다, fill 범주형 변수의 각 값에 해당하는 막대들을 (stack식이 아니라) 옆에 나란히 보여줌. ggplot(stu) + geom_bar(aes(job, fill=gender), position=“dodge" )
jitter scatterplot을 그릴 때, 동일한 관측치가 있으면 둘 이상의 관측 치가 하나의 점으로 표시됨. 이 경우, 어느 부분에 관측치가 많이 몰려 있는지를 보려 할 때, 실제 자료의 빈도를 그래프가 제대로 반영하지 못하게 됨. 점의 위치에 약간의 오차를 도입하면 점들이 겹치지 않게 됨. ggplot(mpg, aes(displ, hwy)) + geom_point( position="jitter" ) ggplot(mpg, aes(displ, hwy)) + geom_jitter() 특히 x축 변수가 범주형 변수일 때는 관측치가 동일 위치에 몰 리는 현상이 두드러지므로, jitter가 유용함. ggplot(mpg, aes(drv, hwy)) + geom_point() ggplot(mpg, aes(drv, hwy)) + geom_jitter()
geom_histogram, geom_freqpoly histogram: 수치형 변수 1개를 x축에 일정한 범위(bin)로 묶어서 각 bin 에 속하는 관측치의 빈도를 보여줌. ggplot( stu, aes(avg) ) + geom_histogram() default bin의 개수는 30개 ggplot( stu, aes(avg) ) + geom_histogram( binwidth=5 ) bin의 폭을 5로 설정 freqpoly: histogram과 비슷한 것을 꺾은선 그래프로 보여줌 ggplot( stu, aes(avg) ) + geom_freqpoly( binwidth=1 ) ggplot( stu, aes(avg) ) + geom_freqpoly( binwidth=5 ) 범주형 변수를 attribute로 추가할 수 있음. ggplot( stu, aes(avg, color=gender) ) + geom_freqpoly( binwidth=5 )
시계열과 geom_line, geom_path geom_line과 geom_path는 시계열(time series) 자료, 즉 시간의 흐름에 따른 데이터의 변화 추이를 보여주는 데 적합. geom_line은 좌→우의 방향만 가능 geom_path는 어느 방향이든지 가능 연도별 실업률 추이 ggplot(economics, aes(date, unemploy / pop)) + geom_line() 연도별 실업 주수 중앙값 추이 ggplot(economics, aes(date, uempmed)) + geom_line() x=실업률, y=실업주수중앙값 ggplot(economics, aes(unemploy/pop, uempmed)) + geom_point() + geom_path() 추이선=회색, 관측치 농도를 연도별로 다르게 함. year <- function(x) as.POSIXlt(x)$year + 1900 ggplot(economics, aes(unemploy/pop, uempmed)) + geom_point(aes(color=year(date))) + geom_path(color="grey50")
ggplot의 geom_*** 총괄 cheatsheet : https://www.rstudio.com/wp- content/uploads/2015/03/ggplot2-cheatsheet.pdf 1변수 plot: y축은 빈도 범주형(이산형) 변수: geom_bar 수치형(연속형) 변수: geom_histogram, geom_freqpoly 2변수 plot x축 변수, y축 변수 둘 다 수치형(연속형) 변수: geom_point, geom_smooth x축 변수는 범주형(이산형)이고 y축 변수는 수치형: geom_bar, geom_boxplot, geom_violin