티스토리 뷰



 

 

> 생각보다 실상에서 정규 분포가 많지 않음

> 잘못 알려진 사실) 데이터 크기가 커지면 정규 분포를 따른다 (모수만큼 해로운 말) 

> 중심극한정리 잘못 이해해서 하는 말임. (잊어버리라고 함)

> 이런 분포들이 많다. (감마 분포)

> 이런 분포들은 평균보단 중앙값을 얘기해야한다. 

 

> 확률 변수가 확률 분포를 갖고 확률 분포는 함수다 (식이 있다).

 

> 이산형은 셀 수 있는, 연속 확률은 셀 수 없는

 

 

> P(X=x)는 P는 확률, X는 확률 변수, x는 상수, 확률 변수 X가 특정 값 x가 될 확률 

 

> 이산형은 확률 질량 함수, 연속형은 확률 밀도 함수 

> 책마다 표현 fx 가 다름. 

 

> 질량은 덩어리로 있고 밀도는 특정 점에는 없음 그래서 확률 밀도 함수에서 특정 값이 될 확률은 0이다.

> 확률 밀도 함수는 구간으로 구해야한다.

> 1/5은 확률이 아닌 확률 밀도이다. 

 

> CDF라고 함, Fx로 표현함

> 특정 값보다 작거나 같을 확률 

> 주사위를 던졌을 때 Fx(0) = P(X <=0) = 0 0을 던졌을 때 0 보다 작을 확률은 0

> Fx(0.7) = 0, 0으로 유지되다가 특정 값 (1)에서 확률이 1/6이 됨. 

> Fx(2) = P(X <=2) = P(x=1) +P(X=2) = 2/6

> Fx(4.5) = P(x=1) +P(X=2) +P(X=3) +P(X=4) = 4/6

> 이처럼 누적이 된다. 그리고 계단식, 우상향 한다. 

> 각 분포마다 cdf가 있다 하지만 이 강의에서 안함.

 

> 적분하면 됨

 

> 확률 변수 X랑 상수 x 곱해서 더하면 됨, 연속형은 적분 

 

> u는 기댓값

 

>  적분은 참고 

> 분포를 배우기 위해서 지금까지 배웠음

 

> 주사위, 동전 확률 분포를 균일 분포였다. 

> X ~ U(1,6) : 확률 변수 X가 ~ 분포를 따른다 U(균일 분포)를 시작 1, 끝 6

> 기댓값, 분포 식이 나온 부분은 그냥 넘어감 

> 이건 어디서 쓰이냐면 분포의 정보가 없을 때 사용한다. (예시 군대에서 남자 지나갈 확률, 일반적으로 남자가 지나갈 확률은 다름, 모집단이 다르기 때문에 이 정보가 없으면 균일 분포를 사용한다) 

> 조건부 확률에서 P(X/Y) P(Y)/P(X)에서 사전 확률 P(Y)를 구할 때 균일 분포를 사용한다. (정보가 없기 때문에) 

> 지식 자체는 단순하지만 어디에 활용할지 중요, 베이지안들은 사전 확률에 사용함. 

 

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt 

x = np.random.randint(low=1, high =6, size = 100)

plt.hist(x, bins =10) 
plt.show()

 

> 베르누이 시행이라고도 함

> 성공 P(X=1) = p, 실패 P(X=0) = 1-p

> 보통 직접적으로 활용되지는 않고 다른 분포의 재료가 많이 된다. 

> binomial 분포의 재료가 된다. 

 

x= np.random.binomial(n=1, size =100, p = 1/2)
plt.hist(x, bins = 5)

 

> n은 시행 횟수, size는 베르누이를 몇 번 했는지 (베르누이는 n =1) 

> 예) 양불 구분할 떄 확 용 할 수 있다. 

 

> 이산형 분포에서 가장 유명한 분포 

> 베르누이 시행을 n번, 주사위를 n번 던져서 총 성공 횟수 

 

> 5번 던지면 성공 횟수가 5를 넘지 않음

> 주사위 6이 나온 경우가 10번 중 8번이면 성공 횟수는 8

 

> pmf는 다음과 같음 

> (n, x)는 combination (n개 중 x개를 순서에 상관없이 뽑는 가짓수)

