단변량 그래프 그리기 - 히스토그램
seaborn 라이브러리를 sns라고 하자.
import seaborn as sns
tips = sns.load_dataset("tips")
ax = plt.subplots()
ax = sns.distplot(tips['total_bill'])
ax.set_title('Total Bill Histogram with Density Plot')

subplots 메서드로 기본 틀을 만들고 distplot 메서드에 total_bill 열 데이터를 전달하여 히스토그램을 그릴 수 있다.
이때 distplot 메서드를 사용하면 히스토그램과 밀집도 그래프를 같이 그린다. 만약 밀집도 그래프를 제외하고 싶다면 kde 인잣값을 False로 설정하면 된다. 밀집도 그래프만 나타내고 싶다면 hist 인자를 False로 지정하면 된다.
실무 환경에서는 데이터 시각화를 더 효율적으로 하기 위해 여러 그래프를 한 번에 출력하는 경우가 많다한다.
히스토그램과 밀집도를 그리는 distplot 메서드에 rug인자를 추가하여 그래프를 그려보자.
ax = plt.subplot()
ax = sns.distplot(tips['total_bill'], rug=True)
ax.set_title('Total Bill Histogram with Density and Rug Plot')
ax.set_xlabel('Total Bill')

count 그래프 그리기
이번에는 count 그래프를 그려보자. count 그래프는 이산값을 나타낸 그래프이다.
countplot 메서드를 사용하면 된다.
plot1 = plt.figure()
ax1 = plot1.add_subplot(1, 1, 1)
ax1 = sns.countplot('day', data=tips)
ax1.set_title('Count of days')
ax1.set_xlabel('Day of the Week')
ax1.set_ylabel('Frequency')

산점도 그래프 그리기
seaborn 라이브러리는 matplot 라이브러리보다 다양한 방법으로 산점도 그래프를 그릴 수 있다.
산점도 그래프는 regplot 메서드를 사용해서 그릴 수 있다.
plot2 = plt.figure()
ax1 = plot2.add_subplot(1, 1, 1)
ax1 = sns.regplot(x='total_bill', y='tip', data=tips)
ax1.set_title('Scatterplot of Total Bill and Tip')
ax1.set_xlabel('Total Bill')
ax1.set_ylabel('Tip')

만약 회귀선을 제거하려면 fit_reg 인자를 False로 지정하면 된다.
산점도 그래프 & 히스토그램 그리기
산점도 그래프와 히스토그램을 한 번에 그려주는 jointplot 메서드를 사용해보자.
joint = sns.jointplot(x='total_bill', y='tip', data=tips)
joint.set_axis_labels(xlabel='Total Bill', ylabel='Tip')
joint.fig.suptitle('Joint Plot of Total Bill and Tip', fontsize=10, y=1.03)

산점도 그래프는 점이 겹쳐 보일 경우 점을 구분하기 어렵다. 만약 산점도 그래프의 데이터를 구분하기 쉽게 그리고 싶다면 육각 그래프(hexbin)를 사용하면 된다. jointplot 메서드의 kind 인잣값을 hex로 지정하면 된다.
joint = sns.jointplot(x='total_bill', y='tip', data=tips, kind="hex")
joint.set_axis_labels(xlabel='Total Bill', ylabel='Tip')
joint.fig.suptitle('Joint Plot of Total Bill and Tip', fontsize=10, y=1.03)

데이터의 개수가 많아지면 점점 진한 색으로 표현된다.
이차원 밀집도 그리기
이차원 밀집도를 그려보자. kdeplot 메서드로 만들 수 있다.
다음은 total_bill, tip 열 데이터를 전달하여 이차원 밀집도를 그린 것이다. shade 인잣값을 Ture로 지정하면 음영 효과를 줄 수 있다.
plot3 = plt.figure()
ax = plot3.add_subplot(1, 1, 1)
ax = sns.kdeplot(data=tips['total_bill'],
data2=tips['tip'],
shade=True)
ax.set_title('Kernel Density Plot of Total Bill and Tip')
ax.set_xlabel('Total Bill')
ax.set_ylabel('Tip')

바 그래프 그리기
바 그래프를 그려보자. 바 그래프는 지정한 변수의 평균을 계산하여 그릴 수 있다.
plot4 = plt.figure()
ax = plot4.add_subplot(1, 1, 1)
ax = sns.barplot(x='time', y='total_bill', data=tips)
ax.set_title('Bar Plot of average Total Bill fot time of day')
ax.set_xlabel('Time of day')
ax.set_ylabel('Average total bill')

