# AIクリーニング：架空の元データと判断資料

OpenMax編集用教材 · 第1版 · 2026年9月4日。
顧客データ、製品の出力、実レコードの変更承認ではありません。

## 出所マニフェストと項目辞書

出所 CLEAN-070-RAW-v1 は8物理行です。想定粒度は1作業につき1観測ですが、マニフェストはR3をR2の再配信と指定しています。2回目のイベントや改訂ではありません。原本を完全に残し、候補版 CLEAN-070-CAND-v1 ではR3を使わず、R2への対応を保持します。

以下の業務項目はすべて元の文字列です。バッククォートはそのままの文字列を表し、二つの引用符は空文字列の表記であって引用符自体を含みません。Doneの前後の空白も元の文字です。source_row は受領した物理行のIDであり、作業IDではありません。

| source_row | job_id | region | quantity | status | completed_date |
|---|---|---|---|---|---|
| R1 | `0001` | `NA` | `10` | `done` | `2026-09-01` |
| R2 | `0002` | `EU` | `20` | ` Done ` | `2026-09-01` |
| R3 | `0002` | `EU` | `20` | ` Done ` | `2026-09-01` |
| R4 | `0003` | `EU` | `1,200` | `done` | `2026-09-01` |
| R5 | `0004` | `EU` | `""` | `done` | `2026-09-01` |
| R6 | `0005` | `EU` | `5` | `BETA` | `2026-09-01` |
| R7 | `""` | `EU` | `7` | `done` | `2026-09-01` |
| R8 | `0006` | `EU` | `30` | `done` | `03/04/2026` |

- job_id：ASCII数字ちょうど4桁を文字列で保存します。先頭ゼロは有意で、空は無効です。文書化した再配信除外後、非空IDは指定粒度で一意でなければなりません。
- region：許可した架空地域ラベルはNAとEUだけです。NAは欠損ではなく、実在国や顧客の身元を主張しません。
- quantity：単位は個、値は非負整数です。ASCII数字を認め、桁区切りは英語・米国式のカンマです。先頭グループは1〜3桁、以降は各3桁です。空文字列は不明でありゼロではありません。別単位やロケールの変換は与えていません。
- status：doneと、前後に空白を一つ持つDoneだけをdoneに対応付けます。BETAには承認済み対応先がありません。この限定ルールは任意の文字列を全体で正規化する許可ではありません。
- completed_date：YYYY-MM-DD形式の有効な日付です。スラッシュ表記の形式は指定していません。日付のみなので時区変換は不要です。報告期間は2026年9月で、対象に入れるためにスラッシュ形式を選ぶことは禁止です。
- 候補条件は、有効なID・地域・数量・承認済みdone状態・期間内の有効日付です。欠落や未解決条件があれば保留します。8行の例に担当者の参照表はなく、後述のnull結合確認は別の入力です。

## ルールと行ごとの判断

ルール集合は CLEAN-070-RULES-v1 です。権威はこの架空の辞書とマニフェストであり、モデルの提案ではありません。D1は再配信、I1はID保持と検査、R1は地域、Q1は数量解析または保留、S1は状態対応、T1は日付と期間、G1は候補条件の組み合わせを扱います。

| 行 | 元値から候補への処理 | 区分 | ルールと理由 |
|---|---|---|---|
| R1 | 0001とNAはそのまま。文字列10を整数10へ | 条件を満たす | I1/R1/Q1/S1/T1合格。欠損扱いに置換しない |
| R2 | 前後空白付きDoneをdoneへ。20を整数へ | 条件を満たす | S1が明示的に許可。他の検査も合格 |
| R3 | 元内容をすべて保存し、保持するR2を参照 | 再配信除外 | D1マニフェストによる。任意の先頭行優先ではない |
| R4 | 1,200を整数1200へ。元文字列を保持 | 条件を満たす | Q1の指定済み桁区切り。他の検査も合格 |
| R5 | 空数量は正規化後も不明 | 保留 | Q1の必須測定がない。出所へ訂正を依頼 |
| R6 | 元のBETAを保持。標準状態を割り当てない | 保留 | S1対応がない。カテゴリ定義を依頼 |
| R7 | 空IDを保持。架空IDや既定IDを付けない | 保留 | I1無効キー。有効な出所IDを依頼 |
| R8 | 03/04/2026を保持。正規化日付は利用不可 | 保留 | T1形式不明。曖昧でない元日付を依頼 |

保留レコードでも、解釈できる別の項目には派生値を持てます。しかし、それで行全体が利用候補になるわけではありません。保留は削除ではなく、どの区分でも元文字列と元行への参照が残ります。

## 照合と利用の境界

- 元の物理行：8 = 再配信除外1 + 候補3 + 保留4。
- 再配信除外後：7観測。そのうち1件はIDがないので、有効で一意なIDが7個とは呼べません。
- 候補：R1、R2、R4。数量10 + 20 + 1200 = 1230個。
- 保留：R5、R6、R7、R8。既知の数量5 + 7 + 30 = 42個と、不明数量1件。
- 元の既知値小計1292から再配信の20を引くと1272 = 1230 + 42。全体合計は依然として不明です。
- 再配信除外後の候補比率3/7 ≈ 42.86%、受領物理行に対して3/8 = 37.5%。どちらもAI精度ではありません。

この候補は完全な9月数量レポートに使う承認を得ていません。3件の部分集合を限定利用するには、部分母集団であることを責任者が明示的に受け入れ、除外と保留を説明する必要があります。この教材を通じて実際の責任者が権限を与えたわけではありません。実際のリリース前に、受領者、用途、候補版、判断時刻、原本参照を記録します。

## 独立した2つのライブラリ確認

ローカル実行はpandas 3.0.1です。2026年9月4日に確認したオンライン参照は3.0.5表記でした。OpenMaxやすべての取り込み・結合の実装を試すものではありません。

```python
from io import StringIO
import pandas as pd

sample = 'job_id,region,quantity\n0001,NA,10\n0002,EU,\n'
default = pd.read_csv(StringIO(sample))
preserved = pd.read_csv(StringIO(sample), dtype=str, keep_default_na=False)
assert default.loc[0, 'job_id'] == 1
assert pd.isna(default.loc[0, 'region'])
assert preserved.loc[0, 'job_id'] == '0001'
assert preserved.loc[0, 'region'] == 'NA'
assert preserved.loc[1, 'quantity'] == ''

left = pd.DataFrame({'key': ['0001', None], 'units': [10, 7]})
right = pd.DataFrame({'key': ['0001', None], 'owner': ['Team1', 'Unassigned']})
joined = left.merge(right, on='key', validate='many_to_one', indicator=True)
assert joined.loc[joined['key'].isna(), 'owner'].tolist() == ['Unassigned']
valid_left = left[left['key'].notna() & left['key'].ne('')]
valid_right = right[right['key'].notna() & right['key'].ne('')]
candidate = valid_left.merge(valid_right, on='key', validate='many_to_one')
assert len(candidate) == 1
assert len(left) - len(valid_left) == 1
```

設定は動作の境界を示すもので、万能の処方ではありません。すべてを文字列で保持すると、空数量も文字列として残るため、後続の項目別検査が意味を判断します。無効キーを結合入力から外しても、元レコードを照合から削除してよいことにはなりません。

出典：[pandas read_csv](https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html)、[pandas merge](https://pandas.pydata.org/docs/reference/api/pandas.merge.html)。
