AI SCHOOL

[통계분석] 확률분포 / 정규분포 / 기술통계(분위수, 편차)

moru_xz 2023. 2. 13. 17:29

통계

- 통계의 필요성

  • 전문가의 판단 vs 통계적 예측
  • 루이스 골든버그: 전문가를 예측하는 모형이 전문가 자신보다 정확
    - 통계는 항상 일정하지만 전문가(사람)의 판단은 내부/외부적 잡음에 영향을 받음
    - 대상에 대한 전문가의 판단보다 전문가의 판단을 예측하는 통계적 모델이 더 정확
    - 전문가의 판단을 예측하는 통계적 모델은 잡음에 영향 x

- 왜 통계적 예측은 충분히 사용되지 않는가?

  • 판단을 직접 내릴 때 얻는 만족감(퍼즐이 맞춰지는 느낌)이 보상으로 작용
  • 통계적 지식의 부족과 반감

- 부분을 통해 전체 추측 -> 대부분의 경우 우리는 대상의 일부만 관찰 -> 현실에서는 우연과 불확실성이 존재 => 부분을 통해 전체를 합리적으로 추측하는 것이 중요

 

변수의 종류

- 행(row)

  • 표에서 가로 방향 한 줄
  • 하나의 사례

- 열(Column)

  • 표에서 세로 방향 한 줄
  • 하나의 변수
  column 변수
     
row      
사례      

- 범주형 변수 categorical variable

  • 종류, 이름
  • 숫자로 표시하더라도 양적인 개념이 아님
  • 덧셈 등 대부분의 연산이 의미가 없음
  • 순서가 있을 수도 있으나 간격이 일정하지 않음 (지역 번호)
  • 주거 형태, 고향, 학력, 출석(왔느냐, 안 왔느냐) 등

- 연속형 변수 continuous variable

  • 연속적인 형태 
  • 간격이 일정하고 덧셈, 뺄셈 등의 계산이 의미가 있음 
  • 무게, 나이, 시간, 거리, 자녀의 수(정확히 말해서는 아니긴 함 아이가 3.1명 있다?) , 시험 점수(정확히 연속적이지는 않아도 대략 간격이 일정하고 덧셈 뺄셈이 가능하면 연속형 변수라고 생각하면 됨) 등

-> 국적은 범주형? 연속형? => 범주

     만족도는 범주형? 연속형 => 연속(엄밀히 말하면 범주와 연속 사이)

 

- 데이터 모으기

  • 공공 데이터
  • 인터넷 스크래핑
  • 기업 등 내부 자료
  • 설문 / 관찰 / 실험 

- 타당도와 신뢰도

https://en.m.wikipedia.org/wiki/Accuracy_and_precision

  • 타당도(validity): 측정하고자 하는 것을 잘 측정
  • 신뢰도(reliability): 측정 결과가 일정
    타당도 높은 것 -> 쏠려고 한건 아닌데 어딘가에 일정하게게 맞음

=> 기본적으로 타당도가 높아야 하고 신뢰도는 두 번째 문제 -> 타당도 정확하게 알기 어려운 경우가 많음 

 

확률 분포 

확률 분포 probability distribution

  • 확률 분포: 확률 변수가 특정한 값을 가질 확률을 나타내는 함수 (주사위를 던져서 3이 나올 확률)
    - 이산확률분포: 가질 수 있는 값이 정수
    - 연속 확률분포: 가질 수 있는 값이 실수(사람의 키 -> 169.4, 185.2)
  • 데이터가 나온 확률 분포를 추론하는 것이 통계 분석
  • 분석을 쉽게 하기 위해 수학적으로 단순화, 추상화된 확률 분포들을 많이 사용

베르누이 분포 Bernoulli distribution

  • 동전 던지기와 같이 둘 중에 한 가지 결과만 나올 수 있는 경우
  • 고객의 구매 / 미구매, 이탈 / 유지
  • 기계의 작동 / 고장
  • 시험의 합격 / 불합격

이항 분포 binomial distribution

  • 0과 1만 나오는 시행을 n 번했을 때 합계의 분포
  • 고객의 구매율이 30%일 때 100명의 고객이 방문하면 그 중에 몇명이 구매? 한명한명 확률은 30이지만 여러명이 모이면 들쭉날쭉