박스 그래프 그리기
박스 그래프는 최솟값, 1분위수, 중간값, 3분위수, 최댓값, 이상치 등 다양한 통계량을 한 번에 표현하는 그래프이다.
plot5 = plt.figure()
ax = plot5.add_subplot(1, 1, 1)
ax = sns.boxplot(x='time', y='total_bill', data=tips)
ax.set_title('BoxPlot of Total bill by time of day')
ax.set_xlabel('Time of day')
ax.set_ylabel('Average total bill')

박스 그래프는 다양한 통계 수치를 확인하기 위해 자주 사용하는 그래프지만 데이터 분산이 모호하게 표현된다.
이런 경우에는 박스 그래프에 커널 밀도를 추정한 바이올린 그래프를 사용하면 된다.
violinplot 메서드를 사용하여 그리면 된다.
plot6 = plt.figure()
ax = plot6.add_subplot(1, 1, 1)
ax = sns.violinplot(x='time', y='total_bill', data=tips)
ax.set_title('BoxPlot of Total bill by time of day')
ax.set_xlabel('Time of day')
ax.set_ylabel('Average total bill')

관계 그래프 그리기
지금까지 드린 그래프들을 종합한 그래프라고 생각하면 된다. pairplot 메서드에 데이터프레임을 넣으면 된다.
fig = sns.pairplot(tips)


이때 관계 그래프는 중복된 정보가 표현된다는 단점이 있다.
관계 그래프의 절반(대각선 위)은 나머지 절반(대각선 아래)과 같다.
map_upper 메서드는 대각선을 기준으로 위쪽에 그릴 그래프를 지정한다.
반대로 map_lower 메서드는 대각선을 기준으로 아래쪽에 그릴 그래프를 지정한다.
이차원 밀집도를 대각선 기준 아래로 산점도 그래프를 위쪽에 그려보자.
pair_grid = sns.PairGrid(tips)
pair_grid = pair_grid.map_upper(sns.regplot)
pair_grid = pair_grid.map_lower(sns.kdeplot)
pair_grid = pair_grid.map_diag(sns.histplot, kde=True)
plt.show()

다변량 그래프 그리기
seaborn 라이브러리로 다변량 그래프를 그려보자.
바이올린 그래프 그리기
색상을 추가하여 바이올린 그래프를 그려보자. vilolinplor 메서드 hue 인잣값에 색상을 적용할 열 이름을 추가하면 된다.
ax = plt.subplots()
ax = sns.violinplot(x='time', y='total_bill', hue='sex', data=tips, split=True)

산점도, 관계 그래프 그리기
마찬가지로 hue 인잣값에 적용하면 된다.
scatter = sns.lmplot(x='total_bill', y='tip', data=tips, hue='sex', fit_reg=False)

fig = sns.pairplot(tips, hue='sex')

산점도 그래프의 크기와 모양을 조절해 보자.
scatter의 점 크기를 조절하려면 scatter_kws에 딕셔너리 형태로 인잣값을 전달하면 된다.
scatter = sns.lmplot(x='total_bill', y='tip', data=tips, fit_reg=False, hue='sex', scatter_kws={'s': 100})
plt.show()

만약 산점도의 점을 다른 기호로 표현하고 싶다면 markers 인잣값에 표현하고자 하는 기호를 리스트에 담아 전달하면 된다.
scatter = sns.lmplot(x='total_bill', y='tip', data=tips, fit_reg=False, hue='sex', markers=['o', 'x'],scatter_kws={'s': 50})
plt.show()

lmplot 메서드로 4개의 데이터 그룹 그리기
앤스콤 4분할 그래프를 한 번에 그리면 다음과 같이 그려진다.
anscombe_plot = sns.lmplot(x='x', y='y', data=anscombe, fit_reg=False)

이를 그룹별로 나누어 그리려면 col, col_wrap 인자를 설정하면 된다.
col_wrap 인자에는 그래프를 그릴 열의 최댓값을 지정하고 col 인자에는 데이터 그룹을 구분할 열을 지정하면 된다.
anscombe_plot = sns.lmplot(x='x', y='y', data=anscombe, fit_reg=False, col='dataset', col_wrap=2)

FacetGrid 클래스
lmplot과 비슷하게 그래프를 그리는 클래스이다.
facet = sns.FacetGrid(tips, col='time')
facet.map(sns.distplot, 'total_bill', rug=True)
객체를 생성하고 사용할 그래프와 x축으로 지정할 열을 순서대로 전달하면 그래프를 쉽게 그릴 수 있다.

(distplot은 이제 잘 사용하지 않는 클래스라고 한다.)
col과 비슷하게 row로 지정하여 그래프를 분할할 수 있다.
facet = sns.FacetGrid(tips, col='time', row='smoker', hue='sex')
facet.map(plt.scatter, 'total_bill', 'tip')

