当前位置:   article > 正文

客户消费偏好数据实战分析_客户消费偏好数据实战分析、

客户消费偏好数据实战分析、

读取数据

In [1]:

import pandas as pd

In [2]:

df = pd.read_csv("/home/mw/input/data9408/shopping_trends.csv")
df.head()

Out[2]:

Customer IDAgeGenderItem PurchasedCategoryPurchase Amount (USD)LocationSizeColorSeasonReview RatingSubscription StatusShipping TypeDiscount AppliedPromo Code UsedPrevious PurchasesPayment MethodFrequency of Purchases
0155MaleBlouseClothing53KentuckyLGrayWinter3.1YesExpressYesYes14VenmoFortnightly
1219MaleSweaterClothing64MaineLMaroonWinter3.1YesExpressYesYes2CashFortnightly
2350MaleJeansClothing73MassachusettsSMaroonSpring3.1YesFree ShippingYesYes23Credit CardWeekly
3421MaleSandalsFootwear90Rhode IslandMMaroonSpring3.5YesNext Day AirYesYes49PayPalWeekly
4545MaleBlouseClothing49OregonMTurquoiseSpring2.7YesFree ShippingYesYes31PayPalAnnually

数据预处理

In [3]:

# 缺失值
df.dropna(axis=0, inplace=True)

# 删除重复值
df.drop_duplicates(keep="first", inplace=True)

# 删除 "Customer ID" 列
df.drop("Customer ID", axis=1, inplace=True)

# 列名汉化
df.rename(columns={"Age":"年龄","Gender":"性别","Item Purchased":"购买的商品","Category":"商品类别","Purchase Amount (USD)":"消费金额(美元)",\
 "Location":"购买地点","Size":"商品尺码","Color":"商品颜色","Season":"购买商品的季节","Review Rating":"客户评分","Subscription Status":"是否订阅",\
 "Shipping Type":"配送方式","Discount Applied":"是否折扣","Promo Code Used":"是否使用优惠码","Previous Purchases":"客户历史购买总数(不包括当前交易)",\
 "Payment Method":"支付方式","Frequency of Purchases":"客户购买频率"},inplace=True)

df.head()

Out[3]:

年龄性别购买的商品商品类别消费金额(美元)购买地点商品尺码商品颜色购买商品的季节客户评分是否订阅配送方式是否折扣是否使用优惠码客户历史购买总数(不包括当前交易)支付方式客户购买频率
055MaleBlouseClothing53KentuckyLGrayWinter3.1YesExpressYesYes14VenmoFortnightly
119MaleSweaterClothing64MaineLMaroonWinter3.1YesExpressYesYes2CashFortnightly
250MaleJeansClothing73MassachusettsSMaroonSpring3.1YesFree ShippingYesYes23Credit CardWeekly
321MaleSandalsFootwear90Rhode IslandMMaroonSpring3.5YesNext Day AirYesYes49PayPalWeekly
445MaleBlouseClothing49OregonMTurquoiseSpring2.7YesFree ShippingYesYes31PayPalAnnually

开始刷题

任务1

主管想了解那哪个年龄段的客户数量以及消费能力最高;

需要你先新增一列数据根据客户年龄对客户进行划分,划分区间将根据下表进行划定;之后根据所划分的结果统计各个年龄段的客户数量及消费金额的均值;

之后依据年龄岁数递增输出各年龄段的客户数量及消费金额的均值。

  • 年龄划分表
年龄区间年龄段标签
(0,19]0-19
[20,29]20-29
[30,39]30-39
[40,49]40-49
[50,59]50-59
[60,1000]60及以上

In [4]:

# 你的代码
#对客户年龄进行分组,pd.cut
import numpy as np
df['年龄标签']=pd.cut(df['年龄'],bins=[0,19,29,39,49,59,1000],labels=['0-19','20-29','30-39','40-49','50-59','60及以上'])
df[['年龄标签','消费金额(美元)']].groupby(['年龄标签']).agg(['count','mean']).rename(columns={'count':'客户数量','mean':'消费金额均值'})

