private void GenerateScatterPlot(DataFileAttribute attributeNumberOne, DataFileAttribute attributeNumberTwo) { // Crear nueva "Series" para mostrar los datos en la gráfica de dispersión. Series coordinates = ChartAttributes.Series.Add("Valores"); coordinates.ChartType = SeriesChartType.Point; // Agregar nuevo titulo a la gráfica. ChartAttributes.Titles.Add(attributeNumberOne.Name + " vs " + attributeNumberTwo.Name); // Graficar cada coordenada de los atributos. foreach (DataRow instance in dataSet.Rows) { // Variables para almacenar el valor de cada atributo en una instancia como "string". string attributeNumberOneValue = instance[attributeNumberOne.Name].ToString(); string attributeNumberTwoValue = instance[attributeNumberTwo.Name].ToString(); // Verificar que el valor de atributo numero uno no sea un valor faltante. if (attributeNumberOneValue != dataSetDataFile.MissingValue && attributeNumberOneValue != "") { // Verificar que el valor de atributo numero dos no sea un valor faltante. if (attributeNumberTwoValue != dataSetDataFile.MissingValue && attributeNumberTwoValue != "") { // Agregar la coordenada a la gráfica. coordinates.Points.AddXY(Convert.ToDouble(attributeNumberOneValue), Convert.ToDouble(attributeNumberTwoValue)); } } } }
private void GetAttributeInformation() { TextBoxName.Text = ListBoxAttributes.SelectedValue.ToString(); if (dataSetDataFile != null) { DataFileAttribute attribute = dataSetDataFile.Attributes.Find(DataFileAttribute => DataFileAttribute.Name == TextBoxName.Text); ComboBoxDataType.SelectedIndex = (int)attribute.GetDataTypeIndex(); TextBoxDomain.Text = attribute.Domain.ToString(); } }
private double GetTschuprowsCoefficient(double chiSquared, DataFileAttribute attributeNumberOne, DataFileAttribute attributeNumberTwo) { // Listas para almacenar todos los valores de cada atributo. List <string> attributeNumberOneValues = new List <string>(); List <string> attributeNumberTwoValues = new List <string>(); // Llenar las listas de todos los valores de cada atributo. foreach (DataRow instance in dataSet.Rows) { // Agregar a las listas los valores de cada atributo en la instancia. attributeNumberOneValues.Add(instance[attributeNumberOne.Name].ToString()); attributeNumberTwoValues.Add(instance[attributeNumberTwo.Name].ToString()); } // Variables para almacenar los valores posibles de ambos atributos. var attributeNumberOnePossibleValues = attributeNumberOneValues.GroupBy(possibleValue => possibleValue); var attributeNumberTwoPossibleValues = attributeNumberTwoValues.GroupBy(possibleValue => possibleValue); // Retornar el coeficiente de contingencia de Tschuprow. return(Math.Sqrt(chiSquared / (dataSet.Rows.Count * Math.Sqrt((attributeNumberOnePossibleValues.Count() - 1) * (attributeNumberTwoPossibleValues.Count() - 1))))); }
private void ButtonSave_Click(object sender, EventArgs e) { if (TextBoxGeneralInformation.Text == "") { MessageBox.Show("La información general se encuentra vacía.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (TextBoxRelation.Text == "") { MessageBox.Show("La relación se encuentra vacía.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (DataSetDataFile != null) { DataSetDataFile.GeneralInformation = TextBoxGeneralInformation.Text; DataSetDataFile.Relation = TextBoxRelation.Text; for (int i = 0; i < DataGridViewAttributes.RowCount; i++) { if (DataGridViewAttributes[(int)ColumnIndex.Name, i].Value == null || DataGridViewAttributes[(int)ColumnIndex.Name, i].Value.ToString() == "") { MessageBox.Show("El nombre del atributo #" + (i + 1) + " se encuentra vacío.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (DataGridViewAttributes[(int)ColumnIndex.Domain, i].Value == null || DataGridViewAttributes[(int)ColumnIndex.Domain, i].Value.ToString() == "") { MessageBox.Show("El dominio del atributo #" + (i + 1) + " se encuentra vacío.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } DataFileAttribute attribute = DataSetDataFile.Attributes[i]; DataGridViewComboBoxCell attributeDataType = (DataGridViewComboBoxCell)DataGridViewAttributes[(int)ColumnIndex.DataType, i]; try { attribute.Edit(DataGridViewAttributes[(int)ColumnIndex.Name, i].Value.ToString(), attributeDataType.Items.IndexOf(attributeDataType.Value), DataGridViewAttributes[(int)ColumnIndex.Domain, i].Value.ToString()); } catch (ArgumentException) { MessageBox.Show("El dominio (expresión regular) del atributo #" + (i + 1) + " es inválido.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } if (TextBoxMissingValue.Text == "") { MessageBox.Show("El valor faltante se encuentra vacío.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } DataSetDataFile.MissingValue = TextBoxMissingValue.Text; } else { List <DataFileAttribute> attributes = new List <DataFileAttribute>(); for (int i = 0; i < DataGridViewAttributes.RowCount; i++) { if (DataGridViewAttributes[(int)ColumnIndex.Name, i].Value == null || DataGridViewAttributes[(int)ColumnIndex.Name, i].Value.ToString() == "") { MessageBox.Show("El nombre del atributo #" + (i + 1) + " se encuentra vacío.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (DataGridViewAttributes[(int)ColumnIndex.Domain, i].Value == null || DataGridViewAttributes[(int)ColumnIndex.Domain, i].Value.ToString() == "") { MessageBox.Show("El dominio del atributo #" + (i + 1) + " se encuentra vacío.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } DataGridViewComboBoxCell attributeDataType = (DataGridViewComboBoxCell)DataGridViewAttributes[(int)ColumnIndex.DataType, i]; try { attributes.Add(new DataFileAttribute(DataGridViewAttributes[(int)ColumnIndex.Name, i].Value.ToString(), attributeDataType.Items.IndexOf(attributeDataType.Value), DataGridViewAttributes[(int)ColumnIndex.Domain, i].Value.ToString())); } catch (ArgumentException) { MessageBox.Show("El dominio (expresión regular) del atributo #" + (i + 1) + " es inválido.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } DataSetDataFile = new DataFile(TextBoxGeneralInformation.Text, TextBoxRelation.Text, attributes, TextBoxMissingValue.Text, dataSet); } DialogResult = DialogResult.OK; }
private void GetAttributeCorrelation() { // Limpiar las "Series" existentes en la gráfica. ChartAttributes.Series.Clear(); // Limpiar los titulos existentes en la gráfica. ChartAttributes.Titles.Clear(); // Limpiar las "Labels" LabelAttributeNumberOneTypeValue.Text = "N/A"; LabelAttributeNumberTwoTypeValue.Text = "N/A"; LabelPearsonCorrelationCoefficientValue.Text = "N/A"; LabelTschuprowsCoefficientValue.Text = "N/A"; LabelChiSquaredValue.Text = "N/A"; // Verificar si el conjunto de datos tiene datos. if (dataSet.Rows.Count == 0) { // El conjunto de datos no tiene datos. // Desplegar un mensaje de error. MessageBox.Show("El conjunto de datos se encuentra vacío.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } // Verificar el tipo de archivo con el que se esta trabajando. if (dataSetDataFile == null) { // Archivo CSV. // Los dos atributos con los que se realizará el analisis. DataFileAttribute attributeNumberOne = new DataFileAttribute(ComboBoxAttributeNumberOne.SelectedItem.ToString(), (int)DataFileAttribute.AttributeDataType.Nominal, ""); DataFileAttribute attributeNumberTwo = new DataFileAttribute(ComboBoxAttributeNumberTwo.SelectedItem.ToString(), (int)DataFileAttribute.AttributeDataType.Nominal, ""); // Actualizar "Labels" del tipo de los atributos. LabelAttributeNumberOneTypeValue.Text = "Categórico"; LabelAttributeNumberTwoTypeValue.Text = "Categórico"; // Realizar la prueba Chi-Cuadrada con los dos atributos. double chiSquared = GetChiSquared(attributeNumberOne, attributeNumberTwo); // Verificar si Chi-Cuadrada no es inválida. if (chiSquared != invalidChiSquaredTest) { // Chi-Cuadrada es válida. // Asignar a la "Label" el valor de Chi-Cuadrada. LabelChiSquaredValue.Text = chiSquared.ToString(); // Calcular y asignar a la "Label" el coeficiente de contingencia de Tschuprow. LabelTschuprowsCoefficientValue.Text = GetTschuprowsCoefficient(chiSquared, attributeNumberOne, attributeNumberTwo).ToString(); // Generar gráfica de columnas apiladas de los atributos. GenerateStackedColumnChart(attributeNumberOne, attributeNumberTwo); } else { // Chi-Cuadrada es inválida. // Abortar cálculo. return; } } else { // Archivo DATA. // Los dos atributos con los que se realizará el analisis. DataFileAttribute attributeNumberOne = dataSetDataFile.Attributes[ComboBoxAttributeNumberOne.SelectedIndex]; DataFileAttribute attributeNumberTwo = dataSetDataFile.Attributes[ComboBoxAttributeNumberTwo.SelectedIndex]; // Verificar el tipo del atributo número 1. if (attributeNumberOne.GetDataTypeIndex() == DataFileAttribute.AttributeDataType.Numeric) { // Atributo numérico. // Actualizar "Label" del tipo del atributo número 1. LabelAttributeNumberOneTypeValue.Text = "Numérico"; // Verificar si el tipo del atributo número 2 es el mismo. if (attributeNumberOne.DataType == attributeNumberTwo.DataType) { // Ambos atributos son numéricos (Numérico vs Numérico). // Actualizar "Label" del tipo del atributo número 2. LabelAttributeNumberTwoTypeValue.Text = "Numérico"; // Calcular el coeficiente de correlación de Pearson con los dos atributos. double pearsonCorrelationCoefficient = GetPearsonCorrelationCoefficient(attributeNumberOne, attributeNumberTwo); // Verificar si el coeficiente no es inválido. if (pearsonCorrelationCoefficient != invalidPearsonCorrelationCoefficient) { // El coeficiente es válido. // Asignar a la "Label" el valor del coeficiente. LabelPearsonCorrelationCoefficientValue.Text = pearsonCorrelationCoefficient.ToString(); // Generar gráfica de dispersión de los atributos. GenerateScatterPlot(attributeNumberOne, attributeNumberTwo); } else { // El coeficiente es inválido. // Abortar cálculo. return; } } else { // Los atributos son de diferente tipo (Numérico vs Categórico). // Actualizar "Label" del tipo del atributo número 2. LabelAttributeNumberTwoTypeValue.Text = "Categórico"; // Desplegar un mensaje de error. MessageBox.Show("Los atributos son de diferentes tipos (Numérico vs Categórico).", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { // Atributo categórico. // Actualizar "Label" del tipo del atributo número 1. LabelAttributeNumberOneTypeValue.Text = "Categórico"; // Verificar si el tipo del atributo número 2 no es numérico. if (attributeNumberTwo.GetDataTypeIndex() != DataFileAttribute.AttributeDataType.Numeric) { // Ambos atributos son categóricos (Categórico vs Categórico). // Actualizar "Label" del tipo del atributo número 2. LabelAttributeNumberTwoTypeValue.Text = "Categórico"; // Realizar la prueba Chi-Cuadrada con los dos atributos. double chiSquared = GetChiSquared(attributeNumberOne, attributeNumberTwo); // Verificar si Chi-Cuadrada no es inválida. if (chiSquared != invalidChiSquaredTest) { // Chi-Cuadrada es válida. // Asignar a la "Label" el valor de Chi-Cuadrada. LabelChiSquaredValue.Text = chiSquared.ToString(); // Variable en la que se almacenará el coeficiente de contingencia Tschuprow. double tschuprowsCoefficient = GetTschuprowsCoefficient(chiSquared, attributeNumberOne, attributeNumberTwo); // Verficiar si el coeficiente de Tschuprow es válido. if (!double.IsNaN(tschuprowsCoefficient)) { // El coeficiente de Tschuprows es válido. // Calcular y asignar a la "Label" el coeficiente de contingencia de Tschuprow. LabelTschuprowsCoefficientValue.Text = GetTschuprowsCoefficient(chiSquared, attributeNumberOne, attributeNumberTwo).ToString(); // Generar gráfica de columnas apiladas de los atributos. GenerateStackedColumnChart(attributeNumberOne, attributeNumberTwo); } } else { // Chi-Cuadrada es inválida. // Abortar cálculo. return; } } else { // Los atributos son de diferente tipo (Categórico vs Numérico). // Actualizar "Label" del tipo del atributo número 2. LabelAttributeNumberTwoTypeValue.Text = "Numérico"; // Desplegar un mensaje de error. MessageBox.Show("Los atributos son de diferentes tipos (Categórico vs Numérico).", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } }
private void GenerateStackedColumnChart(DataFileAttribute attributeNumberOne, DataFileAttribute attributeNumberTwo) { // Agregar nuevo titulo a la gráfica. ChartAttributes.Titles.Add(attributeNumberOne.Name + " vs " + attributeNumberTwo.Name); // Listas para almacenar todos los valores de cada atributo. List <string> attributeNumberOneValues = new List <string>(); List <string> attributeNumberTwoValues = new List <string>(); // Diccionarios para los valores posibles de ambos atributos con su respectivo indice en la tabla de contingencia. Dictionary <string, int> attributeNumberOneContingencyTableIndices = new Dictionary <string, int>(); Dictionary <string, int> attributeNumberTwoContingencyTableIndices = new Dictionary <string, int>(); // Llenar las listas de todos los valores de cada atributo. foreach (DataRow instance in dataSet.Rows) { // Agregar a las listas los valores de cada atributo en la instancia. attributeNumberOneValues.Add(instance[attributeNumberOne.Name].ToString()); attributeNumberTwoValues.Add(instance[attributeNumberTwo.Name].ToString()); } // Variables para almacenar los valores posibles de ambos atributos. var attributeNumberOnePossibleValues = attributeNumberOneValues.GroupBy(possibleValue => possibleValue); var attributeNumberTwoPossibleValues = attributeNumberTwoValues.GroupBy(possibleValue => possibleValue); // Matriz para crear la tabla de contingencia. double[,] contingencyTable = new double[attributeNumberOnePossibleValues.Count(), attributeNumberTwoPossibleValues.Count()]; // Llenar el diccionario del atributo número uno. for (int i = 0; i < attributeNumberOnePossibleValues.Count(); i++) { var possibleValue = attributeNumberOnePossibleValues.ElementAt(i); attributeNumberOneContingencyTableIndices.Add(possibleValue.Key, i); } // Llenar el diccionario del atributo número dos. for (int i = 0; i < attributeNumberTwoPossibleValues.Count(); i++) { var possibleValue = attributeNumberTwoPossibleValues.ElementAt(i); attributeNumberTwoContingencyTableIndices.Add(possibleValue.Key, i); } // Llenar la tabla de contingencia. foreach (DataRow instance in dataSet.Rows) { // Variables para almacenar los indices de los valores de ambos atributos. int attributeNumberOneContingencyTableIndex = attributeNumberOneContingencyTableIndices[instance[attributeNumberOne.Name].ToString()]; int attributeNumberTwoContingencyTableIndex = attributeNumberTwoContingencyTableIndices[instance[attributeNumberTwo.Name].ToString()]; // Sumar una unidad a las ocurrencias de la combinacion de valores de los atributos. contingencyTable[attributeNumberOneContingencyTableIndex, attributeNumberTwoContingencyTableIndex]++; } // Crear las "Series" necesarias por columna. for (int i = 0; i < attributeNumberTwoPossibleValues.Count(); i++) { // Obtener el valor posible del atributo número dos. var possibleValue = attributeNumberTwoPossibleValues.ElementAt(i); // Agregar una "Series" del valor posible del atributo número dos. ChartAttributes.Series.Add(possibleValue.Key).ChartType = SeriesChartType.StackedColumn; } // Crear las columnas para cada valor posible del atributo número uno. for (int i = 0; i < attributeNumberOnePossibleValues.Count(); i++) { // Asignar el valor posible del atributo número uno. var attributeNumberOnePossibleValue = attributeNumberOnePossibleValues.ElementAt(i); // Apilar las columnas de cada valor posible del atributo número uno con cada valor posible del atributo número dos. for (int j = 0; j < attributeNumberTwoPossibleValues.Count(); j++) { // Obtener el valor posible del atributo número dos. var attributeNumberTwoPossibleValue = attributeNumberTwoPossibleValues.ElementAt(j); // Agregar la columna. ChartAttributes.Series[attributeNumberTwoPossibleValue.Key].Points.AddXY(attributeNumberOnePossibleValue.Key, contingencyTable[i, j]); } } }
private double GetChiSquared(DataFileAttribute attributeNumberOne, DataFileAttribute attributeNumberTwo) { // Listas para almacenar todos los valores de cada atributo. List <string> attributeNumberOneValues = new List <string>(); List <string> attributeNumberTwoValues = new List <string>(); // Diccionarios para los valores posibles de ambos atributos con su respectivo indice en la tabla de contingencia. Dictionary <string, int> attributeNumberOneContingencyTableIndices = new Dictionary <string, int>(); Dictionary <string, int> attributeNumberTwoContingencyTableIndices = new Dictionary <string, int>(); // Variable para almacenar la sumatoria de Chi-Cuadrada. double chiSquaredSummation = 0; // Llenar las listas de todos los valores de cada atributo. foreach (DataRow instance in dataSet.Rows) { // Variables para almacenar el valor de cada atributo en una instancia. string attributeNumberOneValue = instance[attributeNumberOne.Name].ToString(); string attributeNumberTwoValue = instance[attributeNumberTwo.Name].ToString(); // Verificar el tipo de archivo. if (dataSetDataFile == null) { // Archivo CSV. // Verificar que el valor de atributo numero uno no sea un valor faltante. if (attributeNumberOneValue == "") { // Desplegar un mensaje de error y retornar un valor inválido. MessageBox.Show("El atributo \"" + attributeNumberOne.Name + "\" tiene valores faltantes.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return(invalidChiSquaredTest); } // Verificar que el valor de atributo numero dos no sea un valor faltante. if (attributeNumberTwoValue == "") { // Desplegar un mensaje de error y retornar un valor inválido. MessageBox.Show("El atributo \"" + attributeNumberTwo.Name + "\" tiene valores faltantes.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return(invalidChiSquaredTest); } } else { // Archivo DATA. // Verificar que el valor de atributo numero uno no sea un valor faltante. if (attributeNumberOneValue == dataSetDataFile.MissingValue || attributeNumberOneValue == "") { // Desplegar un mensaje de error y retornar un valor inválido. MessageBox.Show("El atributo \"" + attributeNumberOne.Name + "\" tiene valores faltantes.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return(invalidChiSquaredTest); } // Verificar que el valor de atributo numero dos no sea un valor faltante. if (attributeNumberTwoValue == dataSetDataFile.MissingValue || attributeNumberTwoValue == "") { // Desplegar un mensaje de error y retornar un valor inválido. MessageBox.Show("El atributo \"" + attributeNumberTwo.Name + "\" tiene valores faltantes.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return(invalidChiSquaredTest); } } // Agregar a las listas los valores de cada atributo en la instancia. attributeNumberOneValues.Add(attributeNumberOneValue); attributeNumberTwoValues.Add(attributeNumberTwoValue); } // Variables para almacenar los valores posibles de ambos atributos. var attributeNumberOnePossibleValues = attributeNumberOneValues.GroupBy(possibleValue => possibleValue); var attributeNumberTwoPossibleValues = attributeNumberTwoValues.GroupBy(possibleValue => possibleValue); // Matriz para crear la tabla de contingencia. Se suma uno para agregar la fila y columna de "Total". double[,] contingencyTable = new double[attributeNumberOnePossibleValues.Count() + 1, attributeNumberTwoPossibleValues.Count() + 1]; // Matriz para las frecuencias esperadas. double[,] expectedFrequencies = new double[attributeNumberOnePossibleValues.Count(), attributeNumberTwoPossibleValues.Count()]; // Llenar el diccionario del atributo número 1. for (int i = 0; i < attributeNumberOnePossibleValues.Count(); i++) { var possibleValue = attributeNumberOnePossibleValues.ElementAt(i); attributeNumberOneContingencyTableIndices.Add(possibleValue.Key, i); } // Llenar el diccionario del atributo número 2. for (int i = 0; i < attributeNumberTwoPossibleValues.Count(); i++) { var possibleValue = attributeNumberTwoPossibleValues.ElementAt(i); attributeNumberTwoContingencyTableIndices.Add(possibleValue.Key, i); } // Llenar la tabla de contingencia. foreach (DataRow instance in dataSet.Rows) { // Variables para almacenar los indices de los valores de ambos atributos. int attributeNumberOneContingencyTableIndex = attributeNumberOneContingencyTableIndices[instance[attributeNumberOne.Name].ToString()]; int attributeNumberTwoContingencyTableIndex = attributeNumberTwoContingencyTableIndices[instance[attributeNumberTwo.Name].ToString()]; // Sumar una unidad a las ocurrencias de la combinacion de valores de los atributos. contingencyTable[attributeNumberOneContingencyTableIndex, attributeNumberTwoContingencyTableIndex]++; } // Calcular los totales de la última columna de la tabla de contingencia. for (int i = 0; i < attributeNumberOnePossibleValues.Count(); i++) { // Variable para almacenar la sumatoria de los valores de la fila. double rowTotal = 0; // Realizar la sumatoria de los valores de la fila. for (int j = 0; j < attributeNumberTwoPossibleValues.Count(); j++) { rowTotal += contingencyTable[i, j]; } // Asignar la sumatoria de los valores de la fila en la columna del total. contingencyTable[i, attributeNumberTwoPossibleValues.Count()] = rowTotal; } // Calcular los totales de la última fila de la tabla de contingencia. for (int j = 0; j <= attributeNumberTwoPossibleValues.Count(); j++) { // Variable para almacenar la sumatoria de los valores de la columna. double columnTotal = 0; // Realizar la sumatoria de los valores de la columna. for (int i = 0; i < attributeNumberOnePossibleValues.Count(); i++) { columnTotal += contingencyTable[i, j]; } // Asignar la sumatoria de los valores de la columna en la fila del total. contingencyTable[attributeNumberOnePossibleValues.Count(), j] = columnTotal; } // Calcular las frecuencias esperadas. for (int i = 0; i < attributeNumberOnePossibleValues.Count(); i++) { for (int j = 0; j < attributeNumberTwoPossibleValues.Count(); j++) { // Asignar en la matriz de frecuencias esperadas la frecuencia esperada de "i" con "j". expectedFrequencies[i, j] = contingencyTable[i, attributeNumberTwoPossibleValues.Count()] * contingencyTable[attributeNumberOnePossibleValues.Count(), j] / contingencyTable[attributeNumberOnePossibleValues.Count(), attributeNumberTwoPossibleValues.Count()]; } } // Realizar la sumatoria de Chi-Cuadrada. for (int i = 0; i < attributeNumberOnePossibleValues.Count(); i++) { for (int j = 0; j < attributeNumberTwoPossibleValues.Count(); j++) { // Dividir la resta de la frecuencia observada menos la frecuencia esperada al cuadrado sobre la frecuencia esperada. chiSquaredSummation += Math.Pow(contingencyTable[i, j] - expectedFrequencies[i, j], 2) / expectedFrequencies[i, j]; } } // Retornar el resultado de la prueba Chi-Cuadrada. return(chiSquaredSummation); }
private double GetPearsonCorrelationCoefficient(DataFileAttribute attributeNumberOne, DataFileAttribute attributeNumberTwo) { // Variable para almacenar la sumatoria de la multiplicación de los valores menos la media de cada atributo. double attributeMinusMeanProductSummation = 0; // Listas para almacenar todos los valores de cada atributo. List <double> attributeNumberOneValues = new List <double>(); List <double> attributeNumberTwoValues = new List <double>(); // Variables para almacenar la media y la desviación estándar de cada atributo. double attributeNumberOneMean, attributeNumberOneStandardDeviation; double attributeNumberTwoMean, attributeNumberTwoStandardDeviation; // Llenar las listas de todos los valores de cada atributo. foreach (DataRow instance in dataSet.Rows) { // Variables para almacenar el valor de cada atributo en una instancia como "string". string attributeNumberOneValue = instance[attributeNumberOne.Name].ToString(); string attributeNumberTwoValue = instance[attributeNumberTwo.Name].ToString(); // Convertir los valores del atributo número uno en la instancia a "double". try { attributeNumberOneValues.Add(Convert.ToDouble(attributeNumberOneValue)); } catch (FormatException) { // Verificar que el valor de atributo numero uno no sea un valor faltante. if (attributeNumberOneValue != dataSetDataFile.MissingValue && attributeNumberOneValue != "") { // Desplegar un mensaje de error y retornar el coeficiente inválido. MessageBox.Show("El atributo \"" + attributeNumberOne.Name + "\" tiene valores inválidos (\"" + attributeNumberOneValue + "\").", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return(invalidPearsonCorrelationCoefficient); } } // Convertir los valores del atributo número dos en la instancia a "double". try { attributeNumberTwoValues.Add(Convert.ToDouble(attributeNumberTwoValue)); } catch (FormatException) { // Verificar que el valor de atributo numero dos no sea un valor faltante. if (attributeNumberTwoValue != dataSetDataFile.MissingValue && attributeNumberTwoValue != "") { // Desplegar un mensaje de error y retornar el coeficiente inválido. MessageBox.Show("El atributo \"" + attributeNumberTwo.Name + "\" tiene valores inválidos (\"" + attributeNumberTwoValue + "\").", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return(invalidPearsonCorrelationCoefficient); } } } // Verificar que los atributos tengan el mismo número de valores. if (attributeNumberOneValues.Count != attributeNumberTwoValues.Count) { // Desplegar un mensaje de error y retornar el coeficiente inválido. MessageBox.Show("Los atributos no tienen el mismo número de valores.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return(invalidPearsonCorrelationCoefficient); } // Verificar si los atributos no tienen valores. if (attributeNumberOneValues.Count == 0) { // Los atributos no tienen valores. // Desplegar un mensaje de error y retornar el coeficiente inválido. MessageBox.Show("Los atributos no tienen valores.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return(invalidPearsonCorrelationCoefficient); } // Asignar la media y desviacion estándar del atributo número uno. attributeNumberOneMean = attributeNumberOneValues.Average(); attributeNumberOneStandardDeviation = GetStandardDeviation(attributeNumberOneValues); // Asignar la media y desviacion estándar del atributo número dos. attributeNumberTwoMean = attributeNumberTwoValues.Average(); attributeNumberTwoStandardDeviation = GetStandardDeviation(attributeNumberTwoValues); // Realizar la sumatoria de la multiplicación de los valores menos la media de cada atributo. for (int i = 0; i < attributeNumberOneValues.Count; i++) { attributeMinusMeanProductSummation += (attributeNumberOneValues[i] - attributeNumberOneMean) * (attributeNumberTwoValues[i] - attributeNumberTwoMean); } // Retornar el coeficiente de correlación de Pearson. return(attributeMinusMeanProductSummation / (attributeNumberOneValues.Count * attributeNumberOneStandardDeviation * attributeNumberTwoStandardDeviation)); }
private void GetAttributeInformation() { string value; int numberOfMissingValues = 0; LabelNameValue.Text = ListBoxAttributes.SelectedValue.ToString(); if (dataSetDataFile != null) { DataFileAttribute attribute = dataSetDataFile.Attributes[ListBoxAttributes.SelectedIndex]; int numberOfOutOfDomainValues = 0; LabelDataTypeValue.Text = attribute.DataType; foreach (DataRow instance in dataSet.Rows) { value = instance[ListBoxAttributes.SelectedIndex].ToString(); if (!attribute.Domain.IsMatch(value)) { if (value == dataSetDataFile.MissingValue || value == "") { numberOfMissingValues++; } else { numberOfOutOfDomainValues++; } } } if (dataSet.Rows.Count != 0) { LabelMissingValuesValue.Text = numberOfMissingValues + " (" + (numberOfMissingValues * 100) / dataSet.Rows.Count + "% del total)"; } else { LabelMissingValuesValue.Text = "0 (0% del total)"; } LabelDomainValue.Text = attribute.Domain.ToString(); LabelOutOfDomainValuesValue.Text = numberOfOutOfDomainValues.ToString(); } else { foreach (DataRow instance in dataSet.Rows) { if (instance[ListBoxAttributes.SelectedIndex].ToString() == "") { numberOfMissingValues++; } } LabelDataTypeValue.Text = "N/A"; if (dataSet.Rows.Count != 0) { LabelMissingValuesValue.Text = numberOfMissingValues + " (" + (numberOfMissingValues * 100) / dataSet.Rows.Count + "% del total)"; } else { LabelMissingValuesValue.Text = "0 (0% del total)"; } LabelDomainValue.Text = "N/A"; LabelOutOfDomainValuesValue.Text = "N/A"; } }