> 5번 시행 2번 성공 (5 2) OOXXX OXXOX OXOXX XOXXO.. 이런 가짓수

> n = 1이면 막대기 2개 0이랑 1

> n =2 면 막대기 3개 0,1,2

> n은 막대기 개수를 정함 n+1 개

> 무한대 시행하면 정규 분포랑 닮아져 간다 이걸 이항 분포의 정규 근사 

 

x = np.random.binomial(n =10, p =1/6, size =10000) 
#print(x)
plt.hist(x, bins=100)
plt.show

 

> n이 10이면 최대 성공 횟수는 10이고 시행 횟수, p는 확률, 그래서 3이면 3번 성공했다 이걸 Size 개수대로 한다. 

 

 

 

> 단위 시간 (관심이 있는 시간) 이벤트가 몇 번 발생할 것인지 

> 확률 변수가 가질 수 있는 값이 0부터 무한대 (이항 분포는 범위가 정해져 있음)

> pmf는 이렇게 생겼구나 보고 넘어감, 중요한 건 x의 변위가 무한대, 기댓값, 분산이 람다

> 기대값 분산이 람다란 얘기는 단위 시간당 발생하는 횟수, 람다는 개인이 정하는 값

> 예) 평소 설비 다운이 하루에 한 번이다 그러면 람다는 1, 평소 경험 및 지식이 들어감 그리고 람다 모르면 안 됨

> 람다를 모르면 균일 분포(신입이라 모르니깐 동일하게 다운)로 해도 되고 이항 분포(설비가 몇 개 있는데 몇 개 고장 났는지) 활용해서 람다 구할 수 있다.

> 기댓값과 분산이 같은 유일한 분포

 

>  람다가 크면 이벤트가 더 많이 발생한다. 

> 이벤트가 많이 발생하면 정규 분포를 따르는 거 같다

> 정규 분포는 모든 분포의 어머니다라는 말이 있음 

> 단위 시간은 개인이 설정하는 부분임.

 

x=np.random.poisson(lam = 2, size =100)
print(x)

plt.hist(x, bins =20)
plt.show()

> 출력 값은 1이면 이벤트가 한 번 발생했다는 뜻임 

 

 

 

> lam = 10000, size =100 이면 정규 분포처럼 됨 

 

 

 

 

> 시도 횟수 X, 실패 횟수 Y  

> Y = X -1 (성공 횟수를 차감) 

 

> 성공할 때까지 횟수니깐 x의 범위는 무한대 

> x는 1부터 시작한다, 0은 시도를 안 하는 거 기 때문에 

> p의 1 승, 성공 횟수가 1회이기 때문 

> 왜 combination 안 붙지? 3번 시도이면 XXO 가짓수 한 가지임 

> p = 1/2 이면 E(X)는 2 임 이 뜻은 2번 던지면 성공할만해 

> 예) 불량품이 나올 때까지, 이항 분포도 가능 (샘플링 했으 때 불량 나오는 수)

> 일상에서 많이 쓰임 (폰 게임 S급 카드 나올 때 까지 카드깡의 분포) 

 

 

x = np.random.geometric(p=1/10, size =1000)
plt.hist(x, bins = 20)

 

 

> 기댓값이 1/p 인데 왜 첨부터 높게되어서 낮아지는 분포인지? 1/3이면 기대값이 3 임 그러면 3인 값에서 가장 많이 성공해야 되는 것이지 않나? 왜냐하면  정확히 세 번 만에 성공 vs 세 번 중에 한 번 성공 중 후자인 Case이기 때문. 정확히 세면만에 성공하는 건 어렵다. 

 

> 이산형 분포 종류는 엄청 많다 중요도에 따라 추린 게 위의 5개.

> 이항 분포는 복원 추출, 초기하분포는 비복원 추출

> 빅데이터에서 초기하분포는 쓸 일이 많이 없음.

> 음이항분포 r 번째 성공까지 시도 횟수 (기하 분포 연관) 

 

> 이산형도 되고 연속형도 되는 분포

 

x = np.random.uniform(low = 1, high =100, size = 100)
plt.hist(x, bins=20)

