TowardsDataScience 2023 博客中文翻译(十八)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

基于数据驱动的方法来减少员工调查长度

原文:towardsdatascience.com/a-data-driven-method-to-reduce-employee-survey-length-8aecedcf5df9?source=collection_archive---------2-----------------------#2023-01-14

减少调查长度,同时最大化可靠性和有效性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Trevor Coppins

·

关注 发表在 Towards Data Science ·16 分钟阅读·2023 年 1 月 14 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来源:Marvin MeyerUnsplash

员工调查正迅速成为组织生活中的一个重要方面。事实上,人力分析领域的增长和数据驱动的人才管理方法的采纳就是证明(见麦肯锡报告)。通过一次调查,我们可以收集有关领导者表现的信息、员工是否有动力以及员工是否考虑离职。唯一一个相当的“隐形问题”就是我们的调查长度。

员工调查的创建者(例如,人力资源部门和/或行为数据科学家)希望准确测量多个重要主题,这通常需要大量的问题。另一方面,参与时间较长的调查的受访者更有可能中途退出调查(Hoerger, 2010; Galesic & Bosnjak, 2009),并且引入测量误差(例如,Peytchev & Peytcheva, 2017; Holtom et al., 2022)。尽管如此,参与调查的受访者比例却有所增加:组织行为学文献中的研究报告显示,在 15 年期间(2005–2020 年),受访率从 48%大幅提高至 68%(Holtom et al., 2022)。虽然调查长度只是决定数据质量和受访者比例的众多因素之一(例如,激励措施、后续跟进;Edwards et al., 2002; Holtom et al., 2022),但调查长度是一个易于调整且直接受调查创建者控制的因素。

本文提出了一种通过选择尽可能少的条目来缩短员工调查的方法,以实现最大的期望条目特征、可靠性和有效性。通过这种方法,员工调查可以被缩短,以节省员工时间,同时希望改善参与率/退出率和测量误差,这些都是较长调查中常见的关注点(例如,Edwards et al., 2002; Holtom et al., 2022; Jeong et al., 2023; Peytchev & Peytcheva, 2017; Porter, 2004; Rolstad et al., 2011; Yammarino et al., 1991)。

缩短调查的经济效益

不相信?让我们看看缩短调查的实际经济效益。作为一个说明性的例子,我们计算一下如果将一个季度的 15 分钟调查缩短为 10 分钟,对于一个拥有 10 万人的大型组织(例如,《财富》100 强公司),投资回报率会如何。使用美国工人的中位工资($56,287;见报告),将调查时间缩短 5 分钟可以为组织节省超过 100 万美元的员工时间。虽然这些计算不是精确科学,但这是理解调查时间如何影响组织底线的有用指标。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显示减少员工调查时间的成本节约图

解决方案:缩短员工调查问卷

为了缩短我们的调查问卷,但保留理想的项目级统计数据、可靠性和有效性,我们采用两步过程,其中 Python 和 R 程序将帮助确定最佳保留的项目。在第 1 步中,我们将利用多标准决策(MCDM)程序(Scikit-criteria;Cabral 等,2016)根据多个标准(标准差、偏斜度、峰度和主题专家评分)选择表现最佳的项目。在第 2 步中,我们将利用 R 程序(OASIS;Cortina 等,2020)选择第 1 步中排名最高的项目的最佳组合,以进一步缩短我们的量表,但保持最大的可靠性和其他有效性问题。

简而言之,最终输出将是一个减少后的项目集,具有理想的项目级统计数据以及最大的可靠性和有效性。

此方法适用于谁?

  • 从事调查创建和人员数据分析的人员分析专家、数据科学家、I/O 心理学家或人力资源(HR)专业人员

  • 理想情况下,用户应具有一些 Python 或 R 和统计学的初级经验。

你需要什么?

  • Python

  • R

  • 数据集(选择一个):

  1. 实践数据集 — 我利用了国际人格项目库(IPIP;ipip.ori.org/;Goldberg, 1992)公开数据集的前 1000 个回应,由开放心理测量学(openpsychometrics.org)提供。为简便起见,我只使用了 10 个责任心项目。数据来源说明:IPIP 是一个公共领域的人格测试,可以在没有作者许可或费用的情况下使用。类似地,openpsychometrics.org 是开放源数据,已在其他几篇学术出版物中使用(见此处)。

  2. 你自己的数据集(包含员工回应)用于你想要缩短的调查问卷。理想情况下,这应该是尽可能大的数据集,以提高准确性和复制的可能性。通常,大多数用户希望拥有 100 到 200+个回应的数据集,以期消除抽样或偏斜回应的影响(见 Hinkin, 1998 以进一步讨论)。

  • 可选:数据集中每个候选缩短项目的主题专家(SME)评分。仅在使用自己的数据集时适用。

  • 可选:聚合效度和区分效度测量。这些可以在第二步中使用,但不是必需的。这些效度测量对于新量表开发更为重要,而不是缩短现有的已建立量表。聚合效度是指一个测量与其他类似测量的相关程度,而区分效度则是指它与非相关测量的无关程度(Hinkin, 1998;Levy, 2010)。同样,仅在你拥有自己的数据集时适用。

Github 页面代码: github.com/TrevorCoppins/SurveyReductionCode

请注意:除非另有说明,否则所有图片均为作者提供

第一步:项目级分析与多准则决策方法(MCDM)

项目级统计说明

对于‘纯粹’的项目级统计(或每个项目的属性),我们利用标准差(即,平均而言,受访者的回答有多大差异)以及偏度峰度(即,数据分布的不对称程度及其与正态分布理想‘峰度’的偏离程度)。每个项目的适度标准差是可取的,因为我们的多数构念(例如,工作满意度、动机)在个体间自然有所不同。这种个体间的变异性是我们用来进行预测的依据(例如,“为什么销售部门的工作满意度比研发部门高?”)。对于偏度和峰度,我们理想上希望其值最小,因为这表明我们的数据呈正态分布,这是绝大多数统计模型(例如,回归分析)的假设。尽管某些偏度和峰度在具体构念上是可以接受的,或者甚至是正常的,但真正的问题出现在分数分布与正态分布的差异较大时(Warner, 2013)。

注意:某些变量自然不符合正态分布,不应在此使用。例如,问题:“在过去一个月,你是否经历过工作场所事故?”的频率数据确实是不符合正态分布的,因为绝大多数人会选择‘无’(或 0)。

项目级分析与 MCDM

首先,我们需要安装一些后续分析所需的程序。第一个是 MCDM 程序:scikit-criteria(请参阅文档 这里; 使用 Conda 安装可能需要一两分钟)。我们还需要导入 pandasskcriteriascipy.statsskewkurtosis 模块。

conda install -c conda-forge scikit-criteria
import pandas as pd
import skcriteria as skc

from scipy.stats import skew
from scipy.stats import kurtosis

数据输入

接下来,我们需要选择数据:1)自己的数据集或 2)练习数据集(如上所述,我使用了来自 IPIP-50 开源数据集的前 1000 个回答,这些回答涉及 10 个良心度项目)。

注意:如果你使用的是自己的数据集,你需要在进行其余分析之前清理数据(例如,处理缺失数据)。

# Data file #

# 1) load your own datafile here 
# OR
# 2) Utilize the practice dataset of the first 1000 responses of IPIP-50 
# which is available at http://openpsychometrics.org/_rawdata/.
# For simplicity, we only utilized the 10-conscientious items (CSN)

## The original IPIP-50 survey can be found here: 
## https://ipip.ori.org/New_IPIP-50-item-scale.htm

Data = pd.read_csv(r'InsertFilePathHere.csv')

如果你使用练习数据集,某些项目需要重新编码(请参阅 这里 获取评分要点)。这确保所有回答在我们的李克特量表上具有相同的方向(例如,5 表示所有项目的高度良心回应)。

#Recoding conscientiousness items
Data['CSN2'] = Data['CSN2'].replace({5:1, 4:2, 3:3, 2:4, 1:5})
Data['CSN4'] = Data['CSN4'].replace({5:1, 4:2, 3:3, 2:4, 1:5})
Data['CSN6'] = Data['CSN6'].replace({5:1, 4:2, 3:3, 2:4, 1:5})
Data['CSN8'] = Data['CSN8'].replace({5:1, 4:2, 3:3, 2:4, 1:5})

注意:对于这种方法,你应该一次只处理一个测量或‘量表’。例如,如果你想缩短你的工作满意度和组织文化测量,请分别对每个测量进行此分析。

生成项目级统计数据

接下来,我们收集所有需要的项目级统计数据,用于 scikit-criteria 以帮助进行最终的最佳项目排名。这包括标准差、偏度和峰度。需要注意的是,峰度程序这里利用了 Fisher 的峰度,其中正态分布的峰度为 0。

## Standard Deviation ##
std = pd.DataFrame(Data.std())
std = std.T

## Skewness ##
skewdf = pd.DataFrame(skew(Data, axis=0, bias=False, nan_policy='omit'))
skewdf = skewdf.T
skewdf = pd.DataFrame(data=skewdf.values, columns=Data.columns)

## Kurtosis ##
kurtosisdf = pd.DataFrame(kurtosis(Data, axis=0, bias=False, nan_policy='omit'))
kurtosisdf = kurtosisdf.T
kurtosisdf = pd.DataFrame(data=kurtosisdf.values, columns=Data.columns)

可选:主题专家评分(定义对应性)

虽然可选,但如果你在学术或应用工作中建立新的量表或测量,强烈推荐收集主题专家(SME)评分。通常,SME 评分有助于建立内容效度或定义对应性,即你的项目与提供的定义的对应程度(Hinkin & Tracey, 1999)。这种方法涉及对少数个体进行调查,询问一个项目与您提供的定义在 1 (完全不符合) 到 5 (完全符合) 的李克特量表上相符的程度。如 Colquitt 等人(2019)所述,我们甚至可以使用这些信息计算 HTC 指数:定义对应性评分的平均值 / 可能的锚点数量。例如,如果 5 位 SME 对项目 i 的平均对应性评分为 4.20:4.20/5 = 0.84。

如果你已经收集了 SME 评分,你应该将其格式化并作为单独的数据框包含在这里。 注意:你应该将 SME 评分格式化为单列,每个项目列为一行。这将使合并不同的数据框成为可能。

#SME = pd.read_csv(r'C:\XXX insert own filepath here)
#SME = SME.T
#SME.columns = Data.columns

合并数据和绝对值

现在,我们简单地合并这些不同的数据框(SME(可选)和项目级统计数据)。项目的名称需要在数据框之间匹配,否则 pandas 会添加额外的行。然后,我们转置数据以符合最终 scikit-criteria 程序的要求。

mergeddata = pd.concat([std, skewdf, kurtosisdf], axis=0)
mergeddata.index = ['STD', 'Skew', "Kurtosis"]
mergeddata = mergeddata.T
mergeddata

最后,由于偏度和峰度的范围可以是负值或正值,我们取绝对值,因为这样更容易处理。

mergeddata['Skew'] = mergeddata['Skew'].abs()
mergeddata['Kurtosis'] = mergeddata['Kurtosis'].abs()

Scikit-criteria 决策矩阵和排名项目

现在我们利用 scikit-criteria 决策程序根据多个标准对这些项目进行排名。如下面所示,我们必须传递数据框的值(mergeddata.values)、每个标准的输入目标(例如,最大值或最小值更为理想)和权重。虽然默认代码对每个标准具有相等的权重,但如果你使用 SME 评分,我强烈建议将更多的权重分配给这些评分。其他项目级统计数据只有在我们测量的构念是我们打算测量的构念时才重要!

最后,替代方案和标准仅是传递到 scikit-criteria 包中的名称,以便理解我们的输出。

dmat = skc.mkdm(
    mergeddata.values, objectives=[max, min, min],
    weights=[.33, .33, .33],
    alternatives=["it1", "it2", "it3", "it4", "it5", "it6", "it7", "it8", "it9", "it10"],
    criteria=["SD", "Skew", "Kurt"])

过滤器

scikit-criteria 最棒的部分之一是它们的 filters 函数。这允许我们过滤掉不需要的项目级统计数据,并防止这些项目进入最终选择排名阶段。例如,如果一个项目的标准差极高——这表明回答问题的受访者差异很大,我们不希望该项目进入最终选择阶段。对于 SME 评分(如上所述为可选项),这一点尤其重要。在这里,我们只会保留那些分数高于最低阈值的项目——这可以防止那些定义对应极差的项目(例如,SME 平均评分为 1 或 2)在其他项目级统计数据良好的情况下成为排名靠前的项目。下面是过滤器的应用,但由于我们的数据已经在这些值范围内,因此不会影响最终结果。

from skcriteria.preprocessing import filters

########################### SD FILTER ###########################
# For this, we apply a filter: to only view items with SD higher than .50 and lower than 1.50
# These ranges will shift based upon your likert scale options (e.g., 1-5, 1-7, 1-100)

## SD lower limit filter
SDLL = filters.FilterGE({"SD": 0.50})
SDLL

dmatSDLL = SDLL.transform(dmat)
dmatSDLL

## SD upper limit filter
SDUL = filters.FilterLT({"SD": 1.50})
dmatSDUL = SDUL.transform(dmatSDLL)
dmatSDUL

## Whenever it is your final filter applied, I suggest changing the name
dmatfinal = dmatSDUL
dmatfinal

# Similarly, for SME ratings (if used), we may only want to consider items that have an SME above the median of our scale.
# For example, we may set the filter to only consider items with SME ratings above 3 on a 5-point likert scale

########################### SME FILTER ###########################

# Values are not set to run because we don't have SME ratings
# To utilize this: simply remove the # and change the decision matrix input
# in the below sections

#SMEFILT = filters.FilterGE({"SME": 3.00})

#dmatfinal = SME.transform(dmatSDUL)
#dmatfinal

注意:这也可以应用于偏度和峰度值。许多科学家会利用一个通用的经验规则,即偏度和峰度在-1.00 到+1.00 之间是可以接受的(Warner, 2013);你只需创建如上所示的上限和下限过滤器,结合标准差即可。

反转和缩放标准

