本記事は10Xアドベントカレンダー2024の25日目の記事になります。メリークリスマス!🎄 🎁 🎅 🤶 🧑🎄
昨日はエンジニアの@futaboooさんが、『10Xも子育ても4年目のソフトウェアエンジニアが人生初EMになった話』という記事を公開されています。
膨大な商品データを眺めていて思うこと
こんにちわ!商品データチームの吉田(@yutatatatata)です。
私が所属するチームでは、ネットスーパーアプリ上で表示する「商品データ」を生成するデータパイプラインを開発しています。
複数パートナー様(10Xでは契約先の小売企業様をパートナーと呼んでいます)の膨大な商品データを日々触っていると、「パートナー横断で全商品をきちんと整理して並べてみたいなぁ」という気持ちが湧いてきます。
今回はそんなアイデアから商品のデータを整理して可視化してみた話を紹介します。
意外に知らない「バーコード」の話
普段スーパーなどに並んでいる商品には「JANコード」と呼ばれる商品識別IDが付いています。 世間的には「バーコード」と呼ばれているアレです。
商品コードはそれはそれでなかなか奥が深いですが、ここではややこしい部分は割愛して特徴をざっと紹介してみます。
JANコードとは
- 定義:
- JANコード(Japanes Article Numberの略)は、日本国内で広く使用されている商品識別用のIDで「どの事業者の、どの商品か」を表します。13桁の数字で構成されている「EAN-13」と、短縮版である8桁の「EAN-8」があります。
- 桁数:
- 13桁の数字(標準)と短縮版の8桁(小型商品用)
- 用途:
- 日本国内の流通における商品管理、在庫管理、販売管理などに利用されますが、国際的にもEANコードとして認識されるため、海外でも使用可能です。
また、よりグローバルなGTINコードというものもあります。
GTINコードとは
定義:
- GTIN(Global Trade Item Number)は、GS1(流通コードの管理及び流通標準に関する国際機関。)によって定義された国際標準のバーコードで、商品やサービスを一意に識別するための番号です。JANコードはGTINの一部として扱われます。GTINは、地域や業界を問わず、世界中で使われる商品識別の基盤となります。
用途:
- GTINはグローバルに通用する商品識別コードで、輸出入を含めた国際的な取引でも使用されます。
違いのまとめ
- JANコードは、日本国内の流通システムに特化したバーコードで、GTINの一部として機能する。
- GTINコードは、JANコードを含む世界共通の標準として、商品を識別するために使われる。
簡単に言えば、JANコードは日本向けの識別コードであり、GTINはそれを含むグローバルな識別コードです。
普段何気なく見ているJANコードですがきちんと法則があり、先頭数桁は販売している企業を示す企業コードとなっています。そしてそのうちの先頭2桁はその企業の国コードを示しています。
日本の企業が販売する商品のバーコードは先頭が必ず 45 もしくは 49 で始まります。こういった商品は日本企業が販売している商品なので “ナショナルブランド商品” と呼ばれたりします。
なので、例えば輸入品オリーブオイルや韓国の食品などの海外食品のバーコードはそれぞれの国コードから始まります。
これでバーコードに詳しくなりましたね!今度スーパーに行ってみた際にぜひ確認してみてください。
10Xでは、スーパーのスタッフさんが商品をピッキングする際に使う便利なアプリも作っている関係で、パートナー様からそれぞれの商品のバーコードデータも受領しています。
バーコードには上記のような規則があるので、これを使えば一意に商品を識別できるIDとして使えそうです!
と、思うじゃろ?
ところがどっこい、厄介なバーコードたちがいます。
例えば↓
これが噂に聞く「味は違うけどJANコードは同じ」ジャイアントコーンさん…!
— 𠮷田勇太 / ysdyt (@yutatatatata) 2024年11月21日
一筋縄ではデジタルに在庫管理できないのでネットスーパーではそもそも販売されてなかったりランダムに味がお届けされたりする難問 https://t.co/p6fUmO2rl5 pic.twitter.com/5MbnIkwNbE
みんな大好きジャイアントコーンには複数の味がありますが全て「4901005312005」というJANコードになっています。
データ管理の観点からは、味ごとにユニークなJANコードが振られていてほしいですが、JANコードは「商品を完全にユニークに識別する」というよりは、「その商品を販売している企業が商品管理できるように」振られているようです。
そのため、「販売終了となった過去の商品のバーコードを再利用する」というケースもあり、時間的にも、商品的にも必ずはユニークにならないというなかなか難しい状態があるようです。
さらに、生鮮食品までこの話を展開すると、更に大変です。
生鮮食料品(野菜や肉など)は、個々の重さによって値段が異なるため各スーパー独自のコードを発行しています。このように店内でのみ使うコードをインストアマーキングといいます。
インストアマーキングの商品はその店内のみでしか販売しないため、JANコードとは異なりある程度自由に設定することができるようです。ただし、JANの国コードに対応する最初の2桁については、混同を避けるため20~29を使用するように決められています。
ここまで来ると「パートナー横断でJANコードをユニークIDとして商品データを統合する」ことが片手落ちになってくることがわかります。特に生鮮食品は難しそうです。
が、「結合が難しい商品もいろいろあるなぁ」ということを頭に入れつつ、とりあえず結合できるものは結合してみるかの精神でやってみます。データ分析あるあるですね。
商品の価格推移を出してみた
dbtとstreamlitで社内限定のダッシュボードアプリとして作成しています。
ナショナルブランド(バーコードが45,49から始まる日本の商品)に特に絞って商品データを整理してみました。10Xではサービス維持のため過去の商品データもある程度保持しているため、時系列データとして見ることもできます。
(注釈※10Xでは以下のような情報提供サービスを行っているわけではなく、あくまでデータ活用の可能性を考えるうえでの社内研究です。)
例えば、僕はここ数年毎朝お決まりのヨーグルトを食べていますが、そのヨーグルトの直近3週間ほどの価格推移を可視化してみるといろいろ興味深いです。
線は1つのパートナー様の価格推移を示しますが、同じヨーグルトでも日によってコロコロと価格が変わり、そして比較的価格差もあります。 ヨーグルトのような多くの人が日常的に購入する商品は、絶対値としては小さな金額差でも”あそこの店は高い/安い”という印象が残りやすい(”価格弾力性が高い”と表現される)ため、各社が価格競争を頑張っている雰囲気が伝わってきます。
ある1日における最安値との価格差を見てみても差が大きいことがわかります。
とある牛乳でも同じ雰囲気があります。赤い線のパートナー様は定期的にセールをしているんだろうな、など。
他方で、とある缶ビール350ml缶は各パートナー様で固定の価格で販売されており、価格差もそれほど大きくありません。商品によって値段の付け方、売り方は様々だなぁと感じます。
最近は卵の価格が上がっているとニュースで聞くので、またその時系列データも見てみたいなと思いました。価格推移ひとつとっても、やはりデータを眺めているといろいろと思いつくことがあり面白いです。
小売データは堀り甲斐がある
いつもスーパーで見る馴染の商品のデータを触るのは単純に面白いですし、商品単位に整理されたデータは商品理解を深めるきっかけになり業務のいろいろな場面で役立ちそうです。また、単純に商品データ量が膨大であること、上述したような商品IDの難しい問題もありデータエンジニアリングの観点からも面白いテーマだと思っています。
私見ですが、この「商品を管理するID体系が微妙にイケてない」ことが小売企業のDXに少なからずブレーキをかけている面もあるんじゃないかなぁと感じています。中には、JANコードとは別に小売企業独自の商品IDを新規に振り直して管理されている気合の入った企業も見られます。現状のJANコード体系でも「店舗の運営」は可能かもしれませんが、デジタルによる業務効率化を行うには「(本当の意味で)商品単位でユニークに管理するID」が必要になると思っています。小売データの管理や分析は10Xの強みなので、このあたりもいい感じにしたいなと!
P.S. 最後に、私達 商品データチームが全パートナー様に対してどのように日々膨大な商品データを生成しているかの試行錯誤の歴史をまとめた90ページの気合が入ったスライドも公開しています。商品データのエンジニアリングに興味が湧いた方はぜひ御覧ください!
(今回お話した商品データチームとは別職種ですが、)10Xではメンバーを募集しています!採用ページもぜひご覧ください。
まだまだ続くよ10Xアドベントカレンダー!明日はエンジニアのSawadaさんからプロダクトセキュリティーの取り組みのお話です!
本記事の参考:
GS1 Japan 一般財団法人流通システム開発センター
JANコードとは?JANコードの意味や作成方法などを紹介|ECのミカタ
JAN | バーコード講座 | キーエンス