본문 바로가기

R

데이터 분석 시작기-14 (그래프 만들기)

데이터 분석에서 가장 중요한 것은 데이터간의 관계, 데이터의 특징을 한 눈에 파악할 수 있는 가독성을 가져야 한다는 것입니다.

데이터를 보기 쉽게 그림으로 표현한 것을 '그래프'라고 하며, 이를 통해 추세와 경향성이 드러나기 때문에 가독성을 갖고 파악이 쉬워집니다. 이번 포스트에서는 산점도, 막대 그래프, 선 그래프, 상자 그림을 통해 각 그래프가 갖는 장점들과 어떤 상황에서 어떤 그래프를 선택하여야 하는지도 간단히 다뤄보겠습니다.

 

모든 그래프는 ggplot2 패키지를 사용하여 만들겠습니다!

library(ggplot2)

쉽고 짧은 문법으로 가장 많이 사용하는 패키지입니다! 그래프를 만들기 전, ggplot2 레이어 구조를 이해하고 시작해보겠습니다.

 

ggplot2 문법은 1단계 : 배경 설정(축) - 2단계 : 그래프 추가(점, 막대, 선) - 3단계 : 설정 추가(축 범위, 색, 표식)

위와 같이 배경을 만들고, 그 위에 그래프 형태를 그리고, 마지막으로 축ㄷ 범위, 색, 표식 등 설정을 추가하는 순서대로 그래프를 그려나가야 합니다.

 

 

# 산점도 - 변수 간 관계 표현하기

산점도 그래프는 변수 간 관계를 표현할 때 주로 사용합니다! x 축과 y축에 점으로 표현하며, 나이와 소득처럼 연속 값으로 된 두 변수의 관계를 표현할 때 사용됩니다!

 

step1) 배경 설정하기

우선, data에 그래프를 그리는 데 사용할 데이터를 지정하고, aes에는 x축(배기량, displ)과 y축(고속도로 연비, hwy)에 사용할 변수를 지정하면 배경이 만들어 집니다. 이전 포스트와 같이 mpg 데이터를 사용하겠습니다!

 ggplot(data = mpg, aes(x = displ, y = hwy)) # 배경 설정

위와 같이 코드를 실행하면, R studio의 plot 창에 배경 그림이 생성됩니다.

step2) 그래프 추가하기

그래프를 그리기 위해서 + 기호를 이용해 그래프 유형을 지정하는 함수를 추가하면 됩니다. 산점도 그래프 함수는 'geom_point()'입니다. 이는 dplyr 함수와 같이 연결하는 것이 아닌, + 기호로 연결하는 것을 주의합시다!

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

코드 실행시, 위와 같이 산점도가 만들어집니다. 점 하나하나가 각각의 관측치이며, 이를 통해 한 눈에 알 수 있는 점은 배기량이 클수록 연비가 낮아지는 경향성이 있다는 점입니다.

 

step3) 축 범위를 조정하는 설정 추가하기

축 범위를 조정하는 설정 또한 + 기호로 추가할 수 있습니다. 축 범위를 설정하는 것은 최초 모든 데이터를 포함하는 그래프가 만들어진 후, 우리가 원하는 일부만 표현하고 싶을 때 설정하면 좋습니다.

xlim()의 경우 x축에 제한을, ylim()의 경우 y축에 제한을 두는 함수입니다. 괄호 안에 최솟값, 최댓값을 입력하면 실행됩니다.

ggplot(data = mpg, aes(x = displ, y = hwy)) + #데이터, 축
+   geom_point() + # 그래프 종류
+   xlim(3,6) + #세부 설정(여기선 축 범위 제한)
+   ylim(10,30)

 

위의 코드와 같이 실행하게되면  x축은 3에서 6까지, y축은 10에서 30까지의 값만 나타나게 됩니다.

 

여기까지가 산점도 그래프입니다!

 

다음은 막대 그래프입니다.

 

#막대 그래프 - 집단 간 차이 표현하기

막대 그래프는 데이터의 크기를 막대의 길이로 표현한 그래프이며, 성별 소득 차이처럼 집단 간 차이를 표현할 때 주로 사용됩니다.

보통 각 집단의 평균값을 막대 길이로 표현하여 그 차이를 확인하는 데에 많이 사용되기에 mpg 데이터의 drv(구동방식)별 평균 hwy(고속도로 연비) 막대 그래프를 만들어 보겠습니다.

 

#평균 막대 그래프 만들기

step1) 집단별 평균표 만들기

집단별 평균은 dplyr 함수 내에 group_by 함수, summarise 함수 등 여러 함수를 활용하여 만들어낼 수 있습니다.

df <- mpg %>% 
+   group_by(drv) %>% 
+   summarise(mean_hwy = mean(hwy))

df라는 하나의 데이터를 구동방식 별 평균 고속도로 연비에 대한 데이터를 얻었습니다.

 

step2) 그래프 생성하기

