1. 표본분포
통계적 추론
전수조사는 실질적으로 불가능하기에 표본 조사를 통해 모집단 해석을 진행하는 경우가 많다.
-> 표본 조사는 반드시 오차가 발생
-> 적절한 표본 추출 방법 필요
-> 표본과 모집단과의 관계를 이해해야 함
여러 표본 추출 방법
- 단순랜덤 추출법 (random sampling) : 난수표 사용 / 랜덤넘버 생성기 사용
import random
[random.randint(1,10)for i in range(10)]
1~10 사이에서 랜덤하게 정수 10개 뽑는 코드
표본 평균의 분포
표본조사를 통해 파악하고자 하는 정보: 모수 (parameter)
모수의 종류:
- 모평균, 모분산, 모비율 등
- 모수 추정을 위해 표본을 선택하여 표본 평균, 표본 분산 등을 계산하는 것
통계량 (statistic) : 표본 평균이나 표분 분산 같은 표본의 특성값
표본의 평균은 표본 선택에 따라 달라짐 -> 표본 평균은 확률 변수
-> 표본 평균이 가질 수 있는 값도 확률분포를 가짐
-> 그 분포가 무엇인지가 표본을 해석할 때 매우 중요
표본분포 ( sampling distribution) : 통계량의 확률 분포
표본 평균: 모평균을 알아내는데 쓰이는 통계량
표본 평균의 분포
- $x_1, x_2, \dots, x_n$
- 평균 : $\mu$, 분산 : $\sigma^2 $
- 정규모집단에서 추출된 표본의 측정값
- 표본평균
- $\bar {x} = {1 \above 1pt n \sum_{i=1}^n x_i}$ : 표본평균
- $\bar {X}$~$N(\mu, {\sigma^2 \above 1pt n})$ : 표본평균은 정규분포를 따른다. N이 클수록 분산이 작아진다.
평균이 0, 분산이 1인 표준 정규분포의 표본평균과 분산
import numpy as np
xbars = [np.mean(np.random.normal(size = 10))for i in range(10000)]
print("mean %f, var %f" %(np.mean(xbars), np.var(xbars)))
>> mean -0.002223, var 0.100217
평균, 분산을 지정해서 표본평균과 분산 구하기(평균 10 분산 3 n= 10)
xbars = [np.mean(np.random.normal(loc=10, scale=3, size=10))for i in range(10000)]
print("mean %f, var %f" %(np.mean(xbars), np.var(xbars)))
>> mean 9.976282, var 0.875775
히스토그램 출력 (정규분포 모양)
import matplotlib as plt
from matplotlib import pyplot
h = plt.pyplot.hist(xbars, range=(5,15), bins=30)
중심극한 정리
- $x_1, x_2, \dots, x_n$
- 평균 : $\mu$, 분산 : $\sigma^2$
- 모집단(!=정규모집단)에서 추출된 표본의 측정값
- 표본평균
- $\bar {x} = {1 \above 1pt n \sum_{i=1}^n x_i}$
- n이 충분히 큰 경우(n >= 30),
- 근사적으로 $\bar {X}$~$N(\mu, {\sigma^2 \above 1pt n})$
ex1> uniform distibution
n=3
xbars = [np.mean(np.random.rand(n)*10)for i in range(10000)]
print("mean %f, var %f" %(np.mean(xbars), np.var(xbars)))
h=plt.pyplot.hist(xbars, range=(0,10), bins=100)
mean 5.010730, var 2.836724
표본의 갯수 n이 커질수록, 더욱 정규분포 형태를 띌 것.
ex2> exponential distribution
import numpy as np
import matplotlib as plt
n=2
xbars = [np.mean(np.random.exponential(scale=3, size=n))for i in range(10000)]
print("mean %f, var %f" %(np.mean(xbars), np.var(xbars)))
h=plt.pyplot.hist(xbars, range=(0,10), bins=100)
mean 3.003539, var 4.427474
표본의 갯수 n이 커질 수록 정규분포에 가까운 형태를 띌 것
2. 추정
1. 모평균의 추정
표본 평균의 특성
- $\bar {X}$는 모평균 $\mu$의 추정에 사용되는 통계량
- 대표본인 경우
- 중심극한 정리에 의해 표본평균이 정규분포를 따른다고 가정함
점추정
표본평균이 점 추정값(추정량)이 됨(모평균의 점 추정값은 표본평균이다.)
import numpy as np
sample = [9,4,0,8,1,3,7,8,4,2]
print(np.mean(sample))
4.6
--> 점추정만 가지고는 확률적인 근거를 제공하기 부족하기 때문에, 구간추정이라는 것을 이용한다.
구간추정
- 모평균 $\mu$의 $100(1 - \alpha)%$ 신뢰구간(confidence interval) : 표본 뽑기를 그걸 100번을 반복하면 alpha 만큼 분포 그래프 산 안에 모평균이 존재할 것이다
- ($\mu$의 추정량) \pm $z_{a/2} (추정량의 표준편차)$
- 정규분포에서 $\sigma$를 알 때, 신뢰구간
그러나 실용적이지 못함 : 보통은 정규분포가 아니거나 정규분포인지 아닌지 모르거나, 표준편차가 알려져 있지 않기 때문
-
- 표본의 크기가 클 때 중심극한 정리 사용
- ($\mu$의 추정량) \pm $z_{a/2} (추정량의 표준편차)
- 표본의 크기가 클 때 중심극한 정리 사용
$s$ : 표본표준편차 모양은 거의 비슷한데 시그마가 s로 바뀜.
ex>
어떤 학교의 고1남학생의 평균키를 추정하기 위해 36명을 표본으로 추출하여 그 표본평균과 표본표준편차를 계산하여 그 결과가 아래와 같다.
$\bar {x} = 173.6, s = 3.6$
평균키에 대한 95% 신뢰 구간을 구하시오.
95%의 신뢰도이므로 양 귀퉁이가 5%에 해당하게 된다.
$\alpha = 0.05$
$z_{a/2} = $z_{0.0025} = 1.96$
문제에서 주어진 표본평균과 표본표준편차도 대입하면 (172.4, 174.8)의 구간이 나온다.
# 구간추정
w = [10.7, 11.7, 9.8, 11.4, 10.8, 9.9, 10.1, 8.8, 12.2, 11.0, 11.3, 11.1, 10.3, 10.0, 9.9, 11.1, 11.7, 11.5, 9.1
, 10.3, 8.6, 12.1, 10.0, 13.0, 9.2, 9.8, 9.3, 9.4, 9.6, 9.2]
xbar = np.mean(w)
sd = np.std(w, ddof = 1)
print("mean %.2f, standard deviation %.2f"%(xbar,sd))
import scipy.stats
alpha = 0.05
zalpha = scipy.stats.norm.ppf(1-alpha/2)
print("zalpha:", zalpha)
mean 10.43, standard deviation 1.11
zalpha: 1.959963984540054
2. 모비율의 추정
점추정
- 확률변수 X :
- n개의 표본에서 특정 속성을 갖는 표본의 개수
- 모비율 $p$의 점추정량
- $\hat{p} = {X \above 1pt n}$ 점추정보다는 구간추정을 더 많이 사용한다.
구간추정
- n이 충분히 클 때($n \hat{p}$ > 5, $n(1 - \hat{p})$ > 5일 때를 의미)
- $X$ ~ $N(np, np(1-p))$ : 확률변수 X가 정규분포를 따른다.
- 확률변수 X의 표준화
- 근사적으로 표준정규분포 $N(0,1)$를 따름
- 모비율 $p$의 $100(1 - \alpha)%$ 신뢰구간(confidence interval), 이 구간 안에 $p$가 있을 확률이 $1 - \alpha$
ex>
대학교 1학년생의 흡연율을 조사하기 위해 150명을 랜덤하게 선택하여 흡연 여부를 조사하엿다.
이중 48명이 흡연을 하고 있었다.
흡연율p에 대한 95% 신뢰구간을 구하시오.
$\alpha = 0.05$
$z_{a/2} = $z_{0.0025} = 1.96$
$\hat{p} = 0.32$
(0.32 - 1.96*0.038, 0.32+1.96*0.038) = (0.245, 0.395)
# 모비율 구간 추정
x = 48
n = 150
phat = x/n
alpha = 0.05
zalpha = scipy.stats.norm.ppf(1-alpha/2)
sd = np.sqrt(phat*(1-phat)/n)
print("phat %.3f, zalpha: %.3f, standard deviation: %.3f" %(phat, zalpha, sd))
ci = [phat - zalpha *sd, phat+ zalpha*sd]
print(ci)
phat 0.320, zalpha: 1.960, standard deviation: 0.038
[0.24534963990338954, 0.3946503600966105]
참고 : angeloyeo.github.io/2021/01/05/confidence_interval.html
3. 검정
1. 통계적 가설검정
가설검정의 예
어떤 고등학교의 1학년 학생들의 평균키가 170.5cm으로 알려져 있었다. 올해 새로 들어온 1학년 학생들 중 30명을 랜덤하게 선택하여 키를 잰 후 평균을 계산했더니 171.3cm이었다.
올해 신입생은 평균키가 170.5cm보다 더 크다고 할 수 있는가?
이러한 주장을 검증하는 것이 가설 검정
--> 표본평균 $\bar {X}$가 $\mu_0$보다 얼마나 커야 모평균 $\mu$가 $\mu_0$보다 크다고 할 수 있을 것인가?
(표본평균은 표본의 선택에 의해 달라짐)
귀무가설 $H_0 : \mu = \mu_0$
대립가설 $H_1 : \mu > \mu_0$
--> 귀무가설을 기각하기 위해서는 $\bar {X}$(표본평균)가 큰 값이 나와야...
--> 귀무가설이 참이라고 가정할 때, 랜덤하게 선택한 표본에서 지금의 $\bar {X}$가 나올 확률을 계산
--> 이 확률이 낮다면 귀무가설이 참이 아니라고 판단
낮은 확률의 기준점은 어떻게 정할 것인가?
--> 유의수준 $\alpha$ 도입
--> $P(\bar {X} \geq k) \leq \alpha$가 되는 k를 찾는다
--> 검정통계량 : 표준정규확률 변수로 변환
--> $\bar {X}$를 $Z$로 변환한 후 $Z$값이 $z_a$보다 큰지를 검토
--> 크다면 귀무가설 기각/ 아니면 귀무가설 채택
검정의 단계
- $H_0$, $H_1$ 설정
- 유의수준 $\alpha$ 설정
- 검정통계량 계산
- 기각역(검정통계량의 범위) 또는 임계값 계산
- 주어진 데이터로부터 유의성 판정
2. 모평균의 검정
대립가설
: 문제에서 검정하고자 하는 것이 무엇인지 잘 파악해야함
- 대립가설 $H_1$채택을 위한 통계적 증거 확보 필요
- 증거가 없으면 귀무가설 $H_0$ 채택
- $H_1 : \mu > \mu_0$ : 모평균이 $\mu_0$보다 크다
- ex> 어떤 농장에서 생산되는 계란의 평균 무게는 10.5그램으로 알려져 있다. 새로운 사료를 도입한 후에 생산된 계란 30개의 표본 평균을 계산했더니 11.4그램이 나왔다. 새로운 사료가 평균적으로 더 무거운 계란을 생산한다고 할 수 있는가?
- $H_0 : \mu = 10.5$
- $H_1 : \mu > 10.5$
- $H_1 : \mu < \mu_0$
- ex> 어떤 농장에서 생산되는 계란의 평균 무게는 10.5그램으로 알려져 있다. 새로운 사료를 도입한 후에 생산된 계란 30개의 표본 평균을 계산했더니 9.4그램이 나왔다. 새로운 사료가 평균적으로 더 가벼운 계란을 생산한다고 할 수 있는가?
- $H_0 : \mu = 10.5$
- $H_1 : \mu < 10.5$
- $H_1 : \mu != \mu_0$ (양측 검정)
- ex> 어떤 농장에서 자신들이 생산하는 계란의 평균 무게가 10.5그램이라고 홍보하고 있다. 이에 생산된 계란 30개의 표본 평균을 계산했더니 9.4그램이 나왔다. 이 농장의 광고가 맞다고 할 수 있는가?
- $H_0 : \mu = 10.5$
- $H_1 : \mu != 10.5$
검정통계량
n>= 30 이사잉면 중심극한 정리 사용 (s: 표본표준편차)
모집단이 정규모집단이고 모표준편차 $\sigma$가 주어진 경우
기각역
기각역은 대립가설이 무엇인가에 따라서 범위가 달라진다.
- $H_0 : \mu = 10.5$
- 유의수준 : $\alpha$
- 기각역
- $H_1 : \mu > 10.5$ -> $Z > z_a$
- $H_1 : \mu < 10.5$ -> $Z < z_a$
- $H_1 : \mu != 10.5$ -> $|Z| > z_{a/2}$
기각역은 정규분포 그래프를 그렸을 때, 양 극단의 $z_a$ 값 이상/ 이하의 부분에 해당되는지 보는 것
--> 기각역에 해당되면 귀무가설이 탈락됨
# 가설검정
w = [10.7, 11.7, 9.8, 11.4, 10.8, 9.9, 10.1, 8.8, 12.2, 11.0, 11.3, 11.1, 10.3, 10.0, 9.9, 11.1, 11.7, 11.5, 9.1
, 10.3, 8.6, 12.1, 10.0, 13.0, 9.2, 9.8, 9.3, 9.4, 9.6, 9.2]
mu = 10.5
xbar = np.mean(w)
sd = np.std(w, ddof=1)
print("평균 %.2f, 표준편차: %.2f" %(xbar,sd))
z = (xbar-mu)/(sd/np.sqrt(len(w)))
print("검정통계량: ", z)
alpha = 0.05
cri = scipy.stats.norm.ppf(1-alpha/2)
print("임계값: ", cri)
#귀무가설 기각 안됨
평균 10.43, 표준편차: 1.11
검정통계량: -0.34544881283443796
임계값: 1.959963984540054
w = [x-0.5 for x in w] # 평균을 바꾸기 위해 모든 원소에 -0.5함
mu = 10.5
xbar = np.mean(w)
sd = np.std(w, ddof=1)
print("평균 %.2f, 표준편차: %.2f" %(xbar,sd))
z = (xbar-mu)/(sd/np.sqrt(len(w)))
print("검정통계량: ", z)
alpha = 0.05
cri = scipy.stats.norm.ppf(1-alpha/2)
print("임계값: ", cri)
# 귀무가설 기각
평균 9.93, 표준편차: 1.11
검정통계량: -2.8129403330804132
임계값: 1.959963984540054
참고: angeloyeo.github.io/2020/03/25/hypothesis.html
4. 교차엔트로피
1. 엔트로피
자기 정보(self-information) : i(A)
A : 사건
$i(A) = log_b({1 \above 1pt P(A)}) = -log_bP(A)$
전제
- 확률이 높은 사건보다 확률이 낮은 사건이 더 많은 정보를 담고 있다.
예) 도둑이 들었는데 개가 짖는 경우보다 도둑이 들었는데 개가 안 짖는 경우가 더 많은 정보를 포함함
- 두개의 사건이 동시에 일어났을 때의 자기 정보는 A의 자기정보와 B의 자기 정보를 합친 것과 같다.
--> 이 전제를 만족하기 위해서 로그를 가져옴
정보의 단위
- b=2 : bits
- b=e : nats
- b=10 : hartleys
특성
- $i(AB) = log_b({1 \above 1pt P(A)P(B)}) = log_b({1 \above 1pt P(A)}) + log_b({1 \above 1pt P(B)}) = i(A) + i(B)$
- $P(H) = {1 \above 1pt 8}$, $P(T) = {7 \above 1pt 8}$H는 head의 약자, T는 tail의 약자
자기 정보의 평균 - ->$i(H) = 3$비트, $i(T) = 0.193$비트
엔트로피(entropy)
- 자기 정보의 평균
- $H(X) = \sum_j P(A_j)i(A_j) = - \sum_j P(A_j) log_2 P(A_j)$
- 특성
- $0 \leq H(X) \leq log_2K$,
- $K$ : 사건의 수 확률($P(A_j)$)가 $1/K$일 때(균등한 값을 가질 때) 엔트로피가 가장 큰 값을 가진다.
- 엔트로피의 활용
- 평균비트수를 표현
- 데이터 압축에 사용
- 4가지 정보를 압축하는데 필요한 비트수: 일반적으로 2비트
- i(X)를 활용하는 경우 : 평균비트수 1*1/2 + 2*1/4 + 3*1/8 + 3*1/8 = 14/8 = 7/4 비트
X | P(X) | i(X) | code |
A | 1/2 | 1 | 0 |
B | 1/4 | 2 | 10 |
C | 1/8 | 3 | 110 |
D | 1/8 | 4 | 111 |
2. 교차 엔트로피
교차 엔트로피의 정의
- 집합 S상에서 확률분포 P에 대한 확률분포 Q의 교차 엔트로피
- 확률분포 P에서 $i(A_j)$의 평균
- $H(P, Q) = \sum_j P(A_j)i(A_j) = - \sum_j P(A_j) log_2 Q(A_j) = - \sum_{x \in X} P(X) log_2 Q(x)$
- 이 값은 정확한 확률분포 P를 사용했을 때의 비트수보다 크게 됨
- $H(P, Q) = - \sum_{x \in X} P(X) log_2 Q(x) \geq - \sum_{x \in X} P(X) log_2 P(x) = H(P)$
- 이 값은 P와 Q가 얼마나 비슷한지를 표현
- 같으면 $H(P, Q) = H(P)$
- 다르면 $H(P, Q) > H(P)$
ex> Q(X)를 가정하고 코드 부여
H(P, Q)
평균비트수 ; 3*1/2 + 3*1/4 + 2*1/8 + 1*1/8 = 21/8 비트
-> 1.5배나 더 많은 비트 사용필요
X | P(X) | i(X) | Q(X) | i(X) | code |
A | 1/2 | 1 | 1/8 | 3 | 000 |
B | 1/4 | 2 | 1/8 | 3 | 001 |
C | 1/8 | 3 | 1/4 | 2 | 01 |
D | 1/8 | 3 | 1/2 | 1 | 1 |
손실함수
- 분류 문제에서의 손실함수
- 분류문제란?
- 주어진 대상이 A인지 아닌지를 판단
- 주어진 대상이 A, B, C, …중 어느 것인지를 판단
- 기계학습에서는 주어진 대상이 각 그룹에 속할 확률을 제공
- 예)
- [0.8 0.2] : A 일 확률이 0.8, 아닐 확률이 0.2 라는 뜻
- 이 값이 정답인 [1.0, 0.0]과 얼마나 다른지 측정 필요
- -> 이것을 측정하는 것이 손실함수
- 예)
- 원하는답 P, 제시된 답 Q가 있을 때 P와 Q가 얼마나 다른지에 대한 척도 필요 -> 제곱합을 많이 사용함
- 분류문제란?
- 제곱합을 사용할 경우
- $\sum (p_i - q_i)^2$
- $(1.0 - 0.8)^2 + (0.0 - 0.2)^2$
- 확률이 다를수록 큰 값을 가짐
- 학습 속도 느림
- $\sum (p_i - q_i)^2$
- 교차 엔트로피 $H(P, Q)$를 사용할 경우
- 확률이 다를수록 큰 값을 가짐
- 학습 속도 빠름
- --> 분류 문제에서 주로 교차 엔트로피 사용
- 참고 : 분류 문제에서의 원하는 답
- $P = [p_1, p_2, …, p_n]$
- $p_i$중 하나만 1이고 나머지는 다 0임
- 엔트로피는 0, 즉 $H(P) = 0$
- $p_k = 1.0$이라고 하면, $q_k$의 값이 최대한 커지는 방향으로 학습 진행
- $p_i$중 하나만 1이고 나머지는 다 0임
- S = {A, B}
- 실제상황
- P = [1, 0]
- P(A) = 1, P(B) = 0
- P = [1, 0]
- 예측 Q(X)
- [0.8, 0.2] : Q(A) = 0.8, Q(B) = 0.2
- $H(P, Q) = - \sum_{x \in X} P(x) log_2 Q(x) = -1 * log_2 0.8 = 0.3219$
- [0.5, 0.5]: Q(A) = 0.5 Q(B) = 0.5
- $H(P, Q) = - \sum_{x \in X} P(x) log_2 Q(x) = -1 * log_2 0.5 = 1$
- [0.2, 0.8] : Q(A) = 0.8, Q(B) = 0.2
- $H(P, Q) = - \sum_{x \in X} P(x) log_2 Q(x) = -1 * log_2 0.2 = 2.32$
- [0.8, 0.2] : Q(A) = 0.8, Q(B) = 0.2
- 실제상황
- 내가 원하는 값과 다른 값이 나오면 교차엔트로피 값이 커진다.(확률이 다를수록 큰 값을 가짐)
- --> 이 값이 0에 가까운 값이 되도록 학습이 진행될 것 (손실함수는 학습의 방향을 제공해줌)
#교차 엔트로피
import numpy as np
def crossentropy(P,Q):
return sum([-P[i]*np.log2(Q[i]) for i in range(len(P))])
P = [1, 0]
Q = [0.8, 0.2]
print(crossentropy(P,Q))
Q = [0.5, 0.5]
print(crossentropy(P,Q))
Q = [0.2, 0.8]
print(crossentropy(P,Q))
0.3219280948873623
1.0
2.321928094887362
import numpy as np
def crossentropy(P,Q):
return sum([-P[i]*np.log2(Q[i]) for i in range(len(P))])
P = [1, 0, 0, 0]
Q = [0.7, 0.1, 0.1, 0.1]
print(crossentropy(P,Q))
0.5145731728297583
참고: angeloyeo.github.io/2020/10/26/information_entropy.html
'Math' 카테고리의 다른 글
[AI class w7d1] Probability Distributions (이산확률분포) 확률분포 TIL (0) | 2021.06.07 |
---|---|
책 <인공지능을 위한 수학> 정리 (0) | 2021.05.07 |
[AI class day 9] 인공지능 수학- 확률과 확률분포 TIL (0) | 2021.04.29 |
[AI class day 8] 인공지능 수학- 자료의 정리 TIL (0) | 2021.04.28 |
[AI class day 7] 인공지능 수학- 미적분 TIL (0) | 2021.04.27 |