Correlação em C#

A seguir, apresento uma classe simples em C# para calcular correlação entre duas variáveis.

A Correlação de Pearson é um método estatístico para tentar identificar se duas variáveis estão correlacionadas. Ela é um dos muitos mecanismos usados em pesquisas de mercado, além de outros tipos de ambientes.

Este cálculo é nativo de várias ferramentas utilizadas para análises estatísticas, como o SPSS, o R e até o Excel. Mas às vezes você quer algo para cálculo contínuo, ou seja, análise constante do mesmo produto ou serviço. Quando o serviço é repetitivo, a mãe da criatividade, a força-motriz do desenvolvimento, a preguiça, aparece. Um sistema faz o trabalho repetitivo. Apresento uma classe estática bem simples, desenvolvido às pressas, apenas para ajudar-me em apresentação de resultados repetitivos.

Não vou entrar no mérito de explicar os cálculos. Para isso, poderá usar o site wikihow.com.

 

using System;
using System.Collections.Generic;
using System.Linq;
public static class EstatisticaBasica
{
private static List _itensValidos = new List();
private static List _itens = new List();
private static List _rtaReferencia = new List();
private static List _rtaAvaliar = new List();
private static string _resposta = "DesvioPadrao";
public static string Resposta { get { return _resposta; } }
private static double[] _ignorar;
public static double[] Ignorar { set { _ignorar = value; } }
private static bool _amostral = false;
public static bool Amostral { set { _amostral = value; } }
public static List RespostasReferencias { set { _rtaReferencia = value; } }
public static List RespostasAvaliar { set { _rtaAvaliar = value; } }

private static void JoinRespostas()
{
if (_rtaAvaliar == null || _rtaReferencia == null)
return;
if (_rtaAvaliar.Count == 0 || _rtaReferencia.Count == 0)
return;
if (_itens != null)
_itens.Clear();

_itens = (from rA in _rtaAvaliar
join rR in _rtaReferencia
on rA.Sequencial equals rR.Sequencial
select new ParaAvaliar{
Sequencial = rR.Sequencial,
Referencia = rR.Resposta,
Avaliar = rA.Resposta
}).ToList();
}

private static double? Variancia(IEnumerable numeros)
{
_resposta = "Dados inválidos";
if (numeros == null || numeros.Count() == 0)
return null;
int divisor = _amostral ? numeros.Count() - 1 : numeros.Count();
if (divisor <= 0) return null; double media = numeros.Average(); double result = numeros.Sum(x => (x - media) * (x - media)) / divisor;
_resposta = result.ToString();
return result;
}

private static double? CalculaDesvioPadrao(IEnumerable numeros)
{
_resposta = "Dados inválidos";
if (numeros == null || numeros.Count() == 0)
return null;
double? var = Variancia(numeros);
if (!var.HasValue)
return null;
return Math.Sqrt(var.Value);
}

public static double? DesvioPadrao(IEnumerable numeros)
{
_resposta = "Dados inválidos";
if (numeros == null || numeros.Count() == 0)
return null;

return CalculaDesvioPadrao(numeros);
}

public static double? Covariancia()
{
JoinRespostas();
if (_itens == null || _itens.Count == 0)
{
_resposta = "Lista de objetos é inválida";
return null;
}
CorrigeLista();
if (_itensValidos == null || _itensValidos.Count == 0)
{
_resposta = "Lista de objetos é inválida";
return null;
}
double mediaX = (from ParaAvaliar r in _itensValidos
select r.Referencia).Average();
double mediaY = (from ParaAvaliar r in _itensValidos
select r.Avaliar).Average();
int n = _itensValidos.Count;
double soma = 0;
for (int i = 0; i < n; i++) soma += ((_itensValidos[i].Referencia - mediaX) * (_itensValidos[i].Avaliar - mediaY)); double divisor = _amostral ? n - 1 : n; if (divisor <= 0) { _resposta = "Não há respostas suficientes"; return null; } return soma / divisor; } public static double? Pearson() { double? cov = Covariancia(); if (!cov.HasValue) return null; var x = (from ParaAvaliar r in _itensValidos select r.Referencia); var y = (from ParaAvaliar r in _itensValidos select r.Avaliar); double? desvioX = DesvioPadrao(x); if (!desvioX.HasValue) return null; double? desvioY = DesvioPadrao(y); if (!desvioY.HasValue) return null; double corr = (cov.Value) / (desvioX.Value * desvioY.Value); _resposta = corr.ToString(); return corr; } private static void CorrigeLista() { int igLen = 0; if (_ignorar != null) igLen = _ignorar.Count(); _itensValidos.Clear(); _itensValidos.AddRange(_itens); if (igLen == 0) return ; foreach (double d in _ignorar) { _itensValidos.RemoveAll(x => x.Avaliar == d || x.Referencia == d);
}
}
}

internal class ParaAvaliar
{
public int Sequencial { get; set; }
public double Avaliar { get; set; }
public double Referencia { get; set; }
}

public class Respostas
{
public int Sequencial { get; set; }
public double Resposta { get; set; }
}

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *