Coding Diary.

(데이터분석) seaborn으로 병렬 막대 차트(Clustered bar chart), 히트맵(heatmap)그리기 본문

Coding/Data analysis

(데이터분석) seaborn으로 병렬 막대 차트(Clustered bar chart), 히트맵(heatmap)그리기

life-of-nomad 2024. 5. 27. 13:03
728x90
반응형
단변량 막대 그래프 그리는 방법에 이어 병렬 막대 그래프 그리는 방법에 대해 알아보겠습니다.

 

🔻(지난글) 단변량 막대그래프🔻

 

(데이터분석) 불연속 데이터에서의 히스토그램, 막대그래프 나타내기

지난 글에 이어 이번에는 불연속 데이터의히스토그램, 막대그래프를 나타내는방법에 대해 알아보겠습니다. 🔻막대그래프🔻 (데이터분석) seaborn과 matplotlib으로 막대그래프 작성하기1. Seaborn

life-of-nomad.tistory.com

 

1. 병렬 막대 그래프

  • 병력 막대 그래프를 사용하면 두 개의 정성적 변수 간의 관계를 나타낼 수 있습니다. 
  • 하지만 이를 위해서는 두 번째 변수를 가공하여 y축을 따라 정량적 값으로 표시되게 해야 합니다.
  • 단변량 막대 그래프와 마찬가지로 그룹별 데이터 포인트의 개수를 나타내야 하지만, 하나의 그룹이 두 변수에 대한 레이블로 구성된다는 점이 차이점입니다. 
  • 차트를 쉽게 해석할 수 있도록 막대를 정해진 순서로 배열해야 합니다. 
  • 먼저 첫 번째 변수의 수준에 따라 분류된 다음, 각 그룹 내에서 두 번째 변수를 기준으로 정해진 순서에 따라 배열됩니다.

출처 ❘ Udacity

  • 병렬 막대 그래프는 seaborn의 countplot 함수를 사용해서 그래프를 그릴 수 있습니다.
  • 단변량 차트를 이변량 차트로 바꾸기 위해서는 hue 인수를 통해 차트에 나타낼 두 번째 변수를 추가해야 합니다.

2. 막대 그래프 그리기 예시

1단계)  'VClass'열을 범주형 데이터로 변환

  • 먼저, 필요한 라이브러리와 데이터를 불러옵니다.
import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv('..//data/fuel-econ.csv')
df.head(5)

  • 'VClass'열을 일반 객체 유형에서 순서가 있는 범주형으로 변환합니다.
#세단의 종류
sedan_classes = ['Minicompact Cars', 'Subcompact Cars', 'Compact Cars', 'Midsize Cars', 'Large Cars']

#sedan_classes에 정의된 분류들을 순서가 있는 범주형 데이터로 변환하기
vclasses = pd.CategoricalDtype(ordered=True, categories=sedan_classes)

#pandas.astype()을 통해 'VClass'열을 일반 객체 유형에서 순서가 있는 범주형으로 변환하기
df['VClass'] = df['VClass'].astype(vclasses);

 

 

2단계) 변속기 종류를 나타내는 열 새로 추가하기

  • 이 데이터세트에는 다양한 종류의 변속기(trans열)가 포함되어 있습니다.
  • 하지만 여기서는 변속기를 자동(Automatic)과 수동(Manual)이라는 두 범주로만 나누고자 합니다.
  • 해당 부분을 추출하기 위해 lambda함수를 사용해서 각 변속기 종류 데이터의 첫 번째 단어만 가져옵니다.
df['trans_type'] = df['trans'].apply(lambda x:x.split()[0])
df.head()

  • 마지막 열에 trans_type이라는 열이 추가되었으며 이는 Automatic, Manual의 두 값을 갖습니다.

 

3단계) 막대 그래프 작성하기

sns.countplot(data=df, x='VClass', hue='trans_type)

 

3. 히트맵 그리기

  • 두 범주형 변수 관계는 히트맵을 사용해서 나타낼 수도 있습니다.
  • 이전 글에서는 히트맵을 이차원형 히스토그램으로 취급했지만, 여기서는 막대 그래프라고 생각하면 됩니다.

🔻matplotlib으로 히트맵 그리는 법 아래 글 참고🔻

 

(데이터분석) matplotlib으로 heatmap(히트맵) 작성하기

1. 히트맵히트맵은 일종의 이차원 히스토그램으로 산점도를 대체할 수 있는 차트입니다.두 숫자 변수의 값들이 두 개의 축을 기준으로 평면에 표시된다는 점에서 산점도와 유사합니다.한편, 데

life-of-nomad.tistory.com

  • seaborn 함수 heatmap()은 이러한 종류의 히트맵을 잘 구현할 수 있지만, 인수를 전달하는 방식이 좀 다릅니다. 
  • 원본 DataFrame을 그대로 활용하는 대신 집계 결과를 행렬로 정리하고 이를 바탕으로 차트를 그려야 합니다. 

1단계) 주어진 데이터를 DataFrame 형식으로 만들기

  • 먼저 groupby를 사용해서 주어진 DataFrame을 VClass와 trans_type을 기준으로 그룹화하겠습니다.
#group_by()와 size()로 두 변수의 수준별 조합에 대한 차량의 숫자 정보를 pandas series로 만들기
ct_counts = df.groupby(['VClass', 'trans_type']).size()

  • DataFrame이 차급과 변속기에 따라 분류되었으며 각 결합 범주에 속하는 도수를 확인할 수 있습니다.
  • 이 groupby 객체는 series이므로 DataFrame으로 만들어야 합니다.
  • 이를 위해 reset_index를 사용해서 마지막 열의 이름을 count로 변경합니다.
#series.reset_index()를 사용해 series를 DataFrame 객체로 변환하기
ct_counts = ct_counts.reset_index(name='count')

  • 마지막으로 pivot 함수를 사용해서 DataFrame pivot 메서드의 데이터를 재배열합니다.
#DataFrame.pivot()으로 데이터를 재정렬하여 차급 정보를 행으로 배치하기
ct_counts = ct_counts.pivot(index='VClass', columns='trans_type', values='count')

 

2단계) 히트맵 작성하기

  • 위의 결과를 seaborn heatmap 함수에 직접 넣습니다.
sns.heatmap(ct_counts)

 

  • 위의 결과를 보면 색상마능로는 각 셀의 값이나 변속기의 구성 비율을 파악하기가 어렵습니다.
  • 각 셀의 도수를 나타내는 주석을 셀 안에 추가해봅시다.

3단계) 주석 추가하기

  • annot=True를 추가하면 각 셀에 주석이 나타나지만, 기본 문자열 형식으로는 소수점 두 자리 숫자까지만 나타낼 수 있습니다.
  • 여기서 fmt = 'd'를 추가하면 주석이 정수 꼴로 나타납니다.
  • 만약 데이터가 존재하지 않는 셀이 있다면 fmf = '.0f'를 사용해서 NaN을 0으로 나타낼 수 있습니다.
sns.heatmap(ct_counts, annot=True, fmt='d')

728x90
반응형