Question

Je dois calculer des moyennes, des écarts types, des médianes, etc. pour un ensemble de données numériques. Existe-t-il une bonne bibliothèque .NET open source que je peux utiliser? J'ai trouvé NMath mais ce n'est pas gratuit et peut être exagéré pour mes besoins.

Était-ce utile?

La solution

J'ai trouvé ceci sur le site Web CodeProject. Cela ressemble à une bonne classe C # pour gérer la plupart des fonctions statistiques de base.

Autres conseils

Vous devez faire attention. Il existe plusieurs manières de calculer l’écart type qui donneraient la même réponse si l’arithmétique en virgule flottante était parfaite. Ils sont tous exacts pour certains ensembles de données, mais certains sont bien meilleurs que d'autres dans certaines circonstances.

La méthode proposée ici est celle qui est la plus susceptible de donner de mauvaises réponses. Je l'ai utilisé moi-même jusqu'à ce qu'il me tombe dessus.

Voir Comparaison de trois méthodes de calcul de l'écart type .

Découvrez MathNet , ce n'est pas spécifiquement pour les statistiques, mais il pourrait y avoir des fonctionnalités utiles pour ce que vous voulez

Apache Maths.Common et exécutez-le via IKVM .

J’ai décidé que c’était plus rapide d’écrire le mien, c’est ce que j’avais fait. Voici le code ...

/// <summary>
/// Very basic statistical analysis routines
/// </summary>
public class Statistics
{
    List<double> numbers;
    public double Sum { get; private set; }
    public double Min { get; private set; }
    public double Max { get; private set; }
    double sumOfSquares;

    public Statistics()
    {
        numbers = new List<double>();
    }

    public int Count
    {
        get { return numbers.Count; }
    }

    public void Add(double number)
    {
        if(Count == 0)
        {
            Min = Max = number;
        }
        numbers.Add(number);
        Sum += number;
        sumOfSquares += number * number;
        Min = Math.Min(Min,number);
        Max = Math.Max(Max,number);            
    }

    public double Average
    {
        get { return Sum / Count; }
    }

    public double StandardDeviation
    {
        get { return Math.Sqrt(sumOfSquares / Count - (Average * Average)); }
    }

    /// <summary>
    /// A simplistic implementation of Median
    /// Returns the middle number if there is an odd number of elements (correct)
    /// Returns the number after the midpoint if there is an even number of elements
    /// Sorts the list on every call, so should be optimised for performance if planning
    /// to call lots of times
    /// </summary>
    public double Median
    {
        get
        {
            if (numbers.Count == 0)
                throw new InvalidOperationException("Can't calculate the median with no data");
            numbers.Sort();
            int middleIndex = (Count) / 2;
            return numbers[middleIndex];
        }
    }
}

AForge.NET possède un espace de noms AForge.Math, fournissant certaines fonctions statistiques de base: Histogramme, moyenne, médiane, stddev, entropie.

Si vous avez juste besoin d'effectuer des calculs ponctuels, une feuille de calcul est de loin votre meilleur outil. Il est facile de créer un fichier CSV simple à partir de C #, que vous pouvez ensuite charger dans Excel (ou autre):

class Program
{
    static void Main(string[] args)
    {
        using (StreamWriter sw = new StreamWriter("output.csv", false, Encoding.ASCII))
        {
            WriteCsvLine(sw, new List<string>() { "Name", "Length", "LastWrite" });

            DirectoryInfo di = new DirectoryInfo(".");
            foreach (FileInfo fi in di.GetFiles("*.mp3", SearchOption.AllDirectories))
            {
                List<string> columns = new List<string>();
                columns.Add(fi.Name.Replace(",", "<comma>"));
                columns.Add(fi.Length.ToString());
                columns.Add(fi.LastWriteTime.Ticks.ToString());

                WriteCsvLine(sw, columns);
            }
        }
    }

    static void WriteCsvLine(StreamWriter sw, List<string> columns)
    {
        sw.WriteLine(string.Join(",", columns.ToArray()));
    }
}

Ensuite, vous pouvez simplement démarrer Excel output.csv et utiliser des fonctions telles que "= MEDIANE (B: B)", "= MOYENNE (B: B)", "= STDEV (B: B ) " ;. Vous obtenez des graphiques, des histogrammes (si vous installez le pack d'analyse), etc.

Ce qui précède ne gère pas tout. Les fichiers CSV généralisés sont plus complexes que vous ne le pensez. Mais c'est "assez bon" pour une grande partie de l'analyse que je fais.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top