вторник, 14 марта 2017 г.

Коэффициент корреляции Пирсона онлайн


Расчет реализован на основе написанного на Object Pascal математического модуля DMath (автор: Dr Jean DEBORD, Laboratoire de Pharmacologie, Faculte de Medecine 2 Rue du Docteur Marcland, 87025 Limoges, France).
Достаточно удобный инструмент для анализа – например, для количественной оценки взаимосвязи между произвольными наборами данных.
Искомая зависимость:

Или ее альтернативный вариант:
Ссылка на страницу с онлайн-расчетом:


Что имеем в результате расчета (по выбору пользователя: или вывести результат в небольшом окне, или сохранить вместе с исходными данными в RTF-файл):


В онлайн-расчете выполняется построение только одного графика – с приведенными к единице максимальными значениями наборов данных. В программном обеспечении – калькуляторе «Регрессионный анализ» - выводимый результат слегка разнообразнее:


Калькулятор тоже размещен на сайте. Скачать его (плюс исходники проекта на Object Pascal, IDE CodeTyphon 5.50) можно по ссылке ниже:


В калькуляторе собраны пять или шесть методов регрессионного анализа, плюс расчет коэффициента корреляции Пирсона, плюс возможность формирования некоторых видов распределения, плюс возможность загрузки исходных данных из Excel.

Исходный код онлайн-расчета (PHP):
<?php
// Коэффициент корреляции Пирсона
header('Content-Type^ text/html; charset=utf-8');
if ($_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest'){
       if ($_POST){
             $dimdata = $_POST['dimdata'];// исходные данные из таблицы
             //
             // уборщик "мусора" в temp
             // источник:
             // http://itheap.info/blog/web-master-blog/154.html
             function clearTEMP() {
             $dir = 'temp';
                    $files = scandir($dir); // сканирование файлов в папке и создание списка
             unset($files[0], $files[1]); // удаление из списка (массива) элементов ".",".."
             foreach ($files as $fname) { // цикл по списку файлов
                $filename = $dir .'/'. $fname; // создаем полный путь к файлу
                if (file_exists($filename)) { // проверяем наличии файла, за это время он уже мог удалиться
                    $ftime = filemtime($filename); // определяем время создания/изменения файла
                    $d_time = time() - $ftime; //определяем разницу между текущим временем и временем создания файла
                    if ($d_time > 600) { //условие - если время больше чем [разница в сек] (10мин)
                        @unlink($filename); // удаляем файл
                    }//if
                } //if
             }//foreach
       }
             //
             $ErrCode = '0';
             $filepng = 'xx';
             $rcount = count($dimdata)/2;
             $Lb = 0; $Ub = $rcount-1;
             for ($I=0; $I<=$Ub; $I++){
                    $xx[$I] = $dimdata[$I*2];
                    $yy[$I] = $dimdata[$I*2+1];
                    $zz[$I] = $I+1;
             }
             $N = $Ub-$Lb+1;
             $SX = 0;
             $SY = 0;
             for ($I=$Lb; $I<=$Ub; $I++){
                    $SX = $SX+$xx[$I];
                    $SY = $SY+$yy[$I];
             }     
             $Xbar = $SX/$N;
             $Ybar = $SY/$N;
             $SSX = 0;
              $SSY = 0;
             $SP = 0;
             for ($I=$Lb; $I<=$Ub; $I++){
                    $DX = $xx[$I]-$Xbar;
                    $DY = $yy[$I]-$Ybar;
                    $SSX = $SSX+$DX*$DX;
                    $SSY = $SSY+$DY*$DY;
                    $SP = $SP+$DX*$DY;
             }
             $Correl = $SP/sqrt($SSX*$SSY);
             //
             if ($N <= 0){
                    $ErrCode = 'Упс!';
             } else {
                    $ErrCode = '1';
                    // этот блок для построения графика:
                    $xmax = 0;
                    $ymax = 0;
                    for ($I=0; $I<=$Ub; $I++){
                           if($xmax<$xx[$I]){
                                  $xmax = $xx[$I];
                           }
                           if($ymax<$yy[$I]){
                                  $ymax = $yy[$I];
                           }
                    }
                    for ($I=0; $I<=$Ub; $I++){
                           $xx[$I] = $xx[$I]/$xmax;
                           $yy[$I] = $yy[$I]/$ymax;
                    }
                    //
                    clearTEMP();
            // Построение графика
                    // Утилита PChart. Для использования в php.ini
                    // необходимо подключить php_gd2.dll.
                    //
                    // Standard inclusions  
                    include("pChart/pData.class");
                    include("pChart/pChart.class");
                    // Dataset definition
                    $DataSet = new pData;
                    for ($K=0; $K<=$Ub; $K++){
                           $DataSet->AddPoint($zz[$K],"abscise");
                           $DataSet->AddPoint($xx[$K],"indata");
                           $DataSet->AddPoint($yy[$K],"outdata");
                    }
                    $DataSet->AddAllSeries();    
                    $DataSet->SetAbsciseLabelSerie();    
                    $DataSet->SetSerieName("Данные - 1","indata");    
                    $DataSet->SetSerieName("Данные - 2","outdata");
                    $DataSet->SetXAxisName("строка таблицы");      
                    $DataSet->SetYAxisName("данные"); 
                    // Initialise the graph
                    $Test = new pChart(600,233);
                    $Test->setColorPalette(0,0,0,200);
                    $Test->setColorPalette(1,200,0,0);    
                    $Test->setFontProperties("Fonts/tahoma.ttf",8);    
                    $Test->setGraphArea(70,30,580,190);    
                    $Test->drawFilledRoundedRectangle(7,7,593,228,1,240,240,240);    
                    $Test->drawRoundedRectangle(5,5,595,230,3,128,57,67);    
                    $Test->drawGraphArea(250,250,250,FALSE); 
                    $Test->drawXYScale($DataSet->GetData(),$DataSet->GetDataDescription(),"indata","abscise",100,100,100,TRUE,0);                       
                    $Test->drawGrid(3,FALSE,128,57,67,0);                      
                    // Draw the 0 line    
                    $Test->setFontProperties("Fonts/tahoma.ttf",6);    
                    $Test->drawTreshold(0,50,50,50,TRUE,TRUE);       
                    // Draw the line graph 
                    $Test->drawXYGraph($DataSet->GetData(),$DataSet->GetDataDescription(),"indata","abscise",1);        
                    $Test->drawXYGraph($DataSet->GetData(),$DataSet->GetDataDescription(),"outdata","abscise",0);
                    // Finish the graph    
                    $Test->setFontProperties("Fonts/tahoma.ttf",8);
                    $DataSet->RemoveSerie("abscise");
                    $Test->drawLegend(10,45,$DataSet->GetDataDescription(),240,240,240);    
                    $Test->setFontProperties("Fonts/tahoma.ttf",10);    
                    $Test->drawTitle(60,22,"Приведенный график",10,10,10,585);
                    //
                    $file = substr(md5(microtime() . rand(0, 9999)), 0, 12);
                    //
                    $filepng = 'temp/chart_'.$file.'.'.'png';    
                    $Test->Render($filepng);
                    }
             $Correl = number_format($Correl, 5);
             $Correl = str_replace(".", ",", $Correl);
             //
             echo json_encode(array($ErrCode, $Correl, $filepng));
       }
}
?>