Python notes/Statistical Analysis

Python-Statistics) 이산형 확률 변수, 연속형 확률변수의 기대값, 분산 계산 (+numpy, sympy)

성실한 나무 2022. 6. 28. 14:58

#1. 이산형 확률변수

 파이썬으로 이산형 확률변수의 기대값과 분산을 계산해본다. 이 때 필요한 패키지는 numpy이다. 코드를 구현하기에 앞서 이산형 확률변수 x의 기대값(=평균)과 분산을 구하는 공식은 아래와 같다.

이산형 확률변수 x의 기대값, 분산 공식

 기대값 E(x)는 확률변수와 그의 확률값을 각각 곱한 후 전체를 합하여 구한다. 분산 Var(x)는 확률변수 x를 제곱하여 그의 확률값을 각각 곱한 후 전체를 합한 값에 기대값의 제곱을 빼서 구한다. 이를 파이썬 코드로 구현하면 아래와 같다.

파이썬 이산형 확률변수의 기대값, 분산, 표준편차 계산

 표준편차는 분산에 제곱근을 씌워서 구한다. numpy의 sqrt() 함수를 사용하면 쉽게 계산할 수 있다.

 

 

#2. 연속형 확률변수

 연속형 확률변수는 이산형 확률변수 계산보다 조금 더 복잡하다. 적분을 해야 하기 때문이다. 개인적으로 문과라서 미적분을 배운 적이 없었기에 이번에 처음으로 간단한 적분 공식을 배웠다. 여튼, 연속형 확률변수의 기대값, 분산 계산하는 공식은 아래와 같다.

연속형 확률변수 x의 기대값과 분산 계산 공식

 연속형 확률변수의 확률은 x의 변수마다 각각 주어지는 것이 아니라, x의 구간이 주어지면 그 구간에서의 확률밀도함수를 적분하여 그 구간의 확률값을 얻는다. 여기서 확률밀도함수가 위 식에서의 f(x)이다. 그리고 주어지는 구간 사이의 면적이 그 구간의 확률값이 된다. 따라서 음의 무한대에서 양의 무한대 구간(=전체 구간)에서 f(x)를 적분한 값 즉, 전체 확률의 합은 항상 1이 된다.

 한편, F(x)는 연속 확률변수의 누적 확률함수인데, 음의 무한대로부터 x까지 f(x)를 적분한 면적에 해당한다. x가 a에서 b 사이인 면적을 구한다고 할 때 F(b) - F(a)로 그 면적을, 그 구간의 확률값을 구할 수 있다.

 적분계산은 파이썬의 sympy 패키지를 사용해서 쉽게 할 수 있다.

Python, Sympy로 integral 계산

 sympy에서 Symbol과 Integral이라는 함수를 불러오고 x라는 객체에 Symbol('x')를 담는 것으로 시작한다. 그리고 f 객체에 확률밀도 함수를 입력한다. 그리고 그 확률밀도함수를 적분하기위해 Integral()함수에 확률밀도함수 객체를 담고 .doit()으로 적분을 적용한다. 그리고 x_range를 [-1, 2]로 설정해주는데, 그 의미는 -1<= x <= 2사이에서 f(x) 확률밀도함수가 적용되고 나머지 x의 범위에서는 0이라는 값을 가진다는 의미이다. 다음, 확률밀도함수를 적분한 area라는 객체에 .evalf()를 통해 F(x)를 구현한다. 위의 코드의 경우, F(2) - F(-1)을 result에 담는 것으로 작성하였다.

 이때 area.evalf()를 print하면 적분된 확률밀도함수의 공식이 반환되고, result에는 -1<= x <= 2사이의 면적이 계산되어 나온다. 위에서 볼 때 그 값은 1이 되는데 전체 확률값의 합이 1이기 때문이다.

 are.evalf를 통해 0<= x <=1의 구간의 면적도 구할 수 있는데 이는 F(1) - F(0)으로 계산할 수 있으며 그 값은 0.111...이 나온다.

 

그러면, 이제 연속 확률변수의 기대값과 분산을 아래와 같이 구해볼 수 있다. 

Python, Sympy로 연속확률변수 기대값 계산

 

 앞서 본 공식에서 알 수 있듯이 확률밀도함수 f(x)에 x를 곱한 식을 적분하면 기대값을 구할 수 있다. 범위는 확률밀도함수의 전체 범위를 적용하면 된다.

 

Python, Sympy로 연속확률변수 분산 계산

 분산은 f(x제곱)으로 구한 식에서 기대값을 제곱한 값을 빼면 된다.