0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「一式」と書かれた見積を、数量×単価に分解して比較可能にする

0
Posted at

「一式」と書かれた見積を、数量×単価に分解して比較可能にする

見積書を2枚並べても、そのままでは比較できないことがあります。粒度が違うからです。

片方が費目ごとに数量と単価まで書かれていて、もう片方が「一式 ◯◯万円」でまとまっている。この2枚の総額を並べても、何も分かりません。

葬儀の見積書を題材に、非構造のテキストを比較可能な形に正規化する手順を整理します。扱う内容の性質上、ここで書くのは金額の妥当性の判断ではなく、比べられる形にするところまでです。

弁護士による葬儀ガード

→ 葬儀の見積書の項目を確認したいときは弁護士による葬儀ガード

目標の形

分解後のレコードをこう定義します。

type LineItem = {
  name: string;           // 費目名
  unitPrice: number | null;   // 単価。不明なら null
  quantity: number | null;    // 数量。不明なら null
  unit: string | null;        // "人前" | "個" | "日" | "回" | "枚" | "km以内"
  amount: number;             // 金額(小計)
  variability: 'fixed' | 'variable' | 'unknown';
  included: boolean;          // このプランに含まれるか
  source: 'stated' | 'derived' | 'asked';   // 出どころ
};

null を許す設計にしているのが要点です。「書かれていない」を欠損として保持することで、次の工程で「確認が必要な箇所」として抽出できます。無理に 0 や推定値で埋めると、欠損だったことが失われます。

source を持つのは、記載されていた値と、こちらで計算した値と、質問して得た値を混ぜないためです。

変動するかどうかで分ける

variability の分類が、この正規化の中心になります。

分類 費目の例 契約後の動き
fixed 祭壇、棺、寝台車、式場代、火葬料 ほとんど動かない
variable 料理、返礼品、礼状、安置料、ドライアイス 人数と日数で動く

variable に分類される費目は、契約時点では金額が確定しないという性質を持ちます。

コラムで紹介されている調査の平均額は、総額が96.73万円。その内訳に飲食費11.67万円と返礼品費13.03万円が含まれ、この2費目だけで約25万円になります。総額のおよそ4分の1が、契約の時点では未確定という整理です。

つまり総額どうしの比較は、確定していない4分の1を含んだまま比べていることになります。分解が要る理由がここにあります。

単位を持たせる

variable の費目は、それぞれ異なる変数に連動します。単位を型で持つと、何に連動するかが判別できます。

費目 単位 連動する変数
料理 人前 参列者数
返礼品 個 参列者数
会葬礼状 枚 参列者数
安置・保管 日 安置日数
ドライアイス 回 安置日数
寝台車・霊柩車 km以内 × 回 距離と回数
const driver = (unit: string) =>
  ({ '人前': 'attendees', '個': 'attendees', '枚': 'attendees',
     '日': 'days', '回': 'days' }[unit] ?? 'other');

連動先が分かると、パラメータを変えたときの総額を計算できます。

function total(items: LineItem[], params: { attendees: number; days: number }) {
  return items.reduce((sum, it) => {
    if (it.variability !== 'variable' || it.unitPrice == null) return sum + it.amount;
    const q = params[driver(it.unit ?? '')] ?? it.quantity ?? 0;
    return sum + it.unitPrice * q;
  }, 0);
}

これで、参列者が1人増えたとき、安置が1日延びたときの差が出せます。

欠損を抽出する

分解して null が残った箇所が、確認すべき項目です。

const gaps = (items: LineItem[]) => items.filter(
  (it) => it.variability === 'variable' && (it.unitPrice == null || it.unit == null)
);

variability === 'variable' に絞っているのがポイントです。fixed の費目に単価が書かれていなくても、後から動かないので影響は限定的です。優先度をつけて確認するために、この絞り込みが効きます。

「一式」表記の扱いも、この枠組みで整理できます。

{ name: '葬儀一式', unitPrice: null, quantity: null, unit: null,
  amount: 800000, variability: 'unknown', included: true, source: 'stated' }

variability: 'unknown' として1行で保持しておき、内訳が得られたら複数行に展開します。推測で分解しないことが重要です。

