<jupyter_start><jupyter_text>상관계수 ( Correlation Coefficient )  Index1. 분산1. 공분산1. 상관계수1. 결정계수1. 프리미어리그 데이터 상관계수 분석<jupyter_code>import numpy as np<jupyter_output><empty_output><jupyter_text>샘플 데이터 생성<jupyter_code>data1 = np.array([80, 85, 100, 90, 95])
data2 = np.array([70, 80, 100, 95, 95])<jupyter_output><empty_output><jupyter_text>2. 분산(variance)- 1개의 이산정도를 나타냄- 편차제곱의 평균 $ variance = \frac{\sum_{i=1}^n{(x_i-\bar{x})^2}}{n}, (\bar{x}:평균) $<jupyter_code># variance code
def variance(data):
    
    avg = np.average(data)
    var = 0
    for a in data:
        var += (a - avg)**2
    return var / len(data)<jupyter_output><empty_output><jupyter_text>일반 함수와 numpy 함수의 퍼포먼스 비교<jupyter_code>variance(data1), variance(data2), variance(data1)**2, variance(data2)**2
np.var(data1), np.var(data2), np.std(data1), np.std(data2)<jupyter_output><empty_output><jupyter_text>일반 함수와 numpy 함수의 퍼포먼스 비교<jupyter_code>p_data1 = np.random.randint(60, 100, int(10E4))
p_data2 = np.random.randint(60, 100, int(10E4))
# 일반함수
%%time
variance(p_data1), variance(p_data2)
# numpy
%%time
np.var(p_data1), np.var(p_data2)<jupyter_output>Wall time: 3.99 ms<jupyter_text>3. 공분산(covariance)- 2개의 확률변수의 상관정도를 나타냄- 평균 편차곱- 방향성은 보여줄수 있으나 강도를 나타내는데 한계가 있다    - 표본데이터의 크기에 따라서 값의 차이가 큰 단점이 있다 $ covariance = \frac{\sum_{i=1}^{n}{(x_i-\bar{x})(y_i-\bar{y})}}{n}, (\bar{x}:x의 평균, \bar{y}:y의 평균) $<jupyter_code># covariance function
def cov_hee(data1, data2):
    avg1, avg2 = np.average(data1), np.average(data2)
    result = 0
    for a1, a2 in zip(data1, data2):
        value = (a1 - avg1)*(a2-avg2)
        result += value
    return result/len(data1)
def cov_hee2(data1, data2):
    avg1, avg2 = np.average(data1), np.average(data2)
    return [sum((d1-avg1)*(d2-avg2)) / len(data1) for d1, d2 in zip(data1, data2)]
data1 = np.array([80, 85, 100, 90, 95])
data2 = np.array([70, 80, 100, 95, 95])
np.cov(data1, data2)
cov_hee(data1, data2)
data3 = np.array([80, 85, 100, 90, 95])
data4 = np.array([100, 90, 70, 90, 80])
np.cov(data3, data4)[0,1]
data5 = np.array([800, 850, 1000, 900, 950])
data6 = np.array([1000, 900, 700, 900, 800])
np.cov(data5, data6)[0,1]<jupyter_output><empty_output><jupyter_text>4. 상관계수(correlation coefficient)- 공분산의 한계를 극복하기 위해서 만들어짐- -1 ~ 1까지의 수를 가지며 0과 가까울수록 상관도가 적음을 의미- x의 분산과 y의 분산을 곱한 결과의 제곱근을 나눠주면 x나 y의 변화량이 클수록 0에 가까워짐- https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.corrcoef.html $ correlation-coefficient = \frac{공분산}{\sqrt{{x분산} \cdot {y분산}}} $ 최종 상관계수 $ r = \frac{\sum(x-\bar{x})(y-\bar{y})}{\sqrt{{\sum(x-\bar{x})^2}\cdot{\sum(y-\bar{y})^2}}} $<jupyter_code># correlation coefficient function
def coef_hee(dt1, dt2):
    avg1, avg2 = np.average(dt1), np.average(dt2)
    a, b, c = 0, 0, 0
    for dt_a1, dt_a2 in zip(dt1, dt2):
        a += (dt_a1 - avg1)*(dt_a2 - avg2)
    for dt_a1 in dt1:
        b += (dt_a1 - avg1)**2
    for dt_a2 in dt2:
        c += (dt_a2 - avg2)**2
    return a / (b*c)**(1/2)
# correlation coefficient function
np.corrcoef(data1, data2)[0, 1], np.corrcoef(data3, data4)[0, 1], np.corrcoef(data5, data6)[0, 1]
coef_hee(data1, data2)<jupyter_output><empty_output><jupyter_text>5. 결정계수(cofficient of determination: R-squared)- x로부터 y를 예측할수 있는 정도- 상관계수의 제곱 (상관계수를 양수화)- 수치가 클수록 회기분석을 통해 예측할수 있는 수치의 정도가 더 정확<jupyter_code>np.corrcoef(data1, data2)[0, 1]**2, np.corrcoef(data3, data4)[0, 1]**2<jupyter_output><empty_output><jupyter_text>6. 프리미어리그 데이터 상관계수 분석- 2016년 프리미어리그 성적에서 득점과 실점 데이터중에 승점에 영향을 더 많이 준 데이터는?<jupyter_code>import pandas as pd
df = pd.read_csv("datas/premierleague.csv")
df.tail()
# 득점
gf = np.array(df["gf"])
gf
# 실점
ga = np.array(df["ga"])
ga
# 승점
points = np.array(df["points"])
points
data1, data2 = np.corrcoef(gf, points)[0,1]**2, np.corrcoef(ga, points)[0,1]**2
round(data1, 2), round(data2, 2)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.17940635671132124, 'fraction_numerical': 0.07381140005253481, 'mean_word_length': 4.616519174041298, 'pattern_counts': {'":': 0, '<': 36, '<?xml version=': 0, '>': 36, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '287127', 'license': 'MIT', 'n_tokens_mistral': 2176, 'n_tokens_neox': 2291, 'n_words': 373, 'path': 'python/exam_01_correlation_coefficient_pearson.ipynb', 'repo_name': 'hee22/TIL', 'size': '3807'}