TowardsDataScience 博客中文翻译 2016~2018(七十四)
航空公司的数据分析:达美航空和阿拉斯加航空
当我与家人或朋友一起旅行时,我的脑海中总有一个问题:我应该选择哪家航空公司?在 Expedia 或 PriceLine 等网站上搜索目的地时,会列出很多航空公司。如果价格和时间都差不多,我怎么知道哪家航空公司最适合我?我们相信许多人都有这个问题,并决定使用信号平台来分析客户声音数据,以了解用户体验。我们使用内置的脸书数据连接器来分析美国的两家主要航空公司,达美航空公司和阿拉斯加航空公司。
达美航空是美国历史第六悠久的航空公司,也是最受顾客欢迎的前三大航空公司。达美航空的准时到达率排名第三,处理不当的行李数量排名第三。与此同时,阿拉斯加航空公司作为主要竞争对手之一大放异彩。阿拉斯加航空公司在 J.D. Power 航空公司满意度调查中名列榜首,覆盖美国大陆 100 多个目的地。由于两家航空公司的得分都很高,我们的下一步是分析客户对脸书的评价。
Signals 是两家航空公司从脸书页面收集数据的绝佳工具。对于一线员工来说使用起来很简单,不一定要成为数据科学家才能使用。你所需要做的就是脸书页面的 URL,以及我们内置的数据连接器(见相关博文:客户分析数据连接器)。以下是我们在数据中发现的情况:
根据分析,我们可以看到阿拉斯加航空公司的客户满意度得分高于达美航空公司,尤其是在更好的客户服务方面。不过达美也有自己让人喜欢的特色,比如有女飞行员,还有他们的天空俱乐部服务。Signals 为决策者提供了一种快速简便的方法来查看反馈的主要类别,并收集有关未来改进领域的见解。由于旅客对达美航空的客户服务评分较低,他们的管理团队可能希望专注于提高准点率。降低航班延误的可能性将大大改善客户体验。
达美航空的另一个机会是通过增加座位的宽度和腿部空间来帮助客户更加舒适。对于托运行李,航空公司需要更加明确退款政策。如果客户支付了行李费,但行李被放错地方几天,破坏了旅行,航空公司需要退还托运行李费,并承诺这种情况不会再次发生。当然,如果承运人永久丢失行李,航空公司需要为客户退还损失!
Signals 平台非常适合快速分析大量反馈。Signals 指出数据集中的机会,以及改进的机会所在。对于任何一线工作人员来说,分析数据都是简单、快速和高效的。
你想分析你页面上的脸书评论,还是竞争对手的评论?获得 www.stratifyd.com 的免费试用版,并尝试运行自己的客户声音分析。如果您有任何问题,请随时联系我们【clientsupport@stratifyd.com 。我们期待与您合作!
数据分析:世界上哪个国家的健康状况最好?
在哪些国家,你最不可能缓慢、过早、痛苦地死去?
Photo by United Nations COVID-19 Response on Unsplash
确定各国健康的 11 个方面
在这篇文章中,我将演示一些基本的数据争论和 R 中的可视化方法,同时尝试回答一个相当严肃和复杂的问题。
请记住,这些数据来自一个更加快乐和简单的前 COVID 时代。事实上,数据是由哥德堡大学政府质量研究所汇编的。它就像一个来自世界卫生组织、联合国和许多其他独立社会科学研究人员的数据集的元存储库,这些数据集被分解成不同的主题。我们将关注公共卫生。
因此,让我们看看是否可以使用 QoG 数据集来回答以下问题:
哪个国家最适合过上相对长寿、健康和幸福的生活?
我决定从 11 个维度对每个国家进行评级(基于 QoG 数据集中此类数据的可用性)。这 11 个维度是:
- 艾滋病流行率(在% )
- 空气中 PM 2.5 的程度**(100 为最佳空气,0 为最差空气)**
- 总 烟草使用
- ****婴儿死亡率(每 1,000 名新生儿的死亡率)
- 卫生水平和公共用水清洁度
- 公共服务的程度 (10 表示非常不可靠,1 表示非常稳定)
- 酒精消费(2000 年以后)
- 主观幸福感(评分 1-4 非常幸福)
- 肺结核发病率
- 联合国人类发展指数得分(0-100 分最佳)
- *2017 年肥胖率 (添加到原始数据中进行额外测量)
请注意,对于某些衡量标准,低分是好的,而对于其他衡量标准,高分是好的。我们将在后面的排名部分处理这个问题。
比较 39 个国家
首先,我们读入数据并选择 11 个变量。剔除缺失值后,我们得到了全球 39 个国家的样本。
**library(tidyverse)
df_f **<-** read.csv('qog.csv')
df **<-** df_f **%>%**
select(matches('cname'),matches('ccodealp'),matches('hiv'),matches('pm25'), matches('tobt'), matches('imort'),
matches('alc2000'), matches('ehwater'), matches('wvs_hap'), matches('ffp_ps'),
matches('wef_ct'), matches('hdi'))**%>%**
na.omit()
rm(df_f)
head(df)**
我们数据的样本:
**## cname ccodealp wef_chiv epi_pm25 who_tobt wef_imort who_alc2000
## 7 Azerbaijan AZE 0.20 94.30 23.5 30.8 2.14
## 8 Argentina ARG 0.40 100.00 25.3 12.7 7.93
## 9 Australia AUS 0.20 100.00 16.0 4.1 9.71
## 14 Armenia ARM 0.20 85.76 28.0 14.7 3.91
## 21 Brazil BRA 0.45 100.00 16.1 12.9 7.32
## 36 Chile CHL 0.40 100.00 38.9 7.8 7.16
## epi_ehwater wvs_hap ffp_ps wef_ct undp_hdi
## 7 77.47 3.052584 5.4 95.0 0.758
## 8 92.52 3.199185 4.3 25.0 0.826
## 9 100.00 3.277956 2.0 6.5 0.937
## 14 83.21 3.091120 4.1 52.0 0.741
## 21 84.66 3.264543 5.9 46.0 0.754
## 36 94.25 3.084253 4.5 16.0 0.845**
使用 rvest 丢弃肥胖数据
获取肥胖数据需要我们从 renewbariatrics 网站获取 HTML 表格。我们将使用超级易用的 Rvest 包来完成这项工作。
**library(rvest)url **<-** 'https://renewbariatrics.com/obesity-rank-by-countries/'
codes_url **<-** read_html(url)
*#Use the CSS selector to extract table data from the webiste*
html_data **<-** html_nodes(codes_url,'td')
table_text **<-** html_text(html_data)
*#easiest way is to recreate the table as a matrix and read in by row*
mat_weight **<-** matrix(table_text, nrow **=** 192, ncol**=**6, byrow**=TRUE**)
weight_df **<-** data.frame(country **=** mat_weight[,2], perc_obese **=** mat_weight[,6])
*#Get rid of percent signs and convert to decimal*
weight_df**$**perc_obese **<-** **as.numeric**(gsub('%', '', weight_df**$**perc_obese))**/**100
head(weight_df)**
由此产生的六大肥胖率:
**## country perc_obese
## 1 Cook Islands 0.508
## 2 Palau 0.476
## 3 Nauru 0.456
## 4 Samoa 0.434
## 5 Tonga 0.433
## 6 Niue 0.432**
为了保持我们原来的国家,我们需要做一些乏味但必要的改变。这张粗糙的表格使用了稍微不同的国家名称。
**idex_num **<-** which(df**$**cname **==** 'Malaysia (1966-)')
df**$**cname **<-** **as.character**(df**$**cname)
df**$**cname[idex_num] **<-** 'Malaysia'
idex_num **<-** which(df**$**cname **==** 'Pakistan (1971-)')
df**$**cname[idex_num] **<-** 'Pakistan'
idex_num **<-** which(df**$**cname **==** 'United States')
df**$**cname[idex_num] **<-** 'United States of America'
idex_num **<-** which(df**$**cname **==** 'Russia')
df**$**cname[idex_num] **<-** 'Russian Federation'**
现在棘手的部分将是匹配的名称与我们现有的名称。因为我们已经确保更改名称以使它们相同,所以我们不应该丢失任何观察结果(我希望)。让我们尝试一个 inner_join(变异连接),只保留匹配的行
***#convert to character instead of factor*
weight_df**$**country **<-** **as.character**(weight_df**$**country)
*#Nice tip: use semi_join to see what will be joined before you use inner_join*
*#I was able to see that Russia was missing*
df **%>%**
rename('country' **=** cname)**%>%**
semi_join(weight_df, by**=**'country')**%>%**
head()**
验证我们的结果:
**## country ccodealp wef_chiv epi_pm25 who_tobt wef_imort who_alc2000
## 1 Azerbaijan AZE 0.20 94.30 23.5 30.8 2.14
## 2 Argentina ARG 0.40 100.00 25.3 12.7 7.93
## 3 Australia AUS 0.20 100.00 16.0 4.1 9.71
## 4 Armenia ARM 0.20 85.76 28.0 14.7 3.91
## 5 Brazil BRA 0.45 100.00 16.1 12.9 7.32
## 6 Chile CHL 0.40 100.00 38.9 7.8 7.16
## epi_ehwater wvs_hap ffp_ps wef_ct undp_hdi
## 1 77.47 3.052584 5.4 95.0 0.758
## 2 92.52 3.199185 4.3 25.0 0.826
## 3 100.00 3.277956 2.0 6.5 0.937
## 4 83.21 3.091120 4.1 52.0 0.741
## 5 84.66 3.264543 5.9 46.0 0.754
## 6 94.25 3.084253 4.5 16.0 0.845**
好了,一切看起来都很好:没有 NAs 或疯狂的价值观。我们现在可以使用这个新的肥胖维度重新进行分析。
***#looks good so add together*
df **<-** df **%>%**
rename('country' **=** cname)**%>%**
inner_join(weight_df, by **=** 'country')**
我们最后去了哪 39 个国家?
***#Which 39 countries?*
**for** (n **in** df**$**country){
cat(paste(n, " "))
}## Azerbaijan Argentina Australia Armenia Brazil Chile China Colombia Ecuador Georgia Germany Ghana India Kazakhstan Jordan Kyrgyzstan Lebanon Malaysia Mexico Morocco Netherlands New Zealand Nigeria Pakistan Philippines Poland Romania Russian Federation Singapore Slovenia South Africa Spain Sweden Thailand Turkey Ukraine Egypt United States of America Uruguay**
最后,我们准备用这些修正的名字和新的肥胖变量重新运行我们的分析。
维度间的相关性
**library(corrplot)df **%>%**
select_if(is.numeric)**%>%**
cor()**%>%**
corrplot(method**=**'number')**
这非常有趣,值得花些时间研究一下。
- 毫不奇怪,结核病和艾滋病毒感染率高度相关。这表明在控制传染病方面存在系统性问题。
- 糟糕的空气与低幸福感有关。这是有道理的,但它值得重申。你的幸福可能取决于你国家的空气有多干净。
- 不足为奇的是,婴儿死亡率高与水卫生条件差有关。
- 从本质上讲,人类发展指数与公共服务变量衡量的是同一事物。
- 较高的酒精消费量与较低的婴儿死亡率和较高的人类发育有关。有意思。也许这与更多发展带来的额外闲暇时间有关。较贫穷的国家没有闲坐在一起和朋友喝啤酒的奢侈。
- 肥胖与幸福负相关,但与人类发展水平正相关。婴儿死亡率和肥胖是相反的关系。关于富有和现代的一些东西正在使我们变胖。有没有注意到所有的老英国君主都很胖?我敢打赌,富人的饮食中有一些因素导致了他们更高的肥胖率(提示:可能是肉类/动物产品消费的增加)。在以后的文章中,我会查看 GDP 增长和身体质量指数变化的时间序列数据来验证这一点。
还有很多更有趣的关联!
感知地图:使用主成分分析可视化国家之间的关系
如果你不熟悉感知地图,我建议你看一本由克里斯·查普曼和埃利亚·费特写的非常好的书,名为《营销研究和分析》。“基本上,我们将在 10 个维度上运行主成分分析,减少到两个维度,然后在两个维度上可视化国家分组。
***#Keep row names for ID. Very useful bit of code*
rownames(df) **<-** df[,2]
*#Run PCA. Make sure to scale your data first. Otherwise the PCs will reflect the dimensions with huge units*
ct_pc **<-** prcomp(df[,3**:**ncol(df)], scale. **=** **TRUE**)
summary(ct_pc)## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6
## Standard deviation 2.1693 1.3695 1.2621 1.00579 0.79305 0.74069
## Proportion of Variance 0.4278 0.1705 0.1448 0.09196 0.05717 0.04987
## Cumulative Proportion 0.4278 0.5983 0.7431 0.83508 0.89225 0.94213
## PC7 PC8 PC9 PC10 PC11
## Standard deviation 0.57025 0.41706 0.2482 0.1961 0.1934
## Proportion of Variance 0.02956 0.01581 0.0056 0.0035 0.0034
## Cumulative Proportion 0.97169 0.98750 0.9931 0.9966 1.0000**
summary()函数在决定保留多少台电脑时非常有用。在这里我们可以看到,5 个变量覆盖了我们最初的 10 个变量中大约 90%的方差。我们将只保留解释 60%方差的前两个。
如果你是一个视觉型的人,你可以使用 screeplot 找到下一台电脑捕捉到的边际差异似乎下降的“肘部”。
**plot(ct_pc, type**=**'l')**
如果我要在预测模型中使用它,我可能会决定保留 4-5 个,但这里我们只保留前两个,以便于可视化。
用双标图可视化电脑
为了可视化结果,我们使用 biplot()函数。仅供参考,南非是“ZAF”
**biplot(ct_pc, cex**=c**(.7,1), expand**=**1.5,
sub**=**'Comparing countries on the 11 dimensions of Health')**
这个双图包含了大量的信息,它的解释可能很复杂。我们来分解一下。
首先注意 x/y 轴是 PC1 和 PC2,它们累计解释了原始变量中大约 60%的变化。因此,我们已经知道这个故事不仅仅是这两个电脑分数,还有大约 40%的故事没有被披露。
第二,红色箭头(向量)既有大小又有角度。这些箭头相对于 x/y 轴的角度显示了这些原始变量被 PCs“捕获”的程度。因此,PC2 很好地捕捉到了几乎垂直的线条(艾滋病毒和结核病比率),而 PC1 似乎捕捉到了婴儿死亡率、公共服务、水卫生和人类发展指数。
两个原始变量(红线)之间的角度代表相关的方向。所以婴儿死亡率和公共服务是非常正相关的,而艾滋病毒感染率和烟草使用是负相关的。这些解释应该与我们从上面的相关矩阵中得到的结果相符。最后,这个我不确定,但是箭头的长度代表了原始变量的标准差。所以如果你对长度求平方,你就代表了变量的方差。
解释双绘图的陷阱
双翼飞机是微妙的生物。如果你不相信我,可以看看 StackOverflow 关于它们的一些讨论。现在,我们将只关注最实际的含义和陷阱。
首先,国家在双标图上的位置是相对于的,因此改变变量的数量和/或添加/删除国家将影响它们之间的关系。
第二,记得我提到过 PC1 和 PC2 只占所有原始变量方差的 60%左右。这意味着在这 60%的方差中可能没有考虑到国家之间的其他关系。简而言之,这个故事不仅仅是你在这个双绘图中看到的。
正如查普曼和费特解释的那样,
“当我们查看 PC1 和 PC2 的分数时,我们看到的是‘最大程度的相似性’,这可能会隐藏其他 PC 中其他较小的差异。”
在这个前提下,让我们快速回顾一下双标图告诉我们的内容。
- 南非(ZAF)在左领域遥遥领先,可能是由于婴儿死亡率和艾滋病病毒感染率。
- 有趣的是,约旦和黎巴嫩聚集在一起,主要是因为他们的烟草使用水平。现在,中国和埃及似乎又聚集在一起了,因为它们的烟草使用水平高,而艾滋病/肺结核的发病率低。
- 印度和巴基斯坦有着相似的婴儿死亡率、肺结核(高数字是不好的)和不稳定的公共服务。他们出奇的亲密。考虑到他们在 1971 年之前本质上是同一个国家,这是有道理的。
- 尼日利亚和加纳这两个非洲国家似乎是高婴儿死亡率和结核病的负面组合,再加上艾滋病毒和糟糕的公共服务。
国家的地理聚类表明,PCA 在计算不同国家的相似性和差异性方面非常有效。矛盾的是,任何一种统计学习程序都应该(大致)符合我们的预期,但是如果它 100%符合我们的预期,我们就不会学到任何东西。因此,理想情况下,我们的分析会与我们的直觉相符,但我们仍抱有希望,希望有一些未知因素会迫使我们重新评估我们的假设,甚至重新检查我们的数据,以确保它们是正确的。这就是数据驱动方法的美妙之处:它们可以为我们提供一个新的视角,让我们了解一个我们本以为已经了解的话题。
超越前两台电脑的视觉化
你可以使用 choices=c(3,4)以 PC3 和 4 为轴重新制作剧情。只是为了好玩,我们来试试。
因为多达 5 个电脑解释了 90%的差异,所以也值得检查一下这个图。请将此图视为显示 PC3 和 4 如何“吸收”PC1 和 2 未捕捉到的剩余方差。
**biplot(ct_pc, cex**=c**(.7,.8), expand**=**1.2, choices**=c**(3,4),
sub**=**'Comparing countries on the 11 dimensions of Health')**
现在我们看到 PC3 代表不同的变量(幸福),PC4 捕捉了 PM 2.5 和肥胖率的许多变化。有趣的是,根据这些指标,现在中东国家因其较高的肥胖率和较低的饮酒量而被归为一类。
那么哪个国家的健康状况最好呢?
正如我前面提到的,这是一个超级复杂的问题,但只是为了好玩,让我们看看我们能想出什么。以下是后面的想法。我们将根据每个变量的得分对国家进行排名,并计算哪些国家在所有 11 个维度上的总体排名最低(最好)。我们将把那个国家评为“最健康的国家”但我们将会遇到的一个问题是,有些维度在“好”方面得分很高,而其他维度在“好”方面得分很低。
***#Separate columns into those where higher is better*
up_ranks **<-** df[,colnames(df) **%in%** **c**("epi_pm25","epi_ehwater",
"undp_hdi", "wvs_hap")]
*#Separate where lower scores are better*
low_ranks **<-** df[,colnames(df) **%in%** **c**("who_alc2000", "ffp_ps", "wef_ct",
"wef_imort", "wef_chiv", "who_tobt", "perc_obese")]
*#Now we rank*
df_low_rank **<-** apply(low_ranks, 2, rank)
*#Use opposite ranking method*
df_high_rank **<-** apply(up_ranks, 2, **function**(x) rank(**-**x))
*#now assemble*
df_ranked **<-** cbind(df_low_rank, df_high_rank)
*#Here's what we end up with. 1 means best and 39 means worst.*
head(df_ranked)**
结果:
**## wef_chiv who_tobt wef_imort who_alc2000 ffp_ps wef_ct perc_obese
## AZE 18 19 34 10 25.0 29.0 22
## ARG 27 22 21 27 14.5 16.0 28
## AUS 18 7 7 35 6.5 5.0 33
## ARM 18 29 24 14 13.0 21.0 12
## BRA 30 8 22 25 29.0 19.0 14
## CHL 27 38 13 23 16.5 10.5 31
## epi_pm25 epi_ehwater wvs_hap undp_hdi
## AZE 24 31 28 21.5
## ARG 11 13 18 12.0
## AUS 11 2 13 1.0
## ARM 27 24 25 25.5
## BRA 11 21 14 23.0
## CHL 11 12 26 11.0**
让我们尝试对这些数据进行一些可视化处理,以获得更好的感受。我不常可视化排名数据,所以我欢迎任何关于哪种方法最适合显示这些数据的反馈。
等级热图
**library(gplots)heatmap.2(df_ranked,dendrogram **=** 'none', scale**=**'none', key**=FALSE**, cexRow**=**.6,
main**=**'Red = low rank (Good), White = (Bad)')**
我在那里保留了跟踪,因为它向您显示了颜色相对于平均值的位置(列方向)。例如,对于 HIV 比率,您可以看到白色代表较高的分数,因此轨迹会在右侧弹出。暗红色向左移动轨迹。你可以看到约旦的艾滋病流行率排名最高。
你还可以看到一大群欧洲国家在所有基本生活统计上都是暗红色的,但在烟草使用或酒精消费方面表现不佳——这是早期死亡率的两个强有力的预测指标。
美国是“肥胖”的白人,因为他们在 39 个国家中排名第一。
让我们最终选出一个获胜者,并想象结果
***#convert to Df*
df_ranked **<-** as.data.frame(df_ranked)
*#Find average ranks per country*
score_mat **<-** as.matrix(apply(df_ranked, 1, mean))
*#then rank by lowest average rank*
final_ranks **<-** apply(score_mat, 2, rank)
*#sort to get final list*
sort_ranks **<-** apply(final_ranks, 2, sort)
sort_ranks**
从最好到最差的最终排名:
**## [,1]
## SGP 1.0
## SWE 2.0
## NZL 3.0
## AUS 4.0
## NLD 5.0
## MYS 6.0
## DEU 7.0
## USA 8.0
## SVN 9.0
## ESP 10.0
## URY 11.0
## ECU 12.0
## ARG 13.0
## POL 14.0
## MEX 15.0
## BRA 16.0
## COL 17.0
## CHL 18.0
## TUR 19.0
## JOR 20.0
## ARM 21.0
## KAZ 22.0
## PHL 23.0
## THA 24.0
## GHA 25.5
## LBN 25.5
## KGZ 27.0
## CHN 28.0
## EGY 29.0
## MAR 30.0
## ROU 31.0
## AZE 32.0
## GEO 33.0
## PAK 34.0
## UKR 35.0
## RUS 36.0
## NGA 37.0
## IND 38.0
## ZAF 39.0**
确定最健康的前 5 名
现在你知道了,根据我们的标准,“健康”排名前五的国家(根据你的真实定义)依次是:
新加坡、瑞典、新西兰、澳大利亚和荷兰。
如果将肥胖率考虑在内,美国从第五位跌至第八位。
后 5 个国家依次是:
乌克兰、俄罗斯、尼日利亚、印度和南非。
哇,对不起我的南非朋友。如果要我猜为什么会有艾滋病毒/肺结核的发病率。也许近年来情况有所改善,因为这些数据是几年前的了。不过对巴基斯坦来说是个好消息,当肥胖数据被加入时,它现在在 39 个国家中排名第 34。俄罗斯取代了它的位置。
我得说这些结果与预期相当吻合,尽管我没想到南非会如此糟糕。我认为,这里的一个关键要点是,人口非常贫困的国家(印度和南非)被这些不平等现象压得不成比例。这些国家的某些地方肯定比我们排名前十的国家更现代(或者更现代)。然而,总的来说,排名前 10 位的国家拥有公共服务/基础设施/医疗保健的基线水平,而排名后 10 位的国家却没有。
可视化这些结果的最佳方式是什么?
我的第一个想法是使用类似平行坐标图的东西。但是有 39 个国家,情况会很糟糕。
***#useful function when converting from matrix to dfs*
df_ranked **<-** rownames_to_column(df_ranked)
df_ranked **%>%**
gather(**-**rowname, key**=**'vars', value**=**'scores')**%>%**
ggplot(aes(vars, scores, group**=**rowname, color**=**rowname))**+**
geom_path(size**=**1, alpha**=**.3)**+**
theme_minimal() **+** theme(axis.text.x **=** element_text(size **=** 13,
angle **=** 35), legend.key **=** element_rect(fill **=** **NA**)) **+**labs(title **=** "Parallel Coordinates of Rankings",
x **=** "Variables", y **=** "Ranks")**
是的,正如我所怀疑的,这是 39 个国家的混乱。但是您仍然可以看到一些有用的关系(由变量之间连接线的深度表示)。例如,你可以看到在肥胖方面得分较高的国家往往也有较高的艾滋病毒/结核病发病率。水卫生条件差的国家似乎有更好的空气质量。这不是我想做的权衡,但仍然是一个有趣的观察。
我的另一个想法是根据变量类型和颜色进行分面,并寻找条形图最小的国家(表示排名低=好)。我觉得这样更好。
不要介意庞大的代码块。但基本上,为了做到这一点,你必须将数据重塑为“长”形式,这样你就可以按变量分面。如果你还没有掌握这种技术,那么花时间去做是非常值得的。使用 tidyverse 库中的 gather()函数。
**df_ranked **%>%**
gather(**-**rowname, key**=**'vars', value**=**'scores')**%>%**
ggplot(aes(reorder(rowname, scores), scores, fill**=**scores))**+**
geom_col()**+**
scale_fill_gradient(low **=** "#0000F7",high**=**"#FFDD00")**+**
facet_wrap(**~** vars, ncol**=** 11)**+**
coord_flip() **+** theme(plot.subtitle **=** element_text(colour **=** **NA**,
vjust **=** 1), plot.caption **=** element_text(vjust **=** 1),
axis.ticks **=** element_line(colour **=** **NA**),
panel.grid.major **=** element_line(colour **=** **NA**),
panel.grid.minor **=** element_line(colour **=** **NA**),
axis.title **=** element_text(family **=** "serif",
colour **=** **NA**), axis.text **=** element_text(colour **=** "gray4"),
axis.text.x **=** element_text(size **=** 8),
axis.text.y **=** element_text(size **=** 7),
plot.title **=** element_text(hjust **=** 0.5),
panel.background **=** element_rect(fill **=** **NA**),
legend.key **=** element_rect(fill **=** **NA**)) **+**labs(title **=** "Ranking for each Health Dimension",
x **=** "Country", y **=** "Ranks", fill **=** "Ranking") **+** theme(axis.title **=** element_text(size **=** 8),
axis.text **=** element_text(size **=** 5, colour **=** "gray14",
vjust **=** 0), plot.title **=** element_text(size **=** 8)) **+** theme(axis.title **=** element_text(size **=** 7),
axis.text **=** element_text(size **=** 1), plot.title **=** element_text(size **=** 13))**
Small purple bars mean lower (better) rank. SGP (Singapore) is #1 and ZAF (South Africa) is #39
结果摘要
所以我们开始吧。我们可以看到,南非在水资源、公共服务、人类发展、艾滋病和结核病方面表现不佳,这导致了它排名垫底。
与此同时,除了肺结核,新加坡几乎在所有领域都名列前茅。这些排名掩盖了一个事实,即从绝对数字来看,新加坡每 10 万人的病例数约为 50-60 例,而美国为 2.9 例。不是巨大的绝对差异,而是巨大的相对差异。
如果欧洲大多数国家的酒精和烟草消费水平低一些,它们显然会名列前茅。对于德国人,我要说的是,要怪就怪那些该死的 Hefeweizen 和柏林那些在地铁上抽烟的潮人。einoverstanden?
所有决策都应该由数据驱动吗?采访数据科学家谢尔盖·布瑞尔
你能简单介绍一下你的背景吗?
如果你看看我的专业背景,你会发现我所有的经验都围绕着应用于许多事情的分析。其中之一是银行业,作为分析和风险管理部门的负责人,我已经在这个行业工作了 10 年。然后,在几家 IT 公司做了 5 年的市场分析师和数据科学家。值得一提的是,我通过我的 analyzecore.com博客贡献了一些实用的数据分析。
An example of a multi-channel attribution model visualization (source analyzecore.com blog)
你在数据分析领域做过不少工作。它们对你雇主的目标有什么好处?
不管是什么业务,数据分析通常有助于找到以下问题的答案:
- 如何改进产品;
- 如何提高公司的决策;
- 如何让今天和明天比昨天赚得更多;
- 如何提高顾客的忠诚度;
- 和许多其他领域,在这些领域中分析是有用的。
请分享几个你经历过的真实案例
第一个例子,当我在 Namecheap.com 工作时,我们关心的是获取客户的成本,以及多快能得到回报。问题是,通过我们的付费渠道获得的成本开始超过第一笔交易的收入,更不用说毛利润了。因为域名注册、托管和所有附带服务通常具有长期性质,所以我们得出结论,客户收购成本必须在固定的时间框架内收回,这意味着我们应该预测客户的终身价值。
但那时候根本没考虑到这一点。将这样一个项目付诸实施是一项雄心勃勃的任务。最终,我们从零开始,开发了一个复杂的系统,你可以输入关于新用户的数据,作为回报,可以得到关于他们潜在价值的 5 年预测。
在我现在的雇主,MacPaw.com——一个为 Mac 开发顶级应用程序的开发者,最著名的是 CleanMyMac——我有幸完成了一系列有趣的项目。以下是我想强调的几个:
- 一个基于马尔可夫链的多渠道归因模型(你可以在我的analyzecore.com博客上了解这个概念)。该模型使我们有机会通过所有营销渠道充分分配价值,并相应地调整营销预算;
- 一个异常检测项目。它允许我们使用不同的指标和维度自动检测异常。结果,我们在 Slack 中得到关于这些异常的通知,这使得我们的生活容易得多;
- 今年,该公司发布了一项新的订阅服务,即Setapp.com。这项服务提供 30 天的免费试用。我们引入了一个模型来告诉我们一个用户是否最终转化为付费用户。这拓宽了我们的界限,例如,我们可以在游戏的早期评估我们促销活动的效果。现在,我们不需要等到 30 天的试用期结束,看看有多少用户转化为订户。此外,我们刚刚完成了一个客户流失模型,这将有助于我们防止客户流失。
One of Sergey’s visualizations was included into the long list of the “Kantar Information is Beautiful Awards”
你认为,数据分析师应该在公司“内部”工作,还是应该将他们的职能分配给数据分析机构?
当然,这取决于公司的规模及其寻求回答的问题。我的建议是实事求是地看待这个问题:这样寻找解决方案的成本就不会抵消决策带来的经济收益。就我而言,我相信分析师在公司内部工作时最有效,与其他员工一起工作,并直接接触产品或服务。我的意思是,当他或她不仅参加正式会议,而且知道人们在走廊或午餐时谈论什么。好主意不一定在预定的会议中出现。
在我看来,这些机构在两种情况下是有效的:
- 当他们提供现成的分析产品时,如开发的 BI 系统。我通常会说,如果一家公司想要并且有能力创建自己复杂的内部 BI 系统,那么他们将该解决方案出售给其他人可能是合理的。
- 当一个机构可以分享对问题的新观点时,因为他们研究的案例比内部分析师多得多,而内部分析师可能没有如此广泛的专业知识,在他或她获得专业知识之前可能还有很长的路要走。但是,即使你决定跟着中介走,你也应该考虑提出问题和得到答案之间的时间差——这可能比你预期的要长。
一个人应该如何向分析师提问,以便得到可以付诸行动的答案?
企业主向分析师提问是互动中最关键的阶段,值得仔细观察。分析师用一个专门的术语来描述这种数据:垃圾输入——垃圾输出,这完全适用于查询形成阶段。不恰当的问题会耗费每个人的时间和资源。
我在这里使用以下指导原则——企业/雇主必须用他或她理解的商业术语进行沟通。然后,与分析师配对,他们共同翻译和验证这种语言以进行数据分析。我完全怀疑产品负责人带着一个现成的问题来的情况,这个问题是用分析术语定义的,他希望这个问题适合他的商业计划。
Another useful chart for Cohort analysis (source analyzecore.com blog)
你认为,所有的决策都应该由数据驱动吗?
我觉得要看公司/项目/产品目前所处的阶段。数据如何出现的原则,我的意思是它的追溯性质,使得每个人都不可能在每种情况下做出数据驱动的决策——仅仅是因为数据的缺乏和不完整。因此,在现代社会,风险和直观的解决方案有足够的空间。我们的所有决策都不是数据驱动的,这很正常。但对于一些行业,如营销,没有银弹解决方案,这意味着即使是数据支持的决策也不一定是正确的。
与此同时,如今数据分析带来的好处已经显而易见。从短期来看,对于许多行业来说,使用数据驱动的方法将成为一个生存问题,而不是一个竞争优势。对许多人来说,钟声已经敲响,昨日的初创企业正在转变为拥有强大数据科学部门的公司。
在你的职业中,你期待的下一个变化是什么?
机器学习和深度学习,更具体地说,文本、语音和图像分析的快速发展,也扩大了企业的活动范围。现在有更多的线要拉,有更多的因素要考虑。我举个简单的例子。就在两年前,移动运营商还在使用流失模型,这种模型记录了一些因素,比如联系呼叫中心,或者充其量只是简单的问题分类。这些过去是手动或半自动方式注册的。相比之下,我们现在处于自动识别问题的边缘。很快你将能够有计划地识别谈话的音调和更多的因素。这意味着这些公司将能够更好地了解客户,并以数据驱动的方式采取行动。
我还可以看到更多伴随着机器学习和深度学习的自动化。解决方案已经在这里,它们将在应用 ML 算法的接口和框架方面变得更加实用。很快,数据分析师只需简单地指出数据的位置,然后就可以看到程序独立地生成一组预测值,并应用几十种自动选择超参数的算法,所有这些都将导致建立最佳模型。
An example of a visualization (source analyzecore.com blog)
现在是关于自我教育的部分。你工作中自我教育的地方在哪里?
关键的那个!如果没有自我教育,我从一个工作领域到另一个领域的任何转变都是不可能的。
这是改变你活动范围的主要动机——你可以学到很多东西,这很有趣。作为一名数据科学家,我基本上看不到教育有任何限制。这既是好的也是坏的——但肯定不无聊。
你对那些想从另一个职业转向数据分析的人有什么建议?
我理解并分享每个人对数据分析的兴趣。当你看到或读到数据分析有助于解决一个特殊的案例时,从局外人的角度来看,这几乎就像是魔术。然而,人们必须明白,这通常是由巨大的工作范围、数百小时的自学、假设检验以及通常相当枯燥的数据准备工作所支撑的。
你只需要热爱这份工作,就像其他任何工作一样,在这里你努力获得成功。我的建议是找一个有经验的导师,试着解决一些典型的问题。这会让你明白需要哪些基础知识,检查自己是否真的被这份工作勾住了。我们公司 MacPaw 为此提供了一个很好的机会。在过去的两个夏天里,我在参加了一个实习项目,其中也包括数据分析。当你还是一名学生或者在做其他事情的时候,你可以过来花三个月的时间和知名分析师一起研究一些真正令人伤脑筋的问题。我建议不要错过这样的机会。
Follow Sergey on facebook or twitter to read a bit of a data scientist’s humor (#DataStoned)
太好了,谢谢你的故事。我希望我们能收到一些问题作为对这篇文章的评论。很快在这里见到你😉
通过自我导向学习的数据分析师
这篇文章的目的是分享我利用自我导向学习成为数据分析师的故事,尽管我只有简单的技术和统计背景。我的希望是向你展示,只要坚持不懈并有条理地去做,你真的可以学到任何东西。
什么是自我导向学习?
成为一个自我导向的学习者意味着你主动去发现你的学习需求是什么,你制定学习目标,你识别资源,你选择和实施适当的学习策略和评估你的学习成果。这发生在一个结构化的方式中,使用特定的过程,并可能从其他人那里得到帮助。(诺尔斯,1975 年,第 18 页)。你可能想知道它与永远变得更好的愿望有什么不同..我想说的是,学习的欲望是核心态度,而过程是系统,通过它你可以把这变成现实。
2014 年,当我成为另类大学的一名学生时,我第一次发现了这一点,这是一所以自我导向学习为中心的大学。我使用的模型最好由 火箭专家 围绕三个主要集群来描述——设计、反映、做。在过去的 3 年里,我用这个模型作为指导,帮助我更快地学习东西,并取得更好的结果。我应用它的一个领域是成为一名数据分析师。
这一切都始于一个问题——为什么脸书的一些帖子比其他帖子表现得更好?我访问了学生非政府组织 is was in 的脸书页面,我很好奇我们如何调整我们的内容,使其与我们的追随者更相关。我分析了各种数据,应用了一些统计函数,但最终我并没有找到我的答案。在那一点上,分析比我的能力更先进。
一年后,我进入了商业智能领域的实习,商业智能是一种将原始数据转化为对商业人士有价值的信息的艺术。这是一个相对较新的工作领域,数据分析是其中的一个子领域。鉴于我对实际需要的技能没有太多的了解,我就一头扎进了杜克大学的在线课程——数据分析和统计推断,以便建立一些基础知识。
这门课程真的很好,在不同的时刻都很有挑战性,它开阔了我的眼界,让我知道我需要进一步学习什么。因此,我在数据分析师的主要技能之上设定了一些学习目标:
描述性统计的使用
- 能够向他人解释汇总统计数据及其在上下文中的含义
推理统计学的使用
- 根据数据分布和使用 R 所需的比较类型,应用正确的假设检验
- 使用线性回归和相关性来解释指标之间的关系
数据争论&用 R 编程
- 使用 R data.table 执行常见操作(条件子集化、连接、更新、分组计算),最少需要在 web 上检查语法
- 使用 R 编程元素(变量、控制语句、数据结构)自动化重复性任务
在 Excel 中应用数据可视化
- 能够为常见的业务请求选择最合适的可视化方式(在 2 或 3 个分类维度上比较随时间的演变,与多个变量的关系)
为了达到这些目标,我使用了几种策略:
- 在 Coursera 和 edX 上做具体的在线课程,比如 R 编程
- 阅读各种博客上的文章,对该领域有更广泛的理解,并跟上最新技术。关于 Analytics Vidhaya 的一篇博客文章向我介绍了 r。
- 与我的经理分享我的学习兴趣,以便他能为我提供该领域的项目。例如,这导致了一个推断性的统计分析,即人们是否会根据他们对索赔过程的体验的评价而减少点餐频率。
- 就如何回答某些分析问题提出各种想法或衡量标准。例如,我主动提出为我的经理感兴趣的一个仓库分析做一些 T2 控制图表。
- 对我能接触到的数据进行一些预测分析。这意味着对如何进行分析以及数据对业务流程的影响有透彻的理解。
你可能会注意到,我热衷于通过阅读和在线课程,在理论层面上创造环境或练习来应用我所学的知识,即使工作描述不一定暗示这一点。
同样为了达到目标,我给自己设计了一些学习习惯:
- 每周 5 天,每天早上做 1 小时的功课
- 多次逐步运行 StackOverflow 中的代码,以了解它是如何工作的(对于我找不到解决方案的问题,我在谷歌上搜索它们,并应用到我想做的事情上)
经验教训
在这条路上,我发现了一些关于我的学习风格的见解,这些见解让我提高了获取技能的方式:
- 如果我不知道我对这个领域的不了解,但它看起来很有趣,我会找到一个别人已经开发的涵盖基础知识的结构化课程。这是进入这个领域并意识到我所不知道的事情的一个简单方法。
- 我厌倦了连续几周学习同样的东西。这就是为什么我现在同时在不同领域有多个目标,比如数据可视化、报告、数据争论。它们都在数据科学的保护伞下,它们是互补的,但它们是不同的东西,所以我不会感到无聊。
- 我喜欢在线课程的作业压力——尽管这是自我导向的学习,在线课程为我提供了一些外部责任,帮助我在中期如几周内保持正轨。
- 在网上搜索我所面临的问题的解决方案的同时做一些真实数据的项目,对于通过理论手段沉淀我所学的东西是非常有价值的。它向我展示了其他人是如何解决问题的,我开始理解思考某个问题的方式。
- 只有在理解的基础上,重复使用才会导致记忆——有几行 R 代码我反复使用,但它们并没有留在记忆中。只有当我深入了解这些代码是如何工作的,我才能够从记忆中而不是从谷歌中回忆起这些代码。
- 学习就像工作一样,是一个有任务的项目。因此,在某个时候,我把它放在一个地方,而不是多个电子表格。现在,我将 Trello 与 Repeater、Harvest 和 Card Aging PowerUps 一起使用,并与桌面应用 Pomello 相连接,以将所有事情组织成 30 分钟的工作,5 分钟的休息 Pomodoro 会话。仍然缺少一些东西——一个集成的空间,在那里我可以对学习领域和我投入的时间进行反思。学习管理系统和工作管理系统的结合。
- 在线电子表格非常适合存储信息——我可以在地铁上用手机写下文章中的关键发现。此外,使用搜索框很容易访问原始链接。
- 学习是一个长期的目标。为了保持较高的动力,我把它分成小块,想办法获得短期的满足感,比如从我向其展示分析的商业人士那里获得“啊哈表情”,从工作中获得报酬,或者只是请更有经验的人来评估我的工作质量。
这次学习之旅持续了 1 年左右。那时,我在另一家公司找到了一份数据分析师的工作。从我的角度来看,通过这些工作测试是一个指标,表明我的水平在我选择的目标上足够好。接下来的目标是使用相同的框架和思想成为一名数据科学家。
最初发表于火箭专家博客。
通过网络抓取使用 Python 进行数据分析:CIA World Fact-book 示例
在本文中,我们将展示如何使用 Python 库和 HTML 解析从网站中提取有用的信息,并回答一些重要的分析问题。
在一个数据科学项目中,几乎总是最耗时和最混乱的部分是数据收集和清理。每个人都喜欢建立一两个很酷的深度神经网络(或 XGboost)模型,并用很酷的 3D 交互情节来展示自己的技能。但是这些模型需要原始数据作为开始,而且这些数据来的不容易也不干净。
毕竟,生活不是一个充满数据的 zip 文件等着你去解压和建模的游戏:-)
但是为什么要收集数据或建立模型呢?根本动机是回答一个商业或科学或社会问题。有没有趋势?这个东西和那个有关系吗?对该实体的测量能否预测该现象的结果?这是因为回答这个问题将验证你作为该领域科学家/从业者的假设。你只是在用数据(而不是像化学家那样用试管或像物理学家那样用磁铁)来测试你的假设,并从科学上证明/反驳它。这是数据科学的“科学”部分。不多不少……
相信我,想出一个高质量的问题并不难,这需要一点数据科学技术的应用来回答。每一个这样的问题都变成了你的一个小项目,你可以编写代码,在 Github 这样的开源平台上展示给你的朋友。即使你的职业不是数据科学家,也没有人能阻止你编写很酷的程序来回答一个好的数据问题。这表明你是一个善于处理数据的人,一个能用数据讲述故事的人。
今天让我们来解决这样一个问题…
一个国家的 GDP(按购买力平价计算)和其互联网用户的百分比有什么关系吗?低收入/中等收入/高收入国家也有类似的趋势吗?
现在,你能想到的收集数据来回答这个问题的来源有很多。我发现美国中央情报局(CIA)的一个网站是收集数据的好地方,这个网站上有世界各国的基本事实信息。
因此,我们将使用以下 Python 模块来构建我们数据库和可视化,
- 熊猫, Numpy,matplotlib/seaborn
- Python urllib (用于发送 HTTP 请求)
- BeautifulSoup (用于 HTML 解析)
- 正则表达式模块(用于查找要搜索的精确匹配文本)
先说程序结构来回答这个数据科学的问题。在我的 Github 库中的这里有整个锅炉板代码。喜欢的话请随意叉星。
阅读前面的 HTML 页面并传递给 BeautifulSoup
这是中情局世界概况首页的样子,
Fig: CIA World Factbook front page
我们使用一个简单的带有 SSL 错误忽略上下文的 urllib 请求来检索这个页面,然后将它传递给神奇的 BeautifulSoup,后者为我们解析 HTML 并生成一个漂亮的文本转储。对于那些不熟悉 BeautifulSoup 库的人来说,他们可以观看下面的视频或阅读这篇关于 Medium 的大信息量文章。
这是阅读首页 HTML 的代码片段,
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE# Read the HTML from the URL and pass on to BeautifulSoup
url = '[https://www.cia.gov/library/publications/the-world-factbook/'](https://www.cia.gov/library/publications/the-world-factbook/')
print("Opening the file connection...")
uh= urllib.request.urlopen(url, context=ctx)
print("HTTP status",uh.getcode())
html =uh.read().decode()
print(f"Reading done. Total {len(html)} characters read.")
下面是我们如何将它传递给 BeautifulSoup,并使用find_all方法来查找 HTML 中嵌入的所有国家名称和代码。基本上,这个想法是**找到名为‘option’**的 HTML 标签。标签中文本是国家名称,标签值的第 5 和第 6 个字符代表 2 个字符的国家代码。
现在,你可能会问,你怎么知道你只需要提取第五和第六个字符呢?简单的回答是你必须检查 soup 文本,也就是你自己解析的 HTML 文本,并确定那些索引。没有通用的方法来确定这一点。每个 HTML 页面和底层结构都是独一无二的。
soup = BeautifulSoup(html, 'html.parser')
country_codes=[]
country_names=[]for **tag** in soup.find_all('option'):
country_codes.append(**tag.get('value')**[5:7])
country_names.append(**tag.text**)temp=country_codes.pop(0) # *To remove the first entry 'World'*
temp=country_names.pop(0) # *To remove the first entry 'World'*
抓取:通过单独抓取每个页面,将所有国家的所有文本数据下载到字典中
这一步是他们所说的必不可少的刮或爬。要做到这一点,要识别的关键是每个国家信息页面的 URL 是如何构建的。现在,在一般情况下,这可能很难得到。在这种特殊情况下,快速检查显示了一个非常简单和有规律的结构。这是澳大利亚的截图,
这意味着有一个固定的网址,你必须附加 2 个字符的国家代码,你得到该国家的网页的网址。因此,我们可以遍历国家代码列表,使用 BeautifulSoup 提取所有文本并存储在本地字典中。下面是代码片段,
# Base URL
urlbase = '[https://www.cia.gov/library/publications/the-world-factbook/geos/'](https://www.cia.gov/library/publications/the-world-factbook/geos/')
# Empty data dictionary
text_data=dict()# Iterate over every country
for i in range(1,len(country_names)-1):
country_html=country_codes[i]+'.html'
**url_to_get=urlbase+country_html**
# Read the HTML from the URL and pass on to BeautifulSoup
html = urllib.request.urlopen(url_to_get, context=ctx).read()
soup = BeautifulSoup(html, 'html.parser')
**txt=soup.get_text()**
**text_data[country_names[i]]=txt**
print(f"Finished loading data for {country_names[i]}")
print ("\n**Finished downloading all text data!**")
如果你喜欢,可以存放在泡菜堆里
为了更好地衡量,我更喜欢将这些数据序列化并存储在一个 Python pickle 对象 中。这样,下次打开 Jupyter 笔记本时,我就可以直接读取数据,而无需重复网页抓取步骤。
import pickle
pickle.dump(text_data,open("text_data_CIA_Factobook.p", "wb"))# Unpickle and read the data from local storage next time
text_data = pickle.load(open("text_data_CIA_Factobook.p", "rb"))
使用正则表达式从文本转储中提取 GDP/人均数据
这是程序的核心文本分析部分,在这里我们借助 正则表达式 模块在庞大的文本串中找到我们要找的东西并提取相关的数值数据。现在,正则表达式是 Python(或几乎所有高级编程语言)中的丰富资源。它允许在大型文本语料库中搜索/匹配特定的字符串模式。这里,我们使用非常简单的正则表达式方法来匹配精确的单词,如“ GDP —人均(PPP): ”,然后读取其后的几个字符,提取某些符号(如$和括号)的位置,最终提取人均 GDP 的数值。这里用一个图来说明这个想法。
Fig: Illustration of the text analytics
本书中还使用了其他正则表达式技巧,例如,正确提取 GDP 总量,而不管该数字是以十亿还是万亿为单位。
# **'b' to catch 'billions', 't' to catch 'trillions'**
start = re.search('\$',string)
end = **re.search('[b,t]',string)**
if (start!=None and end!=None):
start=start.start()
end=end.start()
a=string[start+1:start+end-1]
a = convert_float(a)
if (string[end]=='t'):
# **If the GDP was in trillions, multiply it by 1000**
a=1000*a
下面是示例代码片段。注意代码中的多个错误处理检查。这是必要的,因为 HTML 页面极其不可预测的性质。不是所有的国家都有 GDP 数据,不是所有的页面都有完全相同的数据用词,不是所有的数字看起来都一样,不是所有的字符串都有类似的$和()。很多事情都可能出错。
为所有场景规划和编写代码几乎是不可能的,但至少您必须有代码来处理出现的异常,以便您的程序不会停止,并可以优雅地转到下一页进行处理。
# Initialize dictionary for holding the data
GDP_PPP = {}
# Iterate over every country
for i in range(1,len(country_names)-1):
country= country_names[i]
txt=text_data[country]
pos = txt.find('GDP - per capita (PPP):')
**if pos!=-1:** #If the wording/phrase is not present
pos= pos+len('GDP - per capita (PPP):')
string = txt[pos+1:pos+11]
start = re.search('\$',string)
end = re.search('\S',string)
**if (start!=None and end!=None):** #If search fails somehow
start=start.start()
end=end.start()
a=string[start+1:start+end-1]
#print(a)
a = convert_float(a)
**if (a!=-1.0):** #If the float conversion fails somehow
print(f"GDP/capita (PPP) of {country}: {a} dollars")
# Insert the data in the dictionary
GDP_PPP[country]=a
else:
print("**Could not find GDP/capita data!**")
else:
print("**Could not find GDP/capita data!**")
else:
print("**Could not find GDP/capita data!**")print ("\nFinished finding all GDP/capita data")
不要忘记使用熊猫内/左连接方法
需要记住的一点是,所有这些文本分析都会产生国家略有不同的数据框架,因为不同国家可能没有不同类型的数据。人们可以使用一个 熊猫左连接 来创建一个包含所有共同国家交集的数据框架,该数据框架的所有数据都是可用的/可以提取的。
df_combined = df_demo.join(df_GDP, how='left')
df_combined.dropna(inplace=True)
啊,现在很酷的东西,模特……但是等等!先做过滤吧!
在 HTML 解析、页面抓取和文本挖掘的所有艰苦工作之后,现在您已经准备好收获好处了——渴望运行回归算法和酷的可视化脚本!但是,等等,在生成这些图之前,通常你需要清理你的数据(特别是对于这种社会经济问题)。基本上,您需要过滤掉异常值,例如非常小的国家(如岛国),这些国家可能具有您想要绘制的参数的极端扭曲值,但不符合您想要调查的主要潜在动态。几行代码对这些过滤器来说很有用。可能有更多的方式来实现它们,但是我试图保持它非常简单和容易理解。例如,下面的代码创建了过滤器来排除总 GDP 为 500 亿美元、低收入和高收入界限分别为 5,000 美元和 25,000 美元(人均 GDP)的小国。
# Create a filtered data frame and x and y arrays
filter_gdp = df_combined['Total GDP (PPP)'] > 50
filter_low_income=df_combined['GDP (PPP)']>5000
filter_high_income=df_combined['GDP (PPP)']<25000df_filtered = df_combined[filter_gdp][filter_low_income][filter_high_income]
最后,可视化
我们使用 seaborn regplot 函数来创建散点图(互联网用户%与人均国内生产总值之比),其中显示了线性回归拟合和 95%的置信区间。他们看起来像是在跟踪。人们可以将结果解释为
一个国家的互联网用户%和人均 GDP 之间有很强的正相关关系。此外,低收入/低 GDP 国家的相关性强度明显高于高 GDP 的发达国家。这可能意味着,与发达国家相比,互联网接入有助于低收入国家更快地发展,并改善其公民的平均状况。
摘要
本文介绍了一个 Python 演示笔记本,演示了如何使用 BeautifulSoup 通过 HTML 解析抓取网页以下载原始信息。之后,还说明了如何使用正则表达式模块来搜索和提取用户需要的重要信息。
最重要的是,它演示了在挖掘杂乱的 HTML 解析文本时,如何或为什么不可能有简单、通用的规则或程序结构。我们必须检查文本结构,并进行适当的错误处理检查,以优雅地处理所有情况,从而维护程序的流程(而不是崩溃),即使它无法提取所有这些场景的数据。
我希望读者可以从提供的笔记本文件中受益,并根据自己的要求和想象来构建它。更多网络数据分析笔记本, 请看我的知识库。
如果您有任何问题或想法要分享,请联系作者在tirthajyoti【AT】Gmail . com。你也可以查看作者的 GitHub 资源库 中其他有趣的 Python、R 或 MATLAB 代码片段和机器学习资源。如果你像我一样对机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我或在 Twitter 上关注我。
数据和实验驱动的政策制定
我们相信上帝。所有其他:带数据。—威廉·e·戴明
GREAT lectures, Manila 13–14 March 2017
发展中国家面临的公共政策挑战的难度不亚于西方发达国家,但在许多方面更加紧迫。这些挑战包括提供基本公共服务——持续、可靠和有效——跨越城乡鸿沟,以及跨越社会分化的其他层面。这些挑战还包括可持续发展的问题,即在满足经济、环境和社会需求方面取得进展而不造成危及子孙后代的失衡。
一波又一波的学者、顾问和专家向东向南来到发展中国家,带来了解决问题的希望。有时,所提供的解决方案被描述为具有公认的功效,已被西方社会公认的实践所证明。有时,提供的解决方案更新颖,有望带来革命性的变革效果。
几十年来积累的例子包括基金组织的条件性(关于政府借贷和支出、关税和市场准入、金融和私营部门改革条件、具体部门的结构改革条件等)。)到公共部门政策、产业政策、市场改革政策、大规模基础设施项目,甚至农业、土地和卫生政策。
广义的社会科学——在某种程度上它可以被认为是一门科学——在一个关键方面不同于自然科学:观察的单位要么是一个社会集合体,要么是不能完全脱离文化和社会影响的个人。文化和社会制度在全球各地不同,在人类历史的各个时代也不同。
在一种组织文化及其相关社会制度下有效的政策和管理实践,在不同的制度和文化下不一定有效。
这个“房间里的大象”——可以追溯到未能解释大卫·休谟著名的“归纳问题”——是许多西方启发的重大政策实验失败的核心。事实上,在从西方世界到发展中国家的任何建议或“最佳实践”的交流中,T4 都必须面对这个问题。
但这个问题不仅适用于将西方解决方案输送到发展中国家。它适用于将溶液从一个地方运送到另一个地方的所有尝试。当权力或发展存在潜在梯度时也是如此:从殖民大国到殖民地,从发达世界到发展中世界,从中心到边缘,从城市到农村。
2009 年诺贝尔奖得主埃莉诺·奥斯特罗姆毕生致力于为社区如何解决公地悲剧提供多样而广泛的证据。她相信——并成功地让全世界相信——事实上,有许多方法可以克服公地悲剧,但中央强加的解决方案通常不起作用。她和她的合作者创造了大量的证据,证明当地社区发展了自己成功的解决公地悲剧的方法。
埃莉诺·奥斯特罗姆向我们表明,这种成功解决办法的关键是,它们必须来自社区本身。当他们这样做时,他们会考虑当地的地理、生态、当地居民的技能和兴趣、当地文化、当地习俗和当地机构。
发展中国家的公共政策挑战无法通过移植西方解决方案来解决。当应用于发展中国家的公共服务提供时,六适马的流程改进方法似乎可以找到现成的应用——并带来巨大的效率改进。但是,如果不从根本上适应发展中国家的情况,它的效力就很有可能受到质疑。
幸运的是,商业和社会科学在过去 20 年中都经历了彻底的转变,从根本上改变了政策和解决方案的制定方式。“设计”——无论是产品设计、服务设计、流程设计还是政策设计——已经被数据驱动的模式所取代。
数据驱动模型不是让专家设计解决方案,而是要求每个概念和特征都不是来自理论或意识形态,而是来自可靠的数据模式,无论数据是通过实验被动收集还是主动收集的。
例如,谷歌呈现链接时使用的蓝色的特殊色调和饱和度不是由设计师构思的。相反,谷歌进行了数千次实验,以找出哪种颜色和色调会导致最多的点击。事实上,谷歌的政策是,任何提议的功能都不能被整合到谷歌产品中,除非它在实地实验测试(计算机科学中称为 A/B 测试)中取得了统计上的显著进步。
在英国,自 2010 年以来,行为洞察小组(BIT)——又名“推动小组”——一直在为内阁办公室和其他政府部门提供建议。它设计实地实验,以测试对政策和政策材料的表述格式和框架的微小改变——即利用行为经济学和心理学的见解的改变——在多大程度上成功地促进了政策目标的实现。
BIT 因其在显著提高公共部门绩效方面的成功而获得了广泛认可,例如,提高了税收支付和征收率,提高了罚款支付率,减少了医疗处方错误,提高了器官捐赠率,并增加了家庭阁楼隔热装置的安装。许多不同的国家正在效仿英国的 BIT。
政治学、发展经济学和公共卫生等学科也采用随机对照实地实验来确定各种不同政策措施和干预的有效性。特别是在发展中国家,实地实验已经成为评估政策措施的黄金标准。与让一个国家进行一场以失败告终的重大政策革命不同,在随机控制的实地实验中,没有对特定解决方案的盲目承诺——除非某项特定干预在当地的制度和文化背景下证明自己是有效的。
民族国家在履行其职能的过程中,会产生大量的行政数据。通过蒂姆·伯纳斯·李对“开放数据”的成功倡导,即在互联网上提供细粒度的特定位置公共服务数据,英国公共服务的表现现在可以由学者和公众共同研究。英国所有政府部门都应该公布不违反数据保护法规的行政数据,除非有其他情有可原的情况。由于开放数据倡议,现在公共服务的提供更加透明。因此,数据驱动的政策举措现在在更加民主化的基础上成为可能。
移动电话和支持互联网的系统和设备会产生更多的非结构化数据。围绕机器学习技术在这种非结构化“大数据”中的应用,出现了相对较新的“数据科学”学科。数据科学的机器学习工具正被用来检测和验证模式,这些模式可以用来提高组织的有效性。无论是在商业领域还是在政府机构,数据科学家都非常吃香,因此他们的薪水也很高。
以数据和实验为导向的政策发展提供了一种避免将发达国家的解决方案盲目应用于发展中国家的根本性错误的方法。埃莉诺·奥斯特罗姆的研究表明,只要条件稳定,时间充足,社区可以找到自己的解决方案,而数据和实验驱动的方法让当地条件有了自己的声音,并缩短了适合当地情况的解决方案出现所需的时间。
在这个历史时期,我们可以承认毫无疑问地接受来自国外的宏大解决方案政策是有害的愚蠢行为。
幸运的是,我们还可以利用数据和实验驱动的技术,在当地制度和文化因素的背景下评估政策建议。有了统计学、数据科学和实验科学的工具,发展中国家的公民可以开发和完善他们自己的政策解决方案——他们应该这样做。
本文概述了作者在德拉萨大学(2017 年 3 月 13 日)和马尼拉雅典耀大学(2017 年 3 月 14 日)举办的演讲' 【数据和实验驱动的政策发展 ',该演讲是英国驻马尼拉大使馆主办的大演讲系列的一部分。
数据与心理健康:2016 年 OSMI 调查
大家好!首先,我要感谢我的朋友们,CMU 社区和媒体对我的上一篇文章提供了周到的反馈。分享的故事和关于这篇文章的对话非常感人,我真的很高兴这篇文章为 CMU 精神健康的讨论做出了贡献。
过去的几周对我的精神健康来说不是很好。由于很难找到一个新的强化门诊项目,也很难找到几个月的住房,我一直处于压力之下。话虽如此,我已经有了一个治疗计划,目前我在 DC 地区租了一个 Airbnb 的房间,住几个星期。
在贴出这篇文章后,我想知道我能做些什么来进一步增加关于心理健康的讨论。作为一个对数据非常感兴趣的人,我想我可以借我的技能来研究美国和其他国家的精神健康状况。我已经决定就我正在做的关于心理健康的一些数据分析项目写一系列的帖子。今天,我从分析由开源精神疾病(OSMI) 产生的数据集开始这个系列。
在开始讨论数据集之前,我有一些免责声明:
- 如果你想在这个分析中得到澄清,请在下面留下评论!写报告的时候我想尽可能的清晰。
- 如果您对使用的技术或研究的组件有任何疑问,也请留下您的评论!我非常欣赏关于数据挖掘策略的对话。
话虽如此,我们还是开始吧!
数据集
OSMI 是一家非营利性的 501c3 公司,致力于“提高意识,教育和提供资源,以支持技术和开源社区的精神健康”他们为支持这一目标所做的工作包括提供关于工作场所精神健康的电子书,举办关于精神健康对话的论坛,以及在开发者大会上举办关于社区精神健康的讲座。
在他们的努力中,OSMI 提供了一份关于科技行业心理健康的调查。该调查包含各种问题,涉及受访者的心理健康、受访者的人口统计数据以及雇主对工作场所心理健康的看法。这项调查是在 2014 年和 2016 年进行的。今天,我们将使用后一年的数据集。
2016 年,该调查通过 twitter 和会议上的演讲分发。由于这是一项自愿参加的调查,数据集中可能存在一些选择偏差。特别是,那些对心理健康更感兴趣的人更有可能参与这项调查。虽然这个数据集仍然是可分析的,但在以后考虑我们的结果时,注意这一点是很重要的。
OSMI 代表在数据世界论坛上列出了他们对调查的一些问题。最值得注意的是,OSMI 感兴趣的是受访者的某些人口统计和工作生活组成部分如何影响该行业的心理健康状况。这些变量包括:
- 被调查者的年龄
- 被调查者认同的性别
- 工作地点和区域
- 工作类型(如前端开发、设计、营销)
- 如果被调查者是个体经营者
我们将在分析中考虑这些变量和其他一些变量。
探索性数据分析
我们看到我们的数据集包含来自 1433 个用户的调查回答,每个填写的调查代表 63 个问题的答案。因为该调查是通过类型的表格收集的,所以每一行都有缺失值,表示回答者没有回答的问题。幸运的是,我们考虑的变量是由大多数用户填写的,因此我们没有处理严重的缺失值问题。
让我们看看我们的反应来自哪里。
Figure 1: Number of respondents by country. if you would like an interactive version of this plot, click here!
我们看到一半以上的回复来自美国。其他经常出现的国家是非常发达的国家,如加拿大、英国和澳大利亚。这表明我们的样本偏向于发达国家,这意味着我们没有了解新兴市场(如印度)科技行业可能存在的压力文化。
让我们来看看美国的哪些地区出现在这个数据集中。
Figure 2: Number of respondents by state. If you would like an interactive version of this plot, click here!
正如所料,加利福尼亚州在该数据集中具有重要的代表性。这很可能是因为加州是硅谷的所在地,所以大多数关于调查分布的开发者会议都在湾区举行。代表人数较多的其他地区是伊利诺伊州和纽约州,分别有 58 名和 49 名受访者。鉴于这两个州是美国的主要人口区,这是意料之中的。
单变量统计
Figure 3: Distribution of answers to the question “Have you been diagnosed with a mental health condition by a medical professional?”
在调查中,有三个问题可以衡量一个人是否有心理健康问题:
- "你过去有过精神疾病吗?"
- "你目前有精神健康障碍吗?"
- "你是否被医学专家诊断出有精神健康问题?"
为了确保对精神健康状况的发生率进行仔细分析,我认为第三个问题最能代表发生率。与其他两个问题相比,这个问题留给我们的可解释性和偏见更少。因此,我将我们的目标变量设为第三个问题的答案。
当我们观察这个问题的分布(见图 3)时,我们看到大约一半的受访者声称自己患有确诊疾病。这很可能受到我们之前讨论的选择偏差问题的影响(参见“数据集”部分),这可能意味着科技行业的实际发生率要低一些。然而,令人担忧的是,这个行业中有如此多的人面临精神健康问题。
Figure 4: Distribution of age of respondents after removing some obvious outliers.
去除一些异常值后,我们看到样本的平均年龄在 34 岁左右。虽然这高于我个人对科技行业的预期,但仍低于某些行业工人的平均水平。我们还看到,大多数受访者的年龄在 20 岁至 40 岁之间,与金融和咨询等行业的年龄范围相比,这相当年轻。
Figure 5: Distribution of gender that respondents identify with.
这项调查收到了大约 71 个不同的性别回答,但是因为这会给我们一个稀疏分布的特征,所以我选择重新编码这个变量。目前使用的性别变量包括识别为男性的人(M)、识别为女性的人(W)和识别为非二元的人(O)。虽然我希望包含更多非二进制的变体,但不幸的是,认为非二进制的受访者太少,无法进行更广泛的编码。
我们看到,我们的受访者主要是男性,这是科技行业性别失衡的典型表现。我们看到大约有 32 个来自非二进制个体的回答。因为这是一个不幸的小水平,我们将看到非二元个体的预测发病率将比男性或女性的预测更不确定。
Figure 6: Distribution of work descriptions given by respondents.
每个回答者给出了他们工作的工作描述,他们可以选择多个描述。因此,这个数字不是传统意义上的“分布”,但它确实计算了这些角色类型在他们的工作描述中出现的次数。我们看到,许多受访者指出了技术角色,如后端和前端开发人员,但也有许多非技术角色,如销售、执行领导和主管。我感兴趣的是比较那些只担任技术角色的人、只担任非技术角色的人以及坐在过道两边的人的发病率。
与发病率的关系
在我的探索中,发现与精神健康状况的发生率潜在相关的变量似乎是有用的。这可以在建立模型之前给我一个可以预测发病率的图片。
Figure 7: Distribution of whether a respondent was diagnosed given if the respondent works in the United States.
当我们根据受访者的工作地点来看我们的诊断率时,发现了一个有趣的关系。我们看到大约 56%在美国工作的受访者被诊断患有精神健康疾病。当我们考虑到只有 41.2%在美国以外工作的受访者声称被诊断时,似乎很明显存在一些基于位置的影响。我们将在讨论中进一步研究这种效应。
Figure 8: Distribution of diagnosis rate given gender of the respondent.
如果受访者认为自己是男性,他们有 44.2%的机会被诊断为精神健康问题。我们可以将这与女性的发病率进行比较,女性被诊断患有精神健康疾病的几率为 64.8%。在我们讨论部分的叙述中,分析这种性别效应是很重要的。我们还看到,非二元个体的发生率非常高,这是相当令人担忧的。也就是说,鉴于他们在受访者分布中的样本量很小,很难概括这种影响。
模型和变量选择
在考虑了 OSMI 提出的问题和我的一些数据探索后,我选择在选择阶段考虑以下预测诊断的变量:
- roleType :工作描述的编码,表示一个人是只从事技术性工作,还是只从事非技术性工作,或者两者兼而有之。如果你想知道我是如何编码的,请看这里的。
- companySize :回答者雇主的规模。这是一个分类变量,范围从自营职业者到超过 1000 名员工。
- 年龄:回答者的年龄。
- isUSA :个人是否在美国工作的指标变量(1 =是,0 =否)。
- 性别:被调查者认同的性别,编码为女性(“W”)、男性(“M”)或其他(“O”)。有关这种编码背后的理由,请参见图 5。
除了上述变量,我还考虑了以下因素之间的交互作用:
- 年龄和性别
- 性别和角色类型
- 性别和伊苏萨
- 角色类型和公司规模
在处理我们的数据后,在轻度探索中探索了这些相互作用的影响。
(注意:模型和变量选择部分的其余部分是相当技术性的。如果您只想看到结果和讨论点,可以跳过这一部分的其余部分。)
因为我们正在处理一个小的数据集和有限数量的变量,我想我应该为我们的推理步骤考虑可解释的模型族。我选择使用决策树来简化可视化表示,使用逻辑回归来测量简单的可变效应。
选择策略
我选择采取以下决定来实现我的最终模型:
- 我在整个数据集上使用 40%-10%-50%的比例将数据集分为训练集、验证集和推理集。推理集是用来获得我们的结果的数据。我们将使用训练集和验证集来选择我们的最终模型。
- 我在训练集上训练我们的模型,然后预测验证集的样本外。我使用 Brier 评分来衡量哪些模型预测验证集最好。
- 对于使用决策树的训练,我简单地将决策树与训练集相匹配。对于使用逻辑回归的训练,我选择在 Brier Score 指标上使用五重交叉验证方法来选择模型的变量。然后,我选择了交叉验证 Brier 得分最低的两个逻辑回归。这三个模型将在我最终选择的验证集上进行测试。要了解更多关于考虑的变量集,请参阅我的模型选择笔记本。
选择结果
在对训练集执行我的交叉验证方法后,最佳逻辑回归模型包括年龄、性别、角色类型、 isUSA ,以及年龄和性别之间的交互作用。第二好的逻辑回归模型被发现包含相同的变量集,没有交互作用的影响。
Figure 9: The regression/decision tree fitted upon our training set. A move to the right branch is an answer of “No” to a question, and a move to the left branch is an answer of “Yes” to a question.
我们看到我们的拟合决策树强调性别和 isUSA 对发病率的影响,这与我们在数据探索中发现的一致。有趣的是,我们看到公司规模作为一个相关变量出现,到目前为止,在分析中发现这并不重要。决策树的这一方面表明它过度拟合了我们的训练数据集的某些组件。
让我们看看这三个模型如何预测验证集。
Figure 10: Our models by their performance on predicting the validation set. Note that a lower brier score indicates a better performing model.
我们看到,通过我们的交叉验证方法选出的最佳逻辑回归在三个模型中具有最低的 Brier 分数。由于 Brier 得分越低,表明模型的预测效果越好,因此该逻辑回归在样本外的表现优于其他两个模型。因此,我们将选择这个模型作为我们的推理步骤。
结果
对于那些跳过了上一节的技术部分的人,让我们重申一下我们选择的模型。我们建立了一个逻辑回归,考虑了年龄、性别、角色类型、 isUSA ,以及年龄和性别之间的交互作用。
当我们在我们的推理数据集上拟合这个模型时,我们看到我们正确预测了 57.4%的诊断。这不是一个特别好的匹配,特别是因为推断集中约 51.3%的受访者声称被诊断患有精神健康疾病。我们将不得不注意到,我们的结果是有限的,我们目前的模型不适合。
Figure 11: Our confusion matrix of our model on the inference set.
根据我们的混淆矩阵,我们的假阳性率为 128/(128 + 220) = 36.78% ,假阴性率为 *161/(161 + 205) = 43.98%。*因为这些比率非常接近,很可能我们不应该使用其中任何一个来通知未来的模型迭代。
Figure 12: Our coefficient table for our model, including standard errors and p-values. These estimates are rounded up to four significant digits.
如果我们认为模型被很好地指定了,我们会对只有一个变量在. 05 水平上是显著的这一事实感到失望。也就是说,根据我们在模型选择步骤中的诊断,该模型可能不符合使 p- 值合理用于分析的假设。因此,在接下来的解释中,我将只考虑效应大小。
有一点很突出,那就是 isUSA 变量的巨大效果。这个效应大小表明,如果一个给定的回答者在美国工作,我们将平均预测该回答者被诊断的可能性是不在美国工作的回答者的 1.47 倍(其他因素不变)。因此,我们预测在美国工作的受访者比不在美国工作的受访者被诊断的可能性高 47%。为什么会出现这种效果将在以后的章节中详细讨论。
我们也看到了角色类型变量的技术水平的巨大影响。这种影响表明,如果给定的回答者只从事技术工作,则该回答者被诊断的可能性预计平均为同时从事技术和非技术工作的回答者的 0 . 799 倍。这意味着,在所有其他因素不变的情况下,我们预测仅从事技术工作的受访者比同时从事技术和非技术工作的受访者被诊断出疾病的可能性低 20%。
我们也看到了一个重要的性别效应。特别是,如果我们忽略年龄的交互作用(这种交互作用很小),该模型预测,平均而言,女性比人口统计学上相当的男性更有可能被诊断出疾病。为了解释一些性别效应,我认为研究相关回答者概况的分数预测是有用的。由于女性受访者的平均年龄是 35 岁,让我们看看我们的模型对美国 35 岁的技术工人的预测。
Figure 13: Some point predictions for technical workers in the US at the age of 35. We also include the lower and upper bounds of these predictions.
当我们只看女性平均年龄的这一点预测时,我们看到性别效应变得明显。我们预测,一名在美国工作的 35 岁女性技术工人有 68%的几率被确诊。对于一个有着相同人口统计数据的男性,我们预测有 48.6%的诊断几率。在这种情况下,我们的预测是,这些人口统计数据中的女性比这些人口统计数据中的男性更有可能得到诊断。在这些人口统计数据中,我们也看到了其他性别人群的高预测发病率,但考虑到预测下限和上限相距甚远,其他性别人群的数据比这一预测让我们相信的要嘈杂得多。
鉴于我是一名大学生,我也有兴趣看看我们的模型对美国大学毕业年龄的技术工人的预测。
Figure 14: Predictions for technical workers in the US at the age of 23. We also include lower and upper bounds for our predictions.
在我们的预测中,我们看到男性和女性之间出现了相似的距离。特别是,假设一个人是一名 23 岁的美国技术工人,我们预测,如果他们是女性,他们比男性更有可能患有精神健康疾病。
讨论
在我们的模型中,美国的大效应大小表明在美国工作对精神健康诊断有一些有意义的预测影响。在我看来,这里有两种可能的叙述。一方面,这可能表明美国的科技文化比其他国家更加浓厚。这将创造一种环境,在这种环境中,员工被推向某种心理健康状况。另一方面,美国的精神卫生保健系统可能比其他国家诊断出更多的人。这两种说法都需要进一步研究,但前者比后者对该行业有更大的政策影响。
我们看到,我们的模型预测,与同时从事技术和非技术工作的人相比,只从事技术工作的人发病率更低。由于纯技术工人和纯非技术工人的影响大小非常相似(见图 12),该模型可能会说,从事混合工作的个人比只从事一种角色的个人更有可能出现心理健康状况。这表明,承担更多角色类型的个人可能会过度劳累,从而影响他们的心理健康。话虽如此,但有一种叙事将因果关系置于另一个方向。在这个故事中,被诊断患有精神健康疾病的人倾向于选择行业中的特定角色群体。通过阅读有关心理健康和工作场所决策之间关系的文献,进一步分析这种因果关系的方向是很重要的。
我认为我们的结果最重要的含义是性别效应。特别是,我们的模型预测女性比男性更有可能要求诊断。关于是什么导致了这种效应,有许多可能的想法。一个潜在的想法是,技术行业的文化给技术工人带来了压力,对女性心理健康的影响比男性更严重。鉴于最近一些关于科技行业女性待遇的故事在网上疯传,这种说法似乎很合适。话虽如此,也很有可能女性比男性更容易承认自己有心理健康问题。这种说法是由 @ntayal 在 data.world 论坛上提出的,尽管我承认没有研究过支持这种说法的研究。这又是一个有意义的研究途径,可以捕捉科技行业中性别和发病率之间的因果关系。
限制
不幸的是,这种分析通常受到研究设计的许多特征和可用数据的限制。我们的模型不太符合推理集,这表明我们的模型不是数据生成过程的强有力的表示。这种拟合的缺乏也表明我们的模型不是很明确的,我们的误差模型是准确的。简单来说,这意味着衡量变量重要性的 p 值可能是不正确的。
我们也有数量有限的非二进制个体。这组人在我们的数据集中特别有趣,因为他们似乎呈现出高诊断率(见图 8)。作为一个非二元个体,在一个迫使自己适应二元社会的社会中工作,很可能会给非二元个体的心理健康带来问题。然而,由于我们的样本如此之少,我们很难对该组做出任何强有力的声明,因为我们的结果与该组相关的可变性很高。
如前所述,我们在调查分布的方式上有一个选择偏差问题(参见“数据集”部分)。因此,很难将我们的结果推广到整个科技行业,我们的模型可能需要持保留态度。
未来工作
令人欣慰的是,有许多与该数据集相关的未来分析途径:
- 调查的其余部分主要涉及与工作场所、公司和整个行业如何处理心理健康相关的问题。如果我们对这些回答进行聚类分析,我们可能会发现该行业如何处理心理健康的不同观点的轮廓。
- 因为我们的模型不是非常准确,在进一步的调查中考虑工作场所压力和文化的测量将是有用的。这些可能有助于告知我们的医疗诊断变量。
- 如前所述,被医学诊断为精神健康障碍不是唯一可能考虑的目标变量。如果我们估计人口统计和就业变量对这些目标的影响,其他两个测量可以提供有意义的分析。
- 由于这项调查也是在 2014 年进行的,因此进行年度分析并查看我们的结果在两个时间段内是否会发生变化可能会有所帮助。
更新:
- 3/19/2017 美国东部时间上午 4:50:更新了一些对性别效应的解释,以简要讨论年龄-性别的相互作用。
我要感谢创造了这个调查。如果你欣赏 OSMI 正在做的工作,请随意捐赠!
如果你有兴趣进一步研究我的分析,可以随意查看我的代码和资产 这里 。你可以在我的 GitHub 个人资料上查看我的整套项目(PLBMR)。**
如果您对分析有任何疑问,欢迎在下方留言评论!
数据与心理健康:2016 年 OSMI 调查—第二部分
大家好!在对开源精神疾病(OSMI)之前的调查进行数据分析后,我在数据科学界和精神健康领域收到了许多关于我的技术和决策的良好反馈。我感谢您所有的想法和意见,我希望继续参与有关数据和心理健康的对话。
在查看了 OSMI 心理健康调查的其他组成部分后,我认识到数据集的一些其他组成部分可以挖掘出有意义的结果。特别是,调查中有许多资产考虑了受访者对该行业心理健康状况的意见。利用这些意见数据,我今天能够在这里进行分析。
正如我在前面的分析中所讨论的,我有一些基本规则:
- 如果你想澄清这个分析,请在下面留下评论!我想在报告中尽可能说清楚。
- 如果您对使用的技术或研究的组件有任何疑问,也请留下您的评论!我非常欣赏关于数据挖掘策略的对话。
话虽如此,让我们深入研究数据。
数据集
在之前的分析中,我花了一些时间详细描述了 OSMI 的调查。因此,如果你想了解调查的全部细节,我建议你通读前面分析的部分。
如前所述,OSMI 调查包含几个关于受访者如何看待工作场所心理健康支持的问题。其中一些问题涉及:
- 雇主是否在工作场所医疗保健计划中为精神健康状况提供保险。
- 雇主是否支持工作场所的精神健康。
- 某人的同事(如团队成员、直接主管)是否支持工作场所的精神健康。
- 如果有人认为精神健康状况被视为整个行业的禁忌。
我感兴趣的是,这些问题的答案是否有一套模式,这可能表明技术行业对心理健康的叙述。特别是,我想知道是否有不同群体的受访者对工作场所如何处理心理健康有不同的看法。一旦我发现了这些观点群,我希望看到被调查者的人口统计数据是否以某种有意义的方式预测了这些观点。
数据探索
我们面临的一个主要限制是,个体经营者不会填写与他们的雇主或同事相关的大部分信息。因此,为了分析这个数据集,我们必须从分析中去除个体经营者。这使我们的观测数量从 1433 下降到 1146,这是一个相当大的下降。自雇是一种非常不同于为公司工作的典型工薪阶层的工作方式。从这个意义上来说,将它们包括在分析中会导致对我们结果的复杂解释。在未来的分析中,我们将只考虑这一组。
Figure 1: Distribution of whether or not an employer provides mental health benefits as part of health coverage.
虽然相当多的人拥有某种形式的精神健康福利作为其健康保险的一部分,但也有相当多的人不确定他们的保险范围,或者没有精神健康保险。这直接关系到科技行业,因为这表明许多工作场所的医疗保健计划不足以照顾心理健康。
Figure 2: Distribution of whether or not an employer offers resources to learn more about mental health concerns and options for seeking help.
我们看到大多数受访者声称他们的雇主没有提供有意义的资源来进行心理健康教育和寻求帮助。这再次表明一种趋势,即雇主通常不提供福利或替代资源来解决心理健康问题。
Figure 3: Distribution of answers for the question “Do you think that discussing a mental health disorder with your employer would have negative consequences?”
在这个问题上,我们看到大多数人倾向于“不”和“可能”,但仍有相当一部分样本认为,与雇主讨论心理健康状况会产生负面后果。在未来的调查中捕捉这些负面后果可能是有用的。
Figure 4: Distribution of comfort level talking about mental health with coworkers.
从心理健康面向同事的角度来看,我们的样本似乎不愿意与同事谈论心理健康。在团队成员周围讨论心理健康可能存在禁忌。
Figure 5: Distribution of whether or not an individual was willing to bring up a mental health issue with a potential employer during an interview.
我们看到大多数人认为他们不会在采访中提出心理健康问题。在很大程度上,这并不奇怪,因为它可能被认为与面试过程的某些部分无关。然而,当你将它与个人是否会在采访中提出身体健康问题进行比较时(见本笔记本,图 11),很明显,讨论心理健康比讨论身体健康有更大的禁忌。
型号选择
鉴于所有这些关于技术工作场所精神健康禁忌的证据,我想使用一种方法,将我们对工作场所精神健康的反应分成可解释的叙述。我决定使用一个潜在类模型 (LCM)来创建这个细分。
为了建立一个关于工作场所心理健康的模型,我选择了大约 19 个我认为与这个主题相关的问题;包括以下问题:
- 你的雇主提供精神健康福利作为医疗保险的一部分吗?
- 你知道在你的雇主提供的保险范围内有哪些精神健康护理的选择吗?
- 与你的直接主管讨论精神健康障碍,你会感到舒服吗?
- 你觉得被认定为有精神健康问题的人会损害你的职业生涯吗?
我已经在项目的我的 Git 存储库中列出了所有 18 个问题。
(注:这一节的其余部分相当专业。跳过它是合理的!)
模型解释
在我们的调查中,LCM 是这样工作的:
- 在关于工作场所心理健康的调查中,我们有 18 个问题。每个人分别提交这些问题的答案a1,a2,…,a_{18} 。
- 关于工作场所的精神健康有 k 种观点。每个视角 i 携带一个答案分布 D_i 。因此,有D1,D2,…,D_k 分布,并且每一个都与特定的视角相关联。
- 我们的 LCM 假设每个答案组 (a_1,a_2,…,a_{18}) 来自一个特定视角的答案分布。例如,如果一个人的答案是 (a_1,a_2,…,a_{18}) ~ D_1 ,那么这些答案来自视角 1。
- 我们的目标是找到最符合回答者给出的答案的观点任务。我们用来寻找这个视角分配的方法被称为期望最大化算法。
这种客观的衡量我们与回答者给出的答案吻合程度的方法被称为可能性。可能性衡量我们的模型产生答案的可能性。
选拔过程
我们执行以下步骤来选择我们的潜在类模型:
- 我们首先将数据集随机分成一个选择集和一个推理集。我们将使用选择集来单独构建我们的最终模型,并且我们将使这个模型适合推理集来解释我们模型的各个方面。
- 对于选择,我们将考虑 1 到 10 个类别的 LCM。在这种情况下,这是考虑到 LCMs 与多达 10 个观点的精神健康在工作场所。为了衡量每个模型的性能,我们将使用数据可能性的日志上的五重交叉验证对它们进行基准测试。我们将选择交叉验证对数似然性最高的模型。
选择结果
Figure 6: Our Cross-Validated Log-Likelihood on the number of classes considered.
我们看到交叉验证的对数似然性增加,直到 3 个类别,3 个类别后有点动摇,然后在 5 个类别后显著下降。因此,我们将选择具有 3 个类/视角的潜在类模型。
推理
概括地说,我们选择了一个包含 3 个类的潜在类模型,将 18 个问题的答案聚集到不同的角度。现在我们有了这个模型,解释我们的模型参数以定义我们的数据集中的这些透视聚类是很重要的。
探索集群
Figure 7: The prior probabilities on our classes/perspectives discovered by our LCM.
我们可以将这些概率中的每一个解释为随机挑选的回答者被分配到特定类别的机会。因此,如果我们随机抽取一个回答者,该回答者有 26.1%的机会来自第 1 类。
我们数据集中最大的类是类 3,类 1 和类 2 是较小的组。我们看到一个随机的回答者有接近相等的机会成为 1 类或 2 类。
然后,我研究了 18 个问题答案的类别条件概率表。我已经在我的推理笔记本中留下了大部分的分析,但是讨论这些表格中的一些来对我们的集群定义的观点做出声明将是有用的。
Figure 8: Class-Conditional Probabilities on whether or not a respondent’s employer provides mental health benefits as part of healthcare coverage.
为了解释这个表格,考虑每一行代表给一个回答者一个课堂作业的答案分布。例如,假设一个回答者被分配到第 1 类,我们预测有 27.2%的几率他们会对这个问题回答“否”,有 11.7%的几率他们会对这个问题回答“是”。
我们看到类 2 主要对这个问题回答“是”,而类 1 和类 3 通常强调其他可能的答案。因此,类别 2 看起来代表经常有心理健康保险的个人,而类别 1 和 3 代表不常见或很少有心理健康保险的个人。
Figure 9: Class-Conditional Probabilities on whether discussing a mental health disorder with one’s employer would have negative consequences.
我们看到 1 班和 2 班普遍认为与雇主讨论心理健康不会有负面后果,而 3 班倾向于“也许”和“是”的答案。因此,这表明 1 班和 2 班通常比 3 班在心理健康方面得到雇主更多的支持。
Figure 10: Class-Conditional Probabilities on answers to the question “Would you feel comfortable discussing a mental health disorder with your direct supervisor(s)?”
我们看到,第 2 班的学生通常乐于与他们的直接主管讨论心理健康问题。一班似乎对这种类型的讨论感到“是”或“可能”舒服,而三班一般似乎不舒服与主管讨论心理健康。这表明二班在心理健康方面面临着直接上司的高度支持,一班和三班分别面临着中等和弱的支持。
Figure 11: Class-Conditional Probabilities on whether or not being identified as a person with a mental health condition would hurt one’s career.
我们看到 3 班普遍认为这种认同会损害他们的职业生涯,而 1 班和 2 班普遍认为这只会“可能”损害他们的职业生涯,或者不会损害他们的职业生涯。
定义集群
很明显,第 1 类代表的个人具有较高的精神健康福利,对精神健康状况的雇主尊重适中,对精神健康状况的同事尊重适中到较高,对精神健康状况的职业损害感知较低。第 2 类包括雇主提供的高心理健康福利、雇主对心理健康状况的高度尊重、同事对心理健康状况的高度尊重以及对心理健康状况的中度职业损害的感知。第 3 类包括雇主提供的心理健康福利中等、雇主和同事对心理健康状况的尊重程度较低,以及对心理健康状况的职业损害程度较高的个人。
在这种情况下,第 1 类代表在工作场所对精神健康状况感到中等支持的一组个人,第 2 类代表在工作场所对精神健康状况感到高度支持的一组个人,第 3 类代表在工作场所对精神健康状况感到低度支持的一组个人。由于类别 3 是模型中最大的分类,而类别 2 是最小的分类,所以这个度量值稍微有点问题。
预测聚类
在将我们的班级定义为工作场所心理健康景观的三个视角后,我决定我想看看回答者的人口统计数据告知了回答者被分配到哪个视角。我决定在预测我们的集群分配时考虑以下变量:
- 性别:回答者的性别(见此处为我们的映射)。
- 年龄:回答者的年龄。
- companySize :被告雇主的公司规模。
- isUSA :被调查人是否在美国工作。
- diagnosedWithMHD :被调查人是否被诊断有精神健康状况。
请注意,这些变量与我们在之前的分析中使用的特征和目标变量非常相似。
构建模型
(注:这一节也很技术性。如果你愿意,可以跳过它!)
与我们之前的分析类似,我决定使用决策树和多项逻辑回归来预测受访者的群体分配。多项式回归本质上是一种逻辑回归,但将多个类别作为目标变量。因为我们有个不同的类别要预测,所以我们必须使用能够处理多种结果选择的模型。
由于我们已经执行了相当大的数据分割,我发现在这种情况下为我们的模型选择执行额外的数据分割是不合适的。如果我们对推理集进行额外的数据分割,我们将只有几百个调查响应来选择我们的最终模型。
我们通过使用偏差标准分裂来拟合我们的决策树。我们在变量的所有线性和交互效应上使用向前-向后逐步选择程序来拟合我们的多项式逻辑回归。
Figure 12: Our decision tree fitted on the inference set.
我们的决策树在考虑决策时会检查 isUSA 、 diagnosedWithMHD 、 companySize 和 age 。值得关注的一点是,它似乎永远不会预测数据中的类赋值 2。在某种程度上,这使得它的效用相当微薄,因为我们有一个完全不被这些变量告知的整体视角。
我们最终的多项逻辑回归最终包括年龄、性别、 isUSA 、公司规模、诊断为 MHD ,以及年龄和诊断为 MHD 之间的交互作用。
在研究我们的模型的准确性时,我发现多项式回归对数据的准确性约为 52.9%,决策树对数据的准确性约为 54.6%。因为我希望减少过度拟合,并且我更喜欢预测类别分配 2 的模型,所以我决定在这种情况下选择多项式逻辑回归。
研究模型
对于那些跳过我们上一节的技术细节的人,我们开发了一个多项式回归来预测我们的班级分配,使用了年龄、性别、 isUSA 、公司规模、诊断为精神疾病,以及年龄和诊断为精神疾病之间的相互作用。
如前所述,我们的模型在推理集上的准确率约为 52.9%。这通常是不合适的,因为我们的表现只比我们预测的所有受访者的课堂作业 3 稍好一点(见图 7)。
Figure 13: The confusion matrix for our model.
我们的模型在预测类别分配 2 方面做得非常差,因为看起来我们对类别分配 2 的预测正确率为 4/(122 + 4 + 10) = 2.9%$了。特别是,对于我们的大多数观察,我们的模型似乎过度预测了类别 3。这可能是由于我们的类别不平衡,因为类别 3 标签在我们的数据集中比类别 1 和类别 2 观察值出现得更频繁。
Figure 14: Our Coefficient Table for our multinomial classifier.
我们看到,我们的位置效应预测,与在美国以外工作的人相比,在美国工作的人更有可能属于第二类,稍微更有可能属于第三类。我们还看到,预测诊断对观点有轻微的两极分化影响,因为我们预测它将严重增加对类别 2 和类别 3 的分配,而不是类别 1。我们还看到,随着公司规模变大,被分配到第二类的可能性预计会增加,这表明随着公司规模变大,预计员工会发现工作场所存在更多的心理健康支持系统。
同样清楚的是一个非常重要的性别效应。我们看到,女性被分配到 3 级的可能性预计是男性的 exp(.313) = 1.367 倍。这意味着,一个给定的女性比一个同等的男性平均高出 36.7%。当我们看到女性在课堂作业 2 中的性别影响很小时,这意味着女性比男性更容易感到在工作场所缺乏良好的精神健康支持系统。
年龄效应相当有趣。考虑一个案例,其中一个人没有被诊断为精神健康状况。据预测,年龄增加一岁将使分配到类别 2 和类别 3 的概率分别增加 exp(.0666) = 1.069 和 exp(.0597) = 1.0615 。这意味着每增加一年,这些分配的机会预计将分别增加约 6.9%和 6.2%。这表明,随着未确诊的个体变老,存在二分法效应。他们要么发现在工作场所有一个强大的心理健康支持系统,要么发现有一个薄弱的支持系统。
让我们根据一些相关的人口统计数据进行一些要点比较。我们将把这部分分析局限于大公司的美国员工。我们将从研究平均年龄的个体开始。
Figure 15: Class Assignment Predictions for US workers at large firms of average age in our survey.
我们看到,在所有情况下,我们的模型压倒性地预测这个年龄组的班级分配为 3。因此,对于大公司中平均年龄的美国员工来说,我们预测他们可能会在工作场所对精神健康感到支持不足。我们还看到,那些被诊断出有精神健康问题的人被预测比他们同等的未被诊断的同行更不可能被归入 1 类。这证实了精神健康状况在支持方面的一些二分法。
我们看到,在这种情况下,男女之间的性别效应是显而易见的。特别是,与同等男性相比,该人口统计中被诊断的妇女被预测为*(. 44—. 36)/(. 44)=(18.18%)不太可能处于第二类,而 (.59 — .51)/(.51) = 15.68%更可能处于第三类。*
讨论
重要的是,我们的班级模型预测,更多的人认为工作场所的精神健康支持系统很差,而不是认为支持系统中等或强。事实上,我们的模型预测,相信前一种观点的人比相信其他两种观点的人加起来还要多。这表明整个行业要完全解决工作场所的精神健康问题还有很长的路要走。
诊断效果非常强,因为它将个人从感觉得到适度支持的角度推开,并将群体极化为在精神卫生保健方面感觉得到高度或微弱支持。这可能是因为被诊断患有精神健康疾病会让你更适应你周围的精神健康资源。从这个意义上来说,精神健康诊断可能会让一个人对工作场所中可用的资源和支持更加敏感,这可能会对一家公司的精神健康状况产生非中立的看法。这对于公司在对工作场所心理健康支持系统的反馈作出回应时加以利用可能很重要。
就像我们之前的分析一样,性别效应是研究的关键。这种性别效应表明,女性比男性更容易发现心理健康支持系统薄弱。也像我们之前的分析一样,这种结果可能有两种解释。在心理健康方面,女性获得的支持系统可能比男性少。话虽如此,也有可能女性比男性对工作场所的心理健康资源更敏感。后一种解释可能得到以下事实的支持,即在我们之前的分析中,我们发现女性比男性更有可能要求精神健康诊断。利用对我们模型的调整和研究将诊断和性别与这些观点联系起来的因果机制来进一步研究这种影响将是有趣的。
公司规模效应也应该考虑在内。特别是,我们预测,随着公司变得越来越大,他们的员工预计更有可能在工作场所感受到对精神健康的强烈支持。对此可能的解释是,大公司可能有小公司没有的财政资源来更好地支持工作场所的精神健康。当考虑同事和主管的意见时,这并没有解释一些关于心理健康的禁忌。同样重要的是要注意,大公司可能有官僚结构,这将阻止个人轻松访问这些资源,这与我们发现的预测效果相反。为了更详细地研究这种影响,我们可能需要一个 companySizevariable,它具有更高的粒度,并对科技行业主要公司提供的精神健康资源有更深入的了解。
限制
有几个限制需要解决:
- 有可能我们的 LCM 没有被很好地指定。特别地,它假设由 LCM 聚类的问题的每个答案在给定类分配的情况下是有条件独立的。即使从某个特定的角度来看,受访者的答案也极有可能高度相关,因此考虑解释这一问题的模型可能很重要。
- 我们预测班级分配的模型目前非常糟糕,它通常过度预测了工作场所中精神健康支持度低的观点。考虑可能需要哪些其他人口统计数据来更好地了解个人对这一主题的观点可能很重要。
- 年龄和诊断之间的相互作用目前可能是虚假的。特别是,它没有考虑人们在特定年龄是如何被诊断的,因此观点可能是基于他们被诊断的时间而不是年龄本身在特定年龄形成的。
- 在未来的分析中,考虑到个体经营者的细微差别是很重要的。简单地将他们排除在分析之外,并不能给我们一个心理健康支持系统的全貌。
未来的工作
为了进一步分析,需要考虑一些因素:
- 有更多的人口统计数据来预测我们的课堂作业将有助于改进这种分析。最值得注意的是,婚姻状况或有孩子可能会使一个人对可用的心理健康资源更加敏感。教育和父母背景也可能影响这些观点。
- 在这个行业中,有一些关于个人对心理健康的观点的语言数据。虽然为了防止过于复杂,我将它排除在分析之外,但挖掘这些语言数据对于进一步描述这个问题可能是有用的。
- 将 2014 美元调查的分组分配与当前调查进行比较可能也是有用的,以便研究对这一问题的观点如何随着时间的推移而变化。
更新:
- 美国东部时间 2017 年 4 月 27 日下午 5:00:清理了一个数学对象上的 LaTeX 标签的快速添加。
我要感谢创造了这个调查。如果你欣赏 OSMI 正在做的工作,请随意捐赠!
我要感谢 克里斯蒂娜·基兰 和 乔·弗格森 支持我继续分析 OSMI 调查。还要感谢 卡拉·弗格森 帮忙编辑修改这篇分析。
如果你有兴趣进一步研究我的分析,可以在这里 随意查看我的代码和资产 。你可以在我的 GitHub 个人资料上查看我的整套项目(PLBMR)。
如果您对分析有任何疑问,欢迎在下方留言评论!
数据与心理健康:OSMI 调查—第三部分
嘿大家好!尽管对这个调查做了两次分析,我的数据刚好够再做一次分析。在这次分析之后,我将会花更多的时间研究与精神健康相关的其他数据集。
开源精神疾病 (OSMI)曾在 2014 年做过类似的调查。假设我们的数据分析有两个时间点,这给我留下了两个关于数据生成过程的问题:
- 我们是否看到了这些年间精神健康状况诊断率的差异?
- 在这两年间,我们是否看到了某些人口统计学因素对诊断的影响有所不同?
话虽如此,我们还是开始吧!
数据集
我在我的第一次分析中详细描述了 2016 年 OSMI 调查。与 2016 年的调查一样,2014 年的调查主要分布在科技会议和在线场所。因此,这个数据集很可能包含同样的选择偏差问题,这些问题影响了我们对后来调查的解释。
一个显著的区别是,2014 年的调查比 2016 年的调查问题少得多。特别是,2014 年的调查包含 26 个调查问题,而 2016 年的调查包含约 63 个问题。我们之前的分析中使用的一些值得注意的变量没有记录在 2014 年的数据集中,包括:
- 以下哪一项最能描述你的工作岗位?(角色类型)
- 你是否被医学专家诊断出有精神健康问题?(被诊断出患有 MHD
不幸的是,我们将不得不把我们的分析限制在两个数据集中的变量上。由于在 2014 年的数据集中没有有效的替代变量 roleType ,我们需要将其从我们的分析中移除。然而,我们能够找到我们的诊断与 MHD 变量的替代。在 2014 年的数据集中,我们发现了这个问题:
- 你是否寻求过精神健康方面的治疗?
如果一个人对这个问题的回答是“是”,很可能他们有某种心理健康状况。也就是说,不清楚对这个问题回答“否”是否表明一个人没有精神健康问题,或者一个人只是没有接受治疗。这是目前 2014 年数据集中diagnostedwithmd的最佳可用指标,因此尽管我们仍然使用它来合并我们的两个数据集,但我们需要在我们的限制部分说明这个问题。
数据探索
Figure 1: Number of observations by year.
虽然 2016 年看起来比 2014 年有更多的观察,但我们认为大约有 150 名受访者。考虑到我们有超过 2600 个观察值,这是一个相对较小的差异。因此,我认为我们不需要担心合并数据集中不平衡的年份。
单变量分析
Figure 2: Distribution of Diagnosis given Year.
我们看到分布的相对差异很小,因为 2014 年和 2016 年的分布看起来各占一半。
Figure 3: Distribution of Age on Year.
我们看到这两年的年龄分布差别很小。也就是说,2016 年的分布看起来比 2014 年的分布略大。
Figure 4: Distribution of Gender by Year
我们看到,在这两年中,我们的性别分布主要由男性构成。不幸的是,这反映了科技行业存在的性别差异。也有相对较少的人不认同性别二元(O 型)。正如我在之前的分析中所讨论的,我希望对这个群体有更多的粒度,但有限的观察数量使得很难指定更粒度的性别谱。
二元关系
Figure 5: Distribution of diagnosis given gender and year.
我们很少看到年份和性别之间的交互作用,因为性别对诊断的影响在两年之间没有太大的变化。就像我们之前的分析一样,看起来女性和非二元个体比男性更有可能被诊断出精神健康状况。
Figure 6: Distribution of diagnosis given whether an individual was working in the United States by year.
我们看到,在美国工作对诊断率的影响在两年间没有太大变化。尽管如此,不随时间变化的地点效应仍然很明显,因为在美国工作的人看起来比不在美国工作的人更有可能被诊断出精神健康状况。
基于我之前的分析,我有兴趣看看美国在诊断上是否有明显不同于其他发达国家的位置效应。因此,我想知道在英国( isUK )或在加拿大( isCA )工作是否对诊断率有一些有意义的影响。我选择这两个国家是因为它们是我们数据集中第二和第三大流行地点。
Figure 7: Distribution of diagnosis given whether an individual works in the United Kingdom by year.
我们在这里看到了一种互动效应。2014 年,无论一个人是否在英国工作,诊断结果的分布似乎没有什么不同。然而,在 2016 年,我们看到在英国工作的个人比在英国以外工作的个人被诊断的可能性略低。促成这一变化的因素需要对英国精神健康状况的叙述进行更深入的分析。
Figure 8: Distribution of diagnosis given whether an individual works in Canada by year.
我们在加拿大看到了非常相似的互动效应。这可能表明,在 2014 年至 2016 年期间,除美国之外,发达国家的诊断率有所下降。也就是说,我们需要做一个完整的国际政策分析来研究这种互动效应。
型号选择
在结合了 2014 年和 2016 年的数据集之后,我决定在执行完整的选择程序之前测试简单模型的性能。
初始建模
作为典型的后续分析,我选择做的第一件事是在当前数据集上测试我们之前工作的最终模型。因为我们在上述模型中缺少一些变量,所以我选择在我们的组合数据集上使用以下变量来测试一个逻辑回归:
- 年龄
- 性别
- 伊苏萨
- 年龄和性别的相互作用
该模型在我们的组合数据集上有 59.44%的准确率。鉴于整个数据集中的诊断率略高于 50%,该模型解释了我们数据中的一些变化。
我还测试了一个类似的模型,它也包括了年的主效应以及年与年、性别和伊苏萨的交互作用。我主要测试这个模型,以便在我们的数据中看到任何明显的时间效应。这个模型与我们之前的模型表现一致,这表明我们的基于年的效应对预测诊断率没有帮助。
Figure 9: Our Initial Decision Tree for some relevant variables in our dataset.
我还拟合了一个年龄、性别、 isUSA 、年份的决策树。这个树在上面的图 9 中有描述。该模型似乎发现性别是唯一的信息变量,这不是一个非常有趣的工作叙述。这个模型在我们的数据集上也有 58.22%的准确率,比我们以前的模型的性能稍差。这向我暗示,在我的模型选择过程中考虑决策树是不值得的。
方法学
我在选择过程中考虑了以下变量:
- 年龄
- 性别
- 伊苏萨
- isUK
- isCA
- 公司规模
- 年份
- 年和我们的其他主要效果之间的相互作用
- isUK 和我们其他主特效的互动(除了 isUSA 和 isCA
- isCA 和我们其他主特效之间的互动(除了 isUSA 和 isUK
- 年龄和性别的相互作用
我选择考虑公司规模,因为角色类型在我们当前的分析中缺失。我觉得公司规模可能有助于包含一个基于雇主的效果的叙述,这种效果可能会随着角色类型而丢失。我选择考虑 isUK 和 isCA 与其他主要效应的相互作用,因为我没有太多时间研究这些特征与我们以前选择的变量之间的关系。因此,一个“厨房水槽”的互动效果与这些位置特征感觉像是最好的选择。我还考虑了年龄和性别之间的相互作用,因为它在之前的分析中被用于我们的最终模型。
(注:本节其余部分技术性很强。请随意跳过它,进入推论部分!)
我采取了以下步骤来选择我们的最终型号:
- 我把我们的数据分成一个选择集和一个推理集。我们的最终模型将在选择集上被选择,然后在我们的推断集上被拟合,用于估计和结果。
- 因为我考虑了许多不同的变量,我觉得选择模型的更有效的方法是通过逐步逻辑回归,使用赤池信息标准(AIC) 进行变量决策。下限模型是仅截距的逻辑回归,上限模型包括上面列出的所有变量。为了减少逐步选择过程中出现的诱导偏差,我选择使用向前向后的过程来选择变量。
选择结果
令人惊讶的是,我的最终模型比我之前分析的最终模型更简单。逐步选择程序选择了以年龄、性别和 isUSA 为特征的逻辑回归。在这个最终模型中,没有交互作用的影响,也没有基于年份的影响。
推理
对于那些跳过前一节的人,我们最终的诊断率模型是一个逻辑回归,以年龄、性别和伊苏萨为变量。
诊断学
该模型在我们的推理集上有 58.2%的准确率,这接近于我们的上一个模型在 2016 推理集上的准确率。也就是说,我们在两个略有不同的数据集上比较了两个模型的性能。很可能比较它们的准确性就相当于比较苹果和橘子。
Figure 10: The confusion matrix of our model on the inference dataset.
我们已经在之前的分析中提供了混淆矩阵的解释(参见这里的,图 11)。在我们当前的上下文中,我们的假阳性率是173/(173+503) 100% = 25.55%,我们的假阴性率是388/(388+278)* 100% = 58.26%*。很明显,我们的模型不能预测诊断率,这可能表明我们没有足够的人口统计学信息来预测诊断。
(注:这一小节的其余部分相当专业。请随意跳到口译部分!)
Figure 11: Our Pearson Response Residuals on our fitted values and our predictors.
我们在性别残差图中看到一些非线性。特别是,对于非二进制个体,我们的残差似乎不是以 0 为中心。除此之外,看起来没有违反独立性或恒定方差假设。
Figure 12: the Q-Q Plot for our Pearson Response Residuals.
对于我们的经验 CDF,有许多偏离高斯线的情况。因此,我们的残差很可能是非高斯的,所以我们不应该用高斯误差模型来解释我们的数据。这让我使用 bootstrap 程序对案例进行重新采样,构建出我们模型中的不确定性度量。
解释
Figure 13: Our Coefficient Estimates with bootstrapped 95% confidence intervals for our estimates.
我们对性别和 isUSA 的预测效果分别是. 8296 和. 3657,接近他们在之前模型中给出的估计值(见此处,图 12)。也就是说,现在我们有了自举置信区间,我们对这些变量对诊断率的真实预测效果范围有了更精确的估计。特别是,我们以 95%的信心预测,女性被诊断为精神健康状况的可能性是男性的 1.72 倍(T6)exp .(542)= 1.72 倍(T7)到 3.06 倍(T8)exp(1.12)= 3.06 倍(T9)。这向我们表明,女性被诊断的可能性是男性的 2 倍。
年龄的预测效应相当小,我们可以看到 0 的效应目前在该效应的自举置信区间内。这表明我认为年龄对诊断率几乎没有预测作用。
这个模型有意思的是,非二元个体的性别效应非常大。我们预测,平均而言,一个非二元个体被诊断为精神健康状况的可能性是一个同等人的 4.57 倍。95%的置信区间表明,非二元个体的真实预测效果介于 exp(.7876) = 2.2 和 exp(2.712) = 15.06 之间,是同等男性的诊断可能性。这种估计影响的大范围将在讨论部分进行更详细的研究。
让我们研究这个模型的相关点预测。
Figure 14: Predicted diagnosis rate of recent graduates of various genders working in the US.
我们看到,即使是最近的毕业生,女性和非二元个体比男性更有可能面临诊断。特别是,在美国的这个年龄,非二元个体比男性更有可能面临诊断。
Figure 15: Predicted diagnosis rate of average-aged individuals of various genders working in the US.
然后我决定研究平均年龄的个体,同时保持其他人口统计信息不变。我们看到我们的诊断率没有太大的变化,这是可以预料的,因为我们的模型中年龄的预测作用较弱(见图 13)。
Figure 16: Predicted diagnosis rate of recent graduates of various genders working outside the US.
我们发现,在美国以外工作会使这个年龄段的所有性别的诊断率降低约 9%。我们还看到,非二元个体和自我认同的男性之间的差异变得更加明显。在这种情况下,我们预测非二元个体比男性更有可能被诊断为精神健康状况。
讨论
我们看到,在模型选择步骤中,我们的年度效应被排除在我们的分析之外。这表明,不仅诊断的分布在这两年中是相同的,而且人口统计学和诊断之间的关系在这两年中保持相对相同。在这方面,2014 年和 2016 年之间的人群差异相对较小,无论这两个时间点之间发生了什么政策干预(如进一步实施平价医疗法案)都没有对诊断率产生多大影响。
我们发现女性的性别效应和美国的地理位置效应与我们在之前的分析中看到的相似。因此,许多相同的不确定性对诊断的因果影响保持不变(见前面的分析,讨论)。这种分析通过在我们的选择步骤中去掉 isUK 和 isCA 而有助于这些因果叙述。由于英国和加拿大分别是我们数据集中第二和第三大流行国家(美国是第一),这种下降不能完全通过这两个地方的小样本来了解。这进一步强调了美国科技行业或美国整体精神景观中的一些组成部分,使其诊断率不同于所有其他国家。
年龄对我们的诊断率几乎没有预测作用。这表明诊断不会随着个体年龄的增长而改变,但它并没有说明年龄对诊断的非线性影响。也许有一个特定的年龄组更容易根据心理健康状况的变化或科技行业的年龄歧视压力进行诊断。也就是说,研究这一点需要进一步改变模型(见未来的工作)。
拥有更大的组合数据集的好处之一是,我们可以更精确地估计非二元性别对诊断的预测效果。特别是,我们现在预测,非二元个体面临诊断的可能性是同等自我认同男性的四倍。也就是说,这种预测效果的叙述需要进一步的分析来证实。在一个迫使个人遵从性别二元制的国家,不清楚是行业内的压力还是整个社会的压力造成了这种效果。
限制
这种分析有几个局限性:
- 我们在 2014 年数据中的诊断指标与我们在 2016 年数据中的诊断指标不同。虽然我们有一个强有力的理由来解释为什么选择这个指标,但是这个差异是我们的目标变量的测量误差。该测量误差可能部分地使该分析的一些成分无效。
- 我们的推理数据集中只有 27 个非二进制个体,这意味着我们对这个群体的估计效果相对不精确。我们只能希望在这次调查的未来截面中,我们将捕捉到更多的非二元观测结果。在未来的调查分发策略中,以这一群体为目标也许是有用的。
- 2014 年数据集中缺乏职位描述迫使我们在本次分析中不考虑角色类型。当我们没有考虑一个人的工作类型如何影响他们的心理健康时,我们可能会遗漏特定工作的叙述。
- 正如我们在之前的分析中所讨论的,调查分布策略表明我们存在选择偏差。这种选择偏差可以在两个方向上起作用。很可能对心理健康更感兴趣的人会参加这项调查,这可能会导致对有心理健康问题的人进行过采样。另一方面,更有能力参加调查的人可能已经参加了调查。这可能会低估严重残疾的个人。
未来的工作
这个数据集有一些未来研究的途径:
- 将这次调查的结果与其他行业的结果进行比较是有益的。科技行业和其他白领工作之间的心理健康状况可能存在差异。
- 比较线性年龄效应和非线性效应是有用的。可能有些年龄段对诊断有关键影响,而不是诊断受年龄本身的影响。
- 深入探究我们的位置效应,看看美国的哪些方面创造了与其他发达国家不同的诊断率,将是有益的。
- 对即将到来的 2017 年技术领域精神健康调查的可能改变可能会给我们更多的人口统计变量,这些变量可以更好地预测诊断率。
我要感谢 OSMI 创建了这个调查。如果你欣赏 OSMI 所做的工作,请随意捐赠!
感谢 克里斯蒂娜·基兰 和 乔·弗格森 支持我继续 OSMI 调查的分析。
如果你有兴趣进一步研究我的分析,可以随意查看我的代码和资产 这里 。你可以在我的 GitHub 个人资料上查看我的整套项目(PLBMR)。
请随意查看我之前对这个数据集的两次分析。这些可用 这里 和 这里 。
如果您对本分析有任何疑问,欢迎在下方留言!
数据和政治变革
社会学家乔治·齐美尔在 1915 年左右写道,“我们技术的巨大密集和广泛增长……将我们卷入一个手段的网络,手段通向手段,越来越多的中间阶段,使我们看不到我们真正的最终目的”。这些对技术在他所称的文化危机中的作用的反思,当然是对非常不同的政治时代的回应,然而这段话的观点仍然在回响。我们的技术系统越来越密集,越来越深入我们的生活,同时向外扩展到网络中。我们的媒体在伸出手的同时向内推进。对西美尔来说,结果是我们被这些系统纠缠在一起,它们层层叠加,很难把手段和目的分开。他的观点是,在所有这些分层的技术和信息碎片中,我们实际上看不到我们的目的感。简而言之,现代化带来的问题是,我们太专注于我们能做什么,太被层层任务、互动和过程分散了注意力,以至于很难保持方向感或专注感。
很少有作家比西美尔更好地把握住了日益增强的现代性力量。戴维·弗里斯比甚至称他为“第一位现代社会学家”。西美尔于 1918 年去世,他写了各种各样的主题,从时尚和食物到城市生活和秘密社团,但他总是关注他周围可以看到的现代性的发展后果。由于对这些早期转变的敏感,他的作品带有一种事物发展方向的感觉。
西梅尔长期以来一直对现代生活如何改变日常经历感兴趣。在 20 世纪初的一篇文章中,他思考了这些变化对感官的意义(在这篇文章中有更详细的描述)。他的结论是,我们最终会变得“感知不足”。意味着我们感觉事物越来越接近,同时又感觉远离更广阔的世界。我们根本无法应对由深不可测的信息和许多经验刺激带来的感官超载,所以我们更专注于眼前。他后来指出,随着现代性的到来,生活变得越来越“支离破碎”。我们面对的碎片越多,他在他后来的作品中声称,我们就越能拼凑出适合并强化我们对世界的概念——我们对世界的概念为这些碎片提供了一个框架,反过来,随着时间的推移,这些碎片又塑造了这个框架。在一篇关于技术和民主之间不断变化的关系的广泛而深思熟虑的文章中,杰米·巴特利特指出,寻找我们可以策划或编辑的例子来支持我们观点的能力是一个比所谓的“假消息”更大的问题。这种操纵碎片以支持理想或特定世界观的能力是西美尔观察到的,并开始概念化。碎片的范围越大,巩固这些观点的可能性就越大,人们从信息碎片中收集非常不同的世界观的可能性也就越大。在他 1918 年出版的最后一本书里,他写道:
“世界”是一种形式,通过它我们将所有给定的——实际的或潜在的——集合成一个整体。根据指导这种统一的终极概念,多个世界从同一材料中产生:知识世界、艺术世界、宗教世界。
如果是这样的话,那么我们可以想象,有了我们目前的个性化、按需和算法化媒体,西梅尔所观察到的生活的零碎特征将如何随着创造世界的可能性而升级。不仅有更多的碎片,我们遇到这些碎片的方式近年来也发生了变化。
在过去的 20 年里,我们围绕自己建立了一个大规模的数据基础设施,包括移动设备、算法处理、社交媒体、在线购物、GPS 跟踪等等。20 世纪 80 年代末,社会理论家唐娜·哈拉威对即将发生的事情有着强烈的感觉。哈拉威预见到,我们最终会以多种不可避免的方式融入我们的环境。这将改变边界条件,即我们与世界的连接点。正如哈拉威预测的那样,这些界面改变了我们的社会生活、休闲、工作和身体,它们之间的联系有着不可避免的性质。政治活动的背景已经发生了不可逆转的变化。最近几个月,这种情况以各种方式暴露出来,引发了人们对数据和技术可能如何侵蚀一个正常运转的民主国家的结构的担忧。除了更明显的数据滥用案例,科尔宾和他的核心圈子的社交媒体供稿微操作的怪异最近的故事在工党竞选广告上误导他们,给人一种规则如何被重新制定的味道。当然,这只是一座巨大的数据冰山的一角,这座冰山正在产生各种各样的结果和扭曲,同时还在堆积更多层 Simmel 提到的那种类型。
在这种碎片化媒体、新的权力结构和连通性的更广泛背景下,数据分析不再是次要角色。近年来,它已经成为推动社会生活场景、情节和对话的核心人物。数据导向的思维和分析技术的传播似乎是无情的。随着那些参与数据分析的人追求不间断的世界愿景,我们的生活越来越多地暴露在它不屈不挠的凝视之下。
我最近完成了一本书,名为 《数据凝视:资本主义、权力和感知 ,这本书着眼于数据的力量是如何融入数据分析的基础设施和实践的。一组有说服力的承诺被附在数据分析上,它们既延续又部署了对知识、生活和未来的某些愿景。也许毫不奇怪,在这一愿景中,数据将使我们变得更好、更快、更具创业精神、更高效和更具竞争力。这些有说服力的理念不仅传达了更广泛的意识形态,还提供了数据分析的扩展和强化。分析行业寻求推广某些的理想和愿景,以支付其产品的传播费用。结果是,这些理想和思维方式被编码到我们现在占据的非常数据密集型的基础设施和空间中,它们成为如何使用数据、如何通过我们的数据来判断我们等等的一部分。这些理想通常与通常被称为新自由主义理性的东西一致,在这种理性中,一种市场模式被推出到社会世界中,但如果只通过这个镜头来看待它们,那将是一个错误。编码到这些基础设施中的理想是多样的和不断变化的,这意味着我们不能简单地转向新自由主义来解释这些变化。
举一个例子,一个主导思想是,世界正在加速发展,数据分析提供的实时视图是我们可能跟上发展的唯一方式。世界正变得越来越快的观念,被作为一种将快速数据知情决策的理念嵌入组织和社会结构的方式而得以延续。核心思想是,数据使人们能够在竞争中领先,或者这些分析为他们提供了超越竞争对手的优势。在这里,我们看到市场模式和超竞争力的概念正在固化——与此同时,我们被告知,我们需要不断加快步伐。这种想法被编码成数据分析背后的软件项目被想象和设计的方式,这反过来又转移到这些系统的实现中。数据分析所依赖的软件被锁定在对完美洞察力的永恒追求中,不断有大量更新和新项目出现。类似地,数据分析师被要求清理和呈现数据,以便在尽可能短的时间内做出决策。竞争速度只是一系列固有理念的一个方面(在数据凝视中有详细讨论);这些也已经成为我们生活方式的重要组成部分,这些理念塑造了分析设计和整合到各种类型组织中的方式。
如果意识形态和理想以这种方式被编码到我们的基础设施中,那么很难想象在不拆除和重建调节我们消费、社会网络、互动、机构和工作场所的系统的情况下,它们会如何转变。齐美尔所说的密集的技术提供的“手段”使得这样的任务几乎不可想象。很难想象一个全新的基础设施会从我们脚下出现,尤其是考虑到这些数据丰富的架构背后的时间和资源。
如果我们将更广泛的言论转向不同的方向,如果政治变革发生在意识形态层面,我们可能会想,我们丰富的数据基础设施是否会阻碍我们的社会结构、组织和日常体验层面的真正变革。问题可能是,修辞变得完全脱离了我们日常生活的中介物质——随着话语中的变化,没有意识到这些巨大的密集和广泛的基础设施可能会受到挑战和改造。真正的改变需要相当大的方向转变。不仅数据分析在我们的商业、国家和组织结构中如此深入,与之相伴的思维模式也是如此。
随着我们的基础设施变得更加活跃,其中嵌入了如此多的思想,从算法建模到人工智能和机器学习的概念,因此出现了更严格的意识形态编纂的可能性。如果我们寻求社会和政治变革,那么我们不能仅仅从意识形态的角度来思考,我们还需要重新想象我们所生活的数据分析结构。在这种情况下,了解的方式与生产方式同样重要——事实上,在数据支撑资本主义的地方,这两件事混淆在一起。让我们的基础设施保持现状,即使我们改变我们的政治基调和治理,也可能使这种变化流于表面。目的将从这些手段层中分离出来。我们将继续生活在一种分布式的力量中,这种力量不再受任何核心意识形态力量的真正领导,而是如此根深蒂固,以至于它在我们的生活中漫无目的地游荡。因为权力如此深植于组织结构中,它可以在没有中枢神经系统的情况下通过数据发挥作用,因此只能通过关注它的隐性存在和限制来真正破坏它。
国际奥委会已经呼吁围绕数据使用制定新的选举规则,除此之外,我们还需要更具前瞻性的思维和前瞻性的监管方法。在更大的范围内,监管和重组需要一起进行——在如何监管平台方面有一些创造性的新兴想法,例如在最近由 IPPR 出版的报告中。从社交媒体到工作场所权利,围绕数据、平台、算法等的所有权和使用的新政策将至关重要。但是我们也需要跨越不同的尺度,深入到日常和组织层面。在这方面,我们需要在工作场所、服务提供、交易和信贷中使用数据的新规则。我们还需要重新思考公共机构和治理系统如何使用数据。除此之外,我们需要一个新的激进的教育议程——也许是在学校和大学里的数据公民计划——让人们能够理解这个不断变化的环境,它对他们意味着什么,对社会意味着什么。这一数据公民计划可用于建立对数据用途和影响的理解和认识——然后可用于未来如何处理、管理、改造和处理这些数据。政治愿景至关重要,但关注我们所占据的基础设施也同样重要。如果我们继续像 Simmel 观察到的那样纠缠于我们的技术,那么任何寻求真正变革的政治运动都需要精通数据。只有到那时,我们才有可能改变不平等的编码,朝着进步的目标重塑这些系统,并从我们的最终目标中分离出分层的手段。
…
《数据凝视》 现在可以从普通商店预订平装本。描述这本书写作的一篇文章可以在这里找到。
业务数据集的数据注释最佳实践
在之前的一篇文章中,我们介绍了如何利用 reCAPTCHA、Mechanical Turk、Figure Eight 或 PyBOSSA 有效地众包我们的注释任务。但是,成功的众包活动注释您的业务数据集的秘诀是什么?
这里有一些我在 PyBOSSA 中使用过的快速提示(也适用于其他众包平台)来帮助你开始:
But how do we annotate the dataset(s)?
分阶段计划
- 数据标注是马拉松,不是短跑。最好从处理业务问题的数据科学家和 SME 的核心团队开始,用他们自己的答案“引导”数据集。实际上,您使用核心团队作为第一批工人来注释数据集的一小部分。当你向大众工作者扩展来衡量他们的可信度时,这将会派上用场。
- 使用来自每个阶段的反馈来迭代活动的工作流程,以使员工的参与变得非常简单。然而,注意不要重复太多。至关重要的是,你要在每个阶段保持活动精神的相似。查看调查设计了解更多详情。
- 使用排他性策略来增加员工对活动的兴趣,这与参与活动的激励措施紧密相关(稍后将详细介绍)。
- 避免让工作人员在一次活动中对同一观察执行多个注释任务的诱惑。相反,为每个需要注释的任务发起多个活动。每个活动的泳道越简单,最终的数据集就越丰富和有用。
清晰简单的说明
- 你应该能够用不到 40 个单词来解释你要求工人执行的注释任务。再多就会导致参与度急剧下降。如果你发现你用了太多的词语来解释手头的任务,重新评估你要求完成这项工作的工人的能力。
- 如果整合到 SME 的现有工作流程中,尽可能使其顺畅。你最不希望的事情就是任务太麻烦,以至于工人忽略它,或者更糟的是,输入随机的答案,只是为了通过你的注释任务!
- 限制员工成功参与活动所需执行的操作数量。理想情况下,每个任务、每个观察只需一次点击。这里的目标是降低参与的复杂性,以便员工更有可能正确参与。页面上有大量的 HTML 表单元素会让工作人员感到困惑,分散他们执行注释任务的注意力。这可能需要预先进行更高级的 HTML/JavaScript 编程,但是为了有一个坚实的基础事实数据集,时间投资是值得的!
- 理想情况下,尝试注释任务的工人已经被确定为“合格”。以防万一,提供任何术语和主题信息的超链接,以确保员工之间的一致应用。这可能像定义任务中使用的术语一样简单,也可能像解释您要注释的内容的整个过程一样复杂。同样,在选择哪些工人来执行这项工作时,他们应该已经知道这一点,但让它在点击范围内来刷新他们的记忆是有帮助的。
- 向员工提供反馈回路。老实说,注释数据是一项枯燥的工作。反馈员工回答了多少问题,以及其他基本指标,可以让员工保持参与。在某些情况下,一个简单的进度条对参与度有很大帮助。别信我的话,A/B 测一下!
- 时间限制有多少答案可以提供。在一些活动中,我们对多元化人群的智慧更感兴趣,并希望防止单个员工做出过多贡献。对于这一点,限制每个员工每小时/每天回答的次数是一个很好的解决方案。
活动的通信计划
- 您的员工如何知道注释活动可用?您是否有一个集中的中心来管理所有可用的活动,或者您是否希望将活动限制在特定的 SME?
- 在某个活动中,您是否有权要求特定的 SME 每天执行 N 项任务?如果没有,你需要找出如何从他们的领导团队获得授权,以确保活动成功。这通常包括向领导团队解释,在我们拥有这种类型的数据集之前,我们无法执行任何可信的机器学习建模。但是要注意,在商业中尝试这种类型的数据注释众包时,这可能是最困难的任务!
- 确保领导团队和员工都非常清楚为什么要开展这项活动。它有助于解释一旦收集到这种类型的数据,It 有可能公开什么类型的解决方案。对于任何重大的业务问题,通常都会附上一个金额数字,这有助于说明一个有效的带注释的数据集的重要性。但是,当最终目标是增加/取代/自动化工人的一部分日常工作时,要注意你如何向工人传达这一点。您最不希望的事情就是公开反对您的数据注释任务!
对工人的激励
- 找到一种方法来整合基于时间的激励措施,并添加游戏学(即游戏设计)的元素,使活动对员工来说更有趣。
- 奖励不一定是金钱上的。通常很容易找到礼品卡的预算来奖励前 N 名贡献者,但这可能不是最好的动力。与领导团队一起集思广益,找出激励员工的激励措施(甜甜圈、与副总裁共进午餐、额外休息、为参与最终项目的核心团队提供一个席位,该数据集将用于该项目等)。
验证员工答案
- 在你已经知道正确答案的地方,偶尔加入“抓住问题”的观察。这将有助于衡量每个员工的可信度,以了解他们的答案是否应该包含在最终的数据集中。通常,此“抓住”数据集从活动的初始“引导”阶段获得,该阶段可能由发起活动的核心数据科学团队策划。
- 测量每个工人为每项任务提供答案所花费的时间,然后应用 pareto 原则去除离群工人。请记住,我们对利用专家群体的智慧来构建我们的地面真相感兴趣;不仅仅是那些能最快/最慢完成任务的专家。
- 汇总所有工人的答案,以确定何时您有足够的法定人数,哪些注释应被视为“基本事实”。这通常意味着向奇数个工人(即 3、7、9 等)呈现相同的观察结果。).虽然这引入了重复工作,但它也让我们能够捕捉不同工作者对真相的理解。当与 SME 在业务数据集上合作时,该数据集将用于训练机器学习模型,该模型将使业务的某些方面自动化,关键是我们要根据普遍接受的“真理”来训练它。
- 与领导团队一起进行抽查,以确保法定人数的员工的回答符合他们的期望。如果没有,进行更深入的调查,以了解工人与领导团队意见不同的原因。这通常会带来比任何机器学习算法都能找到的更有趣的见解!
我很想听听商业领域中其他实践数据科学家的意见。你通过哪些步骤来生成地面真实数据集,以训练你的机器学习模型?
作为不完整历史的数据
虽然哲学家们长期以来一直在争论存在和未被察觉的东西是否真的存在,但在数据方面,事情很简单:如果来自某个东西的数据未被收集,它就不能被使用。即使感知到也帮不了你多少。
Pietro Paolini — Allegory of the Five Senses; Sight and Touch. Source: www.the-athenaeum.org/art/full.ph…
虽然有些人可能认为这一点是显而易见的,但即使是我们今天看到的大规模数据增长仍然只代表了现有数据或感知数据的一小部分。环顾四周,问问你自己,你正在品尝、看到、触摸、闻到或听到的东西有多少产生了正在被收集的数据。十有八九,答案是几乎都不是。考虑到现在存在的大量数据,这一点很容易被忘记,但是,通过查看我们的过去,我们可以更好地说明我们今天在哪里,我们不在哪里。
为了说明这一点,我将看看历史学家的工作。历史学家的目标是试图理解和解释已经发生的事情,有时还有一个额外的目的,那就是告知正在发生的事情,或者甚至帮助预测将要发生的事情。然而,起点是过去,因为如果你不知道发生了什么,你就不可能知道也不可能知道会发生什么。
虽然历史学家并不以特别精通数据而闻名,但他们广泛利用历史数据来实现自己的目标。此外,在使用这些数据时,历史学家明白它的局限性。过去发生的事情的历史数据或信息痕迹,数字的或其他的,往好里说是不完整的,往坏里说是不相关的或虚假的。
虽然在过去 100 年左右的时间里,特别是在过去 20 年里,数据的收集有了急剧的增长,但仍然有许多未被收集,这是历史学家非常清楚的事实。事实上,他们的很多技术都是围绕这个事实发展起来的。
这种数据格局
在许多方面,尽管缺乏高质量的历史数据,历史学家的技艺是发展和运用技术来理解过去的事件。作为一名历史专业的本科生,我记得我被要求确保我的论文主要基于原始资料:“包含直接证据的材料,来自一个目击或参与事件的人的第一手信息”第二手资料“使用第一手资料来分析一个事件或解决一个研究问题”被认为是对认知的解释,往往比我们所认为的更麻烦。我的教授们坚持说,“尽可能去查阅原始资料”。
整个框架表明了在数据解释中发生了多少事情,以及有多少数据本身只是收集到的对事件的解释。这些解释,主要来源,是建立在人类的感知之上的,带有许多偏见和错误。这些然后被嵌入数据本身。要搞清楚这一切,需要历史学家对数据进行额外的解释,在这个过程中创造新的二手资料。
对于一些历史学家来说,这不仅仅是一些数据问题,这是现实的反映。正如迈克尔·j·克莱默雄辩地写道:
- 该数据库似乎以有问题的方式限制了人文分析的微妙性和灵活性。它坚持将杂乱的生活现实、思想、情感、实践、艺术和表达挤压成整齐的行和列。打个比喻来说,我们从多样的建筑、自然地形、甚至世界的熵到一个标准化的系统:从起伏的山丘、创造性的建筑、陌生的人到停车场、没有面孔的办公大楼、以及最可怕的结构形式的公司资本主义的小隔间。任何东西都必须适合,不管它的大小、形状、内部尺寸或奇怪的配置。标准偏差是允许的,但不仅仅是简单的旧偏差,当然也不是偏差。这就是最麻烦的“大数据”时代。
无论数据挑战更多地反映了数据是如何收集的,还是收集数据的世界,历史学家都部署了无数技术来适应历史的数据现实。有些人关注的是数据更丰富的历史,因此更容易接受引人注目的叙述——看这里,(另一个)二战史,盐的历史,咖啡的历史,历史的历史。其他人关注的是数据贫乏或研究不足的历史,几乎任何数据或叙述都被视为对我们理解这一主题的补充。然后还有历史人物传记。虽然尼亚尔·费格森可能是正确的,“个人的优势在许多方面是历史研究的真正优势”,但在我看来仍然有太多的传记,特别是因为它们经常是关于同一个人的。
作为一名历史专业的本科生,我试图通过专注于思想史来应对这些数据挑战,花时间去理解伟大作品写作的历史背景,包括陀思妥耶夫斯基、加缪、黑格尔和其他人的作品。这样,我就可以根据这些人写的东西来进行研究。在大多数情况下,这方面的争论很少,数据也很容易获得。我只是需要阅读他们的作品。然后,我花了一些时间阅读他们的个人经历,他们在哪里出生和生活,他们与谁交往,等等。这些数据主要由基本事实组成,并通过信件或公开演讲加以充实。然后,我会试图对他们生活和写作的更广泛的社会背景有一个基本的了解——正在进行的战争,重大的科学发现,政治环境。最后一步是将所有这些放入一些半连贯的叙述中。
其核心是,我的策略是在给定数据现实的情况下尽我所能。我只能接触到有限的非数字原始数据,没有旅行预算,语言能力有限。当我能得到第一手资料时,它们常常读起来很乏味,或者读起来像是被当时的暴徒收买(或威胁)的人的目击证词。
数据结构
转向数据的结构,即使给定人员的书面理解相对准确,从数据的角度来看,主要和次要来源仍然主要是无结构的文本。此外,许多最重要的文本过去和现在都不是数字化的。我还记得在大学时,我花了几周时间在芝加哥的纽伯里图书馆做研究,那里有一个区域存放着手稿、课本、书籍等。你需要特别许可才能看。那时,我把我的研究重点放在了其他地方,因为我不愿意去弄清楚什么样的文本是可用的,以及我如何从受控阅览室到最终论文。
当你可以访问存在的非结构化文本时,不管是不是数字化的,数据都很难处理并从中获得意义。尽管一些历史学家已经开始利用计算语言学和自然语言处理等领域的发展,但这些技术对于复杂语言,尤其是数百年前的复杂语言,以及许多不同语言来说,仍然处于萌芽状态。
不幸的是,大多数历史学家仍然必须依靠 brut force 方法来试图绕过这些数据挑战:他们阅读。像许多其他领域一样,他们也是专业的,这有助于锚定他们所阅读的内容,因为尽管我们尽了最大努力和咖啡,人类并不是真正为部署布鲁斯力量方法而设计的。我们很慢,而且我们实际上不能非常有效地处理信息。
Google Image Search Results for the term “historian”
然而,即使他们广泛阅读并适当地专门化,文档本身的范围也可能非常有限。虽然历史学家可能不会经常说这句话,但我会想到“历史是由胜利者书写的”。这句话暗示着“失败者”的历史从历史记录中被忽略了,或者至少更难找到。虽然这并不总是正确的,而且有无数的例子表明历史是由官僚写的——T4 的《末日审判书》就是一个很好的例子(即使它是由胜利者资助的)——以及失败者写的家书、反面故事等等,但这种想法是,大多数历史都是由经历所述时刻的人们的书面感受提供的。这需要一个作家,而作家在历史上往往被某些群体(特别是受过良好教育的白人男性)过度代表。
即使我们能够识别和利用某个特定时代的所有相关作品,深入挖掘档案和随机来源,以识别在某个特定时间的某个地方写下的所有东西,那么,那么多东西都被遗漏了。历史上绝大多数人类都没有留下文字作品。他们的感知完全消失了。那些写了或者被写了的人,只写了一定的数量和一定的事情。
人类的经验本身只是已经发生的所有事情的一小部分——当然,除非你认为某些事情必须被感知为实际发生了——只产生了极其有限的一组数据。我们所感知和经历的几乎所有东西都没有被收集起来,这在今天依然如此。如果你不相信,让我们快速看一下意大利的经济。
一个例子:意大利经济数据
当然,随着时间的推移,作为数据收集的人类经验的数量已经发生了变化。在过去的 100 年左右的时间里,出现了大量的数据,这些数据可以用于现代历史和未来历史。快速看一下意大利这个历史资料相对丰富的国家,就能很好地说明这种差异的规模。这也说明了即使在今天,实际存在的数据是多么的少。
如果你回到 2000 年前,罗马帝国是欧洲的一股力量,而意大利不是今天的意大利(对不起,意大利),数据故事是暗淡的。尽管罗马建筑状况相对较好,并且仍然分散在欧洲各地,但使用数据来理解像罗马帝国经济这样基本的东西却异常困难。
麻省理工学院(MIT)的经济学教授彼得·特明(Peter Temin)在他关于早期罗马帝国的经济的论文中总结了这一挑战:
- 在探讨这些主题之前,我需要解释为什么所有关于罗马经济的陈述都是从高度不完整的数据中推断出来的。罗马人通过切割大约现代屋顶木瓦大小的木制椭圆形蜡层来记录他们的大部分日常交易。这种媒介极易腐烂,两千年后我们几乎没有这种交易的书面记录。因此,我们依赖于四种证据:出于其他原因保存下来的文学作品中关于经济的随意评论;重要到可以刻在石头上的宣言或指示;考古证据;和埃及的纸莎草纸,它们在那片土地的干燥气候中经久耐用。信息很多,但几乎没有经济学家所说的数据。
将这与假设的未来“早期欧盟时期的意大利经济”相比:在这种情况下,历史学家将拥有几乎无限的数据集来工作。例如,在撰写本文时,欧盟统计局(Eurostat)目前在网上提供超过 4600 个欧洲社会数据集。它甚至提供信息图表,非技术用户可以很容易地生成意大利经济各方面的图表。
像这样的图表:
Italian Gross Debt as a Percentage of GDP. Source: ec.europa.eu/eurostat/ca…
在意大利债务数据和 GDP 数据的分层中,我们可以看到,在过去 10 年中,总债务占 GDP 的百分比已经上升,这意味着意大利作为一个国家负债越来越多。据一位未透露姓名的欧盟官员称,这一债务,加上最近提出的近期预算优先事项,意味着“义大利,以及欧元区,正在梦游进入下一场危机”。这种当前债务/未来预算是在 2018 年意大利大选中发生的,反建制的五星运动和右翼联盟党是大赢家。
这只是我通过几次搜索找到的一些基本的、容易获取的数据。对于一个真正的未来历史学家来说,是这样的。很多。数据。
然而,想起我的历史教授们,我必须问,这些资料中有多少可以被恰当地视为原始资料:有多少是直接证据,有多少是二手资料或摘要?更仔细地看一下我上面提到的数据,很多数据实际上更好地描述为二手来源信息,而不是一手来源数据。
例如,GDP——一个经济体中每年生产的所有商品和服务的估计总价值——只不过是试图量化经济学家在大约一百年前提出的一个想法,以帮助推动政府在税收和战争支出等问题上的决策。通常有三种计算方法(理论上等价):把每年花掉的钱加起来,把每年赚到的钱加起来,或者把每年增加的价值加起来。“它对于推动政府政策是有用的,但它不是对一个事物的事实衡量。似乎是为了强调这一点,欧盟统计局提供的年度 GDP 总量包括一份近6000 字的元数据参考文件,供任何希望更好地了解总量是如何产生的人使用。从我以前的历史课程的角度来看,GDP 看起来更像是一个二手来源。
如果我们试图深入研究聚集的主要来源,我们会发现我们倾向于深入的最低层次是行业或区域聚集。为了获得原始数据,我们必须一直追踪到实际交易——个人和组织一年中每天花费的钱的总和。也许有一天银行会披露这种个人信息,但是,我不确定。我们未来的历史学家可能会发现,要获得这些数据就像特明教授要获得罗马时代的书面交易记录一样困难。
为了便于讨论,让我们假设未来的历史学家将能够获得个人层面的交易记录,或者类似的东西。这在理论上应该允许我们发展个人 GDP。然而,如果我看看我自己的消费模式,它是直接支付、提取现金(谁知道钱去了哪里)、信用卡支付等等的混合。我的一些支出是代表我的妻子或女儿,或者一个朋友。
如果我在一家现金密集型企业工作,或者参与非正规经济,用服务换取商品,比如换工如何照看孩子来换取住宿,会怎么样?或者,如果我想隐瞒我的支出,或者利用企业作为金钱进出的幌子,该怎么办?又或许,知道家乡就业机会少,一年有一部分时间在国外工作怎么办?
即使这些因素中的几个因素存在,许多个人层面的数据也将无法收集,从而遗漏了重要的支出水平。此外,收集到的数据可能会误导人,甚至故意作假。回到意大利,所有这些因素都存在,甚至更多。
因此,尽管未来的历史学家可能会比现在的历史学家更多地讲述欧盟早期的意大利经济,但并不清楚这是否会带来更深的理解。在许多方面,许多最相关的人类经验仍然没有作为数据收集起来,许多所谓的数据从核心经验中抽象出来,以至于很难知道它是如何映射到人类经验的。据报道,一名纽卡斯尔妇女回应关于如果脱欧赢得 2016 年英国退出欧盟公投,GDP 可能下降的可怕警告,“那是你们该死的 GDP,不是我们的。”
图像数据扩充
Do you think this monkey could do a similar job of recognizing his own image from portrait frames such as in the mirror, or from the right-turn angle we are viewing the monkey in?
提高深度学习模型性能的最佳方法之一是向训练集添加更多数据。除了从野外收集更多代表区分任务的实例之外,我们还想开发一套方法来增强我们已经拥有的数据。有许多方法可以扩充现有的数据集并生成更健壮的模型。在图像域中,这样做是为了利用卷积神经网络的全部能力,卷积神经网络能够捕捉平移不变性。这种平移不变性首先使图像识别成为一项如此困难的任务。您希望数据集代表视觉任务感兴趣的许多不同位置、角度、光照和各种失真。
例如,如果训练集中的每幅图像都完全位于帧的中心,当图像相对于背景稍微向右移动时,传统的前馈模型就会出现混乱。如果每张猫的照片都是肖像照,那么当猫的脸转向右边时,模特就认不出它了。
为了提高模型概括和正确标记有某种失真的图像的能力,我们对数据集应用了几种翻译。这可以通过多种方式实现,在本文中,我们将主要关注水平和垂直翻转、平移、颜色失真和添加随机噪声。
水平和垂直不变性的关联性非常直观。
上面的镜像图像都带有我们希望图像分类器学习的猫的相同特征。添加这些左/右翻转的图像将增加图像分类模型的鲁棒性。特别是当涉及到猫的视角未知的任务时,(想象一个模型被放在一个视频监控摄像机内,在一个区域内数流浪猫)。
此外,我们可能希望向数据集中的图像添加平移。
Centered image vs. Left-Aligned Image
在上面的例子中,我们看到了一个完全居中的图像和一个左对齐的图像。在我们的图像上做这些变换将迫使模型聚焦于‘3’的曲线和特征,而不是与帧中的位置相关的一些隐含特征。
除了这些大量改变二维像素空间中的值的平移之外,我们可以向图像添加随机噪声。这可能有助于对抗色彩空间失真,如照明。
Add noise to image
noise = np.random.random((IMG_SIZE, IMG_SIZE), np.uint8)Matrix addition.. add noise to the image
image += noise
这些简单的图像变换将产生更健壮的模型,该模型学习更好的特征以在图像之间进行区分。这些技术对于提高模型的泛化能力以及使用少量数据进行学习非常有用。一般来说,过拟合是机器学习模型的主要问题之一。这些转换对于克服过度拟合非常有效,但是,如果底层数据集已经不能代表样本空间,它们就不起作用。
希望这些变换能提高你的图像识别模型,感谢阅读!
CShorten
Connor Shorten 是佛罗里达大西洋大学计算机科学专业的学生。对软件经济学、深度学习和软件工程感兴趣。
数据扩充实验
试验简单的数据扩充参数以获得最佳结果
这是我之前关于数据扩充的文章的后续:使用 Fastai 的 数据扩充。不变性是卷积神经网络对对象进行分类的能力,即使它们被放置在不同的方向上。 数据扩充是一种创建不同方向的新“数据”的方式 。这样做的好处有两方面,第一是能够从有限的数据中产生“更多的数据”,第二是防止过度拟合。
处理有限的数据有其自身的挑战,只有当增强技术增强当前数据集时,使用数据增强才能产生积极的结果,例如,训练网络以“学习”颠倒方向的地标有任何价值吗?
然而,如果您的数据集由处方药的图像组成,那么有多个方向是有意义的,因为这些图像理论上可以在任何方向。
可能有许多变化会影响结果,例如数据集的大小、扩增技术、批量大小、图像大小和训练参数等等。本文的目的是展示数据扩充对整体准确性的影响。以下结果基于以下假设:
- 列车组有 1040 幅图像,测试组有 208 幅图像。
- 实验是使用学习机器学习的优秀资源 Fastai 进行的。你可以在这里找到更多信息。
- 训练是用 Leslie Smith 的一个循环法完成的,这在这篇 论文 以及这篇优秀的 文章 中有所解释。我以高学习率,低周期长度训练,在最大动量为 0.95,最小动量为 0.85,重量衰减为 1e-5 的情况下,将 5%的周期用于最后的退火。我们的目标是在最短的时间内获得最佳结果,这样就可以用不同的技术进行大量的实验(下面的结果并没有显示所有的结果)。
- 总共有 82 种不同的标签,从描述形状、颜色、表面标记、强度;例如,一个胶囊可以有以下标签[胶囊]、[蓝色]、[TEVA]、[多色]、[白色]、[胶囊形状]、[25 毫克]等。
- 在网络看不到的 10 幅图像上测试每种数据增强技术的预测,并计算准确度 和 误差率。这是通过检查正确分类标签的数量和错误分类标签的数量来完成的。 大多数论文关注的是准确性,但调查错误率或生成的错误标签数量也同样重要 。
- 结果分为 1) N:预测的正确标签总数, 2) 准确度:(N/82)*100 其中 82 是标签总数, 3) E:预测的错误标签总数, 4) 误差:(E/N)*100
结果如何?
记住,这个项目的目标是在最短的时间内找到最高的精确度和最低的错误数量(每 10 个时期的平均训练时间约为 3 分钟)我们可以看到,通过使用各种数据扩充技术加上 Leslie Smith 的单周期方法,我们可以很好地了解哪些数据扩充技术最适合这个数据集。
结果汇总显示**【RandomZoomRotate】选择正确的标签最多,而【Padding(50)】选择错误的标签最少。反之亦然【Cutout】正确选择的标签数量最少,而【random lighting+Dihedral】**错误选择的数字数量最多。
如果我们将具有最高数量的准确标签**【RandomZoomRotate】的增强与具有最低数量的不准确标签【填充(50)】**的增强相结合,会发生什么?
使用 RandomRotateZoom + AddPadding 的组合:
aug_tfms = [RandomRotateZoom(deg=45, zoom=2, stretch=1)] + [AddPadding(pad=50, mode=cv2.BORDER_CONSTANT)][AddPadding(pad=50, mode=cv2.BORDER_CONSTANT)]
**增强看起来像什么:**随机旋转和填充的组合
精确标签: 60
准确率: 70%
标签不准确: 6
误差: 10%
查看结果:
以下是研究结果的总结:
使用随机旋转:
aug_tfms = [Random Rotate(57)]
**增强后的样子:**视觉上,图像随机旋转了 57°角。
精确标签: 55
准确率: 67%
标签不准确: 4
误差: 7%
使用二面角:
aug_tfms = [Dihedral()]
**增强看起来像什么:**将图像随机旋转 90 度和/或反射(翻转)。
精确标签: 51
准确率: 62%
标签不准确: 9
误差: 18%
使用随机照明:
aug_tfms = [RandomLighting(b=0.25,c=0.15)]
**增强看起来是什么样子:**使用 2 个参数 b =平衡和 c =对比度来调整随机画面照明。
准确的标签: 57
准确率: 70%
标签不准确: 12
误差: 21%
使用随机照明和随机二面角的组合:
aug_tfms = [RandomLighting(b=0.25,c=0.15)] + [RandomDihedral()]
**增强看起来像什么:**随机照明和随机二面角的组合
精确标签: 52
准确率: 63%
标签不准确: 13
误差: 25%
结合使用 RandomDihedral 和 RandomRotate:
aug_tfms = [RandomDihedral()] + [RandomRotate(27)]
**增强看起来像什么:**随机二面角和随机旋转 27 度角的组合
精确标签: 56
准确率: 68%
标签不准确: 13
误差: 23%
使用 RandomZoomRotate:
aug_tfms = [RandomRotateZoom(deg=45, zoom=2, stretch=1)]
**增强看起来像什么:**接受 3 个参数 deg =最大旋转角度, zoom =最大缩放比例, stretch =最大拉伸比例
准确的标签: 62
准确率: 76%
标签不准确: 8
误差: 13%
使用填充:
aug_tfms = [AddPadding(pad=50, mode=cv2.BORDER_CONSTANT)]
增强看起来像什么:接受 2 个参数= 填充 =顶部、底部、左侧和右侧的填充大小和模式= cv2 填充模式的类型(常量、反射、换行、
复制)。
精确标签: 54
准确率: 66%
标签不准确: 2
误差: 4%
使用剪切块(椒盐效果):
aug_tfms = [Cutout(n_holes=200, length=7.5, tfm_y=TfmType.NO)]
**增强看起来像什么:**接受两个参数 n_holes 和 length ,它在一幅图像中的任意位置切出 n_holes 个大小长度的正方形孔。这些孔可以重叠。
精确标签: 41
准确率: 50%
标签不准确: 9
误差: 22%
总结思路:
[RandomRotateZoom]和[AddPadding]的组合产生了最有利的结果;70%的准确率和 10%的误差,只需要 10 次训练。在 20 个时期,准确度跃升至 82%,误差降至 6%。
毫无疑问,数据扩充有助于提高准确性,在减少误差方面同样重要。结果表明,并不是所有的增强都会产生有利的结果,因此最初尝试不同的数据增强有助于缩小哪种增强技术最适合您的数据集。
为什么 RandomZoomRotate 产生最准确标签的可能假设
提高分类精度需要用一个对象的所有自然变化的许多实例来训练模型。自然变化的三个主要来源是位置、视点和对象的大小[ 1 ]。
为了表现图像的所有视觉细节,它应该具有足够高的分辨率来容纳细节的表现。
RandomZoomRotate 允许放大以 2 的比例随机放大,以 1 的比例拉伸,并以 45 度的角度旋转,从而产生不同的变化。这允许模型从不同的图像视角学习,从而产生更准确的标签。
如果你有兴趣阅读更多关于人工智能和医疗保健的文章,这里是我的其他文章。感谢阅读!
有 5 个步骤来避免过度拟合;获取更多数据、数据扩充、使用通用架构…
becominghuman.ai](becominghuman.ai/data-augmen…) [## 3 行代码!破译 Fast.ai
在我看来,上面列出的三行代码彻底改变了我对如何获得最新技术的理解…
becominghuman.ai](becominghuman.ai/3-lines-of-…) [## 不是典型的健康 IT 公司
“如果你总是做你一直做的事情,你就会一直得到你一直得到的东西。”—亨利·福特
becominghuman.ai](becominghuman.ai/not-your-ty…)
文本数据的数据扩充:更快地获得更多数据
简介
所有大多数关于使用监督学习算法进行文本分类的教程都是从预先标记的数据开始的。很少提到的是如何处理情感分析/文本分类中不那么迷人但非常关键的部分,即收集文本的标记。它没有那么迷人,因为要训练一个受监督的模型,你需要向它展示带标签的文本。你如何或从哪里得到标签数据?获得标记数据的一个选择是通过手动阅读每个文本来注释您需要的所有数据,并将其分类为负面或正面。另一种选择是将标签外包给自由职业者或致力于数据标签的公司。这两种选择在时间和金钱上都是昂贵的。在本文中,我们将研究如何在内部使用数据扩充的概念来加速标注任务。对文本数据使用数据增强的灵感来自埃米利奥·拉皮耶洛的博客文章。
数据增强的定义
数据扩充是一种通常用于为图像分类任务增加图像数据集大小的技术。它包括通过变换(旋转、平移或/和缩放,添加一些噪声)数据集中的图像来创建新的图像。然而,当应用数据扩充时,文本数据的等效变换是将要扩充成句子的文档/文本的记号化,将这些句子混洗并重新组合它们以生成新的文本。
为了在文本上测试数据扩充,我们在 OpinRank 数据集上应用了它,但它可以用于任何其他数据,其中:
- 其中一个类别比其他类别更普遍。比如你在主要来源中正面例子的比例是 0.8,负面例子的比例是 0.2,换句话说,比负面更容易得到正面的评论。我使用 main source 来引用数据存储文件,如。csv,。txt,数据库等。
- 而且,算法要分类的评论或文本通常足够长,比如说大约 10 个句子,如下所示:
“Clean hotel with certain charm. Good location and value. A mid-sized modern hotel with facade that’s been themed after bamboos, Kapok is within walkable (~15 min) distance from Subway line 1 Tiananmen East station, Wangfujing station, and line 5 Dengshikou station. Situated near Donhuamen (East gate) of the Forbidden Palace and Wangfujing, it’s location-wise competitive and can cost a whole lot less than the larger hotels that are even closer to Subway stations.The hotel is built and furnished with certain design elements that separate it from the run-of-the-mill chains; its interior has glass walls that give a sense of space while in corridors, there are sprinklings of mini-gardens, and the glass-walled bathrooms have rather stylish fixtures. All in all they make for an interesting experience, though not always comfortable (bathrooms could’ve been designed with more human ergonomics in mind). Rooms are generally clean, except for some mildew on the silicons at shower space. There are also a couple of convenience stores to each side of the hotel for stocking up on water and snacks (one near the Donghuamen-Nanchizi junction, and one near the Donganmen-Wangfujing junction).In conclusion, we think this hotel offers a very competitive combination of good location, clean accommodation, nearby nightlife, and attractive price. We do recommend this hotel. “
How much data required before applying Augmentation?
The main purpose of using Data Augmentation for text data in this article,as the title states,is to obtain more data faster. So the way we set the foundation for Data Augmentation on text data is by first manually labeling at least 1000 examples of the frequent occurring class and a few hundreds of the lesser common classes. Next, by reading each of labelled text we use NLTK sent_tokenize and Python’s shuffle method from the random module to generate the new texts. 10 different reviews were created from each old review. The difference in the generated texts is based on the changed position of the sentences. As Emilio Lapiello stated in his post, shuffling works as long as the context of the text is maintained. With sentence tokenization,the sentiment conveyed in the original text is still maintained. It would be lost if reviews were tokenized into words and then shuffled. Actually, although the meaning of a text may be lost due to words shuffling, it would not be an issue because feature extraction does consider order of words in a text.
Wouldn’t just tokenizing a text into sentences and then shuffling lead to over-fitting? You may ask. That’s possible to some extend. Over-fitting can occur when there is a high variance in the sentiment vocabulary used in different reviews. The two reasons why over-fitting is less likely to occur as a result of augmentation used are:
- 根据从用于增强的 202 个负面情绪示例中观察到的情况,词汇,或者更确切地说是同义词,似乎并没有从如下短语转移太多:
- 糟糕的服务
- 我们不推荐这家酒店
- 肮脏的房间,
- 令人不快的/无用的员工等
看不见的数据很可能与算法训练的数据相似,因此模型应该能够识别它,从而正确地对它进行分类。
使用 OpenRink 数据,我们人工标记了 2004 条正面评论和 202 条负面评论。
下表描述了在对原始数据应用数据扩充之前和之后,分别对 14 个和 6 个正面和负面评论的样本外数据的模型性能。
Metric used: F Score
你可以在这里找到文章使用的代码。
表中的第二列显示,我们显然需要更多的数据来提高性能(尤其是负面评价)。为了避免手动标记更多的数据,我们在负面评论上应用了增强,并将它们增加到 2051。
虽然应用数据增强后的分类准确率仍在 90%以下,但已大幅提升。手动标注更多的评论,以添加到 2004 年和 208 年,然后应用增强应该会增加准确性。
注意:
- TfidfVectorizer 特征提取器比 CountVectorizer 具有更高的精度
- 确保从一个评论生成的评论是不同的(句子在不同的位置),以避免重复..
结论
虽然数据扩充通常用于图像数据,但它也可用于文本数据,以更快地获得更多标记数据。
参考文献:
数据清理 101
早在 12 月份,我就宣布我将离开劳联-产联,去参加大会学习。我的领导要求我做几件事:我写的几个脚本的文档,创建一个包含我所有重要文件的文件夹,将管理员凭据转移给其他员工,等等。我唯一不能给他们的是如何有效清理数据的指南。
在我的上一份工作中,数据清理是一项非常重要的技能,因为我们会从各种政府机构和客户 IT 商店获取数据。我总是愿意花更多的时间来确保数据是干净的,而不是与客户进行困难的(但在使用建模的大数据环境中是不可避免的)对话,以了解为什么某些记录会丢失。
我给我的前雇主这个指南的困难是你的方法取决于你拥有的数据和你的最终目标。尽管困难重重,但这是我对如何清理数据的指导方针的最好尝试。
你现在看到的有意义吗?
看一下数据。如果这是一个大型数据集,看一看前 20 行、后 20 行和一个 20 行随机样本。下面是你应该问自己的问题,用项目符号表示。相应的示例用双星号**表示。
- 我看到的有意义吗?
- 数据与列标签匹配吗?
**姓名栏中是否有姓名,地址栏中是否有地址,电话号码栏中是否有电话号码?还是各列有不同的数据?
- 数据是否遵守其领域的适当规则?
**一个名字中的字符是只有字母(Brendan)还是有数字在里面(B4rendan)?
**电话号码的数字部分是 10 位数字(5558675309)还是不是(675309)?
- 计算数字数据的汇总统计数据。它们有意义吗?
**如果你处理的是经过的时间数据,最小值是负数(- 10 秒)?
**如果你在处理蓝领工人的年度工资数据,最大值(100 万美元)是否有些奇怪?
- 看看有多少值是 nulls?空值的数量可以接受吗?哪里有空值,有什么模式吗?
- 有重复的吗,可以吗?
如果您有足够的信息,请更正数值
一旦你对数据的问题进行了评估,就要考虑你想如何修正它。一些修正可能是显而易见的。如果 name 列的值是 B4rendan,则该值很可能是 Brendan。
然而,有些修正可能并不明显。假设你有一个超过 50 万人的数据集,其中一个人的名字是梅尔特。你可能会认为这是一个错别字,实际上应该说伯特。如果您事先知道这是一个错误(即您知道记录属于谁),您可以进行更改。但是,除非你对自己的假设有足够的信心,否则你可能不应该修改,否则你可能会造成一个错别字,而不是纠正一个。
试着看看数据问题中是否有逻辑,并对其进行更正。比方说,如果您的系统只接受仅包含数字字符的电话号码,但您的数据集包含格式为 so (555)867-5309 的电话号码,您可以使用 Excel/Python 对所有括号和破折号进行查找和替换。
如果可以,使用相同的逻辑为空数值填充数据。但是,如果没有条件逻辑,您可以通过其他方式填写数据。一种常见的方法是使用列的平均值或中值来填充空值,这很容易,但可能会影响该列中数据的分布。还有更复杂但在统计学上有效的方法来填充数据,比如老鼠。您还应该考虑创建一个元数据列,指示哪些值是估算的,哪些值是有机的。不管使用何种统计方法,如果某一列有大量缺失数据,最好在分析中放弃使用它。
使用有意义的工具
思考实现目标所需的工具可以节省你重复这个过程的时间。每种工具都有利弊,下面是我的经验法则:
何时可以使用 Excel:
- 你只有不到一百万条记录
- 你需要轻松快捷地完成这项工作
- 清理数据有一个逻辑模式,使用 Excel 函数清理很容易
- 清理数据的逻辑模式很难定义,您需要手动清理数据
当您可能使用 Python 或其他脚本语言时:
- 你需要记录你的过程
- 你打算重复做这项工作
- 清理数据有一个逻辑模式,但是很难用 Excel 函数实现
这也取决于你更喜欢哪种工具。当我开始学习编程时,当我需要清理数据时,我非常依赖 Excel。当我开始处理更大的数据集并且必须将我的过程常规化时,我转向了 Python。
与源头沟通
有一次,当我度假回来时,我的同事们对来自马里兰州选举委员会的一个数据集有疑问。他们需要数据集中每条记录的县,但州政府只给了我们每个县的代码,而且他们与 FIPS 人口普查局的代码不匹配。所以我打电话给产生该数据集的政府机构,结果发现代码是按字母顺序排列的县。阿勒格尼是 01,安妮·阿伦德尔是 02,巴尔的摩市(独立城市)是 03,以此类推。
不要害怕拿起电话或发电子邮件给数据的来源。如果您是数据源的客户,尤其如此,因为您有权获得清晰的信息。从长远来看,这种交流可以减少很多心痛。
这是我清理数据的方法,但绝对不是唯一的方法。我鼓励任何人在评论区张贴他们清理数据的技巧和诀窍。
用 Python 和 Pandas 清理数据:检测缺失值
数据清理 可能是一项繁琐的任务。
这是一个新项目的开始,你很高兴应用一些机器学习模型。
你看了一下数据,很快意识到这是一个绝对混乱的局面。
根据 IBM Data Analytics的数据分析,你可以预计花费高达 80%的时间清理数据。
在这篇文章中,我们将使用 Python 的 Pandas 库完成许多不同的数据清理任务。具体来说,我们将关注可能是最大的数据清理任务,缺失值。
看完这篇帖子你将能够更多 快速清理数据 。我们都希望花更少的时间清理数据,花更多的时间探索和建模。
缺失值的来源
在深入研究代码之前,理解缺失数据的来源很重要。以下是数据丢失的一些典型原因:
- 用户忘记填写字段。
- 从旧数据库手动传输时数据丢失。
- 有一个编程错误。
- 用户选择不填写与他们如何使用或解释结果的信念相关的字段。
如你所见,其中一些来源只是简单的随机错误。其他时候,数据丢失可能有更深层次的原因。
从统计学的角度来理解这些不同类型的缺失数据是很重要的。缺失数据的类型将影响您处理缺失值的方式。
今天我们将学习如何检测缺失值,并做一些基本的插补。关于处理缺失数据的详细统计方法,请查看数据科学家 Matt Brems 的这些精彩幻灯片。
请记住,使用中间值或平均值进行估算通常不是一个好主意,因此请务必查看 Matt 的幻灯片,了解正确的方法。
入门指南
在开始清理数据集之前,最好先对数据有一个大致的了解。之后,您可以制定一个计划来清理数据。
我喜欢先问以下问题:
- 有什么特点?
- 期望的类型是什么(int,float,string,boolean)?
- 是否存在明显缺失的数据(熊猫可以检测到的数值)?
- 有没有其他类型的缺失数据不那么明显(用熊猫不容易检测出来)?
为了说明我的意思,让我们从这个例子开始。
我们将要处理的数据是一个非常小的房地产数据集。前往我们的 github 页面获取一份 csv 文件,这样您就可以一起编码了。
让我们快速浏览一下数据:
这是一个比您通常使用的数据集小得多的数据集。尽管它是一个小数据集,但它突出了许多您将会遇到的真实世界的情况。
快速感受数据的一个好方法是查看前几行。在熊猫身上,你可以这样做:
# Importing libraries
import pandas as pd
import numpy as np
# Read csv file into a pandas dataframe
df = pd.read_csv("property data.csv")
# Take a look at the first few rows
print df.head()Out:
ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS
0 104.0 PUTNAM Y 3.0
1 197.0 LEXINGTON N 3.0
2 NaN LEXINGTON N 3.0
3 201.0 BERKELEY NaN 1.0
4 203.0 BERKELEY Y 3.0
我知道我说过我们将与熊猫合作,但你可以看到我也进口了 Numpy。稍后我们将使用它来重命名一些丢失的值,所以我们最好现在就导入它。
导入库后,我们将 csv 文件读入 Pandas 数据帧。你可以把数据框想象成一个电子表格。
使用.head()方法,我们可以很容易地看到前几行。
现在可以回答我原来的问题了,**我的特点是什么?**很容易从列名中推断出以下特性:
ST_NUM:街道号ST_NAME:街道名称OWN_OCCUPIED:住宅主人有人吗NUM_BEDROOMS:卧室数量
我们也可以回答,预期类型有哪些?
ST_NUM: float 或 int…某种数字类型ST_NAME:字符串OWN_OCCUPIED:字符串… Y(“是”)或 N(“否”)NUM_BEDROOMS: float 或 int,一种数值类型
为了回答接下来的两个问题,我们需要开始得到更多深度宽度的熊猫。让我们开始看看如何检测缺失值的例子
标准缺失值
那么我说的“标准缺失值”是什么意思呢?这些都是熊猫可以察觉到的缺失值。
回到我们的原始数据集,让我们看看“街道号”列。
第三行有一个空单元格。在第七行有一个“NA”值。
显然,这两个都是缺失的值。让我们看看熊猫如何处理这些。
# Looking at the ST_NUM column
print df['ST_NUM']
print df['ST_NUM'].isnull()Out:
0 104.0
1 197.0
2 NaN
3 201.0
4 203.0
5 207.0
6 NaN
7 213.0
8 215.0
Out:
0 False
1 False
2 True
3 False
4 False
5 False
6 True
7 False
8 False
看一看这一栏,我们可以看到熊猫在空白处填上了" NA"。使用isnull()方法,我们可以确认缺失值和“NA”都被识别为缺失值。两个布尔响应都是True。
这是一个简单的例子,但突出了重要的一点。熊猫会将空单元格和“NA”类型识别为缺失值。在下一节,我们将看看一些熊猫不认识的种类。
非标准缺失值
有时可能会有不同格式的缺失值。
让我们看看“卧室数量”一栏,看看我的意思。
在这一列中,有四个值缺失。
- 不适用的
- 钠
- —
- 钠
从上一节中,我们知道熊猫会将“NA”识别为缺失值,但是其他值呢?让我们来看看。
# Looking at the NUM_BEDROOMS column
print df['NUM_BEDROOMS']
print df['NUM_BEDROOMS'].isnull()Out:
0 3
1 3
2 n/a
3 1
4 3
5 NaN
6 2
7 --
8 na
Out:
0 False
1 False
2 False
3 False
4 False
5 True
6 False
7 False
8 False
就像以前一样,熊猫认为“那”是一个缺失的值。不幸的是,其他类型没有被识别。
如果有多个用户手动输入数据,那么这是一个常见的问题。可能我喜欢用“n/a”而你喜欢用“na”。
检测这些不同格式的一个简单方法是将它们放在一个列表中。然后当我们导入数据时,熊猫会马上认出它们。这里有一个我们如何做到这一点的例子。
# Making a list of missing value types
missing_values = ["n/a", "na", "--"]
df = pd.read_csv("property data.csv", na_values = missing_values)
现在让我们再看看这个专栏,看看会发生什么。
# Looking at the NUM_BEDROOMS column
print df['NUM_BEDROOMS']
print df['NUM_BEDROOMS'].isnull()Out:
0 3.0
1 3.0
2 NaN
3 1.0
4 3.0
5 NaN
6 2.0
7 NaN
8 NaN
Out:
0 False
1 False
2 True
3 False
4 False
5 True
6 False
7 True
8 True
这一次,所有不同的格式都被识别为缺失值。
你可能不能马上抓住所有这些。当您处理数据并看到其他类型的缺失值时,您可以将它们添加到列表中。
为了汇总和转换缺失值,识别这些非标准类型的缺失值非常重要。如果在转换这些非标准类型之前尝试计算缺失值的数量,最终可能会缺失很多缺失值。
在下一节中,我们将研究一种更复杂但非常常见的缺失值类型。
意外缺少值
到目前为止,我们已经看到了标准缺失值和非标准缺失值。如果我们有意想不到的类型呢?
例如,如果我们的特征应该是一个字符串,但是有一个数字类型,那么从技术上讲这也是一个缺失值。
让我们看看“业主占用”一栏,看看我在说什么。
从前面的例子中,我们知道 Pandas 会将第七行中的空单元格检测为缺失值。让我们用一些代码来确认。
# Looking at the OWN_OCCUPIED column
print df['OWN_OCCUPIED']
print df['OWN_OCCUPIED'].isnull()# Looking at the ST_NUM column
Out:
0 Y
1 N
2 N
3 12
4 Y
5 Y
6 NaN
7 Y
8 Y
Out:
0 False
1 False
2 False
3 False
4 False
5 False
6 True
7 False
8 False
在第四排,有数字 12。Owner Occupied 的响应显然应该是一个字符串(Y 或 N),因此该数值类型应该是一个缺失值。
这个例子有点复杂,所以我们需要考虑一个策略来检测这些类型的缺失值。有许多不同的方法,但我打算用这种方法来解决这个问题。
- 遍历 OWN _ OCCUPIED 列
- 尝试将条目转换为整数
- 如果条目可以更改为整数,请输入缺失值
- 如果数字不能是整数,我们知道它是一个字符串,所以继续
让我们先看一下代码,然后我们将详细讨论它。
# Detecting numbers
cnt=0
for row in df['OWN_OCCUPIED']:
try:
int(row)
df.loc[cnt, 'OWN_OCCUPIED']=np.nan
except ValueError:
pass
cnt+=1
在代码中,我们遍历“Owner Occupied”列中的每个条目。为了尝试将条目更改为整数,我们使用了int(row)。
如果该值可以更改为整数,我们使用 Numpy 的np.nan将条目更改为缺失值。
另一方面,如果它不能变成一个整数,我们就pass而继续下去。
你会注意到我用了try和except ValueError。这被称为异常处理,我们用它来处理错误。
如果我们试图将一个条目改变成一个整数,但它不能被改变,那么将返回一个ValueError,代码将停止。为了解决这个问题,我们使用异常处理来识别这些错误,并继续下去。
代码的另一个重要部分是.loc方法。这是就地修改条目的首选 Pandas 方法。关于这方面的更多信息,你可以查看熊猫文档。
既然我们已经学习了检测缺失值的不同方法,我们将看看汇总和替换它们。
汇总缺失值
在我们清理了丢失的值之后,我们可能想要对它们进行总结。例如,我们可能想要查看每个特性的缺失值的总数。
# Total missing values for each feature
print df.isnull().sum()Out:
ST_NUM 2
ST_NAME 0
OWN_OCCUPIED 2
NUM_BEDROOMS 4
其他时候,我们可能想做一个快速检查,看看我们是否有任何丢失的值。
# Any missing values?
print df.isnull().values.any()Out:
True
我们可能还想得到缺失值的总数。
# Total number of missing values
print df.isnull().sum().sum()Out:
8
现在我们已经总结了缺失值的数量,让我们来看看做一些简单的替换。
取代
通常情况下,您必须考虑如何处理丢失的值。
有时你只是想删除那些行,有时你会替换它们。
正如我前面提到的,这不应该被轻视。我们将回顾一些基本的插补,但对于处理缺失数据的详细统计方法,请查看来自数据科学家 Matt Brems 的这些精彩幻灯片。
也就是说,也许您只想用单个值来填充缺失的值。
# Replace missing values with a number
df['ST_NUM'].fillna(125, inplace=True)
更有可能的是,您可能想要进行基于位置的插补。下面是你应该怎么做。
# Location based replacement
df.loc[2,'ST_NUM'] = 125
替换缺失值的一种非常常见的方法是使用中位数。
# Replace using median
median = df['NUM_BEDROOMS'].median()
df['NUM_BEDROOMS'].fillna(median, inplace=True)
我们已经讨论了一些替换缺失值的简单方法,但是请务必查看 Matt 的幻灯片,以了解正确的技术。
结论
处理杂乱的数据是不可避免的。数据清理只是数据科学项目流程的一部分。
在本文中,我们讨论了一些检测、总结和替换缺失值的方法。
要获得更多关于数据清理的资源,请查阅这些数据科学书籍。
有了这些技术,您将花更少的时间清理数据,花更多的时间探索和建模。