ローソンデジタルイノベーション テックブログ

ローソンデジタルイノベーション(LDI)の技術ブログです

ご当地からあげクンをできるだけ簡単に2種類買いたい。エリア限定商品の空間解析

こんにちは、データ分析チームのIです。今回はご当地からあげクンのお話をさせていただきます。

1. ご当地からあげクン

2025年8月12日より、全国7エリアで地域限定のからあげクンが発売されました。

ご当地のソウルフードや慣れ親しんだ名店監修の商品で、販売エリアと味は以下の通りです。

詳細な商品内容は「ご当地からあげクン」等で検索すると確認できると思います 。

本商品は地域限定の特別な商品のため他のエリアでは販売されることはなく、からあげクン好きとしては「他の地域の味も試してみたい」、さらには「すべての味を食べ比べてみたい」という動機も生まれます。

とはいえ、現実的には全国の7エリアを回るのも困難です。そこで着目したのが、地域の境界付近に位置する店舗です。地域境界に近い店舗同士であれば、比較的短距離で異なる地域の商品を入手でます。例えば東北エリアの店舗と首都圏エリアの店舗の距離が短い地点を見つけることができれば、「おやつカルパス味」と「月島もんじゃ海鮮味」の2つの味を比較的簡易に入手できます。

2. 最短距離の探索と計算

地域をまたいだ店舗同士の最短距離を求めるには、全ての店舗同士の組み合わせで距離を算出する方法が思いつきますが、ローソンの約15,000店舗の店舗同士の組み合わせを考えると、計算コストが高く非効率です。そのようなときに便利なのが、空間解析の手法に用いられるR-treeです。

R-treeについては「空間インデックス R-tree」等で検索していただくと、詳細な説明をされているサイトが複数みつかると思います。 ここでは概略の説明を目的に簡易的な疑似データを用意しました。からあげクンA味を扱う店舗が4地点(青)、からあげクンB味を扱う店舗が4地点(赤)存在するデータを扱います(図1)。

図1 仮想の地点データイメージ

R-treeは、まずAのエリアとBのエリアをMBR (Minimum Bounding Rectangle, 最小境界矩形) と呼ばれる長方形で囲みます。

図 2 AとBをMBRで囲んだ状態

次にこれを階層的に整理します。ここでは簡単のため階層は1つだけです。 エリアAの4地点を2つのMBR(子ノード)に分割します。この分割は任意ではなく、MBRの面積の合計が最も小さくなり、かつMBR同士の重なりが最も少なくなるように分割が行われます。これにより、特定の場所を検索する際の無駄な計算が減り、高速な探索が可能になります。

ここでは、それぞれのMBRに2つの地点が含まれるとします。同様に、エリアBの4地点も2つのMBRに分割します。

図 3 AとBを子ノードのMBRに分割

次に、エリアAのMBR(L1とL2)とエリアBのMBR(L3とL4)の2×2の組み合わせを調べます。このとき、MBR間の最短距離(MINDIST)を計算し、最もMINDISTが小さい組み合わせを特定します。 たとえば、L1とL3の組み合わせが最もMINDISTが小さかったとします。これは、実際の最短距離の地点ペアがこのMBRの中にある可能性が高いことを意味します。

最後に、L1に含まれる2地点とL3に含まれる2地点の2×2の組み合わせを直接計算し、正確な最短距離とその地点のペアを求めます。エリアAのL2とエリアBのL4は計算に必要はありません。

図 4 最短距離の組み合わせを探索

4地点×4地点の総当たり16通りの計算より、上記の方法なら4+4の8通りに削減できました。AやBに含まれる地点がもっと多くなった場合、このツリー構造の階層を増やすだけで同様に探索できます。これにより、無関係な地点をすべて調べることなく、効率的に高速な探索が行えます。

3. 最短店舗探索の実行

R-treeを用いた最短距離の計算についてはいろいろありますが、今回はRのsfパッケージを利用しました。 以下にR言語によるサンプルコードを示します。

#sfパッケージの読み込み
library(sf)
#中部ビーバー味の取扱い店舗はデータフレームchubuに経度、緯度情報を持つ
#近畿ブタキム味を取扱い店舗はデータフレームkinkiに経度、緯度情報を持つ

