哪些因素对鞋价影响最大?

在这里插入图片描述
本数据集由DataFiniti的产品数据库提供的10000双女鞋及其产品信息的列表。数据集包括鞋名、品牌、价格等。每只鞋都有一个条目,每个价格都可以找到,有些鞋可能有多个条目。

一、数据处理

  • 读取数据集信息,观察数据
    在这里插入图片描述
  • 清洗数据
    删除我们不使用的列。我们是利用最大最小鞋平均价格进行分析,构造出平均价格与各特征的数据列,并去除空值,重复值。
df=df[['brand','categories','colors','dateAdded','dateUpdated','prices.amountMin','prices.amountMax',
       'reviews','prices.merchant','prices.size','prices.isSale','prices.currency']]
df['avg_price']=(df['prices.amountMax']+df['prices.amountMin'])/2
Brand=df[['brand','avg_price']].dropna()#大部分最大最小价格相同
Colors=df[['colors','avg_price']].dropna()
Reviews=df[['reviews','avg_price']].dropna()
Merchant=df[['prices.merchant','avg_price']].dropna()
Size=df[['prices.size','avg_price']].dropna()
NoNull_df=df.dropna()
dfp=df[['dateAdded','avg_price']].dropna()
dfp=dfp.drop_duplicates(subset=['dateAdded','avg_price'],keep=False)
dfp=df[['dateUpdated','avg_price']].dropna()
dfp=dfp.drop_duplicates(subset=['dateUpdated','avg_price'],keep=False)

二、分析各特征与鞋价的关系

  • 首先分析dateAdded、dateUpdated与鞋价
dfp=dfp.sort_values(by='dateAdded')
plt.plot(dfp['dateAdded'],dfp['avg_price'])
plt.xticks(rotation=45)
plt.xlabel('dateAdded')
plt.ylabel('avg_price')
plt.title('avg.price over the Dates Added:')

在这里插入图片描述

dfp=dfp.sort_values(by='dateUpdated')
plt.plot(dfp['dateUpdated'],dfp['avg_price'])
plt.xticks(rotation=45)
plt.xlabel('dateUpdated')
plt.ylabel('avg_price')
plt.title('avg_price over the Dates Updated:')

在这里插入图片描述

dfp=df[['dateAdded','dateUpdated','avg_price']].dropna()
dfp=dfp.drop_duplicates(subset=['dateUpdated','dateAdded','avg_price'],keep=False)
dfp=dfp.sort_values(by='dateAdded')#实际按dateAdded还是按dateUpdated排序都一样,两者时间类似,都能达到排序的效果
plt.plot(dfp['dateUpdated'],dfp['avg_price'],label='dateUpdated')
plt.plot(dfp['dateAdded'],dfp['avg_price'],label='dateAdded')
plt.xticks(rotation=45)
plt.xlabel('Dates Addded/Updated')
plt.ylabel('avg_price')
plt.title('avg_price over the Dates Added/Updated:')
plt.legend(loc='upper right')

在这里插入图片描述
从两者与价格的曲线图,发现不了时间与鞋价是如何变化的,所以我们进一步分析dateUpdated与dateAdded的差值与鞋价的关系。下图是时间差值与鞋价的曲线图,发现随着经过的时间越长,鞋子价格越便宜,但其中出现一些很突兀的值,所以可能存在异常值,我们界定鞋子价格大于800的为异常值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这是去除异常值后的图像,比之前的看起来舒服多了~

  • brand与鞋价
    通过品牌分组发现品牌存在大小写之分,所以对品牌进行大写处理。 在这里插入图片描述
Brando=Brand_dfm['brand'].apply(lambda x:x.upper())

在这里插入图片描述
在这里插入图片描述
鞋价最小值为0.99,最大值为3322.19,变化幅度好大,通过条形图查看价格是怎么变化的。
在这里插入图片描述

  • colors与鞋价
    我们按照颜色分组,对各颜色的价格求均值,。第一行颜色无效,需要去除:Colors_dfm=Colors_dfm[Colors_dfm.colors!=’,’]在这里插入图片描述
