Statistical analysis(통계적 분석)은 데이터 셋의 변수가 서로 어떤 연관이 있는지 그리고 
다른 변수에 어떻게 영향을 받는지 이해하는 과정이다. 이 과정에서 시각화는 핵심 요소가 될 수 있다.
왜냐하면 시각화를 잘 했다면 한눈에 두 변수에 따른 변화,패턴을 쉽게 찾을 수 있기 때문이다.

이 글에서는 변수간의 상관관계를 찾기 위해 시각화 라이브러리 중 하나인
Seaborn의 relplot(), scatterplot(), lineplot() 3가지 함수를 다룰 것이다.

 scatterplot()는 산점도를 lineplot()은 선 그래프를 그려준다. relplot()은 쉽게 설명하면
scatterplot(), lineplot()의 상위 개념 즉 두 함수를 모두 포함하고 있다고 생각하면 된다.
일단 먼저 scatterplot()과 lineplot()에 대해 자세히 설명한 후에 relplot()을 다루겠다.

이 글은 seaborn 공식 홈페이지의 튜토리얼을 참고하여 작성했다.
https://seaborn.pydata.org/tutorial.html  ->공식 홈페이지 

Scatter plot

일단 주요 모듈을 import 했다.

 산점도를 그리기 위해 Seaborn에 내장되어 있는 샘플 데이터를 불러왔다.
tips 데이터는 손님들의 성별(sex), 흡연 유무(smoker), 요일(day), 시간(time), 규모(size), 식사 비용(total_bill), 팁(tip)을 기록한 데이터 셋이다. 


 sns.scatterplot()을 이용해 상당히 간단하게 산점도를 그릴 수 있다.
x축은 total_bill, y축은 tip 으로 설정했다.

Hue

 두가지 변수를 입력받아 점이 2차원 배열로 나타내어질 때 다른 변수에 따라 변수를 색칠하면서 한 가지 차원을 추가할 수 있다.
seaborn에서는 이것을 “hue semantic”라고 하는데 점이 색을 통해 의미를 얻기 때문이다. 사용법은 아래 코드와 같다.

만약 구분되는 값이 범주형이 아니라 실수형이라면 연속되는 색깔들 즉 sequential palette로 표현한다.

물론 palette를 이용해 원하는 sequential palette로 색을 바꿔줄수 있다.

아래 링크로 들어가면 color palettes를 만드는법,seaborn의 다양한 color palettes를 볼 수 있다.
https://seaborn.pydata.org/tutorial/color_palettes.html

Style

구분된 각 클래스 사이의 차이를 강조하기 위해 style을 이용해 marker를 클래스 별로 설정해줄 수 있다.

 다음과 같이 hue와 style 값을 다르게 주면서 좀 더 여러가지 클래스로 구분해서 나타낼 수 도 있다. 그러나 사람의 눈은 색깔보다 모양에 훨씬 더 민감하므로 주의해야 한다.  아래 코드는 8가지로 구분해서 나타낸 모습이다.

seaborn은 matplotlib 기반이기 때문에 matplotlib때 처럼 다음과 같이 직접 marker의 모양을 정해 줄 수 있다.

Size

size는 클래스 별로 marker의 크기를 정해준다.

 다음과 같이 실수형 변수가 아닌 범주형 값이 들어와도 size를 통해 marker의 크기를 정해줄 수 있다.

 matplotleb와 달리 변수의 리터럴 값은 점의 영역을 선택하는 데 사용되지 않는다.
대신 seaborn에서는 데이터의 값이 marker의 영역 크기로 정규화 된다. 이때  sizes를 이용해 직접 범위를 지정해 줄 수 있다.

 물론 hue,style,size 3가지를 한 번에 사용하는 것도 가능하다. 그러나 3가지를 한 번에 쓰면 어떤 연관성이 있는지 한 번에 알아보기 힘드므로 추천하지는 않는다.

참고로 scatterplot()은 data frame의 변수명 대신 data vector를 통해 산점도를 만들 수 있다.

Line plot

 scatter plot도 매우 효과적인 그래프이지만 데이터 셋이 순차적,연속적이라면 scatter plot을 사용하기엔 별로일 것이다..
이때 line plot을 이용하면 상당히 효과적이다.

 line plot을 그리기 위해 임의로 시간에 따른 연속적인 값을 가지data frame을 만들었다. 아래 코드에서 cumsum() 함수는 지금까지 나온 값을 모두 누적해주는 함수이다.

 sns.lineplot()을 이용해 간단하게 선그래프를 그릴 수 있다.
x축은 time, y축은 value로 설정했다.

 seaborn 에서 lineplot()은 사용자가 y를 x의 대한 함수로 그린다고 가정하기 때문에 x값들을 자동으로 정렬한 후 그래프를 그린다. 이 기능은 비활성화할 수 있다.
 위에서 만든 데이터는 x값이 이미 정렬되어 있으므로 x값이 정렬되지 않은 데이터를 만들었다.

