hi-folks / statistics
PHP包,提供计算数值数据数学统计功能的函数。
Requires
- php: ^8.1
Requires (Dev)
- laravel/pint: ^1.13
- pestphp/pest: ^2.0
- phpstan/phpstan: ^1.3
- rector/rector: ^0.18.5
This package is auto-updated.
Last update: 2024-09-08 13:19:51 UTC
README
Statistics PHP包
介绍一个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 ) */
统计类
Freq
和 Stat
类提供的方法主要是 静态方法。如果您更愿意使用对象实例来计算统计数据,可以选择使用 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)。有关更多信息,请参阅许可证文件。