読者です 読者をやめる 読者になる 読者になる

【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位のにんにくは見方によっては調味料の一種ですが、玉ねぎ・にんじんはまぎれもなく食材。玉ねぎ・にんじんは間違いなく「マストアイテム」です。

また、調味料や薬味を除いて食材だけでみると、上から

たまねぎ・にんじん・卵・ベーコン・キャベツ・トマト・じゃがいも・大根・きゅうり・ご飯・ピーマン・鶏もも肉・しめじ・もやし・長ネギ・ごぼう・なす・パスタ・豆腐・にら・エリンギ・白菜

となります。

こう並べてみると野菜、お肉、卵などなかなかバランスが良いですね。やっぱりなす、トマト、きゅうりバイアスからは逃れられなかったですが栄養的にみたらこれらの食材はアリかなと思います。

これから一人暮らしをはじめる人や自炊に挑戦したいと思っている人はこれを参考にチャレンジしてみてはいかがですか?