接下来,我们将偏度和峰度值反转,通过 invert_objects.InvertMinimize() 使所有标准最大化。scikit-criteria 程序更倾向于将所有标准最大化,因为这有助于最后一步(例如,总和权重)。最后,我们对每个标准进行缩放,以便于比较和权重求和。每个值都除以该列中所有标准的总和,以便于每个标准的最佳值比较(例如,it1 的标准差为 1.199,这除以列总数 12.031 得到 0.099)。

# skcriteria prefers to deal with maxmizing all criteria
# Here, we invert our skewness and kurtosis. Higher values will then be more desirable

from skcriteria.preprocessing import invert_objectives, scalers

inv = invert_objectives.InvertMinimize()
dmatfinal = inv.transform(dmatfinal)

# Now we scale each criteria into an easy to understand 0 to 1 index
# The closer to 1, the more desirable the item statistic

scaler = scalers.SumScaler(target="both")
dmatfinal = scaler.transform(dmatfinal)
dmatfinal

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

求和和排名之前的最终标准值。

最终排名(总和权重)

最后,我们可以使用多种方法来应用这个决策矩阵,但最简单的方法之一是计算加权总和。在这里,将每个项目的行进行求和(例如,标准差 + 偏度 + 峰度),然后由程序进行排名。

## Now we simply rank these items ##

from skcriteria.madm import simple
decision = simple.WeightedSumModel()
ranking = decision.evaluate(dmatfinal)
ranking

对于练习数据集,排名如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

保存第二步的数据

最后,我们保存原始数据集和清理后的数据集用于第二步(这里是我们的原始‘Data’数据框,不是我们的决策矩阵‘dmatfinal’)。在第二步中,我们将输入在第一步中排名较高的项目。

## Save this data for step 2 ##

Data.to_csv(r'C:\InputYourDesiredFilePathandName.csv')

第二步:最终项目优化以确保可靠性和有效性

在第一步中,我们根据各项目的统计数据对所有项目进行了排序。现在,我们利用 R 中的优化应用程序OASIS(由 Cortina 等人开发,2020 年;见 用户指南)。OASIS 计算器运行多个项目组合,并确定哪种项目组合可以产生最高的可靠性(以及适用时的收敛和区分效度)。在这个例子中,我们关注两个常见的可靠性指标:cronbach’s alpha 和 omega。这些指标通常非常相似,但许多研究人员主张 omega 应作为主要的可靠性指标(参见 Cho & Kim,2015;McNeish,2018)。Omega 是衡量可靠性的指标,它确定一组项目在单一“因素”(例如 构念,如工作满意度)上的加载程度。类似于 Cronbach’s alpha(内部可靠性的一种衡量方式),值越高越好,通常在学术研究中,值超过 .70(最大上限 = 1.00)被认为是可靠的。

由于 shiny 应用程序的存在,OASIS 计算器使用起来非常简单。以下代码将安装所需的程序并弹出一个对话框(如下所示)。现在,我们从第一步中选择我们的原始清理数据集。在我们的示例中,我选择了前 8 个项目,要求至少 3 个项目和最多 8 个项目。如果你有收敛或区分效度测量,你可以在这一步输入它们。否则,我们请求计算 omega-h。

install.packages(c("shiny","shinythemes","dplyr","gtools","Lambda4","DT","psych", "GPArotation", "mice"))
library(shiny)
runUrl("https://orgscience.uncc.edu/sites/orgscience.uncc.edu/files/media/OASIS.zip")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

OASIS 计算器的输入

最终结果

如下所示,5 项目方案产生了最高的 omega (ω = .73) 和 Cronbach alpha 系数 (α = .75),符合传统的学术可靠性标准。如果我们有收敛和区分效度的测量,我们还可以使用这些值对项目组合进行排序。OASIS 计算器还允许你为每个值选择一般范围(例如,只显示高于某些值的组合)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们比较一下我们的最终解决方案:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

缩短量表与全长量表的比较

与完整的 10 项目测量相比,我们的最终项目集花费的时间只有一半,具有可比的、可接受的可靠性水平(ω 和 α >.70),稍高的标准差和较低的偏度,但不幸的是,峰度较高(不过,它仍在 -1.00 到 +1.00 的可接受范围内)。

这个最终缩短的项目集可能是一个非常合适的候选者来替代完整的测量。如果成功复制到所有调查测量中,这可能会将调查长度减少一半。用户可能需要采取额外步骤来验证新的缩短测量是否按预期工作(例如,预测有效性和调查名义网络——缩短的测量是否与完整长度量表具有可比的预测?)。

警示

  1. 这种方法可能会产生在语法上冗余或缺乏内容覆盖的最终结果。用户应通过确保第二步中选择的最终项目集具有足够的内容覆盖,或使用 OASIS 计算器的内容映射功能(见文档)来调整。例如,您可能有一个人格动机评估,它有多个‘子因素’(例如,您是否是外部或内在动机)。如果您没有在 OASIS 计算器中进行内容映射或考虑这一点,您可能会仅得到来自一个子因素的条目。

  2. 您的结果可能会因样本而有所不同。由于两个步骤都使用现有数据来‘最大化’结果,您可能会看到未来样本中的可靠性或项目级统计数据有所下降。然而,这不应是显著的。

  3. 依赖于您的组织/样本,您的数据可能因为来源单一而自然偏斜。例如,如果公司 X 要求所有经理参与某些行为,那么询问这些行为的条目可能(希望)会偏斜(即,所有经理的评分都很高)。

结论

本文介绍了一种两步法,旨在显著减少调查问卷的长度,同时最大化可靠性和有效性。在以开源人格数据为例的说明中,调查问卷的长度减少了一半,但仍保持了高水平的 Cronbach 和 Omega 可靠性。虽然可能需要额外的步骤(例如,复制和比较预测有效性),但这种方法为用户提供了一种数据驱动的强大方法,可以显著减少员工调查的长度,这最终可以改善数据质量、减少受访者流失,并节省员工时间。

参考文献

J. B. Cabral, N. A. Luczywo 和 J. L. Zanazzi, Scikit-Criteria:集成到 Python 科学堆栈的多标准分析方法集合(2016),第 45 届阿根廷计算机与运筹学会议(45JAIIO)——第十四届阿根廷运筹学研讨会(SIO),59–66。

E. Cho 和 S. Kim, Cronbach 的α系数:知名但理解不深(2015),组织研究方法18(2), 207–230。

J. Colquitt, T. Sabey, J. Rodell 和 E. Hill, 内容验证指南:定义对应性和定义独特性的评估标准(2019),应用心理学期刊,104(10), 1243–1265。

J. Cortina, Z. Sheng, S. Keener, K. Keeler, L. Grubb, N. Schmitt, S. Tonidandel, K. Summerville, E. Heggestad 和 G. Banks, 从阿尔法到欧米伽及更远!回顾《应用心理学期刊》中心理测量的过去、现在与(可能的)未来(2020),《应用心理学期刊》, 105(12), 1351–1381。

P. Edwards, I. Roberts, M. Clarke, C. DiGuiseppi, S. Pratap, R. Wentz 和 I. Kwan, 提高邮寄问卷的响应率:系统综述(2002),《BMJ》, 324, 1–9。

M. Galesic 和 M. Bosnjak, 问卷长度对参与和响应质量指标的影响(2009),《公众意见季刊》, 73(2), 349–360。

L. Goldberg, 大五因素结构标记的发展(1992),《心理评估》, 4, 26–42。

T. Hinkin, 问卷测量开发的简要教程(1998),《组织研究方法》, 1(1), 104–121。

T. Hinkin 和 J. Tracey, 一种方差分析方法用于内容验证(1999),《组织研究方法》, 2(2), 175–186。

M. Hoerger, 互联网介导的大学研究中参与者退选与调查长度的关系:对研究设计和心理学研究中自愿参与的影响(2010),《网络心理学、行为与社会网络》, 13(6), 697–700。

B. Holtom, Y. Baruch, H. Aguinis 和 G. Ballinger, 调查响应率:趋势与有效性评估框架(2022),《人际关系》, 75(8), 1560–1584。

D. Jeong, S. Aggarwal, J. Robinson, N. Kumar, A. Spearot 和 D. Park, 详尽还是令人疲惫?关于长问卷中受访者疲劳的证据(2023),《发展经济学期刊》, 161, 1–20。

P. Levy, 《工业/组织心理学:理解工作场所》(第 3 版)(2010),Worth 出版。

D. McNeish, 感谢系数阿尔法,我们会从这里继续(2018),《心理学方法》, 23(3), 412–433。

A. Peytchev 和 E. Peytcheva, 调查长度导致的测量误差减少:分裂问卷设计方法的评估(2017),《调查研究方法》, 4(11), 361–368。

S. Porter, 提高响应率:有效的措施是什么?(2004),《机构研究新方向》, 5–21。

A. Rolstad 和 A. Rydén, 提高邮寄问卷的响应率:系统综述(2002)。《BMJ》, 324

R. Warner, 《应用统计学:从双变量到多变量技术》(第 2 版)(2013),SAGE 出版。

F. Yammarino, S. Skinner 和 T. Childers, 理解邮件调查响应行为的元分析(1991),《公众意见季刊》, 55(4), 613–639。

《垄断游戏的数据驱动策略模拟》

原文:towardsdatascience.com/a-data-driven-tactics-simulation-for-monopoly-864e7cffe508

使用数千次 MATLAB 模拟的视觉指南,帮助你在下次《垄断》游戏中占据优势

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Jake Mitchell

·发表于Towards Data Science ·阅读时间 7 分钟·2023 年 1 月 9 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由Joshua Hoehne拍摄,来自Unsplash

介绍:

在我上一篇文章的续集中,模拟垄断,我将探讨玩家的购买策略以及这些策略如何影响游戏结果。我将通过在 MATLAB 中建模游戏,然后模拟数千场游戏来寻找玩家选择中的模式。

编码游戏:

要模拟垄断游戏,你只需要模拟掷骰子的过程,并根据骰子的点数移动玩家。然后根据玩家落在什么类型的格子上应用一系列条件语句。如果玩家落在一处地产上,要么决定购买该地产,要么支付租金给所有者。如果玩家落在“前往监狱”上,将玩家的位置更改为“监狱”。游戏的这一部分在代码中非常直接,详细内容可以参考我上面链接的上一篇文章。

对我来说最令人兴奋的代码部分是涉及购买地产、建造房屋/酒店以及交易的决策。当玩家决定购买地产时,需要考虑两个因素:

  • 价格比率 — 玩家资金与地产价格的比例。比例越小,对玩家财务健康的影响越大。

  • 购买系数 — 游戏开始时分配的一个随机值。购买系数越低,玩家的购买习惯越冒险。

这两个值被输入到决策因子公式中。这个公式是一个修改过的 S 型函数,其结果在 0 和 1 之间。结果接近 0 意味着玩家在这种情况下绝不会购买该物业,而结果接近 1 则表示对玩家来说是个好交易。然后,随机数生成器产生一个在 0 和 1 之间的数字。如果这个数字小于决策因子,玩家就会购买该物业(见下方代码)。

price_ratio = player_data(turn,1)/property_data(i,2); % calculates price ratio
decision_factor = 1/(1 + exp(-1 * price_ratio + player_data(turn,3))); % calculates decision factor
if change == 1 % if buying property would result in a monopoly
  player_data(turn,3) = player_data(turn,3) + mon_weight; % increases chance of getting property
end
if rand(1) < decision_factor % if player decided to buy property
  property_data(i,11) = turn; % assignes property to new owner
  player_data(turn,1) = player_data(turn,1) - property_data(i,2); % subtracts price from owner's money
end

这两个值和相关函数在游戏中的每个决策点都适用于所有玩家。甚至还为那些可以为玩家创造垄断的物业添加了额外的激励。

游戏被模拟直到除 1 名玩家外所有玩家破产,此时游戏结束,统计数据被记录。然后一切被重置,新游戏开始。重复 1,000 次。

结果:

以下结果和分析是基于 6 人玩游戏的假设进行的。

你应该更加冒险,还是在用钱时更保守?

下图显示了你的购买策略如何影响你在游戏过程中的平均财富。随着你从 x 轴的左侧移动到右侧,购买策略从冒险转为保守。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图像由作者提供。

你可以争辩说,基于左下角较暗的点簇,冒险策略略微有优势,但差别不大。这张图不幸地显示了购买策略与成功率之间没有相关性,这让人非常失望。为了证明这与玩家数量无关,这里是 4 名玩家和 8 名玩家的相同结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4 名玩家(左)和 8 名玩家(右)。图像由作者提供。

再次根据这些图表,几乎没有证据表明更冒险的策略可以提高你的平均财富。此外,接近 0 的点积累是因为在几乎所有人都以 0 美元结束的游戏中,你会期望平均值偏向那个方向。

所以我没有理想的购买策略可以使用?

事实证明,有一种购买策略可能对玩家有利,但实际上它与对手的玩法关系更大。

下图与之前的图几乎相同,但现在 x 轴是购买系数比率,即你的系数与对手平均系数的比率。低于 1 的值表示你比对手更冒险。高于 1 的值表示你更保守。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图像由作者提供。

基于这个图表,我们可以更确定地说,相比于你的对手,更加冒险的购买策略会增加你预期的平均财富。 这是因为在 x 轴值为 0.5 到 1 之间,y 轴上的点显著增加。

我们也可以说,相比于你的对手,更保守会减少你预期的平均财富。 图表的右侧显示,较为保守的玩家几乎没有大量剩余金钱的情况。

如果我应该在购买物业时比对手更冒险,那么我应该关注哪些物业?

在 1000 场模拟游戏中,我查看了最终获胜者在第一个对手破产时所拥有的物业:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供。

x 轴仅仅是棋盘上的瓷砖位置。就像你把棋盘的 4 个边拆开并排成一行一样。颜色与标准大富翁棋盘上的物业相匹配,除了铁路用黑点表示,公共事业用灰点表示。

从这个图表来看,很明显获胜的玩家瞄准了 3 个特定的物业组。他们瞄准了浅蓝色、粉色和橙色的物业组(参见上方棋盘上的红色圆圈)。所有这些物业的拥有率都远超过 35%,其中浅蓝色物业的拥有率接近 45%。

