인공지능 및 데이터과학/데이터분석 & 통계

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

Steve Jang 2022. 1. 12. 14:45

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

 

원래 통계 기법은 R이 상징적인 언어였으나 최근에는 데이터 분석을 하는 사람들이 굳이 R로 하지 않고 파이썬에서 하는 경우가 많아졌다.

 

히스토그램용 데이터 가져오기 (housing dataset)

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())

위와 같이 info와 head로 데이터의 정보를 보면

 

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

10개의 컬럼이 있고, 데이터가 어떻게 들어가 있는지 알 수 있다. 

 

housing column info

longitude 위도
latitude 경도
housing_median_age 주택 나이 중앙값(median)
total_rooms 전체 방의 수
total_bedrooms 전체 침실 수
population 인구
households 가구
median_income 소득 중앙값
median_house_value 주택 가격 중앙값
ocean_proximity 바다 근접성

이제 이 10개의 컬럼을 각각 히스토그램으로 뿌려보는 작업을 진행해 보도록 한다.

 

 

Matplotlib 히스토그램

대표적으로 가장 많이 활용되는 Matplotlib 시각화 라이브러리를 활용하여, 히스토그램을 호출하는 방법을 사용하였다. 

 

import matplotlib.pyplot as plt

# histogram source
housing.hist(bins=50, figsize=(20,15))
plt.show()

 

bins 

그래프 개수
ex) bins=50

 

figsize

그래프의 크기
ex) figsize=(가로크기, 세로크기)

 

Housing dataset 출력 결과

pyplot으로 출력한 housing histogram

 

 

housing dataset의 히스토그램을 뽑아보았는데 컬럼이 총 10개인데 9개만 출력되는 이유는 ocean_proximity가 문자열로 되어 있기 때문이다.

 

longitude,latitude,housing_median_age,total_rooms,total_bedrooms,population,households,median_income,median_house_value,ocean_proximity
-122.23,37.88,41.0,880.0,129.0,322.0,126.0,8.3252,452600.0,NEAR BAY
-122.22,37.86,21.0,7099.0,1106.0,2401.0,1138.0,8.3014,358500.0,NEAR BAY
-122.24,37.85,52.0,1467.0,190.0,496.0,177.0,7.2574,352100.0,NEAR BAY
-122.25,37.85,52.0,1274.0,235.0,558.0,219.0,5.6431,341300.0,NEAR BAY

 

히스토그램은 연속될 수 있는 숫자만 출력할 수 있기 때문에 문자열인 바다 근접도는 출력이 되지 않고 출력이 가능한 것만 출력을 수행하였다.