> 특정 구간의 확률을 구하려면 구간에 따라 적분하면 되고 uniform은 사각형 넓이 구하면 됨

 

> pdf 값의 계산이 어려워서 normalize 시켜서 사용 평균 0, 분산 1 표준 정규분포 사용

x = np.random.normal(loc =60, scale =6, size = 500)
plt.hist(x, bins =10)

> normal distribution, loc 은 location 즉 평균, scale은 표준편차 scale parameter이다. 

 

> 얼마나 기다렸냐의 분포, 기하 분포는 성공할 때까지 시도 횟수 감마 분포는 성공할 때 까지 시간 

> 감마는 (a-1)! (a는 알파)

> 음이항 분포와 관련이 있다 (r 번째 성공까지 시도 횟수) 

 

> 알파는 Shape 

> 두 번째 모양이 대표 감마 분포 

 

x = np.random.gamma(shape =2, scale =0.3, size = 1000)
#print(x)
plt.hist(x, bins =30)
plt.show

 

> 내가 무슨 분 포지 모르는 상황에서 그려보면 어떤 분포인지는 정답이 없는 문제다

> 정규 분포라고 판단하면 오늘도 내일도 모양이 똑같다, 반면 감마 분포는 데이터가 더 들어오면 모양이 바뀔 수 있다고 판단할 수 있다.

 

> 다음 사건은 첫 번째 사건이 발생할 때까 의 대기 시간의 분포 

> 얘는 기하분포랑 짝꿍이다. (시도로 보냐 시간으로 보냐)

 

 

> 감마 함수에서 알파를 1 넣으면 됨

> 감마 분포 사용하면 되는데 굳이 따로 떼어서 사용하는 이유는 중요하기 때문에 

 

> 일괄성 있게 이 모양임

> 두 가지 업종에서 많이 씀 (보험, 제조업) 

> 첫 번째 사건이 중요한 경우 (죽음 (생명 보험), 기계의 죽음(고장))

> 보험금 측정하는 사람 계리사 (여기선 거의 정규분포 급) 

> 시간이 지나면서 바뀌는 데이터

 

x = np.random.exponential(scale =3, size = 100)
plt.hist(x, bins =30) 
plt.show

 

> 감마 분포 닮음, 알파가 p/2, 베타가 대신 2 

> 일반적인 상황에서 사용하지 않고 카이제곱 검정에서 사용한다

> p가 기댓값, 분산을 결정하고 이를 자유도라고 한다. DOF(Degree Of Freedom) 

 

x = np.random.chisquare(df=8, size = 1000)
plt.hist(x, bins =30)
plt.show()

 

> B는 베타 함수 (관심 있으면 찾아보길) 

> 감마 분포보다 격변이 더 심하다 

> 왼쪽, 오른쪽 치우쳐질 수 있고 가운데 정규 분포처럼 치우칠 수 있다. 

 

x = np.random.beta(a=0.5, b=0.5, size = 10000)
plt.hist(x, bins=50)
plt.show()

 

x = np.random.beta(a=2, b=2, size = 10000)
plt.hist(x, bins=50)
plt.show()

x = np.random.beta(a=22, b=5, size = 10000)
plt.hist(x, bins=50)
plt.show()

> 베타 분포는 언제 쓰나? : 특징은 가장 변화무쌍하다

> 범위가 0 <x <1, 균일 분포처럼 변수가 앞뒤가 막혀있다

> 균일 분포는 정보를 모를 때 씀, 정보를 모를 때 어떻게 변할지 모르기 때문에 사후 확률에 베타 분포를 쓴다. 

> 베이지안을 하면 결과는 항상 베타 분포를 따른다. 

> 모든 일은 베타 분포를 띤다. 빈도 학파는 만능 베타 분포에 대한 비판 하는 사람이 있다. 

 

> X~ U(a, b) a, b 범위가 아니라 parameter가 들어간다고 이해해야 함 

> X~N(u, sig^2) 정규 분포처럼 범위가 아닌듯이 

 

> 가설 검정이나 AB Test라고 한다 

> 내가 세운 가설이 맞는지 안 맞는지 검정 하는것

 

> 가설을 2개 세운다, 3개는 안됨, 둘 중 누가 맞는지를 본다

