모듈 Import¶
!pip install seaborn==0.13.0
Defaulting to user installation because normal site-packages is not writeable Collecting seaborn==0.13.0 Downloading seaborn-0.13.0-py3-none-any.whl (294 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 294.6/294.6 kB 2.2 MB/s eta 0:00:00a 0:00:01 Requirement already satisfied: numpy!=1.24.0,>=1.20 in ./.local/lib/python3.9/site-packages (from seaborn==0.13.0) (1.23.3) Requirement already satisfied: matplotlib!=3.6.1,>=3.3 in ./.local/lib/python3.9/site-packages (from seaborn==0.13.0) (3.6.0) Requirement already satisfied: pandas>=1.2 in ./.local/lib/python3.9/site-packages (from seaborn==0.13.0) (1.4.2) Requirement already satisfied: python-dateutil>=2.7 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (2.8.2) Requirement already satisfied: fonttools>=4.22.0 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (4.38.0) Requirement already satisfied: kiwisolver>=1.0.1 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (1.4.4) Requirement already satisfied: contourpy>=1.0.1 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (1.0.6) Requirement already satisfied: packaging>=20.0 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (21.3) Requirement already satisfied: pillow>=6.2.0 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (9.3.0) Requirement already satisfied: pyparsing>=2.2.1 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (3.0.9) Requirement already satisfied: cycler>=0.10 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (0.11.0) Requirement already satisfied: pytz>=2020.1 in ./.local/lib/python3.9/site-packages (from pandas>=1.2->seaborn==0.13.0) (2022.5) Requirement already satisfied: six>=1.5 in ./.local/lib/python3.9/site-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (1.16.0) Installing collected packages: seaborn Attempting uninstall: seaborn Found existing installation: seaborn 0.12.0 Uninstalling seaborn-0.12.0: Successfully uninstalled seaborn-0.12.0 Successfully installed seaborn-0.13.0 [notice] A new release of pip available: 22.2.2 -> 24.1.1 [notice] To update, run: pip install --upgrade pip
from IPython.display import Image
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
# Unicode warning 제거 (폰트 관련 경고메시지)
plt.rcParams['axes.unicode_minus']=False
# 한글 폰트 설정
plt.rcParams['font.family'] = "NanumGothic"
# 그래프 출력 사이즈 설정
plt.rcParams["figure.figsize"] = (12, 8)
# 엘리스 환경에서 한글 폰트를 사용하기 위한 코드입니다.
font_dirs = ['/usr/share/fonts/truetype/nanum', ]
font_files = fm.findSystemFonts(fontpaths=font_dirs)
for font_file in font_files:
fm.fontManager.addfont(font_file)
plt.rc('font', family='NanumBarunGothic')
Seaborn¶
seaborn은 matplotlib을 더 사용하기 쉽게 해주는 라이브러리입니다.
샘플 데이터셋 로드¶
tips = sns.load_dataset("tips")
왜 Seaborn 인가요?¶
matplotlib으로 대부분의 시각화는 가능합니다. 하지만, 다음과 같은 이유로 seaborn
을 많은 사람들이 선호합니다.
- 쉬운 사용성 (1줄 완성 그래프)
- seaborn 에서만 제공되는 통계 기반 plot
- 아름다운 스타일링
- Pandas의 데이터프레임과 높은 호환성
아름다운 스타일링¶
seaborn의 최대 장점 중 하나인, 아름다운 컬러팔레트입니다.
제가 최대 장점으로 꼽은 이유는,
matplotlib
의 기본 컬러 색상보다 seaborn
은 스타일링에 크게 신경을 쓰지 않아도 default 컬러가 예쁘게 조합해 줍니다.
fig, axes = plt.subplots(1, 2)
fig.set_size_inches(12, 6)
axes[0].bar(tips['day'], tips['total_bill'])
axes[0].set_title('matplotlib')
sns.barplot(x="day", y="total_bill", data=tips, palette='Set1', ax=axes[1])
axes[1].set_title('seaborn')
plt.show()
컬러 팔레트¶
자세한 컬러팔레트는 공식 도큐먼트를 참고하세요
sns.color_palette()
Light¶
sns.light_palette("seagreen", n_colors=10)
Dark¶
sns.dark_palette("#69d", n_colors=10)
Diverging¶
sns.color_palette('vlag', n_colors=10)
sns.diverging_palette(220, 20, n=10)
Custom¶
sns.cubehelix_palette(10, start=9.9)
다양한 예시¶
sns.palplot(sns.light_palette((210, 90, 60), input="husl"))
sns.palplot(sns.dark_palette("muted purple", input="xkcd"))
sns.palplot(sns.color_palette("BrBG", 10))
sns.palplot(sns.color_palette("BrBG_r", 10))
sns.palplot(sns.color_palette("coolwarm", 10))
sns.palplot(sns.diverging_palette(255, 133, l=60, n=10, center="dark"))
sns.barplot(x="tip", y="total_bill", data=tips, palette='coolwarm')
<AxesSubplot: xlabel='tip', ylabel='total_bill'>
sns.barplot(x="tip", y="total_bill", data=tips, palette='Reds')
<AxesSubplot: xlabel='tip', ylabel='total_bill'>
Seaborn 그래프¶
Scatterplot¶
x, y, colors, area 설정¶
- colors 는 임의 값을 color 값으로 변환합니다.
- area는 점의 넓이를 나타냅니다. 값이 커지면 당연히 넓이도 커집니다.
# 샘플데이터 생성
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.arange(50)
area = x * y * 250
- seaborn 에서는
size
와sizes
를 동시에 지정해줍니다. sizes
옵션에서는 사이즈의 min, max를 명시해 줍니다.hue
는 컬러 옵션입니다.palette
를 통해 seaborn이 제공하는 아름다운 palette 를 이용하시면 됩니다.
sns.scatterplot(x=x, y=y, size=area, sizes=(area.min(), area.max()), hue=area, palette='icefire')
<AxesSubplot: >
cmap과 alpha 설정¶
- cmap에 컬러를 지정하면, 컬러 값을 모두 같게 가져갈 수도 있습니다.
- alpha값은 투명도를 나타내며 0 ~ 1 사이의 값을 지정해 줄 수 있으며, 0에 가까울 수록 투명한 값을 가집니다.
sns.scatterplot(x=x, y=y, size=area, sizes=(area.min(), area.max()), hue=area, alpha=0.3, palette='icefire')
<AxesSubplot: >
Pointplot¶
- pointplot은 점 위치에 의한 숫자 변수의 중심 경향 추정치(central tendency)이며 오차 막대를 사용하여 추정치 주변의 불확실성을 나타냅니다.
np.random.seed(123)
x = np.random.rand(50).round(1)
y = np.random.rand(50).round(1)
# pointplot 생성
sns.pointplot(x=x, y=y)
<AxesSubplot: >
오차막대란?
- 오차 막대는 예상 측정 오차를 나타내는 데 사용됩니다. 다시 말해서 오차 막대는 값의 불확실성을 나타냅니다.
- pointplot과 barplot에서 자동으로 그려주는 오차막대는 CI(confidential interval)로 계산되며, 신뢰구간입니다.
신뢰구간이란?
- 신뢰 구간은 처음 보기에 복잡해 보이는 개념이지만, 일상에서도 많이 쓰고 있는 개념입니다.
다음의 예시를 통해 신뢰 구간이 사용되는 예시를 알아봅시다.
- 10에서 15사이라는 값은 지금까지 내가 여러번 이 버스를 타봤을 때 걸리는 시간의 평균값으로부터 얻어졌을 것입니다.
- 그럼 왜 12.5분이라는 정확한 값을 말하지 않고 “10-15분 정도 걸린다”라고 말할까요? 그것은 불확실성이 내포되어 있기 때문입니다. 따라서, 내가 그나마 확실히 말할 수 있는 정도를 구간으로 표현한 것입니다.
"여론조사에서도 A 후보자는 지지율 31%, B 후보자는 지지율이 28%, +=2.0% 입니다" 라고 들어보신 적이 있다면, 여기서 구한 +=2.0%가 바로 신뢰구간과 동일한 개념입니다.
Barplot, Barhplot¶
1개의 canvas 안에 다중 그래프 그리기
기본 Barplot 그리기¶
샘플데이터를 생성합니다.
score = pd.DataFrame({
'subject': ['Math', 'Programming', 'Data Science', 'Art', 'English', 'Physics'],
'score': [66, 80, 60, 50, 80, 10]
})
score
subject | score | |
---|---|---|
0 | Math | 66 |
1 | Programming | 80 |
2 | Data Science | 60 |
3 | Art | 50 |
4 | English | 80 |
5 | Physics | 10 |
bar그래프 생성
sns.barplot(x='subject', y='score', data=score, alpha=0.8, palette='YlGnBu')
<AxesSubplot: xlabel='subject', ylabel='score'>
기본 Barhplot 그리기¶
barh 함수에서는 xticks로 설정했던 부분을 yticks로 변경합니다.
sns.barplot(y='subject', x='score', data=score, alpha=0.8, palette='YlGnBu')
<AxesSubplot: xlabel='score', ylabel='subject'>
Barplot에서 비교 그래프 그리기¶
seaborn 에서는 hue
옵션으로 매우 쉽게 비교 barplot을 그릴 수 있습니다.
# 샘플 데이터셋 로드
titanic = sns.load_dataset('titanic')
titanic.head(2)
survived | pclass | sex | age | sibsp | parch | fare | embarked | class | who | adult_male | deck | embark_town | alive | alone | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 3 | male | 22.0 | 1 | 0 | 7.2500 | S | Third | man | True | NaN | Southampton | no | False |
1 | 1 | 1 | female | 38.0 | 1 | 0 | 71.2833 | C | First | woman | False | C | Cherbourg | yes | False |
hue
옵션에 분할 조건이 되는 컬럼명을 지정합니다.
sns.barplot(x='sex', y='survived', hue='pclass', data=titanic, palette="muted")
<AxesSubplot: xlabel='sex', ylabel='survived'>
Line Plot¶
# 샘플 데이터셋 생성
x = np.arange(0, 10, 0.1)
y_1 = 1 + np.sin(x)
y_2 = 1 + np.cos(x)
- color: 컬러 옵션
- alpha: 투명도 옵션
# lineplot 생성
sns.lineplot(x=x, y=y_1, label='1+sin', color='navy', alpha=0.3)
sns.lineplot(x=x, y=y_2, label='1+cos', color='red', alpha=0.7)
<AxesSubplot: >
마커 스타일링¶
- marker: 마커 옵션
# lineplot 생성
sns.lineplot(x=x, y=y_1, label='1+sin', color='navy', alpha=0.3, marker='o')
sns.lineplot(x=x, y=y_2, label='1+cos', color='red', alpha=0.7, marker='+')
<AxesSubplot: >
라인 스타일 변경하기¶
- linestyle: 라인 스타일 변경 옵션
sns.lineplot(x=x, y=y_1, label='1+sin', color='blue', linestyle=':')
sns.lineplot(x=x, y=y_2, label='1+cos', color='red', linestyle='-.')
<AxesSubplot: >
Histogram¶
# 샘플데이터 생성
N = 100000
bins = 30
x = np.random.randn(N)
sns.histplot(x, bins=bins, kde=False, color='g')
<AxesSubplot: ylabel='Count'>
kde
을 True로 설정해주면, Density가 Y축에 표기 됩니다.
sns.histplot(x, bins=bins, kde=True, color='g')
<AxesSubplot: ylabel='Count'>
분포표, 누적분포표¶
# 샘플 데이터셋 생성
x = np.random.randn(100)
fig, axes = plt.subplots(1, 2, tight_layout=True)
fig.set_size_inches(12, 4)
# 히스토그램 생성
sns.histplot(x=x, bins=bins, ax=axes[0])
sns.histplot(x=x, bins=bins, cumulative=True, ax=axes[1])
<AxesSubplot: ylabel='Count'>
Box Plot¶
샘플 데이터를 생성합니다.
titanic = sns.load_dataset('titanic')
seaborn에서 boxplot을 그릴 때는DataFrame을 가지고 그릴 때 주로 활용합니다.
seaborn 에서는 hue
옵션으로 매우 쉽게 비교 boxplot을 그릴 수 있습니다.
sns.boxplot(x='pclass', y='age', hue='survived', data=titanic)
<AxesSubplot: xlabel='pclass', ylabel='age'>
제출¶
제출을 위해 Line Plot의 마커 스타일링에서 그렸던 그래프와 똑같은 그래프를 다시 그리세요.
x = np.arange(0, 10, 0.1)
y_1 = 1 + np.sin(x)
y_2 = 1 + np.cos(x)
# TODO: "마커 스타일링"에서 그렸던 그래프를 그리세요.
sns.lineplot(x=x, y=y_1, label='1+sin', color='navy', alpha=0.3, marker='o')
sns.lineplot(x=x, y=y_2, label='1+cos', color='red', alpha=0.7, marker='+')
# 이 아래를 수정하면 제대로 채점되지 않습니다.
plt.tight_layout()
plt.savefig('result.png')
'Biusiness Insight > Data Science' 카테고리의 다른 글
[Python] Seaborn을 활용한 시각화 실습 (0) | 2024.06.30 |
---|---|
[Python] Seaborn을 활용한 시각화 - seaborn stats (0) | 2024.06.30 |
[Python] Matplotlib을 활용한 시각화 실습 (0) | 2024.06.30 |
[Python] Matplotlib을 활용한 시각화 (0) | 2024.06.30 |
[Python] 데이터프레임 시각화 (0) | 2024.06.30 |