【PHP】ローレンツ曲線作成ツール

PHP

ローレンツ曲線作成ツール PHP-LorenzCurve を作りました。(PHP >= 8.1)

Githubで公開しています。Composerでインストールできます。

GitHub - macocci7/PHP-LorenzCurve: A PHP Library to draw a Lorenz Curve
A PHP Library to draw a Lorenz Curve. Contribute to macocci7/PHP-LorenzCurve development by creating an account on GitHu...

このような感じのローレンツ曲線を簡単に作ることができます。

前提条件

  • PHP 8.1以降インストール済
  • Imagick PHP Extension インストール済
  • Composerインストール済
  • 当記事はUbuntu24.04(WSL2)で作業

PHP + Imagick (Ubuntu)の環境構築については次の記事をご覧ください。

インストール

ローカルの作業用フォルダを作り、作業用フォルダ内で次のコマンドを実行します。

mkdir lorenz-curve
cd lorenz-curve
composer require macocci7/php-lorenz-curve

使用例のコピー

使用例が同梱されているので、それをコピーしていじってみるのが良いと思います。

examplesフォルダをコピーして中に入ります。

cp -ra vendor/macocci7/php-lorenz-curve/examples ./
cd examples

基本的な使い方

基本的な使い方は次の通りです。

  • autoload.php 取り込み
  • インスタンス生成
  • データセット
  • 階級幅セット
  • 画像保存

▼「examples/BasicUsage.php」

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use Macocci7\PhpLorenzCurve\LorenzCurve;

$lc = new LorenzCurve(); // インスタンス生成

$lc
    ->setData([1, 5, 10, 15, 20]) // データセット
    ->setClassRange(5) // 階級幅セット
    ->create('img/BasicUsage.png'); // 画像保存 

実行してみます。

php -f BasicUsage.php

「examples/img/BasicUsage.png」が生成されます。

グリッド表示

グリッドを表示させるには「grid()」メソッドを使います。

▼引数

  • グリッド線の幅(ピクセル)
  • グリッド線の色(16進数カラーコード)

▼「examples/DrawGrid.php」

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use Macocci7\PhpLorenzCurve\LorenzCurve;

$lc = new LorenzCurve();

$lc
    ->setData([1, 5, 10, 15, 20])
    ->setClassRange(5)
    ->grid(1, '#ffcccc') // 幅:1ピクセル、色:薄ピンク
    ->create('img/DrawGrid.png');

実行してみます。

php -f DrawGrid.php

「examples/img/DrawGrid.png」が生成されます。

上に凸の曲線

ローレンツ曲線は基本的には下に凸となりますが、

度数分布表の階級をデフォルトの小さい順ではなく、

大きい順に並べ替えることで上に凸となります。

「reverseClasses()」メソッドを使うことで階級を大きい順に並べ替えます。

▼「examples/UpwardConvexCurve.php」

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use Macocci7\PhpLorenzCurve\LorenzCurve;

$lc = new LorenzCurve();

$lc
    ->setData([1, 5, 10, 15, 20])
    ->setClassRange(5)
    ->reverseClasses() // 階級大きい順並べ替える
    ->grid(1, '#ffcccc')
    ->create('img/UpwardConvexCurve.png');

実行してみます。

php -f UpwardConvexCurve.php

「examples/img/UpwardConvexCurve.png」が生成されます。

画像サイズ

デフォルトの画像サイズは

  • 幅:400ピクセル
  • 高さ:300ピクセル

となっています。

「resize()」メソッドで画像サイズを指定できます。

▼引数

  • 幅:ピクセル(正の整数)
  • 高さ:ピクセル(正の整数)

▼「examples/ResizeImage.php」

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use Macocci7\PhpLorenzCurve\LorenzCurve;

$lc = new LorenzCurve();

$lc
    ->setData([1, 5, 10, 15, 20])
    ->setClassRange(5)
    ->grid(1, '#ffcccc')
    ->resize(450, 400) // 450ピクセル高さ400ピクセル
    ->create('img/ResizeImage.png');

▼実行結果

プロットエリア

ローレンツ曲線を描画する矩形領域(0≦x≦1, 0≦y≦1 に相当)

をプロットエリアと呼んでいますが、

デフォルトの属性は次のようになっています。

  • x方向オフセット: 画像幅の10%
  • y方向オフセット: 画像高さの10%
  • 幅: 画像幅の80%
  • 高さ: 画像高さの70%
  • 背景色: null (透明)

「plotarea()」メソッドでこれらの属性を変更できます。

▼引数

  • offset:配列([int $offsetX, int $offsetY])
  • width: プロットエリアの幅(ピクセル)
  • height: プロットエリアの高さ(ピクセル)
  • backgroundColor:背景色(16進数カラーコード)

