背景问题
自1955年在美国创立以来,麦当劳已发展成为全球快餐业的标志性品牌,其黄金拱门标志几乎遍布世界各地。随着市场环境的变化和技术的发展,麦当劳不断调整其市场营销策略,以适应不同地区消费者的需求和全球健康饮食趋势的变迁。近年来,数字化转型成为麦当劳战略的核心,包括线上点餐的使用、数字化营销的加大投入、以及顾客体验的优化,这一切都旨在提升品牌竞争力并深化与顾客的情感联系。
本数据集提供了针对麦当劳消费用户的市场调研信息,可以用于深入了解顾客偏好、评估产品与服务质量、优化价格策略、精确定位营销活动以及响应健康饮食趋势,从而帮助麦当劳制定更加精准的市场策略,提升顾客满意度和品牌竞争力。
数据说明
问题描述
顾客口味偏好分析
价格敏感度分析
整体喜好分析
顾客画像分类
数据清洗及预览
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import re
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_csv(r'D:\pythonbag\Datas\mcdonalds.csv',index_col = 0)
print('-'*50)
display(df.head())
print('数据集大小:\n',df.shape)
print('-'*50)
print('数据集存在重复值个数:\n',df.duplicated().sum())
print('-'*50)
print('数据集存在缺失值个数:\n',df.isna().sum())
print('-'*50)
print('数据集信息:')
print(df.info())
由于我把原始数据集的index设置为索引列,所以才会有22条重复记录,考虑到可能存在一些少数客户爱好口味等一模一样的情况,因此不用进行处理。
接下来查看Like和VisitFrequency的唯一值。
for i in ['Like','VisitFrequency']:
print(df[i].unique())
# 使用正则方法提取Like列的正负数
def extract_number(x):
# [-+]表示可以是+或-,?表示前面字符可以出现0次或1次,\d+表示一个或多个数字
match = re.search(r'[-+]?\d+',str(x))
if match:
return int(match.group())
else:
return np.nan
df['Like'] = df['Like'].apply(extract_number)
print('数据集描述性统计:')
display(df.describe(include='all'))
把yes和no替换为True和False,方便后面分析
if_list=['yummy','convenient','spicy','fattening','greasy','fast','cheap','tasty','expensive','healthy','disgusting']
df[if_list] = df[if_list].replace({'Yes':True,'No':False})
df.head()
统计每个特征的唯一值的人数
mean_list = ['yummy','convenient','spicy','fattening','greasy','fast','cheap','tasty','expensive','healthy','disgusting']
feature_groupby = {}
for col in mean_list:
feature_groupby[col] = df.groupby(col)["Gender"].count()
feature_df = pd.DataFrame(data=feature_groupby)
display(feature_df)
for feature in ['VisitFrequency','Gender']:
visit_groupby = df.groupby(feature)['Gender'].count().reset_index(name='count')
visit_df = pd.DataFrame(data=visit_groupby)
display(visit_df)
探索性数据分析
顾客口味偏好分析
count_list = ['yummy','spicy','greasy','tasty','disgusting','VisitFrequency']
df['Age_Q'] = pd.cut(df['Age'],bins=[18,25,40,60],labels=['18-24岁青年','25-39岁成年','40-59岁中年'])
for target in ['Gender','Age_Q']:
fig = plt.figure(figsize=(20, 30))
for i,feature in enumerate(count_list,1):
# .size()和.count()的区别:
taste_groupby = df.groupby([feature,target]).size().reset_index(name='Count')
ax = fig.add_subplot(4,3,i)
sns.barplot(data=taste_groupby,x=feature,y='Count',hue=target,ax=ax)
plt.xticks(rotation=12,fontsize=12)
plt.title(feature+'下的'+target+'人数分布情况',fontsize=16)
plt.xlabel(feature,fontsize=14)
plt.ylabel('Count',fontsize=14)
for patch in ax.patches:
x_loc = patch.get_x()+patch.get_width()/2
y_loc = round(patch.get_height())
ax.text(x_loc,y_loc,y_loc,ha='center',va='bottom',fontsize=12)
plt.tight_layout()
plt.show()
小结:
-
Yummy美味:
超过一半的顾客认为麦当劳食物美味,其中女性人数略高于男性人数,25-39岁成年人数最高,其次是40-59岁中年,最后是18-24岁青年。 -
Spicy辣:
大多数顾客不认为麦当劳食物辣,其中女性人数略高于男性人数,中年人数最高,其次是成年,最后是青年。 -
greasy油腻:
超过一半的顾客认为麦当劳食物油腻,其中女性人数略高于男性人数,中年人数最高,其次是成年,最后是青年。 -
tasty可口:
超出一半的顾客认为麦当劳食物可口,其中女性人数略高于男性人数,中年人数最高,其次是成年,最后是青年。 -
disgusting厌恶:
大多数顾客不认为麦当劳食物令人厌恶,其中男性人数略高于女性人数,中年人数最高,其次是成年,最后是青年。 -
visitFrequency光顾频率:
Every three months、Once a month、Once a year:
大多数顾客光顾麦当劳的频率处于低下,说明他们比较注重健康问题,其中男性人数略高于女性人数,中年人数最高,其次是成年,最后是青年。
More than once a week、never、once a week:
部分顾客每周至少吃一次,也有的顾客从不吃,其中男新人数和女性人数基本持平。其中More than once a week频率,各类年龄群体人数基本持平,never频率,中年人数最高,其次是成年,最后是青年,Once a year频率成年人数最高,其次是中年人,最后是青年。青年,Once a year频率成年人数最高,其次是中年人,最后是青年。
价格敏感度分析
for target in ['Gender','Age_Q']:
fig = plt.figure(figsize=(8,10))
for i,feature in enumerate(['cheap','expensive'],1):
price_groupby = df.groupby([feature,target]).size().reset_index(name='Count')
ax = fig.add_subplot(2,2,i)
sns.barplot(data=price_groupby,x=feature,y='Count',hue=target,ax=ax)
plt.title(feature+'下的'+target+'人数分布情况',fontsize=12)
plt.xlabel(feature,fontsize=10)
plt.ylabel('Count',fontsize=10)
for patch in ax.patches:
x_loc = patch.get_x()+patch.get_width()/2
y_loc = round(patch.get_height())
ax.text(x_loc,y_loc,y_loc,ha='center',va='bottom')
plt.show()
小结:
-
cheap便宜:
超过一半的顾客认为麦当劳便宜,其中女性人数略高于男性人数,中年人数最高,其次是成年,最后是青年。 -
expensive昂贵:
超出一半的顾客不认为麦当劳食物昂贵,其中男性人数略高于女性人数,中年人数最高,其次是成年,最后是青年。
整体喜好分析
box_list = ['Gender','Age_Q','yummy','convenient','spicy','fattening','greasy','fast','cheap','tasty','expensive','healthy','disgusting','VisitFrequency']
fig = plt.figure(figsize=(20,20))
for i,target in enumerate(box_list,1):
if i != 14:
ax = fig.add_subplot(4,4,i)
else:
ax = fig.add_subplot(4,4,(14,16))
sns.boxplot(data=df,x=target,y='Like',ax=ax,width=0.4)
plt.title(target+'下的Like箱线图分布',fontsize=12)
plt.tight_layout()
plt.show()
小结:
- Gender:
女性对麦当劳的喜好评分略高于男性的,女性的评分中位数约为2分,而男性的评分中位数约为1分。 - Age_Q: 评分中位数最高的是18-24岁青年,约为3分,其次是25-39岁成年,约为2分;最后是40-59岁中年,约为1.5分,可能麦当劳口味对于40-59岁中年而言有些不太习惯,但是他们还是会光顾的。
- yummy:
认为美味的顾客对麦当劳评分高于不认为美味的顾客的。 - convenient:
认为方便的顾客对麦当劳评分高于不认为方便的顾客的。 - spicy:
认为辣的顾客对麦当劳评分略高于不认为辣的顾客的。 - fattening:
认为发胖的顾客对麦当劳评分略低于不认为发胖的顾客的。 - gressy:
认为油腻的顾客对麦当劳评分略低于不认为油腻的顾客的。 - fast:
认为快速的顾客对麦当劳评分略高于不认为快速的顾客的。 - cheap:
认为便宜的顾客对麦当劳评分略高于不认为便宜的顾客的。 - expensive:
认为昂贵的顾客对麦当劳评分略低于不认为昂贵的顾客的。 - tasty:
认为可口的顾客对麦当劳评分高于不认为可口的顾客的。 - healthy:
认为健康的顾客对麦当劳评分略高于不认健康宜的顾客的。 - disgusting:
认为厌恶的顾客对麦当劳评分低于不认为厌恶的顾客的。 - VistFrequency: more than once a week和once a week的顾客评分高于其他频率的,不频繁光顾或者从不光顾的例如once a year和never的顾客评分要低很多。
综上所述:
麦当劳在年龄群体中最受青少年顾客的青睐,对成年乃至中年顾客而言可能觉得麦当劳很方便,但口味是其次的;食物口味(除辣味以外)对顾客的喜好评分有显著影响;性别、健康与方便问题则可能有一定的影响但不大,而价格似乎没有显著影响。另外,光顾频率越高就可能会提高顾客对麦当劳的评分。