산점도 그래프와 동일하게 data에 df를 지정하고, x축과 y축에 각각의 변수를 지정하면 됩니다. 다른점은 산점도에서 사용했던 geom_point() 함수가 아닌 geom_col() 함수를 사용하게 됩니다. 

ggplot(data = df, aes(x = drv, y = mean_hwy)) + geom_col()

step3) 크기 순으로 정렬하기

막대 그래프는 기본적으로 알파벳 순으로 정렬됩니다. 숫자와 문자가 같이 있다면 숫자 오름차순, 알파벳 오름차순으로 정렬됩니다.

이렇게 사용해도 크게 문제는 없지만, 분석에 용이하고 그 경향성을 파악하기 위해서 막대의 크기 순으로 정렬하기도 합니다. reorder() 함수를 사용하여 결과를 얻을 수 있습니다.

reorder() 함수의 경우 그 괄호 안에 x축 변수와 정렬 기준으로 삼을 변수를 지정하면 됩니다.

*정렬 기준 변수 앞에 - 기호를 붙임으로써 내림차순으로 정렬할 수도 있습니다.

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

drv라는 변수를 mean_hwy를 기준으로 내림차순한 결과입니다. 참 어렵죠? 정말 처음엔 어렵습니다. 하하하

 

이와 유사하지만 빈도 막대 그래프도 만들어 보겠습니다.

#빈도 막대 그래프

빈도 막대 그래프는 값의 빈도로 막대의 길이를 표현한 그래프입니다. y축 없이 x축만 지정하고, geom_col() 대신 geom_bar()를 사용하면 됩니다.

ggplot(data = mpg, aes(x = drv)) + geom_bar()

둘의 차이를 한 눈에 알아보겠죠? 자세한 둘의 차이는 평균 막대 그래프의 경우 평균표를 먼저 만드는 과정이 필수적이지만, 빈도 그래프의 경우 별도로 표를 만들지 않고 원자료를 이용해 바로 만드는 것입니다!

 

다음은 선 그래프입니다!

#선 그래프 - 시간에 따라 달라지는 데이터 표현하기

데이터를 선으로 표현한 그래프를 '선 그래프'라고 합니다. 요즘 사람들이 많이 하는 주식 혹은 여행 가기 전 확인하는 환율 등 시간에 따라 어떻게 변하는지 그 추세를 알 수 있습니다.

일정 시간 간격을 두고 나열된 데이터를 '시계열 데이터'라고 합니다. 우리가 흔히 확인할 수 있는 데이터이며, 이를 활용하여 '시계열 그래프'를 만드는 방법을 다뤄보겠습니다.

 

ggplot2 내 economics 데이터를 활용할 것입니다.

선 그래프의 함수는 geom_line()입니다!

ggplot(data = economics, aes(x= date, y = unemploy)) + geom_line()

선 그래프 - 시계열 그래프를 통해 실업자 수가 약 5년 주기로 등락을 반복하고, 2010년을 기준으로 감소하는 '추세'임을 알 수 있습니다! 이와 같이 시간에 따른 특정 변수의 추세를 알기 쉽게끔 그래프를 얻을 수 있습니다!

 

마지막으로 상자 그림입니다!

#상자 그림 - 집단 간 분포 차이 표현하기

상자 그림은 이전 포스트에서도 간단히 다루었습니다. 이를 데이터 확인하는 용도가 아닌 전체 데이터의 분포를 직사각형 상자 모양으로 표현하여 평균만 볼 때보다 데이터의 특징을 더 자세히 이해할 수 있다는 장점이있습니다.

함수는 'geom_boxplot()'입니다.

ggplot(data = mpg, aes(x = drv, y = hwy)) + geom_boxplot()

drv별 hwy를 상자 그림으로 표현한 것입니다. 4륜 구동, 전륜 구동, 후륜 구동 별로 각각의 상자 그림을 얻었으며, 각 구동 방식 별 고속도로 연비 분포를 알 수 있습니다.

 

이와 같이 여러 그래프들을 활용할 수 있으며, 각각의 장단점이 존재한다고 생각합니다. 적재적소에 맞는 그래프를 사용하여 데이터 분석에 한 걸음 더 나아가봅시다!

 

요약하기!

#산점도 - ggplot(data = ?, aes(x = ?, y = ?)) + geom_point()

#축 설정 추가 - xlim() + ylim()

#평균 막대 그래프 

#평균표 만들기 - group_by() %>% summarise()

#그래프 생성하기 - ggplot(data = ?, aes(x = ?, y = ?)) + geom_col()

#크기순 정렬하기 -  ggplot(data = ?, aes(reorder(x = ?, 기준), y = ?)) + geom_col()

#빈도 막대 그래프 - ggplot(data = ?, aes(x = ?)) + geom_bar()

#선 그래프 - ggplot(data = ?, aes(x = ?, y = ?)) + geom_line()

#상자 그림 - ggplot(data = ?, aes(x = ?, y = ?)) + geom_boxplot()

 

그래프를 더 쉽게 활용하는 그날까지 다들 화이팅입니다!!

 

감사합니다!