本文來(lái)源
KathyZhu - 天貓雙十一美妝銷售數(shù)據(jù)分析 - kesci.com
點(diǎn)擊以上鏈接?? 不用配置環(huán)境汞斧,直接在線運(yùn)行
本文數(shù)據(jù)集鏈接:Tmall_makeup - 采集了2016年雙十一化妝品的銷量信息
一、讀取數(shù)據(jù)
import pandas as pd
import numpy as np
data = pd.read_csv('beautymakeup in T-mall.csv')
data.head()
data.shape
out[]:(27598, 7)
# 查看各字段信息
data.info()
data['店名'].value_counts()
二、數(shù)據(jù)清洗
2.1 重復(fù)數(shù)據(jù)處理
# 對(duì)重復(fù)數(shù)據(jù)做刪除處理
data = data.drop_duplicates(inplace=False)
data.shape
out:(27512, 7)
# 此處雖然刪除了重復(fù)值卖陵,但索引未變,因此應(yīng)用以下方法進(jìn)行重置索引
data.reset_index(inplace=True,drop=True)
2.2 缺失值處理
# 查看缺失值
data.isnull().any()
有兩列數(shù)據(jù)存在缺失值:sale_count, comment_count
# 查看數(shù)據(jù)結(jié)構(gòu)
data.describe()
# 查看sale_count列的眾數(shù)
mode_01 = data.sale_count.mode()
mode_01
out:
0 0.0
dtype: float64
# 查看comment_count列的眾數(shù)
mode_02 = data.comment_count.mode()
mode_02
out:
0 0.0
dtype: float64
此處兩列的眾數(shù)均為0邀摆,且由標(biāo)簽數(shù)據(jù)含義可知銷售量和評(píng)論數(shù)有可能存在為0的情況腻格,因此使用0來(lái)填充缺失值
data = data.fillna(0)
data.isnull().sum()
2.3 提取表格中有用信息并新增為列
(1)對(duì)商品標(biāo)題進(jìn)行分詞處理
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_cut
data[['title','item_name_cut']].head()
# 給商品添加分類
sub_type = [] #子類別
main_type = [] #主類別
basic_config_data = """護(hù)膚品 套裝 套裝
護(hù)膚品 乳液類 乳液 美白乳 潤(rùn)膚乳 凝乳 柔膚液' 亮膚乳 菁華乳 修護(hù)乳
護(hù)膚品 眼部護(hù)理 眼霜 眼部精華 眼膜
護(hù)膚品 面膜類 面膜
護(hù)膚品 清潔類 洗面 潔面 清潔 卸妝 潔顏 洗顏 去角質(zhì) 磨砂
護(hù)膚品 化妝水 化妝水 爽膚水 柔膚水 補(bǔ)水露 凝露 柔膚液 精粹水 亮膚水 潤(rùn)膚水 保濕水 菁華水 保濕噴霧 舒緩噴霧
護(hù)膚品 面霜類 面霜 日霜 晚霜 柔膚霜 滋潤(rùn)霜 保濕霜 凝霜 日間霜 晚間霜 乳霜 修護(hù)霜 亮膚霜 底霜 菁華霜
護(hù)膚品 精華類 精華液 精華水 精華露 精華素
護(hù)膚品 防曬類 防曬霜 防曬噴霧
化妝品 口紅類 唇釉 口紅 唇彩
化妝品 底妝類 散粉 蜜粉 粉底液 定妝粉 氣墊 粉餅 BB CC 遮瑕 粉霜 粉底膏 粉底霜
化妝品 眼部彩妝 眉粉 染眉膏 眼線 眼影 睫毛膏
化妝品 修容類 鼻影 修容粉 高光 腮紅
其他 其他 其他"""
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 = False
for 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 = True
break
if 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_type
data['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['是否男士專用'] = gender
data['是否男士專用'].value_counts()
(5)新增銷售額诊赊、購(gòu)買日期(天)為一列
新增銷售額為一列
# 銷售額=銷售量*價(jià)格
data['銷售額'] = data.sale_count*data.price
新增購(gòu)買日期為一列
# 轉(zhuǎn)換時(shí)間格式
data['update_time'] = pd.to_datetime(data['update_time'])
data['update_time']
# 將時(shí)間設(shè)置為新的index
data = data.set_index('update_time')
# 新增時(shí)間“天”為一列
data['day'] = data.index.day
# 刪除中文分詞的一列
del data['item_name_cut']
(6)查看最終數(shù)據(jù)表格
data.head()
data.info()
# 保存清理好的數(shù)據(jù)為Excel格式
data.to_excel('clean_beautymakeup.xls',sheet_name='clean_data')
三、數(shù)據(jù)探索
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
data.columns
3.1 各品牌SKU數(shù)
plt.rcParams['font.sans-serif']=['SimHei'] #指定默認(rèn)字體
plt.rcParams['axes.unicode_minus']=False #解決負(fù)號(hào)'-'顯示為方塊的問(wèn)題
plt.figure(figsize=(8,6))
# 計(jì)算各店鋪的商品數(shù)量
data['店名'].value_counts().sort_values(ascending=False).plot.bar(width=0.8,alpha=0.6,color='b')
plt.title('各品牌SKU數(shù)',fontsize=18)
plt.ylabel('商品數(shù)量',fontsize=14)
plt.show()
悅詩(shī)風(fēng)吟的商品數(shù)量最多仅孩,其次為佰草集托猩、歐萊雅
3.2 品牌總銷量和總銷售額
fig,axes = plt.subplots(1,2,figsize=(12,10))
ax1 = data.groupby('店名').sale_count.sum().sort_values(ascending=True).plot(kind='barh',ax=axes[0],width=0.6)
ax1.set_title('品牌總銷售量',fontsize=12)
ax1.set_xlabel('總銷售量')
ax2 = data.groupby('店名')['銷售額'].sum().sort_values(ascending=True).plot(kind='barh',ax=axes[1],width=0.6)
ax2.set_title('品牌總銷售額',fontsize=12)
ax2.set_xlabel('總銷售額')
plt.subplots_adjust(wspace=0.4)
plt.show()
相宜本草的銷售量和銷售額都是最高的。銷量第二至第五辽慕,分別為美寶蓮京腥、悅詩(shī)風(fēng)吟、妮維雅溅蛉、歐萊雅公浪;銷售額第二至第五他宛,分別為歐萊雅、佰草集欠气、美寶蓮厅各、悅詩(shī)風(fēng)吟。 寶蓮预柒、悅詩(shī)風(fēng)吟讯检、歐萊雅都在銷量、銷售額前五中卫旱。
3.3 各類別的銷售量人灼、銷售額情況
fig,axes = plt.subplots(1,2,figsize=(12,5))
data1 = data.groupby('main_type')['sale_count'].sum()
ax1 = data1.plot(kind='pie',ax=axes[0],autopct='%.1f%%', # 設(shè)置百分比的格式,這里保留一位小數(shù)
pctdistance=0.8, # 設(shè)置百分比標(biāo)簽與圓心的距離
labels= data1.index,
labeldistance = 1.05, # 設(shè)置標(biāo)簽與圓心的距離
startangle = 60, # 設(shè)置餅圖的初始角度
radius = 1.1, # 設(shè)置餅圖的半徑
counterclock = False, # 是否逆時(shí)針顾翼,這里設(shè)置為順時(shí)針?lè)较?wedgeprops = {'linewidth': 1.2, 'edgecolor':'k'},# 設(shè)置餅圖內(nèi)外邊界的屬性值
textprops = {'fontsize':10, 'color':'k'}, # 設(shè)置文本標(biāo)簽的屬性值
)
ax1.set_title('主類別銷售量占比',fontsize=12)
data2 = data.groupby('sub_type')['sale_count'].sum()
ax2 = data2.plot(kind='pie',ax=axes[1],autopct='%.1f%%',
pctdistance=0.8,
labels= data2.index,
labeldistance = 1.05,
startangle = 230,
radius = 1.1,
counterclock = False,
wedgeprops = {'linewidth': 1.2, 'edgecolor':'k'},
textprops = {'fontsize':10, 'color':'k'},
)
ax2.set_title('子類別銷售量占比',fontsize=12)
plt.subplots_adjust(wspace=0.4)
plt.show()
- 從主類別銷售量占比情況來(lái)看投放,護(hù)膚品的銷量遠(yuǎn)大于化妝品;
- 從子類別銷售量占比情況來(lái)看适贸,底妝類灸芳、口紅類在化妝品中銷量最多,清潔類拜姿、化妝水烙样、面霜類在護(hù)膚品中銷量最多。
plt.figure(figsize=(14,6))
sns.barplot(x='店名',y='sale_count',hue='main_type',data=data,saturation=0.75,ci=0)
plt.title('各品牌各總類的總銷量')
plt.ylabel('銷量')
plt.text(0,78000,'注:此處也可使用堆疊圖蕊肥,對(duì)比效果更直觀',
verticalalignment='top', horizontalalignment='left',color='gray', fontsize=10)
plt.show()
plt.figure(figsize = (14,6))
sns.barplot( x = '店名',
y = '銷售額',hue = 'main_type',data =data,saturation = 0.75,ci=0,)
plt.title('各品牌各總類的總銷售額')
plt.ylabel('銷售額')
plt.show()
各品牌的化妝品谒获、護(hù)膚品銷量、銷售情況均不一樣壁却,這與品牌的定位有關(guān)批狱, 有的品牌主打化妝品,化妝品會(huì)表現(xiàn)好很多展东,如蜜絲佛陀等赔硫。主打護(hù)膚品的品牌,護(hù)膚品的銷量銷售額會(huì)表現(xiàn)好很多盐肃,如歐萊雅爪膊、佰草集等。 有的品牌如美寶蓮砸王、蘭蔻推盛、悅詩(shī)風(fēng)吟,化妝品和護(hù)膚品的銷售处硬、銷售額都還不錯(cuò)小槐。
plt.figure(figsize = (16,6))
sns.barplot( x = '店名',
y = 'sale_count',hue = 'sub_type',data =data,saturation = 0.75,ci=0)
plt.title('各品牌各子類的總銷量')
plt.ylabel('銷量')
plt.show()
plt.figure(figsize = (14,6))
sns.barplot( x = '店名',
y = '銷售額',hue = 'sub_type',data =data,saturation = 0.75,ci=0)
plt.title('各品牌各子類的總銷售額')
plt.ylabel('銷售額')
plt.show()
3.4 各品牌熱度
plt.figure(figsize = (12,6))
data.groupby('店名').comment_count.mean().sort_values(ascending=False).plot(kind='bar',width=0.8)
plt.title('各品牌商品的平均評(píng)論數(shù)')
plt.ylabel('評(píng)論數(shù)')
plt.show()
plt.figure(figsize=(12,10))
x = data.groupby('店名')['sale_count'].mean()
y = data.groupby('店名')['comment_count'].mean()
s = data.groupby('店名')['price'].mean()
txt = data.groupby('店名').id.count().index
sns.scatterplot(x,y,size=s,hue=s,sizes=(100,1500),data=data)
for i in range(len(txt)):
plt.annotate(txt[i],xy=(x[i],y[i]))
plt.ylabel('熱度')
plt.xlabel('銷量')
plt.legend(loc='upper left')
plt.show()
由上圖所示:越靠上的品牌熱度越高,越靠右的品牌銷量越高,顏色越深圈越大價(jià)格越高
- 熱度與銷量呈現(xiàn)一定的正相關(guān)凿跳;
- 美寶蓮熱度第一件豌,銷量第二,妮維雅熱度第二控嗜,銷量第四茧彤,兩者價(jià)格均相對(duì)較低;
- 價(jià)格低的品牌熱度和銷量相對(duì)較高疆栏,價(jià)格高的品牌熱度和銷量相對(duì)較低曾掂,說(shuō)明價(jià)格在熱度和銷量中有一定影響;
3.5 各品牌價(jià)格
#查看價(jià)格的箱型圖
plt.figure(figsize=(14,6))
sns.boxplot(x='店名',y='price',data=data)
plt.ylim(0,3000)#如果不限制壁顶,就不容易看清箱型珠洗,所以把Y軸刻度縮小為0-3000
plt.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='各品牌平均價(jià)格')
y = data['price'].mean()
plt.axhline(y,0,5,color='r',label='全品牌平均價(jià)格')
plt.ylabel('各品牌平均價(jià)格')
plt.title('各品牌產(chǎn)品的平均價(jià)格',fontsize=24)
plt.legend(loc='best')
plt.show()
- 嬌蘭、SKII若专、雪花秀许蓖、雅詩(shī)蘭黛、蘭蔻调衰、資生堂這幾個(gè)國(guó)際大牌的產(chǎn)品價(jià)格很高膊爪,產(chǎn)品平均價(jià)格都在500以上,都是一線大牌嚎莉;
- 蘭芝米酬、倩碧、玉蘭油趋箩、植村秀赃额、佰草集、薇姿阁簸、雅漾的平均價(jià)格在300-400元左右爬早,其中佰草集是最貴的國(guó)貨品牌;
- 美加凈作為國(guó)貨品牌启妹,性價(jià)比高,平均價(jià)格最低醉旦,妮維雅的平均價(jià)格第二低饶米,在100元左右;
- 全品牌平均價(jià)格低于400元车胡,除了前五個(gè)國(guó)際大牌其余品牌的平均價(jià)格都低于全品牌平均價(jià)格檬输;
plt.figure(figsize=(12,10))
x = data.groupby('店名')['sale_count'].mean()
y = data.groupby('店名')['銷售額'].mean()
s = avg_price
txt = data.groupby('店名').id.count().index
sns.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)) #在散點(diǎn)后面增加品牌信息的標(biāo)簽
plt.ylabel('銷售額')
plt.xlabel('銷量')
plt.legend(loc='upper left')
plt.show()
由上圖所示,越靠上代表銷售額越高匈棘,越靠左代表銷量越高丧慈,圖形越大代表平均價(jià)格越高
- 銷售量和銷售額呈現(xiàn)正相關(guān);
- 相宜本草、美寶蓮逃默、蜜絲佛陀銷量和銷售額位居前三鹃愤,且平均價(jià)格居中;
- 說(shuō)明銷量銷售額與價(jià)格有很重要的聯(lián)系完域;
3.6 男性護(hù)膚品銷量情況
gender_data=data[data['是否男士專用']=='是']
gender_data_1=gender_data[(gender_data.main_type =='護(hù)膚品')| (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('男士護(hù)膚品銷量排名')
gender_data.groupby('店名').銷售額.sum().sort_values(ascending=True).plot(kind='barh',width=0.8,ax=ax2)
ax2.set_title('男士護(hù)膚品銷售額排名')
plt.subplots_adjust(wspace=0.4)
plt.show()
- 男士購(gòu)買的大多是護(hù)膚品软吐;
- 妮維雅是男生護(hù)膚品中銷量遙遙領(lǐng)先的品牌,第二第三分別為歐萊雅吟税、相宜本草凹耙;
3.7 分析時(shí)間與銷量的關(guān)系,體現(xiàn)購(gòu)買高峰期
from matplotlib.pyplot import MultipleLocator
plt.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軸的刻度間隔設(shè)置為1肠仪,并存在變量里
ax=plt.gca() #ax為兩條坐標(biāo)軸的實(shí)例
ax.xaxis.set_major_locator(x_major_locator)
#把x軸的主刻度設(shè)置為1的倍數(shù)
plt.xlabel('日期(11月)')
plt.ylabel('銷量')
plt.show()
總結(jié)
- 美妝類別中護(hù)膚品銷量遠(yuǎn)大于化妝品肖抱,其中清潔類、化妝水异旧、面霜等基礎(chǔ)護(hù)膚類銷量最高意述;
- 男士購(gòu)買美妝集中在護(hù)膚品類,其中妮維雅品牌是最受男士喜愛的品牌泽艘;
- 價(jià)格和熱度對(duì)銷售量有關(guān)聯(lián)欲险,平價(jià)基礎(chǔ)產(chǎn)品是大多數(shù)消費(fèi)者的選擇;
- 由于商家在雙十一提前預(yù)熱匹涮,巨大的優(yōu)惠力度和為了避免網(wǎng)絡(luò)高峰天试,不少消費(fèi)者選擇提前消費(fèi),銷量高峰出現(xiàn)在雙十一前幾天然低;雙十一后3天商家持續(xù)打折優(yōu)惠喜每,消費(fèi)者還保有購(gòu)物余熱,但遠(yuǎn)不如雙十一之前雳攘。
建議
- 消費(fèi)者對(duì)產(chǎn)品價(jià)格和熱度關(guān)注度較高带兜,品牌可以適當(dāng)調(diào)整產(chǎn)品價(jià)格并通過(guò)諸如網(wǎng)絡(luò)社交平臺(tái)的方式提高品牌熱度;
- 對(duì)于男性消費(fèi)者吨灭,品牌可以定向推薦平價(jià)基礎(chǔ)護(hù)膚產(chǎn)品刚照,在銷量中可以看到也有一部分男性購(gòu)買化妝品,品牌可以在護(hù)膚品中適當(dāng)捆綁化妝品產(chǎn)品帶動(dòng)消費(fèi)喧兄;
- 消費(fèi)者購(gòu)買欲望并不集中在雙十一當(dāng)天无畔,商家可以提前預(yù)熱加大優(yōu)惠力度刺激消費(fèi)者提前消費(fèi),避免網(wǎng)絡(luò)高峰吠冤。