본문 바로가기
Data Science

geom_histogram() 살펴보기

by Jacey312 2023. 12. 30.

geom_histogram() 개요

geom_histogram()은 ggplot2 패키지에서 제공되는 함수 중 하나로, 연속형 변수의 분포를 히스토그램으로 시각화하는 데 사용됩니다. 이 함수는 데이터를 일정한 간격의 구간(bins)으로 나누고, 각 구간에 속하는 데이터의 빈도를 막대로 나타냅니다. 이런 점에서 특정 범주별로 데이터의 빈도를 막대로 나타내는 geom_bar() 함수와 구분됩니다.

 

아래 코드를 통해 간단히 geom_histogram()을 사용하는 방법을 살펴보겠습니다. 이번 예시에서는 ggplot2 패키지에 포함되어 있는 tips 데이터셋에서 tip 변수를 이용하였습니다. tips 데이터셋은 음식점에서의 손님들이 낸 팁(tip)에 관한 정보를 포함하고 있으며, 이중 tip 변수는 "손님이 낸 팁의 금액"을 의미합니다.

 

아래 그림을 보시면 연속형 변수인 tip 변수를 geom_histogram() 함수를 통해 특정 범위로 구분한 후, 해당 범위에 포함되는 데이터의 빈도(count)가 막대로 출력됩니다. 더욱 자세하게 범위를 나누어 보고 싶을 때는 binwidth 인자를 조정해서 범위의 간격을 사용자가 조절할 수 있습니다.

 

 

ggplot(tips, aes(x=tip))+geom_histogram()

# 범위 간격 조절하고 싶을 때
ggplot(tips, aes(x=tip))+geom_histogram(binwidth = 0.25)

 

 

범주별 비중 쉽게 파악하는 방법 - color

goem_histogram() 함수를 그대로 사용했을 경우, 특정 범위에 포함되는 데이터의 비중을 하나의 막대로 표현해주기 때문에 해당 범위에 어떤 데이터가 포함되어 있는지를 구체적으로 알기 어렵습니다. 그래서 사용하는 방법 중 하나가 "color" 인자입니다. 

 

tips 데이터셋을 예로 설명해보겠습니다. 성별(sex)에 따라 tip(손님이 낸 팁의 금액)이 어떻게 달라지는 지를 확인하고자 할 때, 일반적인 geom_histogram() 함수는 성별이 남성(Male)이든 여성(Female)이든 특정 tip 범위에 있다면 하나의 막대로 표현하기 때문에 이를 한눈에 파악하기가 어렵습니다. 

 

하지만 ggplot 함수에 color를 적용하는 코드를 추가하면, 각 막대에 여성과 남성의 비중이 어느 정도 되는지를 테두리 라인 색상을 통해 쉽게 알 수 있게 됩니다. 

ggplot(tips, aes(x=tip, color=sex))+ geom_histogram()

 

color를 적용한 geom_histogram

 

또 다른 방법으로, ggplot 함수에 fill 인자를 적용하는 것입니다. fill 인자를 사용하면 color 인자와 달리 막대 색상 전체를 각 범주별 색상으로 칠해주기 때문에 보다 확실하게 알 수 있게 됩니다. 아래 코드에서 사용된 total_bill 변수는 "음식점에서의 총 계산 비용"을 의미하고, day 변수는 "요일(Thur, Fri, Sat, Sun)"을 의미합니다.

ggplot(tips, aes(total_bill, fill=day))+ geom_histogram()

fill을 적용한  geom_histogram

 

 

범주별 그래프 그리기 - facet_wrap()

ggplot 함수에 color 또는 fill 인자를 적용해서 막대마다 어떤 범주가 포함되어 있는지를 보다 확실히 알 수 있게 됩니다. 그러나 하나의 막대에 여러 범주를 적층하는 방식으로 표현하기 때문에 각 범주별 비중 차이가 어느 정도인지, 2배인지 3배인지를 정확히 알기가 어렵습니다.

 

또한, 사용자가 어떤 요일에 음식점에서 계산하는 비용이 얼마나 많은지, 모든 요일에서 비슷한 비용을 소비하는지 등 범주 간 비중 차이를 알고싶을 때에도 정확한 확인이 어렵습니다.

 

이런 경우에는 아래 코드와 같이 각 범주별로 별개의 막대 그래프를 그리고, 하나의 열로 나열하여 비교하는 것이 바람직합니다.

 

# day 마다 막대 그래프 작성
ggplot(tips, aes(total_bill, fill=day))+ geom_histogram()+facet_wrap(~day)
# 하나의 열로 배열
ggplot(tips, aes(total_bill, fill=day))+ geom_histogram()+facet_wrap(~day, ncol=1)

facet_wrap() 적용
facet_wrap()에 ncol=1 적용