掘金 人工智能 05月30日 14:53
某快餐店用户市场数据挖掘与可视化
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文对麦当劳顾客数据进行深度分析,涵盖顾客基础特征、口味偏好、价格敏感性及消费频率预测等方面。通过数据清洗、可视化及机器学习模型,揭示了不同顾客群体的特征,例如年龄与性别分布、光顾频率与年龄的关系,以及顾客对各项产品评价的分布情况。此外,还利用聚类分析对顾客进行画像分类,从而帮助企业更好地了解目标客户,制定精准营销策略。研究结果可为餐饮行业的市场营销和产品优化提供有价值的参考。

📊 顾客基础特征分析:研究显示,顾客年龄分布广泛,性别比例相对均衡。通过可视化分析,清晰展现了年龄和性别在顾客群体中的分布情况,为后续分析奠定基础。

🍔 口味偏好与产品评价:通过分析顾客对“yummy”、“tasty”等口味相关特征的评价,以及“cheap”、“expensive”等价格敏感性指标,揭示了顾客对麦当劳产品的喜好程度和价格接受度。相关性分析还进一步探究了顾客喜好与各项评价之间的关联。

🎯 消费频率预测与顾客画像:利用机器学习模型(如逻辑回归、决策树、随机森林等)预测顾客的消费频率,并通过K-Means聚类算法对顾客进行画像分类。结果显示,不同年龄段的顾客在消费行为和偏好上存在差异,为个性化推荐和服务提供了数据支持。

1、必要库的载入

import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns

2、加载并清洗数据

# 2.1 加载数据df = pd.read_csv('/home/mw/input/survey6263/mcdonalds.csv')# 2.2 数据清洗# 2.2.1 检查缺失值print('缺失值情况:')print(df.isnull().sum())# 2.2.2 处理异常值(年龄范围在18 - 100岁为合理范围)df = df[(df['Age'] >= 18) & (df['Age'] <= 100)]# 查看数据集行数和列数rows, columns = df.shapeif rows < 100 and columns < 20:    # 短表数据(行数少于100且列数少于20)查看全量数据信息    print('数据全部内容信息:')    print(df.to_csv(sep='\t', na_rep='nan'))else:    # 长表数据查看数据前几行信息    print('数据前几行内容信息:')    print(df.head().to_csv(sep='\t', na_rep='nan'))

3、可视化设置

# 3.1 设置图片清晰度plt.rcParams['figure.dpi'] = 300# 3.2 设置中文字体plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei']# 3.3 解决负号显示问题plt.rcParams['axes.unicode_minus'] = False

4、顾客基础特征分析

4.1 顾客年龄分布和性别分布

import matplotlib.pyplot as pltimport seaborn as sns# 年龄分布plt.figure(figsize=(12, 6))plt.subplot(1, 2, 1)sns.histplot(df['Age'], bins=20, kde=False)plt.title('Age distribution')# 性别分布plt.subplot(1, 2, 2)gender_counts = df['Gender'].value_counts()sns.barplot(x=gender_counts.index, y=gender_counts.values)plt.title('Gender distribution')plt.tight_layout()plt.show()print('顾客年龄分布:')print(df['Age'].describe())print('\n顾客性别分布:')print(df['Gender'].value_counts())

4.1.1 年龄分布

4.2 顾客光顾频率与年龄、性别的关系

plt.figure(figsize=(12, 6))plt.subplot(1, 2, 1)sns.boxplot(x='VisitFrequency', y='Age', data=df)plt.title('Frequency VS Age')plt.xticks(rotation=45)plt.subplot(1, 2, 2)sns.countplot(x='VisitFrequency', hue='Gender', data=df)plt.title('Frequency VS Gender')plt.xticks(rotation=45)plt.tight_layout()plt.show()print('光顾频率与年龄的关系:')print(df.groupby('VisitFrequency')['Age'].describe())print('\n光顾频率与性别的关系:')print(pd.crosstab(df['VisitFrequency'], df['Gender']))

4.2.1 光顾频率与年龄的关系

4.3 顾客对某快餐店各方面评价的分布

# 提取评价列evaluation_columns = ['yummy', 'convenient', 'spicy', 'fattening', 'greasy', 'fast', 'cheap', 'tasty', 'expensive', 'healthy', 'disgusting']# 创建画布plt.figure(figsize=(15, 10))# 绘制每个评价的分布柱状图for i, column in enumerate(evaluation_columns):    plt.subplot(3, 4, i + 1)    value_counts = df[column].value_counts()    sns.barplot(x=value_counts.index, y=value_counts.values)    plt.title(f'{column} distribution')plt.tight_layout()plt.show()# 查看每个评价的分布情况for column in evaluation_columns:    print(f'{column}评价分布:')    print(df[column].value_counts())

4.4 顾客喜好与各评价之间的相关性

