项目背景
美国圣诞节大采购一般是从感恩节之后开始的。感恩节是每年11月的第四个星期四。因此它的第二天,也就是美国人大采购的第一天。在这一天,美国的商场都会推出大量的打折和优惠活动,以在年底进行最后一次大规模的促销。这有点类似于淘宝的双十一购物节。项目中所使用的数据是零售商店中黑色星期五的约54万条交易样本数据,商店希望更加了解用户购买行为。所以本项目通过总结本次“黑五”销售状况,分析和研究不同用户对不同产品的购买行为来为下一次“黑五”提供相关参考。
字段说明
字段 | 含义 |
User_ID | 用户编码 |
Product_ID | 产品编码 |
Gender | 性别 (M为男性,F为女性) |
Age | 年龄(0-17,18-25,26-35,36-45,46-50,51-55,55+ 7种) |
Occupation | 职业(用数字代表具体职业,一共有20种职业) |
City_Category | 城市分类(分为三类城市:ABC) |
Stay_In_Current_City_Years | 在目前城市的居住的年数 (0,1,2,3,4+5种) |
Marital_Status | 婚姻状况 (0代表未婚,1代表已婚) |
Product_Category_1 | 产品分类为1(不能为空) |
Product_Category_2 | 产品分类为2(可以为空) |
Product_Category_3 | 产品分类为3(可以为空) |
Purchase | 购买金额 (单位为美元) |
数据总览
import pandas as pd
data=pd.read_csv('BlackFriday.csv')
data.drop_duplicates(inplace=True)#去重
print(data.info())
Data columns (total 12 columns):
User_ID 537577 non-null int64
Product_ID 537577 non-null object
Gender 537577 non-null object
Age 537577 non-null object
Occupation 537577 non-null int64
City_Category 537577 non-null object
Stay_In_Current_City_Years 537577 non-null object
Marital_Status 537577 non-null int64
Product_Category_1 537577 non-null int64
Product_Category_2 370591 non-null float64
Product_Category_3 164278 non-null float64
Purchase 537577 non-null int64
dtypes: float64(2), int64(5), object(5)
数据集中共有约54万条数据,Product_Category_1 不能为空,Product_Category_2 和Product_Category_3 可以为空。因此数据不存在缺失值。
数据分析内容
该项目我们从,销售画像,用户画像、商品画像三方面来进行分析
销售画像
销售画像将从以下销售情况,用户情况,商品情况,这三个方面进行分析。
销售情况:
print(data['Purchase'].sum())
此次‘黑色星期五’总成交额达到了5017668378美元。
用户情况:
print(data.shape[0])
参与人次达到了537577。
print(data['Purchase'].mean())
单笔消费金额的均值为9333.859852635065美元。
print(len(data['User_ID'].unique()))
参与人数为5891人
product_category=len(data['Product_ID'].unique())
print(product_category)
购买商品共有3623种
用户画像
用户画像将从用户性别,年龄,职业,婚姻情况,居住时间,所处城市几方面加以分析。
用户性别分析:
data.drop_duplicates('User_ID').groupby('Gender')['User_ID'].count().plot(kind='pie',labels=['女','男'])
我们发现参与购物节的男性数量要远多于女性,男性占比71.23%,女性占比28.28%。
购买金额与性别的关系:
data.groupby('Gender')['Purchase'].sum().plot(kind='pie',labels=['女','男'],autopct='%3.2f%%')
从中我们可以发现,消费金额中,男性约为女性的3倍。
用户年龄分析:
print(data.drop_duplicates('User_ID').groupby('Age')['User_ID'].count())
Age
0-17 218
18-25 1069
26-35 2053
36-45 1167
46-50 531
51-55 481
55+ 372
我们可视化年龄分布
data.drop_duplicates('User_ID').groupby('Age')['User_ID'].count().sort_values().plot(kind='barh',color=['r','g','b', 'c', 'm', 'y'])
print(data['Age'].value_counts())
plt.xlabel('年龄')
plt.ylabel('人数')
下面我们看一下不同年龄对于此次购物节的消费贡献。
data.groupby('Age')['Purchase'].sum().sort_values().plot(kind='barh',color=['r','g','b', 'c', 'm', 'y'])
plt.xlabel('销售金额')
plt.ylabel('年龄')
我们可以发现26-45岁的人群是购物的主力军,26-35岁销售额的贡献最多。
用户职业分析:
用户职业分布
user_occupation=data.drop_duplicates('User_ID').groupby('Occupation')['User_ID'].count()
data.drop_duplicates('User_ID').groupby('Occupation')['User_ID'].count().sort_values(ascending=False).plot(kind='bar',color=['c', 'm', 'y'])
plt.xlabel('职业')
plt.ylabel('人数')
Occupation
0 688
1 517
2 256
3 170
4 740
5 111
6 228
7 669
8 17
9 88
10 192
11 128
12 376
13 140
14 294
15 140
16 235
17 491
18 67
19 71
20 273
我们可以发现不同职业对于购物节的参与情况是不同的,4,0,7三个职业用户数占总用户数的35.6%。
通过对不同职业购物金额的分析,依旧是4,0,7三个职业对购物街的贡献最大。
data.groupby('Occupation')['Purchase'].sum().sort_values(ascending=True).plot(kind='barh',color=['c', 'm', 'y'])
plt.xlabel('金额')
plt.ylabel('职业')
用户婚姻状况和消费分析:
用户的婚姻状况分析
data.drop_duplicates('User_ID').groupby('Marital_Status')['User_ID'].count().plot(kind='pie',labels=['未婚','已婚'],autopct='%3.2f%%')
我们发现本次购物节的用户中未婚人数占比略高于已婚人数。
下面我们来看不同婚姻状况下的消费情况:
data.groupby('Marital_Status')['Purchase'].sum().sort_values(ascending=True).plot(kind='bar',color=['c', 'm'])
plt.xlabel('婚姻状态')
plt.ylabel('消费金额')
购买总金额上,未婚人士更胜一筹。
用户所处城市分析:
data.drop_duplicates('User_ID').groupby('City_Category')['User_ID'].count().sort_values(ascending=False).plot(kind='bar',color=['c', 'm','y'])
plt.xlabel('城市')
plt.ylabel('人数')
本次购物节,C城市的参与人数最多。
data.groupby('City_Category')['Purchase'].sum().plot(kind='pie',autopct='%3.2f%%')
从购买金额来看B城市的购买总额最多。 A,C城的人均购买金额高于B城,这两个城市有很大的购买潜力。
居住年龄分析:
data.drop_duplicates('User_ID').groupby('Stay_In_Current_City_Years')['User_ID'].count().sort_values(ascending=False).plot(kind='bar',color=['c', 'm','y'])
plt.xlabel('居住时间(年)')
plt.ylabel('人数')
我们发现居住时间为1年的用户参与人数最多,其他居住时间的参与人数差别不大。
从消费金额上看,居住一年的是本次购物节的主力。
data.groupby('Stay_In_Current_City_Years')['Purchase'].sum().plot(kind='pie',autopct='%3.2f%%')
商品画像
商品画像将从商品的总体销量,不同性别消费者喜爱的商品,不同年龄者喜爱的消费商品,不同婚姻状况喜爱的消费商品,不同职业喜爱的消费商品,这几个方面进行分析。
购买量前十名的商品:
data['Product_ID'].value_counts().sort_values(ascending=False)[:10].plot(kind='barh',color=['r','g','b', 'c', 'm', 'y'])
plt.xlabel('购买数量')
plt.ylabel('商品名称')
不同性别购买量前十的商品:
女性用户购买量前十的商品:
data[data['Gender']=='F']['Product_ID'].value_counts()[:10].plot(kind='barh',color=['r','g','b', 'c', 'm', 'y'])
男性用户购买量前十的商品:
data[data['Gender']=='M']['Product_ID'].value_counts()[:10].plot(kind='barh',color=['r','g','b', 'c', 'm', 'y'])
我们查看一下男女都比较青睐的商品:
f=data[data['Gender']=='F']['Product_ID'].value_counts()[:10]
m=data[data['Gender']=='M']['Product_ID'].value_counts()[:10]
comm=[]
for i in f.index:
if i in m.index:
comm.append(i)
print(comm)
['P00265242', 'P00110742']
男女对于商品'P00265242',和'P00110742'都比较青睐。男女之间购买商品的重叠较小,可以对不同性别的用户推送不同的商品。
不同年龄购买前五名的商品:
plt.figure(figsize=(20,7*6))
age_value=data['Age'].unique()
count=0
for i in age_value:
count+=1
ax = plt.subplot(7,1,count)
data.groupby('Age')['Product_ID'].value_counts().loc[i].sort_values(ascending=False)[:5].plot(kind='barh',color=['r','b', 'c', 'm', 'y'])
plt.title(i)
我们可以很明显的发现不同年龄阶段所青睐的商品是不同的,可以根据不同年龄推荐不同的产品。
未婚和已婚的购买商品分析:
未婚购买商品分析:
data[data['Marital_Status']==0]['Product_ID'].value_counts()[:10].plot(kind='barh',color=['r','g','b', 'c', 'm', 'y'])
plt.xlabel('购买数量')
plt.ylabel('商品名称')
plt.title('未婚')
已婚购买商品分析:
data[data['Marital_Status']==1]['Product_ID'].value_counts()[:10].plot(kind='barh',color=['r','g','b', 'c', 'm', 'y'])
plt.xlabel('购买数量')
plt.ylabel('商品名称')
plt.title('已婚')
我们可以发现已婚和未婚的商品重叠度很高,他们都很青睐商品'P00265242', 'P00110742', 'P00025442', 'P00112142', 'P00057642', 'P00046742', 'P00184942' 。
不同职业对商品的喜好情况:
我们以4,0,7 这三个购买人数最多的职业进行分析
plt.figure(figsize=(20,3*6))
Occupation_category=[4,0,7]
count=0
for i in Occupation_category:
count+=1
ax = plt.subplot(3,1,count)
data[data['Occupation']==i]['Product_ID'].value_counts()[:10].sort_values(ascending=False)[:5].plot(kind='barh',color=['r','b', 'c', 'm', 'y'])
plt.title(i)
我们发现4,0,7三种职业喜欢的商品大致相同。
不同城市购买商品分析:
plt.figure(figsize=(20,3*6))
Occupation_category=data['City_Category'].unique()
count=0
for i in Occupation_category:
count+=1
ax = plt.subplot(3,1,count)
data[data['City_Category']==i]['Product_ID'].value_counts()[:10].sort_values(ascending=False)[:5].plot(kind='barh',color=['r','b', 'c', 'm', 'y'])
plt.title(i)
A,B,C三城市最受欢迎的商品都是P00265242,其他商品三座城市的青睐程度也相似,可见,ABC城市的人群在商品需求方面比较类似。
总结和建议
总结:
本项目从销售画像,用户画像、商品画像三个维度展开,利用python中的pandas库,结合matplotlib可视化展进行数据分析。
建议:
1. 本次活动中,最畅销商品P00265242产品,其次是P00110742,P00025442。可以利用爆款单品陈列在最主要位置,为其他商品引流,并增加畅销商品的库存量,以防断货。
2. 针对不同年龄,不同性别的购买者,所青睐的商品不同,针对这一特点,合理进行引流,设置针对不同年龄,不同性别的专区。尤其是针对年轻人这一消费的主力军。
3. 对城市C,需要应对可能出现的客流高峰,可提前采取相应的措施加以应对。下次购物节,可以针对城市C策划大型促销活动,更大的挖掘其消费潜力,以提升销量。
4.城市A和C的消费能力强。所以,平台需要有针对性的去维护好这些重点客户,可以适当增加一些满足其需求的中高档商品,更大的挖掘其购物潜力。