단변량 그래프 그리기 - 히스토그램
seaborn 라이브러리를 sns라고 하자.
import seaborn as sns
tips = sns.load_dataset("tips")
ax = plt.subplots()
ax = sns.distplot(tips['total_bill'])
ax.set_title('Total Bill Histogram with Density Plot')

subplots 메서드로 기본 틀을 만들고 distplot 메서드에 total_bill 열 데이터를 전달하여 히스토그램을 그릴 수 있다.
이때 distplot 메서드를 사용하면 히스토그램과 밀집도 그래프를 같이 그린다. 만약 밀집도 그래프를 제외하고 싶다면 kde 인잣값을 False로 설정하면 된다. 밀집도 그래프만 나타내고 싶다면 hist 인자를 False로 지정하면 된다.
실무 환경에서는 데이터 시각화를 더 효율적으로 하기 위해 여러 그래프를 한 번에 출력하는 경우가 많다한다.
히스토그램과 밀집도를 그리는 distplot 메서드에 rug인자를 추가하여 그래프를 그려보자.
ax = plt.subplot()
ax = sns.distplot(tips['total_bill'], rug=True)
ax.set_title('Total Bill Histogram with Density and Rug Plot')
ax.set_xlabel('Total Bill')

count 그래프 그리기
이번에는 count 그래프를 그려보자. count 그래프는 이산값을 나타낸 그래프이다.
countplot 메서드를 사용하면 된다.
plot1 = plt.figure()
ax1 = plot1.add_subplot(1, 1, 1)
ax1 = sns.countplot('day', data=tips)
ax1.set_title('Count of days')
ax1.set_xlabel('Day of the Week')
ax1.set_ylabel('Frequency')

산점도 그래프 그리기
seaborn 라이브러리는 matplot 라이브러리보다 다양한 방법으로 산점도 그래프를 그릴 수 있다.
산점도 그래프는 regplot 메서드를 사용해서 그릴 수 있다.
plot2 = plt.figure()
ax1 = plot2.add_subplot(1, 1, 1)
ax1 = sns.regplot(x='total_bill', y='tip', data=tips)
ax1.set_title('Scatterplot of Total Bill and Tip')
ax1.set_xlabel('Total Bill')
ax1.set_ylabel('Tip')

만약 회귀선을 제거하려면 fit_reg 인자를 False로 지정하면 된다.
산점도 그래프 & 히스토그램 그리기
산점도 그래프와 히스토그램을 한 번에 그려주는 jointplot 메서드를 사용해보자.
joint = sns.jointplot(x='total_bill', y='tip', data=tips)
joint.set_axis_labels(xlabel='Total Bill', ylabel='Tip')
joint.fig.suptitle('Joint Plot of Total Bill and Tip', fontsize=10, y=1.03)

산점도 그래프는 점이 겹쳐 보일 경우 점을 구분하기 어렵다. 만약 산점도 그래프의 데이터를 구분하기 쉽게 그리고 싶다면 육각 그래프(hexbin)를 사용하면 된다. jointplot 메서드의 kind 인잣값을 hex로 지정하면 된다.
joint = sns.jointplot(x='total_bill', y='tip', data=tips, kind="hex")
joint.set_axis_labels(xlabel='Total Bill', ylabel='Tip')
joint.fig.suptitle('Joint Plot of Total Bill and Tip', fontsize=10, y=1.03)

데이터의 개수가 많아지면 점점 진한 색으로 표현된다.
이차원 밀집도 그리기
이차원 밀집도를 그려보자. kdeplot 메서드로 만들 수 있다.
다음은 total_bill, tip 열 데이터를 전달하여 이차원 밀집도를 그린 것이다. shade 인잣값을 Ture로 지정하면 음영 효과를 줄 수 있다.
plot3 = plt.figure()
ax = plot3.add_subplot(1, 1, 1)
ax = sns.kdeplot(data=tips['total_bill'],
data2=tips['tip'],
shade=True)
ax.set_title('Kernel Density Plot of Total Bill and Tip')
ax.set_xlabel('Total Bill')
ax.set_ylabel('Tip')

바 그래프 그리기
바 그래프를 그려보자. 바 그래프는 지정한 변수의 평균을 계산하여 그릴 수 있다.
plot4 = plt.figure()
ax = plot4.add_subplot(1, 1, 1)
ax = sns.barplot(x='time', y='total_bill', data=tips)
ax.set_title('Bar Plot of average Total Bill fot time of day')
ax.set_xlabel('Time of day')
ax.set_ylabel('Average total bill')

