某快餐店用户市场数据挖掘与可视化

1、必要库的载入

import pandas as pd
import matplotlib.pyplot as plt
import 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 plt
import 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 LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from 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 LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from 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 KMeans
from 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35302.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 衍生表(Derived Tables)

在SQL的查询语句select …. from …中&#xff0c;跟在from子句后面的通常是一张拥有定义的实体表&#xff0c;而有的时候我们会用子查询来扮演实体表的角色&#xff0c;这个在from子句中的子查询会返回一个结果集&#xff0c;这个结果集可以像普通的实体表一样查询、连接&…

Electron使用WebAssembly实现CRC-16 MAXIM校验

Electron使用WebAssembly实现CRC-16 MAXIM校验 将C/C语言代码&#xff0c;经由WebAssembly编译为库函数&#xff0c;可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-16 MAXIM格式校验的方式。 CRC-16 MAXIM校验函数WebAssembly源文件 C语言实…

HTB 学习笔记 【中/英】《前端 vs. 后端》P3

&#x1f4cc; 这篇文章讲了什么&#xff1f; 介绍了 前端&#xff08;客户端&#xff09; 和 后端&#xff08;服务器端&#xff09; 的区别。解释了 全栈开发&#xff08;Full Stack Development&#xff09;&#xff0c;即前端后端开发。介绍了 前端和后端常用的技术。讨论…

SpringBoot集成ElasticSearch实现支持错别字检索和关键字高亮的模糊查询

文章目录 一、背景二、环境准备1.es8集群2.Kibana3.Canal 三、集成到SpringBoot1.新增依赖2.es配置类3.建立索引4.修改查询方法 四、修改前端 一、背景 我们在开发项目的搜索引擎的时候&#xff0c;如果当数据量庞大、同时又需要支持全文检索模糊查询&#xff0c;甚至你想做到…

麒麟系统使用-安装 SQL Developer

文章目录 前言一、基础准备1.基本环境2.相关包下载 二、进行相关配置1.配置JAVA2.配置SQL Developer 总结 前言 作为我国自主研发的操作系统&#xff0c;麒麟系统在使用时需要考虑安装相应的app。尽管麒麟系统是基于linux开发&#xff0c;可由于版本的一些差异&#xff0c;麒麟…

PrimeTime:timing_report_unconstrained_paths变量

相关阅读 PrimeTimehttps://blog.csdn.net/weixin_45791458/category_12900271.html?spm1001.2014.3001.5482 PrimeTime自Q-2019.12版本起引入了timing_report_unconstrained_paths变量&#xff08;默认值为false&#xff09;&#xff0c;该变量控制是否在使用report_timing命…

洛谷 P1115 最大子段和(前缀和详解)c++

题目链接&#xff1a;P1115 最大子段和 - 洛谷 1.题目分析 2.算法原理 解法&#xff1a;利用前缀和 思考&#xff1a;如何求出以a[i]为结尾的所有子区间中最大的子段和 假设 i 等于5&#xff0c;以 a[ i ] 为结尾的区间一共是五段&#xff08;黑色线条部分&#xff09;&#…

JetBrains(全家桶: IDEA、WebStorm、GoLand、PyCharm) 2024.3+ 2025 版免费体验方案

JetBrains&#xff08;全家桶: IDEA、WebStorm、GoLand、PyCharm&#xff09; 2024.3 2025 版免费体验方案 前言 JetBrains IDE 是许多开发者的主力工具&#xff0c;但从 2024.02 版本起&#xff0c;JetBrains 调整了试用政策&#xff0c;新用户不再享有默认的 30 天免费试用…

【数据分析】数据筛选与访问行列元素3

访问元素 .loc属性可以通过传入index的值访问行数据。 .loc属性允许传入两个参数&#xff0c;分别是index的值和columns的值&#xff0c;参数间用“逗号”隔开&#xff0c;这样便可以访问数据中的元素。 1. 访问单个元素 访问单个元素比较简单&#xff0c;只需要通过它的in…

C++ std::list超详细指南:基础实践(手搓list)