▼「examples/SetPlotareaAttrs.php」

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use Macocci7\PhpLorenzCurve\LorenzCurve;

$lc = new LorenzCurve();

$lc
    ->setData([1, 5, 10, 15, 20])
    ->setClassRange(5)
    ->grid(1, '#ffcccc')
    ->plotarea( // プロットエリアの属性変更
        offset: [80, 50], // xオフセット80ピクセル、yオフセット50ピクセル
        width: 280, // 幅280ピクセル
        height: 200, // 高さ200ピクセル
        backgroundColor: '#eeeeee', // 背景色薄いグレー
    )
    ->create('img/SetPlotareaAttrs.png');

▼実行結果

キャプションとラベル

キャプションは「caption()」メソッド、

ラベルは「labelX()」「labelY()」メソッドで設定できます。

▼「caption()」メソッドの引数

  • caption:キャプション文字列
  • offsetX:x方向オフセット(ピクセル)
  • offsetY:y方向オフセット(ピクセル)

▼「labelX()」メソッドの引数

  • label:x方向ラベル文字列
  • offsetX:x方向オフセット(ピクセル)
  • offsetY:y方向オフセット(ピクセル)

▼「labelY()」メソッドの引数

  • label:y方向ラベル文字列
  • offsetX:x方向オフセット(ピクセル)
  • offsetY:y方向オフセット(ピクセル)

▼「examples/CaptionLabels.php」

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use Macocci7\PhpLorenzCurve\LorenzCurve;

$lc = new LorenzCurve();

$lc
    ->setData([1, 5, 10, 15, 20])
    ->setClassRange(5)
    ->grid(1, '#ffcccc')
    ->plotarea(offset: [60, 40])
    ->caption('CAPTION')
    ->labelX('Cumulative Relative Frequency', offsetX: 0, offsetY: 10)
    ->labelY('Cumulative Relative Subtotal')
    ->create('img/CaptionLabels.png');

▼実行結果

配列による属性変更

「config()」メソッドに、属性名をキーとしたハッシュ配列を渡すことで各属性を変更可能です。

変更可能な属性については「変更可能な属性」をご覧ください。

▼「examples/ConfigFromArray.php」

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use Macocci7\PhpLorenzCurve\LorenzCurve;

$lc = new LorenzCurve();

$lc
    ->setData([1, 5, 10, 15, 20])
    ->setClassRange(5)
    ->config([
        'canvasBackgroundColor' => '#3333cc',
        'showGrid' => true,
        'gridWidth' => 1,
        'gridColor' => '#0066ff',
        'axisWidth' => 3,
        'axisColor' => '#ffffff',
        'scaleWidth' => 2,
        'scaleLength' => 6,
        'scaleColor' => '#ffffff',
        'scaleFontSize' => 14,
        'scaleFontColor' => '#ffffff',
        'lorenzCurveWidth' => 1,
        'lorenzCurveColor' => '#ffff00',
        'lorenzCurveBackgroundColor' => null, // transparent
        'completeEqualityLineWidth' => 3,
        'completeEqualityLineColor' => '#ffffff',
        'completeEqualityLineDash' => [8, 8],
        'fontColor' => '#ffffff',
        'caption' => 'Config From Array',
    ])
    ->create('img/ConfigFromArray.png');

▼実行結果

Neonファイルによる属性変更

「config()」メソッドの引数に、Neon形式で各属性の設定を記述したNeonファイルのパスを渡すことで、各属性を変更可能です。

Neonについては次の記事をご覧ください。

変更可能な属性については「変更可能な属性」をご覧ください。

▼「examples/ConfigFromFile.neon」

canvasBackgroundColor: '#3333cc'
showGrid: true
gridWidth: 1
gridColor: '#0066ff'
axisWidth: 3
axisColor: '#ffffff'
scaleWidth: 2
scaleLength: 6
scaleColor: '#ffffff'
scaleFontSize: 14
scaleFontColor: '#ffffff'
lorenzCurveWidth: 1
lorenzCurveColor: '#ffff00'
lorenzCurveBackgroundColor:
completeEqualityLineWidth: 3
completeEqualityLineColor: '#ffffff'
completeEqualityLineDash: [8, 8]
fontColor: '#ffffff'
caption: 'Config From File'

▼「examples/ConfigFromFile.php」

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use Macocci7\PhpLorenzCurve\LorenzCurve;

$lc = new LorenzCurve();

$lc
    ->setData([1, 5, 10, 15, 20])
    ->setClassRange(5)
    ->config('ConfigFromFile.neon')
    ->create('img/ConfigFromFile.png');

▼実行結果

変更可能な属性

変更可能な属性は次の通りです。

