본문 바로가기

나 취준생/파이썬

가설 검정해주는 함수 만들어보기

320x100

이번에는 가설을 검정해주는 함수를 만들어봤다


저번 모평균, 모비율 추정하는 함수를 만들 때

global 변수를 너무 무분별하게 사용한 것 같아서

이번에는 하나도 안 쓰고 만들어봤다!

덕분에 매개 변수의 개념에 대해서 조금 더 잘 알 수 있게 되었다.


코드 설명 :


1. 단측, 양측에 따라 검정 통계량에 - 부호를 달거나, 절대값을 달아줘야 하고

무엇보다 표본의 검정값과 비교하는 기각역이 달라지기 때문에

기각역을 결정하기 위해 대립 가설의 종류를 물어본다.


2. 표본의 크기를 물어 z 검정값을 쓸지 t 검정값을 쓸지 결정한다.


3. 유의 확률을 입력받아 z 검정값을 반환한다. t 검정값은 자유도에 따라 너무나 다양하기 때문에 직접 입력받는 걸로


4. 표본의 통계량을 입력받아 표본 검정값을 계산한다.


5. 표본 검정값과 검정 통계량을 같이 출력하여 왜 귀무가설을 기각할 수 있는지, 또는 없었는지를 확인 가능!

   마지막으로 그 가설 검정의 결론을 출력한다


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import math
def verify():
    say=0
    temp=True
    flag=''
    while(temp==True):
        say=input('어떤 주장을 하고 싶은가요?\n1. ~보다 작다 2. ~와 차이가 있다 3. ~보다 크다     : ')
        if say=='1' or say=='3':
            print()
            print('---단측 검정을 실시합니다---')
            temp=False
        elif say=='2':
            print()
            print('---양측 검정을 실시합니다---')
            temp=False
        else:
            print()
            print('---다시 입력하세요---')
    n=int(input('표본의 크기를 입력하세요 : '))
    if n>=30:
        flag='Z'
        print()
        print('---z검정 통계량을 사용합니다---')
    else:
        print()
        print('---t검정 통계량을 사용합니다---')
        flag='T'
    tong2=tong(flag,temp,say)
    comp=ask(n)
    if say=='1':
        tong2*=-1
    elif say=='2':
        tong2=abs(tong2)
    print('검정 통계량은 : ',tong2, '이고,')
    print('표본에 따른 통계량은 : ',comp, '이기 때문에,')
    if say=='1':
        if comp<=tong2:
            print('와~ 표본의 검정값이 더 작으므로 귀무가설을 기각할 수 있습니다!!')
        else:
            print('표본의 검정값이 더 작지 않으므로 귀무가설을 기각할 수 없습니다 ㅠ')
    elif say=='2':
        if comp>=tong2:
            print('와~ 표본의 검정값이 검정 통계량의 절대값보다 크므로 귀무가설을 기각할 수 있습니다!!')
        else:
            print('표본의 검정값이 검정 통계량의 절대값보다 크지 않으므로 귀무가설을 기각할 수 없습니다 ㅠ')
    elif say=='3':
        if comp>tong2:
            print('와~ 표본의 검정값이 더 크므로 귀무가설을 기각할 수 있습니다!!')
        else:
            print('표본의 검정값이 더 크지 않으므로 귀무가설을 기각할 수 없습니다 ㅠ')
            
def tong(flag,temp,say):
    if flag=='Z' and say=='2':
        while(temp==False):
            per=float(input('몇 %의 유의 확률? (0.1, 0.05, 0.01 만 가능합니다) : ' ))
            if per==0.1:
                z=1.645
                return z
            elif per==0.05:
                z=1.96
                return z
            elif per==0.01:
                z=2.576
                return z
            else:
                print()
                print('-----다시 입력하세요-----')
    elif flag=='Z' and (say=='1' or say=='3') :
        while(temp==False):
            per=float(input('몇 %의 유의 확률? (0.1, 0.05, 0.01 만 가능합니다) : ' ))
            if per==0.1:
                z=1.23
                return z
            elif per==0.05:
                z=1.64
                return z
            elif per==0.01:
                z=2.33
                return z
            else:
                print()
                print('-----다시 입력하세요-----')
    elif flag=='T':
        f=float(input('유의 확률에 따른 t 값을 입력하세요\n자유도를 표본의 수 -1로 하여 표에서 직접 찾아 입력해주세요 : '))
        return f
    else:
        print('tong 함수에서 오류 발생')
 
def ask(n):
    sam_mean=float(input('표본의 평균을 입력하세요 : '))
    mean=float(input('귀무 가설의 평균을 입력하세요 : '))
    std=float(input('모표준편차 또는 표본표준편차를 입력하세요 \n(둘 다 알고 있을 경우는, 모표준편차를 입력해주세요) : '))
    compare=(sam_mean-mean)/(std/math.sqrt(n))
    return compare
    
verify()
cs


문제 풀이



--> 정답!






--> 정답!


반응형