【Rubyでぶっこ抜き】クックパッドから学ぶ、自炊をするなら絶対に買っておきたい食材はこれだ!
私事ですが、来週引っ越しをします。それに伴って今まで冷蔵庫に入っていた食材や調味料等を全て捨てました。
元々自炊などせずほとんどをコンビ二に頼っていたわけですが、冷蔵庫が綺麗になったいまこそ心を入れ替えて自炊をすべきではないかと思うのです。
しかしながら、いざ自炊をしようと思い立っても何を買ったらいいのかわからない。野菜、肉、魚・・・スーパーにはたくさんの種類の食材があります。
悩んだあげくとりあえずクックパッドへ行き、レシピを眺めていたのですがこれまたレシピ数が多すぎてどれにしようか迷ってしまいます。
そうこうしているうちに時間は過ぎていき、気づくとまたコンビ二でお弁当を買っているのです。
では、華々しい自炊生活をスタートさせるためには何が必要か?
それは、マストアイテムを揃えることです。例えばsmartなどの大学生向けファッション雑誌を見てみるとわかるのですが、大体初心者は着回しのきくシャツやらズボンといったマストアイテムを揃えよと書いてあります。
おそらく料理も同じで初心者は着回しならぬ作り回しがきく食材を集めることが大切なのだと思います。
というわけで、今回はクックパッドさんの”今日の献立”カテゴリーから約1000品の料理を対象に各料理で使われている食材を調べ、その中でよく使われている料理の「マストアイテム」を見つけ出します。
~分析方法~
流れとしては以下の通り。
(1)クックパッドの今日の献立カテゴリから約1000品のレシピを自動抽出
(2)各レシピから使われている材料を抽出
(3)抽出した材料をランキング付け
(4)誤差を修正し、上位50位まで決定
また、分析にはクックパッドさんに敬意を表して”Ruby”を使いました。クックパッドさんありがとうです。
こちらがそのソースです。
問題はいくつかあってその1つが調査対象についてです。今日の献立カテゴリーは4630ページ(8月18日現在)あって各ページに10品ずつ表示されています。しかしこの表示アルゴリズムのせいなのか、旬の食材を使った料理ばかりが若いページにでてきてしまい1ページ目から1品ずつ見ていくとなすやきゅうりやトマトが異常な伸びをみせます。
なので、なすバイアスやトマトバイアスを減らすために1ページ目から50ページ毎に調べていくことにしました。
また、一応分析時間も計測してみました。
最初はただループで一品ずつ調べていたので20分もかかりましたが、
Parallelを使って並列に処理したら約40%も速くなりました。
Parallelさんイケメンですね。(参考:Rubyで並列実行処理を簡単に書く)
#-*- coding: utf-8 -*- require "open-uri" require "parallel" require "benchmark" #クックパッドの「今日の献立」から4630ページ中50ページ毎・約1000品を調査対象とする puts Benchmark.realtime { urls = [] 1.step(4630,50) {|pg| source = "http://cookpad.com/category/177?page=#{pg}" html = open(source).read rescue next matches = html.scan(/<a href="(.+)" class="recipe-title font13" id=".+">.+<\/a>\s*/) matches.each {|match|urls << match[0]} } puts "全#{urls.count}品" #ベンチマークをとる、レシピの抽出、並列処理で高速化 result = [] loop do break unless urls.count > 0 Parallel.each(urls,:in_threads=>5){|url| begin html = open(url).read matches = html.scan(/<div class='ingredient_name'>\s+(.+)\s+<\/div>/) matches.each {|match| result << match[0] } rescue puts "#{url}...falture" end urls.reject!{|x| x == url} } puts "残り...#{urls.count}品" end #抽出したレシピを降順で並べ替え、登場回数が10回以下の食材は無視 ranks = {} result.uniq.each do |r| next if result.grep(r).count < 10 ranks[r] = result.grep(r).count end #ランキング rn = 1 ranks.sort_by{|k, v| -v}.each do |rank| puts "#{rn}位 #{rank.join('...')}回" rn +=1 end }
そして結果はこちら。
前述の通り上位50位までの結果です。
また酒、●酒、☆酒などは別の食材としてカウントされていたので修正しています。しお、塩も同じなので修正してます。
全930品 残り...463品 残り...229品 残り...112品 残り...54品 残り...25品 残り...10品 残り...3品 残り...0品 1位 塩...199回 2位 醤油...192回 3位 玉ねぎ...168回 4位 砂糖...127回 5位 水...114回 6位 ごま油...117回 7位 にんにく...103回 8位 人参...102回 9位 酒...99回 10位 塩コショウ...85回 11位 サラダ油...80回 12位 オリーブオイル...80回 13位 卵...78回 14位 バター...73回 15位 片栗粉...73回 16位 みりん...70回 17位 ご飯...64回 18位 コショウ...62回 19位 マヨネーズ...48回 20位 小麦粉...45回 21位 ベーコン...43回 22位 牛乳...42回 23位 キャベツ...42回 24位 トマト...42回 25位 じゃがいも...39回 26位 大根...37回 27位 酢...37回 28位 きゅうり...35回 29位 ピーマン...31回 30位 しょうが...31回 31位 鶏もも肉...26回 32位 大葉...26回 33位 しめじ...25回 34位 もやし...24回 35位 長ネギ...24回 36位 味噌...23回 37位 パン粉...23回 38位 ごぼう...23回 39位 レモン汁...22回 40位 コンソメ...20回 41位 なす...20回 42位 パスタ...19回 43位 生姜...19回 44位 生クリーム...18回 45位 豆腐...18回 46位 ニラ...18回 47位 だし汁...18回 48位 エリンギ...18回 49位 白菜...17回 (50位以下は省略) 759.0959982872009
~結果について考察~
なんと10位中8位は調味料です。調味料はどの食材にも須く使われるので当然ですね。
そんな調味料激戦地帯において3位にランクインしている玉ねぎと8位にランクインしているにんじんは大健闘です。
7位のにんにくは見方によっては調味料の一種ですが、玉ねぎ・にんじんはまぎれもなく食材。玉ねぎ・にんじんは間違いなく「マストアイテム」です。
また、調味料や薬味を除いて食材だけでみると、上から
たまねぎ・にんじん・卵・ベーコン・キャベツ・トマト・じゃがいも・大根・きゅうり・ご飯・ピーマン・鶏もも肉・しめじ・もやし・長ネギ・ごぼう・なす・パスタ・豆腐・にら・エリンギ・白菜
となります。
こう並べてみると野菜、お肉、卵などなかなかバランスが良いですね。やっぱりなす、トマト、きゅうりバイアスからは逃れられなかったですが栄養的にみたらこれらの食材はアリかなと思います。
これから一人暮らしをはじめる人や自炊に挑戦したいと思っている人はこれを参考にチャレンジしてみてはいかがですか?