用數據分析搭配肯德基早餐

今天看到一個好玩的數據分析小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份。<br>有雞腿中式全餐:新奧爾良烤雞腿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()函數使用方法,有些方法廢棄了,使用的時候要多加註意。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章