PHP-FrequencyTable を作ってみました

PHP

これって何?

度数分布表を簡単に作成できるツールです。PHPで書かれています。

度数分布表については、以前の記事を参考にしてください。

このツールは、データを1次元配列で渡して階級幅を指定するだけで、

Markdown形式での度数分布表をテキスト出力してくれます。

また、他のプログラムでも使用できるように、

度数分布表に関わる一連のプロパティをまとめてハッシュで返してくれます。

Githubで公開されており、Composerでサクッとインストールして使えます。

GitHub - macocci7/PHP-FrequencyTable: it's easy to use for creating frequency distribution tables.
it's easy to use for creating frequency distribution tables. - macocci7/PHP-FrequencyTable

度数分布表を使ってみよう

実際に使ってみるのが早いと思います。

PHP(>=8.0.0)が使えるローカル環境に適当に作業用フォルダを作って、

そこにComposerでインストールします。

Composerが無い場合はインストールしてください。

Composer
A Dependency Manager for PHP

Composerをインストール済の状態で、PHP-FrequencyTableをインストールします。

composer require macocci7/php-frequency-table

インストールはサクッと終わります。

composer.json と composer.lock と vendor/ ができました。

では、src/ フォルダを作成して、その中にPHPコードを作成していきましょう。

mkdir src
cd src

Example.php を作成し、編集して保存しましょう。

<?php
require('../autoload.php');

use Macocci7\PhpFrequencyTable\FrequencyTable;

$ft = new FrequencyTable(['data' => [0, 5, 10, 15, 20], 'classRange' => 10]);
//$ft->show(); // 2024/03/03修正:v1.2.0でshow()廃止されました。
echo $ft->meanOn()->markdown();

データは [0, 5, 10, 15, 20]、階級幅は10です。

実行してみます。

php -f Example.php

Markdown形式の度数分布表が出力されました。

これをファイルに保存してみます。

php -f Example.php > Example.md

今度は表が表示されずに、Example.md の中にリダイレクトされて保存されています。

Example.md を開いて確認してみましょう。

|Class|Frequency|RelativeFrequency|ClassValue|ClassValue * Frequency|
|:---:|:---:|:---:|:---:|---:|
|0 ~ 10|2|0.40|5.0|10.0|
|10 ~ 20|2|0.40|15.0|30.0|
|20 ~ 30|1|0.20|25.0|25.0|
|Total|5|1.00|---|65.0|
|Mean|---|---|---|13.0|

Markdown形式の度数分布表が保存されています。

VS Code の場合は「プレビューを開く」でHTMLに変換されレンダリングされた表を見れます。

このような感じになります。色はVS Codeの配色テーマ設定によって変わります。

Githubではこのような表示になります。

出力を調整してみよう

出力できる列項目は次の7項目です。デフォルトは上から5項目に絞っています。

  • 階級 : Class
  • 階級値 : Class Value
  • 度数 : Frequency
  • 相対度数 : Relative Frequency
  • 階級値×度数 : Class Value × Frequency
  • 累積度数 : Cumulative Frequency
  • 累積相対度数 : Cumulative Relative Frequency

えー?項目多いとウルサイから階級と度数だけで充分だよと言う場合は

<?php
require('../vendor/autoload.php');

use Macocci7\PhpFrequencyTable\FrequencyTable;

$ft = new FrequencyTable([
    'data' => [0, 5, 10, 15, 20],
    'classRange' => 10,
    'columns2Show' => [
        'Class',
        'Frequency',
    ],
]);
//$ft->show(); // 2024/03/03修正:v1.2.0でshow()は廃止
echo $ft->meanOn()->markdown();

‘columns2Show’ の箇所で配列に項目名を指定します。指定した順に表示されます。

だいぶスッキリしました。でも、最後の「Mean」は要らないという場合は、

<?php
require('../vendor/autoload.php');

use Macocci7\PhpFrequencyTable\FrequencyTable;

$ft = new FrequencyTable([
    'data' => [0, 5, 10, 15, 20],
    'classRange' => 10,
    'columns2Show' => [
        'Class',
        'Frequency',
    ],
]);
//$ft->show(['Mean' => false]); // 2024/03/03修正
echo $ft->meanOff()->markdown();

$ft->show() の引数に [‘Mean’ => false] を指定します。

meanOff() メソッドを使います。

あ、イイ感じですよね。

逆に、内容モリモリにしたい場合は、

<?php
require('../vendor/autoload.php');

use Macocci7\PhpFrequencyTable\FrequencyTable;

