Python

[Python] 데이터 시각화 - Seaborn

라딘 2022. 8. 3. 12:47

데이터 시각화 - Seaborn

 

0. Seaborn

- Matplotlib를 기반으로 다양한 색상 테마와 통계용 차트 등의 기능을 추가한 시각화 패키지

- 기본적인 시각화 기능은 matplotlib 패키지에 의존하며 통계 기능은 statsmodels 패키지에 의존

- 함수가 쉬우며 직관적으로 결과를 확인할 수 있습니다.

import seaborn as sns  #seaborn 라이브러리 로드

 

- Seaborn 그래프의  기본 설정

seaborn에서는 sns.set()을 통해 기본 환경변수를 설정할 수 있습니다.

스타일, 팔레트, 글꼴 등 앞으로 그리게 되는 모든 플롯의 그림에 영향을 주는 설정입니다.

 

ex) sns.set_theme(style = 'whitegrid') #그래프 배경의 기본 테마를 변경할 수 있음

 

1. lmplot(Logistic Model Plot)

lmplot은 scatter plot과 유사하게 점의 분포를 보여주며, 점들이 이루는 회귀선을 그려 보여줍니다.

또 회귀선의 신뢰구간까지 확인할 수 있는 그래프입니다.

 

sns.lmplot(x = 'x', y = 'y', data = data)

df = sns.load_dataset('anscombe')

#lmplot 그리기
sns.lmplot(x = 'x', y = 'y', data = df)

 

특정한 기준에 따라서 그래프의 색을 다르게 그려달라고 요청하고 싶을 때는

hue = 'column' 옵션을 지정해줍니다.

sns.lmplot(x = 'x', y = 'y', hue = 'dataset', data = df)

 

그래프들이 모두 겹쳐져서 그려지기 때문에 보기 불편하다면 따로 그래프를 그릴 수 있는 옵션을 지정해줄 수 있습니다.

col = '분류할 조건 칼럼', col_wrap = n 옵션을 지정하면

각각의 그래프를 따로 나눠 가로에 n개가 보여지도록 배치해줍니다.

sns.lmplot(x = 'x', y = 'y', hue = 'dataset', data = df, col = 'dataset', col_wrap = 2);

 

추가적으로 사용할 수 있는 옵션들은 다음과 같습니다.

- ci = None : 신뢰구간을 표시하지 않음

- fit_reg = False : 회귀선을 표시하지 않음

- scatter_kws =  {'alpha' : 0.5, 's': 100} : 점에 설정하는 옵션, s는 점의 크기, alpha는 점의 투명도

sns.lmplot(x = 'x', y = 'y', col = 'dataset', hue = 'dataset', data = df,
          col_wrap = 2, ci = None, palette = 'muted',  #palette : 색 조합 설정
          scatter_kws = {'s': 100, 'alpha': 0.6}, markers = '^')  #마커도 지정 가능합니다.

 

2. Barplot

barplot은 범주형 변소에서 각 범주의 빈도를 나타내기에 적합한 그래프입니다.

x에는 범주 등의 값을, y에는 막대로 표시할 숫자를 각각 대응시켜서 입력해야 합니다.

 

sns.barplot(x = x, y = y)

x = np.array(list('ABCDEFGH'))
y = np.abs(np.random.randn(8)) * 10  #랜덤으로 값을 추출하고 절댓값으로 변경

sns.barplot(x = x, y = y, palette = 'rocket')

sns.barplot(x = x, y = y, palette = 'rocket'
           ).axhline(10, color = 'g')  #axhline으로 가로선을 그어줄 수 있음

 

3. Count plot

barplot과 유사하나 데이터프레임 내 칼럼의 각 카테고리별로 데이터가 얼마나 존재하는지

빈도 수를 직접 계산해서 보여주는 그래프입니다.

 

sns.countplot(x = 'column', data = data)

tips = sns.load_dataset('tips')
sns.countplot(x = 'day', data = tips);

 

4. Line graph

주로 시계열 데이터의 경향(트렌드)를 나타내기 위해 사용합니다.

설명 변수의 시간 흐름에 따른 각 지표의 관계를 규명하고,

지표 간 정보를 바탕으로 미래의 시나리오를 예측할 수 있습니다.

 

sns.lineplot(x = 'x', y = 'y', data = data)

#요일에 따른 총 지불액의 변화 line graph
sns.lineplot(x = 'day', y = 'total_bill', data = tips);
#기본으로 신뢰구간(ci)를 출력하기 때문에 불필요하다면 ci = None옵션 설정

