はじめに
企業の業績を先読みするヒントはさまざまな場所に散らばっている。そのひとつが、官公庁が公開している調達・入札の落札実績データだ。落札は売上の計上よりも前に起きるイベントなので、上場企業がどれだけの公共案件を受注しているかをリアルタイムに近い形で観察できる。
本記事では Data-Walkers が公開している政府調達・入札落札データセットを使い、Python で API からデータを取得して集計・可視化する手順を解説する。投資家が「どの企業が官公庁から受注を増やしているか」を確認する際の参考にもなる。
データの概要
Data-Walkers が提供するこのデータセットは、政府「調達ポータル」の落札実績を収集したものだ。
| 項目 | 内容 |
|---|---|
| dataset_id | 12dcea9f-bdc1-469f-a54f-4008dab666ee |
| 収録件数 | 43,009件 |
| 収録期間(落札日) | 2025-04-01 〜 2026-06-26 |
| 直近180日の件数 | 21,570件 |
各行には以下のカラムが含まれる。
| カラム名 | 内容 |
|---|---|
id |
レコード識別子 |
announcement_date |
入札公告日 |
award_date |
落札日 |
project_name |
案件名 |
ministry |
府省 |
agency |
機関 |
awarded_company |
落札企業名 |
award_amount |
落札金額(円) |
collected_at |
データ収集日時 |
注意点
- 対象は物品・役務の調達が中心であり、道路・ダムなどの公共工事(建設)の落札は含まれない。
- 落札金額が非公開の案件もあり、金額集計は公開分のみが対象になる。
- 落札は売上計上に先行するため、受注動向の**ナウキャスト(先行観察)**として活用できる。
- 企業名は表記ゆれが生じやすい(株式会社の位置、全角・半角など)ため、実務では名寄せ(正規化)が必要になる。
Python でのデータ取得
APIキーの準備
Data-Walkers のデータ取得エンドポイントには APIキーが必要だ。https://data-walkers.com/settings で無料登録すると取得できる。
メタデータとプレビューの確認(認証不要)
まずデータセットのメタデータとサンプル行を確認する。
import requests
import pandas as pd
DATASET_ID = "12dcea9f-bdc1-469f-a54f-4008dab666ee"
BASE_URL = "https://data-walkers.com/api/v1"
# メタデータ・プレビュー取得(APIキー不要)
res = requests.get(f"{BASE_URL}/datasets/{DATASET_ID}")
res.raise_for_status()
meta = res.json()
print(meta["data"]["title"])
print("プレビュー件数:", len(meta["preview"]))
df_preview = pd.DataFrame(meta["preview"])
print(df_preview.head())
実データの取得
直近180日分(2026年1月以降)を取得する例を示す。limit は最大1000件なので、大量に取得したい場合は date_from / date_to で期間を区切って複数回リクエストするとよい。
API_KEY = "YOUR_API_KEY" # data-walkers.com/settings で取得
params = {
"limit": 1000,
"date_from": "2026-01-01",
"date_to": "2026-06-30",
}
headers = {"X-API-Key": API_KEY}
res = requests.get(
f"{BASE_URL}/datasets/{DATASET_ID}/data",
params=params,
headers=headers,
)
res.raise_for_status()
df = pd.DataFrame(res.json()["data"])
print(df.shape)
print(df.dtypes)
取得できたら型変換をしておく。
df["award_date"] = pd.to_datetime(df["award_date"])
df["award_amount"] = pd.to_numeric(df["award_amount"], errors="coerce")
集計・分析
月別の落札件数と落札金額
まず月ごとの傾向を把握する。
df["year_month"] = df["award_date"].dt.to_period("M")
monthly = (
df.groupby("year_month")
.agg(
件数=("id", "count"),
金額合計=("award_amount", "sum"),
)
.reset_index()
)
monthly["金額合計_億円"] = monthly["金額合計"] / 1e8
print(monthly.to_string(index=False))
データサマリーの実績値と照らし合わせると、2026年3月が突出している。
| 月 | 件数 | 金額合計 |
|---|---|---|
| 2026-01 | 1,730件 | 515.1億円 |
| 2026-02 | 4,314件 | 1,274.5億円 |
| 2026-03 | 6,207件 | 3,539.3億円 |
| 2026-04 | 5,395件 | 2,249.9億円 |
| 2026-05 | 1,832件 | 1,651.6億円 |
| 2026-06 | 2,092件 | 1,096.1億円 |
3月は政府の年度末にあたり、件数・金額ともに最大になる。件数が最も多いのも3月(6,207件)だが、金額の大きさ(3,539.3億円)もその傾向を反映している。4月以降は新年度に入り件数は落ち着くものの、5月・6月も一定の規模が維持されている。
簡単な棒グラフで可視化するには次のコードが使える。
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
fig, ax1 = plt.subplots(figsize=(10, 5))
x = range(len(monthly))
ax1.bar(x, monthly["金額合計_億円"], color="steelblue", alpha=0.7, label="落札金額(億円)")
ax1.set_ylabel("落札金額(億円)")
ax1.set_xticks(list(x))
ax1.set_xticklabels(monthly["year_month"].astype(str), rotation=45)
ax2 = ax1.twinx()
ax2.plot(x, monthly["件数"], color="tomato", marker="o", label="件数")
ax2.set_ylabel("落札件数")
lines1, labels1 = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines1 + lines2, labels1 + labels2, loc="upper left")
plt.title("月別落札金額・件数(2026年1〜6月)")
plt.tight_layout()
plt.show()
企業別ランキング
次に企業別の集計を行う。上場企業の受注動向を把握するうえで中心となる分析だ。
company_agg = (
df.groupby("awarded_company")
.agg(
落札件数=("id", "count"),
落札金額合計=("award_amount", "sum"),
)
.sort_values("落札金額合計", ascending=False)
.head(10)
.reset_index()
)
company_agg["落札金額合計_億円"] = company_agg["落札金額合計"] / 1e8
print(company_agg[["awarded_company", "落札件数", "落札金額合計_億円"]].to_string(index=False))
データサマリーに示された直近180日の上位企業は次のとおりだ。
| 企業名 | 落札件数 | 落札金額合計 |
|---|---|---|
| 日本電気株式会社 | 105件 | 596.6億円 |
| 株式会社NTTデータ | 71件 | 547.9億円 |
| 前田建設工業株式会社 | 3件 | 464.8億円 |
| NTTドコモビジネス株式会社 | 43件 | 459.3億円 |
| 西松建設株式会社 | 1件 | 397.4億円 |
| アクセンチュア株式会社 | 24件 | 304.2億円 |
| 富士通株式会社 | 69件 | 231.0億円 |
| 株式会社三菱総合研究所 | 112件 | 214.9億円 |
IT・システム系(NEC、NTTデータ、富士通など)が件数・金額ともに上位を占める一方、前田建設工業や西松建設は件数が1〜3件でも金額が大きい案件を受注している。これは1件あたりの規模が大型であることを示しており、前述のとおりこのデータセットは建設工事を含まないが、物品・役務に分類される大型工事関連契約が含まれている可能性がある。
府省別の発注金額
ministry_agg = (
df.groupby("ministry")["award_amount"]
.sum()
.sort_values(ascending=False)
.head(5)
.reset_index()
)
ministry_agg.columns = ["ministry", "金額合計"]
ministry_agg["金額合計_億円"] = ministry_agg["金額合計"] / 1e8
print(ministry_agg.to_string(index=False))
データサマリーによると、直近180日で最も発注金額が大きいのは国土交通省(5,341.5億円)、次いで法務省(3,129.1億円)となっている。国土交通省は大型インフラ関連の物品・役務調達を多数抱えており、法務省も情報システム関連の調達が大きな割合を占める。財務省(554.1億円)、厚生労働省(429.5億円)、農林水産省(393.9億円)がこれに続く。
特定企業の案件明細を確認する
関心のある企業の案件を絞り込んで内容を確認することもできる。
target = "日本電気株式会社"
df_target = df[df["awarded_company"] == target].copy()
df_target = df_target.sort_values("award_amount", ascending=False)
print(
df_target[["award_date", "ministry", "project_name", "award_amount"]]
.head(10)
.to_string(index=False)
)
案件名(project_name)を確認することで、どの省庁のどのようなプロジェクトを受注しているかを個票レベルで把握できる。
分かったこと・データの限界
得られる示唆
- 年度末の集中: 3月に件数・金額ともに突出しており、政府の予算執行サイクルが明確に現れている。
- IT・システム系企業の存在感: NEC、NTTデータ、富士通などが件数・金額の双方で上位を占めており、官公庁のDX投資の動向を反映していると考えられる。
- 落札は売上の先行指標: 落札した案件が実際に売上に計上されるまでには一定のタイムラグがある。そのため、このデータは受注の「増加トレンド」を先行して観察するナウキャスト的な用途に適している。
データの限界
- 建設工事は対象外: データの説明にあるとおり、このデータセットは物品・役務の調達が中心であり、国交省発注の公共工事(道路・河川など)は基本的に含まれない。
- 金額が非公開の案件: 落札金額が開示されないケースもある。ただし直近180日(21,570件)については金額公開率は100%だ。
- 社名の表記ゆれ: 企業名の全角・半角、株式会社の位置などで同じ企業が別エンティティとして集計されることがある。グループ全体の受注額を把握するには名寄せ処理が必要だ。
- 投資判断への直接適用は慎重に: 落札額が大きいことが直ちに利益増加を意味するわけではない。採算性、既存の売上に占める割合、競合比較など多面的な検証が必要だ。
まとめ
本記事では政府調達・入札落札データを Python で取得し、月別・企業別・府省別に集計する手順を解説した。43,009件(収録期間: 2025-04-01 〜 2026-06-26)のデータが API 経由で取得できるため、特定企業の受注動向モニタリングや、業種別の官公庁依存度の把握に活用できる。ただし社名の名寄せやデータの対象範囲(物品・役務中心)という限界を理解したうえで使うことが重要だ。
この記事で使ったデータは Data-Walkers(https://data-walkers.com)で無料公開しています。政府調達・入札落札データを含む日本株向けオルタナティブデータを REST API で提供しており、APIキーも無料で取得できます。他にも各種オルタナティブデータセットを公開していますので、関心のある方はサイトをご覧ください。