Seaborn
- matplotlib을 기반으로 다양한 테마와 그래프를 제공하는 파이썬 시각화 패키지.-
- http://seaborn.pydata.org/
- 공식 사이트의 gallary에 제공하는 다양한 그래프와 예제를 확인 할 수 있다.
- 설치: 아나콘다에는 포함되있다.
pip install seaborn
conda install seaborn
데이터셋 준비 (tips.csv)
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
tips = pd.read_csv('data/tips.csv')
tips.shape
warning이 자주 떠서 보기가 싫다면 아래 코드 실행
# warnings 무시
import warnings
warnings.filterwarnings(action = 'ignore')
1. rugplot, kdeplot, displot
- 1차원 연속형 값들의 분포를 시각화 하는 그래프
- 1.1.1. rugplot
- 각 데이터들의 위치를 보여준다.
sns.rugplot(x = 'total_bill', data = tips) # 값(x)='컬럼명', data=DataFrame
plt.title('Total hill의 rugplot')
- 1.1.2. kdeplot
- 히스토그램을 부드러운 곡선 형태로 표현한다.
- KDE(Kernel Density Estimation) : 확률밀도추정
sns.kdeplot(data = tips, x='total_bill')
plt.show()
- 1.2. displot()
- 히스토그램을 기준으로 rugplot, kdeplot을 같이 그릴 수 있다.
sns.displot(data = tips
,x = 'total_bill'
,bins = 30
,rug=True
,kde=True
)
plt.show()
# tips.groupby('smoker')['total_bill']
sns.displot(x = 'total_bill', hue = 'smoker', bins = 30, data = tips)
# tips 데이터프레임의 total_bill 컬럼의 히스토그램을 smoker 컬럼의 값별로 다른색으로 그린다.
- boxplot(), violinplot(), swamplot()
- 연속형 데이터(양적데이터)들의 분포를 확인하는 그래프를 그린다.
- 범주별로 연속형 데이터의 분포를 비교할 수 있다.
- 1.3.1. boxplot
plt.figure(figsize = (15, 7))
plt.subplot(1, 2, 1)
sns.boxplot(data = tips
,x = 'tip'
)
plt.title('값을 x축에 위치')
plt.subplot(1, 2, 2)
sns.boxplot(data = tips
,y = 'tip'
)
plt.title('값을 y축에 위치')
plt.show()
범주형 컬럼 smoker를 Yes인 값과 No인 값으로 나누고 성별 남과 여인 값으로 나눠서 total_bill을 확인
1차 : smoker로 나눈다, 2차 : sex로 나눈다. -> boxplot을 그린다.
fig = plt.figure(figsize = (10, 4))
ax1 = fig.add_subplot(1, 2, 1)
sns.boxplot(data = tips
,x = 'total_bill'
,y = 'smoker'
,ax = ax1 # ax = ax1 : 그래프를 그릴 axes(subplot) 객체를 지정
)
ax2 = fig.add_subplot(1, 2, 2)
# 흡연 여부로 분리 -> 성별로 분리 : 4가지로 분리된다.
sns.boxplot(data = tips
,y = 'total_bill' # 그래프를 그릴 연속형 컬럼을 y축으로 지정
,x = 'smoker' # 나눠서 그릴 범주형 컬럼을 x축으로 지정 -> 값이 yes인 것과 no인 것으로 나눠서 그린다.
,hue = 'sex' # 성별에 따라서 다시 나눈다.
,whis = 3 # 정상범위 밖의 값을 계산할 때 사용하는 whis값 설정.(기본 : 1.5)
,ax = ax2
)
plt.legend(bbox_to_anchor = (1, 1), loc = 'upper left')
plt.show()
- 1.3.2. violin plot
- boxplot 위에 분포 밀도(kernel density)를 좌우 대칭으로 덮어쓰는 방식으로 데이터의 분포를 표현하므로 boxplot 보다 좀더 정확한 데이터의 분포를 볼 수 있다.
- 매개변수는 boxplot과 동일
plt.figure(figsize=(13, 5))
plt.subplot(1, 2 ,1)
sns.violinplot(data = tips
,x = 'tip'
)
plt.subplot(1, 2, 2)
sns.violinplot(data = tips
,y = 'tip'
,x = 'smoker'
,hue = "day"
)
plt.legend(bbox_to_anchor=(1,1), loc='upper left')
plt.show()
- 1.3.3. swarmplot
- 실제 값들을 점으로 찍어 준다.
- boxplot이나 violin plot의 보안해주는 역할로 쓰인다.
- swarmplot은 가운데 분류를 기준으로 분포시키는데 실제 값이 있는 위치에 점을 찍으므로 좀더 정확하게 값이 어디에 있는지 알 수 있다.
plt.subplot(1, 2, 1)
sns.swarmplot(data = tips
,x = 'tip'
)
plt.subplot(1, 2, 2)
sns.swarmplot(data = tips
,y = 'tip'
)
plt.show()
sns.boxplot(data = tips
,y = 'tip'
)
sns.swarmplot(data = tips
,y = 'tip'
,color = 'black'
,alpha = 0.5
)
plt.show()
- 1.3.4. countplot()
- 막대그래프(bar plot)을 그리는 함수
- 범주형 변수의 고유값의 개수를 표시
- matplotlib의 bar()
v = tips.smoker.value_counts() # 직접 수량을 세서 그린다.
plt.bar(v.index, v)
v.plot(kind = 'bar')
plt.figure(figsize = (10, 10))
plt.subplot(1, 2, 1)
# x축에 지정 -> 수직막대그래프
sns.countplot(data = tips
,x = 'day' # 범주형 컬럼을 지정 -> 범주값(고유값) 별로 개수를 세서 막대그래프를 그린다.
)
# y축에 지정 -> 수평 막대 그래프
plt.subplot(1, 2, 2)
sns.countplot(data = tips
,y = 'day'
)
plt.tight_layout()
plt.show()
dodge = True(default값), False -> 누적막대그래프로 변환
sns.countplot(data = tips
,x = 'day'
,hue = 'smoker' # hue에 지정한 컬럼의 값 별로 나눠서 그린다.
,dodge = False # dodge = False -> 누적막대그래프로 변환
,alpha = 0.5
)
plt.show()
- scatterplot, lmplot, jointplot, pairplot
- 산점도를 그린다.
- 1.4.1. scatterplot
- 팔레트 - https://seaborn.pydata.org/tutorial/color_palettes.html#palette-tutorial
팔레트 설정 및 색 순서 조회
# 팔레트 설정 -> 프로그램 시작부분에서 설정
sns.set_palette('Set1')
# 현재 팔레트의 색 순서 -> color brewer 로 검색
sns.color_palette()
scatterplot 그리기
sns.scatterplot(data = tips
,x = 'total_bill'
,y = 'tip'
)
plt.show()
hue = '컬럼명' -> 컬럼명 기준으로 나눠서 그린다.
sns.scatterplot(data = tips
,x = 'total_bill'
,y = 'tip'
,hue = 'smoker' # somker 컬럼 기준으로 나눠서 그린다.
,palette = 'pastel' # 이 그래프에서 사용할 palette를 지정
)
plt.show()
- 1.4.2. lmplot()
- 선형회귀 적합선을 포함한 산점도를 그린다.
# 상관계수 확인
tips[['total_bill', 'tip']].corr()
lmplot : 그림의 선은 회귀선을 의미한다. 선의 배경색으로 칠해져 있는 부분도 맞는 범위이다.
sns.lmplot(data = tips
,x = 'total_bill'
,y = 'tip'
)
plt.show()
hue로 smoker 컬럼의 값을 기준으로 나누어서 두 개의 회귀선을 그린다.
sns.lmplot(data = tips
,x = 'total_bill'
,y = 'tip'
,hue = 'smoker'
)
plt.show()
- 1.4.3. jointplot()
- scatter plot 과 각 변수의 히스토그램을 같이 그린다.
- pandas DataFrame만 사용할 수 있다.
- DataFrame
컬럼 개별적인 분포(히스토그램)를 확인할 수 있다.
sns.jointplot(data = tips
,x = 'total_bill'
,y = 'tip'
)
plt.show()
hue로 나눌 경우 개별적인 분포(히스토그램이) kdeplot으로 바뀐다.
# hue로 나눠서 그릴 경우 히스토그램이 kdeplot으로 변경된다.
sns.jointplot(data = tips
,x = 'total_bill'
,y = 'tip'
,hue = 'smoker'
)
plt.show()
- 1.4.4. pairplot
- 다변수(다차원) 데이터들 간의 산점도를 보여준다.
- 데이터프레임을 인수로 받아 그리드(grid) 형태로 각 변수간의 산점도를 그린다. 같은 변수가 만나는 대각선 영역에는 해당 데이터의 히스토그램을 그린다.
# 같은 컬럼에 대한 경우 히스토그램, 다른 컬럼에 대한 경우 산점도
sns.pairplot(tips) # dataframe을 전달. 각 컬럼(변수) 끼리의 산점도를 그림
plt.show()
- 1.4.5. heatmap()
- 값들에 비례해서 색깔을 다르게 해 2차원 자료로 시각화
diamonds.csv 파일의 연속형 값들의 관계의 상관계수 확인
dia = pd.read_csv('data/diamonds.csv')
cor = dia.corr(numeric_only = True)
cor
cor값을 히트맵으로 표현
# 2차원 데이터셋 (DataFrame)
sns.heatmap(cor
,annot = True # 히트맵 각각의 값 확인
,cmap = 'Blues'
)
plt.show()
- 1.4.6. lineplot
- 선그래프
- 시간의 흐름에 따른 값의 변화를 보여주는데 유용하다. (시계열 데이터)
데이터셋 준비
# 계절을 인덱스로 빼고 행과 열 뒤바꿈
df = pd.read_excel('data/강수량.xlsx')
df.set_index('계절', inplace = True)
df = df.T
df
plot()에 label 선언하지 않고 legend()에서 각각의 그래프 이름 부여
sns.lineplot(data = df
,x = df.index
,y = '봄'
)
sns.lineplot(data = df
,x = df.index
,y = '겨울'
)
plt.ylabel('강수량')
plt.legend(['봄', '겨울'], title = '강수량')
plt.show()
모든 컬럼에 대한 lineplot() 그리기
plt.figure(figsize = (10, 3))
sns.lineplot(data = df)
# index : x축, y : 컬럼별로 선그래프를 그림.
plt.legend(bbox_to_anchor = (1, 1), loc = 'upper left')
plt.show()
'Data_Analysis_Track_33 > Python' 카테고리의 다른 글
| Python_numpy_02(인덱싱과 슬라이싱을 이용한 배열의 원소 조회 및 변경) (2) | 2023.10.04 |
|---|---|
| Python_numpy_01(Numpy개요, 배열생성) (1) | 2023.10.04 |
| Python_matplotlib_04(Pandas 시각화) (0) | 2023.09.22 |
| Python_matplotlib_03(각종 그래프 그리기) (0) | 2023.09.21 |
| Python_matplotlib_02(각종 그래프 그리기) (0) | 2023.09.21 |