DataAnalysis-양측검정,상관분석

4 minute read

양측검정

양측검정과 단측검정에 대해서 간단히 말하면

$$ 대립가설 \neq 이면 양측검정 $$

$$ 대립가설 > or < 이면 양측검정 $$

그렇다면 우리가 공부해왔던 카이제곱과 T검정은 양측검정인가?라는 의문이 든다.
이것에 대한 해답은 카이제곱과 T분포 그래프를 보면 이해하기 쉽다.
카이제곱 그래프

그림출처:존이 blog

T분포 그래프( 자유도가 10일 때, 확률이 0.05)

그림출처:godrag blog

위의 두 그래프를 살펴보게 되면 결국에는 그래프에서 단측만을 사용하므로 카이제곱과 T검정은 단측검정이라는 결론을 내릴수 있다.
아래는 양측검정의 예시이다.

귀무가설임의 교육 수료 후, 80% 정도의 만족률을 보인다.
대립가설임의 교육 수료 후, 80% 정도의 만족률을 보이지 않는다.
결과p-value(0.000673) < 0.05(95% 신뢰확률에서의 유의수준) => 대립가설 채택


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
#양측 검정 : 방향성이 없다. 80% 만족률 검증 실시
#귀무가설: 임의 교육 수료 후, 80% 정도의 만족률을 보인다.
#대립가설: 임의 교육 수료 후, 80% 정도의 만족률을 보이지 않는다.

print("---"*20)
print("양측 검정: 방향성이 없다. 80% 만족률 검증 실시")

data = pd.read_csv("https://raw.githubusercontent.com/wjddyd66/R/master/Data/one_sample.csv")
print("\ndata: ", data.head(3))
print("\ndata.describe(): ", data.describe())

ctab = pd.crosstab(index=data["survey"], columns="count")
ctab.index = ["불만족", "만족"]
print("\n ctab: ",ctab) # 불만족 14, 만족 136

result = stats.binom_test([136, 14], p=0.8, alternative="two-sided")
result2 = stats.binom_test([14, 136], p=0.2, alternative="two-sided")
# alternative -> 방향성 명시
# alternative= : {'two-sided','greater','less'} 선택 사항 :기본은 two-sided

print("\n result:",result) # p-value = 0.000673 < 0.05 (대립 채택)
print("result2:",result2)
# 기존 만족율 80% 라는 결과와는 차이가 있다.
# 검정 결과에서 '크다, 작다' 등의 방향성은 제시하지 않는다.
# 옵션을 반대로 입력해주어도 같은 결과를 보인다.


------------------------------------------------------------
양측 검정: 방향성이 없다. 80% 만족률 검증 실시

data:     no    gender  survey time
0   1         2       1  5.1
1   2         2       0  5.2
2   3         2       1  4.7

data.describe():                 no      gender      survey
count  150.000000  150.000000  150.000000
mean    75.500000    1.526667    0.906667
std     43.445368    0.500961    0.291874
min      1.000000    1.000000    0.000000
25%     38.250000    1.000000    1.000000
50%     75.500000    2.000000    1.000000
75%    112.750000    2.000000    1.000000
max    150.000000    2.000000    1.000000

 ctab:  col_0  count
불만족       14
만족       136

 result: 0.0006734701362867019
result2: 0.000673470136286707

만족률이 더 클것이라고 가정한 경우

1
2
3
4
#만족률이 더 클것이라고 가정한 경우
result3 = stats.binom_test([136, 14], p=0.8, alternative="greater")
print("result3:",result3)
#p-value=0.000317 < 0.05 -> 대립 채택


result3: 0.0003179401921985477


만족률이 더 작을것이라고 가정한 경우

1
2
3
4
#만족률이 더 작을이라고 가정한 경우
result4 = stats.binom_test([14, 136], p=0.2, alternative="less")
print("result4:",result4)
#p-value=0.000317 < 0.05 -> 대립 채택


result4: 0.0003179401921985477


0을 기준으로서 대칭이르모 결과는 같다는 것을 살펴볼 수 있다.

상관 분석

상관 분석을 알기 위해서는 상관계수를 알아야 한다.
상관계수를 알기 위하여 공분산에 대하여 알아보자.
공분산(Covariance)란 각 확률변수 들이 어떻게 퍼져있는지를 나타내는 것이다.
아래 그림은 공분산에 대한 그림이다.

