Python 데이터 분석

가설검정 카이제곱 연습 문제(2)

코딩탕탕 2022. 11. 7. 10:51

 

 

# 카이제곱 문제2) 지금껏 A회사의 직급과 연봉은 관련이 없다. 
# 그렇다면 jikwon_jik과 jikwon_pay 간의 관련성 여부를 통계적으로 가설검정하시오.
#   예제파일 : MariaDB의 jikwon table 
#   jikwon_jik   (이사:1, 부장:2, 과장:3, 대리:4, 사원:5)
#   jikwon_pay (1000 ~2999 :1, 3000 ~4999 :2, 5000 ~6999 :3, 7000 ~ :4)
#   조건 : NA가 있는 행은 제외한다.

# 귀무 : 직급과 연봉은 관련이 없다.
# 대립 : 직급과 연봉은 관련이 있다.
import MySQLdb
import pickle

with open('mydb.dat', mode='rb') as obj:
    config = pickle.load(obj)
    
try:
    conn = MySQLdb.connect(**config)
    cursor = conn.cursor()
    sql = "select jikwon_jik, jikwon_pay from jikwon"
    cursor.execute(sql)
    
    ar = [] # if 문이 아닌 cut 함수를 사용할 수도 있다.
    for data in cursor.fetchall():
        jik = 0
        pay = 0
        if data[0] == '이사':
            jik = 1
        elif data[0] == '부장':
            jik = 2
        elif data[0] == '과장':
            jik = 3
        elif data[0] == '대리':
            jik = 4
        elif data[0] == '사원':
            jik = 5
        else:
            jik = 0
            
        if 1000 <= data[1] < 3000:
            pay = 1
        elif 3000 <= data[1] < 5000:
            pay = 2
        elif 5000 <= data[1] < 7000:
            pay = 3
        elif data[1] >= 7000:
            pay = 4
        else:
            pay = 0
        ar.append((jik, pay))
        
    # print(ar)
    df = pd.DataFrame(ar, columns = ['직급', '연봉']).dropna()
    print(df.head(3))
    ctab2 = pd.crosstab(index = df['직급'], columns = df['연봉'])
    ctab2.index = ['이사', '부장', '과장', '대리', '사원']
    ctab2.columns = ['1,2천', '3,4천', '5,6천', '7천이상']
    print(ctab2)
    
    chi2, p, ddof, _ = stats.chi2_contingency(ctab2)
    print('chi2:{}, p:{}, ddof:{}'.format(chi2, p, ddof))
    
    
except Exception as e:
    print('err :', e)
finally:
    cursor.close()
    conn.close()
    
# chi2:37.40349394195548, p:0.00019211533885350577, ddof:12
# 해석 : p : 0.00019211 < 0.05 이므로 귀무가설 기각. 직급과 연봉은 관련이 있다.


<console>
   직급  연봉
0   1   4
1   2   4
2   3   4
    1,2천  3,4천  5,6천  7천이상
이사     0     0     0     1
부장     0     0     0     3
과장     0     0     2     4
대리     0     3     4     0
사원     3    10     0     0
chi2:37.40349394195548, p:0.00019211533885350577, ddof:12