๐ก ์๊ฐํ 3๋์ฅ : matplotlib, seaborn, plotly
!pip install seaborn
import seaborn as sns
import matplotlib
import matplotlib.font_manager as fm
#plt.rc('font',family='AppleGothic')
# For Windows
font_location = 'C:/Windows/Fonts/Malgun.ttf'
# For apple
# font_location = '/System/Library/Fonts/AppleSDGothicNeo.ttc'
font_name = fm.FontProperties(fname=font_location).get_name()
print(font_name)
matplotlib.rc('font', family=font_name)
# data= DataFrame์ ํ ํจ sns.~plot(data= , x= , y= , hue= ) # x,y๋ ์นผ๋ผ๋ช
๐ก (๊ธฐ์ตํ๋ฉด ์ข์ ๊ฒ ๊ฐ์) palette ์์
- Blues
- Paired
- viridis
โ
titanic = sns.load_dataset('titanic')
penguins = sns.load_dataset('penguins')
โ
- regplot() ํจ์ : ์ ํ ํ๊ท์ ์ด ์๋ ์ฐ์ ๋
- ๋ฐ์ดํฐ ์ - x์ถ ๋ณ์ - y์ถ ๋ณ์ - axe ๊ฐ์ฒด - fit_reg : ์ ํํ๊ท์ ํ์ ์ฌ๋ถ
# ๊ทธ๋ํ ๊ฐ์ฒด ์์ฑ (figure์ 2๊ฐ์ ์๋ธ ํ๋กฏ์ ์์ฑ)
fig = plt.figure(figsize=(15,5))
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)
# ์ฐ์ ๋์ ์ ํํ๊ท์ ํ์(fit_reg=True)
sns.regplot(data=titanic, x='age', y='fare', ax=ax1)
# ์ฐ์ ๋์ ์ ํํ๊ท์ ๋ฏธํ์(fit_reg=False)
sns.regplot(data=titanic, x='age', y='fare', ax=ax2, fit_reg=False)
plt.show()
โ
- distplot( ) ํจ์ : ํ์คํ ๊ทธ๋จ๊ณผ ์ปค๋ ๋ฐ๋ ๊ทธ๋ํ์ ํํํ๋ ํจ์
- ๋ถํฌ๋ฅผ ๊ทธ๋ฆด ๋ฐ์ดํฐ ๋ณ์ - hist : True๋ ํ์คํ ๊ทธ๋จ ํ์, False๋ ํ์คํ ๊ทธ๋จ ํ์ ์ ํจ - kde : True๋ ์ปค๋ ๋ฐ๋ ๊ทธ๋ํ ํ์, False๋ ์ปค๋ ๋ฐ๋ ๊ทธ๋ํ ํ์ ์ ํจ - axe ๊ฐ์ฒด
- histplot( ) ํจ์ : ํ์คํ ๊ทธ๋จ(ํ๋์ ๋ณ์ ๋ฐ์ดํฐ๋ฅผ ํน์ ๊ตฌ๊ฐ๋ณ ์ ๋ณด๋ก ํ์ธํ ๋ ์ฌ์ฉํ๋ ํจ์)
- kdeplot( ) ํจ์ : ์ปค๋ ๋ฐ๋ ๊ทธ๋ํ(๊ทธ๋ํ์ x์ถ ์ฌ์ด์ ๋ฉด์ ์ด 1์ด ๋๋๋ก ๊ทธ๋ฆฌ๋ ๋ฐ๋ ํจ์)
# ๊ทธ๋ํ ๊ฐ์ฒด ์์ฑ (figure์ 3๊ฐ์ ์๋ธ ํ๋กฏ์ ์์ฑ)
fig = plt.figure(figsize=(15, 5))
ax1 = fig.add_subplot(1, 3, 1)
ax2 = fig.add_subplot(1, 3, 2)
ax3 = fig.add_subplot(1, 3, 3)
# distplot
# ํ์คํ ๊ทธ๋จ๊ณผ ์ปค๋ ๋ฐ๋ ๊ทธ๋ํ ํ์
sns.distplot(titanic['fare'], ax=ax1)
# histplot
#sns.histplot(data=titanic, x='fare', ax=ax2)์ ๋์ผ
sns.distplot(titanic['fare'], kde=False, ax=ax2)
# kdeplot
#sns.kdeplot(data=titanic, x='fare', ax=ax3)์ ๋์ผ
sns.distplot(titanic['fare'], hist=False, ax=ax3)
# ์ฐจํธ ์ ๋ชฉ ํ์
ax1.set_title('titanic fare - distplot')
ax2.set_title('titanic fare - histplot')
ax3.set_title('titanic fare - kedplot')
plt.show()
data = sns.load_dataset('penguins')
data = data.dropna()
sns.histplot(data=data, x='bill_length_mm', bins=15, hue='species', palette='Set3', multiple='stack')
โ
- displot() ํจ์ : distribution๋ค์ ์ฌ๋ฌ subplot๋ค๋ก ๋๋ ์ ์ถ๋ ฅํด์ฃผ๋ ํจ์
- displot์ kind๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ผ๋ก, histplot, kdeplot, ecdfplot ์ถ๋ ฅ ๊ฐ๋ฅ
- row ๋ฐ col ๋งค๊ฐ๋ณ์์ ๋ฐ๋ผ ๊ทธ๋ํ ๊ตฌ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ
sns.displot(data=data, x='bill_length_mm', row ='species', col='sex', kind='hist', hue='species', palette='viridis')
sns.displot(data=data, x='bill_length_mm', col='sex', kind='kde', hue='species', palette='viridis')
โ
- barplot() ํจ์ : seaborn์์ ๋ง๋๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ ํจ์
- ์ฃผ์ ์ธ์(parameter) data, x, y, palette : ์์, hue: ๊ทธ๋ฃน, ax: axes, estimator: ์ง๊ณํจ์
โ
- ๊ธฐ๋ณธ๊ฐ์ผ๋ก ํ๊ท ์ผ๋ก ์ง๊ณํ๋ค
- ๊ฐ๋ก / ์ธ๋ก ๋ ๊ฐ์ง๋ก ๋ชจ๋ ์ถ๋ ฅ ๊ฐ๋ฅ
- x, y ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์๋ก ๋ฐ๊พธ๋ฉด ์ถ๋ ฅ ๋ฐฉํฅ ๋ฐ๊พธ๊ธฐ ๊ฐ๋ฅ
plt.figure(figsize=(12, 6)) # ๋ํ์ง ์ธํ
# sns.barplot(data=data, x='species', y='bill_depth_mm', errorbar=None, palette='Set3') # ์ธ๋ก๋ก ์ถ๋ ฅ
sns.barplot(data=data, y='species', x='bill_depth_mm', errorbar=None, palette='Set3') # ๊ฐ๋ก๋ก ์ถ๋ ฅ, ๊ฒฐ๊ณผ๋ ํ๊ท ์ผ๋ก ํํ
# ๊ทธ๋ํ์ ์ถ๊ฐ์ ์ธ ์์๋ค์ seaborn ํจ์ ๋ฐ์๋ค๊ฐ ์ ๋ ๊ฒ์ ์ถ์ฒ
plt.title("ํญ๊ท ์ข
๋ณ ๋ถ๋ฆฌ ๊ธธ์ด์ ํ๊ท ", fontsize=16)
# x ๋๊ธ ๋ณ๊ฒฝ
plt.xticks([0, 5, 10, 15, 20])
# ๊ทธ๋ํ ์ ์ฅ
plt.savefig('sample_barplot.png') ๐๐๐
# ๊ทธ๋ํ๋ง ์ถ๋ ฅ(๊ทธ๋ํ ๊ด๋ จ ์ฝ๋ ๋งจ ๋ง์ง๋ง์ ์ ์ด์ผ ํจ)
plt.show()
- seaborn์ lambdaํจ์ ์ ์ฉ
# 15์ธ ์ดํ์ ๋น์จ ๊ทธ๋ํ sns.barplot(data=df, x='Pclass', y='Age', estimator=lambda x: (x <= 15).mean(), ci=False, palette='BuPu')
โ
- boxplot() ํจ์ : ๋ฐ์ดํฐ์ ๊ฐ ์ข ๋ฅ๋ณ๋ก ์ฌ๋ถ์ ์(quantile)๋ฅผ ํ์ํ๋ ํจ์
- ํน์ ๋ฐ์ดํฐ์ ์ ์ฒด์ ์ธ ๋ถํฌ๋ฅผ ํ์ธํ๊ธฐ ์ข์ ์๊ฐํ ๊ธฐ๋ฒ
- box์ ์ ์ฒด range์ ๊ทธ๋ฆผ์ ํตํด outlier(์ด์์น)๋ฅผ ์ฐพ๊ธฐ ์ฉ์ด(IQR : Inter-Quantile Range)
sns.boxplot(data=data, x='species', y='flipper_length_mm', palette='Set3')
โ
- stripplot( ) ํจ์ : ๋ฐ์ดํฐ ํฌ์ธํธ๊ฐ ์ค๋ณต๋์ด ๋ฒ์ฃผ๋ณ ๋ถํฌ๋ฅผ ์๊ฐํ
- ๋ฐ์ดํฐ ์ - x์ถ ๋ณ์ - y์ถ ๋ณ์ - axe ๊ฐ์ฒด - hue : ํน์ ์ด ๋ฐ์ดํฐ๋ก ์์์ ๊ตฌ๋ถํ์ฌ ์ถ๋ ฅ
- swarmplot( ) ํจ์
: ๋ฐ์ดํฐ์ ๋ถ์ฐ๊น์ง ๊ณ ๋ คํ์ฌ ๋ฐ์ดํฐ ํฌ์ธํธ๊ฐ ์๋ก ์ค๋ณต๋์ง ์๋๋ก ์๊ฐํ.- ๋ฐ์ดํฐ ์ - x์ถ ๋ณ์ - y์ถ ๋ณ์ - axe ๊ฐ์ฒด - hue : ํน์ ์ด ๋ฐ์ดํฐ๋ก ์์์ ๊ตฌ๋ถํ์ฌ ์ถ๋ ฅ
# ๊ทธ๋ํ ๊ฐ์ฒด ์์ฑ (figure์ 2๊ฐ์ ์๋ธ ํ๋กฏ์ ์์ฑ)
fig = plt.figure(figsize=(15, 5))
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)
# ์ด์ฐํ ๋ณ์์ ๋ถํฌ - ๋ฐ์ดํฐ ๋ถ์ฐ ๋ฏธ๊ณ ๋ ค
sns.stripplot(data=titanic, x='class', y='age', ax=ax1)
# ์ด์ฐํ ๋ณ์์ ๋ถํฌ - ๋ฐ์ดํฐ ๋ถ์ฐ ๊ณ ๋ ค (์ค๋ณต X)
sns.swarmplot(data=titanic, x='class', y='age', ax=ax2, hue='sex') # ์ฑ๋ณ๋ก ์์ ๊ตฌ๋ถ
# ์ฐจํธ ์ ๋ชฉ ํ์
ax1.set_title('Strip Plot')
ax2.set_title('Swarm Plot')
plt.show()
โ
- countplot( ) ํจ์ : ๊ฐ ๋ฒ์ฃผ์ ์ํ๋ ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ๋ง๋ ๊ทธ๋ํ๋ก ์๊ฐํ
- ๋ฐ์ดํฐ ์ - x์ถ ๋ณ์ - axe ๊ฐ์ฒด - hue : ํน์ ์ด ๋ฐ์ดํฐ๋ก ์์์ ๊ตฌ๋ถํ์ฌ ์ถ๋ ฅ - palette
# ๊ทธ๋ํ ๊ฐ์ฒด ์์ฑ (figure์ 3๊ฐ์ ์๋ธ ํ๋กฏ์ ์์ฑ)
fig = plt.figure(figsize=(15, 5))
ax1 = fig.add_subplot(1, 3, 1)
ax2 = fig.add_subplot(1, 3, 2)
ax3 = fig.add_subplot(1, 3, 3)
# class๋ณ ์ธ์ ํ์
sns.countplot(data=titanic, x='class', ax=ax1, palette='Set3')
# hue ์ต์
์ 'who' ์ถ๊ฐ
sns.countplot(data=titanic, x='class', ax=ax2, hue='who', palette='Set3')
# dodge=False ์ต์
์ถ๊ฐ (์ถ ๋ฐฉํฅ์ผ๋ก ๋ถ๋ฆฌํ์ง ์๊ณ ๋์ ๊ทธ๋ํ ์ถ๋ ฅ)
sns.countplot(data=titanic, x='class', ax=ax3, hue='who', palette='Set3', dodge=False)
# ์ฐจํธ ์ ๋ชฉ ํ์
ax1.set_title('titanic class')
ax2.set_title('titanic class - who')
ax3.set_title('titanic class - who(stacked)')
plt.show()
โ
- jointplot( ) ํจ์ : ์ฐ์ ๋๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํ์, x-y์ถ์ ๊ฐ ๋ณ์์ ๋ํ ํ์คํ ๊ทธ๋จ์ ๋์์ ์๊ฐํ
- ๋ฐ์ดํฐ ์ - x์ถ ๋ณ์ - y์ถ ๋ณ์ - kind = 'reg' : ์ ํ ํ๊ท์ ์ถ๊ฐ - kind = 'hex' : ์ก๊ฐ ์ฐ์ ๋ ์ถ๊ฐ - kind = 'kde' : ์ปค๋ ๋ฐ์ง ๊ทธ๋ํ ์ถ๊ฐ
# ์กฐ์ธํธ ๊ทธ๋ํ - ์ฐ์ ๋(๊ธฐ๋ณธ๊ฐ)
j1 = sns.jointplot(data = titanic, x='fare', y='age')
j1.fig.suptitle('titanic fare - scatter', size=15)
plt.show()
# ์กฐ์ธํธ ๊ทธ๋ํ - ํ๊ท์ (kind = 'reg')
j2 = sns.jointplot(data=titanic, x='fare', y='age', kind='reg')
j2.fig.suptitle('titanic fare - reg', size=15)
plt.show()
# ์กฐ์ธํธ ๊ทธ๋ํ - ์ก๊ฐ ์ฐ์ ๋(kind = 'hex')
j3 = sns.jointplot(data=titanic, x='fare', y='age', kind='hex')
j3.fig.suptitle('titanic fare - hex', size=15)
plt.show()
# ์กฐ์ธํธ ๊ทธ๋ํ - ์ปค๋ ๋ฐ์ง ๊ทธ๋ํ(kind = 'kde')
j4 = sns.jointplot(data=titanic, x='fare', y='age', kind='kde')
j4.fig.suptitle('titanic fare - kde', size=15)
plt.show()
โ
- pairplot( ) ํจ์
- ์ธ์๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐํ๋ ์์ feature(์์นํ)์ ๋ ๊ฐ์ฉ ์ง ์ง์ ๋ชจ๋ ์กฐํฉ ํํ(displot์ ํ์ฅํ)
- ๊ฐ ๊ทธ๋ฆฌ๋์ ๋ feature์ ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๊ทธ๋ํ๋ฅผ ํ๋์ฉ ํํ
- ๊ฐ์ feature์ ์ง์ ์ด๋ฃจ๋ ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก๋ ํ์คํ ๊ทธ๋จ ์๊ฐํ
- ์๋ก ๋ค๋ฅธ feature์ ๊ฐ์๋ ์ฐ์ ๋ ์๊ฐํ
- ๊ฐ feature์ ๋ํด ๊ณ์ฐ๋ ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์, feature๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ฌ์ฉ ๋ถ์ ํฉ(๋ณดํต 6๊ฐ ์ ๋๊น์ง๋ง ์ฌ์ฉ)
- feature๊ฐ ๋ง์ ๊ฒฝ์ฐ, ๋ช ๊ฐ feature์ ๋ํด์๋ง ์ ์ฉํ๊ฑฐ๋ ํ๋์ฉ ๊ทธ๋ํ ํํํ๋ ๊ฒ์ ๊ถ์ฅ
titanic_pair = titanic[['age', 'pclass', 'fare']]
sns.pairplot(titanic_pair)
plt.show()
sns.pairplot(data=data, hue='species')
โ
- lineplot() ํจ์ :ํน์ ๋ฐ์ดํฐ๋ฅผ x, y๋ก ํ์ํ์ฌ ๊ด๊ณ๋ฅผ ํ์ธํ ์ ์๋ ํจ์(์ ๊ทธ๋ํ)
- ์์นํ ์งํ๋ค ๊ฐ์ ๊ฒฝํฅ์ ํ์ ํ ๋ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.(์ค์ฐจ ํฌํจ)
- ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ฅธ ๋ณํ๋ฅผ ๋ํ๋ผ ๋/ ์ฐ์ํ ๋ฐ์ดํฐ๋ค ๋ณผ ๋ ๋ง์ด ์ฌ์ฉ
sns.lineplot(data=data, x='body_mass_g', y='flipper_length_mm', errorbar=None, hue='species', palette='winter')
โ
- scatterplot() ํจ์ : lineplot๊ณผ ๋น์ทํ๊ฒ x, y์ ๋ํ ์ ์ฒด์ ์ธ ๋ถํฌ๋ฅผ ํ์ธํ๋ plot
- lineplot์ ๊ฒฝํฅ์ฑ์ ์ด์ ์ ๋๋ค๋ฉด, scatterplot์ ๋ฐ์ดํฐ ๊ทธ ์์ฒด๊ฐ ํผ์ ธ์๋ ๋ชจ์์ ์ค์
- ์๊ฐ์ ๋ฐ๋ฅธ ๋ฐ์ดํฐ์ ๋ณํ๋ฅผ ๋ณด๊ธฐ ์ํ ๊ฒ์ด ์๋๋ผ๋ฉด, Lineplot๋ณด๋ค๋ Scatterplot ์ฌ์ฉ- s : ์ ํฌ๊ธฐ - alpha(0~1) : ํฌ๋ช ๋ - plt.scatter์ ๋งค๊ฐ ๋ณ์ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ
sns.scatterplot(data=data, x='body_mass_g', y='flipper_length_mm', hue='species', palette='Blues', s=50, alpha=1)
โ
- heatmap() ํจ์ : ๋ฐ์ดํฐ์ ๊ด๊ณ๋ฅผ ์ ์ฌ๊ฐํ ๊ทธ๋ฆผ์ ์ ์ฐจ์ด๋ก ๋ณด์ฌ์ฃผ๋ ํจ์
- ๋ง ๊ทธ๋๋ก heatmap์ด๊ธฐ ๋๋ฌธ์, ์ดํ์์นด๋ฉ๋ผ๋ก ์ฌ๋ฌผ์ ์ฐ์ ๊ฒ์ฒ๋ผ ์ ๋ณด์ ์ฐจ์ด๋ฅผ ํํ
- pairplot๊ณผ ๋น์ทํ๊ฒ feature๊ฐ ๊ด๊ณ๋ฅผ ์๊ฐํํ ๋ ๋ง์ด ์ฌ์ฉ
- ์๊ด๊ด๊ณ : ์ด๋ค X๊ฐ์ ๋ณํ์ ๋ฐ๋ผ Y๊ฐ์ ์ ํ์ ์ผ๋ก ๋ณํํ๋์ง๋ฅผ ์ธก์ ํ ์งํ(๋ฒ์ : -1 ~1)
sns.heatmap(data=data.corr(), annot=True, fmt='.3f', cmap='Blues_r')