from scipy.stats import binom
import matplotlib.pyplot as plt
data = binom.rvs(n=100, p=0.3, size=365)
plt.hist(data, bins=40, range=[10, 50])

-> 30%의 구매율을 가진 100명이 고객이 오는 것을 100일로 시뮬레이션 

: 40명 이상 오는 날이 그림과 같은데 그 날들을 위해 우리는 대비해야할까?(알바 늘려 …)

 

binom.pmf(k=30, n=100, p=0.3)
>> 0.08678386475342813

-> 구매율이 30%인 고객 100명이 방문하고 그 중에 딱 30명이 구매 할 확률은 => 약 8.6%

binom.cdf(k= 30, n=100, p=0.3)
>> 0.5491236007687914

-> 0~30명까지 누적 , 아무도 안 사는날(한명, 두명~30명까지) 다 누적하면 => 약 54.9%

0.5491236007687914 * 365
>> 200.43011428060888

-> 200일은 30명이 구매한다는(그럼 직원 3명이서 200일까지는 커버 가능)

 

-> 10명 중에 평균적으로 3명이 사지만 4명이 살 수도 5명이 살 수도 있음

 

고객이 100명이 온다 -> 직원 한 명이 10명의 고객(오로지 사겠다는 고객만)을 감당할 수 있다고 가정! -> 넘으면 매장이 엉망진창이 된다

구매 고객이 0명인 경우 / 100명은 구경만 하고 떠남  -> 직원 필요 없음

구매 고객이 1명인 경우 / 99명 구경 하고 떠남 -> 직원 1명 필요

구매 고객이 2명인 경우 / 98명 구경 하고 떠남 -> 직원 1명 필요

구매 고객이 10명인 경우 / 90명 구경 하고 떠남 -> 직원 1명 필요

구매 고객이 11명인 경우 / 89명 구경 하고 떠남 -> 직원 2명 필요

 

근데 구매 확률이 30%임  -> 그럼 직원이 몇 명이 필요한가? 

매일 일정하게 100명 오는데 어떤 사람은 구매, 어떤 사람은 구경, 구매 확률은 30%인데 그렇다고 맨날 맨날 30명이 구매하냐? 아님 주사위 처럼 어떤 날은 5명만 구매하는 날이 있고 -> 한 명 한 명 확률은 30%라도 여러명이 있으면 아닐 수 있다는 것임

 

k 는 기간

30명이 구매할 확률이 가장 높은데 40명도 가능하긴 함 -> 60명은 거의 없음 

그럼 직원이 몇명이 필요한가?

단순하게 생각하면 한명이 10명 처리할 수 있으니까 직원 3명만 있으면 되겠다

 

그런데 ! 누적으로 보면

절반정도 밖에 커버 못함 

 

---

 

다른 예시

 

binom.cdf(k=200, n=10000, p =0.01)

카카오톡 서버 10,000대 -> 서버 뻗을 확률 1% -> 직원이 고치면 되는데 장애가 없으려면 최소 서버가 9800대는 돌아가야 함

고장이 200대 이내로 발생할 확률(0대, 1대, 2대 ... 199대, 200대) -> 괜찮은 범위 내 있을 확률이 100%다 

 

binom.cdf(k=140, n=9940, p =0.01)
>> 0.9999549723425907

0.9999549723425907 * 3650
>> 3649.835649050456

- 10년 서비스하면 3649일은 ㄱㅊ 하루정도는 고장

 

정규 분포

  • 𝜇(뮤)와 𝜎 2 (시그마)에 따라 모양이 달라짐
    - 𝜇의 확률이 가장 높고, 멀어질 수록 확률이 낮아짐
    - 𝜇를 기준으로 좌우대칭
    - 𝜎 2이 클 수록 넓게 퍼짐

