도찐개찐

[데이터분석] 08. 박스플롯 본문

PYTHON/데이터분석

[데이터분석] 08. 박스플롯

도개진 2023. 1. 2. 13:02
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

박스플롯

  • box-and-whisker plot (상자수염 그래프)
  • 데이터의 대략적인 분포와 개별적인 이상치들을 동시에 보여줄 수 있으며
  • 서로 다른 데이터 뭉치를 쉽게 비교할 수 있도록 도와주는 시각화 기법
  • 통계학자 존 튜키(John Tukey)가 1977년 저서 "탐색적 데이터 분석(Exploratory Data Analysis)"에서 처음 제시
  • 범위 막대에서는 수염의 양 끝이 최대값최소값을 나타내고,
  • 상자는 사분위수범위를 나타내며, 상자 안에 중앙값을 표현하는 방식으로 "5가지 요약 수치" 를 표현
  • boxplot(값, 옵션)
kings = [73,62,45,53,38,16,51,28,37,30,56,30,33,56,
         66,54,40,33,59,36,82,48,44,22,32,67,52]
# pandas 객체로 수치요약
kings = pd.DataFrame({'kings':kings})
kings.describe()
  kings
count 27.000000
mean 46.037037
std 16.173296
min 16.000000
25% 33.000000
50% 45.000000
75% 56.000000
max 82.000000
# 박스 플롯 시각화
# boxplot(대상)
plt.boxplot(kings)
plt.show()

# 박스 플롯 시각화
# boxplot(대상, 옵션)
# 박스 왼쪽 라인 1분위, 빨간중 중앙값, 오른쪽 라인 4분위
plt.boxplot(kings, vert=False)
# plt.show()
{'whiskers': [<matplotlib.lines.Line2D at 0x7fdf22c7d2e0>,
  <matplotlib.lines.Line2D at 0x7fdf22c7d5e0>],
 'caps': [<matplotlib.lines.Line2D at 0x7fdf22c7d970>,
  <matplotlib.lines.Line2D at 0x7fdf22c7dfd0>],
 'boxes': [<matplotlib.lines.Line2D at 0x7fdf22c7d520>],
 'medians': [<matplotlib.lines.Line2D at 0x7fdf22c7d100>],
 'fliers': [<matplotlib.lines.Line2D at 0x7fdf22cab9d0>],
 'means': []}

박스플롯의 여러 속성 출력

  • median
  • whisker
  • flier
# 박스 플롯 시각화
# boxplot(대상, 옵션)
# 박스 왼쪽 라인 1분위, 빨간중 중앙값, 오른쪽 라인 4분위
box = plt.boxplot(kings)
medians = [v.get_ydata() for v in box['medians']]
print(medians[0][0]) # 중앙값

whiskers = [v.get_ydata() for v in box['whiskers']]
print(whiskers[0][1], whiskers[0][0]) # 최소값, 1사분위값
print(whiskers[1][1], whiskers[1][0]) # 최대값, 3사분위값

fliers = [v.get_ydata() for v in box['fliers']]
print(fliers[0]) # 이상치 현재 데이터 값없음
45.0
16.0 33.0
82.0 56.0
[]

seaborn 으로 상자수염 그래프 시각화

  • boxplot(x, data)
sns.boxplot(x='kings', data=kings)
plt.show()

iris 데이터 시각화

iris = sns.load_dataset('iris')
iris.info()
# plt.boxplot(iris.sepal_length)
# plt.boxplot(iris.sepal_width)
# plt.boxplot(iris.petal_length)
# plt.boxplot(iris.petal_width)
plt.boxplot(iris[['sepal_length', 'sepal_width']])
plt.show()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   sepal_length  150 non-null    float64
 1   sepal_width   150 non-null    float64
 2   petal_length  150 non-null    float64
 3   petal_width   150 non-null    float64
 4   species       150 non-null    object 
dtypes: float64(4), object(1)
memory usage: 6.0+ KB

sns.boxplot(iris)
plt.show()

titanic 데이터 시각화

titanic = sns.load_dataset('titanic')
# 결측치 처리전
sns.boxplot(data=titanic[['age', 'fare']])
<AxesSubplot:>

# 결측치 처리전
plt.boxplot(titanic[['age', 'fare']])
plt.show()

# 나이 결측치 확인 값이 null 인경우 출력 안됨 현상 0으로 변경
titanic.age = titanic.age.fillna(0)
# 결측치 처리 후
plt.boxplot(titanic[['age', 'fare']])
plt.show()

# 결측치 처리 후
sns.boxplot(data=titanic[['age', 'fare']])
plt.show()

tips 데이터 시각화

tips = sns.load_dataset('tips')
plt.boxplot(tips[['total_bill', 'tip']])
plt.show()

728x90
Comments