Calcular estadísticas en C#

Hoy es el cuarto lunes desde que abrí el blog y va a ser la primera entrada en la que voy a escribir completamente sobre programación.

Cuando desarrollo una aplicación para un cliente la principal característica suele trabajar con datos de forma que se pueda recopilar, almacenar y disponer los datos para su consulta. Por lo tanto mis primeros esfuerzos en el desarrollo estarán enfocados en la recopilación de los datos,  ya sea de forma automática a través de otro programa, dispositivo o sean introducidos por el usuario. En este trabajo ya me habré preocupado de disponer de un lugar en el que almacenar estos datos, generalmente una base de datos en cualquiera de sus modalidades. Por último deberé proporcionar las diferentes consultas que desee el cliente sobre estos datos.

En el punto de la consulta será muy probable que en alguna de las peticiones del cliente, necesite un análisis estadístico de los datos almacenados. Para calcular estadísticas sencillas como el máximo, mínimo o media, suelo hacer uso de consultas linq como en las del siguiente ejemplo:

double[] dataArray = new double[] {10.4,5.2,3.7,23.3,1.1 };
double min, max, average;

min = dataArray.Min();
max = dataArray.Max();
average = dataArray.Average();

El problema viene cuando el cliente demanda el uso de estadísiticas más amplias para el análisis de los datos, por ejemplo si nos piden la frecuencia de cada uno de los valores , la desviación media o desviación mediana. Todos estos cáculos estadíticios no los puedo sacar de forma sencilla con una consulta de linq como hemos visto en el ejemplo anterior. Para ello utilizo un par de clases en C# que me facilitan el cálculo de estadísticas de un conjunto de datos.

>> Descargar clases para estadísticas C# <<

Dentro de la descarga encontrarás dos clases en C#:

Para hacer uso de estas clases te voy a mostrar con un ejemplo la forma de utilizar los datos que he calculado con la clase de estadísticas.

Uso de las clases con una colección de objetos

Imagina el caso que estás impartiendo un curso de programación  (espero hacer alguna convocatoria en el blog dentro de un tiempo 😉 ) y para gestionar los alumnos de curso tienes una clase como la siguiente para almacenar el nombre y apellidos del alumno y la nota que ha sacado en el curso


public class Alumno
{
   public string NombreApellidos { get; set; }
   public double Nota{ get; set; }
   public bool Aprobado { get {return (Nota >= 5); }
}

Imagina que ahora hay que visualizar estadísticas de las notas de los alumnos. Para ello lo primero que vas a hacer es obtener todas las notas de los alumnos en un array a través de una consulta linq y después hay que realizar el cálculo de las estadísticas, como te muestro en el siguiente ejemplo

Alumno[] alumnos;

//aquí obtendría el listado de alumnos del almance de datos

//obtenemos todas la notas a un array y 
//hacemos el calculo de estadísticas
var notas = (from a in alumnos
             select a.Nota).ToArray();
Descriptive d = new Descriptive(notas);
d.Analyze();
DescriptiveResult res = d.Result;

Una vez que ya tienes realizados los cálculos, por ejemplo podrías sacar un listado de las notas de los alumnos y el número de alumnos que tienen esa nota haciendo uso de la propieda frecuencias frecuencias


Console.WriteLine("Las notas de los alumnos son:");
Console.WriteLine("Nota \t Nº de alumnos");
foreach(KeyValuePair<double, int> freq in res.Frequency)
     Console.WriteLine("{0:0.00} \t {1}",freq.Key,freq.Value);

Sí ahora quieres trabajar con un dato en concreto, por ejemplo saber cuál es la mayor nota de los alumnos y a la vez presentar por pantallas a los alumnos que tienen esa nota podemos hacerlo de la siguiente forma.


Console.WriteLine("La nota más alta ha sido: {0}", res.Max);
var maxAlumnos = alumnos.Where(x => x.Nota == res.Max);
foreach(Alumno al in maxAlumnos)
     Console.WriteLine("{0}, ", al.NombreApellidos);

En el ejemplo anterior has visto como utilizar el valor del máximo para presentar una determinada información sobre los alumnos. De la misma forma puedes trabajar con cualquiera de los otros valores que proporciona la clase DescriptiveResult, simplemente debes conocer las necesidades de datos estadísticos para hacer uso de esta clase y los valores que proporciona.

Como has podido ver, haciendo uso de estas dos clases he reducido el trabajo que tengo que hacer en el momento de proporcionar estadísticas sobre los datos de una consulta, así que espero que te descargues el conjunto de clases y hagas pruebas con ellas. ¿En alguna ocasión has necesitado calcular estadísticas por la demanda de algún cliente?¿Cómo llevas a cabo el cálculo de estadísticas en tus proyectos? Espero que estas clases te hayan sido de utilidad y si tienes cualquier duda o comentario sobre ellas, puedes utilizar los comentarios.

>> Descargar clases para estadísticas C# <<

 

 

No hay respuestas

AGREGAR COMENTARIO