Out[4]:

消费金额(美元)
客户数量消费金额均值
年龄标签
0-1915060.533333
20-2972860.199176
30-3972460.139503
40-4973958.491204
50-5977160.332036
60及以上78859.510152

任务2

客户想了解不同年龄段的客户的购物倾向是什么情况;

需要你分别统计各年龄段客户购买各类商品的次数,以及统计各类商品的不同尺码、不同颜色分别售出的次数;

最后分别输出不同年龄段的客户购买数量最多的商品是哪个,并输出该商品种类中被购买最多的尺码及颜色。

In [5]:

df.columns

Out[5]:

Index(['年龄', '性别', '购买的商品', '商品类别', '消费金额(美元)', '购买地点', '商品尺码', '商品颜色',
       '购买商品的季节', '客户评分', '是否订阅', '配送方式', '是否折扣', '是否使用优惠码',
       '客户历史购买总数(不包括当前交易)', '支付方式', '客户购买频率', '年龄标签'],
      dtype='object')

In [6]:

# 你的代码
df.columns
#统计各年龄段客户购买各类商品的次数
df2_1=df.groupby(['年龄标签','购买的商品']).size().reset_index(name='购买次数')
#size():这个函数用于计算每个分组中的元素数量。在这里,它计算的是每个年龄段和商品组合的购买次数。
#reset_index:这一部分将.size()返回的Series转换回DataFrame,并将计算得到的购买次数列命名为“xxx”。
#统计各类商品的不同尺码、不同颜色分别售出的次数
df2_2=df.groupby(['购买的商品','商品尺码','商品颜色']).size().reset_index(name='购买次数')
#不同年龄段的客户购买数量最多的商品是哪个,
df2_3=df2_1.sort_values(by=['年龄标签', '购买次数'], ascending=[True, False]).groupby('年龄标签').head(1)
#对应的该商品种类中被购买最多的尺码及颜色
product=df2_3['购买的商品'].tolist()
df2_2[df2_2['购买的商品'].isin(product)].sort_values(by=['购买次数'],ascending=False).groupby('购买的商品').head(1)
#values_count,idmax, 这里可以整理一下 size,reset_index

Out[6]:

购买的商品商品尺码商品颜色购买次数
1381SkirtLBlack8
888JewelryMGray7
750JacketMBlue7
333CoatMViolet7
174BlouseMMagenta5

任务3

主管想了解不同性别的客户在购物时的消费金额及购物频率是什么情况;

需要你对不同性别的客户统计其消费金额的均值以及在该类别的客户中不同购买频率的出现次数;

最后先依据消费金额的均值降序输出不同类别客户的消费金额的均值,再分别输出不同性别客户购买频率的众数。

In [7]:

from scipy import stats
help(stats.mode)

In [8]:

# 你的代码
print('-'*50,'\n','不同性别的客户统计其消费金额的均值')
print(df.groupby(['性别']).agg(['mean'])['消费金额(美元)'].rename(columns={'mean':'消费金额均值'}))
print('-'*50,'\n','不同性别客户购买频率的出现次数')
print(df.groupby(['性别','客户购买频率']).size().reset_index(name='出现次数'))
print('-'*50,'\n','不同类别客户的消费金额的均值')
print(df.groupby(['性别','客户购买频率']).agg(['mean'])['消费金额(美元)'].rename(columns={'mean':'消费金额均值'}).sort_values(by='消费金额均值',ascending=False))
print('-'*50,'\n','不同性别客户购买频率的众数')
print(df.groupby('性别')['客户购买频率'].apply(lambda x:x.mode()))#x.mode()求众数的函数
##有点复杂的求出不同性别客户购买频率的众数
#a=df.groupby(['性别','客户购买频率']).size().reset_index(name='出现次数')#先把不同性别不同购买频率的出现次数求出来
#a.iloc[a.groupby('性别')['出现次数'].idxmax().tolist()]#定位到男/女的出现次数最大值的index,在用iloc索引数据
-------------------------------------------------- 
 不同性别的客户统计其消费金额的均值
           消费金额均值
