Coding Diary.

(데이터분석) seaborn으로 히스토그램 faceting(면 분할) 하기 본문

Coding/Data analysis

(데이터분석) seaborn으로 히스토그램 faceting(면 분할) 하기

life-of-nomad 2024. 5. 27. 13:49
728x90
반응형
두 개 이상의 변수를 나타내는 차트를 다룰 때 일반적으로 사용되는 시각화 기법중 하나인 면 분할(Faceting)에 대해 알아보겠습니다.

 

🔻(참고자료) 바이올린 플롯🔻

 

(데이터분석) seaborn으로 Violin plot(바이올린 플롯) 나타내기

🔻(지난글) 지터형 산점도🔻 (데이터분석) seaborn의 투명도, 지터링으로 산점도 과다중첩 해결하기차트에 과도하게 많은 점이 존재하거나 주어진 숫자 변수가 불연속적일 경우, 주어진 그대로

life-of-nomad.tistory.com

 

🔻(참고자료) 상자 그림🔻

 

(데이터분석) seaborn으로 상자 그림(box plot) 나타내기

지난 글에서 숫자 데이터와 범주형 데이터 사이의 관계를 표현할 수 있는 바이올린 플롯에 대해 알아보았습니다.이번 글에서는 숫자 데이터와 범주형 데이터 사이의 관계를 나타내는 또 다른

life-of-nomad.tistory.com

  • 위 글에서 바이올린 플롯과 상자그림을 사용하여 정량적 변수와 정성적 변수 간의 관계를 설명하였습니다.
  • 이번 글에서는 데이터의 정성적 변수와 정량적 변수의 관계를 나타내는 히스토그램패싯팅(면 분할)하는 방법을 이용해보겠습니다.

1. 면 분할(Faceting)

  • 면 분할(Faceting)이란 데이터를 서로소인 부분 집합으로 분할하는 것을 말합니다. 
  • 일반적으로는 범주형 변수를 수준별로 데이터를 분할하는 경우가 많습니다. 
  • 최종적으로 그렇게 분할된 부분 집합별로 각종 변수에 대해 동일한 종류의 차트를 작성합니다. 
  • 면 분할은 추가적인 변수들의 수준에 따른 데이터의 분포나 관계를 나타낼 때 사용되는 기법으로 관심 변수가 세 개 이상일 때 많이 활용됩니다. 
  • 요약하자면, 면 분할 차트를 작성하기 위해서는 다음과 같이 두 단계를 거칩니다.
    • 1) FacetGrid 객체의 인스턴트 생성, 면 분할의 기준이 될 변수 지정
    • 2) map 매서드 사용해서 차트 종류 및 부분 집합별로 나타낼 변수 지정

 

2. 예시

1) Faceting 하기

  • 라이브러리와 데이터를 불러오는 과정, 범주형 변환 과정은 위에 첨부된 지난 글과 동일하니 생략하겠습니다.
#'VClass'열을 일반 객체 유형에서 순서가 있는 범주형으로 변환하기
sedan_classes = ['Minicompact Cars', 'Subcompact Cars', 'Compact Cars', 'Midsize Cars', 'Large Cars']
vclasses = pd.CategoricalDtype(ordered=True, categories=sedan_classes)
df['VClass'] = df['VClass'].astype(vclasses);
  • 패싯팅을 하기 위해 seaborn의 facet grid object class를 사용합니다.
  • 패싯 그리드 객체를 생성하기 위한 두 가지 매개변수를 설정합니다.
  • fuel_econ DataFrame이 이전과 같은 데이터에 할당되고 나면 'VClass'열을 col 매개변수에 할당합니다.
  • 즉, 우리가 패싯팅하는 도표가 무엇이든 차량 클래스의 각 레벨마다 해당 도표 중 하나가 존재할 것을 의미합니다.
  • 그 다음, 패싯 그리드 객체의 map 함수를 사용하여 각 패싯마다 생성할 도표 종류를 설명해야 합니다.
  • 첫번째 인수는 plotting 함수입니다. 이 경우에는 hist 입니다.
  • 두번째 인수는 x축에 표시될 변수입니다. 이 경우에는 comb입니다. (※ x=값 설정하지 않음 주의)
#Seaborn의 FacetGrid로 차트 그리기
g = sns.FacetGrid(data=df, col='VClass')
g.map(plt.hist, 'comb')

  • 데이터의 각 부분 집합이 독립적인 차트로 표현되었습니다.
  • 각 부분 집합은 hist의 기본 설정에 따라 나뉘어진 10개의 계급으로 분류되었으며, 각 차트의 계급 크기는 다릅니다.
  • 하지만 모든 부분 집합 차트의 축 범위가 동일하기 때문에 서로 다른 그룹을 직접적으로 명확하게 비교할 수 있습니다.

 

2) 계급 경계 적용하기

  • 위의 차트를 조금 조정해보겠습니다.
  • 먼저, 각 패싯의 bins가 동일하도록 bins 매개변수를 map에 추가합니다.
  • 그 다음으로, col_wrap 매개변수를 추가하여 나란히 배치할 수 있는 패싯 수를 제한합니다.
  • 마지막으로, 패싯 간에 동일한 축을 고정하지 않을 경우 어떻게 되는지 알아보겠습니다.
  • facet grid col 에서 sharey=flase를 설정하면 각 패싯마다 고유한 y축 한계를 지정할 수 있습니다. 
bin_edges = np.arange(12, 58+2, 2)

#가변적인 계급 경계 적용해 보기
#bin_edges = np.arange(-3, df['comb'].max()+1/3, 1/3)

g = sns.FacetGrid(data=df, col='VClass', col_wrap=3, sharey = False)
g.map(plt.hist, 'comb', bins=bin_edges);

  • 이 방법을 사용하면 레벨 간 분포의 변화를 보다 쉽게 파악할 수 있지만 각 그룹의 전체 빈도를 확인할 수 없습니다. 

 

3) 더 많은 인수 추가하기

  • 범주형 변수가 다양한 수준으로 존재한다면 FacetGrid의 객체에 더 많은 인수를 추가해서 정보가 명확하게 표현되도록 해야 합니다. 
  • 아래의 예시에서는 범주형 변수 'trans'는 27개의 변속기 유형으로 구성되어 있습니다. 
  • 이 경우 27개의 차트가 모두 한 줄에 표시되지 않게 하려면 col_wrap=7로 설명해서 한 줄에 차트를 7개씩 나타낼 수 있습니다.
  • 또한 변속기 종류별 하위 집합을 복합 연비를 기준으로 내림차순으로 나열하겠습니다.
#하위 집합 나열 순서의 기준 찾기
#변속기 종류별로 복합 연비 구하기
group_means = df[['trans', 'comb']].groupby(['trans']).mean()

#복합 연비의 내림차순으로 정렬한 변속기 종류의 리스트만 선택하기
group_order = group_means.sort_values(['comb'], ascending = False).index

#col_order 인수를 사용해 FacetGrid를 group_order에 따라 차트로 나타내기
g = sns.FacetGrid(data=df, col='trans', col_wrap=7, col_order=group_order)
g.map(plt.hist, 'comb')

 

728x90
반응형