使用 Python 和 Pandas 分析 Stack Overflow 调查

在年度开发者调查的数据集上进行您自己的数据科学探索和分析。
144 位读者喜欢这篇文章。
Munch on open data with Python and Pandas

2019 年 Stack Overflow 调查结果已经发布!数据集相当大;根据描述:

“Stack Overflow 的年度开发者调查是全球最大的、最全面的程序员调查。每年,我们都会进行一项调查,涵盖从开发者最喜欢的技术到他们的工作偏好等所有内容。今年是我们发布年度开发者调查结果的第九年,今年早些时候,近 90,000 名开发者参加了为期 20 分钟的调查。”

StackOverflow 的一些分析引起了我的兴趣,而另一些则没有。我决定挖掘这些数据(这些数据在 开放数据库许可证 (ODbL) 下可用),而不是浏览网站,看看我能学到什么!

我正在使用流行的 Pandas 库,根据该库的关于页面,它是一个“BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。”

几乎每个教程都通过导入 Pandas 并为其分配数据变量来减少使用 Pandas 功能时必须键入的文本量,如下所示:

import pandas as pd

# Create a two-dimensional data-structure named df
df = pd.DataFrame([1,1])

为了公然违反数据科学的每一条规则,我不会将 Pandas 别名为 pd,也不会将我的数据帧别名为 df。 科学通过大胆的想象力向前发展。

配置 Pandas 进行分析

我将使用 iPython 交互式地探索这些数据,您可以在这里了解如何安装 iPython。您可以从命令行使用 python 打开 Python 解释器、启动 Jupyter Notebook使用 JupyterLab,然后继续操作。

我们将首先导入所需的库

In [1]:  import pandas

接下来,将逗号分隔值 (CSV) 结果文件,在 Google Drive 上可用,下载到本地目录。下载并解压缩数据后,利用 Pandas 的原生能力来读取 CSV。

In [2]:  data = pandas.read_csv("survey_results_public.csv")

现在是时候提出关于数据的问题了。

查询受访者人数

第一个有趣的事情是检查调查的受访者人数。 获取该数据的最简单方法是从数据帧的 *shape* 中获取。 第一个元素将是行数或受访者人数,而第二个元素是列数。

In  [3]:  data.shape
Out [3]: (88883, 85)

这令人印象深刻:88,883 个人(表示为行)对问题(表示为列)提供了 85 个回复。

筛选 Pythonista

作为一名 Python 程序员,我想知道我的同行在做什么。 我将筛选出使用过 Python 的人。 确切的方法不是那么直观,但在检查数据源后,我发现 **LanguageWorkedWith** 列可以用来筛选 Python 开发者

In [4]:  pythonistas = data[data.LanguageWorkedWith.str.contains("Python", na=False)]

现在我可以提出 Python 特定的问题,例如:*Pythonista 占回复的百分比是多少?*

我可以使用 **shape** 作为每个数字的原始数量,并使用 f-string 语法格式化我的输出为两位数字

In  [5]:  f"{pythonistas.shape[0] / data.shape[0]:.2}"
Out [5]: '0.41'

哇。 41% 的调查回复者使用 Python。 *那是多少人?*

In  [6]:  pythonistas.Respondent.count()
Out [6]: 36443

开源 Python 开发者

现在,在这 36,443 名使用 Python 的人中,有多少人参与了开源?

有一个 **OpenSourcer** 列包含我正在寻找的数据(不是 **OpenSource**,它回答的是另一个问题)。

In [7]:  open_source = pythonistas['OpenSourcer'].value_counts()

然后,我可以返回变量的值来打印数据

In  [8]:  open_source
Out [8]:
    Never                                                 11310
    Less than once per year                               10374
    Less than once a month but more than once per year     9572
    Once a month or more often                             5187
    Name: OpenSourcer, dtype: int64

这告诉我们关于开源 Python 贡献者的百分比是多少?

In  [9]:  f"{open_source['Once a month or more often'] / pythonistas.shape[0]:.2}"
Out [9]: '0.14'

只有 14% 的 36,443 名 Python 用户以任何常规的频率为开源做出贡献。 这看起来可能是一个很小的百分比。 或者是不是? 在考虑所有编程语言时,这是否高于或低于一般人群?

In [10]: general_opensource = data['OpenSourcer'].value_counts()

因为我问的是一般人群,所以我会查看所有受访者的百分比

In  [11]:  f"{general_opensource['Once a month or more often'] / data.shape[0]:.2}"
Out [11]: '0.12'

Python 开发者似乎比调查受访者的一般人群对开源的贡献略多。

DevOps 和 Python

作为 DevOps 工程师,为其他 Python DevOps 工程师编写书籍,我自然对有多少人感到好奇。

我可以在 **DevType** 列中搜索以找到答案

In [12]:  devops = pythonistas[pythonistas.DevType.str.contains("DevOps specialist", na=False)]

因为我问的是一般人群,所以我会查看所有受访者

In  [13]:  f"{devops.shape[0] / data.shape[0]:.2}"
Out [13]: '0.052'

大约 5% 的受访者使用 Python 并且具有与 DevOps 相关的工作职责。

In  [14]:  devops.Respondent.count()
Out [14]: 4647

那是我的目标市场。 不错!

Python 开发者的经验

我在会议上的大多数演讲(例如,Boring Object Orientation)都是针对中级 Python 工程师的。 我会说那些具有一到五年开发经验的人是中级的,并且我可以将这些约束 **map** 到 **YearsCode** 列

In [15]:  intermediate = pythonistas[pythonistas.YearsCode.isin(set(map(str, range(1, 6))))]

然后我可以计算所有调查回复的百分比

In  [16]:  f"{intermediate.shape[0] / data.shape[0]:.2}"
Out [16]: '0.11'

更好的是,11%。 那意味着

In  [17]:  intermediate.Respondent.count()
Out [17]: 10085

那是很多人。

总结

使用 StackOverflow 报告和一点 Python 可以完成很多出色的研究。 Pandas 允许任何人轻松有效地查询此类数据集。 此分析中没有任何 Python 循环。 令人难以置信的是,我可以使用这些高级库以简单的方式探索数据,而 Python 解释器提供对查询的低级操作,以优化的 C 代码完成,我可以从中受益!

您在 StackOverflow 数据集中发现了什么令人兴奋或有趣的事情吗? 在评论中分享!

接下来阅读什么
Moshe sitting down, head slightly to the side. His t-shirt has Guardians of the Galaxy silhoutes against a background of sound visualization bars.
自 1998 年以来,Moshe 一直参与 Linux 社区,帮助举办 Linux“安装派对”。 自 1999 年以来,他一直在编写 Python 程序,并为核心 Python 解释器做出了贡献。 自这些术语存在之前,Moshe 一直是 DevOps/SRE,非常关心软件可靠性、构建可重现性等。

1 条评论

_"我不会将 Pandas 别名为 pd,也不会将我的数据帧别名为 df。 科学通过大胆的想象力向前发展。"_

天才。 文章的测试也写得很好。 已订阅!

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.