数据科学团队在持续稳定的发展壮大, 这也意味着经常会有新的数据科学家和实习生加入团队我们聘用的每个数据科学家都具有不同的技能, 但他们都具备较强的分析背景和在真正的业务案例中运用此背景的能力例如, 团队中大多数人都曾研究计量经济学, 这为概率论及统计学提供了坚实的基础
典型的数据科学家需要处理大量的数据, 因此良好的编程技能是必不可少的然而, 我们的新数据科学家的背景往往是各不相同的编程环境五花八门, 因此新的数据科学家的编程语言背景涵盖了 R, MatLab, Java, Python, STATA, SPSS, SAS, SQL, Delphi, PHP to C# 和 C++ 了解许多不同的编程语言在有些时候确实很有必要, 然而我们更希望使用一种编程语言来完成大多数的项目, 这样我们可以在项目上更容易的进行合作由于无人知晓一切, 一种首选的编程语言让我们有机会互相学习
我们公司更倾向于使用 Python 在开源社区的大力支持下, Python 已经成为了处理数据科学强有力的工具 Python 容易使用的语法, 强大的数据处理能力和极好的开源统计库, 例如 Numpy, Pandas, Scikit-learn, Statsmodels 等, 使我们可以完成各种各样的任务, 范围从探索性分析到构建可伸缩的大数据管道和机器学习算法只有对那些较宽松的统计模型我们有时会将 Python 和 R 结合使用, 其中 Python 执行大量的数据处理工作和 R 进行统计建模
我的理念是通过实践来学习, 因此为了帮助新数据科学家使用 Python 进行数据科学研究, 我们创建了 Python 数据科学 (速成) 课(Python Data Science (Crash) Course)这门课的目标是使我们的新员工 (也包括其他部门的同事) 以互动的方式和自己的节奏来学习解决实际的业务问题与此同时, 更有经验的数据科学家可以回答任何问题, 但也不要小看从 StackOverflow 或者图书馆的文档中寻找答案的的技能, 我们也当然愿意向新数据科学家传授这项技能!
在文章中, 我们会按阶段来介绍这个实践课程
阶段一: 学习 Python 的基础知识
显而易见, 第一步是学习 Python 这个软件, 即学习 Python 语法及基本操作幸运的是, 如果你能处理好代码缩进的话, Python 语法就不没那么难了我在使用 Java 编程语言时无需考虑注意缩进问题, 然而当我之后开始使用 Python 时在缩进上容易出错
因此, 如何开始学习 Python? 由于我们更喜欢通过实践来学习的方式, 所以我们总是让新员工从 Codecademy Python 课程开始 Codecademy 提供了交互式的 Python 课程体验, 无需担心安装软件会麻烦, 可以在浏览器中直接学习使用 Python
Codecademy Python 课程用时大约 13 个小时, 完成之后, 你应该能够在 Python 中进行简单的操作
提示: 数据科学家还可以在 Codecademy 上学习 SQL, 这门课程也十分重要
阶段二: 在 Anaconda 环境下本地安装 Python
在结束了 Codecademy 课程后, 我们显然会想去开始编写自己的代码, 然而因为我们不继续在浏览器中运行 Python, 需要在我们本地电脑上安装 Python
Python 是开源的, 并可通过 www.python.org. 免费下载然而官方版本只包含了标准的 Python 库, 标准库中包含文本文件日期时间和基本算术运算之类的函数 Python 标准库不够全面, 无法进行多样化的数据科学分析, 但开源社区已经创建出了很棒的库来扩展 Python 的功能, 使其能够进行数据科学研究
为了避免单独下载安装所有的库, 我建议使用 Anaconda Python 发行版 Anaconda 实际上是与大量的库结合在一起的 Python, 因此你不需要手动安装它们此外, Anaconda 附带了一个简单的命令行工具, 在必要时安装新的或更新现有的库
提示: 尽管默认情况下 Anaconda 几乎涵盖了所有很棒的库, 但还有一些没有包含在内你可以通过 conda install package_name or pip install package_name 语句来安装新的包例如, 我们经常在项目中使用进度条库 tqdm 因此, 我们需要先执行 pip install tqdm 语句来完成 Anaconda 的新安装
阶段三: 使用 PyCharm 进行简单的编码
安装了 Python 之后, 我们可以在本地电脑上运行 Python 代码打开编辑器写下 Python 代码, 打开命令行并运行新创建的 Python 文件, 路径为 python C:\Users\thom\new_file.py
为了使事情变得简单一些, 我更喜欢在 Pychanm 环境中编写 Python 代码 PyCharm 是一种所谓的集成开发环境, 对开发人员编写代码时提供支持它可以处理常规任务, 例如通过提供一个简单的运行脚本按钮来运行程序, 此外它还可以通过提供自动完成功能和实时错误检查来提高效率如果忘记了某处的空格或使用了未被定义的变量名称, PyCharm 会发出警告提示想要使用版本控制系统例如 Git 来进行项目合作? PyCharm 会帮助你不管怎样, 使用 Pycham 可以在编写 Python 程序时节省大量的时间, charm 名副其实
阶段四: 解决一个模拟的业务问题
定义研究的问题
假设现在经理提出了一个他面对的业务问题, 他希望能够预测用户在公司网站上进行首次点击 / 参与 (例如订阅简报) 的概率在给出了一些想法后, 我们提出可以基于用户的页面浏览量来预测订阅转换概率, 此外, 你构建了以下假设: 更多的页面浏览量会导致用户首次订阅的概率增大
为了检验假设是否成立, 我们需要从网络分析师处获得两个数据集:
Session 数据集 包含所有用户的所有页面浏览量
1. user_id: 用户标识符
2. session_number: 会话数量(升序排列)
3. session_start_date: 会话的开始日期时间
4. unix_timestamp: 会话的开始 unix 时间标记
5. campaign_id: 将用户带到网站的活动的 ID
6. domain: 用户在会话中访问的 (子) 域
7. entry: 会话的进入页面
8. referral: 推荐网站, 例如: google.com
9. pageviews: 会话期间的页面访问量
10. transactions: 会话期间的交易量
Engagement 数据集 包含所有用户的所有参与活动
1. user_id: 唯一的用户标识符
2. site_id: 产生参与活动的网站 ID
3. engagement_unix_timestamp: 发生参与活动的 unix 时间标记
4. engagement_type: 参与活动的类型, 例如订阅简报
5. custom_properties: 参与活动的其他属性
不幸的是, 我们有两个单独的数据集, 因为它们来自不同的系统然而, 两个数据集可以通过唯一用户标识符 user_id 来匹配我已经在 GitHub 上放置了我用来解决业务问题的最终代码 , 然而我强烈建议你仅在自己解决了这个问题后再去查看代码此外, 你还可以找到创建两个虚构数据集的代码
代码链接:
https://github.com/thomhopmans/themarketingtechnologist/tree/master/7_data_science_in_python
使用 Pandas 进行简单的数据处理
无论我们应用任何统计模型解决问题, 都需要预先清洗和处理数据例如, 我们需要为会话数据集中的每个用户找到其首次活动的数据 (如果有的话) 这就要求在 user_id 上加入两个数据集, 并删除首次活动后的其他所有活动数据
Codecademy Python 课程已经告诉你如何逐行阅读文本文件 Python 非常适合数据管理和预处理, 但不适用于数据分析和建模
Python 的 Pandas 库克服了这个问题 Pandas 提供了 (数值) 表和时间序列的数据结构和操作因此, Pandas 让 Python 数据科学工作变得更加简单!
使用 pd.read_csv()读取数据集
我们的 Python 代码中的第一步是加载 Python 中的两个数据集 Pandas 提供了一个简单易用的函数来读取. csv 文件: read_csv()本着学习的原则, 我们建议您自己找出如何读取这两个数据集最后, 你应该建立两个独立的 DataFrames, 每个数据集都需要有一个
小贴士: 在这两个文件中, 我们都有不同的分隔符此外, 请务必查看 read_csv()中的 date_parser 选项, 将 UNIX 时间标记转换为正常的日期时间格式
过滤无用数据
任何 (大) 数据问题中的下一步是减少问题规模的大小在我们的例子中, 有很多与我们问题无关的列, 例如会话的媒介 / 来源因此, 我们在 Dataframes 上应用索引和选择只保留相关的列, 比如 user_id(必需加入这两个 DataFrames), 每个会话和活动的日期 (在此之前搜索首次活动和会话) 以及页面访问量(假设验证的必要条件)
另外, 我们会筛选出 DataFrame 中所有非首次的活动可以通过查找每个 user_id 的最早日期来完成具体怎样做呢? 使用 GroupBy:split-apply-combine 逻辑!
Pandas 最强大的操作之一是合并, 连接和序列化表格它允许我们执行任何从简单的左连接和合并到复杂的外部连接因此, 可根据用户的唯一标识符结合会话和首次活动的 DataFrames
删除首次活动后的所有会话
在上一步中使用简单的合并, 我们为每个会话添加了首次活动的时间标记通过比较会话时间标记与首次活动时间标记, 你应该能够过滤掉无用的数据并缩小问题的规模
添加因变量 y: 参与 / 订阅活动转换
如上所述, 我们希望预测页面访问量对转换 (即首次活动) 概率的影响因此, 我们的因变量 y 是一个二进制变量, 用它表示会话内是否发生了转换由于我们做了上面的过滤(即在首次活动后删除所有非首次活动和会话), 所以这种转换按照定义在每个用户的最近一次会话中进行同样, 使用 GroupBy:split-apply-combine 逻辑, 我们可以创建一个包含观察值的新列, 如果它是用户的最后一个会话, 观察值将为 1, 否则为 0
添加自变量 X: 访问量的累计总和
我们的自变量是页面访问量但是, 我们不能简单地将会话中的页面访问量计算在内, 因为早期会话中的页面访问会影响转换概率因此, 我们创建一个新的列, 用来计算用户页面访问量的累计总和这才是我们的自变量 X
使用 StatsModels 拟合逻辑回归
通过 Pandas 库我们最终得到了一个包含单个离散 X 列和单个二进制 Y 列的小型 DataFrame 并用 (二元) 逻辑回归模型来估计基于一个或多个独立变量的因变量的二元响应概率 StatsModels 是 Python 的统计和计量经济学库, 提供了参数估计和统计测试工具因此, 它包含逻辑回归函数也就不足为奇了那么, 如何通过 StatsModels 来拟合逻辑回归模型呢? 请自行百度...
技巧 1: 不要忘记给逻辑回归添加一个常数
技巧 2: 另一个非常棒的拟合统计模型 (如逻辑回归) 库是 scikit-learn
使用 Matplotlib 或 Seaborn 进行可视化
在拟合逻辑回归模型之后, 我们可以预测每个累计访问量的转换概率但是, 我们不能仅仅通过交付一些原始数据来将我们最新发现的结果传达给管理层因此, 数据科学家的重要任务之一就是要清晰有效地展示他的成果在大多数情况下, 这意味着提供我们的可视化结果, 因为众所周知, 一图胜千言...
Python 包含几个非常棒的可视化库, 其中 MatplotLib 是最知名的而 Seaborn 是建立在 MatplotLib 上的另一个很棒的库
MatplotLib 的语法大概是以前使用过 MatLab 的用户所熟知的但是, 我们倾向选择 Seaborn, 是因为它提供更漂亮的图表而且外观很重要
我们通过 Seaborn 得到了模型拟合的可视化结果, 如下所示:
我们可以很好地利用这个可视化结果来证明我们的假设是否成立
验证假设
最后一步是就验证我们提出的假设是否成立回想一下, 我们认为更多的网页访问量导致首次活动的可能性更高
首先, 我们从以前的可视化结果中可以看出, 假设是成立的不然, 预测的概率也不会单调递增尽管如此, 我们还是可以从拟合的模型总结中得出同样的结论, 如下所示
- Logit Regression Results
- ==============================================================================
- Dep. Variable: is_conversion No. Observations: 12420
- Model: Logit Df Residuals: 12418
- Method: MLE Df Model: 1
- Date: Tue, 27 Sep 2016 Pseudo R-squ.: 0.3207
- Time: 21:44:57 Log-Likelihood: -5057.6
- converged: True LL-Null: -7445.5
- LLR p-value: 0.000
- ====================================================================================
- coef std err z P>|z| [95.0% Conf. Int.]
- ------------------------------------------------------------------------------------
- const -3.8989 0.066 -59.459 0.000 -4.027 -3.770
- pageviews_cumsum 0.2069 0.004 52.749 0.000 0.199 0.215
- ====================================================================================
我们看到, 统计结果中, pagesviews_cumsum 系数在显著性水平为 1%时显示为正因此, 这足以表明我们的假设成立, 加油! 此外, 您刚刚已经完成了第一个 Python 数据科学分析工作!:)
来源: https://yq.aliyun.com/articles/513016