만약 정렬 기능을 비활성화한다면 같은 데이터임에도 불구하고 다른 그래프가 나온다.

x값이 정렬되지 않았기 때문에 난잡한 그래프가 그려진다.

추정 회귀선과 신뢰구간

 seaborn의 lineplot()의 큰 장점은 추정 회귀선(estminated line)과 신뢰구간 (confidence interval)을 그릴 수 있다는 것이다.
seaborn이 추정 회귀선과 신뢰구간을 그리는 default behavor는 다음과 같다.
 - 평균과 95% 신뢰 구간을 평균 주위에 표시하여 각 x 값에서 다중 측정값을 집계한다.

추정회귀선과 신뢰구간을 그리기 위해 seaborn의 내장된 fmri 데이터를 불러왔다.
fmri 데이터는 어떤 subject의 시점(timepoint), 활동 종류(event), 지역(region)에 따른 센서 값(signal)을 정리한 데이터이다.

만약 x축을 timepoint, y축을 signal로 한다면 하나의 x변수에 다양한 y값이 존재할 것이다. 한 번 x="timepoint", y="signal"으로 lineplot()을 실행해보자.

선이 추정 회귀선을 나타내고 선 주변에 있는 하늘색 면적이 신뢰구간을 의미한다.

신뢰 구간은 bootstrapping을 사용하여 계산되며, 대규모 데이터셋에 대해 시간이 많이 소요될 수 도 있으므로 ci=None을 이용해 비활성화시킬 수 있다.

ci를 이용해 신뢰구간의 범위를 정해 줄 수 있다.

만약 더 큰 데이터를 사용한다면 신뢰 구간 대신 표준 편차를 표시하여 각 시점에서 분포의 산포를 나타내는 것이 좋은 옵션일 것이다. 이때 ci="sd"를 이용해 표준편차를 나타낼 수 있다.

추정 회귀선도 estimator=None을 이용해 비활성화시킬 수 있다.

추정 회귀선을 비활성화하면 하나의 x변수에 y 값이 여러 개 이기 때문에
그래프가 위와 같이 나타난다.

 

Semantic mappings을 이용해 데이터의 하위 집합 그리기 

lineplot()은 scatterplot()에서 사용된 hue, style을 이용해 똑같이 변수를 받고 클래스를 구분한 후 각각의 추정 회귀선 신뢰구간을 그래프로 나타낼 수 있다.

먼저 hue를 이용해 변수에 따라 다른 색으로 표현할 수 있다

style을 이용해 변수에 따라 다른 선으로 표현할 수 있다.

hue와 stlye에 각각 다른 변수를 주어 더 많은 클래스로 구분할 수 있다.

makers=Ture를 이용해 marker를 표시할 수 있다.  

err_style을 통해 신뢰구간을 막대 형태로 나타낼 수 있다.

Unit을 이용해 각각의 subject를 모두 나타낼 수 있다. 이때 estimator=None을 무조건 입력해 줘야 한다.
아래는 모든 subject를 나타내기에는 데이터 양이 너무 많으므로 event == stim인 subject만 그래프로 그렸다.

relplot

 relplot()은 맨 처음에 말했듯이 scatterplot()과 lineplot()의 상위 개념의 함수이다.

relplot()을 이용하여 산점도와 선 그래프 모두 그릴 수 있다. 
문법은 scatterplot(), lineplot()의 문법을 그대로 사용하면 되고
단지 scatter plot을 그리고 싶다면 relplot(kind="scatter")(default 값이다.),
line plot을 그리고 싶다면 relplot(kind="line")을 입력하면 된다.

그래프의 가로, 세로 비율이 살짝 다르긴 하지만 똑같은 그래프를 그린다.

relplot을 사용하는 이유

relplot()이 단순히 scatterplot(), lintplot()을 묶어주는 용도라면 굳이 사용할 이유는 없을 것이다. 

relplot()의 장점은 return값이 FacetGrid라는 것이다.
scatterplot(), lintplot()는 return값이 AxesSubplot인데 
AxesSubplot는 1장의 그림에 모든 것을 담고
FacetGrid는 여러 개의 AxesSubplot를 포함한다고 생각하면 된다.

return 값이 다름을 알 수 있다.

여러개의 그림 그리기

 hue와 비슷하게 어떤 변수로 데이터를 나눌지 col, row에 입력해주면 된다.
간단하게 행렬처럼 여러 개의 그래프를 나타낸다.

이외에도 다양한 설정이 가능하다.
자세한 설정법은 아래 링크를 참조하길 바란다.
https://seaborn.pydata.org/generated/seaborn.FacetGrid.html#seaborn.FacetGrid

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기