박스 그래프 그리기
박스 그래프는 최솟값, 1분위수, 중간값, 3분위수, 최댓값, 이상치 등 다양한 통계량을 한 번에 표현하는 그래프이다.
plot5 = plt.figure()
ax = plot5.add_subplot(1, 1, 1)
ax = sns.boxplot(x='time', y='total_bill', data=tips)
ax.set_title('BoxPlot of Total bill by time of day')
ax.set_xlabel('Time of day')
ax.set_ylabel('Average total bill')

박스 그래프는 다양한 통계 수치를 확인하기 위해 자주 사용하는 그래프지만 데이터 분산이 모호하게 표현된다.
이런 경우에는 박스 그래프에 커널 밀도를 추정한 바이올린 그래프를 사용하면 된다.
violinplot 메서드를 사용하여 그리면 된다.
plot6 = plt.figure()
ax = plot6.add_subplot(1, 1, 1)
ax = sns.violinplot(x='time', y='total_bill', data=tips)
ax.set_title('BoxPlot of Total bill by time of day')
ax.set_xlabel('Time of day')
ax.set_ylabel('Average total bill')

관계 그래프 그리기
지금까지 드린 그래프들을 종합한 그래프라고 생각하면 된다. pairplot 메서드에 데이터프레임을 넣으면 된다.
fig = sns.pairplot(tips)


이때 관계 그래프는 중복된 정보가 표현된다는 단점이 있다.
관계 그래프의 절반(대각선 위)은 나머지 절반(대각선 아래)과 같다.
map_upper 메서드는 대각선을 기준으로 위쪽에 그릴 그래프를 지정한다.
반대로 map_lower 메서드는 대각선을 기준으로 아래쪽에 그릴 그래프를 지정한다.
이차원 밀집도를 대각선 기준 아래로 산점도 그래프를 위쪽에 그려보자.
pair_grid = sns.PairGrid(tips)
pair_grid = pair_grid.map_upper(sns.regplot)
pair_grid = pair_grid.map_lower(sns.kdeplot)
pair_grid = pair_grid.map_diag(sns.histplot, kde=True)
plt.show()

다변량 그래프 그리기
seaborn 라이브러리로 다변량 그래프를 그려보자.
바이올린 그래프 그리기
색상을 추가하여 바이올린 그래프를 그려보자. vilolinplor 메서드 hue 인잣값에 색상을 적용할 열 이름을 추가하면 된다.
ax = plt.subplots()
ax = sns.violinplot(x='time', y='total_bill', hue='sex', data=tips, split=True)

산점도, 관계 그래프 그리기
마찬가지로 hue 인잣값에 적용하면 된다.
scatter = sns.lmplot(x='total_bill', y='tip', data=tips, hue='sex', fit_reg=False)

fig = sns.pairplot(tips, hue='sex')

산점도 그래프의 크기와 모양을 조절해 보자.
scatter의 점 크기를 조절하려면 scatter_kws에 딕셔너리 형태로 인잣값을 전달하면 된다.
scatter = sns.lmplot(x='total_bill', y='tip', data=tips, fit_reg=False, hue='sex', scatter_kws={'s': 100})
plt.show()

만약 산점도의 점을 다른 기호로 표현하고 싶다면 markers 인잣값에 표현하고자 하는 기호를 리스트에 담아 전달하면 된다.
scatter = sns.lmplot(x='total_bill', y='tip', data=tips, fit_reg=False, hue='sex', markers=['o', 'x'],scatter_kws={'s': 50})
plt.show()

lmplot 메서드로 4개의 데이터 그룹 그리기
앤스콤 4분할 그래프를 한 번에 그리면 다음과 같이 그려진다.
anscombe_plot = sns.lmplot(x='x', y='y', data=anscombe, fit_reg=False)

이를 그룹별로 나누어 그리려면 col, col_wrap 인자를 설정하면 된다.
col_wrap 인자에는 그래프를 그릴 열의 최댓값을 지정하고 col 인자에는 데이터 그룹을 구분할 열을 지정하면 된다.
anscombe_plot = sns.lmplot(x='x', y='y', data=anscombe, fit_reg=False, col='dataset', col_wrap=2)

FacetGrid 클래스
lmplot과 비슷하게 그래프를 그리는 클래스이다.
facet = sns.FacetGrid(tips, col='time')
facet.map(sns.distplot, 'total_bill', rug=True)
객체를 생성하고 사용할 그래프와 x축으로 지정할 열을 순서대로 전달하면 그래프를 쉽게 그릴 수 있다.

(distplot은 이제 잘 사용하지 않는 클래스라고 한다.)
col과 비슷하게 row로 지정하여 그래프를 분할할 수 있다.
facet = sns.FacetGrid(tips, col='time', row='smoker', hue='sex')
facet.map(plt.scatter, 'total_bill', 'tip')