sns.lineplot(x = range(30), y = np.random.randn(30).cumsum(), linestyle = '--', color = 'orange')
#linestyle, color 옵션 지정 가능

 

5. Scatter Plot

회귀분석이나 상관분석, 정규성 검정에 사용되는 그래프로서 두 변수간의 관계를 보여줍니다.

 

sns.scatterplot(x = 'x', y = 'y', data = data)

#총 지불액과 팁의 상관관계(시간대에 따라 다르게 표현)
sns.scatterplot(data = tips, x = 'total_bill', y = 'tip', hue = 'time');

 

6. Distplot

히스토그램과 유사한 그래프로 연속형 변수의 분포를 보여줍니다.

러그와 커널 밀도(분포를 부드럽게 연결한 선)을 같이 보여줄 수 있습니다.

 

sns.distplot(x = data.column , kde = True, rug = False, bins = n)

#total_bill의 분포
sns.distplot(x = tips['total_bill'], rug = True);

 

kde(커널 밀도)만 그려주는 kdeplot이라는 함수도 존재합니다.

sns.kdeplot(data = data, x = column)

sns.kdeplot(data = tips, x = 'total_bill')

 

7. Box Plot

5가지 주요 통계량(중위수, 1분위수, 3분위수, 최댓값, 최솟값)이 표현되어 있으며, 이상치를 탐지할 수 있는 그래프입니다.

여러 그룹 간 데이터를 비교할 때 유용합니다.

 

sns.boxplot(x = 'x', y = 'y', data = data, hue = '나누려는 칼럼명')

#날짜와 인원 수에 따른 총 지불액의 분포
sns.boxplot(x = 'day', y = 'total_bill', hue = 'size', data = tips);

#x축에 연속형, y축에 범주형 변수
sns.boxplot(x = 'total_bill', y = 'day', data = tips, palette = ['g', 'm', 'b', 'r'])
sns.despine(trim = True, offset = 10)  #축 옵션 설정

 

8. Violin Plot

박스 플롯과 동일하게 일변량, 연속형 데이터의 분포를 설명하기 위해 사용되는 그래프입니다.

커널 밀도 곡선(kde)와 박스 플롯을 합친 형태로,

범주형 변수의 각 값에 따른 분포의 실제 데이터 또는 전체 형상을 보여줍니다.

 

sns.violinplot(x = 'x', y = 'y', data = data)

#날짜에 따른 총 지불액의 분포
sns.violinplot(x = 'day', y = 'total_bill', data = tips)
sns.despine(trim = True, offset = 10)

#day에 따른 total_bill의 분포을 흡연 여부에 따라 좌, 우로 나눠서 표현
sns.set_theme(style = 'whitegrid')  #그래프 기본 테마 지정

sns.violinplot(data = tips, x = 'day', y = 'total_bill', hue = 'smoker',
              split = True, inner = 'quart', palette = {'Yes':'b', 'No': '.85'})
sns.despine(left = True)

 

9. Heatmap

데이터의 수치를 색상으로 표현해주는 그래프로, 상관관계 분석 등에 많이 활용됩니다.

 

sns.heatmap(data, annot = True) #data는 pivot.table 형식, annot = True로 빈도수 표현

sns.set_theme()

flights_long = sns.load_dataset('flights')
flights = flights_long.pivot('month', 'year', 'passengers')

f, ax = plt.subplots(figsize = (9, 6))
sns.heatmap(flights, annot = True, fmt = 'd', ax = ax)

 

10. Pair Plot

3차원 이상의 데이터일 때 그리드 형태로 각 데이터 열의 조합에 대해 산점도를 그려줍니다.

같은 데이터가 만나는 대각선 영역에는 해당 데이터의 히스토그램을 보여줍니다.

 

sns.pairplot(data)

sns.pairplot(data = tips)

sns.pairplot(data = tips, hue = 'day')  #day에 따라 다르게 그림

 

11. 축, 제목, 라벨 설정

seaborn은 matplotlib의 ax 객체를 반환합니다.

따라서 matplotlib의 axes.set_title 등의 메소드를 사용하여 축, 제목, 라벨을 지정할 수 있습니다.

ax = sns.plot() 
ax.set_title('제목')
ax.set_ylabel('y축')
ax.set_xlabel('x축') #x축 전체 라벨 지정
ax.xticklabels(['범주1', '범주2', '범주3']) #x축에 있는 변수의 수만큼 적어줘야 함