> 귀무가설 null hyphthesis, H0라고도 많이 부름, null 이니깐 (영가설)

> 대립 가설 alternative hypothesis H1 or Ha (우리 수업에선 H1이라고 표현)

> 차이가 없는 쪽이 H0, 차이가 있다 H1

> 차이가 없는 게 찾는 게 목적이라도 H0, H1을 바꾸지 않는다 원하는 값을 H0로 하면 된다.

> H1을 원한다는 기준으로 설명 

 

 

 

 

> 양쪽의 검증을 보는 걸 양측 검증, 한 쪽만 보는걸 단측 검정

> 단측 검정을 많이 사용 (Data를 보고 가설을 많이 세우기 때문) 

> 가설은 모집단을 알기 위해 설정 

> H0 : X1 = X2 표본 평균이 같다는 가설은 틀리다. (표본은 뽑아서 보면 되니깐) 자주 하는 오류이다.

 

> 가설을 세우고 - 기준을 세운다(검정통계량) - 결론을 내린다 (p-value) :

> 검정통계량 test statistic 누가 맞는지 볼 때 통계

> 가설 검정이 틀렸을 때 다시 가설을 세우고 맞을 때까지 계속 반복

 

 

> 가설 : H0 두 사람의 키는 차이가 없다, H1 파란색이 빨강 보당 키가 크다

> -라는 연산을 사용해서 차이가 많이 나는지 판단하는데 판단의 근거가 되는 - 가 검정통계량이다. 

> 검정통계량 종류는 많다, Z, T, 카이제곱 등등

 

> 집단 비교는 대푯값을 뽑아서 판단한다.
> 평균, 분산까지 고려해야 한다.

 

> 정의 : H0 참일 때 표본 데이터가 수집될 확률 

 

 

> H1 채택 시 틀리면 1종 오류, H0 채택 시 틀리면 2종 오류 

> 1종 오류가 더 심각, 예) H1이 감염자, H0 정상인 가정하면 감염자가 정상인인 게 더 심각

> 0.05를 유의 수준이라고 하는데 1종 오류가 유의 수준이다.

 

 

> 다른 내용이 있어도 p-value에 이해하는데 넘어가길 

> 검정, 빨강 중 어떤 게 맞냐

> 1번, 2번 중 2번이 맞음, y축이 확률이고 2번 확률이 높기 때문.

> 저 노란 구간이 H0 맞다고 했을 때 H0 표본 데이터가 뽑힐 확률. 

> p-value가 작을수록 H1의 확률이 커져 작을수록 H1에 가깝다

> H0 분포만 필요하기 때문에 H1 따로 그릴 필요 없다. 

 

> H0 파란색 노란색 평균 키 차이가 없다, H1 파란색이 노란색보다 크다 

> z는 상수다, 뒤에 변수들을 다 알고 있어서 

> z는 실험했음, Z는 실험 안 했음 그래서 z는 상수 Z는 확률 변수. 

> 키가 비슷하면 z는 0에 가까움, 차이가 많이 나면 z 값은 큼

> 값이 커야 H1이 맞다. 

 

> z 값들을 모아서 분포를 그려보면 표준 정규 분포가 된다. 

> 1.34은 검정 통계량, 붉은 영역은 p-value 

> 0.05보다 크기 때문에 H0 채택 

> 검정 통계량을 구해야 p-value를 구할 수 있다. 

> z 통계량이 -가 나올 때는 p-value는 오른쪽 기준이 아닌 왼쪽 기준의 분포로 봐야 한다. 

 

> 정규 분포를 따르는지 검정을 해야 한다. 

> 정규 분포를 따랐을 때 n의 개수에 따라 선택. (n 기준은 30개)

> 보통 정규 분포가 많지 않기 때문에 (윌콕슨) 순위합 검정을 많이 써야 될 거 같지만 잘 안 씀, 존재감이 높지 않음. 

 

> 전체 검정 process 안에 검정이 들어가 있고 정규성 검정도 그 하나다. 

 

import numpy as np
import pandas as pd

df = pd.read_csv('./data/performance.csv', encoding = 'cp949')