为什么赢得比赛的玩家通常拥有这些物业?

理想的物业是那些投资回报率优良的物业。你不希望拥有那些需要大约 80 回合才能收回投资的物业。下图对此进行了完美的描述:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供。

回本回合数是通过计算物业的平均支出,包括初始购买和任何后续增加的住房,然后将其除以每回合的平均租金收入,以找到收回投资所需的平均回合数。

赢得比赛的玩家最有可能拥有的物业通常位于图表的底部,这意味着收回投资所需的时间较少,因此赚取利润的时间更多。下图展示了这些赢家如何真正重视具有优良投资回报率的物业。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供。

浅蓝色、粉色和橙色的物业显然是棋盘上的最佳选择。这一点很重要,因为你不仅要比对手更冒险,还要将这些风险集中在这 3 组物业上。

可以给这种风险水平分配什么量化值?

我追踪了模拟游戏中所有 1,000 名赢家的财富,并将每次掷骰子的金额平均化,制作了这个图示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供。

平均赢家在 6 人游戏中花钱购买属性直到手中剩下 750 到 800 到 800 800之间。 这应该在大约 60–70 次掷骰子的过程中完成,或者在所有玩家之间大约 10 个完整周期。

一旦平均赢家的金额达到了起始金额的近 3 倍,他们就开始重新投资于那些玩家破产后变得可用的属性。 他们此时也开始专注于购买房屋和酒店。

结论:

  1. 仅仅以冒险的方式玩是不够的,你还应该尝试比你的对手更冒险。至少,要匹配对手的游戏风格。

  2. 你的购买策略应该围绕尝试获取浅蓝色、粉色和橙色属性。

  3. 目标是游戏早期花费大约一半的起始金额用于购买属性。

感谢你花时间阅读我的文章!如果你对这种内容感兴趣,我推荐你阅读我的其他棋盘游戏模拟文章,包括教机器玩四连棋模拟曼卡拉

一个关于作物产量和价格预测的数据科学课程项目,我至今不感到羞愧

原文:towardsdatascience.com/a-data-science-course-project-about-crop-yield-and-price-prediction-im-still-not-ashamed-of-75712dc8696f?source=collection_archive---------0-----------------------#2023-12-28

即便从一位经验丰富的数据科学家的角度来看

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 米哈伊尔·萨拉法诺夫

·

关注 发表在 Towards Data Science ·12 分钟阅读·2023 年 12 月 28 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

预览图(作者提供)

你好,亲爱的读者!在这些圣诞假期期间,我感到对过去的学生岁月有些怀念。因此,我决定写一篇关于一个学生项目的文章,这个项目是在差不多四年前作为 ITMO 大学硕士课程“多变量数据分析方法与模型”的项目完成的。

免责声明: 我决定写这篇文章有两个原因:

  1. 分享一种组织大学学习的有效方法(至少对我来说);

  2. 向刚开始学习编程和/或统计学的人们提供灵感,让他们尝试和实验他们的宠物项目或课程项目,因为有时候这些项目对许多人来说是难忘且出乎意料的愉快

文章以提示格式提到了一些我在课程项目中能够应用的良好实践。

故事的开端

因此,在课程开始时,我们被告知学生可以自组 2–3 人的团队,并提出一个课程项目,我们将在课程结束时进行展示。在学习过程中(大约 5 个月),我们将向讲师做中期汇报。这样,教授们可以看到进展如何(或没有进展)。

之后,我立即和我的伙伴们:EgorCamilo 组成了团队(因为我们知道一起玩乐很有趣),然后开始思考主题…

选择主题

我建议选择

  1. 一个足够大的主题,以便我们可以独立地在不同部分上工作

  2. 与我们兴趣接近的领域(我对地理信息分析感兴趣,我的同事对经济学感兴趣)

所以,这就是…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1. 选择的主题(作者提供的图像)

Camilo 还想尝试制作可视化的仪表板(使用 PowerBI),但几乎任何任务都适合这种愿望。

提示 1:选择一个你(和你的同事)会充满热情的主题。它可能不是一个非常流行的项目,但你会享受在“晚上”做这件事的过程

主要思想是什么

课程包含了大量的主题,每个主题都是统计分析方法的集合。我们决定尝试以尽可能多的不同方式预测产量和作物价格,然后使用一些统计方法对预测结果进行集成。这让我们能够在实践中尝试课程中讨论的大多数方法。

此外,时空数据确实是多维的——这与课程的主要主题非常契合。

剧透:我们都得了 5 分中的 5 分

研究(& 数据来源)

我们从文献回顾开始,以准确了解作物产量和作物价格的预测方法。我们还想了解什么样的预测误差可以被认为是令人满意的。

我不会在这篇文章中引用这次评审得到的论文。我只是提到,我们决定使用以下指标和阈值来评估解决方案的质量(无论是作物产量还是作物价格):

可接受的性能:平均绝对百分比误差 (MAPE) 对于一个相当好的预测应不超过 10%

提示 2:在启动你的项目(无论是工作还是学习期间)之前,先回顾一下当代的解决方案。也许你现在关注的问题已经有人解决过了。

提示 3:在开始开发之前,确定你将使用什么指标来评估解决方案。记住,你无法改进你无法衡量的东西。

回到研究中,我们确定了以下数据来源(链接截至 2023 年 12 月 28 日为最新):

为什么选择这些来源? — 我们假设作物的价格将取决于生产的产品数量。在农业中,生产数量取决于天气条件。

该模型用于:

  • 小麦、稻米、玉米和大麦的产量;

  • 国家:德国、法国、意大利、罗马尼亚、波兰、奥地利、荷兰、瑞士、西班牙和捷克共和国。

气候数据预处理;

因此,我们从一个假设开始:“小麦、稻米、玉米和大麦的产量取决于上半年(至 6 月 30 日)的天气条件”(图 2);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2. 产量预测特征生成(以活跃温度之和为例)(图像由作者提供)

从欧洲航天局网站获得的源档案包含 netCDF 文件。这些文件包含以下参数的每日字段:

  • 平均日均气温,℃;

  • 每日最低气温,℃;

  • 最高日均气温,℃;

  • 气压,HPa;

  • 降水量,mm;

基于初步字段,计算了每年上半年的以下参数:

  • 上半年总降雨量,mm(见动画);

  • 上半年降水天数,天;

  • 平均气压,hpa;

  • 上半年最高日均气温,℃;

  • 上半年最低日均气温,℃;

  • 10 摄氏度以上的活跃温度之和,℃(见图 3)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

动画。上半年的降水量,毫米。图表顶部列出了年份(由作者提供)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3. 1950 年上半年活跃温度之和,摄氏度(图像由作者提供)

因此,我们获得了整个欧洲地区的矩阵,为未来的模型计算了特征。读者可能会注意到,我计算了一个参数,即“10 摄氏度以上的活跃温度之和”。这是生态学和植物学中非常流行的一个参数,有助于确定不同物种(主要是植物)的温度最佳值,例如 “作为确定‘S̆ampion’和‘Ligol’苹果品种最佳收获日期的方法的活跃温度之和”)

提示 4:如果你在该领域拥有专业知识(与数据科学无关),确保在项目中加以利用——展示你不仅在进行“拟合预测”,而且在调整和改进领域特定的方法

下一步是按国家聚合信息。分别从气象参数矩阵中提取每个国家的值(图 4)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4. 含有国家边界的矩阵(图像由作者提供)

我想指出,这个策略是有道理的(图 5):例如,图片显示对西班牙而言,小麦产量几乎不受活跃温度之和的影响。然而,对于捷克共和国,温暖的上半年更可能导致较低的产量。因此,为每个国家单独建模是一个好主意。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5. 小麦产量(吨/公顷)与活跃温度之和的依赖关系(图像由作者提供)

并非所有国家的领土都适合农业。因此,有必要仅从特定像素中聚合信息。为了考虑农业用地的位置,准备了以下矩阵(图 6)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6. 土地利用矩阵(图像由作者提供)

1. 讲座主题为:单变量统计检验

所以,我们的数据已经准备好了。然而,农业是一个非常复杂的行业,每年、每十年都有显著改进。限制模型的训练样本可能是有意义的。为此,我们使用了累计和方法(图 7):

累积和方法: 对样本中的每一个数字,依次将后续数字累加。也就是说,如果样本仅包含三年:1950、1951 和 1952,那么 1950 年的数值将在 Y 轴上绘制为 1950,而 1951 将显示 1950 和 1951 的和,依此类推。

  • 如果线的形状接近直线且没有断裂,样本是均匀的

  • 如果线的形状有断裂,样本将基于此断裂分为两部分

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7. 法国。跨年度目标变量比较:小麦(每公顷吨数)(图像由作者提供)

如果检测到断裂,我们将两个样本比较是否属于总体(Kolmogorov-Smirnov 统计量)。如果样本在统计上显著不同,我们将使用第二部分训练预测模型。如果没有,我们将使用整个样本。

提示 5:不要害怕结合统计分析的方法(这是课程项目!)。例如,在讲座中,我们没有被告知累积和方法——主题是比较分布。然而,我之前在处理冰图时使用了这种方法来比较冰况趋势。我认为这在这里也可能有用

我在这里应该指出,我们假设过程是遍历的,因此决定以这种方式进行比较。

准备好后,我们可以开始构建统计模型了——让我们来看看最有趣的部分吧!

2. 讲座主题是:多元回归

以下特征被纳入模型:

  • 总降雨量;

  • 降水天数;

  • 高于 10 ℃ 的活跃温度之和;

  • 平均压力;

  • 最低气温 ℃。

目标变量:小麦稻米玉米大麦

验证年份:2008–2018 每个国家

让我们继续查看可视化,以使其更清晰。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8. 基于初始化模型,为每个国家生成的特定年份预测表面(图像由作者提供)

这里是图 9,显示了残差残差 = 观测值 - 估计(预测)值)来自法国和意大利的线性模型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9. 验证样本上线性回归的残差和指标的可视化(图像由作者提供)

从图表中可以看出,指标令人满意,但误差分布偏离零——这意味着模型存在系统误差。我们在下面的新模型中尝试进行修正

验证样本 MAPE 指标值:10.42%

提示 6:从最简单的模型开始(例如线性回归)。这将为你提供一个基线,以便与改进版本的模型进行比较。模型越简单越好,只要它显示出令人满意的指标

3. 本讲座的主题是:多元分布分析

我们将本讲座的材料转化为一个“分布分析”模型。假设很简单——我们分析了每年的气候参数分布以及当前年份的分布,并找到与当前年份最相似的年份,以预测与过去已知值完全相同的产量(图 10)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10. 选择年份类比的两两比较概念(图片由作者提供)

想法: 具有相似气象条件的年份,其产量也将相似

方法: 比较温度、降水量和气压分布的两两对比。预测与考虑年份最相似的年份的产量。

使用的分布:

  • 年初的温度,2 月、4 月、6 月的温度;

  • 年初的降水量,2 月、4 月、6 月的降水量;

  • 年初的气压,2 月、4 月、6 月的气压。

我们使用了 Kruskal-Wallis 检验来比较分布。为了调整 p 值,引入了多重检验修正——Bonferroni 修正。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11. 2000 年和 2018 年的气温分布(图片由作者提供)

验证样本的 MAPE 度量值:13.80%

提示 7:如果你进行多个统计检验,别忘了包括修正(例如,Bonferroni 修正)

4. 本讲座的主题是:贝叶斯网络

一次讲座集中于贝叶斯网络。因此,我们决定将这种方法适用于产量预测。我们认为每年由一组变量 A、B、C 等描述,其中 A 是描述作物产量的类别集合,B 是例如活跃温度条件的总和,以此类推。例如,A 可以取三个值:“高作物产量”、“中等作物产量”、“低作物产量”。B 和 C 及其他也相同。因此,如果我们对条件和目标变量进行分类,我们得到每年的以下描述:

  • 1950 年 — “高热量供应”,“低降水供应”,“高气压” — “高作物产量”

  • 1951 年 — “低热量供应”,“高降水供应”,“高气压” — “中等作物产量”

  • 1952 年 — “低热量供应”,“低降水供应”,“高气压” — 哪种作物产量?

该算法旨在基于三个其他类别的组合来预测产量类别:

  • 作物产量(3 个类别)— 隐藏状态 — 目标变量

  • 活跃温度总和(3 个类别)

  • 降水量(3 个类别)

  • 平均压力(3 个类别)

我们如何定义这些类别?——通过使用聚类算法!例如,确定了用于小麦产量的以下 3 个集群

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12:用于贝叶斯网络分析的小麦产量集群(图片由作者提供)

该模型的最终预测——预测集群的平均产量。

验证样本 MAPE 指标值:14.55%

8 个提示:做实验!时间序列预测的贝叶斯网络与聚类?——当然!分布的成对分析——为什么不呢?有时最大胆的方法会带来显著的改进

5. 讲座主题为:时间序列预测

当然,我们可以将目标变量作为时间序列进行预测。我们的任务是了解经典预测方法在理论和实践中的工作原理。

将这种方法付诸实践被证明是最简单的。例如,在 Python 中有几个库可以定制和应用 ARIMA 模型,例如 pmdarima

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 13:应用 ARIMA 模型预测产量时间序列。X 轴:时间索引,Y 轴:大麦产量(图片由作者提供)

验证样本 MAPE 指标值:10.41%

9 个提示:不要忘记与经典方法进行比较。一个抽象的指标不能告诉你的同事你的模型有多好,但与知名标准的比较会显示真正的性能水平

6. 讲座主题为:集成方法

所有模型建立后,我们探讨了每个模型是如何“出错”的(回忆线性回归模型的残差图——见图 9):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14:不同作物产量预测模型的残差图(图片由作者提供)

没有一个呈现的算法能突破 10%的门槛(根据 MAPE)。

使用了卡尔曼滤波器来提高预测质量(进行集成)。对于一些国家已经取得了令人满意的结果(图 15)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15:使用集成方法对不同国家的作物产量预测(图片由作者提供)