コラムでは、項目ごとの金額が入った見積書をその場で依頼してよい、という案内がされていました。分解の元になる情報は、聞けば得られる場合があるということです。

included = false の集合を別に持つ

サービス内容

比較を壊すもうひとつの要因が、プランの外にある費用です。

プランの外にあることが多いものとして挙げられていたのは次のとおりでした。

費目 備考
火葬料 自治体・施設で差がある。無料の例も十数万円の例もある
式場使用料 公営の斎場や寺院を会場にする場合
お布施・御車代・御膳料 宗教者への支払い
追加保管料 安置が延びた日数分
追加の料理・返礼品 参列者が想定を超えた分

これらを included: false として同じ配列に入れておき、集計時に切り替えます。

const grandTotal = (items: LineItem[], includeExternal = false) =>
  items.filter((it) => it.included || includeExternal)
       .reduce((s, it) => s + it.amount, 0);

2枚の見積を比べるとき、片方が火葬料を含み、もう片方が含まないなら、総額の差はそこだけで説明がつきます。 included を持たずに総額だけ比べると、この差を見落とします。

お布施については、葬儀社に払うお金とは性質が違い、現金で別に用意するものと説明されていました。コラムで紹介されている調査における中心的な範囲は20万円〜50万円。回答の上端が170万円、下端が8万円でした。この開き方では点推定が機能しないので、範囲として保持するのが妥当です。

type Range = { min: number; max: number; typical?: [number, number] };

比較の前に条件をそろえる

正規化しても、パラメータが違えば比較になりません。

そろえる条件として挙げられていたのは、参列者の人数、式場、通夜の有無、安置日数、火葬料の扱いの5つでした。

type Assumptions = {
  attendees: number;
  venue: string;
  wake: boolean;          // 通夜の有無
  days: number;           // 安置日数
  cremationIncluded: boolean;
};

この5つを固定してから、上の total() を通す。 そうして初めて、2枚の数字が同じ土俵に乗ります。

質問で埋める項目

利用の流れ

欠損を埋めるための質問として、3つが挙げられていました。

  1. この見積もりに含まれないものは何ですか → included: false の集合を得る
  2. 参列者が1人増えると、いくら増えますか → attendees に連動する単価の合計を得る
  3. 安置が1日延びると、いくら増えますか → days に連動する単価の合計を得る

3つの質問が、上のデータ構造の3つの欠損に対応しています。 全項目の単価を聞き出さなくても、連動する合計値が分かれば感度は計算できます。

答えはその場でメモし、できればその日のうちにメールで送って確認しておく、と案内されていました。source: 'asked' として記録に残す部分にあたります。

分解できないときの選択肢

コラム

内訳が得られず、unknown のまま残ることもあります。

見積書・契約書・請求書を弁護士が中立の立場で確認するサービスがあり、対応範囲に「不要・不明項目の指摘(『一式』表記や、内容の分からない費目を洗い出す)」「追加料金条件の確認」が挙げられていました。葬儀後の請求確認として、見積書と請求書の差額を検証する項目もあります。

相談は何度でも無料、24時間受付、匿名相談可とされています。手元に見積書がない状態でも相談でき、葬儀を終えた後の相談にも対応するとのことでした。相談の内容を見るのは担当者と担当弁護士に限られ、本人の同意がないかぎり葬儀社へ連絡することはないと明記されています。

葬儀社からの紹介料・広告料等は一切受け取らず、葬儀社の紹介・斡旋も行わない(弁護士法により行えないため)という記載もあります。

まとめ

  • 総額の比較は、確定していない部分を含んだまま比べている
  • unitPrice / quantity / unit を null 許容で持ち、欠損を欠損のまま保持する
  • variability で fixed と variable を分け、variable の欠損を優先して確認する
  • 単位から連動する変数を導き、パラメータを変えた総額を計算できるようにする
  • included を持ち、プランの外にある費用を切り替えられるようにする
  • 幅の大きい費用は点ではなく範囲で持つ
  • 比較の前に、参列者数・式場・通夜の有無・安置日数・火葬料の扱いをそろえる
  • 推測で分解しない。埋まらない欄は質問で埋める

本ページはプロモーションが含まれています

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?