df_a = df[df['TEAM'] == 'A'] 
df_b = df[df['TEAM'] == 'B'] 
df_c = df[df['TEAM'] == 'C'] 
df_d = df[df['TEAM'] == 'D'] 
df_e = df[df['TEAM'] == 'E'] 

df_a_ach = df_a['ACHIEVEMENT']
df_b_ach = df_b['ACHIEVEMENT']
df_c_ach = df_c['ACHIEVEMENT']
df_d_ach = df_d['ACHIEVEMENT']
df_e_ach = df_e['ACHIEVEMENT']

df_a_mean = np.mean(df_a_ach)
df_b_mean = np.mean(df_b_ach)

df_a_var = np.var(df_a_ach)
df_b_var = np.var(df_b_ach)

n1 = len(df_a_ach)
n2 = len(df_b_ach)
#샤피로 윌크
import scipy as sp

test_stat, p = sp.stats.shapiro(df_a_ach)
print(f'{test_stat} / {p} ')

test_stat, p = sp.stats.shaprio(df_a_ach)
print(f'{test_stat} / {p} ')

 

> sp는 scifi library, science + python (과학 라이브러리) 

> test_stat(검정 통계량), p(p-value) = sp.sats.shapiro(Series) Series를 넣어야 함

> 고정 가설 H0 정규 분포를 따른다 H1 정규 분포를 따르지 않는다

> B data가 정규 분포를 안 따르지만 학습을 위해 정규성 상관없이 검정 진행. 

 

> z, t  검정은 분포가 다르다 

> z는 표준 정규 분포 t는 t 분포(범용적인 분포는 아님, 정규 분포보다 꼬리가 더 두꺼움) 

 

# z-test (검정 함수가 없어서 다 넣어야 함) 
s = (df_a_var/n1 + df_b_var/n2)**0.5
z_value = (df_b_mean - df_a_mean)/s
print(z_value)

z_dist = sp.stats.norm(0,1) 
p_value = 1 - z_dist.cdf(z_value)
print(p_value)

> sp.stats.norm은 정규 분포를 의미하고 (0,1) 은 평균과(loc) 분산(scale) 즉 표준 정규 분포임 (노름(norm)은 아님)

> cdf 누적 확률 분포 함수 P(X <x), 표준 정규 분포의 cdf는 넒의이고 x보다 작을 때니깐 1-P(X <x)를 해줘야 꼬리 부분이 계산됨. 

 >  p-value가 0.05 이상이어서 H0 선택, 평균 차이가 있어도 차이가 없다고 결론이 나올 수 있다. 왜냐하면 모집단의 검정이기 때문에 

 

#t-test 
test_stat, p = sp.stats.ttest_ind(df_b_ach, df_a_ach, alternative ='greater')
print(f'{test_stat}, {p}')

 

> alternative는 대립 가설(0.025), two-sided 양측 검증 (0.05), less 왼쪽 꼬리 greater 우측 꼬리 (0.05)

> ind는 independent이고 독립시행의 ttest다 

 

> 분포를 가정하지 않고 진행

 

> 둘이 합쳐서 작은 순서대로 순위를 매긴다 

> A, B의 순위를 합해서 A나 B가 더 큰지 판단한다 

 

> 여기서 평균이 아닌 중앙값 활용 

#윌콕슨 
test_stat, p = sp.stats.ranksums(df_b_ach,df_a_ach, alternative = 'greater') 
print(f'{test_stat}, {p}')

 

> 시험은 여기까지 (이론적으로)

 

 

##

> 실제는 데이터 개수 30개 기준은 옛날 이론이 나올 때 기준임. 현재는 데이터 30개 없는 곳이 없음

> z-test의 모분산을 쓰는 이유는 표본 분산이 커지면 모분산으로 근사되기 때문 

> z-test n1, n2 모수가 엄청 큰 숫자가 들어가면 0에 가까워진다 그래서 z값이 무한대로 수렴한다 

> 그러면 p_value가 0으로 수렴하기 때문에 H1이 항상 맞게 된다. (오류) 

> p-value는 거의 0.05 보다 작음

> 대안은 자기만의 p-value 기준을 만든다, n개의 샘플을 다시 n개로 다시 샘플링해서 작은 수로 여러 번 돌려서 정합성을 만듦 (공인된 내용은 아님)  