验证样本 MAPE 指标值:9.89%

10 个提示:如果有人要求我将开发的模型集成到生产服务中,我会选择集成 ARIMA 或线性回归,即使集成指标更好。然而,商业问题中的指标有时不是关键。一个独立模型有时比集成模型更好,因为它更简单,更可靠(即使错误指标稍高)

期货价格预测

最后一部分:模型(Lasso 回归),使用预测的产量值和期货特征来估计可能的价格值(图 16):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 16. 小麦期货价格预测(图片来源:作者)

验证样本上的 Mape:6.61%

为什么我仍然认为这个项目是一个好项目

故事到此为止。上面贴出了一些建议。在最后一段,我想总结最后一点,说明为什么我对这个项目感到满意。这里有三个主要方面:

  • 工作组织和主题选择——我们很好地结合了各自的优势和最佳品质,合理规划了工作流程,并作为一个团队成功准备了一个好的项目并按时交付。因此,我提升了自己的软技能;

  • 有意义的主题——我对我们所做的事情充满热情。即使我现在有几周的空闲时间做一个小项目,我也会很高兴将我目前的经验和技能应用到这样的案例研究中。所以,我对我们完成的工作感到满意;

  • 硬技能——在我们的工作中,我们尝试了新的统计方法,提高了对已有方法的理解,并提升了编程技能

好吧,我们在考试中也得了很高的分数 XD

我希望你在大学和其他地方的项目都能给你带来同样的激动。新年快乐!

此致敬礼,米哈伊尔·萨拉法诺夫

一个使用 ChatGPT 代码解释器的数据科学项目

原文:towardsdatascience.com/a-data-science-project-with-chatgpt-code-interpreter-e9beb8705dac

使用 ChatGPT 最新插件构建一个端到端的数据科学项目。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Natassha Selvaraj

·发布于Towards Data Science ·12 分钟阅读·2023 年 7 月 20 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由Firmbee.com提供,Unsplash

作为一个目前同时管理全职数据科学工作和多个自由职业项目的人,我通常是第一个尝试可能减少我周转时间的工具的人。

当 ChatGPT 在过去一周开始向订阅者推出代码解释器插件时,我迫不及待想将其融入我的数据科学项目中。

如果你还没有听说过这个工具,代码解释器是一个允许你上传文档并在 ChatGPT 界面运行 Python 程序的插件。

过去我们需要手动将数据复制粘贴到 ChatGPT 中并等待回应的时代已经过去。

借助代码解释器,你可以简单地上传数据集,让工具在几分钟内分析数据、构建机器学习模型并生成可视化。

在这篇文章中,我将向你展示如何使用代码解释器来执行一个端到端的数据科学项目。

任务——客户细分

在我以前的公司,我担任市场数据科学家。

这意味着我可以利用客户数据来提高销售——通过识别我们最盈利的用户、预测流失率,并建立应该在未来营销活动中针对的目标人群画像。

我甚至写了一篇教程关于如何用 Python 构建客户细分模型,其中我使用了一个公开的数据集来识别每个客户对电子商务公司的价值。

在本文中,我们将对相同的数据集进行客户细分。不过这一次,我们将使用 ChatGPT Code Interpreter 来帮助我们建立模型。

前提条件

我们将使用 Kaggle 的 电子商务数据集 进行这次分析。该数据集来源于 UCI 机器学习库,包括了一个基于英国的电子商务公司真实的零售交易信息。

该数据集在 Creative Commons Attribution 4.0 International (CC BY 4.0) 许可下发布。

要开始这个分析,确保你安装了 Python IDE,并且安装了 Pandas、Matplotlib 和 Seaborn 库。

最后,如果你能访问 Code Interpreter,将更容易跟随本教程。

不过,这个插件目前仅对 ChatGPT Plus 订阅用户开放,因此如果你无法访问它,你仍然可以在我的 GitHub 仓库 找到本次分析中使用的所有代码。

如果你有 ChatGPT Plus 订阅,可以观看 这个 YouTube 视频来了解如何访问 Code Interpreter。

第一步:理解数据集

在我们将数据上传到 Code Interpreter 之前,让我们先加载到 Python 中,自行查看:

import pandas as pd

df = pd.read_csv('ecommerce_dataset.csv', encoding='latin-1')
df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自作者

这个数据集包含了电子商务公司收集的交易数据。包括了所购商品、价格、购买来源和数量的信息。

注意,我们没有很多定性的信息可以使用。

如果数据集中包含了关于客户人口统计的信息、他们互动过的广告活动或他们访问过的网站,我们可以进行处方分析,并提出目标对象的推荐。

然而,这个数据集仅包含交易数据。我们可以进行的分析类型受到限制。

如前所述,我们将对该数据集进行客户细分。

不过,让我们向 Code Interpreter 请求一些关于如何分析这个数据集的想法,看看它会提出什么。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自作者

看那边!

在查看数据集后,模型的第一个建议是进行客户细分。

其他建议包括分析销售趋势随时间的变化以及识别表现最佳的产品。

在继续之前,我希望你再次查看数据框的前几行:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自作者

客户细分 是根据共享特征创建不同受众群体的过程。

例如,如果我在卖瑜伽垫,我可以创建两个客户细分——健身爱好者和关注健康的成年人。

然而,我们在这个数据框中没有那种人口统计或心理数据。由于我们只有历史交易数据可以使用,因此可用的细分技术不多。

在我之前对这个电子商务数据集的分析中,我使用了一个叫做 RFM 分析的技术来进行客户细分。

这帮助我使用有限的数据点识别了公司最有利润的客户。

让我们看看 Code Interpreter 能否提出如何进行客户细分的建议:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者提供的图像

看这!

Code Interpreter 建议我们使用 RFM 分析来识别高利润用户的细分。

让我们进一步分解这个问题。

第 2 步:Code Interpreter 解释——什么是 RFM 分析?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者提供的图像

RFM 代表最近一次购买、频率和货币价值。

最近一次购买:

使用数据集中交易信息,我们可以识别每个客户最近一次购买的时间。

最近一次购买公司的客户一个月前的利润更高,而不是一年前见过的客户。

Code Interpreter 告诉我们,我们可以通过从数据集中最近一次发票中减去每个客户的最近一次购买的日期来计算客户的最近一次购买。

频率:

频率是一个相当直接的指标——它告诉我们客户与组织做生意的频率。

Code Interpreter 告诉我们,我们可以通过简单地计算每个客户的唯一发票数量来计算它。

货币价值:

最后,客户的货币价值告诉我们他们在公司交易中花费的总金额。

第 3 步:执行 RFM 分析

在解释了 RFM 的含义后,Code Interpreter 运行了一些 Python 代码以对电子商务数据集进行 RFM 分析。以下是生成的结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者提供的图像

提示:你可以点击“显示工作”以查看 Code Interpreter 生成的代码。

注意,每个客户 ID 现在都映射到一个 RFM 分数。

Code Interpreter 还解释了这些结果的含义:它表示一个 326 的最近一次购买分数表明客户在数据集中最近的日期之前的 326 天进行了最后一次购买。

如果你不理解解释的任何概念,你可以简单地提示 Code Interpreter,让它提供更多示例或甚至一个描述该主题的视觉图。

第 4 步:客户细分

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者提供的图像

生成每个客户的 RFM 分数后,Code Interpreter 说我们现在可以使用这些分数进行客户细分。

这给我们提供了两个选项——我们可以通过根据分位数划分客户群体来手动进行分段,或者使用像 K-Means 聚类这样的无监督算法。

在决定使用哪个方法之前,让我们了解每种方法的优缺点:

What is the best way to perform this segmentation? 
What are some advantages/disadvantages of ranking over clustering 
with K-Means?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

代码解释器表示,虽然基于分位数的方法更易于实现,但没有固定的方法论,这意味着我们必须根据对业务的理解来决定每个分段的切割点。

代码解释器一针见血!

它识别出我认为的分位数基础分段方法的最大缺点——RFM 分数将作为整体来生成段。

例如,如果 Alison 的最近购买评分为 5,购买频次为 4,货币值为 2,她的总评分为11。分位数基础的方法将只考虑这个总评分(11):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

如果我们使用这种技术,我们将失去一个关键的信息。

Alison 的最近购买频率和购买频次评分很高,这意味着她购物频繁且最近有过购买。但她每次购物的花费不多。

为了最大限度地利用 Alison 作为客户,商店需要针对她提供偶尔的折扣和特别促销。Alison 的价值在于她的品牌忠诚度和频繁的店铺访问。

她无法作为高价产品的目标,因为她可能没有足够的购买力。

由于分位数基础的分段方法的这个缺点,我们继续使用K-Means 聚类

第 5 步:代码解释器执行 K-Means 聚类

K-Means 聚类是一种无监督的机器学习技术,用于将数据分成不重叠的子群体。

如果你想了解更多关于 K-Means 聚类如何工作的知识,你可以阅读这个教程。

代码解释器提到,K-Means 聚类技术的一个缺点是确定我们想要创建的子群体数量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

K-Means 聚类的 3 个簇示例(图片由作者提供)

这是因为 K-Means 聚类依赖于用户输入来决定我们想要构建的簇或受众群体的数量。

让我们看看代码解释器是否能帮助我们做出这个决定。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

模型建议了诸如肘部法、轮廓分析和间隙统计等技术。

我们继续使用肘部法

这是一种简单的技术,通过绘制模型在一系列簇(例如 1 到 10)上的误差值图,并选择曲线的肘部作为簇的数量。

这是我给代码解释器的提示:

Can we build a K-Means clustering model using the RFM scores that were 
calculated? Use the elbow method to determine the appropriate number of 
clusters.

模型生成了这张图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

模型显示“肘部”点,即其拐点,大约在 3 或 4 附近——具体位置还不明确。

Code Interpreter 正在要求我们根据对业务的了解,决定是否继续使用 3 个或 4 个聚类。

由于更多的聚类可以让我们分析更多的用户细分市场,接下来我们用 4 个聚类来建立模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

我请 Code Interpreter 给出输出数据框的一个示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

很好!

Code Interpreter 已成功将数据集中所有用户分组为4 个客户细分市场。每个客户 ID 现在都映射到一个聚类。

第 6 步:Code Interpreter 进行聚类分析

到目前为止,我们采取的所有步骤都很顺利。

Code Interpreter 已成功描述数据集,建议了分析技术,进行了 RFM 分析,甚至建立了一个机器学习模型。

然而,数据科学家的真正价值在于他们能够生成具有商业价值的洞察。

让我们看看 Code Interpreter 是否能够解释所创建的客户细分市场,并提出可能带来收入的建议。

我打算让模型可视化每个聚类的平均 RFM 值:

Can we visualize the clusters that were created? 
Let's create a separate chart for each cluster. 
Each chart should showcase the cluster's mean R, F, and M scores.

Code Interpreter 生成了这张图表以可视化每个聚类的 RFM 分数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

注意图表上近期性和频率值几乎不可见。

这是因为这些变量的尺度不同:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

注意“货币价值”列中的数据点明显高于“近期性”和“频率”分数。

我很惊讶 Code Interpreter 在我们要求其创建图表时没有指出这一点。

让我们询问模型一些改善清晰度的建议:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

好的,Code Interpreter 建议我们要么标准化数据,要么为每个指标使用单独的图表,或者创建雷达图。

让我们选择第二个选项,为每个指标创建单独的条形图:

To overcome the issue of them being on different scales, 
can we create separate bar charts for recency, frequency, and monetary value?
Each chart would display 4 clusters and 1 metric.

这是 Code Interpreter 生成的图表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

请记住,较低的近期性分数更好的,因为这意味着客户最近有过购买行为。

频率货币价值则正好相反。

我认为第 1 类是最有利可图的细分市场——它具有较低的近期性,以及较高的频率和货币价值。

让我们看看 Code Interpreter 说了什么:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

好吧,它只是读取图表并告诉我们哪些细分市场具有最佳的最近性、频率和货币价值。

让我们尝试从模型中获得更多见解:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

这表明 Cluster 2 似乎是最有利可图的细分市场。

噢哦……看起来代码解释器犯了个错误!

Cluster 1 的 RFM 评分似乎比 Cluster 2 更好。不过,当我指出这一点时,代码解释器纠正了这一遗漏:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

让我们更进一步,要求模型提出每个细分市场应该如何被针对的建议:

Based on their RFM scores alone, can you come up with some 
personalized targeting recommendations on the best way to 
reach each customer segment?

我要求模型将这些信息以表格形式呈现,以便更清晰:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

这些建议很不错。

在 RFM 方面,Cluster 0 远远是表现最差的细分市场,因此如果公司尚未失去这些客户,重新接触至关重要。

Cluster 1 是表现最好的细分市场,包含最有可能在新高端产品上消费的用户。

Cluster 2 包含购买次数购物频率都很高的个人。他们在公司的产品上花费适中,如果我们想要获得更多的收益,就需要进行追加销售。

最后,Cluster 3 的用户在最近性、频率和货币价值方面表现中等。他们比 Cluster 0 中的个人更有价值,但比 Cluster 1 和 Cluster 2 的群体收益少。

为他们提供特别优惠并获取反馈以了解如何将他们转化为高价值客户是有意义的。

这些建议很有道理,考虑到模型没有额外的数据点作为参考,也没有关于公司的背景信息,我感到很印象深刻。

使用代码解释器进行数据科学——下一步

ChatGPT 代码解释器将 GPT-4 的推理能力与分析你的文件和运行代码的能力结合起来。

这使得它成为一个强大的工具,可以在创纪录的时间内构建机器学习模型和执行数据科学工作流。

它也是学习数据科学的一个很好的工具。

如果你在进行数据科学项目但不知道如何继续或对应该构建的模型类型有疑问,代码解释器是你最好的朋友。

你可以将其用作个人数据科学导师——只需上传你正在处理的数据集,并询问应该使用什么技术进行分析。

但请记住,由于它在后台使用了 ChatGPT,代码解释器会产生幻觉和犯错,就像在本教程的“集群分析”部分一样。

