本文来源
KathyZhu - 天猫双十一美妆销售数据分析 - kesci.com
👆 点击以上链接,不用配置环境,直接在线运行
本文数据集链接:Tmall_makeup - 采集了2016年双十一化妆品的销量信息
一、读取数据
import pandas as pdimport numpy as npdata = pd.read_csv('beautymakeup in T-mall.csv')data.head() data.shape
out[]:(27598, 7)
# 查看各字段信息data.info() data['店名'].value_counts()
二、数据清洗
2.1 重复数据处理
# 对重复数据做删除处理data = data.drop_duplicates(inplace=False)data.shape
out:(27512, 7)
# 此处虽然删除了重复值,但索引未变,因此应用以下方法进行重置索引data.reset_index(inplace=True,drop=True)
2.2 缺失值处理
# 查看缺失值data.isnull().any() # 查看数据结构data.describe() # 查看sale_count列的众数mode_01 = data.sale_count.mode()mode_01
out:
0 0.0
dtype: float64
# 查看comment_count列的众数mode_02 = data.comment_count.mode()mode_02
out:
0 0.0
dtype: float64
此处两列的众数均为0,且由标签数据含义可知销售量和评论数有可能存在为0的情况,因此使用0来填充缺失值
data = data.fillna(0)data.isnull().sum()
2.3 提取表格中有用信息并新增为列
(1)对商品标题进行分词处理
import jieba# jieba.load_userdict('addwords.txt')title_cut = []for i in data.title:j = jieba.lcut(i)title_cut.append(j)data['item_name_cut'] = title_cutdata[['title','item_name_cut']].head() # 给商品添加分类sub_type = [] #子类别main_type = [] #主类别basic_config_data = """护肤品套装套装护肤品乳液类乳液美白乳润肤乳凝乳柔肤液'亮肤乳菁华乳修护乳护肤品眼部护理眼霜眼部精华眼膜护肤品面膜类面膜护肤品清洁类洗面洁面清洁卸妆洁颜洗颜去角质磨砂护肤品化妆水化妆水爽肤水柔肤水补水露凝露柔肤液精粹水亮肤水润肤水保湿水菁华水保湿喷雾舒缓喷雾护肤品面霜类面霜日霜晚霜柔肤霜滋润霜保湿霜凝霜日间霜晚间霜乳霜修护霜亮肤霜底霜菁华霜护肤品精华类精华液精华水精华露精华素护肤品防晒类防晒霜防晒喷雾化妆品口红类唇釉口红唇彩化妆品底妆类散粉蜜粉粉底液定妆粉 气垫粉饼BBCC遮瑕粉霜粉底膏粉底霜化妆品眼部彩妆眉粉染眉膏眼线眼影睫毛膏化妆品修容类鼻影修容粉高光腮红其他其他其他"""category_config_map = {}for config_line in basic_config_data.split('\n'):basic_cateogry_list = config_line.strip().strip('\n').strip('\t').split('\t')main_category = basic_cateogry_list[0]sub_category = basic_cateogry_list[1]unit_category_list = basic_cateogry_list[2:-1]for unit_category in unit_category_list:if unit_category and unit_category.strip().strip('\t'):category_config_map[unit_category] = (main_category,sub_category)category_config_map for i in range(len(data)):exist = Falsefor temp in data.item_name_cut[i]:if temp in category_config_map:sub_type.append(category_config_map.get(temp)[1])main_type.append(category_config_map.get(temp)[0])exist = Truebreakif not exist:sub_type.append('其他')main_type.append('其他')print(len(sub_type),len(main_type),len(data))
out:
27512 27512 27512
(2)将子类别sub_type新增为一列
data['sub_type'] = sub_type
(3)将主类别main-type新增为一列
data['main_type'] = main_typedata['sub_type'].value_counts() data['main_type'].value_counts()
(4)将“是否男士专用”新增为一列
gender = []for i in range(len(data)):if '男' in data.item_name_cut[i]:gender.append('是')elif '男士' in data.item_name_cut[i]:gender.append('是')elif '男生' in data.item_name_cut[i]:gender.append('是')else:gender.append('否')# 将“是否男士专用”新增为一列data['是否男士专用'] = genderdata['是否男士专用'].value_counts()
(5)新增销售额、购买日期(天)为一列
新增销售额为一列
# 销售额=销售量*价格data['销售额'] = data.sale_count*data.price
新增购买日期为一列
# 转换时间格式data['update_time'] = pd.to_datetime(data['update_time'])data['update_time']
- 热度与销量呈现一定的正相关;
- 美宝莲热度第一,销量第二,妮维雅热度第二,销量第四,两者价格均相对较低;
- 价格低的品牌热度和销量相对较高,价格高的品牌热度和销量相对较低,说明价格在热度和销量中有一定影响;
3.5 各品牌价格
#查看价格的箱型图plt.figure(figsize=(14,6))sns.boxplot(x='店名',y='price',data=data)plt.ylim(0,3000)#如果不限制,就不容易看清箱型,所以把Y轴刻度缩小为0-3000plt.show() data.groupby('店名').price.sum()avg_price=data.groupby('店名').price.sum()/data.groupby('店名').price.count()avg_price fig = plt.figure(figsize=(12,6))avg_price.sort_values(ascending=False).plot(kind='bar',width=0.8,alpha=0.6,color='b',label='各品牌平均价格')y = data['price'].mean()plt.axhline(y,0,5,color='r',label='全品牌平均价格')plt.ylabel('各品牌平均价格')plt.title('各品牌产品的平均价格',fontsize=24)plt.legend(loc='best')plt.show()
- 娇兰、SKII、雪花秀、雅诗兰黛、兰蔻、资生堂这几个国际大牌的产品价格很高,产品平均价格都在500以上,都是一线大牌;
- 兰芝、倩碧、玉兰油、植村秀、佰草集、薇姿、雅漾的平均价格在300-400元左右,其中佰草集是最贵的国货品牌;
- 美加净作为国货品牌,性价比高,平均价格最低,妮维雅的平均价格第二低,在100元左右;
- 全品牌平均价格低于400元,除了前五个国际大牌其余品牌的平均价格都低于全品牌平均价格;
plt.figure(figsize=(12,10))x = data.groupby('店名')['sale_count'].mean()y = data.groupby('店名')['销售额'].mean()s = avg_pricetxt = data.groupby('店名').id.count().indexsns.scatterplot(x,y,size=s,sizes=(100,1500),marker='v',alpha=0.5,color='b',data=data)for i in range(len(txt)):plt.annotate(txt[i],xy=(x[i],y[i]),xytext = (x[i]+0.2, y[i]+0.2)) #在散点后面增加品牌信息的标签plt.ylabel('销售额')plt.xlabel('销量')plt.legend(loc='upper left')plt.show()
- 销售量和销售额呈现正相关;
- 相宜本草、美宝莲、蜜丝佛陀销量和销售额位居前三,且平均价格居中;
- 说明销量销售额与价格有很重要的联系;
3.6 男性护肤品销量情况
gender_data=data[data['是否男士专用']=='是']gender_data_1=gender_data[(gender_data.main_type =='护肤品')| (gender_data.main_type=='化妆品')]plt.figure(figsize = (12,6))sns.barplot(x='店名',y='sale_count',hue='main_type',data =gender_data_1,saturation=0.75,ci=0,)plt.show() f,[ax1,ax2]=plt.subplots(1,2,figsize=(12,6))gender_data.groupby('店名').sale_count.sum().sort_values(ascending=True).plot(kind='barh',width=0.8,ax=ax1)ax1.set_title('男士护肤品销量排名')gender_data.groupby('店名').销售额.sum().sort_values(ascending=True).plot(kind='barh',width=0.8,ax=ax2)ax2.set_title('男士护肤品销售额排名')plt.subplots_adjust(wspace=0.4)plt.show()
- 男士购买的大多是护肤品;
- 妮维雅是男生护肤品中销量遥遥领先的品牌,第二第三分别为欧莱雅、相宜本草;
3.7 分析时间与销量的关系,体现购买高峰期
from matplotlib.pyplot import MultipleLocatorplt.figure(figsize = (12,6))day_sale=data.groupby('day')['sale_count'].sum()day_sale.plot()plt.grid(linestyle="-.",color="gray",axis="x",alpha=0.5)x_major_locator=MultipleLocator(1) #把x轴的刻度间隔设置为1,并存在变量里ax=plt.gca() #ax为两条坐标轴的实例ax.xaxis.set_major_locator(x_major_locator)#把x轴的主刻度设置为1的倍数plt.xlabel('日期(11月)')plt.ylabel('销量')plt.show()
总结
- 美妆类别中护肤品销量远大于化妆品,其中清洁类、化妆水、面霜等基础护肤类销量最高;
- 男士购买美妆集中在护肤品类,其中妮维雅品牌是最受男士喜爱的品牌;
- 价格和热度对销售量有关联,平价基础产品是大多数消费者的选择;
- 由于商家在双十一提前预热,巨大的优惠力度和为了避免网络高峰,不少消费者选择提前消费,销量高峰出现在双十一前几天;双十一后3天商家持续打折优惠,消费者还保有购物余热,但远不如双十一之前。
建议
- 消费者对产品价格和热度关注度较高,品牌可以适当调整产品价格并通过诸如网络社交平台的方式提高品牌热度;
- 对于男性消费者,品牌可以定向推荐平价基础护肤产品,在销量中可以看到也有一部分男性购买化妆品,品牌可以在护肤品中适当捆绑化妆品产品带动消费;
- 消费者购买欲望并不集中在双十一当天,商家可以提前预热加大优惠力度刺激消费者提前消费,避免网络高峰。