电商双十一美妆数据分析(代码)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import jieba
# 数据读取
df = pd.read_csv('双十一_淘宝美妆数据.csv')
# 数据清洗
# 处理重复值
data = df.drop_duplicates(inplace=False)
data = data.reset_index(inplace=False, drop=True)
# 处理缺失值
data['sale_count'].fillna(0, inplace=True)
data['comment_count'].fillna(0, inplace=True)
# 特征工程
# 对title进行分词
sub_title = []
for each in data['title']:
k = jieba.lcut(each)
sub_title.append(k)
data['sub_title'] = sub_title
# 划分主类别和子类别
basic_data = {
"乳液": ("护肤品", "乳液类"),
"柔肤水": ("护肤品", "化妆水"),
"精华素": ("护肤品", "精华类"),
"面霜": ("护肤品", "面霜类"),
"洁面乳": ("护肤品", "清洁类"),
"唇膏": ("化妆品", "口红类"),
"蜜粉": ("化妆品", "底妆类"),
"眼影": ("化妆品", "眼部妆"),
"修容粉": ("化妆品", "修容类")
}
main_type = []
sub_type = []
for i in range(len(data)):
cat = []
sub_cat = []
for j in data['sub_title'][i]:
if j in basic_data:
cat.append(basic_data[j][0])
sub_cat.append(basic_data[j][1])
break
if not cat:
main_type.append('其他')
sub_type.append('其他')
else:
main_type.append(cat[0])
sub_type.append(sub_cat[0])
data['main_type'] = main_type
data['sub_type'] = sub_type
# 判断是否男士专用
sex = []
for i in range(len(data)):
if '男士' in data['sub_title'][i]:
sex.append('是')
elif 'man' in data['sub_title'][i]:
sex.append('是')
elif '男性' in data['sub_title'][i]:
sex.append('是')
else:
sex.append('否')
data['是否男士专用'] = sex
# 新增销售额列
data['销售额'] = data['price'] * data['sale_count']
# 数据分析及可视化
# 各店铺商品数量、总销量、总销售额、平均单价
plt.figure(figsize=(16, 12))
plt.subplot(2, 2, 1)
data['店名'].value_counts().sort_values().plot(kind='barh')
plt.title('各店铺商品数量', fontsize = 15)
plt.ylabel('店名', fontsize = 15)
plt.xlabel('数量', fontsize = 15)
plt.subplot(2, 2, 2)
data.groupby('店名')['sale_count'].sum().sort_values().plot(kind='barh')
plt.title('各店铺总销量', fontsize = 15)
plt.ylabel('店名', fontsize = 15)
plt.xlabel('销量', fontsize = 15)
plt.subplot(2, 2, 3)
data.groupby('店名')['销售额'].sum().sort_values().plot(kind='barh')
plt.title('各店铺总销售额', fontsize = 15)
plt.ylabel('店名', fontsize = 15)
plt.xlabel('销售额', fontsize = 15)
plt.subplot(2, 2, 4)
(data['销售额'] / data['sale_count']).groupby(data['店名']).mean().sort_values().plot(kind='barh')
plt.title('各店铺商品平均单价', fontsize = 15)
plt.ylabel('店名', fontsize = 15)
plt.xlabel('平均单价', fontsize = 15)
plt.tight_layout()
# 不同价格区间店铺销售额占比
avg_price = data.groupby('店名')['销售额'].sum() / data.groupby('店名')['sale_count'].sum()
A = avg_price[(avg_price <= 100) & (avg_price > 0)]
B = avg_price[(avg_price <= 200) & (avg_price > 100)]
C = avg_price[(avg_price <= 300) & (avg_price > 200)]
D = avg_price[avg_price > 300]
sum_sale_A = data[data['店名'].isin(A.index)]['销售额'].sum()
sum_sale_B = data[data['店名'].isin(B.index)]['销售额'].sum()
sum_sale_C = data[data['店名'].isin(C.index)]['销售额'].sum()
sum_sale_D = data[data['店名'].isin(D.index)]['销售额'].sum()
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
labels = ['均价0-100元', '均价100-200元', '均价200-300元', '均价300元以上']
sizes = [sum_sale_A, sum_sale_B, sum_sale_C, sum_sale_D]
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.title('不同价格区间店铺销售额占比')
plt.subplot(1, 2, 2)
bars = plt.bar(labels, [np.mean(sum_sale_A), np.mean(sum_sale_B), np.mean(sum_sale_C), np.mean(sum_sale_D)])
for bar in bars:
height = bar.get_height()
plt.annotate('{:.2f}'.format(height),
xy=(bar.get_x() + bar.get_width() / 2, height),
xytext=(0, 3), # 3 points vertical offset
textcoords="offset points",
ha='center', va='bottom')
plt.title('不同类别店铺平均销售额')
plt.tight_layout()
# 各大类、小类销量和销售额占比
plt.figure(figsize=(12, 12))
plt.subplot(2, 2, 1)
data.groupby('main_type')['sale_count'].sum().plot(kind='pie', autopct='%1.1f%%')
plt.title('各大类销量占比')
plt.subplot(2, 2, 2)
data.groupby('main_type')['销售额'].sum().plot(kind='pie', autopct='%1.1f%%')
plt.title('各大类销售额占比')
plt.subplot(2, 2, 3)
data.groupby('sub_type')['sale_count'].sum().plot(kind='pie', autopct='%1.1f%%')
plt.title('各小类销量占比')
plt.subplot(2, 2, 4)
data.groupby('sub_type')['销售额'].sum().plot(kind='pie', autopct='%1.1f%%')
plt.title('各小类销售额占比')
plt.tight_layout()
# 各店铺各大类、小类销量和销售额情况
# 先去除总销量为0的店铺
data1 = data.drop(index = data[data['sale_count'] == 0].index)
data1 = data1.reset_index(inplace=False, drop=True)
plt.figure(figsize=(16, 12))
plt.subplot(2, 2, 1)
sns.barplot(x='店名', y='sale_count', hue='main_type', data=data1)
plt.title('各店铺各大类的销售量', fontsize = 15)
plt.ylabel('销量', fontsize = 15)
plt.xticks(rotation=45)
plt.subplot(2, 2, 2)
sns.barplot(x='店名', y='销售额', hue='main_type', data=data1)
plt.title('各店铺各大类的销售额', fontsize = 15)
plt.ylabel('销售额', fontsize = 15)
plt.xticks(rotation=45)
plt.subplot(2, 2, 3)
sns.barplot(x='店名', y='sale_count', hue='sub_type', data=data1)
plt.title('各店铺各小类的销售量', fontsize = 15)
plt.ylabel('销量', fontsize = 15)
plt.xticks(rotation=45)
plt.subplot(2, 2, 4)
sns.barplot(x='店名', y='销售额', hue='sub_type', data=data1)
plt.title('各店铺各小类的销售额', fontsize = 15)
plt.ylabel('销售额', fontsize = 15)
plt.xticks(rotation=45)
plt.tight_layout()
# 男士专用和非男士专用相关分析
plt.figure(figsize=(16, 16))
plt.subplot(2, 2, 1)
data.loc[data['是否男士专用'] == '是'].groupby('main_type')['sale_count'].sum().plot(kind='pie', autopct='%1.1f%%')
plt.title('男士专用中各类销量占比')
plt.subplot(2, 2, 2)
data.loc[data['是否男士专用'] == '否'].groupby('main_type')['sale_count'].sum().plot(kind='pie', autopct='%1.1f%%')
plt.title('非男士专用中各类销量占比')
plt.subplot(2, 2, 3)
data.groupby('是否男士专用')['sale_count'].sum().plot(kind='pie', autopct='%1.1f%%')
plt.title('男士专用销量占总销量')
plt.subplot(2, 2, 4)
data.groupby('是否男士专用')['销售额'].sum().plot(kind='pie', autopct='%1.1f%%')
plt.title('男士专用销售额占总销售额')
plt.tight_layout()
# 各店铺男士专用商品销量
male_data = data.loc[data['是否男士专用'] == '是']
plt.figure(figsize=(12, 8))
sns.barplot(x='店名', y='sale_count', data=male_data)
plt.title('各店男士专用商品销量', fontsize = 15)
plt.ylabel('销量', fontsize = 15)
plt.tight_layout()
# 时间相关分析(假设update_time是时间字段且为datetime类型,如果不是需先转换)
# data['update_time'] = pd.to_datetime(data['update_time'])
# plt.figure(figsize=(16, 12))
# plt.subplot(2, 1, 1)
# data.groupby('update_time')['sale_count'].sum().plot()
# plt.title('每天的销量')
# plt.ylabel('销量')
# plt.grid(True)
# plt.subplot(2, 1, 2)
# data.groupby('update_time')['销售额'].sum().plot()
# plt.title('每天的销售额')
# plt.ylabel('销售额')
# plt.grid(True)
# plt.tight_layout()
# 评论数相关分析(假设只是简单看各店铺评论数情况)
plt.figure(figsize=(16, 6))
plt.subplot(1, 2, 1)
data.groupby('店名')['comment_count'].sum().sort_values().plot(kind='barh')
plt.title('各店铺总评论数', fontsize = 15)
plt.ylabel('店名', fontsize = 15)
plt.xlabel('评论数', fontsize = 15)
plt.subplot(1, 2, 2)
(data['comment_count'] / data['sale_count']).groupby(data['店名']).mean().sort_values().plot(kind='barh')
plt.title('各店铺平均多少一条评论', fontsize = 15)
plt.ylabel('店名', fontsize = 15)
plt.xlabel('平均评论数', fontsize = 15)
plt.tight_layout()
plt.show()
代码中的数据分析及可视化
- 店铺综合指标:分析并可视化各店铺商品数量、总销量、总销售额、平均单价。
- 价格区间分析:划分价格区间,分析不同区间店铺销售额占比及平均销售额。
- 类别销售占比:分析各大类、小类的销量和销售额占比。
- 店铺类别销售情况:展示各店铺各大类、小类的销量和销售额情况
- 男士专用分析:分析男士专用和非男士专用商品在销量和销售额方面的占比,以及各店铺男士专用商品销量
- 时间及评论数分析:代码中时间分析部分因数据类型不确定(假设需 update_time 为 datetime 类型 )未完整实现,评论数部分分析了各店铺总评论数和平均评论数情况。