hi-folks/statistics

PHP包,提供计算数值数据数学统计功能的函数。

v1.0.0 2023-12-26 16:48 UTC

README

PHP package for Statistics

Statistics PHP包

Latest Version on Packagist Total Downloads
Static Code analysis Packagist License
Packagist PHP Version Support GitHub last commit

Tests

介绍一个PHP包,能够对数值数据进行全面的数学统计分析。

我已经整理了一个包含有用统计函数的包。

这些函数最初源于我对FIT文件的研究,这些文件包含大量关于体育活动的数据。在这些文件中,您可以找到关于心率、速度、踏频、功率等指标的详细信息。我开发了这些统计函数,以帮助更深入地了解这些体育活动的数值数据和表现。

此包提供的函数涵盖了多种度量,包括平均值、众数、中位数、范围、分位数、第一四分位数(25%分位数)、第三四分位数(75%分位数)、频率表(累积和相对)、标准差(适用于总体和样本)、方差(同样,针对总体和样本)。

此包灵感来源于Python统计模块

安装

您可以通过composer安装此包

composer require hi-folks/statistics

用法

Stat类

Stat类具有从总体或样本中计算平均值或典型值的方法。此类提供计算数值数据数学统计的方法。以下列出了各种数学统计

Stat::mean( array $data )

返回数组的样本算术平均值。算术平均值是数据总和除以数据点数。它通常被称为“平均”,尽管它只是许多数学平均数之一。它是数据集中位置的度量。

use HiFolks\Statistics\Stat;
$mean = Stat::mean([1, 2, 3, 4, 4]);
// 2.8
$mean = Stat::mean([-1.0, 2.5, 3.25, 5.75]);
// 2.625

Stat::geometricMean( array $data )

几何平均值通过值的乘积(与使用总和的算术平均值相反)来表示数据的集中趋势或典型值。

use HiFolks\Statistics\Stat;
$mean = Stat::geometricMean([54, 24, 36], 1);
// 36.0

Stat::harmonicMean( array $data )

调和平均值是数据倒数算术平均值的倒数。例如,三个值a、b和c的调和平均值将等于3/(1/a + 1/b + 1/c)。如果其中一个值为零,则结果为零。

use HiFolks\Statistics\Stat;
$mean = Stat::harmonicMean([40, 60], null, 1);
// 48.0

您还可以计算调和加权平均值。假设一辆汽车以40公里/小时的速度行驶了5公里,当交通畅通时,以60公里/小时的速度行驶剩余的30公里。平均速度是多少?

use HiFolks\Statistics\Stat;
Stat::harmonicMean([40, 60], [5, 30], 1);
// 56.0

其中

  • 40, 60: 是元素
  • 5, 30: 是每个元素的权重(第一个权重是第一个元素的权重,第二个是第二个元素的权重)
  • 1: 是您要四舍五入的十进制数字

Stat::median( array $data )

返回数值数据的中位数(中间值),使用常见的“中间两个数平均值”方法。

use HiFolks\Statistics\Stat;
$median = Stat::median([1, 3, 5]);
// 3
$median = Stat::median([1, 3, 5, 7]);
// 4

Stat::medianLow( array $data )

返回数值数据的小中位数。小中位数始终是数据集中的成员。当数据点数为奇数时,返回中间值。当它是偶数时,返回两个中间值中的较小值。

use HiFolks\Statistics\Stat;
$median = Stat::medianLow([1, 3, 5]);
// 3
$median = Stat::medianLow([1, 3, 5, 7]);
// 3

Stat::medianHigh( array $data )

返回数据的高中位数。高中位数总是数据集的成员。当数据点的数量为奇数时,返回中间值。当它是偶数时,返回两个中间值中较大的一个。

use HiFolks\Statistics\Stat;
$median = Stat::medianHigh([1, 3, 5]);
// 3
$median = Stat::medianHigh([1, 3, 5, 7]);
// 5

Stat::quantiles( 数组 $data, $n=4, $round=null )

将数据分为n个等概率的连续区间。返回分隔区间的n-1个截断点。将n设为4用于四分位数(默认值)。将n设为10用于十分位数。将n设为100用于百分位数,这将给出99个截断点,将数据分为100个等大小的组。

