示例#1
0
        internal void CompareDataAnalyserReports(DataAnalyserReport expected, DataAnalyserReport actual)
        {
            Assert.Equal(expected.TotalAmountOfTests, actual.TotalAmountOfTests);

            Assert.Equal(expected.PersonStatistics.Count, actual.PersonStatistics.Count);
            foreach (var key in expected.PersonStatistics.Keys)
            {
                Assert.True(actual.PersonStatistics.ContainsKey(key));
                ComparePersonStatistics(expected.PersonStatistics[key],
                                        actual.PersonStatistics[key]);
            }

            Assert.Equal(expected.ResultDistribution, actual.ResultDistribution);

            Assert.Equal(expected.QuestionStatistics.Count, actual.QuestionStatistics.Count);
            foreach (var key in expected.QuestionStatistics.Keys)
            {
                Assert.True(actual.QuestionStatistics.ContainsKey(key));
                CompareQuestionStatistics(expected.QuestionStatistics[key],
                                          actual.QuestionStatistics[key]);
            }

            Assert.Equal(expected.AmountOfUniqueEmails, actual.AmountOfUniqueEmails);
            Assert.Equal(expected.AttemptDistribution, actual.AttemptDistribution);
        }
示例#2
0
 /// <summary>
 /// Analyzes new information and adds data to an existing report
 /// </summary>
 /// <param name="report">An existing report</param>
 /// <param name="newData">Collection of new tests</param>
 public static void AddNewData(this DataAnalyserReport report, IEnumerable <PersonTestResult> newData)
 {
     foreach (var el in newData)
     {
         AddNewData(report, el);
     }
 }
示例#3
0
        public static void ToStream(Stream stream, DataAnalyserReport report, int bufferSize = 4 * 1024)
        {
            using (var writer = new StreamWriter(stream, Encoding.UTF8, bufferSize, true))
            {
                writer.WriteLine("Всего тестов: {0}", report.TotalAmountOfTests);
                writer.WriteLine("Количество уникальных e-mail'ов: {0}\n", report.AmountOfUniqueEmails);

                writer.WriteLine("Распределение попыток:");
                for (var i = 0; i < report.AttemptDistribution.Length; i++)
                {
                    if (report.AttemptDistribution[i] != 0)
                    {
                        writer.WriteLine("{0}: {1}", i + 1, report.AttemptDistribution[i]);
                    }
                }
                writer.WriteLine();

                writer.WriteLine("Распределение результатов:");
                foreach (var el in report.ResultDistribution)
                {
                    writer.WriteLine("{0}: {1}", el.Key, el.Value);
                }
                writer.WriteLine();

                writer.WriteLine("Статистика вопросов:");
                foreach (var el in report.QuestionStatistics)
                {
                    writer.WriteLine("Вопрос: {0}\nПравильных ответов: {1}, неправильных: {2}, всего: {3}\n" +
                                     "Правильный ответ: {4}, а люди отвечали 0:{5} 1:{6} 2:{7} 3:{8}\n",
                                     el.Key, el.Value.RightAnswersAmount, el.Value.WrongAnswersAmount,
                                     el.Value.RightAnswersAmount + el.Value.WrongAnswersAmount,
                                     el.Value.RightAnswerIndex, el.Value.AnswersDistribution[0], el.Value.AnswersDistribution[1],
                                     el.Value.AnswersDistribution[2], el.Value.AnswersDistribution[3]);
                }

                (var kDistribution, var bDistribution) = report.GetAdditionalInfo();
                if (kDistribution != null && bDistribution != null)
                {
                    writer.WriteLine("Распределение коэффициента K:");
                    foreach (var el in kDistribution.Intervals)
                    {
                        writer.WriteLine("В интервале от {0:F2} и до {1:F2}: {2}",
                                         el.LeftBorder, el.RightBorder, el.NumericsAmount);
                    }
                    writer.WriteLine();
                    writer.WriteLine("Распределение коэффициента B:");
                    foreach (var el in bDistribution.Intervals)
                    {
                        writer.WriteLine("В интервале от {0:F2} и до {1:F2}: {2}",
                                         el.LeftBorder, el.RightBorder, el.NumericsAmount);
                    }
                    writer.WriteLine();
                }
            }
        }
        public void ToStream(Stream stream, DataAnalyserReport report)
        {
            _main.Write("Всего тестов:");
            _main.WriteLine(report.TotalAmountOfTests);

            _main.Write("Количество уникальных e-mail'ов:");
            _main.WriteLine(report.AmountOfUniqueEmails);

            BuildAttemptDistributionChart(report.AttemptDistribution);
            BuildResultDistributionChart(report.ResultDistribution);

            (var kDistr, var bDistr) = report.GetAdditionalInfo();

            if (kDistr != null && bDistr != null)
            {
                BuildNumericDistributionChart(kDistr, "KDistribution", "Распределение коэффициента K");
                BuildNumericDistributionChart(bDistr, "BDistribution", "Распределение коэффициента B");

                var distr = new DoubleNumericDistribution(kDistr.LeftBorder, kDistr.RightBorder,
                                                          bDistr.LeftBorder, bDistr.RightBorder, 10);

                foreach (var el in report.PersonStatistics)
                {
                    if (el.Value.AdditionalInfo != null)
                    {
                        distr.AddNumerics(el.Value.AdditionalInfo.Value.K,
                                          el.Value.AdditionalInfo.Value.B,
                                          el.Value.AdditionalInfo.Value.R);
                    }
                }

                BuildKAndBDistributionsChart(distr);
                BuildSigmaMinDistributionChart(distr);
                BuildSigmaMaxDistributionChart(distr);
            }

            foreach (var el in report.QuestionStatistics)
            {
                BuildQuestionStatistics(el);
            }

            _package.SaveAs(stream);
        }