属性デフォルト説明
canvasSize[‘width’]int400450画像幅
canvasSize[‘height’]int300400画像高さ
canvasBackgroundColorstring#ffffff#0000ff画像背景色
plotarea[‘offset’]int[]画像サイズの10%[40, 50]プロットエリアのオフセット
plotarea[‘width’]int画像幅の80%500プロットエリアの幅
plotarea[‘height’]int画像高さの70%400プロットエリアの高さ
plotarea[‘backgroundColor’]stringnull#ccccccプロットエリアの背景色
showGridboolfalsetrueグリッド線表示可否
gridWidthint12グリッド線の幅
gridColorstring#cccccc#0099ffグリッド線の色
axisWidthint23座標軸の幅
axisColorstring#000000#ffffff座標軸の色
scaleWidthint12目盛線の幅
scaleLengthint36目盛線の長さ
scaleColorstring#000000#ffffff目盛線の色
scaleFontSizeint1614目盛値のフォントサイズ
scaleFontPathstringfonts/ipaexg.ttffonts/myfont.ttf目盛値のフォントパス
scaleFontColorstring#000000#ffffff目盛値の色
lorenzCurveWidthint21ローレンツ曲線の幅
lorenzCurveColorstring#000000#ffff00ローレンツ曲線の色
lorenzCurveBackgroundColorstring#ffcc00nullローレンツ曲線と完全平等線とで囲まれた領域の色
completeEqualityLineWidthint13完全平等線の幅
completeEqualityLineColorstring#999999#ffffff完全平等線の色
completeEqualityLineDashint[][4, 4][8, 8]完全平等線の破線パターン(実線と空白のピクセル数)
fontPathstringfonts/ipaexg.ttffonts/myfont.ttfフォントパス
fontSizeint1614フォントサイズ
fontColorstring#333333#ffffffフォントカラー
labelXstring(空文字列)累積相対度数x方向ラベル
labelXOffsetXint0-10x方向ラベルのx方向オフセット
labelXOffsetYint010x方向ラベルのy方向オフセット
labelYstring(空文字列)累積相対小計y方向ラベル
labelYOffsetXint0-10y方向ラベルのx方向オフセット
labelYOffsetYint0-10y方向ラベルのy方向オフセット
captionstring(空文字列)見出しキャプション
captionOffsetXint010キャプションのx方向オフセット
captionOffsetYint0-10キャプションのy方向オフセット

ジニ係数

「getGinisCoefficient()」メソッドを使うことで、

画像を生成せずに、ジニ係数だけを取得することが可能です。

▼「examples/GinisCoefficient.php」

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use Macocci7\PhpLorenzCurve\LorenzCurve;

$lc = new LorenzCurve();

var_dump(
    $lc
        ->setData([1, 5, 10, 15, 20])
        ->setClassRange(5)
        ->getGinisCoefficient()
);

▼実行結果

double(0.37647058823529)

ジニ係数0のローレンツ曲線

すべて同じ値のデータをセットしてローレンツ曲線を生成すると、

ローレンツ曲線が完全平等線と一致し、

ジニ係数はゼロ(データの偏り無し)となります。

▼「examples/GinisCoefficient0.php」

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use Macocci7\PhpLorenzCurve\LorenzCurve;

$lc = new LorenzCurve();

$lc
    ->setData([1, 1, 1, 1, 1])
    ->setClassRange(5)
    ->grid(1, '#ffcccc')
    ->create('img/GinisCoefficient0.png');

var_dump($lc->getGinisCoefficient());

▼実行結果

ジニ係数ほぼ1のローレンツ曲線

多数のデータがあり、1個を除いて他がすべてゼロのデータをセットしてローレンツ曲線を生成すると、ジニ係数がほぼほぼ直角となり、ローレンツ曲線はほぼほぼ1となります。

▼「examples/GinisCoefficientAlmost1.php」

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use Macocci7\PhpLorenzCurve\LorenzCurve;

$lc = new LorenzCurve();

$data = array_fill(0, 500, 0);
$data[] = 5;

$lc
    ->setData($data)
    ->setClassRange(5)
    ->grid(1, '#ffcccc')
    ->create('img/GinisCoefficientAlmost1.png');

var_dump($lc->getGinisCoefficient());

▼実行結果

double(0.99800399201597)

ジニ係数1のローレンツ曲線

ゼロでない1個だけのデータをセットしてローレンツ曲線を生成すると、ローレンツ曲線が直角となり、ジニ係数が1になります。

▼「examples/GinisCoefficient1.php」

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use Macocci7\PhpLorenzCurve\LorenzCurve;

$lc = new LorenzCurve();

$lc
    ->setData([1])
    ->setClassRange(5)
    ->grid(1, '#ffcccc')
    ->create('img/GinisCoefficient1.png');

var_dump($lc->getGinisCoefficient());

▼実行結果

double(1)

コメント

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