R/R기초

R08_ggplot2를 이용한 여러가지 그래프

Codezoy 2019. 10. 14. 10:23


Goals

  • geom_col( ), reorder, xlab, ylab, geom_bar
  • ggplot2 : cheat sheet, geom_col vs geom_bar
  • 빈도수 순서로 출력
  • 선 그래프, boxplot , 하나의 차트에서 여러 개의 boxplot 만들기
  • ggthemes


#ggplot2.tidyverse.org : ggplot2 홈페이지


# ggplot2를 이용한 여러가지 그래프
search()
library(dplyr) # 데이터를 가공/정제하는 패키지

# 자동차 구동방식(drv)별로 연비 차이?
df_mpg= mpg %>%   group_by(drv) %>%   summarise(mean_cty=mean(cty))
df_mpg
drv   mean_cty
  <chr>    <dbl>
1 4         14.3
2 f         20.0
3 r         14.1

  • geom_col :
# 어떤 변수의 크기를 막대그래프로 그려주는 함수
(예 : 성별에 따른 급여, 제조사별 평균 연비)

# geom_col을 사용할 때는 x축 변수, y축 변수 모두를 매핑시켜야 한다.


# 그래프 생성
ggplot(data=df_mpg, mapping = aes(x=drv, y= mean_cty))+  geom_col()



# x축의 데이터 순서를 y축의 값에 따라서 정렬하면
# 막대 그래프를 크기 순서로 보여줄 수 있음.
# reorder ( 정렬할 데이터, 정렬기준) 정렬기준에 변수이름 그대로 -> 오름차순 (+), 내림차순 (-)
ggplot(data=df_mpg,
       mapping = aes(x = reorder(drv, mean_cty), y = mean_cty))+
    geom_col()



ggplot(data = df_mpg2,
       mapping = aes(x = reorder(drv, -mean_hwy),y = mean_hwy))+
  geom_col()






# 구동방식별 고속도로 연비 차이?
df_mpg2 = mpg %>%
  group_by(drv) %>%
  summarise(mean_hwy= mean(hwy))
df_mpg2 
 
ggplot(data = df_mpg2,
       mapping = aes(x = reorder(drv, -mean_hwy),y = mean_hwy))+
  geom_col() +
  xlab('구동방식') +
  ylab('고속도로 평균 연비(mpg)')




# geom_bar () : 
# 변수의 빈도수를 막대 그래프로 그려주는 함수
# geom_bar에서 x축에 사용될 수 있는 변수 :
 1) 범주형 변수 ( 예 : mpg의 class )
 2) 연속적인 변수(숫자) -> 구간을 나눠서 구간 안에 포함된 갯수(빈도수)를 출력한다.
(예 :  mpg의 cty, hwy)
 # geom_bar()를 사용할 때는 x축 변수만 mapping 시키면 됨.

ggplot(data=mpg, mapping = aes(x = hwy)) + geom_bar()

  • geom_col() VS geom_bar() 
# 평균 막대 그래프 col ( )
데이터를 요약한 평균표를 먼저 만든 후 평균표를 이용해 그래프 생성 - geom_col()

# 빈도 막대 그래프 bar ( )
별도로 표를 만들지 않고 원자료를 이용해 바로 그래프 생성 - geom_bar()


  • mpg 데이터를 이용해서 분석 문제를 해결해 보세요.
  • Q1. 어떤 회사에서 생산한 "suv" 차종의 도시 연비가 높은지 알아보려고 합니다. "suv" 차종을 대상으로 평균 cty(도시 연비)가 가장 높은 회사 다섯 곳을 막대 그래프로 표현해 보세요. 막대는 연비 가 높은 순으로 정렬하세요.
df_mpg3 = mpg %>%  filter ( class == "suv") %>%
group_by(manufacturer) %>%
  summarise(avg_cty = mean(cty)) %>%
  arrange(desc(avg_cty))%>%  
  head(5)

df_mpg3 %>%
  ggplot(data = df_mpg3, mapping = aes(x= reorder(class,-avg_cty), y = avg_cty))+
  geom_col()



  • Q2. 자동차 중에서 어떤 class(자동차 종류)가 가장 많은지 알아보려고 합니다. 자동차 종류별 빈도를 표현한 막대 그래프를 만들어 보세요.

ggplot(data=mpg, mapping = aes(x=class)) + geom_bar()


# class 빈도수 순서대로 그래프 출력하기
ggplot(data = mpg,
       mapping = aes(x = reorder(class, table(class)[class])))+ geom_bar()


= 같은 그래프  => table 함수를 이용해서 빈도수 배열(테이블)을 구한뒤 그래프 생성
df = as.data.frame(table(mpg$class))
df
ggplot(data = df,
       mapping = aes(x = reorder(Var1,-Freq), y = Freq)) +
  geom_col()




  • 선 그래프 : 
주로 시간에 따라 달라지는 그래프 출력 ( 시계열 그래프 )