중심극한정리 Central Limit Theorem

  • 어떤 확률분포에서 값을 n개 독립적으로 뽑아서 더하여 합계 s를 구할 경우 
  • n이 커질 수록, s의 분포는 정규분포와 점점 비슷해짐
    6면체 주사위를 20개를 굴리고 이걸 다 더한 것은 s -> 이걸 반복 ->  주사위 하나 하나는 1~6 고르게 나옴 -> 합계는 대략 70 언저리에서 일정하게 몰려서 나옴(주사위 하나는 1도 나오고 6도 나오고 골고루 나오는데) , 20~120까지 나올 수 있는데 -> 집중적으로 몰려서 나옴 -> 어떤건 1이고 어떤건 6이고 하니까 더하면 70근처에 나올 수 밖에 -> 정규분포와 비슷한 모양이 나옴 

=> 어떤 분포라도 모두 합계를 구하면 이것들의 분포는 정규분포와 점점 비슷해짐 -> 정규분포 쓸일 많다~

 

  • 이항분포도 위에서 한 구매(마음 속에 주사위 있어서 구매 / 구경) -> 점점 정규분포와 비슷해짐 
from scipy.stats import norm
import numpy as np
m = 30
s = np.sqrt(21)
data = norm.rvs(loc=m, scale=s, size=365)
plt.hist(data, bins=40, range=[10, 50])

m = 100 * 0.3
s = np.sqrt(100 * 0.3 * 0.7) # 루트 21
data = norm.rvs(loc=m, scale=s, size=365)

plt.hist(data, bins=40, range=[10, 50])

s = np.sqrt(100 * 0.3 * 0.7)

-> 표준편차 = sqrt(분산)

     var(분산) = ( n * (일어날 확률)*(일어나지 않을 확률)) -> 그래서 n * p * (1-p)

-> 이 부분 

 

정규분포의 확률밀도함수와 누적분포함수

  • 확률밀도함수
    - 연속확률분포에서 한 점의 확률은 0
    - 대신 확률밀도를 구함
    - norm.pdf(x=30, loc=m, scale=s)
  • 누적분포함수
    - 0~30명이 구매할 확률의 합
    - norm.cdf(x=30, loc=m, scale=s)

 

왜 사람의 키의 분포는 정규분포와 비슷할까

키에는 유전자가 크게 관여

키에 관여하는 유전자는 여러개

유전자들이 독립적으로 유전된다고 가정하면 중심극한정리에 따라 키에 대한 유전자의 효과는 정규분포를 따르게 됨

 

실제로는 정규분포와 조금은 맞지 않음

• 아마도 유전자들의 분포가 다르고, 서로 독립적이지 않고 정규분포로 예상되는 것보다 더 크거나 작은 사람들이 있음

-> 역으로 정규분포를 따른다고 해서 반드시 유전자 때문은 아님

 

기술 통계

통계의 종류

  • 기술 통계: 데이터를 묘사, 설명
  • 추론 통계: 데이터를 바탕으로 추론, 예측

기술 통계

  • 중심 경향치: 데이터가 어디에 몰려있는가?
    - 평균
    - 중간값
  • 분위수: 데이터에서 각각의 순위가 어느정도인가?
  • 변산성 측정치: 데이터가 어떻게 퍼져있는가?
    - 범위, IQR
    - 분산, 표준편차

평균

  • n개의 값이 있을 때, 그 합계를 n으로 나눈 것
  • 평균은 극단값에 따라 영향을 크게 받음 -> 10, 20, 30, 40, 5000 => 평균 120

중간값

  • 값들 크기 순 정렬했을 때 딱 중앙 -> 10, 20, 30, 40, 500 => 30 (극단값의 영향을 덜 받음)
    - 극단값 영향을 덜 받는다고 이게 평균보다 낫다? 그건 아님
  • '중위수'라는 표현도 많이 사용(중위 소득, 중위 가격 등)
  • df.median()

분위수 quantile

  • 크기순으로 정렬된 데이터를 q개로 나누는 위치의 값
  • 대표적으로 사분위수, 백분위수 

사분위수 quartile

  • 데이터를 4등분 하는 위치
    - 제1사분위수 -> 1/4 지점
    - 제2사분위수 -> 2/4 지점
    - 제3사분위수 -> 3/4 지점
  • 상위 10%에 들어가는
df['mileage'].quantile(.9)

