水道屋がRubyを活用する(その1)

私の本職は水道屋で穴を掘ったり墓穴を掘ったりして生活しています。水道屋といっても当然書類仕事もあるので、PCを活用しています。多くの場合はWordとかExcelやCADなどのアプリケーションを使って書類を作っています。こういったアプリケーションは使うことは、はっきりいって苦痛なので、できる限りこういったアプリケーションを使わずに済ますためにRubyのプログラムを色々作っています。
このようなプログラムを使っても実はあまり時間は節約になら無い場合も多いのですが(劇的に節約できる場合もある)、例えばWordで1時間掛かるものが、Emacs上で1時間30分なら全然OKとそういう価値観で読んでもらえるとありがたいです。

最初に取り上げるプログラムは、見積書の抜けをチェックするプログラムです。このプログラムは実はまだできていません。実験を色々行ってうまく行きそうだという感触はあるので、この日記をきっかけにして完成させていこうと思います。

どんな商売でも見積書を書く場合がたくさんあろうかと思います。うちでも良く書きます。水道の部品は細かくて種類も一杯あります。私のような注意散漫な人間だとよく抜けがあります。必要な部品を入れ忘れて見積が不当に安くなってしまうわけです。お客様は大喜びですが、会社は大損なので何とかしなくてはいけません。そこで、過去の見積書を分析して同じような見積書にある部品が、今作っている見積書に入っていない場合、忘れているのでは?と聞く様にすると良いのではと考えています。

このような場合、主成分分析が役に立つのではないかなと思います。
処理の流れはこんな感じです。

  • 行列を用意します。この行列は行・列どちらも部品に対応します。要素ははじめ全て0にしておきます。

例えばこんな感じ、実際にはうちでは1800×1800くらいのサイズになります。

万能ホーム水栓 φ13パイプ φ13エルボ φ20パイプ
万能ホーム水栓 0 0 0 0
φ13パイプ 0 0 0 0
φ13エルボ 0 0 0 0
φ20パイプ 0 0 0 0
  • 過去の見積書をスキャンします。見積書ごとに同じ見積書に現れる任意の2つの部品について、その2つの部品を行,列に対応する要素を+1します。

例えば、

    • φ13パイプ
    • φ13エルボ

を部品で使う見積書があった場合、この見積書をスキャンすると、

万能ホーム水栓 φ13パイプ φ13エルボ φ20パイプ
万能ホーム水栓 0 0 0 0
φ13パイプ 0 1 1 0
φ13エルボ 0 1 1 0
φ20パイプ 0 0 0 0

と、φ13パイプとφ13エルボの組み合わせの要素が1加えられます。

  • 全ての見積書をスキャンしたら、各列の合計が1になるように正規化します。

続く