4. 그래프 그리기¶
수백 줄의 텍스트만으로 이루어진 데이터를 읽거나 기초 통계 수치를 계산하는 방법으로는 데이터를 제대로 분석할 수 없습니다. 사람의 눈은 한 번에 볼 수 있는 양이 정해져 있기 때문이죠. 이런 경우에는 데이터를 시각화해야 합니다. 보통 실무에서는 데이터의 숨겨진 패턴을 파악하기 위해 데이터 시각화를 많이 사용합니다. 그러면 판다스를 활용한 데이터 시각화가 무엇인지 자세히 알아볼까요?
- 4-1 데이터 시각화가 필요한 이유
4-2 matplotlib 라이브러리 자유자재로 사용하기
4-3 seaborn 라이버르러리 자유자재로 사용하기
4-4 데이터프레임과 시리즈로 그래프 그리기
4-5 seaborn 라이브러리로 그래프 스타일 설정하기
4-1 데이터 시각화가 필요한 이유¶
앤스콤 4분할 그래프 살펴보기¶
데이터 시각화를 보여주는 전형적인 사례로 앤스콤 4분할 그래프가 있습니다. 이 그래프는 영국의 프랭크 앤스콤이 데이터를 시각화하지 않고 수치만 확인할 때 발생할 수 있는 함정을 보여주기 위해 만든 그래프입니다. 그러면 앤스콤이 지적한 '함정'이란 무엇일까요?
앤스콤 4분할 그래프를 구성하는 데이터 집합은 4개의 그룹으로 구성되어 있으며 모든 데이터 그룹은 x,y 열을 가지고 있습니다. 그런데 이 4개의 데이터 그룹은 각각 평균, 분산과 같은 수칫값이나 상관관계, 회귀선이 같다는 특징이 있습니다. 그래서 이런 결과만 보고 '데이터 그룹 1,2,3,4의 데이터는 모두 같을 것이다' 라고 착각할 수 있습니다. 바로 이것이 앤스콤이 지적한 '함정' 입니다. 하지만 각 데이터 그룹을 시각화하면 데이트 그룹이 서로 다른 데이터 패턴을 가지고 있다는 점을 금방 알 수 있습니다. 이런 점에서 데이터 시각화는 데이터 분석 분야에서 아주 중요한 요소라고 할 수 있습니다. 그러면 데이터 시각화란 무엇인지 직접 실습하며 알아보겠습니다.
import seaborn as sns
anscombe = sns.load_dataset("anscombe")
print(anscombe)
print(type(anscombe))
dataset x y 0 I 10.0 8.04 1 I 8.0 6.95 2 I 13.0 7.58 3 I 9.0 8.81 4 I 11.0 8.33 5 I 14.0 9.96 6 I 6.0 7.24 7 I 4.0 4.26 8 I 12.0 10.84 9 I 7.0 4.82 10 I 5.0 5.68 11 II 10.0 9.14 12 II 8.0 8.14 13 II 13.0 8.74 14 II 9.0 8.77 15 II 11.0 9.26 16 II 14.0 8.10 17 II 6.0 6.13 18 II 4.0 3.10 19 II 12.0 9.13 20 II 7.0 7.26 21 II 5.0 4.74 22 III 10.0 7.46 23 III 8.0 6.77 24 III 13.0 12.74 25 III 9.0 7.11 26 III 11.0 7.81 27 III 14.0 8.84 28 III 6.0 6.08 29 III 4.0 5.39 30 III 12.0 8.15 31 III 7.0 6.42 32 III 5.0 5.73 33 IV 8.0 6.58 34 IV 8.0 5.76 35 IV 8.0 7.71 36 IV 8.0 8.84 37 IV 8.0 8.47 38 IV 8.0 7.04 39 IV 8.0 5.25 40 IV 19.0 12.50 41 IV 8.0 5.56 42 IV 8.0 7.91 43 IV 8.0 6.89 <class 'pandas.core.frame.DataFrame'>
2. matplotlib 라이브러리로 그래프 그리기¶
앤스콤 데이터 집합을 잘 불러왔나요? 데이터 집합이 준비되었으면 이제 그래프로 시각화를 하면 됩니다. 이 책에서는 그래프를 그리기 위해 matplotlib 라이브러리를 사용합니다. 먼저 그래프를 그리기 위해 matplotlib 라이브러리를 불러오겠습니다.
%matplotlib notebook
import matplotlib.pyplot as plt
3.¶
다음은 anscombe 데이터프레임의 dataset 열에서 데이터 값이 I인 것만 추출한 것입니다. 즉, 첫 번째 데이터 그룹을 추출한 것입니다.
dataset_1 = anscombe[anscombe['dataset'] == 'I']
4.¶
선 그래프는 plot 메서드로 그릴 수 있습니다. plot 메서드에 x,y축 데이터를 전달하면 선 그래프가 나타납니다. 앞에서 준비한 dataset_1의 x,y열을 전달하세요.
plt.plot(dataset_1['x'], dataset_1['y'])
[<matplotlib.lines.Line2D at 0x7fb5cc68af60>]
5.¶
plot 메서드는 기본적으로 선으로 그래프를 그립니다. 만약 점으로 그래프를 그리려면 o를 세 번째 인자로 전달하면 됩니다.
plt.plot(dataset_1['x'], dataset_1['y'], 'o')
[<matplotlib.lines.Line2D at 0x7fb5c4147ac8>]
앤스콤 데이터 집합 모두 사용해 그래프 만들기¶
앤스콤 데이터 집합은 4개의 데이터 그룹으로 구성되어 있으며 각 데이터 그룹의 차이를 파악하려면 그래프로 시각화해야 한다고 했습니다. 이번에는 모든 데이터 그룹에 대하여 그래프를 그려보겠습니다.
matplotlib 라이브러리로 그래프 그리기¶
- 전체 그래프가 위치할 기본 틀을 만듭니다.
- 그래프를 그려 넣을 그래프 격차를 만듭니다.
- 그런 다음 격자에 그래프를 하나씩 추가합니다. 격자에 그래프가 추가되는 순서는 왼쪽에서 오른쪽 방향입니다.
- 만약 격자의 첫 번째 행이 꽉 차면 두번째 행에 그래프를 그려 넣습니다.
한 번에 4개의 그래프 그리기¶
1. 앤스콤 데이터프레임의 dataset 열의 값이 I,II,III,IV 인것을 불린 추출하여 dataset_1,2,3,4에 저장합니다.¶
dataset_2 = anscombe[anscombe['dataset']=='II']
dataset_3 = anscombe[anscombe['dataset']=='III']
dataset_4 = anscombe[anscombe['dataset']=='IV']
2. 먼저 그래프 격자가 위치할 기본 틀을 만듭니다.¶
fig = plt.figure()
3.¶
그런 다음 add_subplot 메서드로 그래프 격자를 그립니다. 기본 틀(fig)에 격자를 추가한다는 기분으로 add_subplot 메서드를 사용하면 됩니다. 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)
4.¶
이제 plot 메서드에 데이터를 전달하여 그래프를 그리면 됩니다. 이번에는 점으로 그래프를 표현했습니다. 그래프를 확인하려면 fig를 반드시 입력해야 합니다.
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')
fig
5.¶
각각의 그래프를 쉽게 구분할 수 있도록 그래프 격자에 제목을 추가해 볼까요? set _title 메서드로 그래프 이름을 전달하면 그래프 격자에 제목이 추가됩니다.
axes1.set_title("dataset_1")
axes2.set_title("dataset_2")
axes3.set_title("dataset_3")
axes4.set_title("dataset_4")
fig
6.¶
기본 틀 (fig) 에도 제목을 추가해 볼까요? suptitle 메서드를 사용하면 됩니다.
fig.suptitle("Anscombe Data")
fig
7.¶
그런데 과정 5,6의 그래프를 보면 각 그래프의 이름과 숫자가 겹쳐 보입니다. 이런 경우에는 tight_layout 메서드를 호출하여 각 그래프의 레이아웃을 조절할 수 있습니다.
fig.tight_layout()
fig
평균, 분산, 상관관계, 회귀선의 통계 수치가 같아도 그래프의 형태는 다를 수 있습니다. 앤스콤 4분할 그래프는 데이터 분석 시 수치에만 의존하면 잘못된 판단을 할 수 있다는 것을 알려주는 좋은 예시입니다.¶
tips = sns.load_dataset("tips")
print(tips.head())
print(type(tips))
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 <class 'pandas.core.frame.DataFrame'>
2.¶
히스토그램은 데이터프레임의 열 데이터 분포와 빈도를 살펴보는 용도로 자주 사용하는 그래프입니다. 이때 데이터프레임의 total_bill,tip 등의 열을 변수라고 부르기도 합니다. 그리고 변수를 하나만 사용해서 그린 그래프를 '일변량 그래프'라고 부릅니다.
3.¶
기본 틀(fig)을 마련하고 그래프 격자(axes1)를 구성하는 것까지는 앞으로 진행한 실습과 동일합니다.
fig = plt.figure()
axes1 = fig.add_subplot(1,1,1)
4.¶
hist 메서드에 total_bill 열을 전달하면 히스토그램이 만들어집니다. 이때 x축의 간격은 bins 인잣값으로 조정할 수 있습니다. bins 인잣값을 10으로 지정하면 x축의 간격을 10으로 조정할 수 있습니다. 나머지는 그래프의 제목과 x,y 축의 제목을 추가하는 코드입니다.
axes1.hist(tips['total_bill'], bins = 10)
axes1.set_title('Histogram of total Bill')
axes1.set_xlabel('Frequency')
axes1.set_ylabel('Total Bill')
fig
5. 산점도 그래프¶
산점도 그래프는 변수 2개를 사용해서 만드는 그래프이며 변수 2개를 사용하기 때문에 통계 용어로 '이변령 그래프'라고 부릅니다. 다음은 total_bill 열에 따른 tip 열의 분포를 나타낸 산점도 그래프입니다.
6.¶
기본 틀과 그래프 격자를 만들고 scatter 메서드에 total_bill, tips 열을 전달하면 산점도 그래프가 나타납니다.
scatter_plot = plt.figure()
axes1 = scatter_plot.add_subplot(1,1,1)
axes1.scatter(tips['total_bill'], tips['tip'])
axes1.set_title('Scatterplot of Total Bill vs Tip')
axes1.set_xlabel('Total Bill')
axes1.set_ylabel('Tip')
Text(0, 0.5, 'Tip')
7.¶
이번에는 박스 그래프를 그려보겠습니다. 박스 그래프는 이산형 변수와 연속형 변수를 함께 사용하는 그래프 입니다. 이상형 변수랑 Female,Male 과같이 명확하게 구분되는 값을 의미하고, 연속형 변수란 Tip과 같이 명확하게 셀 수 없는 범위의 값을 의미합니다.
8.¶
boxplot 메서드를 사용하면 박스 그래프를 그릴 수 있습니다. boxplot 메서드의 첫 번째 인자로 전달하는 값이 조금 복잡해 보이죠? tips 데이터프레임에서 성별이 Female인 데이터와 Male인 데이터에서 tip 열 데이터만 추출하여 리스트에 담아 전달한 것입니다. 두번째 인자에는 labels 인잣값으로 성별을 구분하기 위한 이름을 추가합니다.'
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_xlabel('Sex')
axes1.set_ylabel('Tip')
axes1.set_title('Boxplot of Tips by Sex')
Text(0.5, 1.0, 'Boxplot of Tips by Sex')
다변량 그래프 그리기¶
앞에서 2개의 변수를 사용한 그래프를 이변령 그래프라고 했습니다. 그러면 3개 이상의 변수를 사용한 그래프는 무엇이라고 할까요? 바로 '다변령 그래프'라고 부릅니다. 그러면 다변령 그래프가 왜 필요할까요? 이번에는 다변량 그래프가 왜 필요한지 알아보겠습니다.
필요한 이유?
앞에서는 지불 금액(total_bill)과 팁(tip)만을 사용하여 산점도 그래프를 그렸습니다. 만약 여기에 성별을 추가하여 산점도 그래프를 표현하려면 어떻게 해야 할까요? 점의 색상을 다르게 하면 됩니다. 만약 식사 비용을 추가한다면 점의 크기를 다르게 하는 방법으로 산점도 그래프를 표현할 수 있습니다. 이렇게 3개 이상의 변수를 사용하는 다변령 그래프는 적재적소에 맞는 그래프 요소를 추가하여 그래프를 표현해야 합니다.
다변령 데이터로 다변량 그래프 그리기 -- 산점도 그래프¶
1.¶
앞에서 실습한 산점도 그래프(scatter_plot)에 성별을 새 변수로 추가해 보겠습니다. 성별은 산점도 그래프에서 색상으로 구분하면 적당합니다. 하지만 Female, Male과 같은 문자열은 산점도 그래프의 색상을 지정하는 값으로 사용할 수 없습니다. 0, 1과 같은 정수를 사용해야 합니다. 따라서 각 문자열을 정수로 치환하는 함수를 만들어야 합니다. 다음은 여성(Female)인 경우 0을 반환하고 남성(Male)인 경우 1을 반환하는 함수입니다.
def recode_sex(sex):
if sex == 'Female':
return 0
else:
return 1
2.¶
이제 recode_sex 메서드가 반환한 값(0,1)을 데이터프레임에 추가하면 됩니다. 다음은 recode_sex 함수가 반환한 값(0,1)을 데이터 프레임에 sex_color 열을 새로 생성하여 추가한 것입니다. 이때 sex 열에 recode_sex 함수를 브로드캐스팅하기 위하여 apply 메서드를 사용했습니다.
tips['sex_color'] = tips['sex'].apply(recode_sex)
3.¶
그래프를 그리는 김에 테이블당 인원 수(size)도 산점도 그래프에 추가해 볼까요? 테이블당 인원 수는 점의 크기로 표현하면 적당합니다. 다음은 scatter 메서드에 s,c 인잣값으로 테이블당 인원 수와 성별의 치환값을 전달한 것입니다.
scatter_plot = plt.figure()
axes1 = scatter_plot.add_subplot(1,1,1)
axes1.scatter(
x=tips['total_bill'],
y=tips['tip'],
s=tips['size'] * 10,
c=tips['sex_color'],
alpha=0.5)
axes1.set_title('Total Bill vs Tip Colored by Sex and Sized by Size')
axes1.set_xlabel('Total Bill')
axes1.set_ylabel('Tip')
Text(0, 0.5, 'Tip')
4-3 seaborn 라이브러리 자유자재로 사용하기¶
04-2에서는 seaborn 라이브러리의 tips 데이터 집합만 사용했지만 이번에는 seaborn 라이브러리 자체를 활용하여 그래프도 그려보겠습니다.seaborn 라이브러리를 활용하면 matplotlib보다 좀더 화려한 그래프를 그릴 수 있습니다.
import seaborn as sns
tips = sns.load_dataset("tips")
2.¶
seaborn 라이브러리로 히스토그램을 그리려면 subplots, distplot 메서드를 사용하면됩니다. 먼저 subplots 메서드로 기본 틀을 만들고 distplot 메서드에 total_bill 열 데이터를 전달하면 히스토그램을 그릴 수 있습니다.
ax = plt.subplots()
ax = sns.distplot(tips['total_bill'])
ax.set_title('Total Bill Histogram with Density Plot')
/home/goldang/.local/lib/python3.6/site-packages/seaborn/distributions.py:2557: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms). warnings.warn(msg, FutureWarning)
Text(0.5, 1.0, 'Total Bill Histogram with Density Plot')
3.¶
이때 distplot 메서드를 사용하면 히스토그램과 밀집도 그래프를 같이 그립니다. 만약 밀집도 그래프를 제외하고 싶다면 kde 인잣값을 False로 설정하면 됩니다.
ax = plt.subplots()
ax = sns.distplot(tips['total_bill'], kde=False)
ax.set_title('Total Bill Histogram')
ax.set_xlabel('Total Bill')
ax.set_ylabel('Frequency')
/home/goldang/.local/lib/python3.6/site-packages/seaborn/distributions.py:2557: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms). warnings.warn(msg, FutureWarning)
Text(0, 0.5, 'Frequency')
4.¶
밀집도 그래프만 나타내려면 hist 인자를 False로 지정하면 됩니다.
ax = plt.subplots()
ax = sns.distplot(tips['total_bill'], hist = False)
ax.set_title('Total Bill Density')
ax.set_xlabel('Total Bill')
ax.set_ylabel('Unit Probability')
/home/goldang/.local/lib/python3.6/site-packages/seaborn/distributions.py:2557: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `kdeplot` (an axes-level function for kernel density plots). warnings.warn(msg, FutureWarning)
Text(0, 0.5, 'Unit Probability')
5.¶
실무 환경에서는 데이터 시각화를 더 효율적으로 하기 위해 여러 그래프를 한 번에 출력하는 경우가 많습니다. 다음은 히스토그램과 밀집도를 그리는 distplot 메서드에 rug 인자를 추가하여 양탄자(rug) 그래프까지 그린 것입니다.
ax = plt.subplots()
ax = sns.distplot(tips['total_bill'], rug= True)
ax.set_title('Total Bill Histogram with Density and Rug Plot')
ax.set_xlabel('Total Bill')
/home/goldang/.local/lib/python3.6/site-packages/seaborn/distributions.py:2557: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms). warnings.warn(msg, FutureWarning) /home/goldang/.local/lib/python3.6/site-packages/seaborn/distributions.py:2056: FutureWarning: The `axis` variable is no longer used and will be removed. Instead, assign variables directly to `x` or `y`. warnings.warn(msg, FutureWarning)
Text(0.5, 0, 'Total Bill')
6.¶
이번에는 히스토그램과 비슷하게 생긴 count 그래프를 그려보겠습니다. count 그래프는 이산값을 나타낸 그래프입니다. 다음은 countplot 메서드에 tips 데이터프레임의 day열 데이터를 넣어 count 그래프를 그린 것 입니다.
ax = plt.subplots()
ax = sns.countplot('day', data = tips)
ax.set_title('Count of day')
ax.set_xlabel('Day of the Week')
ax.set_ylabel('Frequency')
/home/goldang/.local/lib/python3.6/site-packages/seaborn/_decorators.py:43: FutureWarning: Pass the following variable as a keyword arg: x. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation. FutureWarning
Text(0, 0.5, 'Frequency')
ax = plt.subplots()
ax = sns.regplot(x='total_bill', y='tip', data=tips)
ax.set_title('Scatterplot of Total Bill and Tip')
ax.set_xlaber('Total Bill')
ax.set_ylaber('Tip')
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-29-4c65eed6f5b9> in <module> 2 ax = sns.regplot(x='total_bill', y='tip', data=tips) 3 ax.set_title('Scatterplot of Total Bill and Tip') ----> 4 ax.set_xlaber('Total Bill') 5 ax.set_ylaber('Tip') AttributeError: 'AxesSubplot' object has no attribute 'set_xlaber'
ax = plt.subplots()
ax = sns.regplot(x='total_bill', y='tip', data=tips, fit_reg=False)
ax.set_title('Scatterplot of Total Bill and Trip')
ax.set_xlabel('Total Bill')
ax.set_ylabel('Tip')
Text(0, 0.5, 'Tip')
2.¶
이번에는 산점도 그래프와 히스토그램을 한 번에 그려주는 jointplot 메서드를 사용해보겠습니다. x,y 인자에 원하는 열 이름을 지정하고 data 인잣값으로 데이터프레임을 지정하면 그래프를 그릴 수 있습니다.
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)
Text(0.5, 1.03, 'Joint Plot of Total Bill and Tip')
3.¶
산점도 그래프는 점이 겹쳐 보일 경우 점을 구분하기 어렵다는 단점이 있습니다. 만약 산점도 그래프의 데이터를 구분하기 쉽게 그리고 싶다면 육각 그래프를 사용하면 됩니다. 육각 그래프는 2차원 표면에 육각형으로 데이터를 쌓아 표현하는 그래프입니다. 그래서 특정 데이터의 개수가 많아지면 점점 진한 색으로 표현됩니다. 육각 그래프는 과정2에서 사용한 jointplot 메서드를 그대로 사용합니다. 대신 kind 인잣값을 hex로 지정하면 됩니다.
hexbin = sns.jointplot(x="total_bill", y="tip", data=tips, kind="hex")
hexbin.set_axis_labels(xlabel = 'Total Bill', ylabel = 'Tip')
hexbin.fig.suptitle('Hexbin Joint Plot of Plot Total Bill and Tip',fontsize = 10, y=1.03)
Text(0.5, 1.03, 'Hexbin Joint Plot of Plot Total Bill and Tip')
4. 이차원 밀집도 그리기¶
이번에는 이차원 밀집도를 그려볼까요? 이차원 밀집도는 kedplot 메서드로 만들 수 있습니다. 다음은 totall_bill, tip 열 데이터를 전달하여 이차원 밀집도를 그린 것입니다. 이때 shade 인잣값을 True로 지정하면 그래프에 음영 효과를 줄 수 있습니다.
ax = plt.subplots()
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')
/home/goldang/.local/lib/python3.6/site-packages/seaborn/distributions.py:1639: FutureWarning: Use `x` and `y` rather than `data` `and `data2` warnings.warn(msg, FutureWarning)
Text(0, 0.5, 'Tip')
5. 바 그래프 그리기¶
이번에는 바 그래프를 그려보겠습니다. 바 그래프는 지정한 변수의 평균을 계산하여 그릴 수 있습니다. 다음은 시간에 따라 지불한 비용의 평균을 바 그래프로 나타낸 것입니다.
ax = plt.subplots()
ax = sns.barplot(x='time', y='total_bill', data=tips)
ax.set_title('Bar plot of average total bill for time of day')
ax.set_xlabel('Time of day')
ax.set_ylabel('Average total bill')
Text(0, 0.5, 'Average total bill')
6. 박스 그래프 그리기¶
박스 그래프도 그려보겠습니다. 박스 그래프는 최솟값, 1분위수, 중간값, 3분위수, 최댓값, 이상치 등 다양한 통계량을 한 번에 표현하는 그래프입니다.
ax = plt.subplots()
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('Total Bill')
Text(0, 0.5, 'Total Bill')
7.¶
박스 그래프는 다양한 통계 수치를 확인하기 위해 자주 사용하는 그래프지만 데이터 분산이 모호하게 표현됩니다. 이런 경우에는 박스 그래프에 커널 밀도를 추정한 바이올린 그래프를 사용하면 됩니다. 쉽게 말해 과정6 의 박스 형태를 바이올린 형태로 바꾸면 바이올린 그래프가 됩니다.바이올린 그래프는 violinplot 메서드를 사용하여 그릴 수 있습니다.
ax = plt.subplots()
ax = sns.violinplot(x='time', y='total_bill', data=tips)
ax.set_title('Violin plot of total bill by time of day')
ax.set_xlabel('Time of day')
ax.set_ylabel('Total Bill')
Text(0, 0.5, 'Total Bill')
8. 관계 그래프 그리기¶
마지막으로 관계 그래프를 그려보겠습니다. 관계 그래프는 지금까지 설명한 그래프를 종합한 그래프라고 생각하면 됩니다. 관계 그래프는 pairplot 메서드에 데이터프레임을 넣는 방법으로 간단하게 그릴 수 있습니다.
fig = sns.pairplot(tips)
9.¶
이때 관계 그래프는 중복된 정보가 표현된다는 단점이 있습니다. 즉, 관계 그래프의 절반은 나머지 절반과 같습니다. 이런 경우에는 중복된 그래프가 그려지는 위치를 직접 지정하여 원하는 그래프로 교체하면 됩니다. map_upper 메서드는 대각선을 기주으로 위쪽에 그릴 그래프를 지정합니다. 반대로 map_lower 메서드는 대각선을 기준으로 아래쪽에 그릴 그래프를 지정합니다. map_diag는 대각선을 중심으로 그래프를 그립니다. 다음은 이차원 밀집도를 대각선 기준으로 아래쪽에,산점도 그래프는 대각선 기준으로 위쪽에 그린 것입니다. 히스토그램과 밀집도는 대각선을 중심으로 그려집니다.
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.distplot, rug = True)
plt.show()
/home/goldang/.local/lib/python3.6/site-packages/seaborn/axisgrid.py:1186: RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (`matplotlib.pyplot.figure`) are retained until explicitly closed and may consume too much memory. (To control this warning, see the rcParam `figure.max_open_warning`). squeeze=False)
/home/goldang/.local/lib/python3.6/site-packages/seaborn/distributions.py:2557: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms). warnings.warn(msg, FutureWarning) /home/goldang/.local/lib/python3.6/site-packages/seaborn/distributions.py:2056: FutureWarning: The `axis` variable is no longer used and will be removed. Instead, assign variables directly to `x` or `y`. warnings.warn(msg, FutureWarning) /home/goldang/.local/lib/python3.6/site-packages/seaborn/distributions.py:2557: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms). warnings.warn(msg, FutureWarning) /home/goldang/.local/lib/python3.6/site-packages/seaborn/distributions.py:2056: FutureWarning: The `axis` variable is no longer used and will be removed. Instead, assign variables directly to `x` or `y`. warnings.warn(msg, FutureWarning) /home/goldang/.local/lib/python3.6/site-packages/seaborn/distributions.py:2557: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms). warnings.warn(msg, FutureWarning) /home/goldang/.local/lib/python3.6/site-packages/seaborn/distributions.py:2056: FutureWarning: The `axis` variable is no longer used and will be removed. Instead, assign variables directly to `x` or `y`. warnings.warn(msg, FutureWarning)
다변량 그래프 그리기¶
matplotlib 라이브러리로 다변량 그래프를 그렸던 것을 기억하나요? 이번에는 seaborn 라이브러리로 다변량 그래프를 그려보겠습니다.
1. seaborn 라이브러리로 바이올린 그래프 그리기 - 색상 추가¶
먼저 바이올린 그래프를 그리되 그래프의 색상을 추가하겠습니다. 색상을 추가하는 방법은 아주 간단합니다. violinplot 메서드에 hue 인잣값으로 색상에 사용할 열 이름을 추가 하면됩니다.
ax = plt.subplots()
ax = sns.violinplot(x='time', y='total_bill', hue='sex', data=tips, split=True)
2. 산점도, 관계 그래프 그리기 - 색상추가¶
산점도 그래프, 관계 그래프를 그리는 경우에도 마찬가지 방법으로 색상을 추가할 수 있습니다.
scatter = sns.lmplot(x='total_bill', y='tip', data=tips, hue='sex', fit_reg=False)
fig = sns.pairplot(tips, hue='sex')
4. 산점도 그래프의 크기와 모양 조절하기¶
다음은 산점도 그래프의 점 크기를 조절하여 표현한 것입니다. 산점도 그래프의 점 크기를 조절하려면 scatter_kws에 딕셔너리 형태로 인잣값을 전달하면 됩니다. 여기서는 크기만 조절하기 위해 's':tips['size']를 딕셔너리에 담아 전달했습니다.
scatter = sns.lmplot(x='total_bill', y='tip', data=tips, fit_reg=False, hue='sex')
scatter = sns.lmplot(x = 'total_bill', y = 'tip', data = tips, fit_reg = False, hue='sex',
markers=['o', 'x'])
5. lmplot 메서드로 4개의 데이터 그룹에 대한 그래프 한 번에 그리기¶
다음은 앤스콤 4분할 그래프를 lmplot 메서드로 그린 것입니다. x와 y 인자에는 앤스콤 데이터 집합의 x,y 열을 전달하고 data 인자에는 데이터프레임을 전달했습니다. 그런데 그래프를 자세히 살펴보면 4개의 데이터 그룹이 한꺼번에 산점도 그래프로 그려진것을 알 수 있습니다. 그룹별로 그래프를 나누어 그리려면 어떻게 해야 할까요?
anscombe_plot = sns.lmplot(x='x',y='y',data=anscombe, fit_reg=False)
6.¶
그룹별로 그래프를 나누어 그리려면 lmplot 메서드에 추가로 col,col_warp 인자를 설정해야 합니다. 다음은 lmport 메서드를 사용해 데이터 그룹별로 그래프를 그린 것입니다.col_wrap 인자에는 그래프를 그릴 열의 최댓값을 지정하고 col 인자에는 데이터 그룹을 구분할 열(dataset)을 지정했습니다.
anscombe_plot = sns.lmplot(x='x', y='y', data = anscombe, fit_reg= False,
col='dataset', col_wrap=2)
'Do it 판다스 입문' 카테고리의 다른 글
Do it pandas Chapter 6. 누락값 처리하기 (0) | 2021.03.28 |
---|---|
Do it pandas Chapter 5. 데이터 연결하기 (0) | 2021.03.26 |
Do it pandas Chapter 4. 그래프 그리기 (이어서) (0) | 2021.03.25 |
Do it Pandas Chapter 2. 판다스 시작하기 (0) | 2021.03.22 |
Do it padas Chapter 3. 판다스 데이터프레임과 시리즈 (0) | 2021.03.22 |