반응형
250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- HTML
- 결정트리
- 영국석사
- 코딩
- 데이터분석
- for반복문
- 다항회귀
- numpy
- 선형회귀
- sql연습문제
- SQL
- 코드잇TIL
- matplotlib
- 런던
- 나혼자코딩
- CSS
- 머신러닝
- Seaborn
- 행렬
- 로지스틱회귀
- 경사하강법
- 코딩독학
- 윈도우함수
- 유학생
- 오늘도코드잇
- 코딩공부
- 코드잇
- 파이썬
- 판다스
- 코드잇 TIL
Archives
- Today
- Total
영국 척척석사 유학생 일기장👩🏻🎓
(데이터 분석) seaborn, matplotlib에서 축의 scale(척도) 변환하기 본문
코딩공부/Data analysis
(데이터 분석) seaborn, matplotlib에서 축의 scale(척도) 변환하기
life-of-nomad 2024. 5. 25. 14:57728x90
반응형
지난 글에서 설명한 축(axis)범위 변경에 이어 축의 척도(scale) 변환하는 방법에 대해 알아보겠습니다.
🔻seaborn, matplotlib 축 변환하기🔻
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
반응형
'코딩공부 > Data analysis' 카테고리의 다른 글
(데이터분석) seaborn의 투명도, 지터링으로 산점도 과다중첩 해결하기 (0) | 2024.05.27 |
---|---|
(데이터분석) 산점도(scatterplots) 개념 및 matplotlib, seaborn으로 그리기 (0) | 2024.05.26 |
(데이터분석) seaborn, matplotlib으로 axis(축) 범위 변경 (0) | 2024.05.25 |
(데이터분석) 불연속 데이터에서의 히스토그램, 막대그래프 나타내기 (0) | 2024.05.25 |
(데이터분석) matplotlib의 figure, axes, subplots의 개념 (0) | 2024.05.25 |