Untitled

0. 개요

최근 빅데이터, 데이터 시각화, 데이터 분석 같은 단어가 많이 사용되고 있습니다.

개인적으로 처음엔 해당 분야를 잘 모르고 단어들도 잘 와닿지 않았기에 뜬구름 잡는 소리 같았습니다.

알고 보니 정말 재밌는 분야길래 간단하게 실습 과정을 정리해 봤습니다.

유명한 데이터셋인 보스턴 집값 정보를 가지고 실습해 봅시다.

실습은 모두 google colab에서 파이썬을 사용해 진행하였습니다.


1. 보스턴 주택 가격 데이터(Boston Housing Price)

1) 데이터 설명

1978년 D. 해리슨(D. Harrison)과 D. L. 루빈펠드(D. L. Rubinfeld)가 수집한 보스턴시의 주택 가격에 대한 데이터입니다.

당시 보스턴 주택의 여러가지 요건들과 가격 정보들이 포함되어 있습니다.

총 506개의 데이터가 있고 각 데이터는 다양한 정보가 있는 14개의 필드로 이뤄져 있습니다.

요약하자면, 어떤 요소가 집값에 영향을 미칠지 알아보기 위해 만들어진 데이터입니다.

2) 데이터 필드


2. 데이터셋 불러오기

pandas를 이용해 집값 정보가 담긴 CSV 파일을 불러옵니다.

import pandas as pd

# URL에서 데이터 불러오기
url = "<https://raw.githubusercontent.com/rasbt/python-machine-learning-book-3rd-edition/master/ch10/housing.data.txt>"
df = pd.read_csv(filepath_or_buffer=url, header=None, sep="\\s+")

# 필드명 지정
df.columns = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']

# 데이터셋 보기
print(df.shape)
df

스크린샷 2023-05-20 오후 4.49.30.png


3. 데이터 시각화

몇 가지 예시를 통해 보스턴 주택 데이터를 분석해 봅시다.

1) 필드별 분산 확인

import seaborn as sns
import matplotlib.pyplot as plt

# LSTAT 필드의 분산을 히스토그램으로 표시
sns.histplot(data=df, x='LSTAT')
plt.show()

Untitled

LSTAT은 인구 중 하위 계층의 비율을 나타내는 필드입니다.

이 값이 높을수록 해당 지역의 주민 중 저소득 계층이 많다는 것을 의미합니다.

즉, LSTAT 값을 통해 해당 지역의 전반적인 경제 상태를 알 수 있겠죠?

위 히스토그램을 보면 데이터셋에 있는 집은 저소득 계층이 20% 미만인 지역의 데이터가 많다는 것을 알 수 있습니다.

당시 보스턴에는 저소득 계층이 많은 지역은 그렇지 않은 지역보다 적었다고도 유추할 수 있습니다.

# INDUS 필드의 분산을 히스토그램으로 표시
sns.histplot(data=df, x='INDUS')
plt.show()

Untitled

INDUS는 비소매 상업용지(사무실, 제조업 등)의 비율을 나타내는 필드로, 주택이 있는 지역에 존재하는 상업적 사용을 위한 토지의 비율을 측정한 데이터입니다.

일반적으로 비소매 상업용지가 많은 지역은 주거용 부동산 가격에 부정적인 영향을 미칠 수 있습니다.

주변에 사무실이나 제조업 공장이 많은 지역을 생각해 보면, 소음이나 공해 때문에 주거하기에는 적합하지 않겠죠?

히스토그램을 보면 보스턴은 주거 건물의 비중이 높으나, 상업에 특화된 지구 또한 존재한다는 점을 확인할 수 있습니다.


2) 두 필드 간의 관계 확인

위에서 확인한 두 필드(LSTAT, INDUS)에 대해 나름대로 추측을 해봅시다.

  1. **LSTAT(하위 계층 비율)**이 높은 지역은 비싼 집을 살 능력이 있는 사람이 적을 테니, 집값이 낮을 것 같습니다.
  2. **INDUS(상업 용지 비율)**이 높은 지역은 주거하기에 좋은 환경이 아니니, 집값이 낮을 것 같습니다.

이제 실제 MEDV(주택 가격) 필드와 관계를 확인하여 추측이 맞는지 확인해 봅시다.

