데이터 시각화
데이터 시각화를 보여주는 전형적인 사례로 앤스콤 4분할 그래프(Anscombe's quartet)가 있다.
영국의 프랭크 앤스콤이 데이터를 시각화하지 않고 수치만 확일할 때 발생할 수 있는 함정을 보여주기 위해 만든 그래프이다.
앤스콤이 지적한 함정과 데이터 시각화의 필요성
앤스콤 4분할 그래프를 구성하는 데이터 집합은 4개의 그룹으로 구성되어 있으며 모든 데이터 그룹은 x, y 열을 가지고 있다. 그런데 이 4개의 데이터 그룹은 각각 평균, 분산과 같은 수칫값이나 상관관계, 회귀선이 같다는 특징이 있다.
그래서 이런 결과만 보고 '데이터 그룹 1, 2, 3, 4의 데이터는 모두 같을 것이다'라고 착가할 수 있다.
바로 이것이 앤스콤이 지적한 '함정'이다. 하지만 각 데이터 그룹을 시각화하면 데이터 그룹이 서로 다른 데이터 패턴을 가지고 있다는 점을 금방 알 수 있다.
데이터를 시각화하여 분석해보자.
앤스콤 데이터 집합 불러오기
import seaborn as sns
anscombe = sns.load_dataset("anscombe")
print(anscombe)
print(type(anscombe))
seaborn 라이브러리의 load_dataset 메서드에 문자열 anscombe을 전달하여 앤스콤 데이터 집합을 불러올 수 있다.
matplotlib 라이브러리로 그래프 그리기
%matplotlib notebook
import matplotlib.pyplot as plt
dataset_1 = anscombe[anscombe['dataset'] == 'I']
anscombe 데이터프레임의 dataset 열에서 데이터 값이 I인 것만 추출한다.
plt.plot(dataset_1['x'], dataset_1['y'])
선 그래프는 plot 메서드로 그릴 수 있다. plot 메서드에 x, y축 데이터를 전달하면 선 그래프가 나타난다.
만약 점으로 그래프를 그리려면 'o'를 세 번째 인자로 전달하면 된다.
plt.plot(dataset_1['x'], dataset_1['y'], 'o')
앤스콤 데이터 집합 모두 사용해 그래프 만들기
앤스콤 데이터 집합은 4개의 데이터 그룹으로 구성되어 있으며 각 데이터 그룹의 차이를 파악하려면 그래프로 시각화해야 한다.
dataset_2 = anscombe[anscombe['dataset'] == 'II']
dataset_3 = anscombe[anscombe['dataset'] == 'III']
dataset_4 = anscombe[anscombe['dataset'] == 'IV']
2~4번의 dataset을 준비한다.
기본 틀을 만든다.
fig = plt.figure()
그런 다음 add_subplot 메서드로 그래프 격자를 그린다. 기본 틀에 격자를 추가한다는 기분으로 add_subplot 메서드를 사용하면 된다. add_subplot의 첫 번째 인자에는 그래프 기본 틀의 행 크기를, 두 번째 인자에는 그래프 기본 틀의 열 크기를 지정한다.
fig = plt.figure()
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)
이제 데이터를 추가하면 된다.
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
그래프를 확인하려면 fig를 반드시 입력해야 한다.
그래프 격자에 제목을 추가해 보자. set_title메서드로 그래프 이름을 설정할 수 있다.
axes1.set_title("dataset_1")
axes2.set_title("dataset_2")
axes3.set_title("dataset_3")
axes4.set_title("dataset_4")
fig
기본 틀에도 제목을 추가할 수 있다. suptitle메서드를 사용하면 된다.
fig.suptitle("Anscombe Data")
fig
그래프의 이름과 숫자가 겹쳐 보인다. 이를 해결하려면 tight_layout 메서드를 호출하여 각 그래프의 레이아웃을 조절할 수 있다.
fig.tight_layout()
fig