性别               
Female  60.249199
Male    59.536199
-------------------------------------------------- 
 不同性别客户购买频率的出现次数
        性别          客户购买频率  出现次数
0   Female        Annually   185
1   Female       Bi-Weekly   188
2   Female  Every 3 Months   186
3   Female     Fortnightly   163
4   Female         Monthly   185
5   Female       Quarterly   169
6   Female          Weekly   172
7     Male        Annually   387
8     Male       Bi-Weekly   359
9     Male  Every 3 Months   398
10    Male     Fortnightly   379
11    Male         Monthly   368
12    Male       Quarterly   394
13    Male          Weekly   367
-------------------------------------------------- 
 不同类别客户的消费金额的均值
                          消费金额均值
性别     客户购买频率                   
Female Every 3 Months  62.161290
       Quarterly       61.940828
Male   Bi-Weekly       61.103064
Female Annually        60.194595
Male   Annually        60.162791
Female Monthly         59.935135
       Bi-Weekly       59.914894
Male   Weekly          59.264305
       Quarterly       59.144670
Female Fortnightly     59.122699
Male   Every 3 Months  59.110553
       Monthly         59.027174
       Fortnightly     59.023747
Female Weekly          58.348837
-------------------------------------------------- 
 不同性别客户购买频率的众数
性别       
Female  0         Bi-Weekly
Male    0    Every 3 Months
Name: 客户购买频率, dtype: object

任务4

主管想了解在哪个季节时间段内前来消费购物的客户数量最多,并想知道季节时间段的不同是否会影响客户选择不同的配送方式;

需要你统计不同购买商品的季节中各个季节的出现次数,并根据数量降序输出结果,同时统计不同季节时间段内客户选择配送方式出现的次数,并分别输出次数最高的配送方式是哪种。

In [9]:

# 你的代码
#统计不同购买商品的季节中各个季节的出现次数,并根据数量降序输出结果
print('-'*50,'\n','不同购买商品的季节中各个季节的出现次数')
df4_1=df.groupby(['购买商品的季节']).size().reset_index(name='出现次数').sort_values(by=['出现次数'],ascending=False).reset_index(drop=True)
print(df4_1)
#统计不同季节时间段内客户选择配送方式出现的次数,并分别输出次数最高的配送方式是哪种
print('-'*50,'\n','各个季节选择选择最多的配送方式')
df4_2=df.groupby(['购买商品的季节','配送方式']).size().reset_index(name='出现次数').sort_values(by=['出现次数'],ascending=False).groupby(['购买商品的季节']).head(1)
print(df4_2)
-------------------------------------------------- 
 不同购买商品的季节中各个季节的出现次数
  购买商品的季节  出现次数
0  Spring   999
1    Fall   975
2  Winter   971
3  Summer   955
-------------------------------------------------- 
 各个季节选择选择最多的配送方式
   购买商品的季节            配送方式  出现次数
14  Summer   Free Shipping   179
6   Spring  2-Day Shipping   178
21  Winter    Next Day Air   176
3     Fall    Next Day Air   171

任务5

主管想了解哪个年龄段的客户会更愿意购买折扣商品以及使用优惠码购物;

需要你统计不同年龄段的客户购买的商品中属于折扣商品的数量百分比以及使用优惠码的商品数量百分比;

之后依据折扣商品的数量百分比降序输出,如果出现折扣商品数量相同的情况,则依据使用优惠码的商品的数量百分比降序输出。

In [10]:

