データ品質ロジック
EDINET有価証券報告書の生データからクリーンな財務指標を算出するまでに適用している全てのロジックを公開しています
パイプライン概要
EDINET DBでは有報XBRL(CSV形式)の生データを4段階で処理し、企業横断的に比較可能な財務指標を提供しています。各段階で適用されるデータ品質ロジックの数を示します。
STEP 1 Bronze → Silver(名寄せ + スコープ制御)
EDINETのXBRL element_id(企業ごとに異なる約2,000種類)を、24の標準指標に名寄せする処理です。2層構造 + 2パスで処理します。
1-1. 入力フィルタリング
Bronze layer(生CSV)からSilverに取り込む行を絞り込む条件です。
| フィルタ | 条件 | 理由 |
|---|---|---|
| マッピング済みのみ | element_id IN (マッピング141件) | Layer 1で定義された標準element_idのみ取り込む |
| 数値のみ | SAFE_CAST(value AS FLOAT64) IS NOT NULL | 「-」や空文字はNULLになり除外される(バイオベンチャーの売上等) |
| 期間制限 | context_id LIKE 'CurrentYear%' OR 'Prior1~4Year%' | 最大5年度分に限定。それ以前はデータ品質が不安定 |
| 孤立行排除 | edinetCode IS NOT NULL AND periodEnd IS NOT NULL | 企業コードや決算期が欠損している行を除外 |
1-2. Layer 1 Pass 1 — 連結優先取得
同一(企業, 年度, 指標)に複数の値が存在する場合、ROW_NUMBERで1つに絞り込みます。
| 優先度 | 条件 | 対象例 |
|---|---|---|
| 0 | KeyFinancialData(主要な経営指標の推移) | 三井海洋開発: PL本表41.8B vs KFD662B → KFDを採用 |
| 1 | 企業の会計基準に一致するelement_id | IFRS企業ならIFRS要素、US GAAP企業ならUSGAAP要素 |
| 2 | IFRS要素(会計基準不一致) | JP GAAP企業にIFRS要素が存在する場合 |
| 3-4 | USGAAP要素 / その他 | フォールバック |
同一優先度内のタイブレーク: ①親会社帰属NI優先 → ②最新提出日時 → ③値が大きい方
スコープ制御(Pass 1)
| 指標区分 | context_id条件 | 理由 |
|---|---|---|
| 連結指標(売上、NI等19項目) | NOT LIKE '%NonConsolidated%' AND NOT LIKE '%Member%' | 連結値のみ取得 |
| 単体指標(配当、資本金等5項目) | LIKE '%NonConsolidated%' | 1株配当は常に単体から取得 |
1-3. Layer 1 Pass 2 — 単体フォールバック
Pass 1で連結データが取得できなかった企業(子会社なしの約800社)に対して、単体データをフォールバックとして取得します。4つの除外ルールでクロススコープ汚染を防止します。
| 除外ルール | 条件 | 理由 |
|---|---|---|
| Pass 1取得済み | LEFT JOIN anti-pattern | 連結で取れた指標は上書きしない |
| 単体専用は除外 | element_id NOT IN (配当等5項目) | Pass 1で処理済み |
| 連結専用OI除外 | element_id NOT IN (OperatingIncome, OperatingProfitLossIFRS) | IFRS持株会社の単体OIは連結と大幅に異なる(しばしば赤字) |
| EPS/希薄化EPS除外 | itemName NOT IN ('eps', 'diluted_eps') | 連結EPSと単体EPSは計算根拠が異なる |
セグメント行の排除: context_idの末尾が正確に _NonConsolidatedMember で終わる行のみ取得。セグメント別の値(_ReportableSegmentsMember等)は除外されます。
1-4. Layer 2 — 企業固有element_id対応(REGEXP)
Layer 1でカバーできない企業固有の拡張element_id(jpcrp030000-*プレフィックス)を正規表現で名寄せします。Layer 1のカバー率は約95%で、残り5%をLayer 2で補完します。
| 指標 | マッチ条件 | 除外条件 |
|---|---|---|
| 売上高 | NetSales|Revenue|OperatingRevenue|BusinessRevenue|GrossSales + Summary/KFD | Intersegment|Cost|Gain|Loss|Allowance|Commission|Refund|Proceeds |
| 営業利益 | OperatingProfitLoss|OperatingIncome|OperatingProfit + SummaryOfBusinessResults | — |
| 純利益 | Profit + SummaryOfBusinessResults | Ordinary|Operating|BeforeTax|GrossProfit|Equity|Earnings|Business |
| 純資産 | TotalEquity + SummaryOfBusinessResults | — |
営業利益にKeyFinancialDataを使わない理由: 一部企業(例: モンスターラボHD)がKFDの営業利益の符号を手入力で誤っているケースがあるため、PL本表(SummaryOfBusinessResults)のみを対象にしています。
1-5. 会計基準の自動判定
企業の会計基準を当期のelement_idから自動判定します。過年度のelement_idは参照しません(基準移行企業の誤判定を防ぐため)。
| 基準 | 判定条件 | 該当企業数 |
|---|---|---|
| US GAAP | CurrentYear* context内に *USGAAP* element_idが存在 | 約6社(キヤノン等) |
| IFRS | CurrentYear* context内に *IFRS* or ifrs-full:* が存在 | 約250社 |
| JP GAAP | 上記いずれにも該当しない | 約3,500社 |
STEP 2 Silver → Gold(集計テーブル構築)
Silver layerの行形式データ(1行=1指標)を、企業×年度のピボットテーブルに変換します。
MAX(IF(itemName = 'revenue', value, NULL)) AS revenue
同一(企業, 年度)に同じitemNameが複数残っている場合、MAX値を採用。通常はLayer 1のROW_NUMBERで1行に絞られているため、この状況は稀です。
STEP 3 Gold(サニタイズ + 比率算出)
集計テーブルの値を正規化(サニタイズ)し、そこから財務比率を算出します。
3-1. サニタイズ(異常値フィルタ)
| 対象 | ルール | 閾値 | 対処 | 該当例 |
|---|---|---|---|---|
| 配当性向 | 連結DPS÷EPSで自前計算 | — | EDINET記載値(個別決算ベース)は不使用 | セブン&アイHD: EDINET値95%→連結60% |
| EPS(絶対値) | 単位誤り検出(円のはずが千円/百万円) | > 1,000,000 | NULL化 | — |
| EPS(前年比) | 株式分割/併合による急変を検出 | > 10倍 | NULL化 | 株式分割で100分割された場合など |
| BPS(絶対値) | 単位誤り検出 | > 100,000,000 | NULL化 | — |
| BPS(前年比) | 株式分割/併合による急変を検出 | > 10倍 | NULL化 | 村田製作所FY2022: 前年0.78(異常)→1166(正常) で巻き添えNULL |
既知の副作用: EPS/BPSの前年比ガードは「前年の値が異常 → 翌年の正常値がNULL化」という連鎖が起こり得ます。影響は前年が異常値の翌1年度のみで、現状は許容しています。
3-2. 比率算出ガード
財務比率を算出する際、数学的に正しくても実務上無意味な値が出るケースをNULL化します。
| 比率 | ガード条件 | NULL化理由 | 該当例 |
|---|---|---|---|
| 営業利益率 純利益率 |
業種 IN ('保険業','銀行業') AND NI > 0 AND NI > 売上高 |
連結売上高がEDINETで未開示のため、単体経常収益がフォールバックで入っている。連結NIと割り算しても無意味 | 第一生命HD (190%), T&D HD (245%), あいちFG (112%) |
| ROE | 純資産 < 0(債務超過) | 債務超過ではROEの符号が反転し誤解を招く。赤字+債務超過=正のROE、黒字+債務超過=負のROE | 74件(赤字)+4件(黒字) = 78件 |
クロススコープガードの対象外: 保険業・銀行業以外でNI > 売上高(例: メタプラネット418%、ジャフコ288%)は正当な値です。暗号資産の評価益、事業売却益、投資収益など、営業外の大型利益によるものであり、NULL化しません。
3-3. 成長率の計算ロジック
| 計算 | ロジック | 理由 |
|---|---|---|
| YoY成長率 | (当期 - 前期) / ABS(前期) | 前期が赤字の場合にABSがないと符号が反転する(赤字→黒字で-150%になる問題を防止) |
| CAGR(3年/5年) | POW(当期/N年前, 1/N) - 1 ただし当期 > 0 AND N年前 > 0のみ |
ゼロ以下の値でべき乗計算を行うと複素数になるため、正値のみで計算 |
| FCF | 営業CF + 投資CF | いずれかがNULLの場合、BQ標準でNULL伝播(正しい動作) |
| 全除算 | SAFE_DIVIDE | ゼロ除算をNULLにする(BQ標準関数) |
STEP 4 品質モニタリング
4-1. 欠損検知(Transform実行後)
Transform処理の最後に、4つのコア指標(売上高、純利益、総資産、純資産)の欠損を企業単位でチェックします。
検知結果はAPIレスポンスの data_gaps フィールドとCloud Runログに出力されます。現在の検知企業: かんぽ生命(売上高欠損)、サンバイオ(売上高欠損)、ソケッツ(純利益欠損)。いずれもEDINETの開示形式に起因する正常な欠損です。
4-2. 自動アラート
データの鮮度、NULL率、行数変動を定期的に自動チェックし、閾値を超えた場合に運営チームへ通知します。
| チェック項目 | WARNING | CRITICAL |
|---|---|---|
| データ鮮度(最終更新からの経過時間) | 26時間 | 48時間 |
| NULL率(コア指標) | 20% | 30% |
| 行数変動(前回比) | -10% | -20% |
業種・企業固有の特殊ケース
EDINETの開示形式が一般事業会社と異なる業種・企業の処理方法をまとめています。
| 業種・企業 | 特殊性 | 対処 | 影響 |
|---|---|---|---|
| 保険業HD 第一生命HD、T&D HD等 |
連結売上高(保険料収入等)がSummaryOfBusinessResultsに記載されない | Pass 2で単体経常収益がフォールバック。利益率はクロススコープガードでNULL化 | 売上高は表示(単体値)、利益率はNULL |
| 銀行業 3メガバンク、地銀等 |
売上高はOrdinaryIncome(経常収益)で開示。連結営業利益は非開示 | OrdinaryIncome → revenue にマッピング済み。営業利益率はNULL | 売上高は経常収益を表示、営業利益はNULL |
| IFRS総合商社 三菱商事、三井物産等5社 |
SummaryOfBusinessResultsに連結営業利益を記載しない | 営業利益はNULL(正常動作)。PL本表からの取得は当期分のみ可能 | 営業利益はNULL、売上高・NI・ROE等は正常 |
| US GAAP企業 キヤノン、富士フイルム、コマツ、オムロン、野村HD、オリックス |
USGAAP固有のelement_idを使用。連結営業利益はEDINET US GAAPフォーマットに開示項目がない | Layer 1で専用マッピング済み。会計基準判定も自動。営業利益はNULL(正常動作) | 売上高・NI・BPS・ROE・自己資本比率は正常。営業利益・営業利益率はNULL |
| 三井海洋開発 | IFRS PL本表(41.8B)とKFD(662B)で売上高が大幅に異なる | KFDを最優先(Priority 0)で採用 | 売上高662B、純利益率5.3% |
| バイオベンチャー サンバイオ等 |
売上高が「-」(ダッシュ)で記載 | SAFE_CAST → NULL。売上高はNULL、data_gapsで検知 | 売上高NULL、NI・総資産は正常 |
注意事項
- 各ガードの閾値は実データの分布に基づいて設定していますが、エッジケースで正当な値がNULLになる可能性があります。
- EPS/BPSの前年比10倍ガードは、正当な大幅改善(赤字→大幅黒字転換)を見逃す可能性があります。ただし翌年度には正常値に復帰します。
- クロススコープガードは現在、保険業・銀行業のみを対象にしています。今後、同様のパターンが他の業種で発見された場合は対象を拡張します。
- 配当性向はEDINET記載値(個別決算ベース)ではなく、連結DPS÷EPSで自前計算しています。持株会社では個別EPSと連結EPSが大きく異なるため、EDINET値は不正確になります。
- PER(株価収益率)はEDINET有報記載値(提出日時点の株価ベース)を使用しています。Yahoo FinanceやBloomberg等のリアルタイムPERとは基準日が異なるため、大きく乖離する場合があります。
- 株式分割・併合: EPS・BPS・DPSは有報記載値をそのまま使用しています。期中に株式分割が行われた場合、中間配当(分割前単位)と期末配当(分割後単位)が混在してDPSの合計値が見かけ上大きくなることがあります。
- 対象範囲: EDINET DBは上場内国法人のみを対象としています。非上場の有報提出企業(ファンド、SPCなど)は含みません。
- ロジックは継続的に改善しています。変更履歴は本ページ下部の「ロジック更新履歴」に記載しています。
ロジック更新履歴
| 日付 | 変更内容 | 影響範囲 |
|---|---|---|
| 2026-02-21 | 全指標品質検証(6社×外部IR照合)。PER・株式分割・非上場企業に関する注記追加 | P/L・B/S・CF・per-share指標が外部ソースと一致することを確認 |
| 2026-02-20 | US GAAP企業(6社)の連結判定修正。BPS・純資産・自己資本比率のelement_idマッピング修正 | キヤノン等6社のBPS・自己資本比率が正常値に修正 |
| 2026-02-20 | BPS異常値フィルタの閾値を1億→1千万に変更 | バークシャー・ハサウェイ等の高BPS企業をカバー |
| 2026-02-20 | 配当性向をEDINET記載値(個別決算)から連結DPS÷EPSの自前計算に変更。200%キャップ追加 | 約1,400社の配当性向が連結ベースの正確な値に修正 |
| 2026-02-18 | クロススコープガードを保険業・銀行業限定に変更(全業種一律→業種ベース) | 11社の純利益率がNULLから正常値に復帰 |
| 2026-02-18 | ROE債務超過ガードを拡張(赤字+債務超過のみ→全債務超過企業) | 4社の誤ったROE値がNULLに修正 |
| 2026-02-18 | payoutRatio正規化を追加(閾値2.0で小数/百分率を自動判定)※2/20に連結自前計算へ置換 | 約60社の配当性向が正常値に修正 |
| 2026-02-18 | KeyFinancialDataの優先度を最高(Priority 0)に変更 | 三井海洋開発の売上高が662Bに修正 |
| 2026-02-17 | operatingMarginガードを追加(営業利益÷売上高 > 1の場合NULL化) | 営業利益率102%の異常値を排除 |
| 2026-02-11 | Layer 1マッピングを公式タクソノミで全面検証(141 element_id) | 全3,848社の指標カバレッジ確認 |
関連ドキュメント: 指標リファレンス | 財務健全性スコア算出ロジック | データソース