双十一淘宝美妆消费数据分析
数据来源
项目描述
import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
import warnings
warnings.filterwarnings('ignore')
df=pd.read_csv('./beautymakeup.csv',',')
df.info()
df.head()
df.duplicated().sum()#计算重复条数
df.drop_duplicates(inplace=True)#去除重复值
df.shape#查看去重后数据条数
df.reset_index(inplace=True,drop=True)#重置索引
df.sale_count.mode()#sale_count的众数
df.comment_count.mode()#comment_count的众数
sale_count、comment_count的众数都为0,且结合实际情况销量、评论数都可能存在为0的情况,因此是使用0来填充这两列的空值。
df.fillna(0,inplace=True)
df.sale_count=df.sale_count.astype('int64')
df.comment_count=df.comment_count.astype('int64')
df.isnull().sum()#检查是否完成缺失值的处理
import jieba
title_cut=[]
for i in df.title:
j=jieba.lcut(i)
title_cut.append(j)
df['name_cut']=title_cut
df[['title','name_cut']].head()
first_type=[]#主类别
second_type=[]#子类别
basic_config_data = '''护肤品 套装 套装
护肤品 乳液类 乳液 美白乳 润肤乳 凝乳 柔肤液' 亮肤乳 菁华乳 修护乳
护肤品 眼部护理 眼霜 眼部精华 眼膜
护肤品 面膜类 面膜
护肤品 清洁类 洗面 洁面 清洁 卸妆 洁颜 洗颜 去角质 磨砂
护肤品 化妆水 化妆水 爽肤水 柔肤水 补水露 凝露 柔肤液 精粹水 亮肤水 润肤水 保湿水 菁华水 保湿喷雾 舒缓喷雾
护肤品 面霜类 面霜 日霜 晚霜 柔肤霜 滋润霜 保湿霜 凝霜 日间霜 晚间霜 乳霜 修护霜 亮肤霜 底霜 菁华霜
护肤品 精华类 精华液 精华水 精华露 精华素
护肤品 防晒类 防晒霜 防晒喷雾
化妆品 口红类 唇釉 口红 唇彩
化妆品 底妆类 散粉 蜜粉 粉底液 定妆粉 气垫 粉饼 BB CC 遮瑕 粉霜 粉底膏 粉底霜
化妆品 眼部彩妆 眉粉 染眉膏 眼线 眼影 睫毛膏
化妆品 修容类 鼻影 修容粉 高光 腮红
其他 其他 其他'''#标准分类
category_map={}
for m in basic_config_data.split('\n'):
basic_category_list=m.strip().strip('\n').strip('\t').split('\t')
first_category=basic_category_list[0]
second_category=basic_category_list[1]
unit_category_list=basic_category_list[2:-1]
for unit_category in unit_category_list:
if unit_category and unit_category.strip().strip('\t'):
category_map[unit_category]=(first_category,second_category)
category_map
for i in range(len(df)):
exist=False
for j in df['name_cut'][i]:
if j in category_map:
first_type.append(category_map.get(j)[0])
second_type.append(category_map.get(j)[1])
exist=True
break
if not exist:
first_type.append('其他')
second_type.append('其他')
gender=[]
for i in range(len(df)):
if '男' in df.name_cut[i]:
gender.append('是')
elif '男生' in df.name_cut[i]:
gender.append('是')
elif '男士' in df.name_cut[i]:
gender.append('是')
else:
gender.append('否')
#将“推荐男士使用”新增为一列
df['gender']=gender
df['销售额']=df.sale_count*df.price
df['update_time']=pd.to_datetime(df['update_time'])
df=df.set_index('update_time')
#新增日期号数为一列
df['日期']=df.index.day
del df['name_cut']
df.head()
fig,axes=plt.subplots(1,2,figsize=(12,10))
ax1=df.groupby(['店名']).sale_count.sum().sort_values(ascending=True).plot(kind='barh',ax=axes[0],width=0.6)
ax1.set_xlabel('总销量',fontsize=12)
ax1.set_ylabel('品牌',fontsize=12)
ax1.set_title('各品牌总销量对比',fontsize=14)
ax2=df['销售额'].groupby(df.店名).sum().sort_values(ascending=True).plot(kind='barh',ax=axes[1],width=0.6)
ax2.set_xlabel('总销售额',fontsize=12)
ax2.set_ylabel('品牌',fontsize=12)
ax2.set_title('各品牌总销售额对比',fontsize=14)
plt.subplots_adjust(wspace=0.4)
plt.savefig('./各品牌总销量和销售额对比.png')
plt.show()
a=df['comment_count'].groupby(df['店名']).sum().sort_values(ascending=False)
plt.figure(figsize=(16,8),dpi=80)
b=list(range(len(a)))
plt.bar(b,a.values,width=0.4,color='#0c84c6')
plt.xticks(b,a.index,fontsize=12,rotation=90)
plt.xlabel('品牌',fontsize=12)
plt.ylabel('评论热度',fontsize=12)
plt.title('各品牌双十一期间的评论热度',fontsize=14)
plt.savefig('./各品牌双十一期间的评论热度.png')
由上图可知:双十一期间,评论热度较高的是:悦诗风吟、妮维雅、美宝莲、相宜本草、自然堂
plt.figure(figsize=(12,6),dpi=80)
x=df.groupby('店名')['sale_count'].sum()
y=df.groupby('店名').comment_count.sum()
avg_price=df.groupby('店名').price.mean()
txt=df.groupby('店名').id.count().index
sns.scatterplot(x,y,size=avg_price,hue=avg_price,sizes=(0,1500),data=df)
for i in range(len(txt)):
plt.annotate(txt[i],xy=(x[i],y[i]))
plt.xlabel('销量',fontsize=12)
plt.ylabel('热度',fontsize=12)
plt.legend(loc='upper left')
plt.grid(alpha=0.5)
plt.savefig('./热度.png')
plt.show()
plt.figure(figsize=(12,6),dpi=80)
b=avg_price.sort_values(ascending=False)
plt.bar(list(range(len(avg_price))),b,width=0.4,label='各品牌平均价格')
plt.xlabel('品牌',fontsize=12)
plt.ylabel('平均价格',fontsize=12)
plt.xticks(list(range(len(avg_price))),b.index,fontsize=11,rotation=90)
plt.title('各品牌产品平均价格',fontsize=14)
c=df.price.mean()
plt.axhline(c,color='r',label='全品牌平均价格',alpha=0.8)
plt.legend()
plt.savefig('./品牌均价.png')
plt.figure(figsize=(12,6),dpi=80)
x=df['sale_count'].groupby(df['店名']).sum()
y=df['销售额'].groupby(df['店名']).sum()
sns.scatterplot(x,y,size=avg_price,hue=avg_price,sizes=(0,1500),data=df)
plt.xlabel('销量',fontsize=12)
plt.ylabel('销售额',fontsize=12)
txt=x.index
for i in range(len(x)):
plt.annotate(txt[i],xy=(x[i],y[i]),xytext=(x[i]+1,y[i]+1))
plt.savefig('./价格与销量.png')
fig,axes=plt.subplots(1,2,figsize=(14,7))
data1=df['sale_count'].groupby(df['first_type']).sum()
ax1 = data1.plot(kind='pie',ax=axes[0],autopct='%.1f%%',
pctdistance=0.6,
labels= data1.index,
labeldistance = 1.05,
startangle = 60,
radius = 1.2,
counterclock = False,
wedgeprops = {'linewidth': 0.6, 'edgecolor':'k'},
textprops = {'fontsize':12, 'color':'k'}
)
ax1.set_title('主类别销量占比',fontsize=14)
data2=df.groupby(['second_type']).sale_count.sum()
ax2=data2.plot(kind='pie',ax=axes[1],autopct='%.1f%%',
pctdistance=0.8,
labels=data2.index,
labeldistance=1.05,
radius=1.2,
startangle=210,
counterclock=False,
wedgeprops={'linewidth':0.6,'edgecolor':'k'},
textprops={'fontsize':10,'color':'k'}
)
ax2.set_title('子类别销量占比',fontsize=14)
plt.subplots_adjust(wspace=0.4)
plt.savefig('./分类别销量.png')
plt.show()
fig,axes=plt.subplots(1,2,figsize=(14,7))
d1=df['销售额'].groupby(df.first_type).sum()
a1=d1.plot(kind='pie',ax=axes[0],autopct='%.1f%%',labels=d1.index,pctdistance=0.6,labeldistance=1.05,radius=1.2,counterclock=False,
wedgeprops={'linewidth':0.6,'edgecolor':'k'},textprops={'fontsize':10,'color':'k'})
a1.set_title('主类别总销售额占比',fontsize=14)
d2=df['销售额'].groupby(df.second_type).sum()
a2=d2.plot(kind='pie',ax=axes[1],autopct='%.1f%%',labels=d2.index,pctdistance=0.6,labeldistance=1.05,radius=1.2,counterclock=False,
wedgeprops={'linewidth':0.6,'edgecolor':'k'},textprops={'fontsize':10,'color':'k'})
a2.set_title('次类别总销售额占比',fontsize=14)
plt.subplots_adjust(wspace=0.5)
plt.savefig('./分类别的销售额.png')
plt.show()
plt.figure(figsize=(16,8),dpi=80)
sns.barplot(x='店名',y='sale_count',hue='first_type',data=df,saturation=0.8,ci=0)
plt.title('各品牌各主类别的总销量',fontsize=14)
plt.ylabel('销量',fontsize=12)
plt.xlabel('品牌',fontsize=12)
plt.grid(axis='y',alpha=0.5)
plt.savefig('./品牌类别销量.png')
plt.show()
plt.figure(figsize=(16,8),dpi=80)
sns.barplot(x='店名',y='销售额',hue='first_type',data=df,saturation=0.8,ci=0)
plt.title('各品牌各主类别的总销售额',fontsize=14)
plt.xlabel('品牌',fontsize=12)
plt.ylabel('销售额',fontsize=12)
plt.grid(axis='y',alpha=0.5)
plt.savefig('./品牌类别销售额.png')
plt.show()
由上2图可知:美宝莲、相宜本草、蜜丝佛陀在销量和销售额上都表现得很不错
gender_data=df[df.gender=='是']
gender_data1=gender_data[(gender_data.first_type=='护肤品')|(gender_data.first_type=='化妆品')]
plt.figure(figsize=(12,6),dpi=80)
sns.barplot(x='店名',y='sale_count',hue='first_type',data=gender_data1,saturation=0.8,ci=0)
plt.xlabel('品牌',fontsize=12)
plt.ylabel('销量',fontsize=12)
plt.title('各品牌男士护肤品和化妆品销量统计',fontsize=14)
plt.savefig('./男士美妆销量统计.png')
f,[a1,a2]=plt.subplots(1,2,figsize=(14,7))
gender_data2=gender_data[gender_data.first_type=='护肤品']
gender_data2.sale_count.groupby(gender_data2['店名']).sum().sort_values(ascending=True).plot(kind='barh',ax=a1,width=0.6)
a1.set_ylabel('品牌',fontsize=12)
a1.set_title('男士护肤品销量情况统计',fontsize=14)
gender_data2['销售额'].groupby(gender_data2['店名']).sum().sort_values(ascending=True).plot(kind='barh',ax=a2,width=0.6)
a2.set_ylabel('品牌',fontsize=12)
a2.set_title('男士护肤品销售额情况统计',fontsize=14)
plt.subplots_adjust(wspace=0.4)
plt.savefig('./男士护肤品销售.png')
plt.figure(figsize=(12,6),dpi=80)
plt.grid(linestyle='-.',color='gray',axis='x',alpha=0.5)
b1=df['sale_count'].groupby(df['日期']).sum()
b2=df['comment_count'].groupby(df['日期']).sum()
x=b1.index
ax1=plt.subplot(111)
ax1.plot(x,b1.values,label='销量')
ax1.legend(loc='upper left')
ax1.set_ylabel('销量',fontsize=12)
ax2=ax1.twinx()
ax2.plot(x,b2.values,label='评论热度',color='r')
ax2.legend(loc='upper right')
ax2.set_ylabel('评论热度',fontsize=12)
ax1.set_xlabel('日期(11月)',fontsize=12)
ax1.set_xticks(list(range(5,15)))
plt.savefig('./销量、热度随时间变化.png')
plt.show()