Example #1
0
        /// <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)));
                    }
                }
            }
        }
Example #2
0
        /// <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)));
                }
            }
        }