Python

[seaborn] 데이터 시각화(+matplotlib)

jsys 2024. 1. 8. 18:07

 

- seaborn : 데이터 시각화를 위한 Python 라이브러리 중 하나

  * seaborn 튜토리얼 링크 : https://seaborn.pydata.org/tutorial.html

 

User guide and tutorial — seaborn 0.13.1 documentation

 

seaborn.pydata.org

 

 

 

- 필요한 라이브러리 불러오기

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

 

 

 

 

 

- savefig() : 이미지 파일 추가

tips = sns.load_dataset("tips")

fig, ax = plt.subplots()
sns.scatterplot(x = 'total_bill', y = 'tip', data = tips)
plt.savefig("output/result.png")  # output 폴더 생성 후 이미지 파일 추가
plt.show()

 

>> output 폴더에 result라는 차트 이미지 파일이 생긴 것을 확인할 수 있다.

 

 

* 주의

tips = sns.load_dataset("tips")

fig, ax = plt.subplots()
sns.scatterplot(x = 'total_bill', y = 'tip', data = tips)
plt.show()
plt.savefig("output/result.png")  # 순서가 바뀌면 이미지가 나오지 않는다
# plt.show()를 실행하면 정보를 밖으로 내보내고 초기화시키기 때문에 이후 savefig()를 쓰면 백지가 나오는 것
# 즉 plt.show()는 마지막에 쓴다

 

 

 

 

 

- hue : 범례 생성

fig, ax = plt.subplots()
sns.scatterplot(x = 'total_bill', y = 'tip', hue = 'sex', data = tips)
# data = tips : pandas 데이터프레임 받음
# x : '컬럼명', y = '컬럼명', hue = '컬럼명'
# hue : 범례 생성
plt.savefig("output/result.png") 
plt.show()

# out :

 

 

 

 

- ax : seaborn과 matplotlib 두 라이브러리를 연결시키는 매개변수

     * 다중차트 그릴 때 중요

fig, ax = plt.subplots()
ax.plot([1,2,3,4,5,6,7]) # matplotlib 시각화
sns.scatterplot(x = 'total_bill', y = 'tip', hue = 'sex', ax = ax, data = tips)
# ax를 통해 두 차트가 연동됨!
plt.savefig("output/result.png") 
plt.show()

# out :

 

 

 

 

- matplotlib과 seaborn을 동시에 사용한 subplotting 기법

     * 다중차트를 하나의 도화지에 담는 것

fig, ax = plt.subplots()

plt.show()   # 기본 틀

>> 늘 이 형식의 기본 틀을 기억하기

# out :

 

fig, ax = plt.subplots(nrows = 1, ncols = 2)

ax[0].set_title("ax.[0] title") # 첫 번째 차트에 제목 생성
ax[0].plot([1,2,3]) # 첫 번째 차트 생성

ax[1].set_title("ax.[1] title")  # 두 번째 차트에 제목 생성
sns.scatterplot(x = 'total_bill', y = 'tip', hue = 'sex', ax = ax[1], data = tips)  # 두 번째 차트 생성

# plt.title("plt.title") # 한 쪽 차트에만 들어감. 쓸 수 X
fig.suptitle("fig title")  # 가운데에 제목 생성

plt.show()

# out :

>> plt(matplotlib)과 sns(seaborn)을 이용하여 위 차트가 생성되었다.

 

 

# 중고급 레벨일 때 참고 링크 : https://matplotlib.org/stable/users/explain/axes/arranging_axes.html

 

Arranging multiple Axes in a Figure — Matplotlib 3.8.2 documentation

Arranging multiple Axes in a Figure Often more than one Axes is wanted on a figure at a time, usually organized into a regular grid. Matplotlib has a variety of tools for working with grids of Axes that have evolved over the history of the library. Here we

matplotlib.org

 

 

 

 

- 2*2 배열 차트일 때는 (0,0)(0,1)(1,0)(1,1) 형식!

fig, ax = plt.subplots(nrows = 2, ncols = 2)


ax[0, 0].set_title("ax.[0] title") 
ax[0, 0].plot([1,2,3]) 

ax[1, 1].set_title("ax.[1] title")  
sns.scatterplot(x = 'total_bill', y = 'tip', hue = 'sex', ax = ax[1, 1], data = tips) 
# seaborn에 ax를 꼭 지정해주어야 matplotlib과 연결 가능!!


