今天看到一个好玩的数据分析小case,通过对KFC的早餐爬取部分数据,并做简单处理,查看肯定早餐搭配
原数据集及初始代码网址如下:https://www.kesci.com/home/project/5ecf10d0162df90036dd6bc9/code。
首先读取数据
#数据导入,探查数据缺失
data = pd.read_csv(r'D:\ML_data\kfca8585\kfc.csv')
data.head()
查看数据
0 1元安心大油条 产品实付满49元(不含外送费),可1元换购安心大油条1根,每单限1份 1.0 https://img.4008823823.com.cn/kfcios/Version/7...
1 1元芝士鸡肉帕尼尼 产品实付满69元(不含外送费),可1元换购芝士鸡肉帕尼尼1份,每单限1份 1.0 https://img.4008823823.com.cn/kfcios/Version/7...
2 有鸡腿全餐双人餐 套餐包含:有鸡腿中式/西式全餐(可选),共2份。
有鸡腿中式全餐:新奥尔良烤鸡腿1份+... 0.0 https://img.4008823823.com.cn/kfcios/Version/7...
3 有鸡腿西式全餐(香草流心可颂) 新奥尔良烤鸡腿1块+培根炒蛋1份+香脆薯饼1块+大溪地香草奶香流心可颂2只+咖啡饮品1杯(可... 29.0 https://img.4008823823.com.cn/kfcios/Version/7...
4 有鸡腿西式全餐(香草流心可颂) 新奥尔良烤鸡腿1块+太阳蛋+香脆薯饼1块+大溪地香草奶香流心可颂2只+咖啡饮品1杯(可加价换... 29.0 https://img.4008823823.com.cn/kfcios/Version/7...
查看一下数据情况。单价有0元,有可能是套餐搭配,也有可能数据爬取出错
data.describe()
price
count 90.000000
mean 13.872222
std 7.257914
min 0.000000
25% 9.000000
50% 13.500000
75% 17.000000
max 36.000000
对价格进行处理,使用平均值进行填充
#价格有0的数据,暂时用平均值进行填充
def f(p):
if p==0.0:
p=14
return p
else:
return p
data['price'] = data['price'].map(f)
利用结巴拼接食物和餐名,并把一些无关食物替换掉
#食物内容和餐名
names = list(data['name'])
foods = list(data['foods'])
names.extend(foods)
names = ' '.join(names)
#分词
ls = jieba.lcut(names)
txt = ' '.join(ls)
#空格替换与食物无关的词语
txt = txt.replace('产品','').replace('包装','').replace('包装实物','')\
.replace('br','').replace('随心换','').replace('实物','')\
.replace('主要','').replace('原料','').replace('指比菜','')\
.replace('单单','').replace('加价','').replace('换购','')\
.replace('总价','').replace('金额','').replace('为准','')\
.replace('早餐','').replace('饮品','')
查看主食应用分布情况,并可视化
hamburger = {
'热量' : 250,
'脂肪' : 10,
'碳水化合物' : 20,
'蛋白质' : 10
}
rice_ball = {
'热量' : 200,
'脂肪' : 11,
'碳水化合物' : 21,
'蛋白质' : 6
}
porridge = {
'热量' : 50,
'脂肪' : 1.5,
'碳水化合物' : 8,
'蛋白质' : 2.5
}
chicken = {
'热量' : 255,
'脂肪' : 15,
'碳水化合物' : 10,
'蛋白质' : 21
}
x = ['汉堡','饭团','粥','鸡肉']
y1 = [250,200,50,255]
y2 = [10,11,1.5,15]
y3 = [20,21,8,10]
y4 = [10,6,2.5,21]
c = Bar()
c.add_xaxis(x)
c.add_yaxis("热量", y1, stack="stack1")
c.add_yaxis("脂肪", y2, stack="stack1")
c.add_yaxis("碳水化合物", y3, stack="stack1")
c.add_yaxis("蛋白质", y4, stack="stack1")
c.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
c.set_global_opts(title_opts=opts.TitleOpts(title="主食营养分布"))
#c.render_notebook()
c.render_notebook()
小吃营养分布
youtiao = {
'热量' : 388,
'脂肪' : 18,
'碳水化合物' : 51,
'蛋白质' : 7
}
chayedan = {
'热量' : 151,
'脂肪' : 6,
'碳水化合物' : 12,
'蛋白质' : 11
}
shubin = {
'热量' : 327,
'脂肪' : 22,
'碳水化合物' : 32,
'蛋白质' : 3
}
danta = {
'热量' : 255,
'脂肪' : 22,
'碳水化合物' : 38,
'蛋白质' : 7
}
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType
list2 = [
{"value": 388, "percent": 388 / (388 + 18 + 51 + 7)},
{"value": 151, "percent": 151 / (151 + 6 + 12 + 11)},
{"value": 327, "percent": 327 / (327 + 22 + 32 + 3)},
{"value": 255, "percent": 255 / (22 + 38 + + 7 + 255)},
]
list3 = [
{"value": 18, "percent": 18 / (388 + 18 + 51 + 7)},
{"value": 6, "percent": 6 / (151 + 6 + 12 + 11)},
{"value": 22, "percent": 22 / (327 + 22 + 32 + 3)},
{"value": 22, "percent": 22 / (22 + 38 + 7 + 255)},
]
list4 = [
{"value": 51, "percent": 51 / (388 + 18 + 51 + 7)},
{"value": 12, "percent": 12 / (151 + 6 + 12 + 11)},
{"value": 32, "percent": 32 / (327 + 22 + 32 + 3)},
{"value": 38, "percent": 38 / (22 + 38 + 7 + 255)},
]
list5 = [
{"value": 7, "percent": 7 / (388 + 18 + 51 + 7)},
{"value": 11, "percent": 11 / (151 + 6 + 12 + 11)},
{"value": 3, "percent": 3 / (327 + 22 + 32 + 3)},
{"value": 7, "percent": 7 / (22 + 38 + 7 + 255)},
]
c = Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
c.add_xaxis(['油条','茶叶蛋','薯饼','蛋挞'])
c.add_yaxis("热量", list2, stack="stack1", category_gap="50%")
c.add_yaxis("脂肪", list3, stack="stack1", category_gap="50%")
c.add_yaxis("碳水化合物", list4, stack="stack1", category_gap="50%")
c.add_yaxis("蛋白质", list5, stack="stack1", category_gap="50%")
c.set_series_opts(
label_opts=opts.LabelOpts(
position="right",
formatter=JsCode(
"function(x){return Number(x.data.percent * 100).toFixed() + '%';}"
),
)
)
c.render_notebook()
饮料分析
doujiang = {
'热量' : 31,
'脂肪' : 2,
'碳水化合物' : 1.5,
'蛋白质' : 3
}
coffe = {
'热量' : 100,
'脂肪' : 4,
'碳水化合物' : 12,
'蛋白质' : 4
}
from pyecharts import options as opts
from pyecharts.charts import Pie
c = Pie()
c.add(
"",
[list(z) for z in zip(["热量", "脂肪",'碳水化合物','蛋白质'],
[31,2,1.5, 3])],
center=["20%", "50%"],
radius=[60, 80],
)
c.add(
"",
[list(z) for z in zip(["热量", "脂肪",'碳水化合物','蛋白质'],
[100,4,12, 4])],
center=["55%", "50%"],
radius=[60, 80],
)
c.set_global_opts(
title_opts=opts.TitleOpts(title="豆浆(左)咖啡(右)"),
legend_opts=opts.LegendOpts(
type_="scroll", pos_top="200%", pos_left="80%", orient="vertical"
),
)
c.render_notebook()
从和鲸社区看到这个小case觉得很有意思,自己试了一下,遇到的主要问题是数据量小,不过肯德基早餐种类本身就不是很多。pyecharts画图很好看,但是有些包更新了,可能会有问题,需要找最新的包,比如bar()函数使用方法,有些方法废弃了,使用的时候要多加注意。