# LSTAT 필드와 MEDV 필드의 관계 확인
sns.scatterplot(data=df, x="LSTAT", y="MEDV")
plt.show()

Untitled

우선 LSTAT 필드입니다.

x축(하위 계층 비율)이 증가할수록 y축(주택 가격)이 떨어지는 경향이 보입니다.

하위 계층 비율은 주택 가격에 영향을 미친다고 해석할 수 있겠네요!

# INDUS 필드와 MEDV 필드의 관계 확인
sns.scatterplot(data=df, x="INDUS", y="MEDV")
plt.show()

Untitled

이번에는 INDUS 필드입니다.

x축(상업 용지 비율) 또한 증가할수록 y축(주택 가격)이 떨어지는 경향이 보입니다.

하지만 방금 살펴본 LSTAT(하위 계층 비율) 필드만큼 드라마틱한 경향을 보여주진 않네요.

상업 용지 비율은 주택 가격에 어느 정도 영향을 미친다고 볼 수 있을 것 같습니다.


3) 여러 필드 간의 관계 확인

이렇게 두 필드 간의 관계를 통해 많은 내용을 해석해 낼 수 있습니다.

이번에는 한 번에 여러 필드 사이의 관계를 확인해 봅시다.

# 각 필드 간의 관계를 하나의 이미지에 표시
cols = ['LSTAT', 'INDUS', 'NOX', 'RM', 'MEDV']

sns.pairplot(data=df, x_vars=cols, y_vars=cols)
plt.tight_layout()
plt.show()

Untitled

어떤 그래프는 뚜렷한 관계가 보이기도 하고, 어떤 그래프는 딱히 관계가 없어 보이는 모양이기도 합니다.

이렇게 데이터를 시각화하여 필드 간의 관계를 해석하기 좋게 만들 수 있습니다.


4) 필드 간의 상관관계(correlation) 표시

지금까지는 그래프의 모양만을 보며 ‘대충 관계가 있어 보이네’하고 추측만 했습니다.

이런 상관관계 정도를 수치로 볼 수 있으면 좋겠죠?

heatmap을 이용해 필드 간의 상관관계를 수치화해 봅시다.

# 상관관계 행렬 생성
# 소수점 둘째 자리까지만 표시
correlation_matrix = df.corr().round(2)

# 이미지 크기 지정
plt.figure(figsize=(20,10))

# 상관관계 행렬 표시
sns.heatmap(data=correlation_matrix, annot=True)
plt.show()

Untitled

상관관계를 표시한 숫자를 보면 -1.0부터 1.0까지 다양하게 분포해 있습니다.

그렇다면 숫자가 낮을수록 서로 상관이 없는 항목일까요?

Untitled

RM(주택 하나당 평균 방의 개수)와 MEDV(주택 가격)의 그래프입니다.

방의 개수가 증가할수록 주택 가격 또한 증가하는 양의 상관관계를 가지고 있죠.

heatmap 상에서도 0.7이라는 높은 수치를 보여주고 있습니다.

Untitled

이전에 살펴봤던 LSTAT(하위 계층 비율)과 MEDV(주택 가격)의 그래프입니다.

하위 계층 비율이 증가할수록 주택가격은 떨어지는 음의 상관관계를 가지고 있습니다.

heatmap 상에서는 -0.74라는 상당히 낮은 수치를 보여주고 있습니다.

위 예시에서 알 수 있듯, 상관관계를 나타낸 숫자는 절댓값이 높을수록 높은 상관관계를 가지고 있다고 볼 수 있습니다.

절댓값이 0에 가깝다면, 둘은 별로 관계가 없는 데이터로 해석할 수 있습니다.


4. 마치며

주어진 데이터셋을 가지고 보기 좋게 그래프를 그리고, 각 필드에 대해 분석해 보았습니다.

이 과정을 통해 데이터 속에 숨겨진 정보를 많이 찾을 수 있었습니다.

여러분도 여러 가지 데이터로 다양한 시도를 해보셨으면 좋겠네요!


참고 자료

[데이터셋] Boston Housing Price (보스턴 주택 가격 데이터)

Pattern Recognition and Machine Learning - Microsoft Research