# 你的代码
#统计不同年龄段的客户购买的商品中属于折扣商品的数量百分比以及使用优惠码的商品数量百分比
#不同年龄段的客户数量
df5_1=df.groupby('年龄标签').count().iloc[:,0]
#购买折扣商品的客户数量
df5_2=df[df['是否折扣']=='Yes'].groupby('年龄标签').count().iloc[:,0]
#使用优惠码的客户数量
df5_3=df[df['是否使用优惠码']=='Yes'].groupby('年龄标签').count().iloc[:,0]
#组合成新表,并计算比例
df5_4=pd.concat([df5_1,df5_2,df5_3],axis=1)
df5_4.columns=['客户数量','购买折扣商品的客户数量','使用折扣码的客户数量']
df5_4['购买折扣商品的%']=round(df5_4['购买折扣商品的客户数量']/df5_4['客户数量']*100,2)
df5_4['使用折扣码的%']=round(df5_4['使用折扣码的客户数量']/df5_4['客户数量']*100,2)
df5_4.sort_values(by=['购买折扣商品的%','使用折扣码的%'],ascending=[False,False])

Out[10]:

客户数量购买折扣商品的客户数量使用折扣码的客户数量购买折扣商品的%使用折扣码的%
年龄标签
20-2972832032043.9643.96
60及以上78834534543.7843.78
30-3972431631643.6543.65
50-5977133633643.5843.58
0-19150626241.3341.33
40-4973929829840.3240.32

任务6

主管想了解哪种商品的客户评分较高以及哪种商品销量最好;

需要你统计不同种类商品的客户评分的均值,之后再统计在均值最高的一类商品中,不同商品的出现次数;

最后依据客户评分均值升序输出结果以及输出均值最高的一类商品出现次数最多的商品是哪个。

In [13]:

# 你的代码
#不同种类商品的客户评分的均值
print('不同种类商品的客户评分的均值')
print(df.groupby(['商品类别'])['客户评分'].mean().reset_index(name='客户评分均值').sort_values(by=['客户评分均值'],ascending=False))
#在均值最高的一类商品中,不同商品的出现次数
higtavgrating=df.groupby(['商品类别'])['客户评分'].mean().reset_index(name='客户评分均值').sort_values(by=['客户评分均值'],ascending=False)['商品类别'][2]
df[df['商品类别']==higtavgrating]['购买的商品'].value_counts()
most=df[df['商品类别']==higtavgrating]['购买的商品'].value_counts().idxmax()
print('客户评分均值最高的商品类别是{},其中商品出现次数最多的商品是{}'.format(higtavgrating,most))
不同种类商品的客户评分的均值
          商品类别    客户评分均值
2     Footwear  3.790651
0  Accessories  3.768629
3    Outerwear  3.746914
1     Clothing  3.723143
客户评分均值最高的商品类别是Footwear,其中商品出现次数最多的商品是Sandals

任务7

主管想了解客户消费金额的高低是否会影响客户选择不同的支付方式;

需要你统计使用不同支付方式进行支付的金额的均值及使用的次数,之后再计算不同支付方式使用占比;

最后依据消费金额的均值降序输出结果。

In [26]:

# 你的代码
#使用不同支付方式进行支付的金额的均值及使用的次数
df7_1=df.groupby('支付方式')['消费金额(美元)'].agg(['count','mean']).reset_index().rename(columns={'count':'使用次数','mean':'支付金额均值'}).sort_values(by=['支付金额均值'],ascending=False)
df7_1['使用占比']=round(df7_1['使用次数']/df7_1['使用次数'].sum()*100,2)
print(df7_1)
            支付方式  使用次数     支付金额均值   使用占比
3     Debit Card   636  60.915094  16.31
2    Credit Card   671  60.074516  17.21
0  Bank Transfer   612  59.712418  15.69
1           Cash   670  59.704478  17.18
4         PayPal   677  59.245199  17.36
5          Venmo   634  58.949527  16.26

任务8

主管想了解女性客户中的客户购买频率是如何分布的;