백분위수 percentile

  • 데이터에서 순위를 퍼센트로 표현
  • percentile: 위치로 말할 때
  • 최소값 = 0퍼센타일 
  • 제1사분위수 = 25퍼센타일 
  • 제2사분위수 = 중간값 = 50퍼센타일

Python 최소, 최대, 퍼센타일

  • df.price.min()
  • df.price.max()
  • df.price.quantile(.25)

범위 range

  • 최대값 - 최소값
  • 극단값이 있으면 커짐 ex) 10, 20, 30, 40, 500의 경우 490
print(df.price.min(), df.price.max())  # (일상적인 의미에서) 범위
print(df.price.max() - df.price.min())  # (통계적인 의미에서) 범위

사분위간 범위 InterQuartile Range

  • 줄여서 IQR
  • 제3사분위수 - 제1사분위수 (너무 크거나 너무 작은 수 빼고)
  • 극단값은 최소값 또는 최대값 근처에 있으므로 극단값의 영향이 적음
print(df.price.quantile(.75) - df.price.quantile(.25))  # 사분위간 범위(IQR)

상자 수염 그림 box - whisker plot

- 제1사분위수~제3사분위수를 상자로 표현

- 중간값은 상자의 가운데 굵은 선으로 표시

- 최소값과 최대값은 수염으로 표시 

- 수염의 최대 길이는 IQR의 1.5배까지, 넘어가는 경우는 점으로 표시

https://www.isixsigma.com/dictionary/box-plot/

plt.figure(figsize=(12, 6))
sns.boxplot(x='price', data=df)

plt.figure(figsize=(12, 6))
sns.boxplot(x='price', y='model', data=df)

 

편차 deviation

값 - 평균

 

분산 variance

편차 제곱의 평균 -> 부호를 떼기 위한건데 왜 제곱? 절대값이 아니라? => 평균 절대 편차 MAD

평차 제곱 평균 => 분산

분산: df.price.var()

표준편차: df.price.std()

기술통계 한 번에 구하기: df.price.describe()

print(df['mileage'].var())
print(df['mileage'].std())
>>
1850358572.437435
43015.79445317075

히스토그램 histogram

데이터를 구간별로 나눠 각 구간의 사례 수를 막대 그래프로 그린 것

sns.histplot(x='price', data=df)

bins =  으로 구간 나눌 수 있음 

import matplotlib.pyplot as plt
xs = list(range(100, 2100, 200))
sns.histplot(x='price', data=df, bins=xs)

plt.xticks(xs)

plt.xticks(xs) -> x 간격 정렬 -> bins

 

커널 밀도 추정 kernel density estimation

  • 데이터의 밀도를 추정하여 그린 곡선
sns.histplot(x='price', data=df, kde=True)

모집단과 표본

모집단 population

: 연구의 관심이 되는 집단 전체 -> 무한, 실제로 다 보는 것은 불가능(전수조사할 때만 가능 but, 거의 불가능)

표본 sample

: 특정 연구에서 선택된 모집단의 부분 집합

표집 sampling

: 모집단에서 표본을 추출하는 절차. '표본 추출'이라고도 함

-> 대부분의 경우 집단 전체를 전수조사하기는 어려우므로 무작위로 표본 추출하여 모집단에 대해 추론 

 

모수 

파라미터: 어떤 시스템의 특성을 나타내는 값

모수: 모집단의 파라미터 -> 모집단의 특성을 나타내는 값

-> 모수를 구하기 위해서는 전수조사가 필요 (사실상 어려움) / 표본의 크기를 모수라고 하는 경우도 있으나 잘못된 표현!

 

통계량

표본에서 얻어진 수로 계산한 값(= 통계치)

'모집단의 통계랑'이라는 표현은 없음 -> 통계량은 표본에서 구한 값

'표본의 모수'라는 말은 없음 -> 모수는 모집단에서 구한 값

추론통계 inferential statistics

: 표본 통계량을 일반화하여 모집단에 대해 추론하는 것 

'AI SCHOOL' 카테고리의 다른 글

[ML] Clustering  (0) 2023.03.12
[통계분석] 상관분석 / 회귀분석  (0) 2023.02.16
[통계분석]  (0) 2023.02.15
[WIL] 4주차  (0) 2023.01.19
[WIL] 3주차  (0) 2023.01.12