본문 바로가기
PROGRAMMING/PYTHON

[Python] 정규 분포, 확률 분포, 사분위 수

by 안녕나는현서 2021. 5. 10.
728x90

- 과거의 인공지능, 머신러닝 기반 시스템은 주로 확률과 관련 있었음

 

 

-통계학(Statistics) : 수치 데이터의 수집, 분석, 해석, 표현 등을 다루는 수학의 한 분야

통계학
기술 통계학 추론 통계학
연속형 데이터 범주형 데이터 단서 > 가설 설립/검정 > 문제 해결
일부 연령층, 일부 지역 주민, 혹은 무작위 선정 통해 표본 선정 > 통계분석 실시 > 모집합(전 국민)에 대한 결과 유추
- 가설 검정
- 수치로 되어있는 특징들 계산
- 각 데이터 간의 상관관계 분석
키/나이/가격 데이터 바탕으로 평균/표준편자와 같은 형식으로 요약 이름/종족/성별 데이터 바탕으로 빈도/백분율과 같은 자료 형식으로 요약

 

 

- 통계 모델링 : 데이터에 통계학을 적용하여 변수의 유의성을 분석함으로써 방대한 양의 데이터에 숨겨진 특징을 찾아내는 것을 의미

 

 

- 통계 모델(수학적 모델) : 변수들로 이루어진 수학 식이 있을 때, 이러한 수학 식을 계산해 실제 값을 추정하는 방법 (y=ax+b)

  • 통계 모델은 여러 개의 가정을 가지고 있는데, 이 가정들은 '확률분포'를 따름 → 가운데가 볼록한 형태의 대칭형 종모양 그래프(정규 분포; normal distribution - 직역하면 평균의 분포)

  • 모든 변수, 즉 데이터가 이러한 가정에 만족해야 하는 기본 가정으로 시작하며 이 조건이 만족할 떄만 모델의 성능이 통계학적으로 의미를 갖게 됨

 

- 확률 분포(probability distribution)

  • 최빈값 : 분포 상 가장 많은 빈도수를 가진 값
  • 중앙값 : 값들을 순서대로 나열했을 때 순서 상 중앙에 위치하는 값
  • 평균 : 값들의 무게중심이 어디인지를 나타내는 값, 일반적으로 산술평균을 칭함, 특이값의 영향을 크게 받음
  • 통계랑 수치들을 바탕으로 데이터의 분포 형태를 대략적으로 유추 가능

 

- 코드로 통계량 수치 확인하기

# 모듈 불러오기

import numpy as np
from scipy import stats


# 무작위 난수를 출력하더라도 같은 무작위 값을 얻도록 설정
# 0은 숫자의 의미보다는 실험을 위한 '통제 가능 제한적 공간'

np.random.seed(0)


# 분포를 이룰 무작위 데이터 생성: 0부터 100까지의 범위 안에서 10000개의 데이터를 무작위 추출

data_A = np.random.randint(0, 100, 10000)


# 각 평균, 중앙값, 최빈값 계산

mean = np.mean(data_A)
median = np.median(data_A)
mode = stats.mode(data_A)

print('평균값 : ', mean.round(2))
print('중앙값 : ', median)
print('최빈값 : {} ( {} )'.format(mode[0][0], mode[1][0])) # 최빈값(개수)

 

- 정규 분포 데이터 만들기

# 모듈 불러오기

import numpy as np
from scipy import stats


# 무작위 난수를 출력하더라도 같은 무작위 값을 얻도록 설정
# 0은 숫자의 의미보다는 실험을 위한 '통제 가능 제한적 공간'

np.random.seed(0)


# 정규분포 데이터 생성: 정규분포를 따르는 100개의 데이터 추출

data_B = np.random.normal(size = 100)


# 각 평균, 중앙값, 최빈값 계산

mean = np.mean(data_B)
median = np.median(data_B)
mode = stats.mode(data_B)

print('평균값 : ', mean.round(2))
print('중앙값 : ', median)
print('최빈값 : {} ( {} )'.format(mode[0][0], mode[1][0])) # 최빈값(개수)

 

- 변량의 측정

  • 변량 : 변수, 수치
  • 산포 : 데이터의 변량, 데이터가 얼마나 중심으로 모이지 않고 흩어져 있는지
    • 분산 : 평균과의 거리를 제곱한 값의 평균
    • 표준 편차 : 분산의 제곱근
    • 분산은 값이 너무 커서 비교가 쉽지 않기 때문에 이를 보완하고자 표준 편차 사용

 

- 사분위 수 : 데이터 구성을 전체적으로 살펴보고자 할 때 사용

  • 데이터의 이상치 탐색과 중심위치 및 분포를 빠르게 파악할 수 있다는 강점
  • 데이터들을 크기 순으로 가장 작은 값부터 가장 큰 값까지 정렬한 후,
    • 1사분위수 : 1/4 즉 25%에 해당하는 지점
    • 2사분위수 : 2/4 즉 50%에 해당하는 지점
    • 3사분위수 : 3/4 즉 75%에 해당하는 지점
    • 4사분위수 : 4/4 즉 100%에 해당하는 지점
    • 단, 전체 범위가 짝수인 경우 각 단면의 값들을 평균을 구해 표현
import pandas as pd

# 치킨집 A사와 B사의 배달시간 데이터('분' 단위)

store_a = pd.Series([20, 21, 23, 22, 26, 28, 35, 35, 41, 42, 43, 45, 44, 45, 46, 47, 47, 46, 47, 58, 58, 59, 60, 56, 57, 57, 80])
store_b = pd.Series([5, 6, 11, 13, 15, 16, 20, 20, 21, 23, 22, 27, 27, 30, 30, 32, 36, 37, 37, 40, 40, 43, 44, 45, 51, 54, 70, 600])


# quantile()를 활용해 사분위수 값 출력

A_Q1 = store_a.quantile(0.25)
A_Q2 = store_a.quantile(0.50)
A_Q3 = store_a.quantile(0.75)
A_Q4 = store_a.quantile(1)

print('1사분위수 : ', A_Q1)
print('2사분위수(중앙값) : ', A_Q2)
print('3사분위수 : ', A_Q3)
print('4사분위수 : ', A_Q4, '\n')

B_Q1 = store_b.quantile(0.25) 
B_Q2 = store_b.quantile(0.50) 
B_Q3 = store_b.quantile(0.75) 
B_Q4 = store_b.quantile(1) 
    
print('1사분위수 : ', B_Q1)
print('2사분위수(중앙값) : ', B_Q2)
print('3사분위수 : ', B_Q3)
print('4사분위수 : ', B_Q4, '\n')

  • boxplot

# 데이터 시각화 패키지

import matplotlib.pyplot as plt


# boxplot 활용

plt.boxplot((store_a, store_b))
plt.grid()
plt.show()

b사의 데이터에 이상치가 있음을 알 수 있음 → 600분이라는 데이터 제거
제거 후 박스 플롯

  • IQR(InterQuartile Range) : 사분범위의 1.5배 (이를 기준으로 이상치 판단)
    • 양 쪽 25%를 자르고 가운데 50%만 보는 것
    • IQR = Q3 - Q1
    • 하단 이상치 기준선 = Q1 - IQR*1.5
    • 상단 이상치 기준선 = Q3 + IQR*1.5
  • boxplot은 이상치 탐색, 데이터의 분포 등을 확인할 때 유용, 다수의 객체들과 비교하고자 할 때도 유용

 

 

 

728x90

댓글