14_Visualization_Matplotlib_Seaborn_1
import warnings
warnings.filterwarnings("ignore")
from IPython.display import Image
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.size"] = 10 # 글꼴 크기 설정
plt.rcParams["font.family"] = "NanumGothicCoding" # 글꼴 설정
import seaborn as sns
%matplotlib notebook
사람의 눈은 수백 줄의 텍스트만으로 이루어진 데이터를 읽거나 기초 통계 수치를 계산하는 방법으로는 데이터를 제대로 분석할 수 없기 때문에 데이터의 숨겨진 패턴을 파악하기 위해 데이터 시각화를 사용한다.
앤스콤 4분할 그래프 => 데이터를 시각화하지 않고 수치만 확인할 때 발생할 수 있는 함정을 보여주기 위해 만든 그래프
데이터 집합은 4개의 그룹으로 구성되어 있으며 4개의 데이터 그룹은 각각 평균, 분산과 같은 수치나 상관관계 회귀선이 모두 같다는 특징이 있다. 그래서 이런 결과먼 보면 4개의 데이터 그룹의 데이터는 모두 같을 것이다라고 착각할 수 있다.
# 앤스콤 데이터 집합은 seaborn 라이브러리에 포함되어 있다.
# seaborn 라이브러리의 load_dataset() 메소드의 인수로 "anscombe"을 전달하면 앤스콤 데이터 집합을 불러올 수 있다.
anscombe = sns.load_dataset("anscombe")
# print(anscombe)
print(anscombe[anscombe["dataset"] == "I"].mean())
print(anscombe[anscombe["dataset"] == "II"].mean())
print(anscombe[anscombe["dataset"] == "III"].mean())
print(anscombe[anscombe["dataset"] == "IV"].mean())
x 9.000000
y 7.500909
dtype: float64
x 9.000000
y 7.500909
dtype: float64
x 9.0
y 7.5
dtype: float64
x 9.000000
y 7.500909
dtype: float64
# 첫 번째 데이터 그룹을 추출한다.
dataset_1 = anscombe[anscombe["dataset"] == "I"]
# print(dataset_1)
# plot() 메소드로 선 그래프를 그린다. plot() 메소드에 x, y축 데이터를 전달하면 선 그래프가 나타난다.
plt.plot(dataset_1["x"], dataset_1["y"], "g")
<IPython.core.display.Javascript object>
[<matplotlib.lines.Line2D at 0x28fc6a28710>]
dataset_1 = anscombe[anscombe["dataset"] == "I"]
dataset_2 = anscombe[anscombe["dataset"] == "II"]
dataset_3 = anscombe[anscombe["dataset"] == "III"]
dataset_4 = anscombe[anscombe["dataset"] == "IV"]
# figure() 메소드로 전체 그래프가 그려질 기본 틀을 만든다.
fig = plt.figure()
# add_subplot() 메소드로 그래프 격자를 그린다.
axes1 = fig.add_subplot(2, 2, 1)
axes2 = fig.add_subplot(2, 2, 2)
axes3 = fig.add_subplot(2, 2, 3)
axes4 = fig.add_subplot(2, 2, 4)
# plot() 메소드로 격자에 데이터를 전달해 그래프를 그린다.
axes1.plot(dataset_1["x"], dataset_1["y"], "o")
axes2.plot(dataset_2["x"], dataset_2["y"], "o")
axes3.plot(dataset_3["x"], dataset_3["y"], "o")
axes4.plot(dataset_4["x"], dataset_4["y"], "o")
# set_title() 메소드로 각각의 그래프에 제목을 추한다.
axes1.set_title("dataset_1")
axes2.set_title("dataset_2")
axes3.set_title("dataset_3")
axes4.set_title("dataset_4")
# suptitle() 메소드로 그래프 전체 제목을 추가한다.
fig.suptitle("앤스콤 데이터")
# 그래프의 이름과 숫자가 겹쳐보이면 tight_layout() 메소드를 실행해서 그래프의 레이아웃을 조정한다.
fig.tight_layout()
<IPython.core.display.Javascript object>
matplotlib 사용하기
# seaborn 라이브러리의 tips 데이터 집합은 어떤 식당에서 팁을 지불한 손님들의 정보를 모아둔 것이다.
# tips 데이터 집합은 지불금액, 팁, 성별, 흡연여부, 요일, 전체인원 정보를 담고 있다.
tips = sns.load_dataset("tips")
print(type(tips))
print(tips.head())
<class 'pandas.core.frame.DataFrame'>
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
# 히스토그램은 데이터프레임의 열 데이터 분포와 빈도를 살펴보는 용도로 자주 사용하는 그래프이다.
fig = plt.figure() # 그래프가 위치할 기본 틀을 만든다.
axes1 = fig.add_subplot(1, 1, 1) # 그래프 격자를 그린다.
axes1.hist(tips["total_bill"]) # hist() 메소드로 히스토그램을 만들수 있다.
axes1.set_title("총 지불금액 히스토그램") # 그래프 제목을 넣는다.
axes1.set_xlabel("빈도수") # x축 제목을 넣는다.
axes1.set_ylabel("지불금액") # y축 제목을 넣는다.
<IPython.core.display.Javascript object>
Text(0, 0.5, '지불금액')
# 산점도 그래프는 변수 2개를 사용해서 만드는 그래프이며 변수 2개를 사용하기 때문에 통계 용어로 이변량 그래프라 부른다.
# total_bill 열에 따른 tip 열의 분포를 나타내는 산점도 그래프
# 기본 틀과 그래프 격자를 만들고 scatter() 메소드에 total_bill, tip 열을 전달하면 산점도 그래프가 만들어진다.
scatter_plot = plt.figure()
axes1 = scatter_plot.add_subplot(1, 1, 1)
axes1.scatter(tips["total_bill"], tips["tip"])
axes1.set_title("총 지불금액에 따른 팁 산점도 그래프")
axes1.set_xlabel("지불금액")
axes1.set_ylabel("팁")
<IPython.core.display.Javascript object>
Text(0, 0.5, '팁')
# 박스 그래프는 이산형 변수와 연속형 변수를 함께 사용하는 그래프이다.
# 이산형 변수란 Female, Male과 같이 명확하게 구분되는 값을 의미하고 연속형 변수란 tip과 같이 명확하게 셀 수 없는 범위의 값을
# 의미한다.
# boxplot() 메소드를 사용하면 박스 그래프를 그릴 수 있다.
boxplot = plt.figure()
axes1 = boxplot.add_subplot(1, 1, 1)
# 박스 그래프에 작성에 사용할 데이터는 리스트 형태로 넣어준다.
axes1.boxplot(
[tips[tips["sex"] == "Female"]["tip"], tips[tips["sex"] == "Male"]["tip"]],
labels = ["Female", "Male"]
)
axes1.set_title("성별에 따른 팁 박스 그래프")
axes1.set_xlabel("성별")
axes1.set_ylabel("팁")
<IPython.core.display.Javascript object>
Text(0, 0.5, '팁')
# 3개 이상의 변수를 사용하는 그래프를 다변량 그래프라 부른다.
# 산점도 그래프에 성별을 새 변수로 추가하고 색상으로 구분하면 적절할 것이다. Female, Male과 같은 문자열은 산점도 그래프의
# 색상을 지정하는 값으로 사용할 수 없기 때문에 0, 1과 같은 정수를 사용해야 한다.
# 여성(Female)인 경우 0을 반환하고 남성(Male)인 경우 1을 반환하는 함수를 만든다.
def record_sex(sex):
if sex == "Female":
return 0
else:
return 1
# record_sex() 함수가 반환하는 값을 데이터프레임에 추가한다.
# apply() 메소드를 사용해 sex열에 record_sex() 함수를 브로드캐스팅 한다.
# tips["sex"].apply(record_sex)의미는 tips 데이터프레임의 sex 열의 데이터를 record_sex() 함수로 전달해서 일괄적으로 함수를
# 실행한다.
tips["sex_color"] = tips["sex"].apply(record_sex)
print(tips.head())
total_bill tip sex smoker day time size sex_color
0 16.99 1.01 Female No Sun Dinner 2 0
1 10.34 1.66 Male No Sun Dinner 3 1
2 21.01 3.50 Male No Sun Dinner 3 1
3 23.68 3.31 Male No Sun Dinner 2 1
4 24.59 3.61 Female No Sun Dinner 4 0
scatter_plot = plt.figure()
axes1 = scatter_plot.add_subplot(1, 1, 1)
axes1.scatter(
x = tips["total_bill"], # 산점도 그래프의 x축으로 사용할 데이터
y = tips["tip"], # 산점도 그래프의 y축으로 사용할 데이터
c = tips["sex_color"], # Female, Male에 따른 데이터를 구별하는 색상
s = tips["size"] * 30, # 산점도 점의 크기
alpha = 0.5 # 선점도 점의 투명도
)
axes1.set_title("총 지불금액에 따른 팁 산점도 그래프")
axes1.set_xlabel("지불금액")
axes1.set_ylabel("팁")
<IPython.core.display.Javascript object>
Text(0, 0.5, '팁')
seaborn 사용하기
seaborn 라이브러리를 사용하면 matplotlib 보다 좀 더 화려한 그래프를 그릴 수 있다.
tips = sns.load_dataset("tips")
print(tips.head())
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
# seaborn 라이브러리로 히스토그램을 그리려면 subplots(), distplot() 메소드를 사용한다.
# 먼저 subplots() 메소드를 사용해 그래프의 기본 틀을 만들고 distplot() 메소드에 데이터를 전달하면 히스토그램을 그릴 수 있다.
ax = plt.subplots()
ax = sns.distplot(tips["total_bill"])
ax.set_title("지불 금액 히스토그램 밀도 그래프")
ax.set_xlabel("지불금액")
<IPython.core.display.Javascript object>
Text(0.5, 0, '지불금액')
# distplot() 메소드를 사용하면 히스토그램과 밀집도 그래프를 같이 그려준다.
# 밀집도 그래프는 주어진 데이터를 정규화시켜 넓이가 1이 되도록 그린 그래프를 말하며 밀집도 그래프를 제외하고 싶다면 distplot()
# 메소드의 kde 속성을 False로 설정하면 된다.
ax = plt.subplots()
ax = sns.distplot(tips["total_bill"], kde = False)
ax.set_title("지불 금액 히스토그램 그래프")
ax.set_xlabel("지불금액")
ax.set_ylabel("빈도수")
<IPython.core.display.Javascript object>
Text(0, 0.5, '빈도수')
# 밀집도 그래프만 나타내려면 distplot() 메소드의 hist 속성을 False로 지정하면 된다.
ax = plt.subplots()
ax = sns.distplot(tips["total_bill"], hist = False)
ax.set_title("지불 금액 밀도 그래프")
ax.set_xlabel("지불금액")
<IPython.core.display.Javascript object>
Text(0.5, 0, '지불금액')
# distplot() 메소드의 rug 속성에 True를 지정하면 그래프의 축에 동일한 길이의 직선을 붙여 데이터 밀집 정도를 표현한 양탄자
# 그래프를 추가로 나타낼 수 있다.
ax = plt.subplots()
ax = sns.distplot(tips["total_bill"], rug = True)
ax.set_title("지불 금액 히스토그램 밀도 그래프")
ax.set_xlabel("지불금액")
<IPython.core.display.Javascript object>
Text(0.5, 0, '지불금액')
# 히스토그램과 비슷하게 생긴 count 그래프는 이산값을 나타내는 그래프로 countplot() 메소드에 tips 데이터프레임의 day 열의
# 데이터를 넣어 count 그래프를 그린다.
ax = plt.subplots()
ax = sns.countplot(tips["day"]) # ax = sns.countplot("day", data = tips)
ax.set_title("요일의 개수 그래프")
ax.set_xlabel("요일")
ax.set_ylabel("빈도수")
<IPython.core.display.Javascript object>
Text(0, 0.5, '빈도수')
# seaborn 라이브러리는 matplotlib 라이브러리보다 다양한 방법으로 산점도 그래프를 그릴 수 있다.
# 산점도 그래프를 그리려면 seaborn 라이브러리의 regplot() 메소드를 사용한다.
# regplot() 메소드를 시용하면 산점도 그래프와 회귀선을 함께 그릴 수 있다.
ax = plt.subplots()
ax = sns.regplot(tips["total_bill"], tips["tip"])
# ax = sns.regplot(x = "total_bill", y = "tip", data = tips)
ax.set_title("지불금액과 팁의 산점도 그래프")
ax.set_xlabel("지불금액")
ax.set_ylabel("팁")
<IPython.core.display.Javascript object>
Text(0, 0.5, '팁')
ax = plt.subplots()
# 만약 산점도 그래프에서 회귀선을 제거하려면 fit_reg 속성을 False로 지정하면 된다.
ax = sns.regplot(tips["total_bill"], tips["tip"], fit_reg = False)
# ax = sns.regplot(x = "total_bill", y = "tip", data = tips, fit_reg = False)
ax.set_title("지불금액과 팁의 산점도 그래프")
ax.set_xlabel("지불금액")
ax.set_ylabel("팁")
<IPython.core.display.Javascript object>
Text(0, 0.5, '팁')
# 산점도 그래프와 히스토그램을 한 번에 그리려면 jointplot() 메소드를 사용해서 x, y 속성에 그래프로 표시하려는 열 이름을
# 지정하고 data 속성에 그래프로 표시할 데이터가 저장된 데이터프레임을 지정하면 된다.
joint = sns.jointplot(x = "total_bill", y = "tip", data = tips)
# fig.suptitle() 메소드로 그래프의 제목을 설정할 수 있고 fontsize 속성으로 글꼴 크기를 y 속성으로 제목이 표시될 위치를 지정할
# 수 있다.
joint.fig.suptitle("지불금액과 팁의 산점도 및 히스토그램", fontsize = 20, y = 0.95)
# set_axis_labels() 메소드로 x, y 축의 레이블을 설정할 수 있다.
joint.set_axis_labels(xlabel = "지불금액", ylabel = "팁")
<IPython.core.display.Javascript object>
<seaborn.axisgrid.JointGrid at 0x28fca231d30>
# 산점도는 점이 겹쳐 보일 경우 점을 구분하기 어렵다는 단점이 있다. 만약 산점도 그래프의 데이터를 구분하기 쉽게 그리고 싶다면
# 육각 그래프를 사용하면 된다.
# 육각 그래프는 2차원 표면에 육각형으로 데이터를 쌓아 표현하는 그래프로 jointplot() 메소드를 사용해 그리며 kind 옵션을 hex로
# 지정하면 된다.
joint = sns.jointplot(x = "total_bill", y = "tip", data = tips, kind = "hex")
joint.fig.suptitle("지불금액과 팁의 산점도 및 히스토그램", fontsize = 20, y = 0.95)
joint.set_axis_labels(xlabel = "지불금액", ylabel = "팁")
<IPython.core.display.Javascript object>
<seaborn.axisgrid.JointGrid at 0x28fca3173c8>
# 이차원 밀집도는 kdeplot() 메소드로 만들 수 있다.
# total_bill, tip 열 데이터로 이차원 밀집도 그래프를 그린다. data 속성과 data2 속성에 차트를 구성할 데이터를 지정해야 한다.
# kdeplot() 메소드의 shade 속성을 True로 설정하면 그래프에 음영 효과를 줄 수 있다.
ax = plt.subplots()
ax = sns.kdeplot(data = tips["total_bill"], data2 = tips["tip"], shade = True)
ax.set_title("지불금액과 빈도수의 이차원 밀집도 그래프")
ax.set_xlabel("지불금액")
ax.set_ylabel("빈도수")
<IPython.core.display.Javascript object>
Text(0, 0.5, '빈도수')
댓글남기기