下記のような受注履歴があります。

最も多い組み合わせを算出するにはどうすればよいでしょうか?

2/8 ハンバーガー ポテト
2/8 チーズバーガー ナゲット
2/9 ナゲット ハンバーガー
2/9 ポテト ハンバーガー

なお、商品の順序はばらばらです(ハンバーガーが左端にも右端にも出る)

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/02/08 12:32:56
  • 終了:2008/02/15 12:35:02

回答(3件)

id:SALINGER No.1

SALINGER回答回数3454ベストアンサー獲得回数9692008/02/08 13:21:37

ポイント27pt

65535件を超える場合Excel2007での方法になりますが

http://q.hatena.ne.jp/1202290104

での回答はユーザー定義関数を使う方法でした。


=myCount(商品1の列のセル、商品2の列のセル)

Function myCount(r1 As Range, r2 As Range) As Long
    Dim i As Long
    Dim c As Long
    Application.Volatile
    c = 0
    For i = ActiveSheet.UsedRange.Row To ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
        If Cells(i, r1.Column).Value = r1.Value And Cells(i, r2.Column).Value = r2.Value Then
            c = c + 1
        End If
    Next i
    myCount = c
End Function

この場合、Excelに外部データで取り込んで、最初の商品と後の商品の列がそれぞれB列とC列として

D1の数式を =myCount("B1","C1") といれて

D1セルの右下にカーソルを合わせてダブルクリックすることで最終行まで数式を入れます。

そして、D列でソートすれば一番上に一番多い組み合わせがきます。

http://q.hatena.ne.jp/

id:freewriter

ありがとうございます。

コメント欄の内容も踏まえ、試してみますね。

2008/02/08 15:14:04
id:fuentebella No.2

fuentebella回答回数269ベストアンサー獲得回数302008/02/08 18:42:22

ポイント27pt

gawkというツールで作ってみました。

{comb[$2,$3]++}
END{
for (item in comb)
 {
   split(item, o, SUBSEP)
   if(comb[o[1],o[2]])
      print comb[o[1],o[2]]+comb[o[2],o[1]],o[1],o[2]
   delete comb[o[2],o[1]]
 } 
}

これを check.txtとかに保存します。

データの入っているファイルがdata.txtなら

gwak -f check.txt < data.txt | sort /r > out.txt

とすれば

out.txtに結果が入ります

このご質問の例は区切りが「全角スペース」になっていますので、このままでは上のものは動きません。「半角スペース」で項目を区切ってください。

gawkのダウンロード

http://www.kt.rim.or.jp/~kbk/gawk-3.1/

gawkの使い方

http://oshiete1.goo.ne.jp/qa3735378.html

(上のawkのプログラムは少し見苦しい処理をしているので、もっと詳しい人に直してもらってください。)

id:freewriter

ありがとうございます。

念のため確認です。

これは、商品が2つずつ購入された場合のプログラムですよね。

2008/02/09 23:27:09
id:Baku7770 No.3

Baku7770回答回数2832ベストアンサー獲得回数1812008/02/09 13:25:03

ポイント26pt

 コメントとあわせて回答しますが、私なら最初からDBソフトでやっつけてしまいます。特に量販店の多品種ということですから。

 

 まずレコードの構造ですが

伝票№ 行№ 日付 商品コード(商品分析コード)

といった構造に変えてしまいます。

 商品分析コードは例えば子供向け、若い女性向けといった顧客層で分類してみたり、価格帯で分類してみたり、複数持たせることの方が多いです。

 

 で、DWH(データウェアハウス)を構築して分析ツール用いて分析をしていくという手順を踏みます。

 

 ただし、私なら最初から質問文に書かれているような分析をしません。

 

 よく引き合いに出される事例で金曜日の夜に紙オムツと缶ビールがセットで売れるというのがありますが、最初からどういう組み合わせあるかではなく、時間帯とか客とかとの関係など他にやるべきことはたくさんあるでしょう。量販店であれば商品の品種は多いでしょうし、2品種以上買っていく客は多く、客の思考がぼやけてしまうでしょうから。

 

 実際私も会社で同様のことをやろうとしていますが、これは商品が5種類しかないからやろうとしているだけです。

 

 参考までに

その数学が戦略を決める

id:freewriter

バスケット分析の出来る分析ツールでオープンソースのものはありますか?

クレメンタインとか高いので。。

2008/02/09 23:25:56
  • id:SALINGER
    データがtextやcsvならばExcelに外部データの取り込みで取り込んで
    http://q.hatena.ne.jp/1202290104
    の方法を応用すればいいです。
    ただ、まだ回答はオープンされてませんが。
  • id:freewriter
    ありがとうございます。
    ポイント進呈しますので、同じことを書いて頂いて結構ですよ。

    ただ場合によってデータ件数は65535件を超えることがあり
    そのときの対応もご教示いただけると尚嬉しいです。
  • id:rikuzai
    回答できないのでこちらで失礼。

    >データ件数は65535件を超えることがあり

    1.EXCEL2007を使用する。
    2.ACCESSに取り込んで処理をする。
    3.MySQLなどでの処理を検討する
    辺りになるかと思うのですが。
  • id:SALINGER
    間違ってそのまま回答してしまいました。
    途中の条件式は
    >>
    If (Cells(i, r1.Column).Value = r1.Value And Cells(i, r2.Column).Value = r2.Value) or _
    (Cells(i, r1.Column).Value = r2.Value And Cells(i, r2.Column).Value = r1.Value) Then
    c = c + 1
    End If
    <<
    に修正してください。
  • id:Gay_Yahng
    1.組み合わせは2種類ですか?
    2.組み合わせは同じものが出てきますか? 「3/1 ポテト ポテト」のような
    3.ハンバーガー、ポテトのような項目はいくつですか?
  • id:freewriter
    >SALINGERさん

    ご丁寧にありがとうございます。
    試してみますね。

    >rikuzaiさん

    当座のテストはexcelで行いますが、
    継続的に分析(仕組み化)したいためSQLへの移行も考えています。
    SQLでの出し方があればぜひご指南下さい。

    >Gay_Yahngさん

    2種類以上の組み合わせもあります。
    同じものも出てきます。
    項目は・・数千はありますね。量販店での話なので。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません