기초통계 (1)위치추정

생각하는 마리오네트·2021년 7월 28일
0

통계

목록 보기
6/41
post-thumbnail

(기초통계 학습 내용은 도서 : Practical Statistics for Data Scientists 책을 참고하여 학습 후 내용을 정리한 포스팅입니다.)

💡 위치 추정

데이터를 살펴보는 기초 단계중 하나는 각 feature(변수)의 대푯값을 구하는 것이다. 이는 곧 값이 어디쯤 위치하는지(중심경향성)를 나타내는 추정값이다.

  • 평균 : 모든 값들의 합을 개수로 나눈 값
  • 가중평균 : 가중치를 곱한 값의 총합을 가중치의 총합으로 나눈 값
  • 중간값 : 데이터에서 가장 가운데 위치한 값
  • 백분위수(percentile) : 전체 데이터의 X%를 아래에 두는 값
    Ex) 1사분면 : 하위 25%
  • 가중 중간값 : 데이터를 정렬한 후, 각 가중치 값을 위에서부터 더할 때, 총합의 중간이 위치하는 데이터 값
  • 절사평균 : 정해진 개수의 극단값을 제외한 나머지 값들의 평균
  • 로버스트하다(robust) : 극단값들에 민감하지 않다는 것을 의미한다.
  • 특잇값 : 대부분의 값과 매우 다른 데이터 값

📈 평균

  • 평균은 가장 기본적이면서 친숙한 위치 추정 방법이다. 평균은 모든 값의 총합을 개수로 나눈 값이다.
  • 코드로는 mean()을 사용해서 평균을 구할 수 있다.
  • 극단값에 민감하다.

📈 절사평균

  • 평균을 조금 변형한 것 중 하나로서 값들을 크기순서로 정렬을 한 후, 양 끝에서 일정 개수의 값들을 삭제한 뒤 남은 값들을 가지고 구한 평균을 말한다.
  • 즉, 절사평균은 극단값의 영향을 제거한다는 것이다. 양 극단값을 제거함으로서 좀 더 이상치의 영향을 덜 받아 로버스트하게 된다.
  • 코드로는 먼저 from scipy import stats로 메소드를 불러오고 stats.trim_mean()을 통해 구할 수 있습니다. 이때 또 넣어주어야 할 값이 각 끝에 빼줄 값의 크기를 부여 해 주어야한다. stats.trim_mean(fruits['apple'], 0.1 ) 이런식으로 뒤에 0.1을 넣으면 위,아래 10%를 뜻한다.
  • 코드예시
# 적용 예시
from scipy import stats
df = pd.DataFrame({'House' :[1,2,51,52,53,54,55,99,100,50000],
                   'Car' : [0,0,1,1,1,1,1,1,1,3]})

df['House'].mean() 
>>> 5046.7

trim_mean(df['House'],0.1)
>>> 58.25

📈 가중평균

  • 또 다른 종류의 평균으로, 각 데이터에 사용자가 지정한 가중치(w)를 곱한 값들의 총합을 다시 가중치의 총합으로 나누어준 가중평균이 있다.
  • 가중평균을 사용하는 이유는 센서를 통해 데이터의 평균을 낸다고 가정했을때 특정 하나의 센서가 다른 센서들에 비해 정확도가 떨어질 경우에는 떨어지는 해당 센서에서 나오는 데이터는 낮은 가중치를 주는것이다
  • 또 다른 예로 데이터를 수집할때 여러 대조군에서 수집한다고 가정하자, 이때 특정 A의 그룹은 데이터가 작아 수집되는 데이터 양이 적은데 이때 소수그룹에는 좀 더 높은 가중치를 적용할 필요가 있다.(반드시 그런것은 아니다.)
# 아무렇게나 만든데이터이고 Car는 House가 낮으면 0 보통은1로하고 높은값은 3으로 만들었다
df = pd.DataFrame({'House' :[1,2,51,52,53,54,55,99,100,50000],
                   'Car' : [0,0,1,1,1,1,1,1,1,3]})
                   
