2024 年(第 7 届)“泰迪杯”数据分析技能赛B题 特殊医学用途配方食品数据分析 完整代码 结果 可视化分享
1. 引言
随着社会对特殊医学用途配方食品(以下简称“特医食品”)的认知和需求不断增加,如何通过数据分析技术深入理解市场动态、消费者需求、产品效用及其与健康的关系成为了一个重要课题。2024年(第7届)“泰迪杯”数据分析技能赛B题要求参赛者基于提供的特医食品数据进行分析,并通过代码、结果和可视化手段展示相关见解。
本篇文章旨在详细阐述如何使用Python进行特医食品数据分析,从数据预处理、特征工程到模型建立、结果评估等方面进行全方位的展示。通过这一过程,不仅帮助大家了解数据科学在健康食品领域的应用,也为未来的相关研究提供一定的参考。
2. 数据概述
本次赛题所提供的数据包括多个与特殊医学用途配方食品相关的变量,涉及食品类型、消费者信息、购买行为、市场销售数据、产品特性等。具体数据集内容通常包括以下几类信息:
- 食品类型:如肠内营养配方、婴儿配方奶粉、代餐食品等。
- 产品特性:如配方成分、营养成分、剂型、包装类型等。
- 消费者数据:包括消费者的年龄、性别、健康状况等。
- 购买行为:如购买频次、金额、购买时间、购买渠道等。
- 市场数据:涉及销售数据、市场占有率、竞争对手等。
根据这些数据,参赛者需要对市场趋势、消费者行为、产品效果等方面进行分析,并提出有价值的见解。
3. 数据预处理
3.1 导入数据
首先,导入必要的Python库和数据集。
pythonCopy Codeimport pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 导入数据
data = pd.read_csv("special_medical_foods.csv")
3.2 数据检查
在开始分析之前,首先检查数据的基本信息,了解数据的维度、数据类型以及是否存在缺失值。
pythonCopy Code# 数据基本信息
print(data.info())
# 检查数据的前几行
print(data.head())
# 检查缺失值
print(data.isnull().sum())
3.3 数据清洗
根据检查结果,处理数据中的缺失值、重复值等问题。例如,对于缺失值,可以使用均值、中位数或众数进行填充,或者删除包含缺失值的行。
pythonCopy Code# 填充缺失值
data.fillna(data.mean(), inplace=True)
# 检查重复值
data.drop_duplicates(inplace=True)
3.4 数据类型转换
有些列可能需要进行数据类型转换,例如将日期列转换为datetime
类型,将类别列转换为category
类型等。
pythonCopy Code# 转换日期列为datetime类型
data['purchase_date'] = pd.to_datetime(data['purchase_date'])
# 转换类别列为category类型
data['food_type'] = data['food_type'].astype('category')
4. 数据探索与分析
4.1 描述性统计分析
通过计算各个变量的均值、标准差、最小值、最大值等,了解数据的基本分布情况。
pythonCopy Code# 计算基本的描述性统计信息
print(data.describe())
4.2 数据分布
通过可视化手段分析各个变量的分布情况。例如,查看不同食品类型的销售数量、不同消费者年龄段的购买偏好等。
pythonCopy Code# 绘制食品类型的销售数量
plt.figure(figsize=(10, 6))
sns.countplot(data=data, x='food_type')
plt.title('食品类型销售分布')
plt.xlabel('食品类型')
plt.ylabel('销售数量')
plt.show()
# 绘制消费者年龄分布
plt.figure(figsize=(10, 6))
sns.histplot(data['age'], bins=20, kde=True)
plt.title('消费者年龄分布')
plt.xlabel('年龄')
plt.ylabel('频数')
plt.show()
4.3 相关性分析
通过相关矩阵分析各个数值型变量之间的相关性,例如食品价格与购买频次、营养成分与消费者健康状况等。
pythonCopy Code# 计算相关性矩阵
correlation_matrix = data.corr()
# 绘制热力图
plt.figure(figsize=(10, 6))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('特医食品数据相关性矩阵')
plt.show()
4.4 细分分析
通过分组分析,了解不同群体的购买行为。例如,不同年龄段的消费者在特定食品类型上的购买频率。
pythonCopy Code# 按年龄段分组计算购买频次
age_groups = pd.cut(data['age'], bins=[0, 18, 30, 40, 50, 60, np.inf], labels=['0-18', '19-30', '31-40', '41-50', '51-60', '60+'])
age_group_purchase = data.groupby(age_groups)['purchase_amount'].sum()
# 绘制不同年龄段的购买总额
age_group_purchase.plot(kind='bar', figsize=(10, 6))
plt.title('不同年龄段的购买总额')
plt.xlabel('年龄段')
plt.ylabel('购买总额')
plt.xticks(rotation=45)
plt.show()
5. 特征工程
特征工程是机器学习建模中非常关键的一步,它直接影响模型的性能。在这里,我们可以从原始数据中提取一些新特征,或进行特征转换和缩放。
5.1 特征选择
根据相关性分析和业务理解,选择对模型有帮助的特征,去除无关的特征。
pythonCopy Code# 选择相关性较强的特征
selected_features = data[['age', 'purchase_amount', 'food_type', 'product_quality', 'nutrient_content']]
# 对类别特征进行编码
selected_features = pd.get_dummies(selected_features, columns=['food_type'], drop_first=True)
5.2 特征缩放
对于模型中涉及到距离计算的算法(如KNN、SVM等),我们需要对数值特征进行标准化或归一化。
pythonCopy Code# 对特征进行标准化
scaler = StandardScaler()
scaled_features = scaler.fit_transform(selected_features)
# 转换为DataFrame格式
scaled_features = pd.DataFrame(scaled_features, columns=selected_features.columns)
6. 建立机器学习模型
6.1 数据划分
首先,将数据集划分为训练集和测试集。一般来说,训练集占70%-80%,测试集占20%-30%。
pythonCopy Code# 划分数据集
X = scaled_features
y = data['purchase_amount'] # 假设我们预测购买金额
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
6.2 模型训练
在本示例中,我们选择使用线性回归模型来预测购买金额。你也可以尝试其他回归模型,如决策树回归、随机森林回归等。
pythonCopy Code# 训练线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)
6.3 模型评估
通过均方误差(MSE)和决定系数(R²)来评估模型的预测效果。
pythonCopy Code# 预测测试集
y_pred = model.predict(X_test)
# 计算均方误差和R²
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"均方误差(MSE): {mse}")
print(f"决定系数(R²): {r2}")
6.4 模型可视化
可以通过绘制真实值与预测值的散点图,来直观地比较模型的预测效果。
pythonCopy Code# 绘制真实值与预测值的散点图
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linestyle='--')
plt.title('真实值与预测值的散点图')
plt.xlabel('真实值')
plt.ylabel('预测值')
plt.show()
7. 结果分析与结论
通过以上的分析,我们可以得出一些重要结论。例如,消费者的年龄段与购买特医食品的频率有关;某些特定的食品