use HiFolks\Statistics\Stat;
$quantiles = Stat::quantiles([98, 90, 70,18,92,92,55,83,45,95,88]);
// [ 55.0, 88.0, 92.0 ]
$quantiles = Stat::quantiles([105, 129, 87, 86, 111, 111, 89, 81, 108, 92, 110,100, 75, 105, 103, 109, 76, 119, 99, 91, 103, 129,106, 101, 84, 111, 74, 87, 86, 103, 103, 106, 86,111, 75, 87, 102, 121, 111, 88, 89, 101, 106, 95,103, 107, 101, 81, 109, 104], 10);
// [81.0, 86.2, 89.0, 99.4, 102.5, 103.6, 106.0, 109.8, 111.0]

Stat::firstQuartile( 数组 $data, $round=null )

下四分位数,或第一四分位数(Q1),是当数据按递增顺序排列时,25%的数据点所在的值。

use HiFolks\Statistics\Stat;
$percentile = Stat::firstQuartile([98, 90, 70,18,92,92,55,83,45,95,88]);
// 55.0

Stat::thirdQuartile( 数组 $data, $round=null )

上四分位数,或第三四分位数(Q3),是当数据按递增顺序排列时,75%的数据点所在的值。

use HiFolks\Statistics\Stat;
$percentile = Stat::thirdQuartile([98, 90, 70,18,92,92,55,83,45,95,88]);
// 92.0

Stat::pstdev( 数组 $data )

返回总体标准差,这是衡量一组值的变化或分散程度的指标。标准差低表明值倾向于接近集合的均值,而标准差高表明值分布在一个更广的范围内。

use HiFolks\Statistics\Stat;
$stdev = Stat::pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75]);
// 0.986893273527251
$stdev = Stat::pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75], 4);
// 0.9869

Stat::stdev( 数组 $data )

返回样本标准差,这是衡量一组值的变化或分散程度的指标。标准差低表明值倾向于接近集合的均值,而标准差高表明值分布在一个更广的范围内。

use HiFolks\Statistics\Stat;
$stdev = Stat::stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75]);
// 1.0810874155219827
$stdev = Stat::stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75], 4);
// 1.0811

Stat::variance ( 数组 $data)

方差是衡量数据点从均值分散程度的指标。方差低表明数据点通常相似,并且不会从均值中变化很大。方差高表明数据值有更大的变异性,并且从均值中分布得更广。

样本计算方差

use HiFolks\Statistics\Stat;
$variance = Stat::variance([2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]);
// 1.3720238095238095

如果您需要计算整个总体(而不仅仅是样本)的方差,则需要使用pvariance方法

use HiFolks\Statistics\Stat;
$variance = Stat::pvariance([0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25]);
// 1.25

Stat::covariance ( 数组 $x , 数组 $y )

协方差,静态方法,返回两个输入$x$y的样本协方差。协方差是衡量两个输入联合变异性的一种指标。

$covariance = Stat::covariance(
    [1, 2, 3, 4, 5, 6, 7, 8, 9],
    [1, 2, 3, 1, 2, 3, 1, 2, 3]
);
// 0.75
$covariance = Stat::covariance(
    [1, 2, 3, 4, 5, 6, 7, 8, 9],
    [9, 8, 7, 6, 5, 4, 3, 2, 1]
);
// -7.5

Stat::correlation ( 数组 $x , 数组 $y )

返回两个输入的皮尔逊相关系数。皮尔逊相关系数r的值在-1和+1之间。它衡量线性关系的强度和方向,其中+1表示非常强的正线性关系,-1表示非常强的负线性关系,0表示没有线性关系。

$correlation = Stat::correlation(
    [1, 2, 3, 4, 5, 6, 7, 8, 9],
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
);
// 1.0
$correlation = Stat::correlation(
    [1, 2, 3, 4, 5, 6, 7, 8, 9],
    [9, 8, 7, 6, 5, 4, 3, 2, 1]
);
// -1.0

Stat::linearRegression ( 数组 $x , 数组 $y )

返回使用普通最小二乘法估计的简单线性回归参数的斜率和截距。简单线性回归用线性函数描述自变量$x和因变量$y之间的关系。

$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

根据上述样本,2022年会发生什么?

round($slope * 2022 + $intercept);
// 17.0

频数类别

使用Statistics包,您可以计算频率表。频率表列出样本中各种结果的出现频率。表中的每个条目都包含特定组或区间内值的频率或计数。

Freq::frequencies( 数组 $data )

use HiFolks\Statistics\Freq;

$fruits = ['🍈', '🍈', '🍈', '🍉','🍉','🍉','🍉','🍉','🍌'];
$freqTable = Freq::frequencies($fruits);
print_r($freqTable);

您可以将频率表视为数组

Array
(
    [🍈] => 3
    [🍉] => 5
    [🍌] => 1
)

Freq::relativeFrequencies( 数组 $data )

