电子商务初创公司的全栈数据科学项目(从数据收集到预测建模)
电子商务初创公司的全栈数据科学项目(从数据收集到预测建模)
读者们好,今天是星期六,我又带着另一个中等故事回来了。这个有点不同,这是一个 POC(概念证明),在我开始担任全职数据科学家之前,我被一家电子商务初创公司的老板要求执行 Cloudcraftz 解决方案列兵。有限公司
我的一个朋友几个月前开始做电子商务业务,所以有一天他早上打电话给我问我——“有没有可能知道我们地区或附近地区的人可能有兴趣在网上购物?什么样的人喜欢买什么样的东西?” .那时我得到了我的第一个委托数据科学项目。
由于是新公司,数据不多,收集数据也是我工作的一部分印度(主要是西孟加拉邦,因为这是一家非常新的初创公司,他们的主要重点是本国。)
注意:由于隐私问题,本文中的初创公司及其产品名称已更改。
所以,从这里开始。
笔记本导入
%matplotlib 内联
将熊猫导入为 pd
将 matplotlib.pyplot 导入为 plt
将 seaborn 导入为 sns
从 sklearn.model_selection 导入 train_test_split
从 sklearn.ensemble 导入 RandomForestClassifier
从 sklearn.metrics 导入 accuracy_score
下面是回复我们调查表的 200 人的数据集(对于任何数据相关或 ML 项目来说,数据太少了,但我仍然不想放弃)。
加载数据集
数据 = pd.read_csv('Survey.csv')
探索性数据分析 (EDA)
数据头()
数据尾()
数据信息()<class 'pandas.core.frame.DataFrame'>
RangeIndex:200 个条目,0 到 199
数据列(共9列):
# 列非空计数 Dtype
--- ------ -------------- -----
0 年龄 200 非空 int64
1 Gender 200 非空对象
2 State/Union Territory 200 非空对象
3 City 200 非空对象
4 每月家庭收入 200 非空对象
5 产品有兴趣在线购买 200 个非空对象
6 就业状况 200 非空对象
7 你最好用于网上购物 200 个非空对象
8 你听说过 XPay 吗? 200 个非空对象
数据类型:int64(1),对象(8)
内存使用量:14.2+ KB# 检查空值(如果有)
pd.isnull(data).sum()年龄 0
性别 0
州/联邦领土 0
城市 0
家庭月收入 0
有兴趣在线购买的产品 0
就业状况 0
您最好用于在线购物 0
你听说过 XPay 吗? 0
数据类型:int64
家庭月收入与首选在线商品
在这里,我们根据家庭的月收入对数据集进行分组,以了解财务状况如何影响在线购物环境中的个人选择。
group_data = data.groupby(['家庭月收入', '网购感兴趣的产品'])group_data.count()
从以上分组数据分析可以看出,收入范围内的人 10K及以下 至 70K 通常更喜欢在网上买书,而收入在 50–70K 及以上 更喜欢从网上商店购买电子产品,例如笔记本电脑、手机、手表等。
在线商品首选v / s年龄
在这里,我们根据年龄对数据集进行分组,以了解年龄在决定人们在线购买的产品类型方面的作用。
group_data_age = data.groupby(['有兴趣在线购买的产品'])
mean_age = group_data_age['Age'].mean()colors = {'Male':'tab:blue', 'Female':'tab:orange'} plt.figure(figsize=(8, 5))
plt.plot(mean_age, 'gv--')
plt.xticks(旋转=90,字体大小=14)
plt.title('平均年龄与网上经常购买的产品', fontsize=15)
plt.xlabel('产品', fontsize=14)
plt.ylabel('平均年龄', fontsize=14)
plt.show()
现在让我们看看性别如何与年龄一起影响市场
性别是否也在起作用?让我们也探讨一下,年龄和性别是如何在这里发挥作用的。
new_data = pd.concat([data['Gender'], data['Age'], data['有兴趣在线购买的产品']],axis=1)
new_group_male = new_data[new_data.Gender=='男性'].groupby('有兴趣在线购买的产品')
new_group_female = new_data[new_data.Gender=='Female'].groupby('有兴趣在线购买的产品')age_male = new_group_male['Age'].mean()
age_female = new_group_female['Age'].mean()plt.figure(figsize=(8, 6))
plt.plot(age_male, 'bo--')
plt.plot(age_female, 'rv--')
plt.xticks(旋转=90)
plt.ylabel('平均年龄', fontsize=14)
plt.legend(labels=('男', '女'))
plt.show()
从上述数据分析中得出的几个值得注意的结论:
- 时尚商品大多由平均年龄大于男性的女性在网上购买,网上账单支付也有类似趋势。
- 移动配件、书籍和鞋子由平均年龄几乎相同的男性和女性在线购买。
- 除了这两个之外,在所有其他类别中,男性的平均或平均年龄都大于女性。
城市层与在线产品
我们都知道,人的生活方式因地而异,住在乡村的人与住在城镇或城市的人的生活方式会完全不同,这也可能在决定人们的生活方式方面发挥重要作用。更喜欢在线购买。
饼图 = [] num = data[data.City=='Tier 1'].count()
pie_chart.append(num.Age) num = data[data.City=='Tier 2'].count()
pie_chart.append(num.Age) num = data[data.City=='Tier 3'].count()
pie_chart.append(num.Age)
这是数据中第 1 层、第 2 层和第 3 层读数的百分比
我们数据集中的很多条目来自一线城市,虽然我们尽力从各种城市、乡镇和村庄获取数据,但时间和资源有限,确实很难。
标签 = 'Tier 1'、'Tier 2'、'Tier 3' plt.figure(figsize=(5, 5))
plt.pie(pie_chart, labels=labels, autopct='%1.1f%%', shadow=True, startangle=140)
plt.show()
group_tier1 = data[data.City=='Tier 1'].groupby('有兴趣在线购买的产品')
group_tier2 = data[data.City=='Tier 2'].groupby('有兴趣在线购买的产品')
group_tier3 = data[data.City=='Tier 3'].groupby('有兴趣在线购买的产品')new_list = data['有兴趣在线购买的产品'].unique() 第 1 层、第 2 层、第 3 层 = []、[]、[]
标签2,标签3 = [],[] 对于我在 new_list 中:
Tier_1.append(group_tier1.get_group(i).Age.count())
对于我在 new_list 中:
如果我=='鞋子':
经过
别的:
标签2.append(i)
Tier_2.append(group_tier2.get_group(i).Age.count())
对于我在 new_list 中:
如果 i=='鞋子'或 i=='电器(例如:AC、电视、搅拌机等)'或 i=='手表'或 i=='家居饰品(例如:椅子、桌子)':
经过
别的:
标签3.append(i)
Tier_3.append(group_tier3.get_group(i).Age.count())
现在我们将看到这些物品是如何在这 3 层城市(分别)中分布的。
# 第 1 层的饼图 标签 = new_list plt.figure(figsize=(10, 8))
plt.pie(Tier_1, 标签=标签, autopct='%1.1f%%', shadow=True, startangle=140)
plt.show()
# 第 2 层的饼图 标签 = 标签2 plt.figure(figsize=(10, 8))
plt.pie(Tier_2, 标签=标签, autopct='%1.1f%%', shadow=True, startangle=140)
plt.show()
# 第 3 层的饼图 标签 = 标签3 plt.figure(figsize=(10, 8))
plt.pie(Tier_3, 标签=标签, autopct='%1.1f%%', shadow=True, startangle=140)
plt.show()
一个值得注意的事实是,无论住在哪里,人们都更喜欢在网上购买书籍。
最后,我们希望看到就业状况方面的分布情况
group_emp = data.groupby(['有兴趣在线购买的产品', '就业状况'])group_emp.count()
学生对书籍、手机配件和小工具的需求量很大。我们不会探索“您最喜欢用于在线购物”和“您听说过 XPay 吗?”的功能。因为这两列几乎没有任何差异,因此似乎对决策影响不大。
但是,我们不要对上面提到的这两个功能进行探索。
# 首选使用的网上购物平台
data.iloc[:, 7].value_counts()Amazon 116
Flipkart 73
敏特拉 3
自己。有 2
摇一摇
Jio Mart 1
杂货店 1
不要网购1
塔塔克利克 1
阿霍 1
名称:您最好用于在线购物,dtype:int64
我们可以得出结论,大多数人使用 亚马逊 或者 Flipkart 用于网上购物。
为预测未来结果的数据建模
# 这里我们只取分类变量来获取虚拟变量 features = ['性别','城市','每月家庭收入','就业状况']
target = ['有兴趣在线购买的产品']model_data = pd.get_dummies(data[features])
model_target = pd.get_dummies(data[target])# 因为我们发现年龄是我们分析中的一个重要因素,所以我们也将其包括在内。 model_data = pd.concat([model_data, data['Age']], axis=1)train_X, test_X, train_y, test_y = train_test_split(model_data, model_target, test_size=0.2, random_state=1)model = RandomForestClassifier(n_estimators=100 , max_depth=11, random_state=1)
model.fit(train_X, train_y) 准确度分数(test_y,model.predict(test_X))* 10030.0
所以,结果一点都不好,但我并不意外,为什么?主要有两个原因:
1. 如前所述,数据量太少。
2. 数据集有偏差,我们无法捕捉到真实场景,数据集有些偏差。
但是我们仍然尝试通过一些统计测试(例如卡方检验)使其变得更好,但这并没有太大帮助。
在执行卡方检验时,我们发现 Gender and Employment Status 属性很容易被拒绝。
# 这里我们只取分类变量来获取虚拟变量
features = ['城市','每月家庭收入']
target = ['有兴趣在线购买的产品'] model_data = pd.get_dummies(数据[特征])
model_target = pd.get_dummies(数据[目标]) model_data = pd.concat([model_data, data['Age']], axis=1) train_X, test_X, train_y, test_y = train_test_split(model_data, model_target, test_size=0.2, random_state=1) 模型 = RandomForestClassifier(n_estimators=100, max_depth=11, random_state=1)
model.fit(train_X, train_y) 准确度得分(test_y,model.predict(test_X))* 10037.5
结论
- 年龄,城市和家庭月收入 事实证明 是 决定 从 网上 商店 购买 什么 的 最 重要 因素 .
- 数据量在决定数据科学项目的成功与否方面起着非常重要的作用。
- 数据不能有偏见,我们应该尽量收集或包含能捕捉到整个场景真实画面的数据。
所以,谢谢各位读者,希望你们喜欢这篇文章,虽然结果不达标,但是却带来了很多的学习,这就是残酷的现实。如果您喜欢这篇文章,请分享给您的朋友和同事。见极客!
如果您觉得这篇文章有帮助,请考虑留下小费。感谢您的阅读,祝您求职顺利!
给我买杯咖啡,这样我就可以为我的猫做手术了: ** https://www.buymeacoffee.com/botservices**
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明