작성자: admin 작성일시: 2016-05-16 12:05:50 조회수: 5462 다운로드: 223
카테고리: Python 태그목록:

Seaborn을 사용한 데이터 분포 시각화

Seaborn은 Matplotlib을 기반으로 다양한 색상 테마와 통계용 챠트 등의 기능을 추가한 시각화 패키지이다. 기본적인 시각화 기능은 Matplotlib 패키지에 의존하며 통계 기능은 Statsmodels 패키지에 의존한다. Seaborn에 대한 자세한 내용은 다음 웹사이트를 참조한다.

스타일

Seaborn을 임포트하면 색상 등을 Matplotlib에서 제공하는 기본 스타일이 아닌 Seaborn에서 지정한 기본 스타일로 바꾼다. 따라서 동일한 Matplotlib 명령을 수행해도 Seaborn을 임포트 한 것과 하지 않은 플롯은 모양이 다르다. 자세한 내용은 다음 문서를 참조한다.

set 명령으로 색상, 틱 스타일 등 전반적인 플롯 스타일을 Seaborn 기본 스타일로 바꾼다. set_style 명령은 틱 스타일만 바꿀 수 있다. darkgrid, whitegrid, dark, white, 그리고 ticks 스타일을 제공한다.

set_color_codes 명령으로는 기본 색상을 가리키는 문자열을 바꾼다. 예를 들어 set_color_codes 명령이 적용되기 이전과 이후에 red 문자열이 가리키는 실제 색상 코드는 다르다.

In:
import seaborn as sns
sns.set()
sns.set_style('whitegrid')
sns.set_color_codes()

색상 팔렛트

Seaborn은 스타일 지정을 위한 색상 팔렛트(color palette)라는 것을 지원한다. 색상 팔렛트는 Matplotlib의 칼라맵(colormap)으로 사용할 수도 있다. 자세한 내용은 Seaborn의 문서를 참조한다.

In:
current_palette = sns.color_palette()
sns.palplot(current_palette)
In:
sns.palplot(sns.color_palette("Blues"))
In:
sns.palplot(sns.dark_palette("muted purple", input="xkcd"))

1차원 분포 플롯

1차원 데이터는 실수 값이면 히스토그램과 같은 실수 분포 플롯으로 나타내고 카테고리 값이면 카운트 플롯으로 나타낸다.

우선 연습을 위한 샘플 데이터를 로드한다.

In:
iris = sns.load_dataset("iris")    # 붓꽃 데이터
titanic = sns.load_dataset("titanic")    # 타이타닉호 데이터
tips = sns.load_dataset("tips")    # 팁 데이터
flights = sns.load_dataset("flights")    # 여객운송 데이터

1차원 실수 분포 플롯

실수 분포 플롯은 자료의 분포를 묘사하기 위한 것으로 Matplotlib의 단순한 히스토그램과 달리 커널 밀도(kernel density) 및 러그(rug) 표시 기능 및 다차원 복합 분포 기능 등을 제공한다. 1차원 실수 분포 플롯 명령에는 rugplot, rugplot, rugplot이 있다.

러그(rug) 플롯은 데이터 위치를 x축 위에 작은 선분(rug)으로 나타내어 실제 데이터들의 위치를 보여준다.

In:
x = iris.petal_length.values
In:
sns.rugplot(x)
plt.show()

커널 밀도(kernel density)는 커널이라는 함수를 겹치는 방법으로 히스토그램보다 부드러운 형태의 분포 곡선을 보여주는 방법이다.

커널 밀도 추정에 대한 자세한 내용은 scikit-learn 패키지를 참조한다.

In:
sns.kdeplot(x)
plt.show()

Seaborn의 distplot 명령은 러그와 커널 밀도 표시 기능이 있어서 Matplotlib의 hist 명령보다 많이 사용된다.

In:
sns.distplot(x, kde=True, rug=True)
plt.show()

카운트 플롯

countplot 명령을 사용하면 각 카테고리 값별로 데이터가 얼마나 있는지 표시할 수 있다.

countplot 명령은 데이터프레임에만 사용할 수 있다. 사용 방법은 다음과 같다.

countplot(x="column_name", data=dataframe)

data 인수에는 대상이 되는 데이터프레임을, x 인수에는 데이터프레임의 열 이름 문자열을 넣는다.

In:
sns.countplot(x="class", data=titanic)
plt.show()
In:
sns.countplot(x="day", data=tips)
plt.show()

다차원 데이터

데이터 변수가 여러개인 다차원 데이터는 데이터의 종류에 따라 다음과 같은 경우가 있을 수 있다.

  • 분석하고자 하는 데이터가 모두 실수 값인 경우
  • 분석하고자 하는 데이터가 모두 카테고리 값인 경우
  • 분석하고자 하는 데이터가 모두 실수 값과 카테고리 값이 섞여 있는 경우

2차원 실수형 데이터

만약 데이터가 2차원이고 모두 연속적인 실수값이라면 스캐터 플롯(scatter plot)을 사용하면 된다. 스캐터 플롯을 그리기 위해서는 Seaborn 패키지의 jointplot 명령을 사용한다. jointplot 명령은 스캐터 플롯뿐 아니라 차트의 가장자리(margin)에 각 변수의 히스토그램도 그린다.

jointplot 명령도 데이터프레임에만 사용할 수 있다. 사용 방법은 다음과 같다.

jointplot(x="x_name", y="y_name", data=dataframe, kind='scatter')

data 인수에는 대상이 되는 데이터프레임을, x 인수에는 x 변수가 될 데이터프레임의 열 이름 문자열을, y 인수에는 y 변수가 될 데이터프레임의 열 이름 문자열을 넣는다. kind는 차트의 종류를 지정한다. kind='scatter'이면 스캐터 플롯이다.

In:
sns.jointplot(x="sepal_length", y="sepal_width", data=iris)
plt.show()

kind='kde'이면 커널 밀도 히스토그램을 그린다.

In:
sns.jointplot(x="sepal_length", y="sepal_width", data=iris, kind="kde")
plt.show()

다차원 실수형 데이터

만약 3차원 이상의 데이터라면 seaborn 패키지의 pairplot 명령을 사용한다. pairplot은 데이터프레임을 인수로 받아 그리드(grid) 형태로 각 데이터 열의 조합에 대해 스캐터 플롯을 그린다. 같은 데이터가 만나는 대각선 영역에는 해당 데이터의 히스토그램을 그린다.

In:
sns.pairplot(iris)
plt.show()