$ft = new FrequencyTable([
    'data' => [0, 5, 10, 15, 20],
    'classRange' => 10,
    'columns2Show' => [
        'Class',
        'ClassValue',
        'Frequency',
        'RelativeFrequency',
        'CumulativeFrequency',
        'CumulativeRelativeFrequency',
        'ClassValue * Frequency',
    ],
]);
//$ft->show(); // 2024/03/03修正
echo $ft->meanOn()->markdown();

表示項目をフルフルMAXにしました。

あとは、これで階級の行が増えれば完璧ですね。

テーブル出力は要らないからプロパティだけください

という方はには朗報です。

<?php
require('../vendor/autoload.php');

use Macocci7\PhpFrequencyTable\FrequencyTable;

$ft = new FrequencyTable([
    'data' => [0, 5, 10, 15, 20],
    'classRange' => 10,
    'columns2Show' => [
        'Class',
        'ClassValue',
        'Frequency',
        'RelativeFrequency',
        'CumulativeFrequency',
        'CumulativeRelativeFrequency',
        'ClassValue * Frequency',
    ],
]);
//$ft->show();
var_dump($ft->parse());

Markdown形式の表出力をせずに、プロパティの入った配列をダンプします。

ダンプの出力が長すぎるので、戻り値の構造だけ提示しておきます。

[
    'classRange' => 10,
    'data' => [0,5,10,15,20],
    'Max' => 20,
    'Min' => 0,
    'DataRange' => 20,
    'Mode' => 15,
    'Total' => 5,
    'Mean' => 13,
    'Median' => 10,
    'MedianClass' => ['index' => 1, 'bottom' => 10, 'top' => 20 ],
    'FirstQuartile' => 2.5,
    'ThirdQuartile' => 17.5,
    'InterQuartileRange' => 15,
    'QuartileDeviation' => 7.5,
    'Classes' => [
        0 => ['bottom' => 0, 'top' => 10],
        1 => ['bottom' => 10, 'top' => 20],
        2 => ['bottom' => 20, 'top' => 30],
    ],
    'Frequencies' => [2,2,1],
    'FrequencyTable' => ・・・(省略)・・・,
]

これだけのデータがあれば、度数分布表だけでなく、ヒストグラムや、

箱ひげ図(外れ値検出なし)まで作れます。

おまけとして、’MedianClass’ プロパティまであるので、

学校の定期テストや学力テストでおなじみの

「中央値はどの階級に入るか?」問題まで即答できますよ。

※2024/03/03修正:バージョン1.2.0での仕様変更により、parse()[‘FrequencyTable’]は文字列からハッシュ配列に変更されました。詳細はこちらの記事をご覧ください。

CSVからのデータ読込

に対応した使用例を掲載しています。

GitHub - macocci7/PHP-FrequencyTable: it's easy to use for creating frequency distribution tables.
it's easy to use for creating frequency distribution tables. - macocci7/PHP-FrequencyTable

「OhtaniShohei2023.php」は、エンジェルスの大谷翔平投手の投球データを

CSVから読み込んで、試合毎の球速分布を度数分布表として作成します。

「OhtaniShohei2023.md」に保存してあります。

CSVのデータソースはMLB公式の「savant」です。

Baseball Savant: Statcast, Trending MLB Players and Visualizations
Baseball Savant

全選手、全試合、全投球のデータが事細かに公開されていて、

サイト側では様々な角度から高度な分析をして閲覧できる状態です。

恐ろしい世の中ですね。

まとめ

というわけで、PHP-FrequencyTable は簡単便利に使えるツールだと思います。

データ重視で統計必須の今の世の中、是非活用してみてください。

ちなみに、この PHP-FrequencyTable を利用したツールとして、

PHP-Histogram と PHP-Boxplot もGithubで公開しており、

同様にComposerでインストールできるようにしてあります。

こちらも併せてご活用ください。

GitHub - macocci7/PHP-Histogram: PHP-Histogram creates histograms using FrequencyTable.
PHP-Histogram creates histograms using FrequencyTable. - macocci7/PHP-Histogram
GitHub - macocci7/PHP-Boxplot: PHP-Boxplot creates boxplots using FrequencyTable.
PHP-Boxplot creates boxplots using FrequencyTable. - macocci7/PHP-Boxplot
GitHub - macocci7/PHP-Scatterplot: PHP-Scatterplot is a simple PHP library to create scatter plot easily.
PHP-Scatterplot is a simple PHP library to create scatter plot easily. - macocci7/PHP-Scatterplot

※2024/03/03追記:バージョン1.2.0にアップデートした記事を追加しました。

コメント

タイトルとURLをコピーしました