※ 해당 내용은 위의 책을 통해 R을 학습하면서 개인적으로 정리한 내용임을 밝힙니다.

 

R을 활용한 그래프 표현을 학습해보면 알겠지만, 그래프를 나타낼 때 사용패턴이 비슷하며 안에있는 변수나 지정값이 달라질 뿐이다. 따라서 아래와 같이 ggplot2를 정리 가능하다.

 

ggplot(data= <데이터> )  +
 <지옴함수>(
    mapping = aes(<매핑모음>),
     stat = <스탯>,
     poistion = <위치>
  ) +
  <좌표계 함수> +
  <면분할 함수>

 

위와 같이 조합을 변경해보면서 다양한 그래프를 완성시킬 수 있다.

※ 해당 내용은 위의 책을 통해 R을 학습하면서 개인적으로 정리한 내용임을 밝힙니다.

 

[ 사용 Packages = tidyverse ] 

library(tidyverse)

[ 실습용 Data Set = diamonds ]

# diamonds : 54,000개 다이아몬드 각각으 가격, 캐럿, 색상, 투명도 등 정보를 가진 Data Set
diamonds

[ 참고 사항 ]

ggplot2는 보통 ggplot(data=<데이터>)에 지옴 함수를 + 하여 작동

  → 즉 그래프 형식을 변경하거나 표현을 추가하고 싶다면 +되는 지옴함수를 바꾸면 됨 

막대 그래프 그리기 ( geom_bar() )

 

막대그래프는 범주형 자료들을 한 눈에 비교하여 볼 때 유용하다. ggplot2에서는 아래와 같이 geom_bar() 함수를 활용하여 쉽게 구현 가능하다.

# geom_bar 활용 막대 그래프 작성 ( cut에 포함되는 범주들을 Count하여 구분 )
ggplot(data=diamonds)+geom_bar(mapping = aes(x = cut))

 

특이한 점이 보인다. Count라는 변수는 선언하지도 않았는데, 저절로 범주별 Count를 진행하였다. 여기서 알아야할 개념이 '스탯 = 통계적의 줄인말 = stat ' 이다. ggplot2에서 스탯이란 ' 그래프에 사용될 새로운 값을 지정해 나가는 과정'을 의미한다. 위처럼 cut 변수만 지정하였는데, Count 변수가 저절로 생긴 이유는 geom_bar()에는 기본으로 count 스탯이 있기 때문이다. 아래처럼 지옴과 스탯을 바꾸어 작성해도 결과는 같다.

ggplot(data=diamonds)+stat_count(mapping = aes(x = cut))

 

그렇다면 기본 스탯을 다른 스탯으로 덮어 씌울 수 는 없을까? 가능하다. stat 변수에 identity를 입력하면 된다.

 

# 연습용 Data
demo = tribble(
  ~cut, ~freq,
  "Fair", 1610,
  "Good", 4906,
  "Very Good", 12082,
  "Premium", 13791,
  "Ideal", 21551
)