fig.suptitle("fig title")  
plt.tight_layout()  # 타이트한 차트의 간격이 벌어짐
plt.show()

# out :

>> ax[0,0] 위치 지정으로 왼쪽 첫 번째 차트를 생성했고, ax[1,1]로 오른쪽 두 번째 차트를 생성했다.

 

 

 

 

- 산점도 그래프(scatter plot)

 

* x축과 y축 데이터 형태가 연속형 데이터여야 함
* 연속형 데이터의 예시 : 키, 몸무게 등 소수점이 존재하는 데이터

fig, ax=plt.subplots(1, 2, figsize=(15, 5))

sns.regplot(x="total_bill", y="tip", data=tips, ax=ax[0], fit_reg=True)
ax[0].set_title('with linear regression line')  # 회귀선 + 산점도

sns.regplot(x="total_bill", y="tip", data=tips, ax=ax[1], fit_reg=False)
ax[1].set_title('without linear regression line')  # 산점도만

plt.show()


# tip, total_bill : 연속형 변수 -> 회귀 작성 가능

# out :

>> 연속형 변수인 tip과 total_bill을 통해 위와 같은 산점도 그래프를 생성했다.

 

* sns.regplot() : scatter plot을 그릴 때 추가로 선형 회귀 선을 함께 표시해주는 기능을 제공.  regplot은 scatter plot에 선형 회귀 모델의 추세선을 추가하여 데이터의 경향을 보여줌

 

 

연속형 변수가 아닌 것으로 산점도 그래프를 만들면 아래와 같은 그래프가 생성된다.

fig, ax = plt.subplots()

sns.regplot(x="day", y="tip", data = tips, ax=ax, fit_reg=False)
ax.set_title('without linear regression line')
plt.show()

# 연속형 변수가 아닌 day를 넣음

# out :

 

 

 

 

- hisplot : 히스토그램 그래프를 그리는 함수

 

* 데이터의 빈도를 나타낼 때 주로 사용. 히스토그램은 연속적인 데이터의 분포를 시각적으로 표현하는 데에 유용함

fig, ax = plt.subplots()
sns.histplot(x = 'tip', ax = ax, data = tips)
plt.show()

# out :

* hisplot과 displot의 차이

1) 히스토그램 구성 방식:
- histplot: 주로 하나의 변수에 대한 히스토그램을 그리는 데 사용. 형식 : sns.histplot(data, x="variable")
- displot: 주로 하나 이상의 변수에 대한 히스토그램을 그리거나, 커널 밀도 추정(KDE)과 함께 히스토그램을 표시할 때 사용. 다양한 변수에 대한 분포를 비교하거나 다양한 시각화 옵션을 지원. 형식 : sns.displot(data, x="variable")

 

2) 함수 인터페이스:
- histplot: 함수의 이름 그대로 주어진 데이터에 대한 히스토그램을 그리는 데 중점을 둠
- displot: 더 범용적이며, 여러 종류의 플롯을 그릴 수 있는 kind 매개변수를 사용하여 히스토그램 외에도 커널 밀도 추정(KDE), 러그 플롯 등 다양한 플롯을 생성할 수 있다.

 

 

 

 

- boxplot : 데이터의 분포와 이상치(outlier)를 동시에 보여주는 시각화 기법

fig, ax = plt.subplots(nrows = 1, ncols = 2)

sns.boxplot(x = 'sex', y = 'tip', ax = ax[0], data = tips)
sns.scatterplot(x = 'total_bill', y = 'tip', hue = 'sex', ax = ax[1], data = tips)

plt.show()

# out :

>> 왼쪽 차트가 박스 플롯인데, 데이터의 중앙값, 사분위수, 이상치 등을 보여준다. 특정 데이터의 전체적 분포와 경향을 확인하기 좋은 기법이다.

 

 

 

 

- countplot : 범주형 속성을 지닌 데이터들의 히스토그램을 보여주는 기법(막대 그래프)

sns.countplot(x = 'day', data = tips)
plt.show()

# out :

 

 

여기서 value_counts()를 사용하면 차트를 순서대로 만들 수 있다.

  * value_counts() : pandas에서 사용하는 것으로, 주어진 Series에서 각 고유한 값을 계산하여 시리즈로 반환. 

sns.countplot(x = 'day', data = tips, order = tips['day'].value_counts().index)
plt.show()

# out: