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

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

Seaborn은 matplotlib을 기반으로 다양한 색상 테마와 통계용 챠트 등의 기능을 추가한 시각화 패키지이다. 당연히 matplotlib 패키지에 의존하며 통계 기능의 경우에는 statsmodels 패키지에 의존한다. Seaborn에 대한 자세한 내용은 다음 웹사이트를 참조한다.

스타일

seaborn을 임포트하게 되면 바탕화면, axis, 색상 팔레트 등을 matplotlib에서 제공하는 기본 스타일이 아닌 Seaborn에서 지정한 디폴트 스타일 집합으로 변경한다. 따라서 동일한 matplotlib 명령을 수행해도 Seaborn을 임포트 한 것과 하지 않은 플롯은 모양이 다르다.

set 명령으로 스타일을, set_color_codes 명령으로는 기본 색상을 변경한다.

In:
import seaborn as sns
sns.set()
sns.set_color_codes()

1차원 분포 플롯

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

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

In:
iris = sns.load_dataset("iris")
titanic = sns.load_dataset("titanic")
tips = sns.load_dataset("tips")
flights = sns.load_dataset("flights")

실수 분포 플롯

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

  • rugplot
  • kdeplot
  • distplot
  • jointplot
  • pairplot

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

In:
np.random.seed(0)
x = np.random.randn(100)
In:
sns.rugplot(x)
plt.show()

커널 밀도(kernel density)는 커널이라고 하는 단위 플롯을 겹치는 방법으로 히스토그램보다 부드러운 형태의 분포 곡선을 보여준다. 커널 밀도 추정에 대한 자세한 내용은 scikit-learn 패키지를 참조한다.

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

seaborn의 distplot 명령은 matplotlib의 히스토그램 명령을 대체하여 많이 쓰인다. 러그와 커널 밀도 표시 기능도 가지고 있다.

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

카운트 플롯

countplot 명령으로 각 카테고리별 데이터 값을 셀 수 있다.

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 명령은 스캐터 플롯뿐 아니라 각 변수의 히스토그램도 동시에 그린다.

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

또한 인수를 바꾸면 커널 밀도의 형태로도 표시할 수 있다.

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

다차원 실수형 데이터

만약 3차원 이상의 데이터라면 seaborn 패키지의 pairplot 명령을 사용한다. pairplot은 그리도(grid) 형태로 각 집합의 조합에 대해 히스토그램과 스캐터 플롯을 그린다.

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

만약 카테고리형 데이터가 섞여 있다면 hue 인수를 이용하여 카테고리 별로 색상을 다르게 할 수 있다.

In:
sns.pairplot(iris, hue="species", markers=["o", "s", "D"])
plt.show()