영국 척척석사 유학생 일기장👩🏻‍🎓

(데이터분석) seaborn과 matplotlib으로 히스토그램 나타내기 본문

코딩공부/Data analysis

(데이터분석) seaborn과 matplotlib으로 히스토그램 나타내기

life-of-nomad 2024. 5. 24. 12:55
728x90
반응형
  • 히스토그램은 숫자 변수의 분포를 나타낼 때 사용합니다. 
  • 막대 그래프를 정량적 변수에 적용한 것과 같습니다.
  • 하지만 하나의 막대로 각 고유 범주에 속하는 값의 개수를 나타내는 대신, 값을 연속적인 계급으로 나눈 다음 하나의 막대로 각 계급에 속하는 값의 개수를 나타냅니다. 
  • seaborn과 matplotlib으로 나타낼 수 있습니다.

1. Matplotlib.pyplot.hist()

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('diamonds.csv')
df.shape

df.head(5)

  • 다이아몬드의 x,y,z축 길이를 확인하려고 합니다.
  • 이 값은 mm단위로 입력되어 있습니다.
  • 히스토그램을 작성할 때는 matplotlib의 hist 함수를 사용하면 됩니다.
  • data 변수에 데이터 세트를 전달한 다음 x축에 매개변수 x를 나타내는 x히스토그램을 그리도록 지정합니다.
plt.hist(data=df, x='x');

  • matplotlib은 기본적으로 데이터를 10개의 계급으로 나누는데 이는 일반적으로 너무 적고, 
  • 계급의 경계가 눈금과 일치하지도 않습니다.
  • 이때, 매개변수 bin을 사용합니다. 정숫값만큼의 계급이 자동으로 만들어집니다.
plt.hist(data=df, x='x', bins=25)

  • 직접 계급을 지정할 수도 있습니다.
  • numpy arange 함수를 사용해 계급 경계의 배열을 정의하면 됩니다.
  • 최댓값에 0.25를 더하는 것은 가장 오른쪽의 계급의 경계값이 데이터의 최댓값보다 크게 만들어 어떤 경우에도 모든 데이터가 표시되도록 하기 위함입니다. 
#np.arange(최솟값, 최댓값, 계급의 크기 1/4mm)
bins = np.arange(0, df['x'].max()+0.25, 0.25)
plt.hist(data=df, x='x', bins=bins);

 

 

2. Seaborn histograms

  • 기본 계급 개수가 matplotlib보다 많습니다.
  • 데이터를 정규화한 다음 각 계급이 차지하는 비중을 나타내고 싶다면 통계량을 뜻하는 stat이라는 매개변수를 도입하면 됩니다.
  • 그러면 각 계급이 전체에서 차지하는 비중을 나타내는 차트가 됩니다.
  • 기본 구문은 다음과 같습니다. 
seaborn.histplot(data, x, y, bins, kde, stat, hist_kws)
sns.histplot(data=df, x='x', stat='percent');

  • 이 함수에서는 kde=True라는 매개변수를 지정할 수 있습니다.
  • 이는 차트 위에 가우시안 커널 밀도 추정을 겹쳐서 나타냅니다.
  • KDE(Kernel Density Estimate) : 데이터 분포의 밀도 추정이며 그 곡선 아래의 면적은 항상 1입니다. 

3. 두 개의 히스토그램을 나란히 작성하기

#차트의 크기를 조정하고 두 차트를 나란히 배치하기
#subplot을 아우르는 figure의 크기 설정하기
plt.figure(figsize = [20, 5])

#왼쪽의 히스토그램, 계급의 크기가 지나치게 큼
#1개의 행, 2개의 열, subplot 1
plt.subplot(1, 2, 1)
bins = np.arange(0, pokemon['speed'].max()+4, 4)
plt.hist(data = pokemon, x = 'speed', bins=bins);

#오른쪽의 히스토그램, 계급의 크기가 지나치게 작음
plt.subplot(1, 2, 2) #1개의 행, 2개의 열, subplot 2
bins = np.arange(0, pokemon['speed'].max()+1/4, 1/4)
plt.hist(data = pokemon, x='speed', bins=bins);

 

4. seaborn으로 hue인수를 사용해서 여러 변수 나타내기

  • 하나의 히스토그램에서 x, y, 다이아몬드 크기(mm)를 모두 나타내는 방법을 알아보겠습니다.
  • pandas.Dataframe.melt() 메서드를 사용해 주어진 DataFrame을 unpivoting하여 넓은 형식에서 긴 형식으로 바꾸되, 식별자로 사용할 열을 지정합니다.
DataFrame.melt(id_vars, value_vars, var_name, value_name, col_level, ignore_index)
  • in_var : 식별자 변수를 사용할 열을 나타내는 튜플
  • value_vars : unpivoting할 열들을 나타내는 튜플 (원본을 유지하면서 재배치)
  • var_name : 새로운 열의 이름
  • value_name : unpivoting 할 열들의 '값'에 대해 지정할 이름 
df = df[df['y'] < 11.] #이상치 제거
df['index'] = df.index
df_long = df.melt(id_vars=['index'], value_vars=['x', 'y'], var_name=['dimension'], value_name='size')
print(df_long.shape)
df_long.head(10)

sns.histplot(data=df_long, x='size', hue='dimension', bins=61, element='step');

  • 'hue'매개변수를 사용하면 서로 다른 분포를 겹쳐서 나타낼 수 있습니다.
  • 'step' 요소로 계급의 경계를 나타내는 선을 제거하여 이미지를 깔끔하게 나타낼 수 있습니다.
728x90
반응형