# 시간에 따른 실업자 수(unemploy)의 변화
ggplot(data = economics,
       mapping = aes(x = date, y = unemploy))+
      geom_line()

# 시간에 따른 인구(pop) 변화
ggplot(data=economics,
       mapping = aes(x = date, y = pop)) +
  geom_line()

# 인구 대비 실업자수
df <- as.data.frame(economics)

# df 데이터 프레임에 인구 대비 실업자 비율 변수(unemp_ratio)를 추가
df = df %>%  mutate(unemp_ratio = unemploy/pop*100)
( = df$unemp_ratio = (df$unemploy/df$pop)*100 )

ggplot(data=df,mapping = aes(y = unemp_ratio, x =date )) + geom_line()

# 시간에 따른 개인 저축률을 그래프로 작성
ggplot(data=df, mapping = aes( x = date, y = psavert)) + geom_line()


# 두 개 이상의 라인 그래프를 하나의 차트에 작성하기
# 시간(date)에 따른 실업률과 저축률을 하나의 차트에 그리자
ggplot(data=df, mapping = aes(x = date)) + # 공통 데이터/축 설정
geom_line(mapping = aes(y = unemp_ratio),color = 'red') +
  geom_line(mapping = aes(y = psavert), color = 'darkblue')

# 실업률(unemp_ratio)과 평균 실업 기간(unempmed)의 관계가 있을까?
ggplot(data = df, mapping = aes(x = date)) +
  geom_line(mapping = aes( y = unemp_ratio,  ), color = 'red') +
  geom_line(mapping = aes( y = uempmed), color = 'darkblue')


# boxplot : 기술 통계량들을 한눈에 알아볼 수 있는 그래프
# 최솟값, 1사분위값, 중앙값, 3사분위값, 최댓값
>boxplot(mpg$cty)$stats 의 결과값 : 
     [,1]
[1,]    9                            #1) 아랫쪽 수염
[2,]   14                           #2) 사각형의 아래쪽
[3,]   17                           #3) 사각형 안의 선
[4,]   19                           #4) 사각형의 위쪽
[5,]   26                           #5) 위쪽 수염  
attr(,"class")
        1                               #6) 이상치는 어디?
"integer"

#1) 아랫쪽 수염 : 사각형 아래쪽-1.5 IQR 값과 이상치(outlier)가 아닌 데이터의 최솟값 중 큰 값까지
#2) 사각형의 아래쪽 : 데이터들을 정렬했을 때 25%에 해당하는 값 (1Qu.)
#3) 사각형 안의 선 : 데이터들을 정렬했을 때 50%에 해당하는 값 (2Qu.)
#4) 사각형의 위쪽 : 데이터들을 정렬했을 때 75%에 해당하는 값 (3Qu.)
#5) 위쪽 수염 : 사각형 위쪽+1.5 IQR 값과 이상치(outlier)가 아닌 데이터의 최댓값 중 작은 값까지
#6) 이상치 : 사각형 +/- 1.5 * IQR 을 벗어난 값 !!

# IQR(Inter-Quartile Range) = 3Qu. - 1Qu.
>>summary에서 출력된 값 중 평균 제외한 모든 값을 나타낸다.

ggplot (data = mpg, mapping = aes(y = cty) ) + geom_boxplot( )



> table(mpg$cyl)
4  5  6  8
81  4 79 70

  • 하나의 차트에서 여러 개의 boxplot 만들기
    ggplot(data = mpg,
       mapping = aes ( x=as.factor(cyl),  y=cty ) ) +  geom_boxplot()

# drv(구동방식)별 cty의 boxplot
ggplot(data = mpg,
       mapping = aes(x = drv, y = cty))+
  geom_boxplot()




  • Q1. class(자동차 종류)가 "compact", "subcompact", "suv"인 자동차의 cty(도시 연비)가 어떻게 다른지 비교해보려고 합니다. 세 차종의 cty를 나타낸 상자 그림을 만들어보세요.

df7 = mpg %>%  filter(class %in% c('compact','subcompact','suv'))
ggplot(data= df7,
       mapping = aes(x = class, y = cty))+geom_boxplot()

같은 결과값  -> 합치기
mpg %>%  filter(class %in% c('compact','subcompact','suv')) %>%
  ggplot(mapping = aes(x = class, y = cty))+geom_boxplot()






  • ggthemes : 그래프 테마
install.packages('ggthemes')
library(ggthemes)
ggplot(data = mpg, mapping = aes(x=displ, y = hwy))+
  geom_point() +
  theme_wsj()

  • 그래프 여러개 출력하기
# 실업률(unemp_ratio)과 평균 실업 기간(unempmed)의 관계가 있을까?
ggplot(data = df, mapping = aes(x = date)) +
  geom_line(mapping = aes( y = unemp_ratio,  ), color = 'red') +
  geom_line(mapping = aes( y = uempmed), color = 'darkblue')