2017-09-18 4 views
1

24 개의 숫자로 정렬 된 배열을 d3.quantile에 지정하고 첫 번째 사 분위 값을 계산하도록 요청합니다. 배열은 6 개의 값으로 구성된 네 개의 그룹으로 균등하게 나눌 수 있기 때문에, 결과는 arr [5]와 arr [6]의 평균이 될 것이라는 가정이있었습니다.d3.quantile이 Q1을 잘못 계산하는 것 같습니다.

var arr = [89.7, 93.2, 94, 94.3, 94.5, 95.4, 95.9, 96.1, 96.4, 96.5, 96.9, 96.9, 97.3, 97.6, 97.6, 97.6, 97.8, 98.3, 98.3, 98.4, 98.5, 98.5, 98.6, 98.6]; 
var myAssumption = (arr[5] + arr[6])/2; // 95.65 
var d3Result = d3.quantile(arr, 0.25);  // 95.775 

d3 quantile 함수는 좀 더 복잡한 알고리즘을 사용합니까? This Wikipedia article에는 몇 가지 옵션이 나열되어 있지만 어느 것이 사용되고 있는지 (또는 왜 한 알고리즘이 다른 알고리즘보다 나은지) 잘 모르겠습니다.

답변

1

결과가 잘못되지 않았습니다. 예상 값입니다.

당신이 연결이 Wikipedia 페이지를 보면, 당신은 "R-7"를 유형 열의가 (이 "을 쓰여 볼 수 있습니다 R-7, 엑셀, SciPy- (1,1), Maple- 6 "). 이것이 d3.quantile() 함수에 의해 사용 된 알고리즘입니다.

export default function(values, p, valueof) { 
    if (valueof == null) valueof = number; 
    if (!(n = values.length)) return; 
    if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); 
    if (p >= 1) return +valueof(values[n - 1], n - 1, values); 
    var n, 
     i = (n - 1) * p, 
     i0 = Math.floor(i), 
     value0 = +valueof(values[i0], i0, values), 
     value1 = +valueof(values[i0 + 1], i0 + 1, values); 
    return value0 + (value1 - value0) * (i - i0); 
} 

따라서, 귀하의 경우에, 우리가해야합니다 :

i = (24 - 1) * 0.25 
// ^--- the length of the array 

우리에게 5.75 (및 5Math.floor(i) 등)를 제공

d3.quantile()의 소스 코드를 보라.

95.4 + (95.9 - 95.4) * (5.75 - 5) 

을 그리고 우리에게 당신이보고있는 결과를 제공합니다 :

다음 (기능에 value0 + (value1 - value0) * (i - i0) 인) 반환 값이 될 것입니다

다음
95.775 

가 실행 데모입니다 :

var arr = [89.7, 93.2, 94, 94.3, 94.5, 95.4, 95.9, 96.1, 96.4, 96.5, 96.9, 96.9, 97.3, 97.6, 97.6, 97.6, 97.8, 98.3, 98.3, 98.4, 98.5, 98.5, 98.6, 98.6]; 
 
var d3Result = d3.quantile(arr, 0.25); 
 
console.log(d3Result)
<script src="https://d3js.org/d3.v4.min.js"></script>

+1

아름다운 답변; 감사! – carpiediem

관련 문제