그림출처:destrudo blog
공분산은 아래와 같이 표시할 수 있다.

$$ Cov(X,Y) = E((X-u)(Y-v)) (u: X의 평균, v: Y의 평균)$$

공분산의 문제는 X와 Y의 단위의 크기에 영향을 받는다는 것이다.
즉 다시말해 100점만점인 두과목의 점수 공분산은 별로 상관성이 부족하지만 100점만점이기 때문에 큰 값이 나오고
10점짜리 두과목의 점수 공분산은 상관성이 아주 높을지만 10점만점이기 때문에 작은값이 나온다.
이를 보안하기 위해 상관계수(Correlation)이 나타난다.
상관계수는 크기에 영향을 받지 않도록 공분산을 단위화한 것이라고 생각할 수 있다.
상관계수는 아래와 같은 식으로서 나타낼 수 있다.

$$ p = \frac{Cov(X,Y)}{\sqrt{Var(X)Var(Y)}} (-1 \le p \le 1)$$

아래는 상관 분석을 알아본 것이다.

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
# 상관분석 : 두 변수 간에 어떤 선형적 관계가 있는지 분석. 밀도를 수치화
import pandas as pd
from pandas import Series
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
plt.rc('font', family='malgun gothic')

data = pd.read_csv("https://raw.githubusercontent.com/wjddyd66/R/master/Data/drinking_water.csv")
print(data.head(3))
print(data.describe())

print('\n공분산')
print(np.cov(data.친밀도, data.적절성))
print(np.cov(data.친밀도, data.만족도))
print()
print(data.cov())
print("\n상관계수")
print(np.corrcoef(data.친밀도, data.적절성))
print()
print(data.corr(method='pearson')) # 등간, 비율척도일때 주로 사용
# print(data.corr(method='spearman')) # 서열척도일때 주로 사용
# print(data.corr(method='kendall')) 

# sns.heatmap(data.corr())
# plt.show()

# hitmap에 텍스트 표시 추가사항 적용해 보기
corr = data.corr()
# Generate a mask for the upper triangle
mask = np.zeros_like(corr, dtype=np.bool)  # 상관계수값 표시
mask[np.triu_indices_from(mask)] = True
# Draw the heatmap with the mask and correct aspect ratio
vmax = np.abs(corr.values[~mask]).max()
fig, ax = plt.subplots()     # Set up the matplotlib figure

sns.heatmap(corr, mask=mask, vmin=-vmax, vmax=vmax,
square=True, linecolor="lightgray", linewidths=1, ax=ax)

for i in range(len(corr)):
    ax.text(i + 0.5, len(corr) - (i + 0.5), corr.columns[i],
ha="center", va="center", rotation=45)
    for j in range(i + 1, len(corr)):
        s = "{:.3f}".format(corr.values[i, j])
        ax.text(j + 0.5, len(corr) - (i + 0.5), s, ha="center", va="center")
ax.axis("off")
plt.show()


   친밀도  적절성  만족도
0    3    4    3
1    3    3    2
2    4    4    4
              친밀도         적절성         만족도
count  264.000000  264.000000  264.000000
mean     2.928030    3.132576    3.094697
std      0.970345    0.859657    0.828744
min      1.000000    1.000000    1.000000
25%      2.000000    3.000000    3.000000
50%      3.000000    3.000000    3.000000
75%      4.000000    4.000000    4.000000
max      5.000000    5.000000    5.000000

0.9685051269352726
0.858027707764203
0.8271724742228972

공분산
[[0.94156873 0.41642182]
 [0.41642182 0.73901083]]
[[0.94156873 0.37566252]
 [0.37566252 0.68681588]]

          친밀도       적절성       만족도
친밀도  0.941569  0.416422  0.375663
적절성  0.416422  0.739011  0.546333
만족도  0.375663  0.546333  0.686816

상관계수
[[1.         0.49920861]
 [0.49920861 1.        ]]

          친밀도       적절성       만족도
친밀도  1.000000  0.499209  0.467145
적절성  0.499209  1.000000  0.766853
만족도  0.467145  0.766853  1.000000


상관관계 그래프로서 표현


참조: 원본코드
코드에 문제가 있거나 궁금한 점이 있으면 wjddyd66@naver.com으로 Mail을 남겨주세요.

Leave a comment