분산(Variance), 표준편차, 공분산(Covariance), 상관계수, Span, 기저(Basis), Rank
DataScience/통계-선형대수

분산(Variance), 표준편차, 공분산(Covariance), 상관계수, Span, 기저(Basis), Rank

728x90

◎ 분산(Variance)

  • 분산(variance)은 관측값에서 평균을 뺀 값을 제곱하고, 그것을 모두 더한 후 전체 개수로 나눠서 구한다. 즉, 차이값의 제곱의 평균이다. 관측값에서 평균을 뺀 값인 편차를 모두 더하면 0이 나오므로 제곱해서 더한다.
  • 분산은, 데이터가 얼마나 퍼져있는지를 측정하는 방법입니다.

이는 각 값들의 평균으로부터 차이의 제곱 평균입니다.

즉, 분산을 구하기 위해서는 일반적으로 평균을 먼저 계산하여야 합니다.

- 모분산

σ2은 모집단의 분산이다. 관측값에서 모평균을 빼고 그것을 제곱한 값을 모두 더하여 전체 데이터 수 n으로 나눈 것이다.

- 표본분산

s2은 표본의 분산이다. 관측값에서 표본 평균을 빼고 제곱한 값을 모두 더한 것을 n-1로 나눈 것이다.

 

◎ 표준편차

분산을 구하는 과정에서 우리는 더할때 제곱 값들을 더했습니다.

그렇기 때문에 평균에 비해서 스케일이 커지는 문제가 있는데,

표준 편차는 이를 해결 하기 위해서 제곱 된 스케일을 낮춘 방법입니다.

이는 많은 통계분석 프로세스에서 표준편차를 사용하여 계산하는 이유 중 하나입니다.

출처 머니투데이

▷ python 코드(평균)

v = [243, 278, 184, 249, 207]

def mymean(v):
    return sum(v) / len(v)
mymean(v)

 

<출력>

232.2

▷ python 코드(분산)

v = [243, 278, 184, 249, 207]

def myvar(v):
    v1 = []
    mean1 = sum(v) / len(v)
    for i in v:
        v1.append((i-mean1)**2)
    return sum(v1) / len(v1)
myvar(v)

<출력>

1090.96

▷ python 코드(표준편차)

v = [243, 278, 184, 249, 207]

def mystd(v):
    v1 = []
    mean1 = sum(v) / len(v)
    for i in v:
        v1.append((i-mean1)**2)
    var1 = sum(v1) / len(v1)
    return var1**(1/2)
    
33.02968361943541

<출력>

33.03

▷ python 코드(numpy모듈)

import numpy
arr = [243, 278, 184, 249, 207]

numpy.mean(arr) # 평균
# 232.2
numpy.var(arr) # 분산
# 1090.96
numpy.std(arr) # 표준편차
# 33.02968361943541
numpy.mean(arr), numpy.var(arr), numpy.std(arr)

<출력>

(232.2, 1090.96, 33.02968361943541)


◎ 공분산(Covariance)

공분산은 2개의 확률변수의 선형 관계를 나타내는 값이다. 만약 2개의 변수중 하나의 값이 상승하는 경향을 보일 때 다른 값도 상승하는 선형 상관성이 있다면 양수의 공분산을 가진다.

두 확률변수 X와 Y가 어떤 모양으로 퍼져있는지

즉, X가 커지면 Y도 커지거나 혹은 작아지거나 아니면 별 상관 없거나 등을 나타내어 주는 것이다.

Cov(X, Y) > 0    X가 증가 할 때 Y도 증가한다.
Cov(X, Y) < 0    X가 증가 할 때 Y는 감소한다.
Cov(X, Y) = 0    공분산이 0이라면 두 변수간에는 아무런 선형관계가 없으며 두 변수는 서로 독립적인 관계에 있음을 알 수 있다.

◎ 상관계수

상관계수는 두 변수 사이의 통계적 관계를 표현하기 위해 특정한 상관 관계의 정도를 수치적으로 나타낸 계수이다.

▷ python 코드(공분산, 상관계수)

import numpy as np

var1 = [243, 278, 184, 249, 207]
var2 = [88, 89, 83, 112, 104]

x = np.array(var1)
y = np.array(var2)

mu_x = sum(var1) / len(var1)
mu_y = sum(var2) / len(var2)

res4 = sum((x-mu_x)*(y-mu_y))/len(x) # 공분산
res5 = res4 / (mystd(x)* mystd(y)) # 상관계수
res4, res5

<출력>

(57.35999999999999, 0.1586897351257077)


◎ Span

Span 이란, 주어진 두 벡터의 (합이나 차와 같은) 조합으로 만들 수 있는 모든 가능한 벡터의 집합입니다. 

 

◎ Basis

벡터 공간 V의 basis 는, V 라는 공간을 채울 수 있는 선형 관계에 있지 않은 벡터들의 모음입니다. ( span 의 역개념 )

예를 들어, 위의 그림에서 2개의 벡터 (빨강, 파랑)는 벡터 공간 R2 의 basis 입니다.

 

 Rank

  • 매트릭스의 rank란, 매트릭스의 열을 이루고 있는 벡터들로 만들 수 있는 (span) 공간의 차원입니다.
  • 매트릭스의 차원과는 다를 수도 있으며 그 이유는 행과 열을 이루고 있는 벡터들 가운데 서로 선형 관계가 있을 수도 있기 때문입니다.

☆ 도전

주어진 데이터 (x, y)에 대해서 y = x 라는 벡터에 대해 projection을 계산하는 함수를 작성해보자.

  • (x, y) 는 (0, 0) 에서 (x, y)로 가는 벡터라 가정합니다.

이후

  • 입력된 데이터를 파란색 선으로,
  • y = x 라는 벡터를 빨간색 선으로, 마지막으로
  • projection 된 선을 녹색 점선(dashed)으로 그래프에 그리세요.
import matplotlib.pyplot as plt
import numpy as np
plt.xlim(-0,8)
plt.ylim(-0, 8)

v = [7, 4]
b = [17, 17]

plt.gca().set_aspect('equal')

def myProjection(v):
    a = v
    proj = np.multiply(2.4, b)

    plt.arrow(-8, -8, b[0], b[1], linewidth = 3, head_width = .05, head_length = .05, color = 'r')
    plt.arrow(0, 0, a[0], a[1], linewidth = 2, head_width = 0.3, head_length = 0.5, color = 'b')
    plt.arrow(0, 0, (v[0]+v[1])/2, (v[0]+v[1])/2, linestyle = 'dashed', linewidth = 3, head_width = .05, head_length = .05, color = 'g')

    axes = plt.gca()
    x_vals = np.array(axes.get_xlim())
    y_vals = 0 * x_vals
    plt.plot(x_vals, y_vals, '--', color = 'black')

    plt.title("Linearly Independent Vectors")
    plt.show()

vprime = myProjection(v)


 

728x90