import re# 使用正则表达式提取 Like 列中的数字部分并转换为数值型df['Like'] = df['Like'].apply(lambda x: int(re.findall(r'\d+', x)[0]))# 将评价列进行编码for column in evaluation_columns:    df[column] = df[column].map({'Yes': 1, 'No': 0})# 计算相关系数矩阵correlation_matrix = df[evaluation_columns + ['Like']].corr()# 绘制热力图plt.figure(figsize=(10, 8))sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1)plt.title('Customer preferences VS Reviews')plt.show()print('顾客喜好与各评价之间的相关系数矩阵:')print(correlation_matrix.round(2))

5、顾客口味偏好分析

import matplotlib.pyplot as plt# 统计口味相关特征的分布(选取 spicy, yummy, tasty, greasy 作为口味相关特征)taste_features = ['spicy', 'yummy', 'tasty', 'greasy']fig, axes = plt.subplots(2, 2, figsize=(12, 8))axes = axes.ravel()for i, feature in enumerate(taste_features):    value_counts = df[feature].value_counts()    axes[i].pie(value_counts, labels=value_counts.index, autopct='%1.1f%%', startangle=90)    axes[i].set_title(f'{feature} distribution')plt.tight_layout()plt.show()# 查看具体比例for feature in taste_features:    print(df[feature].value_counts(normalize=True))

6、价格敏感性分析

# 统计认为便宜和昂贵的比例cheap_counts = df['cheap'].value_counts(normalize=True)expensive_counts = df['expensive'].value_counts(normalize=True)# 绘制柱状图fig, axes = plt.subplots(1, 2, figsize=(10, 5))axes[0].bar(cheap_counts.index, cheap_counts)axes[0].set_title('Thinking cheap')axes[0].set_xlabel('cheap or not')axes[0].set_ylabel('scale')axes[1].bar(expensive_counts.index, expensive_counts)axes[1].set_title('Thinking expensive')axes[1].set_xlabel('expensive or not')axes[1].set_ylabel('scale')plt.tight_layout()plt.show()print("认为便宜的比例:")print(cheap_counts)print("认为昂贵的比例:")print(expensive_counts)

7、消费频率预测

from sklearn.preprocessing import LabelEncoderfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import accuracy_score# 对 object 类型数据进行编码label_encoders = {}for column in df.columns:    if df[column].dtype == 'object':        le = LabelEncoder()        df[column] = le.fit_transform(df[column])        label_encoders[column] = le# 准备特征和目标变量X = df.drop(['VisitFrequency', 'Index'], axis=1)y = df['VisitFrequency']# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)from sklearn.linear_model import LogisticRegressionfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.svm import SVCfrom sklearn.metrics import accuracy_score, classification_report# 定义不同的模型models = {    'Logistic Regression': LogisticRegression(max_iter=1000),    'Decision Tree': DecisionTreeClassifier(),    'Random Forest': RandomForestClassifier(),    'Support Vector Machine': SVC()}# 训练和评估每个模型for name, model in models.items():    model.fit(X_train, y_train)    y_pred = model.predict(X_test)    accuracy = accuracy_score(y_test, y_pred)    print(f'{name} 准确率: {accuracy:.4f}')    print(f'{name} 分类报告:\n', classification_report(y_test, y_pred))    print('-' * 50)

8、顾客画像分类

8.1 确定最佳簇数

from sklearn.cluster import KMeansfrom sklearn.metrics import silhouette_score# 尝试不同的簇数silhouette_scores = []for k in range(2, 11):    kmeans = KMeans(n_clusters=k, random_state=42)    kmeans.fit(X)    labels = kmeans.labels_    score = silhouette_score(X, labels)    silhouette_scores.append((k, score))# 找到最高轮廓系数对应的簇数best_k, _ = max(silhouette_scores, key=lambda x: x[1])print(f'最佳簇数: {best_k}')

8.2 不同簇的特征分析

# 使用最佳簇数进行 KMeans 聚类kmeans = KMeans(n_clusters=best_k, random_state=42)df['Cluster'] = kmeans.fit_predict(X)# 分析不同簇的特征(以年龄和喜欢程度为例)cluster_analysis = df.groupby('Cluster').agg({    'Age': 'mean',    'Like': 'mean'}).reset_index()print(cluster_analysis)

从年龄均值来看,簇 0 的顾客相对年轻,平均年龄约为 31 岁,而簇 1 的顾客平均年龄约为 56 岁,两者存在明显的年龄差异。在喜欢程度方面,两个簇的均值都比较高且较为接近,不过簇 1 的喜欢程度均值略高于簇 0,这可能暗示年龄较大的顾客对相关事物的喜欢程度稍高一些,但差异并不是非常显著。

8.3 不同簇的年龄和喜欢程度分布可视化

# 绘制不同簇的年龄和喜欢程度分布plt.scatter(df['Age'], df['Like'], c=df['Cluster'])plt.xlabel('Age')plt.xticks(rotation=45)plt.ylabel('Liking degree')plt.title('Age VS liking of different clusters')plt.show()

# 若需要完整数据集以及代码 # https://mbd.pub/o/bread/mbd-aJaUlJpt

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

顾客画像 数据分析 餐饮营销
相关文章