[Python] 데이터 시각화 - Seaborn
데이터 시각화 - 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축에 있는 변수의 수만큼 적어줘야 함