2011-05-05 12 views
1

이 부분은 수학적, 부분적 루비, 부분 통계 질문의 일종이며, 나는 이보다 훨씬 더 큰 것보다 현재로서는 준비가되어 있지만 어쩌면 누군가가 이런 종류의 솔루션을 구현하는 방법에 대해 밝힐 수있을 것입니다. 기본적으로루비의 추론 통계

, 나는, 시간이 지남에 정수의 집합을 내 해시 같은 것을 보이는 말 : 훨씬 더 큰 것

{ :count => 20, :timestamp => 1304566372 } 
{ :count => 23, :timestamp => 1304566382 } 
{ :count => 23, :timestamp => 1304566392 } 
{ :count => 24, :timestamp => 1304566402 } 
{ :count => 25, :timestamp => 1304566412 } 
{ :count => 22, :timestamp => 1304566422 } 
{ :count => 12, :timestamp => 1304566432 } # <= outlier 
{ :count => 21, :timestamp => 1304566442 } 
{ :count => 20, :timestamp => 1304566452 } 

그리고 데이터의 집합을하지만이 너무, 예를 들어 역할을 할 수있는 I 원하는 것은 평균과 가장 다른 결과를 찾는 것입니다. 그러나 정수는 일종의 곡선을 따를 것이므로 전체 세트를 평균 할 수는 없습니다. 사이트에 대한 방문자 분석과 같은 그림.

내 질문에 루비를 사용하면 수학을 사용하여 커브를 일반화하고 커브의 해당 세그먼트에서 평균과 가장 다른 항목을 찾을 수 있습니까?

저는 수학을 잘하는 사람이 아니기 때문에 이것을 설명하기 위해 잘못된 용어를 사용하고 있습니다. 모든 사람들에게 도움이나 팁을 주셔서 감사합니다!

+1

"구글"이다 Statsample] (https://github.com/sciruby/statsample)에서 이러한 종류의 분석을 수행 할 수 있습니다. – agarie

답변

6

정수 값이 정규 분포에 해당한다고 가정하면 3-sigma rule (표준 편차)을 적용하여 이상 치를 찾을 수 있습니다.

정수 목록의 평균 및 표준 편차를 신속하게 계산한다고 가정 해 봅시다. Enumerable을 다음과 같이 향상시킬 수 있습니다.

module Enumerable 

    def sum 
     self.inject(0){|accum, i| accum + i } 
    end 

    def mean 
     self.sum/self.length.to_f 
    end 

    def sample_variance 
     m = self.mean 
     sum = self.inject(0){|accum, i| accum +(i-m)**2 } 
     (1/self.length.to_f*sum) 
    end 

    def standard_deviation 
     return Math.sqrt(self.sample_variance) 
    end 

    end 

그런 다음 예외 조건이 무엇인지 결정해야합니다. 3 시그마 규칙에서 모든 정수 값의 95 %는 평균으로부터의 표준 편차 (2 시그마) 값의 두 배에 해당합니다. 따라서 평균과의 차이가 2 표준 편차보다 큰 값은 이상 값입니다. 당신을 가정 예를 들어

a라는 배열로 count 값을 요약 :

a = [ 20, 23, 23, 24, 25, 22, 12, 21, 29 ] 
m = a.mean 
# => 22.11111111111111 
sd = a.standard_deviation 
# => 4.331908597692872 

# assuming Ruby 1.9.2 
a.keep_if { |n| (m-n).abs > (2*sd) } 
# => results in 12 remaining 
1

당신은 단지 출발점을 찾고 있다면, 나는 문헌 검색을 수행 좋을 것 [1]에 대한 "시계열 데이터의 비정상 검색"데이터에 일종의 방정식을 적용 할 수 있다면 곡선과 얼마나 멀리 떨어져 있는지 확인할 수 있습니다. 시스템이 더 복잡하고 쉽게 모델링 할 수없는 경우, 예를 들어, 따를 수있는 전략의 숫자 ...

  • 그냥 데이터 포인트 사이 count에 델타보고있다. 귀하의 시리즈에서 델타 목록은 [3,0,1,1,-3,-10,9,-1]입니다. 이 목록의 평균을 초과하는 값을 몇 표준 편차 이상 찾을 수 있습니다. 실제로, 선의 기울기가 크게 변화하는 것을 확인하여 스파이크를 찾고 있습니다.

  • 3 ~ 5 점 정도의 작은 창을보세요. 먼저 1,2,3 점을보고 2,3,4, 3,4,5 등을 봅니다. 이것은 첫 번째 방법과 유사하지만 알고리즘이 조금 다릅니다.

데이터의 특성에 대한 자세한 내용을 살펴보면 일종의 최적 알고리즘을 선택할 수 있지만 빠르며 더러운 것은 충분히 근접 할 수 있습니다.

[1] 말의 단지 멋진 방법 오래된 학기가,이 오래된 질문이지만, 경우에 당신 (또는 누군가가 인터넷 검색이) 그것을 필요로

+0

좋은 점은 코르셋 +1입니다. 수학이나 통계로 모든 스타가 된 적이없는 것 같아서 다른 사람들이 이전에이 문제를 겪었는지 궁금해했습니다. 아마도이 문제를 해결할 표준 방법이 있을지도 모른다고 생각했습니다. ,하지만 실제로는 .. 어쨌든 훌륭한 의견 감사합니다! –

+0

음, 그래 ... 많은 사람들이 전에이 도전을 했어 ... 내 답변에 비 정보를 추가 할거야 비 루비 솔루션 ... – kshep

+0

사실, 나는 구체적인 것은 없지만 거기에 의심된다. 이런 종류의 일을 처리 할 파이썬 라이브러리가있을 수 있습니다. Ruby에 포팅 될 수있는 무언가가있을 것입니다. 흠. – kshep