Colors_dfm=Colors_dfm.sort_values(by='avg_price')
x_axis=Colors_dfm['colors']
y_axis=Colors_dfm['avg_price']
def scatterplot(x_axis,y_axis):
    y_axis=np.array(y_axis)
    x_axis=np.array(x_axis)
    plt.scatter(x_axis,y_axis,color='r')
scatterplot(x_axis,y_axis)    
plt.show()

在这里插入图片描述
颜色与鞋价的变化趋势与品牌相似。

  • prices.merchant 与鞋价
    在这里插入图片描述
    在这里插入图片描述
    不同品牌,鞋价不同,从左往右鞋价逐渐降低。进一步观察鞋价最高的前十家商家和鞋价最低的后十家商家。Shoesbyclaire 和JewelsObsession这两个商家的鞋价比较高,其他商家的鞋价逐渐降低,所以商家对鞋价还是有一定影响的。在这里插入图片描述
    在这里插入图片描述
  • prices.size与鞋价
    一般情况下,鞋的大小应该是不会影响价格的,但也可能存在其他特殊情况。观察尺寸与鞋价的趋势图变化,发现尺寸不同鞋价竟然不同。但我们是只仅仅以prices.size分组求均值画出的与鞋价的关系图,并没有限定品牌、商家等因素,所以这种变化可能是由其他因素影响的。在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    观察鞋价前十与后十发现,鞋价比较高的鞋子是尺寸比较大的。

三、建立线性回归模型

在这里插入图片描述
此时数据集里已没有空值了。
导入库:
from sklearn.model_selection import cross_val_score from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split
利用线性回归模型训练数据,将数据集分为训练集和测试集,然后利用get_dummies 是pandas实现one hot encode的方式, one-hot是将离散型特征的每一种取值都看成一种状态,若你的这一特征中有N个不相同的取值,那么我们就可以将该特征抽象成N种不同的状态,one-hot编码保证了每一个取值只会使得一种状态处于“激活态”,也就是说这N种状态中只有一个状态位值为1,其他状态位都是0。通过多次交叉验证训练,得到评分,使用决定系数R^2和RMSE作为评价指标。

  • 训练brand与鞋价
labels=['brand']
categorize_label=lambda x:x.astype('category')
Brand[labels]=Brand[labels].apply(categorize_label,axis=0)
#get_dummies 是利用pandas实现one hot encode的方式
label_dummies=pd.get_dummies(Brand[labels])
x=label_dummies
y=Brand[['avg_price']]
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=.3,random_state=23)
reg=LinearRegression()
reg.fit(x_train,y_train)
y_pred=reg.predict(x_test)
print('Brand feature variable Model:')
print('R^2:{}'.format(reg.score(x_test,y_test)))
print('Root mean squared error:{}'.format(np.sqrt(mean_squared_error(y_test,y_pred))))
cv_scores=cross_val_score(reg,x,y,cv=5)
print(cv_scores)
print('Average 5-fold cv score:{}'.format(np.mean(cv_scores)))

在这里插入图片描述
R^2和RMSE的值,表示品牌与鞋价拟合的并不是很好。

  • 训练colors与鞋价
    在这里插入图片描述
    颜色与鞋价同样拟合的不怎么好。

  • 训练prices.merchant与鞋价
    在这里插入图片描述
    销售商与鞋价也不是很好,让我们看看尺寸与鞋价!

  • 训练prices.size与鞋价
    惊奇的发现尺寸与鞋价拟合的比较好,但不足以证明鞋的大小与鞋价有很大影响。
    在这里插入图片描述

四、总结

之所以采用线性模型,是因为线性模型很适合这个分类,利用y=ax+b的形式训练他们的拟合程度,我觉着相比较于其它模型,线性模型应该有较小的RMSE了。
基于EDA,可知品牌(brand)和商家(prices.merchant)对鞋价的影响比较显著;对于颜色(colors),其中价格差异较大的可能是由品牌或其他因素造成的;鞋的尺寸(prices.size)大部分价格是基本一致的,其中较大的鞋码的价格基本在前10,可能是其尺寸比较特殊,如定制等,所以鞋价比较贵,同时也掺杂着其他因素的影响。至于从添加日期(dateAdded)到更新日期(dateUpdated)之间的时间,很明显,通常经过的时间越多,价格就越低。
运行的机器学习模型结果不是太好,可以进一步分析。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值