#中部店舗の緯度経度情報を用いてshapeファイル化
chubu_sf <- st_as_sf(chubu, coords = c("keido","ido"), crs = 6668)
#近畿店舗の緯度経度情報を用いてshapeファイル化
kinki_sf <- st_as_sf(kinki, coords = c("keido","ido"), crs = 6668)

#中部と畿の最も近い地点を探す
nearest_features_idx <- st_nearest_feature(chubu_sf, kinki_sf)

# 距離の計算
# st_distance()で全組み合わせの距離を計算し、st_nearest_feature()の結果を使って該当する距離を抽出
distances <- st_distance(chubu_sf, kinki_sf)
min_distances <- distances[cbind(1:nrow(chubu_sf), nearest_features_idx)]

# 中部と近畿の組み合わせで最も近いペアを特定する
min_pair_idx <- which.min(st_distance(chubu_sf, kinki_sf))
min_pair_row <- ((min_pair_idx - 1) %% nrow(chubu_sf)) + 1
min_pair_col <- ((min_pair_idx - 1) %/% nrow(chubu_sf)) + 1

# 結果の表示(最も近い距離のペアを特定)
chubu[min_pair_row,]
kinki[min_pair_col,]
st_distance(chubu_sf[min_pair_row,], kinki_sf[min_pair_col,]) #単位m

4. からあげクンが2種類買える最短距離の店舗

計算を行うべき境界は

  • 北海道―東北
  • 東北―首都圏
  • 首都圏―中部
  • 中部―近畿
  • 近畿―中四国
  • 中四国―九州

の6つだけです。東北と中部や、中部と中四国といった組み合わせは両エリアは接していないため、最短距離の計算はする必要はありません。また北海道―東北、中四国―九州は海を超える必要があるため検討から除外しました。 なおこの結果は2025年8月31日時点のもので、店舗の在庫状況によっては商品がないことも十分に考えられますので、品切れ等についてはご了承ください。

4.1 東北と首都圏

いわき錦町蒲田店(東北)と北茨城大津町店(首都圏)が直線距離で5.7kmと比較的近い位置に存在していました。GoogleMapで確認すると車で約9分の距離でした。

4.2 首都圏と中部

湯河原宮上店(首都圏)と熱海サンビーチ(中部)が直線距離で4.8kmでしたが、地図で確認したところ、湯河原町土肥店(首都圏)の方が道路事情的に近いようでした。車での所要時間は13分でした。

4.3 中部と近畿

関ヶ原町店(中部)と山東柏原店(近畿)が直線距離で6.1km、車での所要時間は11分でした。

4.4 近畿と中四国

関西福祉大学前店(近畿)と備前日生町寒河店(中四国)が直線距離で7.0km、車での所要時間は13分でした。

4.5 中四国と九州

本節の冒頭部で中四国と九州は海峡を渡る必要があり除外すると書きましたが、実は山口県の一部店舗で九州の商品が販売されていました *1。最短は山陽小野田埴生店(中四国)と下関小月バイパス店(九州)で4.7㎞、車で9分の距離に存在していました。

まとめ

北海道以外の6商品について、2種類の地域限定商品が比較的買いやすい5地点をピックアップしました。紹介した地点は、車なら15分弱程度で回れるようですので、もし境界付近に訪れる機会があれば、ぜひもう1つの店舗にも足を延ばしてみてください。 今回のようにローソンの店舗位置同士の位置情報の把握の他にも、国土交通省から出ている位置情報を組み合わせることで、高速道路から近い位置に存在する店舗や、特定の鉄道路線沿いに存在するローソン店舗も効率的に探索可能です。

LDIのデータ分析チームは普段はローソンのデータ分析部門やマーケティング部門と連携しながらお仕事をさせていただいております。ローソン店舗では1000を超える多種多様な商品を約15,000店舗という多くの店舗で扱うため、日々多くの販売や仕入のデータが蓄積されています。扱えるデータは大量にあり、分析が好きな人間にとっては非常に魅力的な環境です。興味のある方はぜひLDIの採用募集へ応募してください。

*1:同様の事例は三重県にもあり、同一県内で大きく分けて東側は中部、西側は近畿の商品が扱われています。