diff --git a/README.md b/README.md index cb39053..4814a5c 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ Stat class has methods to calculate an average or typical value from a populatio - harmonicMean(): harmonic mean; - correlation(): the Pearson’s correlation coefficient for two inputs; - covariance(): the sample covariance of two inputs. +- linearRegression(): #### Stat::mean( array $data ) Return the sample arithmetic mean of the array _$data_. @@ -243,6 +244,27 @@ $correlation = Stat::correlation( // -1.0 ``` +#### Stat::linearRegression ( array $x , array $y ) +Return the slope and intercept of simple linear regression parameters estimated using ordinary least squares. +Simple linear regression describes relationship between an independent variable *$x* and a dependent variable *$y* in terms of linear function. + +```php +$years = [1971, 1975, 1979, 1982, 1983]; +$films_total = [1, 2, 3, 4, 5] +list($slope, $intercept) = Stat::linearRegression( + $years, + $films_total +); +// 0.31 +// -610.18 +``` +What happens in 2022, according to the samples above? + +```php +round($slope * 2022 + $intercept); +// 17.0 +``` + ### Freq class With *Statistics* package you can calculate frequency table. A frequency table is list the frequency of various outcomes in a sample. diff --git a/examples/stat_methods.php b/examples/stat_methods.php index 7eb3acc..bb4f3f3 100644 --- a/examples/stat_methods.php +++ b/examples/stat_methods.php @@ -37,6 +37,12 @@ // 1.25 $variance = Stat::variance([2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]); // 1.3720238095238095 +list($slope, $intercept) = Stat::linearRegression( + [1971, 1975, 1979, 1982, 1983], + [1, 2, 3, 4, 5] +); +// 0.31 +// -610.18 try { diff --git a/src/Stat.php b/src/Stat.php index 193f300..e86a3ce 100644 --- a/src/Stat.php +++ b/src/Stat.php @@ -438,4 +438,47 @@ public static function correlation(array $x, array $y): false|float return $a / $b; } + + /** + * @param array $x + * @param array $y + * @throws InvalidDataInputException if 2 arrays have different size, + * or if the length of arrays are < 2, or if the 2 input arrays has not numeric elements, + * or if the elements of the array are constants + * @return array + */ + public static function linearRegression(array $x, array $y): array + { + $countX = count($x); + $countY = count($y); + if ($countX != $countY) { + throw new InvalidDataInputException( + 'Linear regression requires that both inputs have same number of data points.' + ); + } + if ($countX < 2) { + throw new InvalidDataInputException( + 'Linear regression requires at least two data points.' + ); + } + $sumX = array_sum($x); + $sumY = array_sum($y); + $sumXX = 0; + $sumXY = 0; + + foreach ($x as $key => $value) { + $sumXY += ($value * $y[$key]); + $sumXX += ($value * $value); + } + $denominator = (($countX * $sumXX) - ($sumX * $sumX)); + if ($denominator === 0) { + throw new InvalidDataInputException( + 'Linear regression, the inputs is constant.' + ); + } + $slope = (($countX * $sumXY) - ($sumX * $sumY)) / $denominator; + $intercept = ($sumY - ($slope * $sumX)) / $countX; + + return [$slope, $intercept]; + } } diff --git a/tests/StatFromCsvTest.php b/tests/StatFromCsvTest.php new file mode 100644 index 0000000..34b8c97 --- /dev/null +++ b/tests/StatFromCsvTest.php @@ -0,0 +1,36 @@ +toEqual(3); + $row++; + if ($row === 1) { + continue; + } + $income = floatval($data[1]); + $x[] = $income; + $happiness = floatval($data[2]); + $y[] = $happiness; + expect($income)->toBeFloat(); + expect($income)->toBeGreaterThan(0); + expect($happiness)->toBeFloat(); + } + list($slope, $intercept) = Stat::linearRegression($x, $y); + expect(round($slope, 5))->toEqual(0.71383); + expect(round($intercept, 5))->toEqual(0.20427); + //expect(round(Stat::median($x), 5))->toEqual(0); + + fclose($handle); + } + + expect($row)->toEqual(499); +}); diff --git a/tests/StatTest.php b/tests/StatTest.php index a21abd4..46831a5 100644 --- a/tests/StatTest.php +++ b/tests/StatTest.php @@ -318,3 +318,50 @@ ) )->toThrow(InvalidDataInputException::class); }); + +it('calculates linear regression (static)', function () { + list($slope, $intercept) = Stat::linearRegression( + [1971, 1975, 1979, 1982, 1983], + [1, 2, 3, 4, 5] + ); + expect($slope)->toBeFloat(); + expect($slope)->toEqual(0.31); + + expect($intercept)->toBeFloat(); + expect($intercept)->toEqual(-610.18); + + list($slope, $intercept) = Stat::linearRegression( + [1971, 1975, 1979, 1982, 1983], + [1, 2, 1, 3, 1] + ); + expect($slope)->toBeFloat(); + expect($slope)->toEqual(0.05); + + expect($intercept)->toBeFloat(); + expect($intercept)->toEqual(-97.3); + + expect(round($slope * 2019 + $intercept))->toEqual(4); +}); + +it('calculates linear regression with not valid input (static)', function () { + expect( + fn () => Stat::linearRegression( + [3], + [2] + ) + )->toThrow(InvalidDataInputException::class); + + expect( + fn () => Stat::linearRegression( + [3,3,3,3], + [2,1,1,1,1] + ) + )->toThrow(InvalidDataInputException::class); + + expect( + fn () => Stat::linearRegression( + [3,3,3,3,3], + [1,1,1,1,1] + ) + )->toThrow(InvalidDataInputException::class); +}); diff --git a/tests/data/income.data.csv b/tests/data/income.data.csv new file mode 100644 index 0000000..e828e83 --- /dev/null +++ b/tests/data/income.data.csv @@ -0,0 +1,499 @@ +"","income","happiness" +"1",3.86264741839841,2.31448898284741 +"2",4.97938138246536,3.43348975853174 +"3",4.9239569362253,4.59937340433575 +"4",3.21437243884429,2.79111380280692 +"5",7.19640925107524,5.59639827336202 +"6",3.72964347945526,2.45855587216119 +"7",4.67451738892123,3.19299180946247 +"8",4.49810382071882,1.90713683309599 +"9",3.12163052614778,2.94244987165905 +"10",4.6399144353345,3.73794160485342 +"11",4.6328395139426,3.17540614694795 +"12",2.77317889546975,2.00904646125992 +"13",7.11947859451175,5.95181409854467 +"14",7.46665319614112,5.96054730753846 +"15",2.11774233123288,1.44579885772475 +"16",2.55916581954807,2.89858314201704 +"17",2.35479322029278,1.23116752380514 +"18",2.38815724756569,2.3129880546267 +"19",4.75568027375266,2.66611603454578 +"20",1.99427504651248,2.58472902193729 +"21",7.31091602565721,5.74744410385007 +"22",3.52831895649433,2.54652458689424 +"23",2.4287516749464,1.20078552531679 +"24",3.54274787474424,3.07829338129477 +"25",5.22720123874024,4.31776091901847 +"26",6.6919931396842,5.38147873730164 +"27",3.90040993876755,3.56522431909848 +"28",2.29105547815561,0.953412995602085 +"29",2.38051270600408,2.16916126054514 +"30",2.54960877634585,2.0607943111077 +"31",6.93329582735896,6.29910125940374 +"32",1.85564517276362,1.59035586179395 +"33",3.58902313839644,2.25092941356014 +"34",6.82647791085765,5.91424770000083 +"35",2.07060188334435,2.19183370197961 +"36",5.22420527413487,5.76781436577197 +"37",2.24311362951994,0.972882919584837 +"38",7.07616636715829,5.01057742729088 +"39",4.19067249633372,2.23966499176615 +"40",1.95648612035438,1.92757882928771 +"41",5.06175818480551,3.35807157024712 +"42",3.98218993423507,2.4000872914664 +"43",3.06505861971527,3.40798003884572 +"44",3.68287749029696,2.57617630706503 +"45",3.78942929115146,2.47307937742459 +"46",5.35871566459537,3.75265949244852 +"47",5.19611977692693,4.08763118311982 +"48",5.24118957063183,3.54320365405093 +"49",7.10161959333345,5.34835294041953 +"50",3.42402109270915,3.05637665252821 +"51",2.25339902099222,1.55842256342424 +"52",5.37033690372482,3.22513275150655 +"53",6.22560599958524,5.03423100904932 +"54",5.4828622341156,3.85742425923658 +"55",4.03417210886255,3.61905548983833 +"56",6.51021871855482,4.00453773871644 +"57",6.02921386202797,4.80209180676167 +"58",6.94911289354786,4.65889039162321 +"59",7.19503728859127,5.23170296769685 +"60",2.75733849825338,2.4806064668831 +"61",6.95607948163524,5.4981471927748 +"62",4.67019257834181,4.55063695843113 +"63",6.36829266836867,3.57001356718321 +"64",6.16668116580695,4.71966533293591 +"65",6.07415829179808,4.50310816816621 +"66",5.48471896536648,5.04608177486436 +"67",1.58957473793998,0.669715947797397 +"68",1.68047392833978,1.60607235734999 +"69",5.49994795722887,4.82660269623814 +"70",4.04389090323821,2.20824051578082 +"71",5.00509324064478,4.05649309934456 +"72",4.86358172586188,3.56790523339284 +"73",1.50627504475415,1.30848726312301 +"74",2.86466384539381,4.15960929985451 +"75",5.87790629407391,4.63391505682611 +"76",6.48398378910497,5.06874788141326 +"77",4.93803659174591,3.04079729363343 +"78",5.62543442146853,3.80429886107934 +"79",7.22826521471143,5.03400378544416 +"80",5.33746029390022,3.70343793163112 +"81",2.82582659041509,2.18893812105238 +"82",5.93136667320505,5.53804752930638 +"83",3.52025520242751,3.58387516187343 +"84",3.23994059348479,3.09688560965241 +"85",3.49838636862114,2.20098217177591 +"86",7.18611225765198,5.15159828927485 +"87",4.71916607161984,5.95098632787252 +"88",3.59480195771903,2.96818710245234 +"89",3.23394243232906,2.3995613260922 +"90",1.51415322348475,0.859499051809909 +"91",4.00253706425428,1.77593255181846 +"92",6.19810375990346,4.6612612088626 +"93",2.28065086109564,0.727221191435334 +"94",2.18986551230773,0.771286567223164 +"95",3.43415113398805,3.3487882059211 +"96",5.93226967658848,3.96621541073731 +"97",5.30783943738788,2.89044741631859 +"98",5.66434490913525,3.7732606523266 +"99",7.43924761097878,6.35960000434704 +"100",2.13470214698464,0.268722097401768 +"101",6.50127472216263,4.37483231772116 +"102",3.6511831744574,2.15584332319238 +"103",2.28649539174512,1.89355685987461 +"104",4.74885913683102,4.90299157512251 +"105",5.45916076144204,4.83350642716834 +"106",3.43306476529688,3.17229946342246 +"107",7.17639965331182,5.02995166474041 +"108",5.50639511737972,4.26101300319181 +"109",3.09761573234573,1.67239058048437 +"110",4.64755599154159,1.49702412799332 +"111",1.8283063438721,1.26548891585784 +"112",3.53456623479724,2.6674654346945 +"113",4.60617584036663,1.9993255273609 +"114",5.36150313355029,5.23186331277666 +"115",6.87933303695172,5.21140132049364 +"116",4.31703230598941,3.66165645637435 +"117",3.38316357973963,1.41503465557127 +"118",4.93220723234117,4.93304409176638 +"119",4.93559651914984,4.13077826510296 +"120",2.60155331064016,2.28226693420823 +"121",5.7112635425292,3.90117033371217 +"122",6.11753055173904,4.69199885099164 +"123",3.77141514932737,3.57780067459739 +"124",7.11722011025995,5.56254547499372 +"125",2.19488185085356,2.39322811959199 +"126",5.95200191577896,3.56472374018866 +"127",3.92230276297778,2.25372151555325 +"128",7.08158905757591,4.12164774705515 +"129",6.95074499677867,4.16910075873337 +"130",3.66087654652074,3.82389868566928 +"131",1.78909178031608,0.458377573792869 +"132",3.54034109925851,2.5769399593697 +"133",4.5333951911889,2.94753147141445 +"134",4.86733944201842,3.73999579597949 +"135",4.056005443912,3.57144651080101 +"136",5.63464347738773,4.80815042454505 +"137",5.46163588156924,4.01761120835699 +"138",3.18617582553998,1.8398020063859 +"139",4.41766555700451,3.46857379278554 +"140",5.76028922433034,4.75878549190717 +"141",3.71670024935156,2.39167751902943 +"142",2.18256156658754,0.992917364742155 +"143",4.29198368964717,3.16938023951209 +"144",3.41003027558327,2.08904235497713 +"145",3.58109703613445,1.84367577487797 +"146",3.50966309336945,1.61660743515923 +"147",6.66021636407822,5.94934750206047 +"148",6.27178643038496,4.940227776923 +"149",3.73501762608066,2.84123867701184 +"150",4.39320833981037,2.94439133547905 +"151",3.51221689721569,3.02691817511561 +"152",6.2397396331653,5.09780250912624 +"153",3.68148558586836,3.03681993741342 +"154",7.24131299927831,4.68281699020382 +"155",6.34536973200738,4.00081918312565 +"156",5.93974152440205,4.57080112702648 +"157",2.45932137966156,2.04273931237878 +"158",2.53908889135346,1.7486511242512 +"159",6.70860372623429,6.06401304814669 +"160",6.83132232539356,5.13240146874773 +"161",5.08265792531893,3.11334209035311 +"162",6.03060737159103,4.82181026180874 +"163",6.57459503179416,4.17952102324249 +"164",3.57429692940786,1.63126110706156 +"165",5.52990843169391,3.82217964303449 +"166",2.40938174631447,1.85754188647718 +"167",4.26478955196217,3.75108928103916 +"168",3.5303448275663,3.15861859438779 +"169",6.14314981643111,4.92713262492307 +"170",5.15769737726077,4.60011475687374 +"171",4.71084745740518,2.40837990156329 +"172",6.84751526685432,4.48670366480577 +"173",5.46464009257033,2.72771571220574 +"174",4.17653234163299,3.02072444715782 +"175",3.74809321481735,3.74918072735692 +"176",2.27452311431989,2.31155423708273 +"177",1.57636572187766,0.987603171535743 +"178",1.92413369799033,1.46114442110921 +"179",5.90424604341388,4.57685653033834 +"180",5.18903107568622,4.76759563923268 +"181",1.87986818002537,0.438171566569843 +"182",2.54434764571488,2.35120246844228 +"183",3.22139361407608,3.45310273928936 +"184",7.26037414278835,5.38139847050254 +"185",6.48161696176976,4.82009124732981 +"186",5.68848772253841,4.6587426832043 +"187",6.63361882092431,5.38007020724562 +"188",5.97274135099724,3.31598947616809 +"189",3.89773791655898,2.79974748680421 +"190",6.46124332118779,4.20675491186833 +"191",6.62803630158305,4.40266319466238 +"192",3.11895919544622,2.76911812641752 +"193",4.69596361415461,2.78424454536 +"194",1.57369371503592,0.688090581428982 +"195",3.67037693085149,3.47649914026504 +"196",7.19440695969388,5.83619665594657 +"197",1.78047865815461,2.00392609305557 +"198",2.14235955476761,0.971332454187074 +"199",3.65648598968983,2.8576143643143 +"200",2.09035414131358,1.85211771113897 +"201",3.36309717223048,3.51517917678869 +"202",2.42314385203645,2.10055249406317 +"203",7.11158364219591,6.08647828390246 +"204",3.03994185570627,4.08382116125004 +"205",2.37323203543201,1.52478229133559 +"206",1.98456368967891,2.57951651511063 +"207",2.62848285259679,1.61922612693779 +"208",7.13675997080281,5.50662153705521 +"209",3.10491835372522,1.09599927077992 +"210",1.55865675117821,0.968527327097259 +"211",7.47844661772251,4.87772553834132 +"212",2.81390004744753,1.75969866729174 +"213",5.74453964363784,5.03221103359133 +"214",6.54098835680634,5.71380229380638 +"215",6.56279413215816,4.79584286738541 +"216",5.47012499487028,4.66028996116236 +"217",2.08513052528724,2.74039540725342 +"218",4.58957249717787,4.25056806449311 +"219",5.07450176915154,3.94101932161443 +"220",7.46350981341675,4.50344537998766 +"221",5.85390576347709,4.63322873238336 +"222",3.76453996170312,4.03086493801669 +"223",7.06279211025685,6.86338795095807 +"224",6.37737642601132,5.07947589856475 +"225",1.92086276365444,1.62526839290523 +"226",7.36421337816864,6.61827984207343 +"227",6.53579886071384,4.65699857188463 +"228",7.30090272473171,6.00498747478251 +"229",3.03723172377795,2.41063556603061 +"230",6.7032668273896,4.26121997230496 +"231",1.92799668386579,1.06562380948865 +"232",4.22355357790366,2.29570014192334 +"233",2.92270632041618,1.91951110291046 +"234",4.42710860492662,3.58138103837618 +"235",2.07056241016835,0.628942061074953 +"236",5.22407022910193,3.34410837245363 +"237",7.1618728749454,6.16043410141322 +"238",2.21069647790864,2.86127444364931 +"239",7.20705969957635,4.20947057298817 +"240",2.1840849914588,1.22629813434264 +"241",4.41499846614897,4.79332515991528 +"242",5.01480966852978,3.3137965162018 +"243",2.60203711967915,2.15269843256791 +"244",2.91704867128283,2.92368387386963 +"245",6.24434163467959,3.45206723346595 +"246",6.85965449362993,4.25831152921851 +"247",2.37123042438179,3.96103276619262 +"248",5.96405759034678,3.4277231628448 +"249",7.15367408841848,4.72098733829071 +"250",2.28989742044359,1.57194981288347 +"251",6.37622803263366,6.18694560947344 +"252",3.54050429910421,3.5527369641354 +"253",3.13982571987435,1.24578594443855 +"254",6.46074230130762,3.42691165170281 +"255",2.64134846208617,1.87714704297141 +"256",2.00221355259418,1.81788911344585 +"257",6.39142813486978,5.23990949781775 +"258",2.76371977245435,1.38404411156753 +"259",6.83125754864886,3.83797776845087 +"260",3.82725452492014,2.32169768986459 +"261",3.77067089779302,3.31157822966062 +"262",3.15985489217564,3.05738783980748 +"263",5.09941715653986,4.73704595362766 +"264",5.61039082473144,4.59097046068678 +"265",1.85637175245211,0.65424214776212 +"266",5.36372958077118,3.9811277394736 +"267",2.33613356295973,2.33627603265793 +"268",4.97585136769339,4.54063614683775 +"269",2.62954677455127,2.19274486318954 +"270",2.64645809680223,1.78817634141603 +"271",3.85989238740876,2.71943217959463 +"272",4.12153062131256,4.2126973388239 +"273",6.3859406397678,4.47727139172689 +"274",3.84270967869088,2.46885999413966 +"275",4.99054853757843,3.45177253771527 +"276",3.40059694088995,0.68692084864127 +"277",3.82011537160724,2.24674570685324 +"278",1.90949915349483,1.62769508948927 +"279",2.85846412321553,2.45320906080177 +"280",7.45150065002963,4.10994465330612 +"281",3.35425210744143,2.57259820309925 +"282",6.70782520249486,4.81042405824015 +"283",6.3259060671553,4.82741630352611 +"284",1.93118067691103,2.46576112842346 +"285",5.1285452269949,3.75737898692408 +"286",4.27820987161249,3.69134818860085 +"287",1.57947028800845,1.98180991059574 +"288",2.90768217667937,1.41022956743426 +"289",5.64471408957615,3.75430141971041 +"290",3.57117543602362,4.24521559706926 +"291",2.34510756656528,1.4378767241526 +"292",5.84519702754915,4.15988714358891 +"293",5.29848040826619,3.51489178158106 +"294",3.43469992512837,2.71449803816852 +"295",1.86599523201585,1.3573731356938 +"296",5.09561549127102,5.63846038658719 +"297",1.53080772701651,2.42146466926894 +"298",1.61831145873293,1.51120510776249 +"299",6.68767721811309,5.52289166781273 +"300",7.34724552277476,4.39662231880207 +"301",5.98384569631889,3.98845283464788 +"302",5.19608237268403,3.31760677959215 +"303",4.19300743052736,2.77968262704372 +"304",2.34768755128607,0.846505525734867 +"305",4.70948937814683,2.45792170724652 +"306",2.30719771049917,3.50960468808818 +"307",2.73076882073656,2.64690453683064 +"308",3.88251350540668,2.97791672449312 +"309",3.57439364539459,1.42445054844615 +"310",4.15957638435066,1.79034231699163 +"311",1.54463433288038,1.64463660327815 +"312",3.38389667356387,0.731636289703917 +"313",3.61474518338218,2.90178859153712 +"314",6.5038823238574,4.31713315751556 +"315",1.84841255843639,2.09736906038893 +"316",4.42031190404668,4.39159297597301 +"317",6.47715323651209,5.31395690314421 +"318",6.56141998479143,6.28137019099328 +"319",7.18090719357133,5.60796663022193 +"320",2.80909078102559,2.9468704348362 +"321",5.68620540993288,3.87278884763581 +"322",4.80034374631941,2.84286835090218 +"323",2.41291215922683,1.46061633017032 +"324",2.92570351995528,3.75282476573453 +"325",3.17417576350272,3.12660323905035 +"326",2.68552962876856,2.82119264499813 +"327",2.12442924175411,2.73496005606334 +"328",2.6940221269615,2.19759211976013 +"329",4.23088879371062,4.15554086448376 +"330",5.35051566408947,4.07820883807991 +"331",5.09157950570807,4.45696361047167 +"332",6.25030221417546,4.93925895978283 +"333",5.32463256083429,3.73056995759183 +"334",2.04849771084264,2.57505485654663 +"335",2.38138524536043,2.17632214535203 +"336",6.9199429708533,6.23695531197885 +"337",2.35950779356062,0.898732802990241 +"338",4.54570746235549,3.62942438677575 +"339",7.31050263578072,5.92334607107772 +"340",1.69746369123459,0.546190176386527 +"341",4.48358581960201,3.03149706560407 +"342",2.07995533989742,2.84781684252972 +"343",4.83439738629386,4.5169605896786 +"344",4.76134447893128,4.59169701044968 +"345",4.27003655070439,3.15776509125229 +"346",5.37979542324319,4.28799968034075 +"347",4.25555722508579,3.61882978928995 +"348",4.2164684808813,3.20079786041367 +"349",5.69372506113723,3.99970300744161 +"350",2.99652070272714,1.66225319886238 +"351",2.84945821389556,2.39154999858735 +"352",3.74497363669798,3.06760945321428 +"353",3.44151328783482,2.01751358784846 +"354",4.28007538011298,3.64088397009386 +"355",1.82445571850985,0.266043663087602 +"356",2.88924200227484,1.29542729438059 +"357",2.16997749824077,1.85334761253999 +"358",6.97689869999886,5.36723610296883 +"359",2.68373122857884,2.46629234383312 +"360",1.65115609159693,1.72359356107647 +"361",4.41632057586685,4.30728841594257 +"362",3.88109869183972,3.15636743551461 +"363",3.78456055233255,1.69045809453004 +"364",6.2672605002299,5.08552301140633 +"365",1.89032675977796,2.48162387022579 +"366",1.76205817842856,1.35331734068273 +"367",6.08916251175106,5.27529415127748 +"368",6.37425386253744,3.67029152611131 +"369",6.39248312450945,3.69639040957121 +"370",3.20431634271517,2.6798873177165 +"371",2.90814691130072,2.36356466910435 +"372",2.34995206911117,1.43859610476326 +"373",7.00439883721992,5.36244826300704 +"374",3.48359911702573,2.32530922601278 +"375",2.51746380329132,1.52956094402572 +"376",5.69845134112984,4.03572701904756 +"377",4.38192328205332,3.55033718426243 +"378",4.77205908950418,3.55460031663999 +"379",5.39501645090058,4.19972852584098 +"380",5.45644130883738,3.13547515352636 +"381",1.78835992282256,1.14529581266695 +"382",3.11259278375655,3.53985412722536 +"383",5.08096844796091,3.82220396398113 +"384",4.85131391789764,3.83557764615373 +"385",6.60747211240232,5.68375056087792 +"386",3.1268561789766,2.51740087585715 +"387",6.56276283273473,4.32466038431927 +"388",2.34307547332719,2.95869680058244 +"389",1.60003301734105,1.68099713335246 +"390",5.24817553628236,4.25350130386043 +"391",3.03546131635085,2.26039569342357 +"392",4.94737214734778,3.61547105345786 +"393",1.57495361566544,1.50221162618331 +"394",5.74172488460317,3.77648463051399 +"395",5.91047526989132,3.20104243469125 +"396",6.1950039868243,4.05831161607775 +"397",5.4925897247158,4.10522451662447 +"398",4.51724457414821,3.72209763864769 +"399",4.31178599735722,3.82227031270074 +"400",4.63374137040228,3.70666098080036 +"401",7.42383249755949,4.90968846868095 +"402",2.50776854809374,2.15573362622405 +"403",5.71258665947244,5.74373608123351 +"404",6.82237690966576,4.3375714519323 +"405",3.36759181832895,2.58241663950174 +"406",6.32019131071866,4.28430555785881 +"407",2.2986433650367,2.96216820958049 +"408",4.69989587925375,3.99041589363757 +"409",7.2467548311688,5.89014869657948 +"410",5.6669511529617,3.68853951803276 +"411",4.08746198192239,3.21784736329012 +"412",3.31455607060343,2.22047032745549 +"413",6.76833622762933,5.91028487798389 +"414",5.40574906021357,4.8530325187823 +"415",3.63228338956833,3.80297363286464 +"416",4.92494968743995,3.09216464780573 +"417",3.69920552149415,3.23331374691575 +"418",6.89692928921431,5.26547895759795 +"419",7.02551769465208,4.81153337990624 +"420",6.47562521696091,5.36804117292558 +"421",1.63938056956977,1.79871830329663 +"422",6.63595411553979,4.76001433281849 +"423",4.60440921457484,3.41580647919151 +"424",7.03205709904432,5.04017458169285 +"425",3.10234604263678,1.96563593278332 +"426",3.04411420365795,1.87195785402224 +"427",6.18289923202246,5.32350738914155 +"428",5.41505292803049,4.50115833597183 +"429",3.86069598142058,2.43509485602314 +"430",5.69533881219104,4.5532165478241 +"431",6.36491893976927,4.36170927009388 +"432",2.09909346699715,1.47878719948943 +"433",3.49896751809865,2.76852312891189 +"434",5.9946022820659,3.96063637146719 +"435",6.84093094803393,5.9157813950033 +"436",5.75494099454954,3.98019535045613 +"437",6.92672096891329,4.70820298832305 +"438",1.62381373671815,1.41666105541776 +"439",5.90635848417878,4.328417097403 +"440",7.48152138059959,6.19629554587246 +"441",2.60785315884277,1.94596105258794 +"442",1.66065049683675,0.698459964938276 +"443",6.23558535519987,5.13545531647409 +"444",2.96599172148854,1.5603553757432 +"445",6.27926506614313,4.23499121504727 +"446",2.2204038631171,0.688909230817426 +"447",2.07095024641603,0.68584887435653 +"448",2.86841862648726,1.79175356811399 +"449",3.92814090382308,3.22747217285539 +"450",6.83574772579595,5.15933124018258 +"451",3.43716472154483,3.802970672606 +"452",5.13956521824002,4.21605759162201 +"453",6.0045212963596,4.93240997785224 +"454",3.28316689515486,2.23344058374244 +"455",5.9191292594187,4.37825945044752 +"456",3.91019854741171,3.4839256845149 +"457",2.6420985921286,2.0302970430243 +"458",5.72087741224095,3.59639831830423 +"459",3.39991641975939,3.26118210444504 +"460",1.61160631338134,3.48113776710441 +"461",4.78368549048901,3.39343915265214 +"462",4.59148910595104,4.22966334514803 +"463",5.67183973873034,4.32136429726237 +"464",6.05273140082136,4.40045514533445 +"465",4.31579417735338,3.3575973824697 +"466",6.49585476284847,5.33571800394344 +"467",6.54613258363679,5.58838933571186 +"468",4.68821962550282,2.99420428356126 +"469",3.1265240306966,2.41338175267275 +"470",6.78156412392855,4.98536659019169 +"471",7.11950537608936,4.98198112456772 +"472",7.29772228281945,6.38427449695588 +"473",5.87349354336038,3.26747543972 +"474",1.58731534564868,1.31275897723396 +"475",6.00180686311796,4.03954798601876 +"476",5.72322609554976,4.42599508434608 +"477",5.2378930519335,3.34274939573109 +"478",6.44994533993304,3.49231018567766 +"479",4.17233666824177,3.75122546273269 +"480",6.52277168026194,5.38655932895044 +"481",7.44811655720696,5.96342208635885 +"482",7.22519186418504,4.98525492664478 +"483",3.27533480711281,2.79816072820568 +"484",2.03181776404381,2.96732326832455 +"485",2.84014074783772,1.2287731839405 +"486",6.10156470257789,3.9617296397724 +"487",6.07432779902592,4.64914365195858 +"488",4.24387255171314,4.75416839515926 +"489",5.31857559224591,2.96195666265414 +"490",6.05238132085651,4.63344105474874 +"491",3.15404259134084,1.29413657590318 +"492",2.48238160461187,0.548365189283401 +"493",3.43510175077245,2.11513648497449 +"494",5.24920878885314,4.56870455997946 +"495",3.47179858479649,2.53500211304698 +"496",6.08760962309316,4.39745127503739 +"497",3.44084687624127,2.07066376753438 +"498",4.53054540697485,3.71019297842795