赞
踩
读取数据
In [1]:
import pandas as pdIn [2]:
df = pd.read_csv("/home/mw/input/data9408/shopping_trends.csv") df.head()Out[2]:
Customer ID 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 0 1 55 Male Blouse Clothing 53 Kentucky L Gray Winter 3.1 Yes Express Yes Yes 14 Venmo Fortnightly 1 2 19 Male Sweater Clothing 64 Maine L Maroon Winter 3.1 Yes Express Yes Yes 2 Cash Fortnightly 2 3 50 Male Jeans Clothing 73 Massachusetts S Maroon Spring 3.1 Yes Free Shipping Yes Yes 23 Credit Card Weekly 3 4 21 Male Sandals Footwear 90 Rhode Island M Maroon Spring 3.5 Yes Next Day Air Yes Yes 49 PayPal Weekly 4 5 45 Male Blouse Clothing 49 Oregon M Turquoise Spring 2.7 Yes Free Shipping Yes Yes 31 PayPal Annually 数据预处理
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]:
年龄 性别 购买的商品 商品类别 消费金额(美元) 购买地点 商品尺码 商品颜色 购买商品的季节 客户评分 是否订阅 配送方式 是否折扣 是否使用优惠码 客户历史购买总数(不包括当前交易) 支付方式 客户购买频率 0 55 Male Blouse Clothing 53 Kentucky L Gray Winter 3.1 Yes Express Yes Yes 14 Venmo Fortnightly 1 19 Male Sweater Clothing 64 Maine L Maroon Winter 3.1 Yes Express Yes Yes 2 Cash Fortnightly 2 50 Male Jeans Clothing 73 Massachusetts S Maroon Spring 3.1 Yes Free Shipping Yes Yes 23 Credit Card Weekly 3 21 Male Sandals Footwear 90 Rhode Island M Maroon Spring 3.5 Yes Next Day Air Yes Yes 49 PayPal Weekly 4 45 Male Blouse Clothing 49 Oregon M Turquoise Spring 2.7 Yes Free Shipping Yes Yes 31 PayPal Annually 开始刷题
任务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-19 150 60.533333 20-29 728 60.199176 30-39 724 60.139503 40-49 739 58.491204 50-59 771 60.332036 60及以上 788 59.510152 任务2
客户想了解不同年龄段的客户的购物倾向是什么情况;
需要你分别统计各年龄段客户购买各类商品的次数,以及统计各类商品的不同尺码、不同颜色分别售出的次数;
最后分别输出不同年龄段的客户购买数量最多的商品是哪个,并输出该商品种类中被购买最多的尺码及颜色。
In [5]:
df.columnsOut[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_indexOut[6]:
购买的商品 商品尺码 商品颜色 购买次数 1381 Skirt L Black 8 888 Jewelry M Gray 7 750 Jacket M Blue 7 333 Coat M Violet 7 174 Blouse M Magenta 5 任务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-29 728 320 320 43.96 43.96 60及以上 788 345 345 43.78 43.78 30-39 724 316 316 43.65 43.65 50-59 771 336 336 43.58 43.58 0-19 150 62 62 41.33 41.33 40-49 739 298 298 40.32 40.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]:
年龄 性别 购买的商品 商品类别 消费金额(美元) 购买地点 商品尺码 商品颜色 购买商品的季节 客户评分 是否订阅 配送方式 是否折扣 是否使用优惠码 客户历史购买总数(不包括当前交易) 支付方式 客户购买频率 年龄标签 0 55 Male Blouse Clothing 53 Kentucky L Gray Winter 3.1 Yes Express Yes Yes 14 Venmo Fortnightly 50-59 1 19 Male Sweater Clothing 64 Maine L Maroon Winter 3.1 Yes Express Yes Yes 2 Cash Fortnightly 0-19 2 50 Male Jeans Clothing 73 Massachusetts S Maroon Spring 3.1 Yes Free Shipping Yes Yes 23 Credit Card Weekly 50-59 3 21 Male Sandals Footwear 90 Rhode Island M Maroon Spring 3.5 Yes Next Day Air Yes Yes 49 PayPal Weekly 20-29 4 45 Male Blouse Clothing 49 Oregon M Turquoise Spring 2.7 Yes Free Shipping Yes Yes 31 PayPal Annually 40-49 In [82]:
# 你的代码 #数据透视表,pivot_table df9_1=pd.pivot_table(df,values=['购买的商品'],index=['客户购买频率'],columns=['年龄标签'],aggfunc='size') df9_1 #aggfunc='size':聚合函数设置为'size',用于计算每个组合(即特定年龄段和购物频率的组合)中的元素数量。Out[82]:
年龄标签 0-19 20-29 30-39 40-49 50-59 60及以上 客户购买频率 Annually 20 101 109 106 105 131 Bi-Weekly 22 125 88 102 111 99 Every 3 Months 27 105 121 111 107 113 Fortnightly 27 94 106 102 109 104 Monthly 17 99 107 116 109 105 Quarterly 22 111 92 93 117 128 Weekly 15 93 101 109 113 108 任务10
主管想了解不同年龄段的客户中不同性别的客户的历史购物次数(需要包括当前交易)的情况如何;
需要你使用数据透视表计算不同年龄段客户历史购物次数(包括当前交易)的均值,并将结果以 Dataframe 的格式输出;其中 Dataframe 的列名使用年龄段的值进行表示,索引值使用不同的性别值表示。
结果保留两位小数
In [94]:
# 你的代码 df['客户历史购买总数(包括当前交易)']=df['客户历史购买总数(不包括当前交易)']+1 df10=pd.pivot_table(df,values=['客户历史购买总数(包括当前交易)'],index=['性别'],columns=['年龄标签'],aggfunc='mean') df10.round(2)Out[94]:
客户历史购买总数(包括当前交易) 年龄标签 0-19 20-29 30-39 40-49 50-59 60及以上 性别 Female 23.28 26.47 25.2 24.73 26.31 25.80 Male 24.17 25.88 26.2 26.57 27.62 27.64
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。