需要你先提取合适的数据,之后再统计不同购买频率的出现次数;

最好依据购买频率的出现次数升序输出结果。

In [54]:

# 你的代码
#女性客户购买的数据
df8_1=df[df['性别']=='Female']
#统计不同购买频率的出现次数
df8_1['客户购买频率'].value_counts()
#用饼图展示
import matplotlib.pyplot as plt
plt.figure(figsize=(5, 5)) 
total=df8_1['客户购买频率'].value_counts().sum()
data=df8_1['客户购买频率'].value_counts().values
patches, texts, autotexts=plt.pie(data,labels=df8_1['客户购买频率'].value_counts().index,autopct=lambda p: '{:.0f}\n({:.1f}%)'.format(p * total / 100, p))#为了把使用次数也展示出来
for text, autotext in zip(texts, autotexts):
        x = autotext.get_position()[0]
        y = autotext.get_position()[1]

        text.set_position((x*1.8, y*1.8))
plt.show()

任务9

主管想了解不同年龄段的客户中,不同购物频率的客户数量各有多少;

需要你使用数据透视表将结果以 Dataframe 的格式输出;其中 Dataframe 的列名使用年龄段的值进行表示,索引值使用不同的购物频率表示。

In [55]:

df.head()

Out[55]:

年龄性别购买的商品商品类别消费金额(美元)购买地点商品尺码商品颜色购买商品的季节客户评分是否订阅配送方式是否折扣是否使用优惠码客户历史购买总数(不包括当前交易)支付方式客户购买频率年龄标签
055MaleBlouseClothing53KentuckyLGrayWinter3.1YesExpressYesYes14VenmoFortnightly50-59
119MaleSweaterClothing64MaineLMaroonWinter3.1YesExpressYesYes2CashFortnightly0-19
250MaleJeansClothing73MassachusettsSMaroonSpring3.1YesFree ShippingYesYes23Credit CardWeekly50-59
321MaleSandalsFootwear90Rhode IslandMMaroonSpring3.5YesNext Day AirYesYes49PayPalWeekly20-29
445MaleBlouseClothing49OregonMTurquoiseSpring2.7YesFree ShippingYesYes31PayPalAnnually40-49

In [82]:

# 你的代码
#数据透视表,pivot_table
df9_1=pd.pivot_table(df,values=['购买的商品'],index=['客户购买频率'],columns=['年龄标签'],aggfunc='size')
df9_1
#aggfunc='size':聚合函数设置为'size',用于计算每个组合(即特定年龄段和购物频率的组合)中的元素数量。

Out[82]:

年龄标签0-1920-2930-3940-4950-5960及以上
客户购买频率
Annually20101109106105131
Bi-Weekly221258810211199
Every 3 Months27105121111107113
Fortnightly2794106102109104
Monthly1799107116109105
Quarterly221119293117128
Weekly1593101109113108

任务10

主管想了解不同年龄段的客户中不同性别的客户的历史购物次数(需要包括当前交易)的情况如何;

需要你使用数据透视表计算不同年龄段客户历史购物次数(包括当前交易)的均值,并将结果以 Dataframe 的格式输出;其中 Dataframe 的列名使用年龄段的值进行表示,索引值使用不同的性别值表示。

结果保留两位小数

In [94]:

# 你的代码
df['客户历史购买总数(包括当前交易)']=df['客户历史购买总数(不包括当前交易)']+1
df10=pd.pivot_table(df,values=['客户历史购买总数(包括当前交易)'],index=['性别'],columns=['年龄标签'],aggfunc='mean')
df10.round(2)

Out[94]:

客户历史购买总数(包括当前交易)
年龄标签0-1920-2930-3940-4950-5960及以上
性别
Female23.2826.4725.224.7326.3125.80
Male24.1725.8826.226.5727.6227.64
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/742521
推荐阅读
相关标签
  

闽ICP备14008679号