ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • R을 활용한 시각화 (ggplot)
    R/시각화 - ggplot 2019. 5. 14. 17:53

    매번 시각화를 하며 시각화를 즐겨하지만 기억나지 않는 기능들이 있기 마련입니다.

     

    이번 포스팅은 그런 저를 위한 포스팅이기도 하며 누구든지 이 내용을 보면 R로 시각화를 하는데 두려움이 없도록 하는 목적도 있습니다.

     

    먼저 R Studio에서 모든 시각화를 할 수 있습니다. plot(), boxplot(), barplot(), histogram() 등 다양한 시각화 기능들이 있습니다. 하지만 데이터를 이용하여 그래프를 그리는데 있어서 ggplot만큼 세세한 부분까지 고려하는 기능을 가지고 있지 않습니다.

     

    따라서 ggplot으로 하는 시각화, 그리고 ggplot내의 기능 중심으로 글을 써내려가겠습니다.

     

    1. Scatter plot

    보통 산점도라고 하는 그래프를 그려보겠습니다.

    • scale_x_continous() - limits=c()로 범위지정 or breaks = c()로 축을 임의로 지정 또는 seq를 사용하여 반복가능, name="",   xlim(), xlab()을 대체 가능
    • scale_x_discrete() - 축의 순서를 임의로 변경가능, xlab(),xlim()을 대체 가능
    • coord_fixed() - 그래프의 비율을 맞춰줌
    • coord_flip() - 그래프를 90도 회전시켜줌
    • theme() - theme는 대부분의 그래프 text 디자인을 설정 및 변경할 수 있다.  1. axis.text.x (x축 텍스트 사이즈 및 각도 변환) , 2. text(그래프 내의 text사이즈 변환) , 3. plot.title(그래프의 제목 text와 관련된 모든 것 변환) , 4. axis.title(x/y축 label에 관한 것) , 5. legend.title(범례 타이틀) , 6. legend.text(범례자체의 text) , 7. strip.text.x  -> 각 기능내의 속성들은 size , face , family , hjust 등이 있다.
    • facet_grid - facet_grid(~factor variable)을 통해서 해당 변수의 factor별로 그래프를 격자형식으로 만들어준다. 즉, legend와는 별개로 factor변수를 두번 사용할 수 있는 장점이 있음 ex) 계절별 남/여의 백화점 이용빈도
    • facet_wrap - facet와는 다른점은 grid는 격자형식으로 지정해주는 반면에 wrap는 행과 열 구조에 맞게 구조화해준다.
    • geom_hline - 그래프에 원하는 수직선을 그려주는 것
    • geom_vline - 그래프에 원하는 수평선을 그려주는 것
    • geom_text  - 그래프에 축을 지정하여 원하는 text를 그릴 수 있는 것
    • geom_smooth - 산점도 그래프에 추세선을 그리는 것(단, aes()를 geom_point()에 넣으면 안되고 ggplot()에 넣어야한다.) 속성으로는 method , fullrange-factor별로 만들기 위해서 , se가 있다.

    예를 들기위해서 iris데이터를 이용하여 위의 기능들을 이용하여 그래프를 그려보았습니다.

    #facet_grid/wrap설명하기 위해서 season변수 생성
    iris$season <- sample(x=1:4,size=150,replace = T)
    iris$season2 <- ifelse(iris$season==1,"봄",
                           ifelse(iris$season==2,"여름",
                                  ifelse(iris$season==3,"가을","겨울")))
    iris$season2 <- as.factor(iris$season2)
    data<- iris
    library(ggplot2)
    
    #시각화 시작
    ggplot(data,aes(Sepal.Length,Sepal.Width,col=Species,shape=Species))+
      geom_point()+
      ggtitle('iris visualization')+
      xlab('길이')+#x축 제목
      ylab('넓이')+#y축 제목
      coord_fixed()+ #x축y축 비율 1:1설정
      #coord_flip() - x축y축 transpose
      #geom_hline(yintercept = mean(data$variable),col="#FF6600",cex=0.9)
      #geom_vline(xintercept = mean(data$variable),col="#FF6600",cex=0.9)
      scale_y_continuous(limits=c(1, 5))+ #  = ylim 
      #scale_y_continuous(breaks = c(a,b,c,d))로 축을 임의로 지정할 수 있음
      scale_x_continuous(limits=c(3.75,10))+ #  = xlim
      facet_wrap(~season2)+ # 그래프르 격자형식으로 지정하기
      geom_smooth(method=lm, fullrange=TRUE,se=F)+#추세선 그리기
      geom_text(x=5,y=1.5,label = '안녕하세요',size = 5)+#원하는 곳에 text삽입
      theme(plot.title = element_text(size = 35, hjust=0.5,family = "Tahoma", face = "bold"),
            text = element_text(size = 20, family = "Tahoma"),
            axis.title = element_text(face="bold"),
            axis.text.x=element_text(size = 15,face="bold"),
            legend.title=element_text(size=20), 
            legend.text=element_text(size=20),
            strip.text.x = element_text(size = 20, face="bold"))
    

    2. Bar plot

    Bar plot는 쉽게 막대그래프라고 보시면 됩니다. 대부분의 기능은 위에 써놓은 기능을 따른다고 볼 수 있습니다. 다른점은 geom_point()는 별다른 action없이 ()안에 아무것도 안써넣어도 되는 반면에 geom_bar는 geom_bar(stat=identity)를 꼭 써 넣어 줘야 한다는 것입니다.

    바로 예시코드와 함께 제가 그린 그래프를 보시면 됩니다. 데이터는 서울 자치구별 미세먼지 농도를 이용했습니다.

    ggplot(dust2,aes(x=reorder(name,-dustmean),y=dustmean))+
      geom_bar(size=1,stat = "identity",fill='#006699')+
      scale_y_continuous(name = "평균 미세먼지 농도",
                         limits=c(0, 75))+
      scale_x_discrete(name = "자치구") +
      ggtitle("서울 자치구별 미세먼지 농도") +
      theme(axis.text.x=element_text( angle=90))+
      theme(plot.title = element_text(size = 35, hjust=0.5,family = "Tahoma", face = "bold"),
            text = element_text(size = 20, family = "Tahoma"),
            axis.title = element_text(face="bold"),
            axis.text.x=element_text(size = 30,face="bold"),
            legend.title=element_text(size=20), 
            legend.text=element_text(size=20))+
      geom_text(x=3,y=67,label="강동구",size=8,col="#CC0000")+
      geom_text(x=1,y=73,label="성동구",size=8,col="#CC0000")+
      geom_text(x=2,y=70,label="영등포구",size=8,col="#CC0000")+
      geom_text(x=25,y=52,label="강북구",size=7)+
      geom_text(x=23,y=55,label="동작구",size=7)+
      geom_text(x=24,y=53,label="용산구",size=7)+
      geom_hline(yintercept  = mean(dust2$dustmean),col="red",cex=0.9)
    

    3. Box plot

    Box plot는 데이터의 대푯값, 사분위범위, 사분위수 등의 데이터의 각 변수별 요약치를 알 수 있는 그래프입니다.

    Box plot를 통해서 요약치를 확인하는 방법은 그래프에 표시를 해두겠습니다.

    #boxplot
    ggplot(data,aes(x=Species,y=Sepal.Length,fill=Species))+
      geom_boxplot()

     

    왼쪽 : 가지고 있는 데이터로 그린 boxplot / 오른쪽 : iris데이터를 이용한 boxplot

    4. Line plot

    선그래프는 주로 시계열 데이터에서 주로 사용되는 그래프입니다. 방법은 매우 다양하게 그릴 수 있지만 여기서는 iris데이터를 이용하여 기본적인 선그래프를 그려보도록 하겠습니다.

    #line plot
    library(dplyr)
    line_data <- data %>% group_by(Species) %>% summarise(mean = mean(Sepal.Length))
    ggplot(line_data,aes(x=Species,y=mean,group=1))+
      geom_line()
    
    #범례를 추가하여 그래프를 그리고 싶다면?
    line_data <- data %>% group_by(Species,season2) %>% summarise(mean = mean(Sepal.Length))
    ggplot(line_data,aes(x=Species,y=mean,col=season2,group=season2))+
      geom_line(size=1)
    

    5. histogram

    기존에 iris데이터는 species가 각 50개씩 균등데이터기 때문에 histogram을 그리면 모든 종별로 똑같이 나와서 기존에 만들었던 새롭게 만들었던 season데이터로 그래프를 만들어보도록 하겠습니다. 히스토그램은 데이터에서 각 변수별로 빈도수를 이용하여 그래프를 만드는 것입니다. 따라서 데이터의 빈도 차이(count)를 알고자 할 때 유용한 시각화 자료로 사용될 수 있습니다.

    #히스토그램
    ggplot(data, aes(data$season2)) + 
      geom_histogram(stat = 'count',col="red", 
                     fill="green", 
                     alpha = .2) + 
      labs(title="Histogram for Age") +
      labs(x="iris종", y="Count")
    table(data$season2)  

     

    이렇게 데이터를 이용해서 여러 시각화를 해보았습니다.

    저는 분석에 있어서 데이터를 파악하는데 가장 먼저 시각화를 이용하여 전체적인 데이터의 구조를 파악하고 있습니다. 뿐만 아니라 시각화를 통해서 feature engineering를 하는데 중요한 인사이트를 얻기도 합니다.

     

    이처럼 r을 통해서 시각화를 해보았는데 r 뿐만이 아니라 여러 시각화 툴을 다루며 데이터를 다양하게 wrangling하여 시각화를 하고 분석 해보는 경험은 매우 중요하다고 생각합니다. 따라서 시각화를 연습해보면서 그에 필요한 데이터 전처리도 함께 공부가 되기 때문에 꼭 경험을 해보시면 좋을 것 같습니다.


    댓글

Designed by Tistory.