/// <summary> /// 변량으로부터 대표적 통계 값들을 계산합니다. /// </summary> /// <param name="source"></param> private void Compute(IEnumerable <double?> source) { Mean = source.Mean(); double variance = 0; double correction = 0; double skewness = 0; double kurtosis = 0; double minimum = Double.PositiveInfinity; double maximum = Double.NegativeInfinity; int n = 0; foreach (var xi in source) { if (xi.HasValue) { double diff = xi.Value - Mean; double tmp = diff * diff; correction += diff; variance += tmp; tmp *= diff; skewness += tmp; tmp *= diff; kurtosis += tmp; if (minimum > xi) { minimum = xi.Value; } if (maximum < xi) { maximum = xi.Value; } n++; } } Count = n; if (n > 0) { Minimum = minimum; Maximum = maximum; Variance = (variance - (correction * correction / n)) / (n - 1); StandardDeviation = System.Math.Sqrt(Variance); if (Variance.ApproximateEqual(0.0) == false) { if (n > 2) { Skewness = (double)n / ((n - 1) * (n - 2)) * (skewness / (Variance * StandardDeviation)); } if (n > 3) { Kurtosis = (((double)n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3)) * (kurtosis / (Variance * Variance))) - ((3.0 * (n - 1) * (n - 1)) / ((n - 2) * (n - 3))); } } } }
/// <summary> /// 변량으로부터 대표적 통계 값들을 계산합니다. /// </summary> /// <param name="source"></param> private void ComputeHighAccuracy(IEnumerable <double> source) { Mean = source.Mean(); decimal mean = (decimal)Mean; decimal variance = 0; decimal correction = 0; decimal skewness = 0; decimal kurtosis = 0; decimal minimum = Decimal.MaxValue; decimal maximum = Decimal.MinValue; int n = 0; foreach (decimal xi in source) { decimal diff = xi - mean; decimal tmp = diff * diff; correction += diff; variance += tmp; tmp *= diff; skewness += tmp; tmp *= diff; kurtosis += tmp; if (minimum > xi) { minimum = xi; } if (maximum < xi) { maximum = xi; } n++; } Count = n; Minimum = (double)minimum; Maximum = (double)maximum; Variance = (double)(variance - (correction * correction / n)) / (n - 1); StandardDeviation = Math.Sqrt(Variance); if (Variance.ApproximateEqual(0.0) == false) { if (n > 2) { Skewness = (double)n / ((n - 1) * (n - 2)) * ((double)skewness / (Variance * StandardDeviation)); } if (n > 3) { Kurtosis = (((double)n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3)) * ((double)kurtosis / (Variance * Variance))) - ((3.0 * (n - 1) * (n - 1)) / ((n - 2) * (n - 3))); } } }