メインコンテンツへスキップ
見出し画像

「全部光って意味がない」——巨大な毛玉グラフをJaccard係数で解きほぐすまで|MDツール開発ログ Vol.13

    こんにちは、ノックスリョウです!

    ・ 今は薬剤師。アパレル業界に飛び込み、MD(マーチャンダイザー)×クリエイターとして奮闘中。
    ・ ファッション市場の「次のトレンド」をいち早く掴むための分析ツールを、コード経験ほぼゼロからAIと一緒に開発しています。
    ・ このシリーズは、その泥臭い開発過程をリアルタイムで公開する「プロセスエコノミー」型の連載です。

    ここまでの軌跡を一気読みしたい方は→ 総集編(Vol.1〜10まとめ)をどうぞ!

    前回は「3回直しても表示されなかったスパークライン」を、
    よく分かんないけど、無理くり表示できるようにしました!

    スパークラインって何?って方は是非前回記事を読んでみてくださいね!
    それにしても口なじみ無さすぎて違和感ありますね。スパークライン。

    今回は、グラフそのものの構造に潜んでいた爆弾の話です。


    この記事はマガジンにまとめています。

    こちらの記事も読んでみてね!


    【今回までの進捗】

    • ✅ ニュース記事の自動収集(スクレイピング)

    • ✅ 単語の抽出と頻度カウント

    • ✅ 仕分けアプリ(スカウト型UI)の完成

    • ✅ グレーリスト+3層構造の設計

    • ✅ Tinder風→エクセル型への転換

    • ✅ 裏方と表舞台の接続

    • ✅ ノードに推移グラフを仕込む

    • 🔄 ← 今ここ:グラフのUI強化(フォーカス・コロニー化・検索)


    【立ちはだかる壁】「クリックしたら光る」はずが——全部光って意味がない問題

    前回までで、トレンドグラフは「ノードにカーソルを合わせると推移が見える」ようになりました。

    でも、この画面を眺めているうちに、
    もうひとつの不満がむくむくと湧いてきた。

    「特定の単語の、仲のいい人をみたい」

    たとえば「GU」をクリックしたら、
    GUと関係の深い「コラボ」「新作」「ユニクロ」だけが浮かび上がって、
    残りは暗くなる——。

    映画館の客席照明が落ちて、
    主役にスポットライトが当たる、あのイメージ。

    「フォーカス機能」を実装するために、Gemini先生へ相談。

    仕様は明快。

    • クリックしたノードと、線で繋がった関連ワードだけを明るく表示。

    • 関係ないノードはグレーアウトして沈める。

    • 背景をクリックすると元に戻る。

    実装を指示して、グラフを開く。
    ノードをクリックしてみると——

    ちゃんとグレーアウトした!

    画像

    理想は、クリックしたノードをグラフの中心へ移動させたかった。
    が、現環境では手間がかかりすぎるので、今の形に。

    ——ここまではよかった。

    問題は、そのスポットライトの「光漏れ」だった。


    【激闘と解決】「巨大な毛玉」を解きほぐす。Jaccard係数による大手術

    第1幕:すべてが繋がる罠「ヘアボール現象」との遭遇

    画像

    フォーカス機能は動いた。
    でも、使えば使うほど違和感が募る。

    どのノードをクリックしても、ほぼ全部のノードが光る。

    「GU」をクリックしても、「コラボ」をクリックしても、
    画面の8割がハイライトされたまま。

    スポットライトどころか、舞台全体がベタっと照明で照らされている状態に。

    原因は見てのとおりで、
    全部のノードが、全部のノードとつながっている。

    蜘蛛の巣のように、どの単語にも線がびっしり張り巡らされていて、
    特に「アイテム」「新作」みたいな一般的な単語が中心にドンと居座り、
    周りの単語を全部引きずり込んでいた。

    これ、データ分析の世界では「ヘアボール」って呼ばれる現象らしい。**
    これまたホントかよって名称を出される。

    自分の作ったトレンドグラフが、
    巨大な毛玉だと思うと面白いけど…

    ツールとして使えないよな〜。

    キレイに情報が整理されていると思ってたのに、
    実態は「全部がぐちゃっとくっついたもつれ」だったわけです。

    第2幕:「何回一緒にいたか」ではなく「どれくらいの確率で一緒にいるか」

    Geminiに「このヘアボールをどうにかしたい」と相談する。

    問題は、グラフの線の引き方。

    今までは「出現数ベース」——
    つまり、「AとBが10回一緒に記事に出たら線を引く」方式だった。

    でもこれだと、
    「アイテム」みたいなそもそも出現数が多い単語が、
    あらゆる単語と「回数的には」一緒に出ているので、全部とつながってしまう。

    たとえるなら、学校の人気者。

    クラスの全員と1回ずつ話したことがある人気者は、
    全員と「つながりがある」ことになる。

    でも、その中で本当の親友は誰なのか?

    それを見分けるのに使うのが、Jaccard係数(ジャッカード係数)という考え方。
    ナンソレ?。数Aのやつか?

    • 今まで:「AとBが10回一緒に出た → つなぐ」

    • これから:「AとBは、お互いにとってどれくらいの確率で一緒にいるか?」

    出現数が多いだけの「人気者ワード」は、
    誰とでも浅く広くつながっているのでスコアが下がる。

    逆に「デニム」と「ワイドパンツ」みたいな、
    出るときはいつも一緒の組み合わせは、スコアが高くなる。

    これにより、浅い関係が自然に消えて、
    本当に濃い関係(コロニー)だけが残る。

    仕様書を書いて、実装を指示。

    実行結果を開く——

    画像

    すこーしだけあの毛玉が、島(コロニー)に分かれ始めた。

    ……ただし、副作用あり。

    ノードが異常にデカくなった!

    サイズ計算式がJaccard係数の変更に追いついていなかったらしい。

    パラメータ調整のパッチを急いで当てて、ノードの大きさを適正化。

    ここは力技で修正しました。

    第3幕:コロニー化の副作用と、検索・ズーム機能の実装

    ヘアボールが解消されてコロニーが生まれたことで、
    グラフは多少見やすくなりました。

    でも——新しい問題が発生。

    「あれ、"デニム"ってどこにあるの?」

    毛玉時代は、全部が中心にぎゅっと集まっていたから、
    目を凝らせばなんとか見つかった。

    でもコロニー化して散らばったことで、
    特定の単語がグラフのどこにいるのかが分からない。

    Geminiから提案されたのが、キーワード検索&ズーム機能。

    • 画面左上に検索ボックスを設置。

    • 単語を入力すると候補がドロップダウンで表示される。

    • 選択して「GO」を押すと、カメラがその単語のノードへ「グイーン」と自動ズーム。

    • さらに、前に実装したフォーカス機能が連動して起動する。

    実装して、テスト。

    検索窓に「GU」と入力。
    ドロップダウンから選択して、GOボタンを押す——

    画像
    画像

    きたーー!

    カメラがスーッとGUのノードに寄っていき、
    周辺のコロニーだけがハイライトされた!

    ……ただし、ズームが近すぎて周りが見えないw

    まぁ、これはパラメータ調整で直せる範囲。

    機能として動いていることが何より大事。


    【開発の真髄】「毛玉」に気づけるかどうかが分岐点

    画像

    今回の開発で一番怖かったのは、
    「毛玉」に気づかないまま運用していた可能性があったということ。

    グラフが蜘蛛の巣状だったとき、
    見た目は「すごい!いっぱい繋がってる!」って感じだった。

    情報がぎっしり詰まっている=価値がある、と錯覚していた。

    でも実際には、何も分析できない「ただのノイズ」だった。

    フォーカス機能を実装したからこそ、
    「全部光る=全部つながってる=つまり何も整理されてない」
    という本当の問題が可視化された。

    新しい機能を追加したら、前の設計のボロが出る。

    ボロを直したら、次の課題が見える。

    この「前進→破壊→再構築」のサイクルこそが、
    開発の本質なんだと、改めて思いましたね。**


    【次回予告と「余白」】

    フォーカス機能、コロニー化、検索機能。

    3つのUI強化で、トレンドグラフはようやく「見る」から「使う」ツールに進化し始めました。

    でも、コロニーがちゃんと意味のある塊になっているかは、まだ未検証。

    「デニムとワイドパンツが同じ島にいるのは分かる。
    でも、なぜこの2つは別の島に分かれたのか?」

    次回は、このコロニーの意味づけに踏み込んでいきます。

    皆さんが普段使っているツールで、
    「見た目はすごいけど実は整理されてなかった」みたいな経験、ありますか?

    ここまでお読みいただき、ありがとうございます!
    それでは、また!


    【後注】
    前回、3回直しても表示されなかったスパークラインをなんやかんやした話はこちら!

     
     
    論理(Logic)と感性(Sense)でハックする! 薬剤師・画家。服のブランドを立ち上げながら、AIをチームにして、MDの道具(TrendGraph)や発信の仕組みを自分で作っています。指示がずれた、任せすぎた、といった失敗も含めて、チームを引っ張る側の記録を書いています。

    あなたへのおすすめ