티스토리 뷰
> 생각보다 실상에서 정규 분포가 많지 않음
> 잘못 알려진 사실) 데이터 크기가 커지면 정규 분포를 따른다 (모수만큼 해로운 말)
> 중심극한정리 잘못 이해해서 하는 말임. (잊어버리라고 함)
> 이런 분포들이 많다. (감마 분포)
> 이런 분포들은 평균보단 중앙값을 얘기해야한다.
> 확률 변수가 확률 분포를 갖고 확률 분포는 함수다 (식이 있다).
> 이산형은 셀 수 있는, 연속 확률은 셀 수 없는
> 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
'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
- Diode
- semiconductor
- pn 접합
- Blu-ray
- 열전자 방출
- Acceptor
- MOS
- Depletion Layer
- channeling
- 쇼트키
- 광 흡수
- Charge Accumulation
- Laser
- Thermal Noise
- 문턱 전압
- Donor
- C언어 #C Programming
- Fiber Optic
- 반도체
- Reverse Bias
- Solar cell
- Energy band diagram
- fermi level
- EBD
- CD
- PN Junction
- Semicondcutor
- 양자 웰
- Pinch Off
- Optic Fiber
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |