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