目录 一.核心特性 1.双向循环链表结构 2.头文件&#xff1a;#include 3.时间复杂度 4.内存特性 二.构造函数 三.list iterator的使用 1.学习list iterator之前我们要知道iterator的区分 ​编辑 2.begin()end() 3.rbegin()rend() 四.list关键接口 1.empty() 2. size…

【免费】2004-2017年各地级市进出口总额数据

2004-2017年各地级市进出口总额数据 1、时间&#xff1a;2004-2017年 2、来源&#xff1a;城市年鉴 3、指标&#xff1a;进出口贸易总额 4、范围&#xff1a;286个地级市 5、指标说明&#xff1a;进出口总额是指一个国家在特定时期内&#xff08;通常为一年&#xff09;所…

谈谈 undefined 和 null

*** 补充 null 和 ‘’

【第15届蓝桥杯】软件赛CB组省赛

个人主页&#xff1a;Guiat 归属专栏&#xff1a;算法竞赛真题题解 文章目录 A. 握手问题&#xff08;填空题&#xff09;B. 小球反弹&#xff08;填空题&#xff09;C. 好数D. R格式E. 宝石组合F. 数字接龙G. 爬山H. 拔河 正文 总共8道题。 A. 握手问题&#xff08;填空题&…

【计算机视觉】工业表计读数(2)--表计检测

1. 简介 工业表计&#xff08;如压力表、电表、气表等&#xff09;在工控系统、能源管理等领域具有重要应用。然而&#xff0c;传统人工抄表不仅工作量大、效率低&#xff0c;而且容易产生数据误差。近年来&#xff0c;基于深度学习的目标检测方法在工业检测中展现出极大优势&…

提示词工程(Prompt Engineering)

https://www.bilibili.com/video/BV1PX9iYQEry 一、懂原理&#xff0c;要知道 为什么有的指令有效&#xff0c;有的指令无效为什么同样的指令有时有效&#xff0c;又是无效怎么提升指令有效的概率 大模型应用架构师想什么&#xff1f; 怎样能更准确&#xff1f;答&#xff1…

从Instagram到画廊:社交平台如何改变艺术家的展示方式

从Instagram到画廊&#xff1a;社交平台如何改变艺术家的展示方式 在数字时代&#xff0c;艺术家的展示方式正在经历一场革命。社交平台&#xff0c;尤其是Instagram&#xff0c;已经成为艺术家展示作品、与观众互动和建立品牌的重要渠道。本文将探讨社交平台如何改变艺术家的…

Typora 使用教程(标题,段落,字体,列表,区块,代码,脚注,插入图片,表格,目录)

标题 一个#是一级标题, 2个#是二级标题, 以此类推, 最多可达六级标题 示例 输入#号和标题后回车即可 注意: #和标题内容之间需要存在空格(一个或多个均可), 没有空格就会变成普通文字 标题快捷键 Ctrl数字 1-6 可以快速调成对应级别的标题 (选中文本/把光标放在标题上再按…

关于deepseek R1模型分布式推理效率分析

1、引言 DeepSeek R1 采用了混合专家&#xff08;Mixture of Experts&#xff0c;MoE&#xff09;架构&#xff0c;包含多个专家子网络&#xff0c;并通过一个门控机制动态地激活最相关的专家来处理特定的任务 。DeepSeek R1 总共有 6710 亿个参数&#xff0c;但在每个前向传播…

力扣hot100二刷——二叉树

第二次刷题不在idea写代码&#xff0c;而是直接在leetcode网站上写&#xff0c;“逼”自己掌握常用的函数。 标志掌握程度解释办法⭐Fully 完全掌握看到题目就有思路&#xff0c;编程也很流利⭐⭐Basically 基本掌握需要稍作思考&#xff0c;或者看到提示方法后能解答⭐⭐⭐Sl…

网络安全 --- 基于网络安全的 Linux 最敏感目录及文件利用指南

目录 基于网络安全的 Linux 最敏感目录及文件利用指南 Linux 中最敏感的目录及文件 1. /etc 2. /root 3. /var/log 4. /proc 5. /tmp 6. /home 7. /boot 8. /dev 如何利用这些敏感文件 你可能没想到的知识点 总结 Linux 中最敏感的目录及文件 1. /etc 存放内容&a…