因此,核实代码解释器告诉你的所有信息是很重要的,特别是如果你正在构建一个模型或进行分析并将其展示给第三方时。

本文到此为止,感谢阅读!

量化空间连续性的面向数据科学家的变异函数教程

原文:towardsdatascience.com/a-data-scientist-friendly-variogram-tutorial-for-quantifying-spatial-continuity-1d2f29dcfb51

应用在一个合成矿业数据集上,使用开源的 GSLib 和 Python

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Fouad Faraj

·发布于 Towards Data Science ·7 分钟阅读·2023 年 8 月 20 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来源:Sebastian PichlerUnsplash

介绍

变异函数用于展示空间数据的距离相关变异性。理解和建模变异函数的空间连续性很重要,因为它们被用来将点测量估算到实际的块中,广泛应用于矿石品位、石油浓度或环境污染物等领域。

尽管有开源选项可以生成变异函数,由于其复杂性,大多数用户依赖于昂贵的软件包,这些软件包抽象了许多细节。这个教程旨在简要介绍变异函数以及如何使用开源地统计学库(GSLib),它可以独立使用或与 Python 结合使用来开发变异函数。

这里在一个合成矿业数据集上开发了一个变异函数模型,但该工作流程也可用于气象应用如温度或环境应用如污染物跟踪等任何类型的空间数据。

教程要求

我们需要 GSLib,免费提供 这里 下载,以及一些最基本的、常用的 Python 库,这些库也包含在上传到 github 的完整代码中。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

变异函数基础

变异函数的一般思想是,相距较远的数据点比相距较近的数据点更有可能显著不同。数据点之间的方差随着距离的增加而增加,最终达到与数据的全局方差相等的点。

我们从空间数据集开始,可以将变异函数建模工作流程概括为以下几个步骤。首先,我们需要确定适当的变异函数搜索参数。然后识别主要和次要的连续性轴。最后,可以建模变异函数,并随后用于估算或模拟目的。每一步将在以下部分中进一步解释,并在教程中应用于数据集。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

开发变异函数模型到空间数据集的一般工作流程。图像由作者提供

变异函数建模参数:基台、范围和上限

变异函数模型由三个组成部分构成,这些部分描述了数据的不同属性:

  • 基台:变异函数模型的 Y 轴截距,表示在接近零距离处的即刻变异性或单点的随机性

  • 范围:变异函数趋于平稳后的距离,表示该距离的点不再具有空间相关性

  • 上限:建模数据的方差,一旦距离一定的点方差达到它,就不再有空间相关性

下面的变异函数示意图说明了每个模型参数。在到达范围之前,数据被认为是空间相关的。范围较长的变异函数比范围较短的更具有空间连续性。高基台变异函数表明在接近零距离处的变异性较高,这通常表明数据集更具变异性和不连续性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

示意图展示了变异函数模型如何拟合一组实验数据,突出相关的变异函数建模参数。图像由作者提供

变异函数开发

为了生成实验变异函数数据,我们需要定义对。每对由一个头和一个尾组成,间隔一定距离。我们增加距离以测试对之间的平均差异,并了解它如何随距离变化。如果我们处理的是二维数据,则在变异函数建模中有几个不同的标准搜索参数,如下所示。搜索参数带有容差,因为找到精确的 2.0000 米方向上的匹配是不太可能的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

示意图说明了二维变异函数搜索参数。图像由作者提供

确定参数后,搜索将迭代应用于所有点,以在每个滞后时段开发实验变异函数数据,如下所示对于一个点。每个滞后时段的平均变异函数被计算出来,最终达到上限或全局数据的方差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

示意图显示了从一个点生成实验变异函数数据时的所有 n 个滞后。图像由作者提供

每个延迟的计算只是所有配对的差值平方的一半,如下所示。这个变异函数值将对比延迟绘制出来以发展变异函数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

标注的变异函数方程。图像来源:作者

使用 GSLib 的 gamv 开发实验性变异函数数据

现在要使用 GSLib 的 gamv 实际计算实验性变异函数数据,我们首先需要定义搜索参数。下方是搜索参数示意图,旁边是标注的截图,指示了对应的 GSLib gamv 参数文件输入。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

示意图展示了 2D 变异函数搜索参数,旁边是 GSLib 参数文件截图。图像来源:作者

设置参数后,确保你的空间数据符合 GSLib 所需的 .dat 格式,如下所示为我们的空间铜品位数据示例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GSLib gamv 数据格式的标注记事本截图。图像来源:作者

现在要运行 GSLib 代码,你可以使用命令窗口,导航到工作目录,然后执行 gamv,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

运行 GSLib gamv 和典型返回反馈的输入行的标注截图。图像来源:作者

输出变异函数将保存在 gamv.out 文件中,数据排序如下面所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GSLib gamv 输出的标注截图,指示每一列的内容。图像来源:作者

之后你可以以任何你喜欢的方式分析输出,本教程将使用 Python。

在合成矿数据集上的应用

我们使用的合成钻孔数据集是基于真实的铜矿建模的。钻孔数据在二维空间中大约分布为 7x7 米,东向和北向以米为单位测量,每个点都有一个测量的铜品位,单位为重量百分比(wt%)。本教程中使用的所有代码和数据均可在 github 上找到。下图展示了铜品位及其在空间中的分布情况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

铜矿品位数据集的地图视图。图像来源:作者

以下 GSLib 变异函数搜索参数适用于约 7x7 米的空间数据,我们将用它们来生成我们的变异函数。这里 是一个很好的来源,用于根据空间数据确定合适的搜索参数。

  • 延迟分隔距离:7 米,大致为数据间隔

  • 延迟容差:3.5 米,经验法则是将延迟容差设为间隔的一半

  • 延迟数:30,大部分区域覆盖在 30*7 米(210 米)中

  • 方位容差:22.5 度,可能略小如 15 度,但我们希望确保能获得足够多的配对

  • 带宽:10 米,可能略小如 7.5 米,但我们希望确保能获得足够多的配对

  • 变异函数类型:半变异函数

确定最小和最大不连续性的主方向

由于我们在 2D 环境中工作,我们需要识别两个正交方向,即高和低连续性,通常称为主轴和次轴。确定主方向的方法有多种,这里介绍的最基本方法是生成多个等间隔的变差函数对,找出包涵最高和最低空间连续性的两个方向。其他有用的方法包括生成变差函数图,这可以直观地显示空间连续性,GSLib 提供了用于变差函数图的软件包,并且可以在这里找到使用指南。

下面我们看到在 15 度间隔下开发的变差函数对,可以清楚地看出,方位角为 000°和 090°的变差函数分别具有最高和最低的连续性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

六个正交对的实验变差函数数据突出显示了 000°和 090°方位角观察到的高和低连续性。图像来源:作者

我们可以快速检查 000°和 090°方位角方向的品位图,看看它们是否合理地对应于最连续和最不连续的方向。正如下面重新生成的图所示,最小连续性在东西方向是合理的,因为在该方向上品位从最高值过渡到最低值,而南北方向的品位变化不大。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

铜品位图,突出显示了东西方向的低连续性和南北方向的高连续性及其相应的方位角。图像来源:作者

变差函数建模

000°和 090°方位角的实验变差函数数据使用指数模型进行建模。测试了不同的“豆子”值、范围和部分高程,直到获得了定性较好的拟合。使用嵌套结构和多模型,或探索如在矿业中常用的球形模型等不同模型,可能会获得对实验数据更好的拟合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

次轴和主轴的指数变差函数模型,参数已表格化。图像来源:作者

现在,变差函数模型可以用于对点数据进行任何类型的估算或模拟。GSLib 也提供了运行常用普通克里金估算或序贯高斯模拟所需的软件包。

结论

理解和建模空间连续性具有挑战性,特别是对于没有地质统计背景的人。这里我们提供了变差函数的简要介绍和使用开源软件生成变差函数模型的快速教程。许多用户目前使用昂贵的软件,因为空间连续性分析的编码经验总体不足,开源软件如 GSLib 并不广为人知。

此外,许多商业软件会抽象掉变差函数的重要细节,这些细节可能会影响所开发的模型。各种地质统计学文本都强调不要将变差函数建模视为黑箱,并且花费的精力去理解数据中的情况对于生成稳健的变差函数模型非常有用。

数据科学家探索性数据分析的必备指南

原文:towardsdatascience.com/a-data-scientists-essential-guide-to-exploratory-data-analysis-25637eee0cf6?source=collection_archive---------0-----------------------#2023-05-30

实操教程

理解数据的最佳实践、技术和工具

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Miriam Santos

·

关注 发表在 Towards Data Science ·11 分钟阅读·2023 年 5 月 30 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果没有正确的方法和工具,EDA 可能会感觉像是无尽而压倒性的任务。 图片来源:Devon DivineUnsplash

介绍

探索性数据分析(EDA)是在每个数据科学项目开始时必须进行的最重要任务。

从本质上讲,它涉及彻底检查和描述你的数据,以发现其潜在的特征、可能的异常以及隐藏的模式关系

对数据的理解将最终指导你完成机器学习流程中的后续步骤,从数据预处理到模型构建和结果分析。

EDA 过程基本上包含三个主要任务:

  • 第一步: 数据集概览和描述统计

  • 第二步: 特征评估和可视化,以及

  • 第三步: 数据质量评估

正如你可能猜到的,每个任务都可能涉及相当全面的分析,这很容易让你像疯子一样切片、打印和绘制 pandas 数据框

除非你选择了正确的工具。