import numpy as np
np.average(df['House'], weights = df['Car']) # 가중평균구하기

>>> 15046.4 
# 평균 : 5046.7/ 절사평균 : 58.25/ 가중평균 15046.4

실제우리는 데이터를 커스텀하여 가중치를 부여해주는 경우가 많다 따라서 numpy만을 사용하여 가중치를 컨트롤 하는방법을 알고있어야한다.

import numpy as np
values = np.array([10.0, 20.0, 30.0])
weights = np.full_like(values, 1/3)

print(f'weights : {weights}')
print('mean :',np.mean(values))   
print('weights means :', np.dot(weights, values))
>>>

weights : [0.33333333 0.33333333 0.33333333]
mean : 20.0
weights means : 20.0

평균은 가중 합(값과 가중치 곱의 총합)으로 표현될 수 있다(이때는 모든 값의 가중치가 같다.). 하지만, 만약 가중치에 변형을 가하면 가중 평균이라는 개념이 된다. 동일한 가중치 대신에 가중 평균의 가중치는 직접 설정할 수 있다. 아래는 세 가지 값에 1/2, 1/4, 1/4이라는 가중치를 매긴다고 해보자. 무슨 의미일까?? 해당 가중치들은 첫 번째 옵션이 두 번째와 세 번째보다 두배 중요하다는 것이며, 두 번째와 세 번째의 가치는 동일하는 것을 의미한다. 또한 확률적 시나리오에서 보면 첫 번째 옵션의 발생 가능성이 다른 두 가지 옵션보다 두 배 높다는 것을 의미할 수도 있다. 이 두가지 해석을 가중치들을 단가나 수량에 적용했을 때와 결과가 비슷하다.

import numpy as np

values = np.array([10, 20, 30])
weights = np.array([.5, .25, .25])

np.dot(weights, values)
>>>

17.5

📈 중간값

  • 데이터를 길게 정렬했을 때, 한가운데 위치하는 값을 중간값이라고 한다. 모든 관측지를 다 사용하는 평균과는 다르게 중간값은 정렬된 데이터의 가운데에 위치한 값들만으로 결정된다.
  • 위와 같은 이유로 중간값이 잘 사용되지 않을것 같지만 데이터에 민감한(이상치 영향등)평균보다 중간값이 위치 추정에 오히려 더 유리할 수 있다.
  • 예를 들어 서울의 A동네에 있는 주민들의 평균연봉 데이터를 가지고 있다고 가정할때, 해당 동네에 대기업 회장이 살고 있을 경우 평균의 데이터는 매우 다르게 나타날 것이다. 하지만 만약 중간값을 사용한다면 대기업 회장이 얼마를 벌고 있는지와 상관없이 중간값은 매우 비슷하게 나올 것이다.

📈 가중 중간값

  • 가중평균을 사용하는 것과 마찬가지로 가중 중간값 역시 사용할 수 있다. 어떤 위치를 기준으로 상위 절반의 가중치의 합이 하위 절반의 가중치의 합과 동일한 위치의 값이 된다. 중간값과 마찬가지로 가중 중간값 역시 특잇값에 로버스트하다.
  • 코드예제

df = pd.DataFrame({'House' :[1,2,51,52,53,54,55,99,100,50000],
                   'Car' : [0,0,1,1,1,1,1,1,1,3]})

# 중간값
df['House'].median()
>>> 53.5

# 가중 중간값
import wquantiles
wquantiles.median(df['House'],weights = df['Car'])
>>> 76.99999999999999

📈 특잇값, 이상값

  • 데이터 분석을 하다보면 가끔 이 특잇값은 유익한 정보를 제공하기도 하고, 때로는 골칫거리가 되기도 한다. 하지만 이와 반대로, 이상검출에서는 대부분의 정상적인 데이터보다는 예외적으로 측정된 특잇값이 바로 주된 관심의 대상이 될 수 있다.

🎓 로버스트하다(robust)

  • 극단값들에 민감하지 않다는 것을 의미한다.
profile
문제를해결하는도구로서의"데이터"

0개의 댓글