# 카이제곱 문제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