•데이터의 빈도수 및 분포를 알아보기 위해 작성하는 그래프 •카테고리별 개수를 막대로 나타내는 막대그래프와 달리, 정해진 구간별 빈도수를 막대로 나타내어 분포를 볼 수 있는 통계분석 도구임
plt.hist()
sns.histplot()
0️⃣ 패키지 & 데이터프레임 불러오기
예시가 될 데이터셋은 Kaggle에서 가져온 Flight Price Prediction 입니다.
# 패키지 불러오기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 데이터셋 불러오기
df = pd.read_csv('./Clean_Dataset.csv', encoding='cp949')
df = df.drop([df.columns[0]], axis=1)
1️⃣-1. plt 히스토그램 그리기 :: plt.hist
히스토그램 생성: plt.hist(데이터셋)
간단하게 데이터셋만 넣어줘도, 구간은 자동으로 정해져서 생성됩니다. 그냥 생성해봤더니 10개로 나눠졌네요. 아래에서 구간개수를 좀더 늘려보겠습니다.
# 차트 영역 지정하기
plt.figure()
# 히스토그램 그리기 : duration(비행시간)의 빈도수 및 분포
plt.hist(df['duration'])
# 차트 표시하기
plt.show()
1️⃣-2. plt 히스토그램 커스터마이징
계급 개수 지정: plt.hist(x=데이터셋, bins=계급개수, ...)
x,y축 간격 지정: plt.xticks(범위), plt.yticks(범위)
구간별 빈도수 및 구간 출력: 히스토그램을 변수 하나에 저장하고, 해당 변수 출력하기 (아래 코드에서 histogram)
# 차트 영역 지정하기
plt.figure()
# 차트에서 한글 표시하기
plt.rcParams['font.family'] = "NanumBarunGothic"
plt.rcParams['axes.unicode_minus'] = False
# 눈금선 추가하기
plt.grid(linewidth = '0.5')
# 히스토그램 생성하기
histogram = plt.hist(
x = df['duration'], # 데이터 지정
bins = 20, # 계급을 20개 구간으로 나눔
color = 'salmon' # 색상 지정
)
# x,y축 간격 지정하기
plt.xticks(np.arange(0,50,5))
plt.yticks(np.arange(0,45000,5000))
# x,y축 이름 정하기
plt.xlabel('비행 시간 (duration)')
plt.ylabel('비행편 개수 (flights)')
# 차트 표시하기
plt.show()
# 구간별 빈도수, 구간 확인하기
histogram
계급구간을 20개로 나눠서 그려봤는데요, 구간 10개일 때 뭉뚱그려져 있던 데이터 분포를 더 상세하게 볼 수 있습니다.
생각보다 비행시간 3시간 이하 구간에 많이 몰려있었고, 긴 비행 중에서는 22~25시간이 비교적 많은 편이었네요.
2️⃣. sns 히스토그램 그리기 :: sns.histplot
seaborn으로 히스토그램을 그리면, 보다 다양한 요소들을 커스텀할 수 있습니다.
아래처럼 구간 범위를 직접 지정할 수 있고, KDE(커널밀도 추정지) 그래프를 추가할 수도 있습니다.
# 그래프 크기 및 한글출력 설정
sns.set_theme(
style = 'ticks',
font = 'NanumBarunGothic',
rc = {'figure.figsize' : (12,6),
'axes.unicode_minus' : False}
)
# 히스토그램 생성
histogram1 = sns.histplot(
data=df, x='duration', # 데이터 지정
bins=20, binrange=(0,50), # 계급 개수 20개, 범위는 0~50으로 지정
kde=True, # 커널 밀도 그래프 추가
color='darkorange' # 색상 지정
)
# 축 범위, 축 이름, 그래프 제목 지정하기
histogram1.set(
xlabel = '비행시간 (duration)',
ylabel = '도수 (count)',
title = '비행시간 히스토그램'
)
# y축 눈금 설정하기
histogram1.set_xticks(np.arange(0,50,5))
# 계급구간별 도수 표시하기
for i in histogram1.containers:
histogram1.bar_label(i, fontsize=9)