> p-value는 정통적인 AB Test에 많이 보고 상관관계나 회귀분석에도 쓰이긴 하지만 잘 안 쓰는 추세임. 

##

 

> 세 집단 이상일 때 

> 집단 내 오차 600

 

> 2를 곱하는 건 구성원이 2명이기 때문

 

 

> 이건 기본 개념이고 

 

>  1은 F 통계량 값, 검정 통계량 값임

> p-value를 구하려면 H0 분포를 그려하고 F 분포를 따른다. 

> 보통 F 분포는 여기서만 나옴 

 

 

> 분산 동실성 검증을 해야 함. 

> 전부 다 통과하면 ANOVA, 하나라도 통과 못하면 Krusk-Wallis 

> Kruskal-Wallis (Rank성 같은 계열) 많이 쓸 거 같은데 실상 ANOVA를 많이 쓴다

> 3 집단 이상일 때 관계식을 쓸 수 없다. 

> H0 = ua=ub=uc=ud=ue

> H1 = not H0 

 

t, p = sp.stats.shapiro(df_a_ach)
print( f"{t} / {p} ")
t, p = sp.stats.shapiro(df_b_ach)
print( f"{t} / {p} ")
t, p = sp.stats.shapiro(df_c_ach)
print( f"{t} / {p} ")
t, p = sp.stats.shapiro(df_d_ach) 
print( f"{t} / {p} ")
t, p = sp.stats.shapiro(df_e_ach) 
print( f"{t} / {p} ")

> 2개는 정규 분포를 따르지 않는다 

 

t, p = sp.stats.bartlett(df_a_ach, df_b_ach, df_c_ach, df_d_ach, df_e_ach)
print( f"{t} / {p} ")

 

> 분산이 동일하다 

 

t, p = sp.stats.f_oneway(df_a_ach, df_b_ach, df_c_ach, df_d_ach, df_e_ach)
print( f"{t} / {p} ")

> ANOVA : 평균 성과 점수는 차이가 있다. 

> twoway도 있음 (찾아볼 사람은 찾아보기)

 

df_a_ach, df_b_ach, df_c_ach, df_d_ach, df_e_ach)
print( f"{t} / {p} ")

 

> 세 집단 평균 차이 확인하고 어디서 차이가 나는지 확기 위해서 각각 2개씩 하면 됨

> 세집단 이상 검정부터 하고 두 집단 검정을 해야 함.

> 두 집단에서 ANOVA 써도 되는지? 됨 근데 안 씀 왜냐하면 z-test, t-test의 성능이 좋기 때문에 

 

> 분할표를 활용 (crosstab)

> 카이제곱 통계량을 구함 

> 10.97이 기대되나 14가 들어갔다 

 

> 검정 통계량이 4.87

> crosstab 그릴 때 option 넣으면 안 됨, 다른 숫자도 포함되기 때문에 (특히 margin) 

> 분할표 내부 숫자가 너무 작으면 (5 미만) 비효율 

> 5보다 작으면 fisher's exact test 사용하면 됨 

> c는 검정 통계량, p-value, d는 자유도, expected 기댓값 

> 시험 정답은 print로 다 써야 된다. 

> contingency는 crosstab의 테이블 

> 2 by 2 crosstab 이상도 가능 

> 카이제곱은 문자열 끼리 사용 

> 숫자일 때 상관계수 (상관계수 친구)

> 문자와 숫자는 t-test

> 우리가 아는 값의 손 계산과 결과값이 다를 수 있는 것은 라이브러리 개발자가 어떤식을 썼는냐에 따라 다름. (개발자가 scaler를 더 추가했을 수 있다)

<pre id="code

 

Ref : https://losskatsu.github.io/categories/#

반응형

'Machine Learning 입문' 카테고리의 다른 글

8. 지도 학습  (0) 2024.12.26
7. 최적화 & 모형 평가  (1) 2024.12.26
5. 데이터 전처리 처리 및 시각화  (1) 2024.12.26
4. 기초 통계 & 시각화  (2) 2024.12.26
3. 선형 대수  (0) 2024.12.24
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함