본문 바로가기

코딩으로 익히는 Python/통계

[Python] 3. 공분산, 상관계수

728x90
반응형
SMALL
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

 

데이터 불러오기 (pd.read_csv)

python 파일 경로에 data3 폴더 만든 후 다음의 ch2_scores_em.csv파일 넣어놓기

ch2_scores_em.csv
0.00MB

df = pd.read_csv('data3/ch2_scores_em.csv',
                 index_col='student number')
df.head()

 

# 이해를 위해 10개만 따로 발췌해서 보도록 하자
en_scores = np.array(df['english'])[:10]
ma_scores = np.array(df['mathematics'])[:10]

scores_df = pd.DataFrame({'english':en_scores,
                          'mathematics':ma_scores},
                         index=pd.Index(['A', 'B', 'C', 'D', 'E',
                                         'F', 'G', 'H', 'I', 'J'],
                                        name='student'))
scores_df

 

plt.xlabel('english')
plt.ylabel('mathematics')
plt.scatter(scores_df['english'],scores_df['mathematics'],color='magenta') # scatter plot
plt.axhline(scores_df['mathematics'].mean(),color='r',ls='--') # h : 수평
plt.axvline(scores_df['english'].mean(),color='b',ls='--') # v : 수직
plt.show()


공분산

- 두 데이터 사이의 관계를 나타내는 지표 (편차곱의 평균)

- 양의 값: 면적이 양의 값이 되는 데이터가 많다 ( + 끼리, 또는 - 끼리 곱한다)

- 음의 값: 면적이 음의 값이 되는 데이터가 많다

- 0 에 가까우면 무상관

 

summary_df = scores_df.copy()

summary_df['english_deviation'] =\
    summary_df['english'] - summary_df['english'].mean()
summary_df['mathematics_deviation'] =\
    summary_df['mathematics'] - summary_df['mathematics'].mean()
summary_df['product of deviations'] =\
    summary_df['english_deviation'] * summary_df['mathematics_deviation']
summary_df

 

eng =summary_df['english']
math =summary_df['mathematics']

 

eng # series
[OUT] :

student
A    42
B    69
C    56
D    41
E    57
F    48
G    65
H    49
I    65
J    58
Name: english, dtype: int64

 

math # series
[OUT] :

student
A    65
B    80
C    63
D    63
E    76
F    60
G    81
H    66
I    78
J    82
Name: mathematics, dtype: int64

 

1. 함수로 만들어서 구하기

 

def covariance(X, Y): 
    ax, ay = X.mean(), Y.mean()
    data = [round((ax-x)*(ay-y),2) for x, y in zip(X, Y)] # product of deriviations
    print('data:',data)
    return sum(data) / len(X)

 

covariance(eng,math)
[OUT] :

data: [83.2, 120.4, -8.4, 117.6, 9.2, 79.8, 96.0, 32.4, 66.0, 31.8]
62.8

 

covariance(math,eng)
[OUT] :

data: [83.2, 120.4, -8.4, 117.6, 9.2, 79.8, 96.0, 32.4, 66.0, 31.8]
62.8

 

covariance(math,math)
[OUT] :

data: [40.96, 73.96, 70.56, 70.56, 21.16, 129.96, 92.16, 29.16, 43.56, 112.36]
68.44

 

covariance(eng,eng)
[OUT] :

data: [169.0, 196.0, 1.0, 196.0, 4.0, 49.0, 100.0, 36.0, 100.0, 9.0]
86.0

 

2. 넘파이 함수를 이용해서 구하기

 

# ddof=0 : 모집단에서 추출하므로 n으로 나눔
# ddof=1 :표본집단에서 추출하므로 n-1로 나눔(default)
np.cov(eng,math,ddof=0) 
# (영영,영수,
#  수영,수수)
[OUT] :

array([[86.  , 62.8 ],
       [62.8 , 68.44]])

 

eng = summary_df['english'].values
eng.var() # 영영 공분산은 영어점수의 분산과 같다(당연)
[OUT] :

86.0

상관계수

- 단위에 의존하지 않는 상관 관계 지표 (공분산을 편차곱으로 나눈다, -1 ~ 1 의 값을 가진다)

- 공분산 수치를 표준화함

 

np.cov(eng,math,ddof=0)[0,1]
[OUT] :

62.800000000000004

 

np.cov(eng,math,ddof=0) / (np.std(eng)*np.std(math))
[OUT] :

array([[1.12097061, 0.81856923],
       [0.81856923, 0.89208405]])

 

# 상관관계
np.corrcoef(eng,math)
[OUT] :

array([[1.        , 0.81856923],
       [0.81856923, 1.        ]])

 

scores_df.corr()


review
- 공분산, 상관계수는 표준화 여부의 차이
728x90
반응형
LIST