Coding Diary.

(데이터 분석) seaborn, matplotlib에서 축의 scale(척도) 변환하기 본문

Coding/Data analysis

(데이터 분석) seaborn, matplotlib에서 축의 scale(척도) 변환하기

life-of-nomad 2024. 5. 25. 14:57
728x90
반응형
지난 글에서 설명한 축(axis)범위 변경에 이어 축의 척도(scale) 변환하는 방법에 대해 알아보겠습니다.

 

🔻seaborn, matplotlib 축 변환하기🔻

 

(데이터분석) seaborn, matplotlib으로 axis(축) 범위 변경

지난 글에 이어 seaborn과 matplotlib에서axis(축) 범위를 변경하는 방법과 outlier(이상치)의 존재여부를 알아보겠습니다. 🔻seaborn, matplolib 히스토그램 작성법🔻 (데이터분석) seaborn과 matplotlib으로

life-of-nomad.tistory.com

 

1. Scales and Transformations

  • 먼저, 필요한 라이브러리와 데이터세트를 불러옵니다.
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)

  • 가격 분포를 보면 비대칭적이라는 것을 알 수 있습니다.
bins = np.arange(0, df['price'].max()+100, 100)
sns.histplot(data=df, x='price', bins=bins);

  • 여기서 가격의 분포는 십진법이 아니라 로그 척도를 따를지도 모른다는 추측을 해볼 수 있습니다.
  • 따라서 축을 로그에 맞게 변환해보겠습니다.

 

2. Transforming an axis

  • 이를 위해 plt.xscale 함수를 사용하겠습니다.
  • 이 함수는 log나 symlog 등의 문자열을 인수로 갖습니다.
  • 이 히스토그램에 대해서는 x축 객체를 가져온 다음 set_xscale 함수를 사용하겠습니다.
ax = sns.histplot(data=df, x='price', bins=bins);
ax.set_xscale('log')

  • x축의 범위는 그대로지만 척도가 바뀌었기 때문에 이상한 모양의 차트를 나타냅니다. 
  • 차트를 해석하기에 적합한 형태로 바꾸려면 축 범위를 수정하고 눈금도 그에 맞게 바꾸어야 합니다.

3. Transforming bins and axes

  • 먼저, 계급의 범위부터 확인해보겠습니다.
  • price열에 대해 .describe 함수를 적용해 보면 가격의 최소값은 300달러 정도, 최댓값은 20000달러인 것을 알 수 있습니다. 
df['price'].describe()

  • 가격이 로그 척도를 따른다는 가정을 확인하기 위해서는 이 값의 로그값을 확인해봐야합니다.
  • 이때, numpy를 사용하면 가격의 로그값이 반환됩니다.
np.log10(df['price'].describe(), )

  • 최소값은 2.5이고 최대값은 4.5 정도 인 것을 알 수 있습니다.
  • 이것을 통해 계급의 범위를 알 수 있습니다.
  • 계급 범위를 2와 5사이에 있는 10의 거듭제곱으로 설정하면 계급의 크기가 일정하게 나타날 것입니다.
bins = 10 ** np.arange(2, 5+0.1, 0.1)

sns.histplot(data=df, x='price', bins=bins);
plt.xscale('log')

  • 좀 더 나아졌지만, 눈금을 제대로 읽거나 해석할 수 없습니다.
  • 10의 거듭제곱으로 척도를 변환하면서 눈금의 간격이 불균일한 간격으로 분포하게 되었습니다.
  • 따라서 기존의 눈금을 명시적으로 표시하되, 다른 눈금을 추가해야합니다.
  • 10의 거듭제곱을 로그 척도로 나타낼 때, 인접한 정수 거듭제곱 두 개 가운데 쯤에 3이 존재해야 합니다. 
  • 이 점을 활용해서 눈금을 표시하겠습니다.
  • 이 경우 x축에 나타내야 하는 눈금은 100(10^2), 300, 1000(10^3), 3000, 10000(10^4), 30000입니다.
#Get the ticks for bins between [0 - maximum weight]
bins = 10 ** np.arange(2, 5+0.1, 0.1)

#Generate the x-ticks you want to apply
ticks = [100, 300, 1000, 3000, 10000, 30000]

#문자열로 변환해서 레이블의 리스트 만들기
labels = [f'{v}' for v in ticks]

#히스토그램 작성
sns.hisplot(data=df, x='price', bins=bins);

plt.xscale('log')

#x축 눈금 적용
plt.xticks(ticks, labels);

  • 훨씬 나아졌습니다.
  • 순서 주의 : x축의 눈금을 추가 한 후에 축의 척도를 변환하면 눈금을 덮어쓰게 됩니다
728x90
반응형