Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 딥러닝
- 매틀랩
- matplotlib
- 서평
- 서평단
- Ga
- 리눅스
- 텐서플로
- 시각화
- 통계학
- MATLAB
- Blog
- Tistory
- MySQL
- 독후감
- Python
- 파이썬 시각화
- Visualization
- Google Analytics
- Pandas
- Linux
- 블로그
- SQL
- 한빛미디어서평단
- 월간결산
- 한빛미디어
- 파이썬
- tensorflow
- python visualization
- 티스토리
Archives
- Today
- Total
pbj0812의 코딩 일기
[통계학] python을 통한 모평균의 신뢰구간 계산 본문
0. 목표
- python을 통한 모평균의 신뢰구간 계산
1. 실습
1) library 호출
import random
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
2) 모집단 생성
- 0과 1이 나오는 랜덤 게임을 만들고 10번을 던져 더한 값을 10000번 반복하여 저장
def game(inp):
try_result = []
for i in range(inp):
try_result.append(random.randint(0, 1))
result = sum(try_result)
return result
def game_result(inp):
result = []
for i in range(inp):
result.append(game(10))
return result
mom = game_result(10000)
3) 표본 생성
- 랜덤 인덱스를 10000번까지 만든다음 상위 1000개를 지정하여 표본으로 지정
random_index = np.random.permutation(len(mom))
random_index = random_index[:1000]
son = []
for i in random_index:
son.append(mom[i])
4) 평균
def mean(inp):
result = 0
len_inp = len(inp)
for i in inp:
result += i
result = result / len_inp
return result
5) 분산
def var(inp):
result = 0
len_inp = len(inp)
for i in inp:
result += (i - mean(inp)) ** 2
result = result / len_inp
return result
6) 제곱근
def sqrt(inp):
result = inp/2
for i in range(30):
result = (result + (inp / result)) / 2
return result
7) 표준편차
def std(inp):
result = sqrt(var(inp))
return result
8) 95% 신뢰구간
- 모분산을 모르고 샘플링이 잘되었다는 가정하에 표본표준편차로 대체
- 모분산을 모르고 표본이 작을때에는 t 분포를 사용하여 추정
def ci95(inp):
max95 = mean(inp) + (1.96 * (std(inp) / sqrt(len(inp))))
min95 = mean(inp) - (1.96 * (std(inp) / sqrt(len(inp))))
return min95, max95
9) 99% 신뢰구간
def ci99(inp):
max99 = mean(inp) + (2.58 * (std(inp) / sqrt(len(inp))))
min99 = mean(inp) - (2.58 * (std(inp) / sqrt(len(inp))))
return min99, max99
10) scipy 라이브러리와 비교
- 결과
(1) 95%
- scipy : 4.87597789414211, 5.07602210585789
- 계산값 : 4.876147204153314 5.075852795846686
(2) 99%
- scipy : 4.84445662758231, 5.10754337241769
- 계산값 : 4.844561115671199 5.1074388843288006
import numpy as np, scipy.stats as st
# 95
st.t.interval(0.95, len(son)-1, loc=np.mean(son), scale=st.sem(son))
# 99
st.t.interval(0.99, len(son)-1, loc=np.mean(son), scale=st.sem(son))
11) 데이터 그룹화
def make_group(inp):
num_0 = 0
num_1 = 0
num_2 = 0
num_3 = 0
num_4 = 0
num_5 = 0
num_6 = 0
num_7 = 0
num_8 = 0
num_9 = 0
num_10 = 0
for i in inp:
if i == 0:
num_0 +=1
elif i == 1:
num_1 +=1
elif i == 2:
num_2 +=1
elif i == 3:
num_3 +=1
elif i == 4:
num_4 +=1
elif i == 5:
num_5 +=1
elif i == 6:
num_6 +=1
elif i == 7:
num_7 +=1
elif i == 8:
num_8 +=1
elif i == 9:
num_9 +=1
elif i == 10:
num_10 +=1
result = pd.DataFrame({
'standard' : ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10'],
'result' : [num_0, num_1, num_2, num_3, num_4, num_5, num_6, num_7, num_8, num_9, num_10]
})
return result
12) 그래프 생성
- 빨간색 : 95% 신뢰구간
- 초록색 : 99% 신뢰구간
def make_plot(inp):
min95, max95 = ci95(inp)
min99, max99 = ci99(inp)
min_inp = min(inp)
max_inp = max(inp)
mean_inp = mean(inp)
# 그래프 그리기
fig = plt.figure()
fig.set_size_inches(15, 5)
result = make_group(son)
plt.plot(result['result'], color = 'b')
plt.axvline(min95, color = 'r', linestyle = ':')
plt.axvline(max95, color = 'r', linestyle = ':')
plt.axvline(min99, color = 'g', linestyle = ':')
plt.axvline(max99, color = 'g', linestyle = ':')
make_plot(son)
- 결과
2. 참고
- axvline
'Science > 통계학' 카테고리의 다른 글
[통계학] python을 이용한 블로그 방문자수 회귀선 그리기 (0) | 2020.08.29 |
---|---|
[통계학] python을 이용한 부트스트랩 구현 (2) | 2020.08.28 |
[통계학] python으로 F 분포 그래프 그리기 (0) | 2020.08.19 |
[통계학] python을 통한 자유도에 따른 카이제곱 분포 그리기 (0) | 2020.08.19 |
[통계학] python으로 포아송 분포 함수 구현하기 (0) | 2020.08.18 |
Comments