Python 데이터 분석
t-test 검정 문제(2) DB 예제, 정규성 확인
코딩탕탕
2022. 11. 8. 17:19
[two-sample t 검정 : 문제3]
DB에 저장된 jikwon 테이블에서 총무부, 영업부 직원의 연봉의 평균에 차이가 존재하는지 검정하시오.
연봉이 없는 직원은 해당 부서의 평균연봉으로 채워준다.
# [two-sample t 검정 : 문제3]
# DB에 저장된 jikwon 테이블에서 총무부, 영업부 직원의 연봉의 평균에 차이가 존재하는지 검정하시오.
# 연봉이 없는 직원은 해당 부서의 평균연봉으로 채워준다.
# 귀무 : 총무부, 영업부 직원의 연봉의 평균에 차이가 존재하지 않는다.
# 대립 : 총무부, 영업부 직원의 연봉의 평균에 차이가 존재한다.
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 buser_name, jikwon_pay from jikwon
JOIN buser ON buser_num = buser_no
"""
cursor.execute(sql)
# datas = cursor.fetchall() # 이 방법도 있다.
datas = pd.read_sql(sql, conn)
df = pd.DataFrame(datas)
df.columns = '부서명', '연봉'
df.index = range(1, 31)
# print(df.head(2))
# print("부서멸 연봉의 합 : ", df.groupby(['부서명'])['연봉'].sum())
print("부서별 연봉의 합 : ", df.groupby(['부서명'])['연봉'].mean())
a = df[df['부서명'] == '총무부']
a_pay_mean = a.loc[:,'연봉']
print(a_pay_mean)
b = df[df['부서명'] == '영업부']
b_pay_mean = b.loc[:,'연봉']
print(b_pay_mean)
print(stats.shapiro(a_pay_mean)) # pvalue=0.02604 < 0.05 이므로 정규성 불만족
print(stats.shapiro(b_pay_mean)) # pvalue=0.02560 < 0.05 이므로 정규성 불만족
print(stats.mannwhitneyu(a_pay_mean, b_pay_mean)) # 정규성 만족이 안 될 때 이 방법을 사용한다.
# statistic=51.0, pvalue=0.47213346080125185
except Exception as e:
print('err :', e)
finally:
cursor.close()
conn.close()
# 해석 : pvalue=0.47213 > 0.05 이므로 귀무 채택. 총무부, 영업부 직원의 연봉의 평균에 차이가 존재하지 않는다.
<console>
부서별 연봉의 합 : 부서명
관리부 6262.500000
영업부 4908.333333
전산부 5328.571429
총무부 5414.285714
Name: 연봉, dtype: float64
1 9900
10 3700
13 4900
17 8000
25 3800
26 3500
29 4100
Name: 연봉, dtype: int64
2 8800
3 7900
5 3000
6 2950
8 7800
15 4000
16 3000
20 2900
21 2950
24 4500
27 5900
28 5200
Name: 연봉, dtype: int64
ShapiroResult(statistic=0.7803537845611572, pvalue=0.02604489028453827)
ShapiroResult(statistic=0.8372057676315308, pvalue=0.02560843899846077)
MannwhitneyuResult(statistic=51.0, pvalue=0.47213346080125185)
정규성을 만족하지 않는 경우 두 가지 방법이 있다.
result2 = stats.wilcoxon(sco1, sco2)
result2 = stats.mannwhitneyu(sco1, sco2)
[대응표본 t 검정 : 문제4]
어느 학급의 교사는 매년 학기 내 치뤄지는 시험성적의 결과가 실력의 차이없이 비슷하게 유지되고 있다고 말하고 있다. 이 때, 올해의 해당 학급의 중간고사 성적과 기말고사 성적은 다음과 같다. 점수는 학생 번호 순으로 배열되어 있다.
중간 : 80, 75, 85, 50, 60, 75, 45, 70, 90, 95, 85, 80
기말 : 90, 70, 90, 65, 80, 85, 65, 75, 80, 90, 95, 95
그렇다면 이 학급의 학업능력이 변화했다고 이야기 할 수 있는가?
# [대응표본 t 검정 : 문제4]
# 어느 학급의 교사는 매년 학기 내 치뤄지는 시험성적의 결과가 실력의 차이없이 비슷하게 유지되고 있다고 말하고 있다. 이 때, 올해의 해당 학급의 중간고사 성적과 기말고사 성적은 다음과 같다. 점수는 학생 번호 순으로 배열되어 있다.
# 그렇다면 이 학급의 학업능력이 변화했다고 이야기 할 수 있는가?
# 귀무 : 매년 학기 내 치뤄지는 시험성적의 결과는 실력의 차이가 없다.
# 대립 : 매년 학기 내 치뤄지는 시험성적의 결과는 실력의 차이가 있다.
num1 = [80, 75, 85, 50, 60, 75, 45, 70, 90, 95, 85, 80]
num2 = [90, 70, 90, 65, 80, 85, 65, 75, 80, 90, 95, 95]
print(np.mean(num1), ' ', np.mean(num2)) # 74.1666 vs 81.6666 차이?
print(stats.shapiro(num1)) # pvalue=0.36814 > 0.05 이므로 정규성 만족
print(stats.shapiro(num2)) # pvalue=0.19300 > 0.05 이므로 정규성 만족
print(stats.ttest_rel(num1, num2))
# statistic=-2.6281127723493993, pvalue=0.023486192540203194
# 해석 : pvalue=0.02348 < 0.05 이므로 귀무 기각. 매년 학기 내 치뤄지는 시험성적의 결과는 실력의 차이가 있다.
<console>
74.16666666666667 81.66666666666667
ShapiroResult(statistic=0.9288562536239624, pvalue=0.3681465983390808
ShapiroResult(statistic=0.9066108465194702, pvalue=0.19300280511379242
Ttest_relResult(statistic=-2.6281127723493993, pvalue=0.023486192540203194