산점도(Scatter)는 공간 데이터에서 분포를 알아야 할 때 유용하게 사용될 수 있다. 대표적으로 지리적 데이터인 부동산 데이터로 전국에 있는 인구 분포나 지역별 집값 등을 알기에도 유용하다. 본 포스팅은 미국의 지리 데이터세트인 캘리포니아 주택 가격 Data Set을 사용하여 산점도를 구하는 시각화(Visualization) 기법을 알아보도록 한다.
데이터 준비
Housing 데이터 로드
import os
import tarfile
import urllib.request as urllib
import pandas as pd
data_url = "https://raw.githubusercontent.com/ageron/handson-ml2/master/datasets/housing/housing.tgz"
data_path = os.path.join("datasets", "housing")
# 외부 url을 호출하여, housing data를 저장한다
def fetch_housing_data():
os.makedirs(data_path, exist_ok=True)
tgz_path = os.path.join(data_path, "housing.tgz")
urllib.urlretrieve(data_url, tgz_path)
housing_tgz = tarfile.open(tgz_path)
housing_tgz.extractall(path=data_path)
housing_tgz.close()
# housing 데이터를 판다스 형태로 읽는다
def load_housing_data():
csv_path = os.path.join(data_path, "housing.csv")
return pd.read_csv(csv_path)
fetch_housing_data()
housing = load_housing_data()
print(housing.info())
print(housing.head())
중간 데이터 결과
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20640 entries, 0 to 20639
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 longitude 20640 non-null float64
1 latitude 20640 non-null float64
2 housing_median_age 20640 non-null float64
3 total_rooms 20640 non-null float64
4 total_bedrooms 20433 non-null float64
5 population 20640 non-null float64
6 households 20640 non-null float64
7 median_income 20640 non-null float64
8 median_house_value 20640 non-null float64
9 ocean_proximity 20640 non-null object
dtypes: float64(9), object(1)
memory usage: 1.6+ MB
None
longitude latitude ... median_house_value ocean_proximity
0 -122.23 37.88 ... 452600.0 NEAR BAY
1 -122.22 37.86 ... 358500.0 NEAR BAY
2 -122.24 37.85 ... 352100.0 NEAR BAY
3 -122.25 37.85 ... 341300.0 NEAR BAY
4 -122.25 37.85 ... 342200.0 NEAR BAY
[5 rows x 10 columns]
산점도(Scatter) 구하기
# 산점도 시작
import matplotlib.pyplot as plt
housing.plot(kind='scatter', x='longitude', y='latitude')
plt.show()
판다스로 읽은 housing 데이터셋에 scatter를 사용한다고 설정을 하고 x 좌표에는 경도(longitude) 데이터를 사용하고 y 좌표에는 위도(latitude)를 사용한다고 세팅한다.
위 산점도를 보면 캘리포니아의 모습이 나타나게 된 것을 알 수 있다. 아래 지도는 실제 캘리포니아 지도이다.
캘리포니아의 지도 모습처럼 위도, 경도의 데이터를 뿌렸지만 현재 데이터로는 데이터 분포만 알 수 있고, 점이 모두 진하기 때문에 밀집에 대해서 알기 힘이 들 수 있다. 이를 위해 색상에 대한 투명도를 설정하여 밀집이 심한 구역과 덜 심한 구역을 알 수 있게 alpha 옵션을 추가한다.
투명도로 밀집 시각화
housing.plot(kind='scatter', x='longitude', y='latitude', alpha=0.1)
alpha의 값이 커질수록 더욱 짙은 점이 나타나게 되는데 데이터의 구분이 힘들어지기 힘들기 때문에 alpha를 0.1로 한다. 아래는 alpha 0.1과 0.5의 비교이다.
색상으로 가격 파악
1단계로는 단순히 동일한 크기의 점을 이용하여 분포를 알 수 있었고, 2단계로 투명도를 적용하여 밀집이 심한 곳에 대해서는 좀 더 진한 색상이 나오게 하였다. 이 데이터만으로 한 눈에 어느 지역에 사람들이 많이 거주하는지 알게 되었지만, 한가지 집값까지는 알기 힘들다.
물론 밀집 지역이 집값과 상관관계가 있을지 모르지만, 다른 인사이트가 나올 수 있기 때문에 주택 가격을 색상으로 출력해보도록 한다.
housing.plot(kind='scatter', x='longitude', y='latitude', alpha=0.1,
s=housing['population']/100, label='population', figsize=(10,7),
c='median_house_value', cmap=plt.get_cmap('jet'), colorbar=True)
최종 옵션 설명
옵션 | 설명 | 비고 |
kind | 차트의 종류 | |
x | x 좌표 값 | |
y | y 좌표 값 | |
alpha | 산점도의 투명화 | |
s | 값의 크기에 따른 원의 크기 | 인구를 원의 크기로 설정 |
label | 그래프 제목 | |
figsize | 산점도의 가로, 세로 크기 | 가로 10, 세로 7의 지도 크기 |
c | 색상 | 여기서는 가격으로 색상 |
cmap | 컬러맵 | jet라는 컬러맵 사용 |
colorbar | 컬러바 |
최종 결과로 나온 그림을 보면 해안가에 가까울 수록 가격(붉은색에 가까움)이 오르는 것을 알 수 있다.
이렇게 산점도로 데이터를 설정하게 되면, 캘리포니아 지역의 경우 해안가에 가까울수록 가격이 비싸다는 것을 알 수 있으며 어느 지역에 인구가 밀집되어 있는지 한눈에 쉽게 파악할 수 있다.
연관 포스팅
[Visualization] Python 히스토그램(histogram) 사용하기
참고자료
[1] matplotlib - matplotlib.pyplot.plot
[2] Hands-On Machine Learning with Scikit-learn, Keras & TensorFlow
'인공지능 및 데이터과학 > 데이터분석 & 통계' 카테고리의 다른 글
[데이터분석] 정보 이득(Information Gain) 이해하기(feat. 엔트로피) (0) | 2022.02.03 |
---|---|
[데이터분석] 엔트로피(Entropy) 이해하기 (0) | 2022.01.31 |
[Visualization] Python 히스토그램(histogram) 사용하기 (0) | 2022.01.12 |
[Python] 판다스(Pandas)로 데이터 확인 및 기초통계 하기 (0) | 2021.05.28 |
확률의 함정을 간파, 베이즈 정리(Bayes' Theorem) (2) | 2020.12.13 |