Coding Diary.

(데이터분석) seaborn의 절대도수와 상대도수 막대그래프 나타내기 본문

Coding/Data analysis

(데이터분석) seaborn의 절대도수와 상대도수 막대그래프 나타내기

life-of-nomad 2024. 5. 24. 09:35
728x90
반응형
🔻지난글🔻에서 seaborn과 matplotlib으로 막대그래프 나타내는 방법을 알아보았습니다.
이번 글에서는 절대도수와 상대도수의 막대그래프를 나타내는 방법에 대해 알아보겠습니다.
 

(데이터분석) seaborn과 matplotlib으로 막대그래프 작성하기

1. Seaborn으로 막대 그래프 작성하기도수를 나타내는 기본적인 막대 그래프는 seaborn의 countplot함수를 사용하여 작성할 수 있습니다.seaborn.countplot(*, x=None, y=None, data=None, order=None, orient=None, color=None)

life-of-nomad.tistory.com

1. 절대 도수를 나타내는 수평 막대 그래프 작성하기

  • 먼저, 필요한 패키지를 불러오고, csv 파일을 읽습니다.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

#csv 파일에서 데이터 읽기
df = pd.read_csv('data/diamonds.csv')
print(df.shape)
df.head(10)

  • 어떤 변수의 총 개수를 차트에 나타내고 싶을 때는 countplot 함수를 사용하면 됩니다.
  • 먼저, value_counts로 clarity 변수의 각 범주에 속하는 데이터의 개수를 파악하고, 내림차순으로 정렬한 합니다.
  • 그 다음 countplot 함수를 사용하면 절대 도수를 나타내는 차트를 수직이나 수평으로 작성할 수 있습니다.
#clarity 열에서 각 고유한 값의 도수 구하기
# 기본 설정에 따라 절대 도수가 내림차순으로 반환됨
clarity_counts = df['clarity'].value_counts()
clarity_counts

#clarity 열에 존재하는 고유한 값들을 빈도의 크기순으로 지정하기
order = clarity_counts.index
#절대 도수를 나타내는 수평 막대 그래프 그리기
sns.countplot(data=df, y='clarity', color'tab:blue', order=order)

 

2.  한쪽 축에 실제 개수가 아닌 비중을 나타내는(상대도수) 막대 그래프 작성하기

  • 예를 들어, IF 투명도 등급의 다이아몬드 비율을 구하려면 계산을 해서 추정해야 합니다.
  • 그 대신, 상대 도수를 나타내는 차트를 작성해보겠습니다.
  • 비율을 나타내야 하므로 정수값을 요구하는 countplot을 사용할 수 없으므로 대신 barplot을 사용해야 합니다.
  • 가장 먼저 해야 할 일은 데이터를 정규화하는 것입니다. 방법은 두 가지가 있습니다.
  • 방법 1) value_counts를 계속 사용하되 normalize=True를 입력하는 것
    • 각 범주의 개수를 전체 데이터 개수로 나눠서 정규화한 값이 사용됩니다. 
    • 그리고 이 series를 dataframe 으로 변환합니다.
#pandas의 기본 제공 정규화 기능 사용하기
clarity_counts = df['clarity'].value_counts(normalize=True)

#pd.series를 dataframe으로 변환하기
clarity_counts = clarity_counts.reset_index(drop=False)
clarity_counts = clarity_counts.rename(columns={'index':'clarity', 'clarity':'proportion'})

sns.barplot(data=clarity_counts, y='clarity', x='proportion', color='tab:blue', order=order)

  • 이 그래프를 보면 IF등급으로 분류된 다이아몬드는 전체의 3.5~4%인 것을 알 수 있습니다.
  • 상대도수가 가장 큰 SI1등급은 전체의 25%을 차지하는 것을 알 수 있습니다.
  • 방법 2) matplotlib으로 절대 도수 차트와 상대 도수 차트를 결합하는 것입니다.
    • 각 막대에 대한 반복문을 실행해서 그 값을 백분율 단위로 변환합니다.
    • 결과적으로 각 투명도 등급의 도수를 전체 데이터 개수로 나눈 값으로 구성된 문자열이 만들어집니다.
    • 결과를 보면 각 등급에 대한 절대 도수 뿐만 아니라 상대적 비율도 확인할 수 있습니다.
#차트는 위와 동일하되, 비중을 나타내는 텍스트를 각 막대에 출력하기
clarity_counts = df['clarity'].value_counts()
total_count = clarity_counts.sum()
base_color = sb.color_palette()[0]

#비중을 나타내는 텍스트를 막대에 출력
sns.countplot(data=df, y='clarity', color=base_color, order=order)
for i, count in enumerate(clarity_counts):
#개수를 백분율로 변환한 다음 문자열로 변환하기
	pct_string = f'{100*count/total_count:.1f}%'
    #문자열 값을 각 막대에 출력하기 
   	plt.text(count+1, i, pct_string, va='center')

728x90
반응형