[데이터분석] 파이썬(Python) 산점도(Scatter) 사용하기

    산점도(Scatter)는 공간 데이터에서 분포를 알아야 할 때 유용하게 사용될 수 있다. 대표적으로 지리적 데이터인 부동산 데이터로 전국에 있는 인구 분포나 지역별 집값 등을 알기에도 유용하다. 본 포스팅은 미국의 지리 데이터세트인 캘리포니아 주택 가격 Data Set을 사용하여 산점도를 구하는 시각화(Visualization) 기법을 알아보도록 한다.

     

    [데이터분석] 파이썬(Python) 산점도(Scatter) 사용하기


    데이터 준비

    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 0.1 (좌), Alpha 0.5 (우)

     

    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) 사용하기

     

    [Visualization] Python 히스토그램(histogram) 사용하기

    데이터 분석을 해야 하거나 할 줄 아는 사람이라면 처음에 데이터의 형태를 파악해야 할텐데 히스토그램(Histogram)은 데이터의 분포도를 볼 때 매우 유용한 통계 시각화 기법이다. 원래 통계 기법

    needjarvis.tistory.com

     

    참고자료

    [1] matplotlib - matplotlib.pyplot.plot

    [2] Hands-On Machine Learning with Scikit-learn, Keras & TensorFlow

    댓글

    Designed by JB FACTORY