示例#5
0
        /// <summary>
        /// Analyzes new information and adds data to an existing report
        /// </summary>
        /// <param name="report">An existing report</param>
        /// <param name="newData">Information about new test</param>
        public static void AddNewData(this DataAnalyserReport report, PersonTestResult newData)
        {
            if (!report.PersonStatistics.ContainsKey(newData.Person.Email))
            {
                report.PersonStatistics.Add(newData.Person.Email, new PersonStatistics());
            }
            report.PersonStatistics[newData.Person.Email].Results.Add(newData.Result);
            CalculateAdditionalInfo(report.PersonStatistics[newData.Person.Email]);

            if (!report.ResultDistribution.ContainsKey(newData.Result))
            {
                report.ResultDistribution.Add(newData.Result, 0U);
            }
            report.ResultDistribution[newData.Result]++;

            report.TotalAmountOfTests++;

            foreach (var answer in newData.Answers)
            {
                if (!report.QuestionStatistics.ContainsKey(answer.Question.QuestionText))
                {
                    report.QuestionStatistics.Add(answer.Question.QuestionText, new QuestionStatistics());
                }
                var el = report.QuestionStatistics[answer.Question.QuestionText];

                if (answer.AnswerIndex == answer.Question.CorrectAnswerIndex)
                {
                    el.RightAnswersAmount++;
                }
                else
                {
                    el.WrongAnswersAmount++;
                }

                el.RightAnswerIndex = answer.Question.CorrectAnswerIndex;

                el.AnswersDistribution[answer.AnswerIndex]++;
            }
        }
示例#6
0
        /// <summary>
        /// Performs data analysis
        /// </summary>
        /// <param name="data">Data for analysis</param>
        /// <param name="minNumberForAdvStat">Minimum number of tests for one person to build advanced statistics</param>
        /// <returns>Report</returns>
        public static DataAnalyserReport Analyze(IEnumerable <PersonTestResult> data, uint minNumberForAdvStat = 4)
        {
            _minNumberForAdvStat = minNumberForAdvStat;

            var report = new DataAnalyserReport();

            // Collection of pair <Email, Amount of attempts>
            var personStatistics = new Dictionary <string, PersonStatistics>();

            // Collection of pair <Result, Amount>
            var resultDistribution = new Dictionary <uint, uint>();

            // Statistics on questions
            var qStatistics = new Dictionary <string, QuestionStatistics>();

            var totalAmount                   = 0U;
            var maxNumberOfAttempts           = 0U;
            var personWithMaxNumberOfAttempts = "";

            foreach (var testResult in data)
            {
                if (!personStatistics.ContainsKey(testResult.Person.Email))
                {
                    personStatistics.Add(testResult.Person.Email, new PersonStatistics());
                }
                personStatistics[testResult.Person.Email].Results.Add(testResult.Result);

                if (personStatistics[testResult.Person.Email].AmountOfAttempts > maxNumberOfAttempts)
                {
                    maxNumberOfAttempts           = personStatistics[testResult.Person.Email].AmountOfAttempts;
                    personWithMaxNumberOfAttempts = testResult.Person.Email;
                }

                if (!resultDistribution.ContainsKey(testResult.Result))
                {
                    resultDistribution.Add(testResult.Result, 0);
                }
                resultDistribution[testResult.Result]++;

                totalAmount++;

                // Collect statistics on questions
                foreach (var answer in testResult.Answers)
                {
                    if (!qStatistics.ContainsKey(answer.Question.QuestionText))
                    {
                        qStatistics.Add(answer.Question.QuestionText, new QuestionStatistics());
                    }

                    if (answer.AnswerIndex == answer.Question.CorrectAnswerIndex)
                    {
                        qStatistics[answer.Question.QuestionText].RightAnswersAmount++;
                    }
                    else
                    {
                        qStatistics[answer.Question.QuestionText].WrongAnswersAmount++;
                    }

                    qStatistics[answer.Question.QuestionText].AnswersDistribution[answer.AnswerIndex]++;
                    qStatistics[answer.Question.QuestionText].RightAnswerIndex = answer.Question.CorrectAnswerIndex;
                }
            }

            foreach (var pStatistics in personStatistics)
            {
                CalculateAdditionalInfo(pStatistics.Value);
            }

            report.TotalAmountOfTests = totalAmount;
            report.PersonStatistics   = personStatistics;
            report.ResultDistribution = resultDistribution;
            report.QuestionStatistics = qStatistics;

            return(report);
        }