ggplot(data=demo) + geom_bar(
  mapping = aes(x=cut, y=freq), stat = "identity"

 

빈도 수 (Count)가 아닌 비율로 막대 그래프를 그리고 싶다면, 매핑 aes 함수 y에 ..prop.. 변수를 입력해주면 된다.

 

ggplot(data=diamonds) + geom_bar( mapping = aes(x=cut,y=..prop.., group=1))

요약 값 ( Min, Max, 중간값 ) 등에 집중시키고 싶다면, stat_summary를 사용해도 좋다.

 

ggplot(data=diamonds) + stat_summary(
  mapping = aes(x=cut, y=depth),
  fun.min = min,
  fun.max = max,
  fun = median
  )

geom_bar()와 비슷한 함수 중 geom_col() 도 있다. Bar와 col의 차이는 통계적으로 변환을 하냐, 안하냐 차이다. 따라서 Col 같은 경우 매핑 시 2개의 변수를 지정해주어야 하는데, Bar의 경우 한 개의 변수만 지정해 주어도 기본 통계적 변수로 알아서 변환해 준다.

 

# geom_bar은 스탯 활용, X축만 입력해도 통계적 변환 후 그래프에 표시
#  geom_col은 Data를 통계적 변환하지 않고 그대로 표시

ggplot(data=diamonds)+geom_bar(mapping = aes(x = cut))
ggplot(data=diamonds)+geom_col(mapping = aes(x = cut, y=depth))

산점도, 기하 그래프를 학습할 때, 항상 학습한 것이 있다. 그래프에 한가지 변수를 더 추가하여 구분하는 것이다. geom_bar()에서는 Fill 변수에 구분하고자 하는 변수를 입력하면 된다. ( 색상은 랜덤 )

 

# Cut 변수를 Cut 변수로 구분, 즉, 각 범주마다 색상 입히ggplot(data=diamonds) + geom_bar(mapping = aes(x=cut, fill=cut))  

# 막대그래프 상 Clatity 변수로 색상 구분
ggplot(data=diamonds) + geom_bar(mapping = aes(x=cut, fill=clarity))

위의 막대 그래프는 한 변수 위에 다른 변수가 축적된 누적 막대그래프이다. 누적 막대그래프가 아니게 표현하고 싶다면, Position을 "identity", "dodge", "fill" 등으로 지정해주면 된다.

 

먼저 "identity"를 살펴보자. "identity"는 누적 막대그래프가 아닌 변수마다 0부터 시작하게 포지션을 잡고, 같은 범주끼리 묶어버린다. 아래 그래프를 보면 직관적으로 이해가 가능하다. ( 잘 보기 위해선 투명도도 추가 하자 )

 

# 누적 막대그래프가 아닌, 중복 막대그래프 그리기
# 외쪽 Count 범위를 보면 지정 안했을 때와의 차이를 알 수 있다.
ggplot(
  data=diamonds,
  mapping = aes(x=cut, fill = clarity)
) +
  geom_bar(alpha = 1/5, position = "identity")

동일한 기준에서 범주마다 한 변수의 비율을 비교하고 싶다면, Position을 "fill"로 지정하면 된다.

 

ggplot(
  data=diamonds,
  mapping = aes(x=cut, fill = clarity)
) +
  geom_bar( position = "fill")

 

각 범주마다 직관적으로 비교해보고 싶다면, "dodge"를 입력하면 된다.

 

 

※ 해당 내용은 위의 책을 통해 R을 학습하면서 개인적으로 정리한 내용임을 밝힙니다.

 

[ 사용 Packages = tidyverse ] 

library(tidyverse)

[ 실습용 Data Set = mpg ]

# mpg : 미 환경보호당국이 수집한 38개의 차 모델들에 대한 관측값
mpg

[ 참고 사항 ]

ggplot2는 보통 ggplot(data=<데이터>)에 지옴 함수를 + 하여 작동

  → 즉 그래프 형식을 변경하거나 표현을 추가하고 싶다면 +되는 지옴함수를 바꾸면 됨 

 

기하 그래프 그리기 ( geom_smooth() )

 

지난번 산점도에 이어서 기하 그래프를 그리는 방법을 학습해보자. 산점도로 상관관계 파악이 가능하지만, 평활선을 그려 추세를 볼 수 있다면, 더 효과적인 Data 이해가 가능하다. 이 때는 geom_smooth() 함수를 사용하면 된다.

 

산점도 보다 배기량(displ)과 연비(hwy)의 상관 관계를 선으로 보다 명확히 볼 수 있다.

 

# geom_smooth(), 데이터에 적합한 평활선을 만들어 추세 보여줌
# geom_Point()와 사용 방법은 비슷하다. ( 지옴함수만 바뀜 )
ggplot(data=mpg) + geom_smooth(mapping = aes(x=displ, y=hwy))

 

geom_point()에서는 다양한 방식(색상, 모양, 투명도 등)으로 1개의 변수 안 항목을 그래프 상에서 구분 표현하였다. 이처럼 geom_Smooth()에서는 linetype을 추가하면, 1개의 변수의 Data의 항목을 구분하여 표현이 가능하다.

 

구동방식(drv) 변수를 지정해서 4륜, 전륜, 후륜을 구분해서 평활선을 볼 수 있다.

 

# geom_smooth() + linetype 추가, 지정 Data로 평활선을 구분
ggplot(data=mpg)+geom_smooth(mapping = aes(x=displ, y=hwy, linetype = drv))

 

평활선을 산점도와 같이 보고 싶다면, 지옴 함수를 더 + 해주면 된다.

# ggplot()에 추가 표현하고 싶은 지옴함수를 +로 추가
ggplot(data=mpg)+
  geom_smooth(mapping = aes(x=displ, y=hwy)) +
  geom_point(mapping = aes(x=displ, y=hwy))

위와 같이 지옴 함수마다 x,y에 어떤 변수를 매핑하는지 각각 지정해 줄 수도 있다. 그러나 X,Y 변수가 동일할 땐, 상위

ggplot에 매핑을 지정하여, 전역 처리하면 보다 코드를 간단히 할 수 있다. 

ggplot(data=mpg,mapping = aes(x=displ, y=hwy))+
  geom_smooth()+
  geom_point()

 

<참고> 중복되는 것은 전역처리하고, 지옴 함수 별 심미성을 표현하면 더 깔끔하게 작성 가능하다.

ggplot(data=mpg,mapping = aes(x=displ, y=hwy))+
  geom_smooth(
    data=filter(mpg, class == "subcompact"),
    se = FALSE
  )+
  geom_point(mapping = aes(color=class))

※ 해당 내용은 위의 책을 통해 R을 학습하면서 개인적으로 정리한 내용임을 밝힙니다.

 

[ 사용 Packages = tidyverse ] 

library(tidyverse)

[ 실습용 Data Set = mpg ]

# mpg : 미 환경보호당국이 수집한 38개의 차 모델들에 대한 관측값
mpg

[ 참고 사항 ]

ggplot2는 보통 ggplot(data=<데이터>)에 지옴 함수를 + 하여 작동

  → 즉 그래프 형식을 변경하거나 표현을 추가하고 싶다면 +되는 지옴함수를 바꾸면 됨 

 

ggplot2 다양한 방식의 산점도 작성 ( geom_point() )

 

산점도는 두 변수에 대한 상관관계를 알아보는데 유용.

 

[ 사용 형식 ] ggplot(data=<데이터>) + <geom_함수>(mapping = aes(<매핑모음>))

 

geom_point() 함수로 산점도를 작성해보면 배기량(displ)과 연비(hwy)가 음의 상관관계가 있음을 알 수 있다.

# geom_point() = Plot에 점 레이어 추가, 산점도 생성
# aes()의 x, y 인수는 x, y축으로 매핑될 변수를 지정
ggplot(data=mpg) + geom_point(mapping = aes(x=displ, y = hwy))

 

위 산점도를 보면, 점들이 이상하게 규칙적이다. 그 이유는 geom_point()는 값들을 반올림하여 나타냈기 때문이다. 반올림하는 이유는 점들이 겹치는 것을 방지하기 위함이라고 한다. 그러면 실제 값을 산점도에 표현하려면 어떻게 해야할까? 지옴 함수를 geom_jitter()로 바꾸어주면 간단히 해결된다.

 

 <참고> geom_jitter()를 통해선 실제 값으로 산점도 표현이 가능하다.

ggplot(data=mpg) + geom_jitter(mapping = aes(x=displ, y = hwy))

 

 

 

다시 geom_point()로 돌아와서, 산점도에 색상을 표시해 차형식(Class) 도 함께 구분해서 보고 싶다면, Color를 추가하고, 어떤 변수의 색상을 구분하고 싶은지 지정해 주면 된다.

# color에 차형식(class) 변수를 지정, 색상 랜덤배정하여 구분됨
ggplot(data = mpg) + geom_point(mapping = aes(x=displ, y=hwy, color=class))

색상이 잘 구분이 안된다 싶으면 ggplot2에서는 아래와 같이 여러 방법으로 표현도 가능하다. 즉, 이 중에 Data를 가장 잘 표현하는 것으로 Data분석자가 선택하면 된다. 책에서는 이를 심미성 매핑이라고 부른다. 

 

# 크기 심미성 매핑, 크기로 구분
ggplot(data = mpg) + geom_point(mapping = aes(x=displ, y=hwy, size=class))

# 투명도 심미성 매핑, 투명도로 구분
ggplot(data = mpg) + geom_point(mapping = aes(x=displ, y=hwy, alpha=class))

# 모양 심미성 매핑, 모양으로 구분 (최대 6개까지 가능)
ggplot(data = mpg) + geom_point(mapping = aes(x=displ, y=hwy, shape=class))

 

그래프를 표현하다 보면, 직접 조건을 넣어 구별하고 싶을 때도 있다. 이 때는 변수에 조건식을 넣어주면 ggplot2가 알아서 True/False로 구분해준다. 색상구분만 해보자면, ( 색상, 크기, 모양, 투명도 모두 적용 가능 )

# Color에 조건을 넣어주면, 조건에 대한 True/False로 색상을 구분
# cyl 변수는 차량의 기통 수 ( 즉, 8기통 보다 크냐, 작으냐로 True/False 색상 구분 )
ggplot(data = mpg) + geom_point(mapping = aes(x=displ, y=hwy, color=cy<8))

차형식(Class) 변수를 심미성 매핑( 색상, 모양 등 구분 )을 하면 차형식 안의 변수가 7개이기 때문에 복잡해 보이기도 한다. 어떨 때는 그냥 아예 그래프를 쪼개서 보는 것이 유리 할 수도 있다. 이때는 면 분할 함수 Facet_wrap를 추가하면 1개의 변수를 기준으로 쉽게 그래프를 분할 가능하다.

 

※ 아래 코드형식을 보면 Facet_wrap 함수를 +로 추가한 것을 볼 수 있다. 이처럼 ggplot는 +로 함수들을 추가하여, 기능이나 표현을 추가한다는 것을 볼 수 있다.

 

# 플롯을 하나의 변수에 대해 면 분할 Facet_wrap()
# (중요) Facet_wrap()에 전달하는 변수는 이산형(연속형 X)이어야 함.
# 이산형이란 것은 정수형, 문자형 Data가 뚝뚝 끊어져 있어야 한다는 것.
# nrow = 그래프 분할 시 몇개의 행으로 구분하는지 지정 ( 굳이 안써도 됨 )
ggplot(data=mpg) + geom_point(mapping = aes(x=displ, y=hwy)) + facet_wrap(~ class, nrow=2)

 

 

 

여기서 더 욕심을 내면, 2개의 변수로 그래프를 쪼개고 싶을 때가 있다. 이 때는 Facet_grid()를 추가하자.

 

# 플롯을 두 변수 조합으로 면분할 Facet_grid()
# 두개의 변수가 ~로 행, 열 구분됨 ( 변수를 생략하려면 .을 찍음 )
ggplot(data=mpg) + geom_point(mapping = aes(x=displ, y=hwy)) + facet_grid(drv ~ cyl)

 

<참고> Code 작성시 주의 사항

# 실행 안됨
ggplot(data=mpg)
+ geom_point(mapping = aes(x=displ, y = hwy))

# 실행됨
ggplot(data=mpg) +
 geom_point(mapping = aes(x=displ, y = hwy))

위와 같이 +는 라인의 시작이 아니라 끝에 와야 Code의 실행이 가능하다.

+ Recent posts