在这篇文章中,我们将深入探讨 有效 EDA 过程的每一步,并讨论为什么你应该将 [ydata-profiling](https://github.com/ydataai/ydata-profiling) 变成你掌握它的一站式商店。

为了展示最佳实践和调查见解,我们将使用 成人收入数据集,该数据集在 Kaggle 或 UCI 仓库中免费提供(许可证:CC0: 公共领域)。

第一步:数据概览和描述统计

当我们第一次接触一个未知的数据集时,脑海中会立刻冒出一个自动的想法:我在处理什么?

我们需要对数据有深入的理解,以便在未来的机器学习任务中高效处理它。

作为经验法则,我们通常开始时会相对数据的观察数、特征的数量和类型、总体缺失率以及重复观察的百分比来描述数据。

通过一些 pandas 操作和合适的备忘单,我们最终可以用一些简短的代码片段打印出上述信息:

数据集概览:成人普查数据集。观察数、特征、特征类型、重复行和缺失值。作者提供的片段。

总的来说,输出格式不是理想的……如果你对 pandas 熟悉,你也会知道标准的操作模式是从 df.describe() 开始 EDA 过程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

成人数据集:通过 df.describe() 展示的主要统计数据。作者提供的图像。

然而,这仅仅考虑了数值特征。我们可以使用 df.describe(include='object') 打印出一些关于分类特征(计数、唯一、模式、频率)的额外信息,但简单检查现有类别需要一些更详细的操作:

数据集概览:成人普查数据集。打印每个分类特征的现有类别及其相应的频率。作者提供的片段。

然而,我们可以这样做 —— 并且猜猜看,所有后续的 EDA 任务! —— 仅用一行代码,使用 [ydata-profiling](https://github.com/ydataai/ydata-profiling)

成人普查数据集的剖析报告,使用 ydata-profiling。摘录来源:作者。

上面的代码生成了一个完整的数据剖析报告,我们可以利用这个报告进一步推进我们的 EDA 过程,而无需编写更多的代码!

我们将在接下来的部分中详细介绍报告的各个部分。关于数据的整体特征,我们寻找的所有信息都包含在概览部分

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ydata-profiling: 数据概况报告 — 数据集概览。图片来源:作者。

我们可以看到我们的数据集包含了15 个特征和 32561 个观测值,其中有 23 条重复记录,整体缺失率为 0.9%

此外,数据集已被正确识别为表格数据集,且相当异质,呈现了数值特征和分类特征。对于时间序列数据,它具有时间依赖性并呈现不同类型的模式,ydata-profiling会在报告中加入其他统计信息和分析。

我们可以进一步检查原始数据和现有的重复记录,以对特征有一个总体的了解,然后再进行更复杂的分析:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ydata-profiling: 数据概况报告 — 样本预览。图片来源:作者。

从数据样本的简要预览中,我们可以立即看出,尽管数据集整体缺失数据的百分比较低,某些特征可能受到影响比其他特征更多。我们还可以识别出一些特征有相当数量的类别以及零值特征(或至少有大量的零)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ydata-profiling: 数据概况报告 — 重复行预览。图片来源:作者。

关于重复的行,考虑到大多数特征表示的是多个可能“同时适用”的类别,发现“重复”的观测值并不奇怪。

但也许**“数据异味”是这些观测值共享相同的age值(这是可能的),以及完全相同的fnlwgt,考虑到呈现的值,这似乎更难以置信。因此需要进一步的分析,但我们很可能在之后需要去除这些重复数据**。

总体而言,数据概览可能是一个简单的分析,但却极具影响力,因为它将帮助我们定义接下来的任务。

步骤 2:特征评估与可视化

在查看总体数据描述符后,我们需要深入分析数据集的特征,以获取有关其个别属性的见解——单变量分析——以及它们的交互和关系——多变量分析

这两个任务都极度依赖于调查适当的统计数据和可视化,这些统计数据和可视化需要针对特征类型(例如,数值型、类别型)和行为(例如,交互、相关性)进行量身定制

让我们来看看每个任务的最佳实践。

单变量分析

分析每个特征的个别特征至关重要,因为这将帮助我们决定它们对分析的相关性以及可能需要的准备数据类型以实现最佳结果。

例如,我们可能会发现极端的值,这可能指示不一致性异常值。我们可能需要标准化 数值 数据或根据现有类别的数量执行类别特征的独热编码。或者我们可能需要进行额外的数据准备,以处理偏移或偏斜的数值特征,如果我们打算使用的机器学习算法期望特定的分布(通常是高斯分布)。

因此,最佳实践要求对单个属性进行彻底调查,例如描述性统计和数据分布。

这些将突显出后续任务的必要性,如异常值移除、标准化、标签编码、数据填充、数据增强和其他类型的预处理。

让我们更详细地调查种族资本收益我们能立即发现什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ydata-profiling: Profiling Report(种族和资本收益)。作者提供的图像。

****资本收益****的评估很简单:**鉴于数据分布,我们可能会质疑该特征是否对我们的分析有任何价值,因为 91.7%的值为“0”。

分析 **种族** 稍微复杂一些:

其他种族(除了白人)明显被低估。这带来了两个主要问题:

  • 一个是机器学习算法通常忽略较少表示的概念,这被称为小样本问题,这会导致学习性能降低;

  • 另一个问题有些衍生于此:由于我们处理的是一个敏感特征,这种“忽略倾向”可能会带来直接与偏见公平性问题**相关的后果。这是我们绝对不希望渗入到模型中的。

鉴于此,也许我们应该考虑基于不足代表的类别进行数据增强,以及考虑模型评估中的公平性指标,以检查与race值相关的性能差异。

我们将在讨论数据质量最佳实践(第 3 步)时进一步详细说明需要解决的其他数据特征。 这个例子仅仅展示了通过评估每个特征的属性我们可以获得多少见解。

最后,请注意,如前所述,不同的特征类型需要不同的统计和可视化策略:

  • 数值特征通常包含有关均值、标准差、偏度、峰度以及其他分位数统计的信息,并且最适合使用直方图绘制;

  • 分类特征通常使用众数和频率表来描述,并通过条形图进行分类分析。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ydata-profiling: Profiling Report. 所呈现的统计数据和可视化结果已根据每个特征类型进行了调整。屏幕录像:作者。

这样的详细分析使用通用的 pandas 操作会显得繁琐,但幸运的是ydata-profiling将所有这些功能集成在 ProfileReport中,方便我们使用:代码片段中没有添加额外的代码!

多变量分析

对于多变量分析,最佳实践主要集中在两种策略:分析特征之间的互动以及分析它们的相关性

分析互动

互动让我们直观地探索每对特征的行为,即一个特征的值如何与另一个特征的值相关。

例如,它们可能会展现出正向负向关系,这取决于一个值的增加是否与另一个值的增加或减少相关。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ydata-profiling: Profiling Report — Interactions. 图片来源:作者。

agehours.per.week之间的互动为例,我们可以看到大多数工作者的工作时间为标准的 40 小时。然而,也有一些“忙碌的蜜蜂”在 30 至 45 岁之间工作时间超过 40 小时(甚至达到 60 或 65 小时)。20 多岁的人则不太可能过度工作,有时可能会有较轻的工作安排。

分析相关性

与互动类似,相关性让我们 分析特征之间的关系。然而,相关性“给出了一个值”,使我们更容易确定这种关系的“强度”。

这种“强度”是通过相关系数来衡量的,可以通过数值分析(例如,检查相关矩阵)或使用热图来分析,热图使用颜色和阴影来直观突出有趣的模式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ydata-profiling: Profiling Report — Heatmap and Correlation Matrix. 屏幕录制由作者提供。

关于我们的数据集,注意educationeducation.num之间的相关性。这实际上是它们包含相同的信息education.num只是对education值的分箱。

另一个引人注目的模式是性别关系之间的相关性,尽管再次说明并不非常有信息量:查看这两个特征的值,我们会发现这些特征很可能相关,因为男性女性通常分别对应丈夫妻子

这些冗余类型的特征可以检查是否需要从分析中移除(例如,marital.status也与relationshipsex相关;native.countryrace等)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ydata-profiling: Profiling Report — Correlations. 图像由作者提供。

然而,还有其他显著的相关性,可能对我们的分析有趣。

例如,性别职业之间的相关性,或者性别每周工作小时数之间的相关性。

最终,收入与其余特征之间的相关性确实很有信息量特别是当我们试图绘制分类问题时。了解与目标类别最相关的特征有助于我们识别出最具区分性的特征,并发现可能影响模型的潜在数据泄漏者。

从热图中看,marital.statusrelationship似乎是最重要的预测变量,而fnlwgt例如,似乎对结果没有太大影响。

类似于数据描述符和可视化,交互和相关性也需要关注当前特征的类型。

换句话说,不同的组合将使用不同的相关系数进行测量。默认情况下,ydata-profilingauto模式下运行相关性分析,这意味着:

  • 数值与数值的相关性使用Spearman 秩相关系数进行测量;

  • 分类与分类的相关性使用[Cramer’s V](https://en.wikipedia.org/wiki/Cram%C3%A9r%27s_V#:~:text=In%20statistics%2C%20Cram%C3%A9r%27s%20V%20(sometimes,by%20Harald%20Cram%C3%A9r%20in%201946.)进行测量;

  • 数值与分类的相关性也使用 Cramer’s V,其中数值特征首先被离散化;

如果你想查看其他相关系数(例如,Pearson、Kendall、Phi),你可以轻松地配置报告参数

第 3 步:数据质量评估

随着我们向数据中心化的 AI 开发模式迈进,掌握可能的复杂因素对于我们数据中的出现问题至关重要。

所谓“复杂因素”是指在数据收集或处理过程中可能出现的错误,或数据固有特征,它们只是数据性质的反映。

这些包括缺失数据、不平衡数据、常量值、重复数据、高度相关冗余特征、噪声数据等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据质量问题:错误和数据固有特征。图片由作者提供。

在项目开始时发现这些数据质量问题(并在开发过程中持续监控)至关重要。

如果在模型构建阶段之前没有识别和解决这些问题,它们可能会危及整个机器学习流程以及由此得出的后续分析和结论。

如果没有自动化的过程,识别和解决这些问题的能力将完全依赖于进行探索性数据分析(EDA)的人员的个人经验和专业知识,这显然并不理想。再加上,尤其是考虑到高维数据集,这真是一个巨大的负担。即将迎来噩梦警报!

这是ydata-profiling最受欢迎的功能之一,即自动生成数据质量警报

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ydata-profiling: 数据概况报告 — 数据质量警报。图片由作者提供。

该分析报告输出至少 5 种不同类型的数据质量问题,即duplicateshigh correlationimbalancemissingzeros

事实上,我们已经在进行第 2 步时识别出了一些这些问题:race是一个高度不平衡的特征,而capital.gain主要被 0 填充。我们还看到educationeducation.num,以及relationshipsex之间存在紧密的相关性。

分析缺失数据模式

在考虑的全面警报范围中,ydata-profiling分析缺失数据模式方面尤其有用。

由于缺失数据是现实世界领域中非常常见的问题,可能会完全影响某些分类器的应用或严重偏倚其预测,另一个最佳实践是仔细分析缺失数据的百分比和我们特征可能显示的行为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ydata-profiling: 数据概况报告 — 分析缺失值。作者录屏。

从数据警报部分,我们已经知道workclassoccupationnative.country有缺失的观测值。热图进一步告诉我们occupationworkclass的缺失模式之间存在直接关系:当一个特征缺失时,另一个特征也会缺失。

关键洞察:数据分析超越了 EDA!

到目前为止,我们讨论了构成全面 EDA 过程的任务以及数据质量问题和特征的评估一个我们可以称之为数据分析的过程 — 确实是最佳实践。

然而,重要的是要澄清,数据分析 超越了 EDA。 我们通常将 EDA 定义为在开发任何类型的数据管道之前的探索性、互动性步骤,而数据分析是一个迭代过程应在每个步骤中进行 的数据预处理和模型构建过程中。

结论

高效的 EDA 奠定了成功机器学习管道的基础。

这就像对您的数据进行诊断,了解它包含的所有信息 — 其属性关系问题 — 以便您能够在后续阶段以最佳方式解决这些问题。

这也是我们灵感阶段的开始:从 EDA 中问题和假设开始产生,并计划进行分析以验证或排除这些假设。

在整篇文章中,我们涵盖了引导您进行有效 EDA 的 3 个主要基本步骤,并讨论了拥有一款顶尖工具 — ydata-profiling — 的影响,这不仅能够指引我们正确的方向,还节省了大量时间和脑力负担

我希望这份指南能帮助您掌握“数据侦探”的艺术,并且一如既往地,非常感谢您的反馈、问题和建议。告诉我您希望我写些什么其他主题,或者更好的是,来数据中心 AI 社区与我见面,让我们合作吧!

关于我

博士,机器学习研究员,教育者,数据倡导者,以及全能型人才。在 Medium 上,我撰写关于数据中心 AI 和数据质量的文章,教育数据科学与机器学习社区如何将不完善的数据转化为智能数据。

数据中心 AI 社区 | GitHub | Google Scholar | LinkedIn

数据科学家提高 Python 代码质量的指南

原文:towardsdatascience.com/a-data-scientists-guide-to-improving-python-code-quality-21660ecea97d

编写符合生产标准的 Python 代码的工具和包

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Egor Howell

·发布于 Towards Data Science ·阅读时间 6 分钟·2023 年 8 月 3 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Christopher Gower 提供的照片,来源于 Unsplash

背景

如今,数据科学家在部署机器学习模型的生产环节中变得越来越重要。这意味着我们需要像其他软件工程师一样,能够编写符合生产标准的 Python 代码。在这篇文章中,我想介绍一些可以帮助你为下一个模型编写符合生产标准代码的关键工具和包。

代码检查工具

概述

代码检查工具 是一种捕捉小错误、格式错误和可能导致运行时问题及意外输出的奇怪设计模式的工具。

在 Python 中,我们有 PEP8,它幸运地为我们提供了一个全局的代码风格指南。虽然 Python 中存在许多符合 PEP8 的代码检查工具,但我个人的偏好是 flake8

Flake8

Flake8 实际上是 PyflakespycodestyleMcCabe 代码检查包的组合。它用于检查错误、代码异味 并强制执行 PEP8 标准。

要安装 flake8 使用 pip install flake8,并且你可以通过 flake8 <file_name.py> 使用它。真的就是这么简单!

例如,假设我们在一个文件 flake8_example.py 中有一个函数 add_numbers

def add_numbers(a,b):
    result = a+  b
    return result

print(add_numbers(5, 10))

要对这个文件调用 flake8,我们执行 flake8 flake8_example.py,输出结果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者提供的照片。

Flake8 发现了几个样式错误,我们应该修正这些错误以符合 PEP8。

有关 flake8 的更多信息以及如何根据需要自定义它,请参见此处

代码格式化工具

概述

Linters 通常只是告诉你代码中有什么问题,但不会主动为你修复。格式化工具会修复你的代码,帮助加快工作流程,确保代码遵循风格指南,并使其对其他人更具可读性。

isort

isort 包PEP8中指定的顺序对导入进行排序。可以通过pip install isort轻松安装。

导入应写在单独的行上:

# Correct
import pandas
import numpy 

# Incorrect 
import pandas, numpy

它们还应按以下顺序分组:

  • 标准库(例如sys

  • 相关第三方(例如pandas

  • 本地(例如,repo 中其他文件的函数)

# Correct
import math
import os
import sys

import pandas as pd

# Incorrect
import math
import os
import pandas as pd
import sys

最后,来自包的导入需要按字母顺序排列:

# Correct
from collections import Counter, defaultdict

# Incorrect
from collections import defaultdict, Counter

以下命令展示了如何从终端运行 isort:

# Format imports in every file
isort .

# Format in specific file
isort <file_name.py>

有关 isort 的更多信息,请查看他们的网站此处

Black

Black 根据其自己的风格指南重新格式化代码,该指南是PEP8的一个子集。有关当前 black 遵循的格式化指南,请参见此处

要安装 black,只需运行pip install black,然后在文件上调用black <file_name.py>

以下是一个名为black_example.py的文件示例:

# Before running black 
def   add_numbers  (  x, y ) :

    result= x  +y
    return result

然后我们运行black black_example.py

# After running black
def add_numbers(x, y):
    result = x + y
    return result

终端中的输出也将是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者拍摄。

有关更多信息以及如何自定义你的 black 格式化工具,请参见他们的主页此处

单元测试

概述

单元测试提供了一个结构化的格式,以确保你的代码按照预期执行。它们测试代码的小部分,例如函数和类,以验证它们是否按预期行为。测试设置相当简单,可以节省你大量的调试时间,因此对数据科学家非常推荐。

PyTest

Pytest是最受欢迎的单元测试框架,与 Python 的本地单元测试包一起使用,可以通过pip install pytest轻松安装。

要使用 pytest,我们首先需要一个可以测试的函数。让我们回到我们的add_numbers函数,该函数将位于名为pytest_example.py的文件中:

def add_numbers(x, y):
    result = x + y
    return result

现在在一个名为test_pytest_example.py的单独文件中,我们编写相应函数的单元测试:

from pytest_example import add_numbers

def test_add_numbers():
  assert add_numbers(5, 13) == 18

要运行此测试,我们只需执行pytest test_pytest_example.py

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者拍摄。

如你所见,我们的测试通过了!

如果你想要更详细和全面的 pytest 和单元测试教程,请查看我之前关于这个主题的文章:

## 调试变得简单:使用 Pytest 跟踪和修复 Python 代码

初学者的单元测试教程及如何在 Pytest 中进行单元测试

towardsdatascience.com

类型检查器

概述

最后一个主题是类型系统,不是键盘类型!Python 是动态语言,这意味着它不强制变量的严格类型。变量x在同一代码中可以是整数也可以是字符串。然而,这可能会导致意外的错误。因此,有工具可以使 Python 更像是静态类型语言。

Mypy

我们可以通过使用包mypy来确保我们的变量和函数具有正确的预期类型。这个包检查输入和输出是否符合所需的类型。

例如,对于add_numbers函数,我们期望输入和输出都为float。这可以在函数中指定:

def add_numbers(x: float, y: float) -> float:
    result = x + y
    return result

print(add_numbers(10, 10))
print(add_numbers("10", "10"))

现在,假设我们将以下参数传递给函数并print结果:

print(add_numbers(10, 10))
print(add_numbers("10", "10"))

输出会如下所示:

print(add_numbers(10, 10))
>>> 20

print(add_numbers("10", "10"))
>>> 1010

我们看到第一个输出符合我们的预期,但第二个则不符合。这是因为我们传入了两个str类型,然而 Python 解释器没有报错,因为 Python 是动态语言。

我们可以使用 mypy 来捕获这些错误,避免下游出现任何 bug。为此,调用 mypy 命令为mypy <file_name.py>。所以,对于这个例子,我们执行mypy mypy_example.py

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者拍摄的照片。

如我们所见,mypy 发现第 6 行中指定的参数是str,而函数期望的是float

如果你想要更详细和全面的 mypy 和类型教程,请查看我之前关于这个主题的文章:

## 数据科学家的 Python 类型指南:提升代码清晰度

类型的重要性及其在 Python 中的应用

towardsdatascience.com

什么是需求?

总结一下,你可能会想,为什么我们需要这些工具?这些工具的最终目的是让你的 Python 代码具有:

  • 可读性: 你的代码变得对其他开发者和数据科学家更加直观和易读。这有助于更好的协作和更快的交付时间。

  • 鲁棒性: 代码将更不容易出错,并且引入错误的难度也更大,特别是使用单元测试时。

  • 更容易识别错误: 通过使用代码检查工具和测试,我们可以检测代码中的任何不一致和异常结果,从而降低在生产环境中出现代码错误的风险。

你可以在我的 GitHub 上查看本文中使用的完整代码:

[## Medium-Articles/Software Engineering /code-quality-example at main · egorhowell/Medium-Articles

我在我的 Medium 博客/文章中使用的代码。通过创建一个帐户来为 egorhowell/Medium-Articles 的开发做出贡献…

github.com](https://github.com/egorhowell/Medium-Articles/tree/main/Software%20Engineering%20/code-quality-example?source=post_page-----21660ecea97d--------------------------------)

参考文献与进一步阅读

另一个话题!

我有一个免费的通讯, Dishing the Data,在其中我每周分享成为更好数据科学家的小贴士。没有“空话”或“点击诱饵”,只有来自实践中的数据科学家的纯粹可操作的见解。

[## Dishing The Data | Egor Howell | Substack

如何成为更好的数据科学家。点击阅读《Dishing The Data》,作者 Egor Howell,Substack 发表的…

newsletter.egorhowell.com](https://newsletter.egorhowell.com/?source=post_page-----21660ecea97d--------------------------------)

与我联系!

Makefile 教程

原文:towardsdatascience.com/a-data-scientists-guide-to-make-and-makefiles-1595f39e0704

如何使用 Make 和 Makefiles 优化你的机器学习管道

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Egor Howell

·发表于 Towards Data Science ·5 分钟阅读·2023 年 8 月 11 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Nubelson Fernandes 提供,来源于 Unsplash

背景

现在数据科学家需要编写生产代码来部署他们的机器学习算法。因此,我们需要了解软件工程标准和方法,以确保我们的模型稳健有效地部署。其中一个在开发者社区中非常知名的工具是 make。这是一个强大的 Linux 命令,开发者早已知晓,在这篇文章中我想展示它如何用于构建高效的机器学习管道。

什么是 Make?

make 是一个终端命令/可执行文件,类似于 lscd,存在于大多数类 UNIX 操作系统中,如 MacOS 和 Linux。

make 的使用是为了简化并将工作流程分解为逻辑上的 shell 命令组。

它被开发者广泛使用,也被数据科学家采纳,因为它简化了机器学习管道并使生产部署更具稳健性。

为什么要使用 Make 进行数据科学?

make 是一个强大的工具,数据科学家应该利用它,原因如下:

  • 自动化机器学习环境的设置

  • 更清晰的端到端管道文档

  • 更容易测试具有不同参数的模型

  • 项目的结构和执行显而易见

什么是 Makefile?

Makefile 基本上是 make 命令读取和执行的内容。它有三个组成部分:

  • 目标这些是你试图构建的文件,或者如果你只是执行命令,你会有一个 PHONY 目标。

  • 依赖: 在执行此目标之前需要运行的源文件。

  • 命令: 顾名思义,这些是生成目标的步骤列表。

基本示例

让我们通过一个非常简单的示例来使这个理论变得具体。

以下是一个Makefile,它有目标hello,并使用echo命令将'Hello World'打印到屏幕上,并且没有依赖关系:

# Define our target as PHONY as it does not generate files
.PHONY: hello

# Define our target
hello:
 echo "Hello World!"

我们可以通过在终端中简单地执行make hello来运行它,这将产生以下输出:

echo "Hello World!"
Hello World!

它本质上只是列出了并执行了命令。这就是make的本质,没有什么太复杂的。

注意我们将目标hello设置为.PHONY,因为它不会生成文件。这就是.PHONY的意义,只用于不产生文件的目标。

如果我们不想将echo命令输出到屏幕,可以在命令前添加@符号。

我们可以在Makefile中添加另一个目标来生成一个文件:

# Define some targets as PHONY as they do not generate files
.PHONY: hello

# Define our target
hello:
 echo "Hello World!"

# Define our target to generate a file
data.csv:
 touch data.csv

要运行data.csv目标,我们执行make data.csv

touch data.csv

你应该会在本地目录中看到一个data.csv文件。

机器学习管道

管道概述

以下是我们将使用Makefilemake构建的机器学习项目的示例管道。它基于一个先前的项目,在该项目中,我基于ARIMA模型预测了美国航空公司乘客的数量。你可以在这里查看更多内容:

## 如何使用 ARIMA 进行预测

ARIMA 预测模型介绍及其使用方法

[towardsdatascience.com 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图示由作者提供。

因此,read_clean_data.py文件将加载并使时间序列数据平稳model.py文件将为清理后的数据拟合 ARIMA 模型。最后,analysis.py文件将计算我们预测的性能。

另一个关键点是文件之间的依赖关系。除非model.py已被执行,否则analysis.py无法运行。这就是Makefile中的依赖关系变得有用的地方。

演练

以下是我们的第一个文件read_clean_data.py

数据来自 Kaggle并带有 CC0 许可证。

GitHub Gist by author.

在这里,我们读取美国航空数据,通过差分使其平稳,并进行Box-Cox 变换,并将其保存到本地目录中的一个名为clean_data.csv的文件中。

然后,我们有了model.py文件:

GitHub Gist by author.

最后,我们有了分析文件analysis.py

GitHub Gist by author.

我们可以为我们的三阶段管道编写以下Makefile

.PHONY: all read_clean_data model analysis

all: analysis

read_clean_data:
 python read_clean_data.py

model: read_clean_data
 python model.py

analysis: model
 python analysis.py

.PHONY: clean
clean:
 rm -f clean_data.csv lam.pickle train_data.csv test_data.csv forecasts.csv

注意我们如何声明每一步对前一步的依赖,以确保我们拥有执行每一步所需的正确文件。我们还添加了 clean 目标,以便在需要时删除生成的文件。

整个管道可以通过 make all 命令运行,输出将如下所示:

Output:

python read_clean_data.py
python model.py
python analysis.py

并将生成以下图表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者用 Python 生成的图表。

如你所见,Makefile 文件管道工作正常,预测效果也相当不错!

总结与进一步思考

就这些!希望你喜欢这篇关于 makeMakefile 的简短教程。当然,你可以用这些工具做更多复杂和高级的事情,但这篇文章可以作为你的起点。需要记住的关键点是:

  • *make* 是一个 UNIX 命令,用于自动化某些工作流的运行

  • 一个 *Makefile* 允许我们编写多个 *make* 命令和序列来自动化机器学习管道

本文中使用的完整代码可以在我的 GitHub 上找到:

[## Medium-Articles/Software Engineering /make-example at main · egorhowell/Medium-Articles]

我在我的中等博客/文章中使用的代码。通过在…

github.com

参考文献与进一步阅读

另一件事!

我有一个免费的通讯,Dishing the Data,在这里我每周分享成为更好数据科学家的小贴士。没有“废话”或“点击诱饵”,只有来自实践数据科学家的纯粹可操作的见解。

[## Dishing The Data | Egor Howell | Substack]

如何成为更好的数据科学家。点击阅读由 Egor Howell 发布的 Dishing The Data,Substack 版刊…

newsletter.egorhowell.com](https://newsletter.egorhowell.com/?source=post_page-----1595f39e0704--------------------------------)

与我联系!

数据科学家的 Python 类型指南:提升代码清晰度

原文:towardsdatascience.com/a-data-scientists-guide-to-python-typing-boosting-code-clarity-194371b4ef05

类型的重要性以及如何在 Python 中实现

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Egor Howell

·发表于Towards Data Science ·阅读时长 4 分钟·2023 年 7 月 31 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由Pankaj Patel拍摄,来源于Unsplash

什么是‘类型’?

这里的类型不是指物理上触碰键盘,而是我们 Python 代码中变量(和函数)所采用的数据类型!

Python 本质上是动态语言,这意味着没有正式的要求来声明变量的数据类型。例如,一个变量可能在开始时是整数,但在代码的其他地方变成字符串。这种灵活性常常会导致在运行时出现难以调试的错误。

其他语言是静态类型的,这意味着它们的变量类型需要明确声明,并且在运行时不能更改。如果一个变量被声明为整数,它在程序运行期间必须始终是整数。静态类型语言的例子有Fortran和 C++。

然而,近年来 Python 已经开发了对类型的支持,现在它已成为行业标准。对于需要将稳健的机器学习模型投入生产的数据科学家尤为重要。

在这篇文章中,我想带你了解 Python 中的基本语法和类型过程,以及如何使用mypy包,这使我们能够无缝地检查代码的类型。

PEP 484所示,实际上推荐使用类型注解。

基本示例

让我们通过一个简单的示例来解释在 Python 中进行类型检查的必要性。下面我们有一个将两个数字相加的函数,巧妙地命名为 adding_two_numbers

作者的 GitHub Gist。

两个 print 语句的输出是什么?首先是:

print(adding_two_numbers(5, 5))

>>> 10

这是预期中的情况。然而,第二个 print 语句的输出是:

print(adding_two_numbers("5", "5"))

>>> 55

尽管这个结果在‘技术上’是正确的,但显然不是我们在这个特定函数中试图实现的目标。

为了帮助解决这个问题,我们可以为函数添加 类型注解 以明确我们需要传递的参数类型和预期的 返回类型

作者的 GitHub Gist。

在上面的示例中,我们明确了 num1num2 应该 都是整数,预期的输出 应该 也是整数。

重要的是要提到,这些真的只是‘提示’,如果你传入一个字符串,在运行程序时仍然不会出现运行时错误,因为 Python 本质上是动态类型的。

所以,声明类型的通用语法是:

function (variable: variable_type) -> return_type

此外,如果你不确定对象或变量的数据类型,你可以通过调用 type() 函数来检查:

print(type(1))

>>> <class 'int'>

类型模块

如果你想让特定函数返回一个 list,但 list 中的每个元素都必须是整数怎么办?不幸的是,Python 的固有类型不能很容易做到这一点。这就是我们使用 typing 包的地方,可以通过运行 pip install typing 来安装。

我们可以使用 typing 包来更精细地声明我们的数据类型。以下是一些示例:

作者的 GitHub Gist。

typing 包中还有许多其他类型可以满足你遇到的‘任何’变量(无意的双关语!)。查看这个备忘单如果你有兴趣深入了解。

创建类型

你还可以通过简单地构造一个类来创建自己的类型。下面是我制作的 dog 类的示例:

作者的 GitHub Gist。

MyPy 教程

mypy 是现在检查 Python 代码类型的行业标准包。它几乎在所有生产部署的代码中使用,特别是机器学习算法,因此作为数据科学家掌握它是非常值得的。

要开始使用 mypy,只需将其安装为 pip install mypy。然后要使用它,你只需运行 mypy <file_name.py>。这就是全部!

如果你想学习 mypy 的一些更高级的功能,请查看这里

让我们通过一个示例来使这个概念更具体。如果我们回到之前的函数 adding_two_numbers,它看起来是这样的:

作者的 GitHub Gist。

然后,我们运行 mypy adding_two_numbers.py,输出结果如下:

adding_two_numbers.py:6: error: Argument 1 to "adding_two_numbers" has incompatible type "str"; expected "int"  [arg-type]
adding_two_numbers.py:6: error: Argument 2 to "adding_two_numbers" has incompatible type "str"; expected "int"  [arg-type]
Found 2 errors in 1 file (checked 1 source file)

注意,错误仅出现在第 6 行,因为我们传入了字符串类型,但函数期望的是整数类型。错误信息中甚至指出了这一点。

对于第 5 行的 print 语句没有引发错误,因为我们传入了正确的类型,函数也返回了预期的整数类型。

总结:优缺点

让我们总结一下 Python 类型注解的一些主要优缺点:

优点

  • 有助于 linting 并减少代码中出现错误的可能性。

  • 提高代码的可读性和文档化。

缺点

  • 实施和编写类型的时间。

  • 某些类型的向后兼容性并非所有 Python 版本都支持。

总体而言

类型注解是大多数 Python 代码中的行业标准程序,包括数据科学工作。因此,这是一项重要且相对容易学习和实现的技能。这不仅会使你的代码更直观,而且有助于防止你的机器学习模型在生产环境中出现故障!

参考资料与进一步阅读

另一个事项!

我有一个免费的新闻通讯,数据揭秘,每周分享成为更好的数据科学家的技巧。没有“废话”或“诱饵”,只有来自实践数据科学家的纯粹可操作见解。

[## 数据揭秘 | Egor Howell | Substack

如何成为更好的数据科学家。点击阅读《数据揭秘》,由 Egor Howell 编写的 Substack 出版物,内容包括…

newsletter.egorhowell.com

与我联系!

首席数据科学家的日常生活

原文:towardsdatascience.com/a-day-in-the-life-of-a-chief-data-scientist-1cbda76c631d

剧透警告 — 我做的数据科学工作不多!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Leah Berg 和 Ray McLendon

·发布于 Towards Data Science ·13 分钟阅读·2023 年 2 月 6 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Keenan Beasley 提供,来源于 Unsplash

几周前,我们写了一篇关于数据科学家日常生活的文章。如果你是新来的,可能还不知道的是,位数据科学家共同维护这个博客,我们的工作日和角色差异很大。Leah,上一篇文章的作者,是高级数据科学家,而我(Ray)是首席数据科学家。

首席数据科学家的角色(在一些公司也称为数据科学经理)在不同的组织中差异很大。例如,我的一些同行在类似的角色中有一个专门针对特定业务线或产品的团队。相比之下,我管理的是一个企业级团队,几乎与整个组织中的每个业务线都有合作。

这样的细节对我的时间分配有很大的影响,与我的同行相比,他们可能有一个客户,而我有许多。他们可能会做更多的数据科学工作,而我则有机会了解和接触各种业务领域。总的来说,我喜欢我的工作,获得了硬技能和软技能的良好结合。

尽管每天都不同,但以下任务代表了我作为首席数据科学家管理企业级团队的典型一天。

一天概览

  • 4:30–6:30 — 开始我的一天

  • 6:30–9:00 — 深度工作

  • 9:00–9:30 — Scrum 会议

  • 10:00–10:30 — 一对一会议

  • 10:30–11:00 — 查看邮件

  • 11:00–12:00 — 办公时间

  • 12:00–1:30 — 锻炼、午餐、小憩

  • 1:30–2:30 — 完全自由时间

  • 2:30–3:00 — 查看邮件

  • 3:00–3:30 — 与客户的产品会议

  • 3:30–4:30 — 计划我的下周(仅限周五)

在我们深入之前,我想强调一下,我的一天流程反映了我如何参与lifestyle design movement。我意识到不是每个人都有这样的工作方式,但这正是这份工作让我感到非常适合的原因。我在选择做什么以及如何完成所有任务时拥有很大的自主权。这仅仅因为我所产生的工作质量和数量。

开始我的一天

我通常不会晚于早上 6:30 开始一天。我有一个庞大的家庭,如果我不早起锻炼,我的孩子们会把我叫醒。不幸的是,我的睡眠计划常常被打乱,我经常比计划早醒一两个小时。

当这种情况发生时,我会去当地的健身房游泳,然后去桑拿房。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

HUUM拍摄的照片,来源于Unsplash

回到家后,我会让孩子们上学,然后在早上 6:30 左右开启电脑。在疫情期间,我成为了永久远程工作者,这让我在安排一天的工作方式上有了很多灵活性。

深度工作

我最喜欢的两位作者,蒂姆·费里斯卡尔·纽波特,对我的工作方式产生了最大影响。熟悉这两个人的人会看到我方法中的一些重叠。我的一天设计旨在管理和利用我全天的自然能量流。

我发现我的大脑在早晨表现最佳,但到下午时,我的思维能力会下降。因此,我一直在努力利用高峰时段,并管理下降的部分。

我将早晨的清晰思维用于我面临的最艰难工作。虽然具体活动每天都不同,但一些常见任务包括

  • 阅读学术论文

  • 单独思考问题的创意

  • 为高管或员工制定巧妙的沟通策略

  • 准备会议

  • 配对编程

  • 编码

所有这些活动都需要我全力以赴地发挥我的智力能力。例如,制定巧妙的沟通策略。我从事编码已经超过十年,并且认为自己非常具备技术思维;然而,在我目前的角色中,像沟通这样的软技能非常重要。我发现我需要专门的时间来思考在管理上级、下属以及同行时的微妙和复杂情况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Nick Morrison拍摄的照片,来源于Unsplash

在我目前的角色中,我学会了放慢脚步,更加注意我的沟通如何被感知。我过去因立即回应电子邮件而受到过伤害,这些回应通常是我脑海中首先出现的想法。诚然,这些考虑对我来说并不自然,但在我职业生涯的这一点上,它们是必要的。

Scrum

在早上 9:00,我参加我们团队的每日 Scrum。在我们的上一篇文章中,我们提到我们不遵循传统的 Scrum 会议。与其我们昨天做了什么,我们展示它。

这对我来说极具力量,因为我在当前角色中花在编码或配对编程上的时间不多。拥有十多年的经验,我以艰难的方式学到了很多东西。虽然我可以将这些经验教训一对一地分享给团队成员,但其余的团队无法从中获益。看到某人的工作使我们所有人都能对其做出反应,并提供了一个强化最佳实践、跨部门合作和促进学习文化的机会。

阅读了 Ed Catmull 和 Amy Wallace 的书籍《创造力公司》后,我受到启发在我的团队中实施了这种版本的 Scrum。他们讨论了“每日会议”的概念,这是一种日常会议,导演们给予反馈,所有艺术员工都可以从中学习。这使得导演能够确保其风格在所有团队成员中一致实施。我最喜欢这些会议的一个部分是我经常学到新的东西。

一对一

我管理着一个相当大的数据团队,包括架构师、数据工程师、软件开发人员、数据分析师和数据科学家。Matthew Skelton 和 Manuel Pais 的书籍《团队结构》描述了四种类型的团队:

  1. 流对齐——一个“与(通常是)业务领域的一个部分工作流对齐的团队”。

  2. 复杂子系统——一个“需要重要的数学/计算/技术专长的团队”。

  3. 促进者——一个“帮助流对齐团队克服障碍的团队,也能发现缺失的能力”。

  4. 平台——“其他团队类型的组合,提供有吸引力的内部产品,以加快流对齐团队的交付速度”。

我的团队是这四个团队的结合体。由于我们掌握了从头到尾的解决方案,我们的设计旨在合作,交付组织中每条业务线的各种数据产品。这意味着我们的团队通常会有更多的专门化,但也有通才。流对齐团队通常由通才组成,而其他类型的团队则从通才到纯专门化不等。

在大团队中保持思路有序可能是一个挑战。对于任何卡尔·纽波特的粉丝,我喜欢保持一个看板,每列用于我的每一次一对一交流。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个看板示例。图片由作者提供。

这让我能够追踪我们之前讨论过的内容,并为下一次会议生成议程。此外,这帮助我保护团队成员的专注状态(有关这一概念的更多信息,请查看Flow by Mihaly Csikszentmihalyi)。当我有问题时,我不会发送分散注意力的消息,而是简单地将其添加到我的看板上的他们的栏目中。

在理想情况下,我每两周会与每个团队成员见面一次。然而,有些团队成员需要更多的关注和发展,所以我会更频繁地与他们见面。由于我是全职远程工作者,我通常会在这些会议期间去散步。我使用骨传导耳机,这使我在与团队聊天时能听到周围的环境。我发现,当我回到桌前时,新鲜的空气会让我充满活力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由Arek Adeoye拍摄,来源于Unsplash

在我的一对一会议中,我们讨论各种话题,包括团队的未来发展、他们在大局中的角色、他们将要从事的任务以及他们希望发展的技能。

不幸的是,并不是所有的一对一会议都是愉快的。在大流行期间,我们进行了深入的讨论,涉及到心理健康管理,多名团队成员经历了直系亲属的丧失。

我还不得不应对非常艰难的劳动市场。我失去了多名团队成员,因为市场上的薪资上涨是我的组织无法匹配的。通过这次经历,我学到了在类似情况下更好地准备的重要经验。过去几年是我人生中最具挑战性和充实的时光。对他人产生积极影响对我来说意义重大,我希望我能很好地服务我的团队。

检查邮件

让我先说,我不喜欢电子邮件。我发现许多人希望电子邮件像即时消息那样用于快速的来回沟通,但我的目标是通常在电子邮件到达我的收件箱后的 24 小时内处理每封邮件。很少有东西是真正的紧急,但如果确实紧急的话,我可以通过即时消息或电话联系到我。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由Brett Jordan拍摄,来源于Unsplash

我最喜欢的黑客之一是禁用到达收件箱时播放或显示的声音和视觉通知。这帮助我优先安排时间,并进入一种专注状态。我相信你应该控制自己的时间,而不是不断反应于不断涌入的信息流。

现在,让我揭示一下我的内心宅男。工作几个月后,我分析了我的收件箱,分析了模式,并配置了各种规则来处理大多数邮件。通过这次分析,我发现通过每天战略性地检查两次,我可以有效处理几乎所有的邮件。为了避免陷入耗时的邮件漩涡,我避免在一天剩余的时间检查我的收件箱。

在设立这些集中式邮件会话之前,我发现我的邮件习惯遵循了帕金森定律,它声明“工作会扩展到填满完成它所需的时间。” 切换到集中式邮件会话让我可以批量处理快速回复简单邮件,类似于把很多小任务堆在一起。如果我遇到需要我完全注意的邮件,我会把它留到深度工作时间处理。

如果你有兴趣了解更多这些概念,我强烈推荐 Cal Newport 的书籍,《没有邮件的世界》

办公时间

作为我组织中经验最丰富的数据科学家之一,我觉得有责任帮助我团队外的其他人。加入我第一份工作的数据科学家团队对我的学习和发展至关重要,但我也经历了在一个部门甚至整个组织中成为唯一数据科学家的痛苦。与我团队外的数据科学家安排单独会议效果不佳,因此,我设置了办公时间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由Sigmund拍摄,来源于Unsplash

类似于大学里的教授和助教举办办公时间,我每周会安排两个小时的时间,任何人都可以参加会议并向我提问。大多数情况下,任何话题都是可以讨论的。不论是遇到的问题、对部门在分析旅程中下一步的建议请求,还是一个完全随机的话题,我们都会讨论。

我从第一个加入会议的人开始,按顺序处理。话题完全由参与者驱动,看到许多人只是为了从别人的问题中学习而加入,确实很有趣。甚至有很多次我不知道答案,但电话中的其他人知道。我可以诚实地说,我从这些会议中学到了很多。

管理我的能量

从中午到下午 1:30 左右,我处于能量管理模式。吃饭后,我会在下午变得非常疲倦,因此我通常会做一些轻度锻炼以让血液再次流动。有时,如果我真的感觉很疲惫,我甚至会给自己时间小睡一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

摄影师:Brianna Tucker拍摄,来自Unsplash

我并不会每天花一个半小时进行这三项活动,但我通常会每天花 30 到 90 分钟做这些活动的某种组合。

这使得我在完成一天中的第二个大型工作环节后,能保持较高的能量水平。虽然我通常下午的精神状态不如早晨那般充沛,但我对能量管理的专注使我的下午尽可能高效。

绝对自由时间

我称这段时间为“绝对自由时间”,是因为我不像保护早晨时间那样保护这段时间。我通常尝试将这段时间用于另一个深度工作环节,但我对一天中能完成的深度脑力工作量有一定限制。事实上,大多数人每天无法维持超过四小时的高度集中。

虽然良好的锻炼或小憩通常可以为我提供进行第二轮深度工作的能量,但这个时间通常被需要与我进行快速会议的人占用。如果我已经度过了一个富有成效的早晨,我不介意这种打扰。很多时候,这些干扰带来了刺激性的分析或解决问题的机会,我非常享受。

客户产品会议

我与每位客户的会议频率类似于与我的团队进行的一对一会议。在这些会议中,我们通常讨论产品的状态以及我们需要在路线图中解决的下一个功能、增强或技术债务。我还会让我的团队成员展示我们正在开发的新功能。

我发现这些会议也是一个很好的机会,可以向我的客户普及数据职业的相关知识。由于我的大多数客户都是其他领域的专家,他们并不知道机器学习是如何运作的。教育是我工作的一个关键部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

摄影师:Dylan Ferreira拍摄,来自Unsplash

除了这些客户会议之外,我还会每个月与公司领导团队就特定业务领域召开一次小时长的会议。这些会议使我们能够涵盖主要成就,并讨论作为部门之间的合作机会。

最近的一个例子是我与我们组织的用户体验(UX)主管举行的一次会议。我们就共享我们的路线图和打包我们的服务进行了很好的讨论。我们还讨论了如何利用数据科学帮助构建客户角色以及分析调查中的非结构化文本。最后,我们 brainstorm 了如何通过午餐学习会分享我们各自领域的知识。

规划未来的一周

我每周末的一个长期习惯是规划即将到来的周。我喜欢查看下周的所有预定会议,解决任何重叠的会议,并拒绝那些我知道不应该或不能参加的会议。对于剩下的时间,我使用块状时间安排来留出时间完成我的看板中的最高优先级任务。

这与我母亲教我在前一晚规划学校的方式相一致。当我周一开始工作时,我觉得自己已经领先了一步,因为我已经知道需要做什么。我不会浪费时间去弄清楚下一步该做什么。我已做好准备,准备全速前进!

结论

尽管“数据科学家”是我的职位名称,但我大部分时间并不是在做数据科学。在我担任首席数据科学家约六个月后,我的老板开玩笑说:“我打赌你没有意识到这个职位需要多少销售工作!” 对机器学习不熟悉的公司通常对其价值持怀疑态度,而优秀的赞助商可以帮助强化你的故事。

总的来说,这份工作非常有价值,因为我能对我组织的发展以及许多个人的职业发展产生重大影响。额外的好处是跟上数据科学的最新进展,并与领导层讨论我对组织未来的愿景。在工作的乐趣、与我合作的人以及工作的灵活性之间,我感到非常荣幸。

如果你喜欢我对典型工作日的概述,并且正在从数据科学学生转变为数据科学专业人士,查看我的研讨会,我会教你在学校里学不到的技能。

参考文献

  1. medium.com/towards-data-science/a-day-in-the-life-of-a-data-scientist-938d917370b9

  2. sloww.co/lifestyle-design-101/

  3. E. Catmull 等,《创意公司》(2014),www.penguinrandomhouse.com/books/216369/creativity-inc-by-ed-catmull-with-amy-wallace/9780812993011/

  4. M. Skelton 等,《团队拓扑学》(2019),teamtopologies.com/book

  5. teamtopologies.com/key-concepts

  6. M. Csikszentmihalyi, 《心流》(2008), www.amazon.com/Flow-Psychology-Experience-Perennial-Classics/dp/0061339202

  7. en.wikipedia.org/wiki/Parkinson%27s_law

  8. C. Newport, 《没有邮件的世界》(2021), www.calnewport.com/books/a-world-without-email/

  9. www.researchgate.net/publication/232741130_Training_history_deliberate_practice_and_elite_sports_performance_An_analysis_in_response_to_Tucker_and_Collins_review-what_makes_champions

  10. www.datasciencerebalanced.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值