您可以以相对格式(百分比)检索频率表

$freqTable = Freq::relativeFrequencies($fruits, 2);
print_r($freqTable);

您可以看到以百分比表示的频率表数组中的发生频率

Array
(
    [🍈] => 33.33
    [🍉] => 55.56
    [🍌] => 11.11
)

Freq::frequencyTableBySize( 数组 $data , $size)

如果您想根据类别(值范围)创建频率表,可以使用frequencyTableBySize。第一个参数是数组,第二个参数是类别的大小。

计算具有类别的频率表。每个组大小为4

$data = [1,1,1,4,4,5,5,5,6,7,8,8,8,9,9,9,9,9,9,10,10,11,12,12,
    13,14,14,15,15,16,16,16,16,17,17,17,18,18, ];
$result = \HiFolks\Statistics\Freq::frequencyTableBySize($data, 4);
print_r($result);
/*
Array
(
    [1] => 5
    [5] => 8
    [9] => 11
    [13] => 9
    [17] => 5
)
 */

Freq::frequencyTable()

如果您想根据类别(值范围)创建频率表,可以使用frequencyTable。第一个参数是数组,第二个参数是类别数量。

计算包含5个类别的频率表。

$data = [1,1,1,4,4,5,5,5,6,7,8,8,8,9,9,9,9,9,9,10,10,11,12,12,
    13,14,14,15,15,16,16,16,16,17,17,17,18,18, ];
$result = \HiFolks\Statistics\Freq::frequencyTable($data, 5);
print_r($result);
/*
Array
(
    [1] => 5
    [5] => 8
    [9] => 11
    [13] => 9
    [17] => 5
)
 */

统计类

FreqStat 类提供的方法主要是 静态方法。如果您更愿意使用对象实例来计算统计数据,可以选择使用 Statistics 类的实例。因此,在调用统计方法时,您可以使用您的 Statistics 类对象实例。

例如,为了计算平均值,您可以通过 make() 静态方法获取 Statistics 对象,然后像以下示例中那样使用新的对象 $stat

$stat = HiFolks\Statistics\Statistics::make(
    [3,5,4,7,5,2]
);
echo $stat->valuesToString(5) . PHP_EOL;
// 2,3,4,5,5
echo "Mean              : " . $stat->mean() . PHP_EOL;
// Mean              : 4.3333333333333
echo "Count             : " . $stat->count() . PHP_EOL;
// Count             : 6
echo "Median            : " . $stat->median() . PHP_EOL;
// Median            : 4.5
echo "First Quartile  : " . $stat->firstQuartile() . PHP_EOL;
// First Quartile  : 2.5
echo "Third Quartile : " . $stat->thirdQuartile() . PHP_EOL;
// Third Quartile : 5
echo "Mode              : " . $stat->mode() . PHP_EOL;
// Mode              : 5

计算频率表

Statistics 包含一些用于生成频率表的方法

  • frequencies():频率是数据中某个值出现次数的数量;
  • relativeFrequencies():相对频率是数据集中某个值出现次数与总结果数量的比例(分数或比例);
  • cumulativeFrequencies():是先前相对频率的累加;
  • cumulativeRelativeFrequencies():是先前相对比率的累加。
use HiFolks\Statistics\Statistics;

$s = Statistics::make(
    [98, 90, 70,18,92,92,55,83,45,95,88,76]
);
$a = $s->frequencies();
print_r($a);
/*
Array
(
    [18] => 1
    [45] => 1
    [55] => 1
    [70] => 1
    [76] => 1
    [83] => 1
    [88] => 1
    [90] => 1
    [92] => 2
    [95] => 1
    [98] => 1
)
 */

$a = $s->relativeFrequencies();
print_r($a);
/*
Array
(
    [18] => 8.3333333333333
    [45] => 8.3333333333333
    [55] => 8.3333333333333
    [70] => 8.3333333333333
    [76] => 8.3333333333333
    [83] => 8.3333333333333
    [88] => 8.3333333333333
    [90] => 8.3333333333333
    [92] => 16.666666666667
    [95] => 8.3333333333333
    [98] => 8.3333333333333
)
 */

测试

composer run test           Runs the test script
composer run test-coverage  Runs the test-coverage script
composer run format         Runs the format script
composer run static-code    Runs the static-code script
composer run all-check      Runs the all-check script

更新日志

请参阅更新日志,了解最近有哪些变化。

贡献

请参阅贡献指南以获取详细信息。

安全漏洞

请审查我们的安全策略,了解如何报告安全漏洞。

鸣谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件