사분위 범위(IQR)
사분위수(Quartile)
값을 같은 개수로 4개로 나눈 각각의 값
1사분위수(Q1)
25th Percentile
2사분위수(Q2)
Median(중앙값), 50th Percentile
3사분위수(Q3)
75th Percentile
사분위간 범위(Interquartile Range, IQR)
Q3 - Q1
Maximum
Q3 + 1.5 * IQR
Minimum
Q1 - 1.5 * IQR
Outliers
Minimum 보다 작거나
Maximum보다 큰 값
예시 1
A 마을의 나이가 다음과 같다고 가정해 보자.
1사분위수(Q1) | 25th Percentile → 35 |
2사분위수(Q2) | Median(중앙값), 50th Percentile-> 47 |
3사분위수(Q3) | 75th Percentile → 80 |
사분위간 범위(Interquartile Range, IQR) | Q3 - Q1 -> 45 |
Maximum | Q3 + 1.5* IQR → 80 + 1.5 * 45 = 147.5 |
Minimum | Q1 - 1.5 * IQR → 35-1.5*45 = -32.5 |
Outliers | • Minimum 보다 작거나 • Maximum 보다 큰 값 |
변동계수
변동계수
- 상대적으로 얼마나 변동이 많은지를 보기 위한 지표
- 단위가 다르거나, 표준편차가 비슷한 그룹끼리 비교하고 싶을 때 일정한 기준에 따른 비교가 가능하다.
변동계수(CV) = 표준편차 / 평균
[A회사] 평균 매출액 : 100억, 표준 편차 : 12억
[B회사] 평균 매출액 : 40억, 표준 편차 : 2억
[A 회사] CV: 12억 / 100억 = 0.12
[B 회사] CV: 2억 / 40억 = 0.05
B회사보다 A회사가 크게 변동했다. A회사가 더 불안정하다는 뜻이다.
왜도와 첨도
왜도 (Skewness)
- 분포의 비대칭도를 나타내는 통계량
- 비대칭이 커질수록 왜도의 절댓값은 증가
- 일반적으로 왜도가 -1~+1 범위는 치우침이 없는 데이터라고 한다.
첨도 (Kurtosis)
- 꼬리 부분의 길이와 중앙 부분의 뾰족함으로 데이터의 분포를 알 수 있음
- Mesokurtic : 정규 분포 모양
- Leptokurtic : 중앙 부분은 Mesokurtic보다 높고 뾰족하기 때문에 이상치(outlier)가 많을 수 있음
- Platykurtic : Leptokurtic와 반대, 이상치(outlier)가 없음, 데이터 다시 확인 필요
이산화 진행할 경우
* 왜도가 작은 경우, |왜도| < 1의 경우, Equal Width Binning(동일 너비 분할) 사용
* 왜도가 큰 경우, |왜도| > 1의 경우, Equal Frequency Binning(동일 빈도 분할) 사용
이후에 나오는 코드는 이전 글과 이어지니 이전글을 읽고 오면 좋을 것 같다.
분산, 표준편차
표준편차가 클수록 평균이랑 데이터들이 멀리 떨어져 있다.라고 이해하면 된다.
df.describe()
분산
import numpy
val = df['사고건수']
var = numpy.var(val)
var
>>> 9.052115794766637
표준편차
std = math.sqrt(var)
std
>>> 3.008673427736323
다른 방법도 있다.
std = numpy.std(val)
std
년, 월 기준으로 표준편차를 구하려고 하면 다음과 같다.
pd.DataFrame(df.groupby('ym').사고건수.std()).reset_index()
boxplot
describe에서 나오는 min, max값은 실제로 데이터의 최솟값과 최댓값이다.
우리가 25%, 50%, 75% 사분위에서 말하는 min(Q1 - 1.5 * IQR), max(Q1 + 1.5 * IQR) 값과는 다른 값이다.
- 25%: Q1
- 50%: Q2
- 75%: Q3
boxplot 그리기
boxplot으로 쉽게 그래프를 살펴보자
plt.boxplot(df['사고건수'])
plt.show()
중앙값이 3으로 잘 나오고, 75%에 해당하는 값은 5, 25%에 해당하는 값으로는 1로 잘 나오고 있다. 해당 그림에서 max값을 넘어간 값은 이상치값이라고 표현되고, min값은 25%와 동일한 1로 나와있다.
그래프 두 개 그리기
그래프를 두개 동시에 그릴 수 도 있다.
fig, ax = plt.subplots()
ax.boxplot([df['사고건수'], df['중상자수']])
plt.show()
위 그래프의 순서를 조금 바꿔주자.
그래프 순서 바꾸기
fig, ax = plt.subplots()
ax.boxplot([df['사고건수'], df['중상자수']])
plt.title('2020년 사고건수, 중상자수 Boxplot')
plt.xticks([1,2], ['사고건수', '중상자수'])
plt.show()
그래프를 분석해 보자면, 사고건수가 굉장히 넓게 분포되어 있다. 그리고 사고건수의 중앙값은 중상자수의 중앙값보다 크다. 중상자수의 최솟값과 25% 값이 동일하다. 그리고 outliers도 조금 타이트하다.
시도 별 분포
이제 시도 별로 분포를 확인해 보자.
sns.boxplot(x='시도', y='사고건수', data=df)
plt.show()
이제 hue를 ym으로 줘서 그려보자
sns.boxplot(x='시도', y='사고건수', hue='ym', data=df)
plt.show()
그 외 다양한 그래프
이 외에도 굉장히 다양한 그래프 분포를 시각화할 수 있다.
위 그래프 같은 경우에는 강원도는 아마 최빈값이 1로 나올 테고 제주는 아마 고르게 분포되어 있을 거란 게 예상이 되는 그래프다.
'EDA' 카테고리의 다른 글
Pandas를 이용한 기초 통계 계산 (1) (0) | 2024.08.26 |
---|---|
[넷플릭스 데이터 분석 - 3] 넷플릭스 데이터 시각화(수치 시각화, 워드 클라우드) (5) | 2024.08.05 |
[넷플릭스 데이터 분석 - 2] Feature Engineering (0) | 2024.08.05 |
[넷플릭스 데이터 분석 - 1] 결측치 처리 (0) | 2024.08.05 |