分析、价格建模和预测:西雅图 AirBnB 数据,2016–17
本文为技术和非技术受众详细概述了 AirBnB 的西雅图数据分析 。分析完成后使用 CRISP-DM 流程、数据工程 & 机器学习技术。
图片来自 Pixabay 埃里克·帕拉西奥
商业理解
对于西雅图的所有 AirBnB 用户和主机,我将从以下几个方面分析和回答商业相关问题:
- 价格分析
- 清单计数分析
- 最忙时间分析
- 入住率和点评分析
- 价格预测建模
下面是问题和答案。
数据理解
这里我将对 Kaggle 上 Airbnb 内 提供的数据进行探索性数据分析*,你可以在这里* ( zip 文件),zip 文件包含 3 个 csv 文件: listing.csv 、 calendar.csv 和
listing.csv 概述
使用 熊猫 读取 csv 文件,如下所示:
*#read listing.csv, and its shape
listing_seattle = pd.read_csv(‘listings_seattle.csv’)
print(‘Shape of listing csv is’,listing_seattle.shape)
listing_seattle.sample(5) #display 5 rows at random*
基本检查和高级数据分析
查看数据并进行一些健全性检查,如每列缺失值的百分比,listing _ ids 在整个数据集中是唯一的吗?,查看汇总的数值列等。
- 每列缺失值的百分比
每列缺失值的百分比
从上面的条形图中,我们得到了丢失值最少的重要列。像 牌 和 方 脚 这样的列有超过 95%的数据缺失,因此我们将删除这些列。
****Are the ids unique for each row?*** len(listing_seattle['id'].unique()) == len(listing_seattle)***Description of all numeric features***
listing_seattle.describe()*
Github 查看数字列摘要的依据
上面的 csv 文件中显示了所有数字列的摘要。使用
*df.describe()*
计算重要的数值参数,如计数、平均值、标准差、方差、最大值和分位数范围
calendar.csv 概述
使用pd.read_csv('calendar.csv')
读取“ calendar.csv ”并使用df.head(5)
显示 csv 概览。这将显示数据框中的前 5 行。
calendar.csv 数据的高级分析
让我们看看每列的类型和数据中缺失值的数量:
通过df.dtypes
得到每一列的类型,见下面的实现
每列的数据类型
每列中缺失值的百分比:
每列缺失值的百分比
因此,在价格一栏中只有 33%的男性。这也表明,在全年所有 365 天的列表中,平均只有 33%的列表被占用
检查两个数据集中的列表数量是否相同:
*len(listing_seattle) == len(calendar_seattle)//365
>> True*
因此,我们在两个数据帧中都有相同数量的列表 (属性),并且 calendar.csv 对于每个列表都有 365 个条目。现在我们可以通过listing _ id来 合并两个数据集,以获得一个数据帧用于进一步分析。合并代码:df = pd.merge(calendar_seattle, listing_seattle, on=’listing_id’)
数据准备
理解数据后,需要对其进行整理,以便为建模做好准备。我已经选择了一些商业话题来玩,回答相关的现实问题是下一个任务。为此,清理与所选任务相关的数据非常重要。以下各列是额外的负担(与分析无关),因此 删除 它们:
使用df = df.drop(columns = columns_to_drop)
删除所有此类列。
要永久删除的列的列表
执行下面给出的数据清理步骤(操作在注释中提到):
现在数据已经准备好,可以进行分析了。
对最终数据集的洞察和分析
从这里我回答了一些商业问题。
- 什么是
***minimum***
***maximum***
***average price***
的清单(楼盘)跨市?**
**#find minimum, maximum and average price for listing
min_price = df['price'].min()
>> $10.00
max_price = df['price'].max()
>> $1650.0
mean_price = df['price'].mean()
>> $137.94**
- 数据集中给定的每个清单的
***average price***
是什么?
**#get the average price for each listing
mean_price_for_listing = df.groupby('listing_id').mean()['price']
plt.hist(mean_price_for_listing, bins=20)**
从上面的直方图我们可以断定,
*majority of listings are concentrated around* ***$50-$150***
- 平均每个房源发布的点评数是多少?
**#get the average number of reviews per listing
avg_num_reviews = df.groupby('listing_id').mean()['number_of_reviews']
plt.hist(mean_price_for_listing, bins=30)**
大部分房源都是
***concentrated around 10-180 reviews***
- 登记了多少房源
***per month***
?
**#get number of registered listings, irrespective of available or unavailable for each month
grouped_month = df.groupby(['month'])
num__listing_per_month = [len(grouped_month.get_group(i)['listing_id']) for i in range(1,13)]plt.bar(np.arange(1,13,step=1), num__listing_per_month)**
每月列表数量的条形图表示
可以看到每月注册的列表数量的趋势。可以看出,上市数量在二月、三月、四月、八月和十一月较低,因为这几个月见
*surge in number of visitors*
。
***available***
***not available***
每个月有多少个清单?**
**#get number of available and not available listings per month
num_listing_per_month = df.groupby(['month','available'])['listing_id'].unique()plt.plot(num_listings_available_per_month)**
这说明夏季可用房源数量最少,也就是说夏季是最忙的时候大部分房源都被占了!****
**plt.plot(num_listings_not_available_per_month)**
- 什么是每月
***average price***
?
**#find average price per month
average_price_by_month = df.groupby(['month'])['price'].mean()
plt.plot(average_price_by_month)**
挂牌价格在夏季和冬季(12 月)明显上涨,可能是因为可供预订的房源较少。因此
***summer and winter holidays***
是参观西雅图的***busiest times***
。
- 价格视
***Neighbourhood***
基于邻域的价格变化趋势
可以看出, 的价格因地点 (街区)而异。最高均价在
***Downtown***
处。但是对于每个社区来说,价格在夏天都会上涨,就像我们之前看到的一样。
- 每种可容纳类型有多少个列表?
***#get total number of listings for each accommodates type(number of accommodations)
num_listing_accommodates = [len(df.groupby(['accommodates']).get_group(i)['listing_id']) for i in sorted(df['accommodates'].unique())]plt.bar(sorted(df['accommodates'].unique()), num_listing_accommodates)***
可以看到,
***2 occommodates***
有个最大列表数。****
- 每种型号 的平均价格是多少?
***grouped_accommodate_mean_price = df.groupby(['accommodates'])['price'].mean()
average_price_per_accommodate = [grouped_accommodate_mean_price[i] for i in sorted(df['accommodates'].unique())]plt.bar(sorted(df['accommodates'].unique()), average_price_per_accommodate)***
每种住宿类型的平均价格
可以看出,随着 数量的增加 价格也随之提高。这是相当明显的,越多的数量容纳的财产的价格应该更大。这也暗示了预测价格的
***great influential feature***
。**
- 什么是全年的
***occupancy rate over the time***
?
***plt.plot_date(calendar_seattle['date'].unique(), occupancy_rate, linestyle='solid', marker='None')***
可以观察到占用率 高
***summer and winter***
(过年期间)。这再次证明了夏天和冬天是***vacations in seattle***
的***busiest times***
。**
***reviews.csv***
中随时间增加的评论数是多少?
对于此任务,让我们阅读 reviews.csv 并查看 reviews 数据。
***plt.bar(list(reviews_df['date'].unique()), num_reviews, color=np.random.rand(len(list(reviews_df['date'].unique())),3))***
评论数从 2013 年开始
***exponentially increased***
,2016 年最高。
建模
数据集是干净的。它准备应用 ML 模型进行价格预测。以价格列为因变量。使用一键编码将所有分类特征转换为虚拟变量。下面给出了根据这些数据拟合模型的步骤:
估价
均方误差作为误差分析,以及 R2 平方作为精度矩阵。**
***Random Forest MSE on **train** data: **186.944**, **test**: **211.258**
Random Forest R^2 score on **train: 0.983**, **test: 0.981*****
- 获取特征重要性
上面给出的条形图显示了对价格影响最大的
*top 15 features*
。***Number of bedrooms***
是 最重要的特征 用于预测价格!
结论
这是一个很好的分析练习,最后得出结论
- 所有的商业问题都用适当的数字来回答
- 此外,随机森林回归方程适用于数据,以获得价格,这是作为因变量。
马德里市政办公室针对外国人的 Pandas、Matplotlib 和 follow-Spanish 课程分析
并排条形图、堆积条形图、饼图和折线图
datos.madrid.es 是 Madrid s 数据服务,包含近 500 个数据集,涵盖商业、交通、旅游、文化等广泛话题。目前,越来越多的欧洲城市提供开放的数据门户,允许公司、市民、研究人员和其他公共机构使用这些数据。
在本文中,我们采用了包含 2018 年第一学期在市政办公室参加外国人西班牙语课程的学生信息的数据集。该数据集包括关于学生的信息,如他们参加的课程级别、性别、年龄、国籍、教育水平和行政地位。
数据集(2018-1er semestre)可通过以下链接下载:
马德里移民联盟的门户网站。西班牙语课程中的人物
datos .马德里. es](https://datos.madrid.es/portal/site/egob/menuitem.c05c1f754a33a9fbe4b2e4b284f1a5a0/?vgnextoid=454bdc5cc762b410VgnVCM2000000c205a0aRCRD&vgnextchannel=374512b9ace9f310VgnVCM100000171f5a0aRCRD&vgnextfmt=default)
datos . Madrid . es提供西班牙语的数据集。因此,在开始探索性数据分析之前,我们必须将数据集翻译成英语。下面的文章解释了我们如何通过使用 Googletrans 库来轻松翻译数据集。
** [## 使用 googletrans 库翻译熊猫数据框
Googletrans 是一个使用 Google Translate API 的免费 python 库。在这篇文章中,我们解释了如何使用…
towardsdatascience.com](/translate-a-pandas-data-frame-using-googletrans-library-fb0aa7fca592)
一旦数据帧被转换,我们就准备好开始探索性数据分析。👌
探索性数据分析和数据清理
探索性数据分析包括分析数据集的主要特征,通常采用可视化方法和汇总统计。目标是理解数据,发现模式和异常,并在我们执行进一步评估之前检查假设。
我们通过使用 pandas.read_csv 函数将翻译后的文件加载到 Pandas 数据框中,并使用 pandas 可视化前 5 行。DataFrame.head 方法。
数据集包含 8 列:(1)级别,(2)性别,(3)年龄,(4)行政地位,(5)国籍国家,(6)地理区域,(7)专业类别,和(8)级别研究。
数据类型不合适和缺少值是数据集最常见的问题。通过使用 熊猫,我们可以很容易地分析这两者。DataFrame.info 方法。该方法打印关于数据帧的信息,包括列类型、非空值的数量和内存使用情况。
数据集不包含空值,数据类型是预期的类型。正如我们所看到的,列 age 有一个数据类型 string。这种数据类型是正确的,因为年龄是以范围给出的。
正如我们所观察到的,列名有空格和大写字母。我们修改这些名字,用下划线代替空格,用小写字母代替大写字母,用 熊猫。data frame . rename方法。现在,不仅可以使用方括号,还可以使用点符号来访问列。
我们观察每一列中的独特元素,以发现不一致和重复的条目。
如上所示,对于同一元素(man 和 Man),列 sex 有两个命名。此外,使用 googletrans 翻译数据框后,一些条目以大写字母开头(例如,高中、小学或员工),而其他条目以小写字母开头(例如,学术、未受教育或学生)。
我们可以通过将每个条目的第一个字母转换成大写字母来一次性解决这两个问题,如下所示:
现在,数据帧中的每个条目都以大写字母开头。我们做了这个修改,因为我们不希望未来的可视化包含以大写字母和小写字母开头的标签。此外,我们希望用 man 替换 Man,这样数据帧的 sex 列中只包含两个唯一值:Man 和 Woman。
我们可以观察到列 age 包含条目 65。澄清这是指 65 岁的学生,还是 65 岁以上的学生(对我来说更有意义,因为年龄是以范围给出的)会很有意思。
数据清理完成!!😍现在,我们准备好回答问题,并使用我们的数据得出结论。
回答问题并得出结论
****探索性数据分析和数据清理是让我们对数据集有所了解的步骤,并让数据集准备好使用它轻松得出结论。现在!我们准备使用数据集回答以下问题。
2018 年第一学期,有多少学生在市政府办公室参加了外国人西班牙语课程?****
我们必须计算行数以获得学生数,因为数据框中的每一行都包含一个学生的信息。这可以通过 熊猫轻松实现。data frame . shape属性为:
2018 年第一学期,2274 名学生参加了马德里市政办公室为外国人开设的西班牙语课程。
女生的比例是多少?
为了获得雌性的百分比,我们可以雇佣 熊猫。series . value _ counts函数。该函数返回包含唯一值计数的序列。如果我们想获得频率而不是计数,我们使用参数 normalize=True。
正如我们所观察到的,女性的比例大于男性。我们还可以通过以下方式使用条形图来可视化结果:
每个级别招收多少学生?性别之间有差异吗?地理区域之间有差异吗?
为了获得每个级别的注册学生人数,我们将使用 熊猫。Series . value _ counts的功能和以前一样,但是这一次,我们用 熊猫按字母顺序对返回的系列的索引进行排序。series . sort _ index函数,因为字母顺序匹配的难度越来越高(A1 比 A2 容易)。
A2 DELE(获得西班牙国籍的考试)、B1 会话和识字(学习读写)等特殊课程的学生人数少于常规课程(A1、A2 和 B1)。然而,高级课程(B2)的参与者比其他常规课程少。
为了按级别和性别分析学生人数,我们使用函数 pandas。data frame . group byT15**。**该功能涉及分割对象、应用功能和组合结果的某种组合。我们可以根据在列表中提供名称的两个特征进行分组,如下所示:
我们获得了一个多索引数据框,因为按两列分组将得到两个索引。我们的目标是使用这个包含按级别和性别划分的学生人数的数据框,并使用函数 pandas 创建一个并排条形图。DataFrame.plot
我们选择一列(如年龄),因为所有列都提供相同的信息(计数)。然后,我们用 熊猫。data frame . un stack函数。该函数旋转一层(必须是分层的)索引标签,返回具有新一层列标签的数据帧,其最内层由旋转的索引标签组成。
现在,我们可以使用绘图功能轻松创建并排条形图。每一列都分配有不同的颜色,每一行都沿水平轴嵌套在一个组中。
正如我们所看到的,更多的妇女注册了正规课程(A1、A2 和 B1)。然而,参加 A2 DELE 和扫盲课程的男性人数更多。
为了按级别和地理区域分析学生人数,我们像以前一样创建一个并排的条形图。
在 A1、A2、B1、B1 会话和 B2 课程中,大多数学生都是亚洲人。相反,A2 DELE 和扫盲班有更多来自马格里布和撒哈拉以南非洲的学生。
学生的行政身份是什么?
我们创建了一个条形图,根据管理状态来可视化学生的数量。在这种情况下,我们采用一个水平条形图,用标签显示学生人数。
如上图所示,大部分学生处于不正常的行政状况(763)。略多于 500 名学生拥有居留和工作许可(条款:居留和工作许可);266 名学生拥有居留证(A R:autoriza ción de residencia)。寻求庇护的学生人数达到 91 人。
如果我们希望标签显示百分比而不是学生人数,我们可以按以下方式修改图表:
方法熊猫。Series.round 将序列中的每个值舍入到给定的小数位数(默认为 0)。在这种情况下,我们提供一个标签,四舍五入到两位小数,代表每个管理状态的学生百分比。如上所示,这些标签以粗体显示。我们可以通过在matplotlib . py plot . text函数中包含参数 weight=bold 来轻松实现这一点。
到目前为止,我们只使用了条形图来获得结论,但是我们可以使用其他类型的可视化。其中一个选择是饼图。一个饼状图是一个圆形的图形,它被分成若干片来说明数字比例。在此图表中,切片的弧长与它所代表的数量(如条形图中的高度)成比例。
我们可以用熊猫来制作一个饼图。DataFrame.plot 函数,以如下方式提供参数 kind=‘pie’ :
******auto pct = ’ % 1.1f % % '参数使用 Python 字符串格式显示百分比值。我们使用的另一个参数是 颜色。 该参数决定饼图循环的 matplotlib 颜色参数的顺序。在这种情况下,选择的色彩映射表是 Pastel2。
正如我们所观察到的,条形图和饼图可以传达相同的信息。然而,条形图是可视化的更好选择,因为沿一维(高度)比沿二维(面积)比较对象更容易。
现在!是时候继续用数据回答问题了。如上所示,33.6%的学生处于不正常的行政状况,只有 4%的学生处于庇护状态。让我们试着获得更多关于这两个群体的信息!
处于非正规行政状况的学生来自哪里?他们注册了哪些课程?还有精神病院的学生?
为了评估这两个组,我们必须根据列 administrative_status 的值过滤数据框。我们创建了两个数据框,包含以下信息:(1)处于非正常情况下的学生,(2)处于庇护中的学生。
我们用 熊猫。Series.unique 方法检查过滤是否正确进行。
我们做得对💪 💚!Df _ unregular仅包含处于非正常管理状态的学生的信息,而 df_asylum 包含处于庇护状态的学生的信息。
首先,我们分析非正常学生和庇护学生的国籍。
如上所示,大多数处于非正常状况的亚洲学生是女性;然而,大多数撒哈拉以南非洲学生是男性。没有来自北美和欧洲联盟的非正常或处于庇护状态的学生。此外,在欧盟以外的欧洲避难的学生,和马格里布只有男性。
关于级别,大多数非正常情况下的学生注册参加 A1 和 A2 级别的低级别课程(58.72%),相比之下,寻求庇护的学生注册参加 A1 和 A2 级别的程度较低(38.46%)。参加扫盲班的学生比例几乎相等(大约 10% )。
学生们多大了?是层次之间的差异吗?
为了获得学生的年龄,我们可以使用 熊猫。Series.value_counts 这可以通过 熊猫来实现。series . reindex方法,传递一个带有新标签(索引)的列表作为参数。
可以看出,90%以上的学生年龄在 18-50 岁之间。不清楚 65 岁是指 65 岁以上的学生(这是有意义的,因为年龄是以范围提供的)还是确切的 65 岁。
根据级别,A2 DELE 课程(获得西班牙国籍的考试)主要由 31 至 50 岁的学生参加。在其他级别(A1 除外),18 至 30 岁和 31 至 50 岁学生的比例相当接近(见下图)。**
而现在!我们最后一个问题🍀
学生从哪里来?
为了回答这个问题,我们不打算像以前一样使用条形图,而是使用另一个有趣的可视化工具:cloropletes maps。
choropleth 地图是一个专题地图,根据地图上显示的统计变量(如学生人数)对区域进行着色。这种可视化非常有助于通过使用连续颜色方案(测量值越高,颜色越强)来表示一个区域内测量值的可变性。
为了创建一个 choropleth 地图,叶子需要一个 Geo JSON 文件,包括该地区的地理空间数据。对于世界地图,我们需要一个 Geo JSON 文件来定义世界上所有国家的边界。您可以通过以下链接下载该文件:
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/python-visualization/folium/blob/master/examples/data/world-countries.json)
将文件移动到当前目录后,我们可以使用 json.load() 方法从 json 库中读取 json 对象,如下所示:
如上图所示, json.load() 方法返回一个名为 data 的 python 字典。我们使用内置模块 pprint 以可读性更好的方式打印字典数据。正如我们所看到的,文件 world-countries.json 提供了多边形,定义了世界各国的边界。
我们正在读取并可视化 world-countries.json 文件,以便对数据的结构有所了解。然而,当使用**flour,**创建一个 cloropleth map 时,我们只需提供到 GeoJSON 文件的路径,这意味着不需要像上面那样使用 json 模块读取文件。
现在!我们准备用叶子了!💪 🌎
leav是一个 python 库,可以在传单地图上实现迭代可视化。在生成克洛普勒斯图之前,我们必须创建一个数据框,包含来自每个国家的学生人数,如下所示:
此外,要成功绑定数据框和 json 文件,数据框中的国家名称必须与 json 文件中的国家名称完全匹配。因此,我们必须分析数据框中的哪些名称没有包含在 json 文件中,并对其进行相应的修改。
如上所示,json 文件中没有下列名称:(1)尼泊尔联邦民主共和国,(2)阿拉伯叙利亚共和国,
(3)大不列颠及北爱尔兰联合王国,(4)撒哈拉,(5)摩尔多瓦共和国,(6)佛得角,(7)巴勒斯坦,(8)新加坡和(9)马耳他。现在,我们修改数据框,用 json 文件中可用的名称替换这些名称。
关于之前的修改,必须考虑以下方面:
- json 文件中没有马耳他和佛得角;因此,它们的名称不会被修改,也不会绘制在克洛普勒斯图上。
- 新加坡被马来西亚取代,因为在 json 文件中,新加坡边界包含在马来西亚多边形中。这是不准确的,因为他们是不同的国家!
- 撒哈拉被西撒哈拉取代。这也是不准确的,因为撒哈拉的面积比西撒哈拉大。
- 该修改适用于以下情况:尼泊尔、叙利亚、英国、摩尔多瓦和西岸。
现在!我们已经准备好创建克洛普勒斯图了!🙌 😄
首先,我们创建一个叶子地图对象,以[0,0]为中心(位置参数允许将地图居中在一个特定的位置)。我们还提供了一个初始缩放级别为 2 的来将地图缩放到中心。然后,我们使用来显示一个云图。cloropleth()** 法。此函数绑定包含在 Pandas 数据框和 GeoJSON 几何图形中的数据。**
要生成地图,将使用以下参数:
- geo _ data→JSON 文件的名称。该文件必须位于工作目录中。
- 数据→ 包含数据的数据帧的名称。
- 列→ 用于生成克洛普勒斯图的列。
- key _ on→JSON 文件中包含国家名称的 Key。
- 填充颜色→ 可视化中使用的颜色方案。
正如我们所看到的,图例显示了一个负边界(-3)。这个问题可以通过用 numpy.linspace()函数定义我们自己的边界来解决,如下所示:
学生主要来自菲律宾和摩洛哥,这是有道理的,因为这两个国家都是西班牙的殖民地,目前西班牙语不是该国的官方语言。我们也可以观察到,有相当数量的学生来自中国、尼泊尔和巴西。此外,没有来自澳大利亚、北欧国家和大多数拉丁美洲国家的学生。
我们不能用柱状图来直观地显示学生的数量,因为学生来自 74 个不同的国家。但是,我们可以显示前十个国家,如下所示:
最后,我们将绘制一张欧洲的克洛普勒斯地图🌐
首先,我们创建一个数据框,包含来自每个欧洲国家的学生人数,如下所示:
然后,我们分析数据框中有哪些名字是 europe.geojson 文件中没有的,并进行相应的修改。
我们可以通过以下链接下载 europe.geojson 文件:
permalink dissolve GitHub 是 4000 多万开发人员的家园,他们一起工作来托管和审查代码,管理…
github.com](https://github.com/leakyMirror/map-of-europe/blob/master/GeoJSON/europe.geojson)
最后,我们创建一个树叶贴图对象,以【53.0,9.0】为中心,显示一个树叶贴图和**。cloropleth()** 方法和我们前面做的一样。
💪我们拿到了。
据我们观察,学生主要来自乌克兰、俄罗斯、罗马尼亚、格鲁吉亚和保加利亚。
根据性别或课程水平绘制克洛普勒斯图也将是有趣的。如你所见,分析可以是无止境的!我鼓励你生成更多的情节,利用这个公开的数据,尝试提取更多的结论!不过现在有些推荐:)
推荐
如果你想学习如何用 Python 创建有趣的可视化效果,请学习这门课程!它是完全免费的,你可以从基础的可视化学到高级的可视化。💪
编辑描述
courses.cognitiveclass.ai](https://courses.cognitiveclass.ai/courses/course-v1:CognitiveClass+DV0101EN+v1/info)
此外,您还可以阅读我以前的一些使用开放数据执行的文章😊 😉
[## 使用 Pandas、Matplotlib 和 lyum 分析巴塞罗那的车祸
巴塞罗那开放数据是巴塞罗那的数据服务,包含约 400 个数据集,涵盖广泛的主题,如…
towardsdatascience.com](/analysis-of-car-accidents-in-barcelona-using-pandas-matplotlib-and-folium-73384240106b) [## 啤酒节:使用 Pandas、Matplotlib 和 Plotly 进行快速分析
2019 啤酒节已经开始了!慕尼黑啤酒节是世界上最大的啤酒节,自…年起每年在慕尼黑举行。
towardsdatascience.com](/oktoberfest-quick-analysis-using-pandas-matplotlib-and-plotly-79778367a4c)
感谢阅读!!!🍀🍀🍀🍀🍀🍀🍀
阿曼达******
理解线性回归的解析和几何方法
从解析角度和几何角度深入研究线性回归
(图片由作者提供)镜子,镜子,在墙上,谁是所有人中最小的正方形?
什么是线性回归?
在一个实验中,我们观察一些特征或属性的值。我们希望根据观察到的特征预测一个目标变量的值。线性回归试图推测特征和目标之间的线性关系。
让我们借助一个分析天气的例子来理解线性回归试图解决什么问题。假设我们有日平均温度 T ,风向 W ,以及每天日照总分钟数 S 。这些将是我们的特色。我们想预测每天的降雨量。这将是我们的目标变量。
我们试图找到 P,T,W,S 之间的线性关系。也就是说,我们希望找到 θ ₀ ,θ ₁ ,θ ₂ ,θ ₃,以便
抽象出线性回归
假设我们有超过天的天气数据。对于第 i 天,我们将那天的特征值 T,w,S 收集成一个行向量 x ᵢ = ( x ᵢ, x ᵢ, x ᵢ)。当天的降水值成为目标值 y ᵢ.
抽象出这个设置,我们可以假设给定了数据点 x ₁ ,x ₂ ,… x_n ,其中每个数据点 x ᵢ具有kt52】特征并且具有目标 y ᵢ.也就是说,每个数据点 x ᵢ看起来像行向量**
我们感兴趣的目标变量的值为数据点 x ᵢ.的 y ᵢ
线性回归试图找到数据点 x ᵢ和它们的目标 y ᵢ.之间的线性关系也就是说,我们想要找到实数 θ ₀ ,θ ₁ ,θ ₂ ,θ₃……θ_ k,这样对于每个 i ,我们都有
为一致性引入虚拟特征:₀θ在没有绑定特征 x ᵢ⁰的情况下非常突出,因此为了使其一致,我们为每个数据点 x ᵢ.引入虚拟特征 x ᵢ⁰= 1 也就是说,每个数据点 x ᵢ现在看起来像行向量**
所以我们想找到实数 θ ₀ ,θ ₁ ,θ ₂ ,θ₃……θ_ k,这样对于每个 i ,我们就有了
矩阵方程
让我们把 θ ₀ ,θ ₁ ,θ ₂ ,θ₃……θ_ k捆绑成一个列向量 θ ,把 y ₁ ,y ₂ ,… y_n 捆绑成一个列向量 Y 和行向量
那么同时求解上面的 n 线性回归方程就等同于求解矩阵方程 X θ = Y
使用最小二乘法的近似解
不幸的是,你可能并不总能准确地解决这个线性方程组。然后我们的目标是一个近似解,它在以下意义上是其他近似解中最好的:**
让xθ*=ŷ_θ。也就是说,我们对目标变量的预测值是[]ŷ_θ。我们希望我们的预测尽可能接近真实情况。所以我们希望ŷ_θ尽可能的接近 Y 。也就是说,我们希望范数| |*y-ŷ_θ||最小。
***因为这与要求| |*y-ŷ_θ||最小化是一样的,我们想要最小化下面的平方和
也就是说,我们想要矩阵方程 X θ = Y 的最小二乘解**
分析方法
如果你对多变量导数感到不舒服,直接跳到几何方法!
注意 Aᵀ是一个矩阵 a 的转置由于 θ ᵀ X ᵀ Y 是 a1×1 矩阵[ ],θᵀxᵀy*=(θᵀxᵀ*y)ᵀ.因此
由于 Yᵀ Y 不依赖于 θ ,我们不妨最小化以下函数
相对于 θ 取梯度,我们得到
请记住,我们希望梯度为 0,因为我们试图找到极值 f ( θ) 。所以我们想要 2xᵀy—2xᵀxθ= 0。****
也就是说,我们希望 θ 使得xᵀxθ= xᵀy .****
正规方程
矩阵方程xᵀxθ= xᵀy被称为xθ= y的 正规方程 从我们上面的讨论中,应该或多或少地清楚,正规方程的解 θ 给出了 Xθ = Y 的最小二乘解。**
这很好,但是我们如何知道正规方程的解实际上存在?我们如何检查我们得到的极值实际上是最小值?这些当然可以通过进一步的计算显示出来。相反,我们提出了一种几何方法,它完全避免了导数,并使用一些几何观点来推导正规方程,并显示最小二乘解的存在!**
几何方法
回忆…
让我们回到方程 Xθ = Y 。由于我们不能总是直接解这个方程,我们满足于一个近似解 θ 使得 Xθ ≈ Y 。如果我们定义ŷ_θ*=xθ,那么在所有可能的近似解 θ 中,我们要挑选一个使得| |*y-ŷ_θ||最小的。
让我们考虑 θ所有可能值的空间。这只是 R ^{k+1},即 θ 可以是任意 k+1 列向量。现在让我们看看集合 V ,它包含了所有可能的预测ŷ_θ。也就是说,
让我们将 X 视为一幅线性地图
即 X 是从可能的 θ s 的空间到目标变量所有可能值的空间的线性映射。
那么 V 就是 X 的形象。特别地,它是ⁿ.的子空间重申一下, R ⁿ是目标变量所有可能值的空间, Y 是我们试图达到的目标变量的特定值, V 是我们所有可能预测的子空间。
现在,如果 Y 位于 V 中,我们就能准确无误地找到解决 θ 的方法,它实际上解决了 Xθ = Y …如果不能,我们就试着在 V 中找到距离 Y 最近的矢量ŷ_θ**。****
(图片由作者提供)几何方法
在最接近给定目标的子空间中寻找向量
V 是 R ⁿ的子空间,而 Y 是 R ⁿ.中的给定向量我们想在距离 Y 最近的 V 中找到ŷ_θ*。我们如何做到这一点?
让我们想象一下这些矢量,还有矢量y-ŷ_θ。请记住,我们正努力使 y-ŷ_θ||的规范尽可能的小***
(图片由作者提供)可视化投影
由于点到子空间的最短距离是从点到子空间的垂线,我们的目标是使y-ŷ_θ垂直于 V !注意,这和说最接近的预测ŷ_θ简单来说就是 Y 到 V 的 正交投影 是一回事。**
图像、内核和转置
现在在线性地图的图像和它的转置ᵀ.的内核之间有了一个非常好的 relation[⁴垂直于图像的向量( X )实际上在 X ᵀ的内核中,反之亦然。在符号中,这写为
现在我们希望y-ŷ_θ垂直于 V = Image( X )。所以我们希望 y-ŷ_θ在ᵀ.的内核中也就是说,我们想要**
瞧啊。我们想要正规方程 X ᵀ Xθ = X ᵀ Y 的解 θ
正规方程的解
几何方法立即告诉你为什么法线方程xᵀxθ= xᵀy有解 θ 。这是因为(我们已经搞清楚了)当xθ*=ŷ_θ是 Y 到 V =Image( X )的正交投影时, θ 就是精确解。***
于是回溯,取 Y ,投影到 V =Image( X )。对于某些 θ ,投影必须看起来像 Xθ ,因为投影在图像子空间 V 中。那个 θ 是正规方程的一个解,因此是我们正在寻找的方程 Xθ = Y 的最小二乘解!
最小二乘解的唯一性
有一点我们忽略了,即是我们所追求的 Xθ *的独特之处吗?*使用我们的几何方法, Y 到 V (也就是ŷ_θ*)的投影是独一无二的。但是可能有几个 θ 使得xθ=ŷ_θ.***
但进一步假设, X 是一个内射映射,即它有零核,那么我们得到的 θ 是唯一的。而且实际上,原来【⁵】如果 X 是内射的,那么 X ᵀ X 也是内射的。由于 X ᵀ X 是一个方阵,这意味着 X ᵀ X 是可逆的。因此,我们实际上可以求解 θ 如下:
摘要
**方程 Xθ = Y 的最小二乘解 θ 与 正规方程xᵀxθ= xᵀ*y .的解相同
*正规方程总是至少有一个解。而进一步如果 θ 是一个解,那么 Xθ 这个最接近的预测就是 Y 到图像( X )的正交投影。
*法线方程可能有多个解,因此可能有多个最小二乘解。然而,如果 X 是内射的(即具有零核),则解是唯一的,并且由下式给出
脚注
[ ]:让
[]:θᵀxᵀy是 an (1 x (k+1))((k+1) x n)(n x 1) = 1 x 1 矩阵
[ ]:距离ŷ_θ和 Y 是| |y-ŷ_θ||
【⁴和⁵]:关于这个事实请查阅你喜欢的线性代数教科书**
Oracle 中的分析功能
本文通过概念构建练习 帮助理解分析函数的工作和用法
斯蒂芬·菲利普斯-Hostreviews.co.uk 在 Unsplash 上的照片
分析函数用于对多行数据进行“分析”,并返回当前行的结果。 例如,分析函数可用于找出运行总数、对行进行排序、对前一行或即将到来的行进行汇总等。虽然通过使用标准聚合函数和使用连接和子查询的原生 SQL 可以实现相同的功能,但是分析函数使它更加简单和快速。Oracle 在 Oracle 8.1.6 中引入了 26 个分析功能。
我们将使用下面的脚本来创建样本数据:
CREATE TABLE DEPT
(
DEPTNO NUMBER(2),
DNAME VARCHAR2(14 CHAR),
LOC VARCHAR2(13 CHAR)
);Insert into DEPT
(DEPTNO, DNAME, LOC)
Values
(10, ‘ACCOUNTING’, ‘NEW YORK’);
Insert into DEPT
(DEPTNO, DNAME, LOC)
Values
(20, ‘RESEARCH’, ‘DALLAS’);
Insert into DEPT
(DEPTNO, DNAME, LOC)
Values
(30, ‘SALES’, ‘CHICAGO’);
Insert into DEPT
(DEPTNO, DNAME, LOC)
Values
(40, ‘OPERATIONS’, ‘BOSTON’);
COMMIT;CREATE TABLE EMP
(
EMPNO NUMBER(4) NOT NULL,
ENAME VARCHAR2(10 CHAR),
JOB VARCHAR2(9 CHAR),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2)
)Insert into EMP
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
Values
(7369, ‘SMITH’, ‘CLERK’, 7902, TO_DATE(‘12/17/1980 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’),
800, NULL, 20);
Insert into EMP
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
Values
(7499, ‘ALLEN’, ‘SALESMAN’, 7698, TO_DATE(‘02/20/1981 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’),
1600, 300, 30);
Insert into EMP
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
Values
(7521, ‘WARD’, ‘SALESMAN’, 7698, TO_DATE(‘02/22/1981 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’),
1250, 500, 30);
Insert into EMP
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
Values
(7566, ‘JONES’, ‘MANAGER’, 7839, TO_DATE(‘04/02/1981 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’),
2975, NULL, 20);
Insert into EMP
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
Values
(7654, ‘MARTIN’, ‘SALESMAN’, 7698, TO_DATE(‘09/28/1981 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’),
1250, 1400, 30);
Insert into EMP
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
Values
(7698, ‘BLAKE’, ‘MANAGER’, 7839, TO_DATE(‘05/01/1981 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’),
2850, NULL, 30);
Insert into EMP
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
Values
(7782, ‘CLARK’, ‘MANAGER’, 7839, TO_DATE(‘06/09/1981 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’),
2450, NULL, 10);
Insert into EMP
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
Values
(7788, ‘SCOTT’, ‘ANALYST’, 7566, TO_DATE(‘12/09/1982 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’),
3000, NULL, 20);
Insert into EMP
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
Values
(7839, ‘KING’, ‘PRESIDENT’, NULL, TO_DATE(‘11/17/1981 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’),
5000, NULL, 10);
Insert into EMP
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
Values
(7844, ‘TURNER’, ‘SALESMAN’, 7698, TO_DATE(‘09/08/1981 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’),
1500, 0, 30);
Insert into EMP
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
Values
(7876, ‘ADAMS’, ‘CLERK’, 7788, TO_DATE(‘01/12/1983 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’),
1100, NULL, 20);
Insert into EMP
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
Values
(7900, ‘JAMES’, ‘CLERK’, 7698, TO_DATE(‘12/03/1981 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’),
950, NULL, 30);
Insert into EMP
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
Values
(7902, ‘FORD’, ‘ANALYST’, 7566, TO_DATE(‘12/03/1981 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’),
3000, NULL, 20);
Insert into EMP
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
Values
(7934, ‘MILLER’, ‘CLERK’, 7782, TO_DATE(‘01/23/1982 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’),
1300, NULL, 10);
COMMIT;
分析函数和聚合函数的区别
威尔·弗朗西斯在 Unsplash 上拍摄的照片
聚合函数对行进行分组,并返回整个结果集的输出。但是,分析函数会返回聚合输出,但不会对结果集进行分组。它们返回结果集中每一行的值。
例如,如果我们必须从 employee 表中找出部门编号的计数,我们将使用聚合函数编写以下查询:
**SELECT deptno,COUNT(*) dept_cnt
FROM emp
GROUP BY deptno;**
结果如下:
因此,对于每一行(即每个部门),我们得到计数。
使用分析函数,查询将被写成:
**SELECT deptno,
COUNT(*) OVER (PARTITION BY
deptno) DEPT_COUNT
FROM emp**
输出如下所示:
这里,结果是 emp 表中的每一行。
因此,在使用聚合函数时,我们不能包含任何非分组依据列,但是在使用分析函数时,您可以这样做。例如,下面的查询将返回一个错误:
SELECT empno,deptno,COUNT(*) dept_cnt
FROM emp
GROUP BY deptno;
但是使用解析函数,就不会面临这种错误。
SELECT empno,deptno,
COUNT(*) OVER (PARTITION BY
deptno) DEPT_COUNT
FROM emp
输出将是:
语法:
分析函数的一般语法是:
函数(arg1,…,argn) OVER(【分区由< … >)【排序由< …)。>][])
我们一部分一部分的解剖吧。
结束:
分析函数的范围是在 OVER 子句中定义的。对于所有分析功能,OVER 是强制的。如果您在 OVER 之后没有给出任何参数,它将假定范围为 ALL。因此,以下查询将计算整个表中部门的数量:
**SELECT deptno,
COUNT(*) OVER() DEPT_COUNT
FROM emp**
分区依据:
正如聚合函数使用 GROUP BY 对行进行分组一样,分析函数使用 PARTITION BY。例如,如果我们希望找出每个部门的最高工资和每个工作类型的最高工资,我们可以编写如下查询:
SELECT
ename,
sal,
job,
deptno,
max(sal) over (partition by deptno) max_sal_deptno ,
max(sal) over (partition by job) max_sal_job
FROM emp
在这里,我们按 deptno 进行了分区,以找出最高工资,并将其显示在 max_sal_deptno 列中。类似地,我们按职务进行了划分,以找出最高工资,并将其显示在 max_sal_job 列中
如果我们分析 emp 表的数据,很容易发现 10 部门的最高工资是 5000,20 部门是 3000,30 部门是 2850。
同样,对于工作类型的职员,最高工资是 1300,总裁是 500,经理是 2975,分析师是 3000,销售员是 1600。
排序依据:
它用于指定所选分区中记录的顺序。这不同于 WHERE 之后的主查询的 ORDER BY 子句。
窗口条款:
partition 子句不是限制分析函数范围的唯一方法。我们可以使用“ROWS BETWEEN”或“RANGE BETWEEN”子句来定义一个额外的范围。这在“窗口”一节中有明确的解释
一些常用分析函数的工作和用法:
一些常用的分析函数如下:
a .行数:
ROW_NUMBER 为一组记录提供一个连续的序列号。这里,ORDER BY 子句在枚举行时起着至关重要的作用。例如,如果您想返回每个部门中第二个被雇用的员工,您可以编写如下查询:
**select
ename, deptno,hiredate
from
(
SELECT
ename,
hiredate,
deptno,
row_number() over (partition by deptno order by hiredate) rn
FROM emp
) where rn=2**
输出是:
这里,我们按 deptno 对行进行了分区,并按 hiredate 进行了排序。函数的作用是:为所有的行分配一个序列号,从 1 开始,代表所有按 hiredate 排序的部门。对于新部门,编号将从 1 重新开始。内部查询执行此操作。内部查询的输出如下所示。(最后需要的行用红色标记)
外部查询现在选择 rn=2 的那些行,以给出我们想要的结果。
b. 等级:
等级分析函数还为一组以特定方式排序的行提供一个序列号,如 ROW_NUMBER。但是,不同之处在于:ROW_NUMBER 为每一行赋予一个唯一的编号,即使这些行是重复的。但是 RANK 对重复行给出相同的编号。
因此,在我们的 emp 表中,如果两个雇员有相同的雇佣日期,那么 RANK 函数将为每个重复的行给出相同的数字。查看以下查询的结果:
**SELECT
ename,
hiredate,
deptno,
row_number() over (order by hiredate) rn,
rank() over( order by hiredate) rank_num
FROM emp**
由于 JAMES 和 FORD 的雇佣日期相同,ROW_NUMBER 为他们指定了不同的编号,而 RANK 为他们指定了相同的编号。
c. 密 _ 秩
DENSE_RANK 的工作方式与 RANK 类似。唯一的区别是,在分配给重复行时,它不会跳过数字。检查以下查询的结果,了解 RANK 和 DENSE_RANK 函数之间的区别:
**SELECT
ename,
hiredate,
deptno,
rank() over(order by hiredate) rank_num,
dense_rank() over( order by hiredate) dense_rank_num
FROM emp**
詹姆斯和福特的雇佣日期相同。因此,对于等级和密集等级,两行都被分配编号 10。但是在等级的情况下,米勒的下一行被分配 12,而在密集等级的情况下被分配 11。
**d .**超前和滞后
LEAD 允许我们对下一行(当前行之后的行)应用任何计算。LEAD 函数的一般语法是:
LEAD( <表达式>,<偏移>,<默认> ) over( <解析子句> )
在哪里
<表达式> 是应用于前导行的表达式
<偏移量> 是相对于当前行的第一行的数量(可以是 1,2……)
<默认> 是当<偏移量>指向分区范围外的行时返回的值
LAG 的语法完全一样。LAG 中的<偏移量>指向相对于当前行的前几行。
假设我们必须找出部门 10 先前较低的薪水和下一个较高的薪水,查询将是:
**SELECT
ename,
sal,
lead(sal,1,0) over(partition by deptno order by sal desc) next_low_sal,
lag(sal,1,0) over(partition by deptno order by sal desc) prev_high_sal
FROM emp
where deptno=10**
结果是:
**e .**第一个值和最后一个值
在由 partition 和 order by 子句定义的记录集下,如果我们必须选取第一条记录,可以使用 FIRST_VALUE 函数。同样,在由 partition 和 order by 子句定义的记录集下,如果我们必须挑选最后一条记录,可以使用 LAST_VALUE 函数。比方说,如果我们必须找出部门 10 的每个雇员的第一次雇用和当前雇用日期之间的天数,则查询可以写成如下形式:
**SELECT
ename,
sal,
hiredate-first_value(hiredate) over(order by hiredate) no_of_days
FROM emp
where deptno=10**
结果是:
窗口条款
partition 子句不是限制分析函数范围的唯一方法。我们可以使用“ROWS BETWEEN”或“RANGE BETWEEN”子句来定义一个额外的范围。
<window_clause>的一般语法是< start_expr >和之间的
T28【行或范围】</window_clause>
< start_expr > 可以是以下任意一个
无界 PECEDING
当前行
< sql_expr >之前或之后。
< end_expr > 可以是以下任意一个
无界跟随或
当前行或
< sql_expr >之前或之后。
让我们编写一个查询,给出前几行相对于当前行的最高工资。
**SELECT
ename,
hiredate,
sal,
max(sal) over(order by hiredate,ename
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) max_before_sal
FROM emp**
这里,对于每一行,返回当前行之前的最高工资。这里的 ORDER BY 子句不用于排序,而是用于指定窗口。无界在前是最低的可能界限,即第一行。
检索当前行之前或之后的行,n 在前或 n 在后,其中 n 是相对于当前行的位置。在我们的例子中,n 是 1。
范围与行非常相似,但范围中的间隔不是行数。它们代表一定范围的值,可以是数字或日期值。
Oracle 的分析功能是非常强大的工具,可以在多个维度上汇总和分析数据。执行速度也比普通的聚合函数快得多。对于 Oracle 开发人员来说,了解这些功能无疑是额外的收获。
分析、数据科学和统计:
什么是分析?什么是数据科学?什么是统计学?
一朵玫瑰,不管它叫什么名字…
我想在数据科学、统计学或一般来说的分析媒体上发表另一种声音,以拓宽视角,增加关于这一主题的丰富对话。虽然我的意图是让这个充斥着数据和分析及其不同词汇的世界更加清晰,但毫无疑问,我也会给这个广阔的话题带来一些困惑和不和谐。这就是数据和分析领域的现状。如果没有别的,也许我可以带来一些更好的理解,或者至少是一个补充的理解,关于数据和分析的学科和实践的新兴多样性。
首先,我认为大多数对分析和数据科学的描述都过于狭隘,一种更具包容性的方法将有利于社区。事实上,由于大多数数据科学实际上是关于数据分析的,我们是否可以受益于一个更宽泛的名称——数据分析科学和数据分析科学家?第二,我认为统计学作为一门学科经常被视为数据科学之外的东西,只被归为严格的分析。此外,统计学家经常被描述为假设检验、产生 p 值的数据处理者。对于我为 Medium 写的第一篇文章,我将扩展第一个主题,并希望开始消除第二个主题,尽管后者将需要更多的文章。
那么,我从哪里开始呢?好吧,让我们从一些定义开始。
1。 分析放大
首先,对我来说,我认为术语“分析”是一个广泛的、包容的术语。分析是指使用数学来分析数据或建立模型来解决现实世界的问题。它包括使用数学方程式、算法、逻辑、计算机代码来工作的人。这是我作为礼来公司公司高级分析科学负责人的观点,直到我 2017 年退休。我雇佣、合作和管理具有各种分析学位的专业人士,包括统计学(数学统计、生物统计、商业统计)、数学、运筹学、计算化学、经济学、计算机科学和 ML/AI。这些技能和能力的互补性质鼓舞人心,当然“整体”大于“部分”的总和
在我们公司还有其他分析学科**,我和其他人认为它们是“分析社区”的一部分,我对此没有直接责任,但与我们的高级分析团队合作。其中包括:**
****流行病学家和健康结果研究人员,他们主要在观察数据空间工作,以评估疾病的自然史和药物/生物治疗的真实结果;
药物计量学专家,他们建立药物与生物体(动物和人类)相互作用的药代动力学和药效学模型,以预测最佳给药方案、药物相互作用和治疗的临床效果;
系统生物学家,他们在组织和细胞水平上创建疾病的数学模型,以阐明新分子实体的潜在积极和消极影响及其生物作用机制;
生物信息学家,他们将遗传学、疾病和分子生物学数据库中的信息联系起来,寻找疾病过程中可能涉及的生化途径,以便其他科学家可以设计分子、抗体或其他治疗方法来阻止疾病;
计量经济学家,他们建立微观和宏观经济模型来描述我们的世界并预测未来可能的结果。
分析领域既广又深!
(无摄影师署名)https://dlpng.com/png/6767898(仅供个人免费使用)
受过良好教育的专业人员执行这种广泛的数据分析工作,每个人都有一个特殊的工具集和知识库,不可避免地源于数学。有些人知道微分方程,有些人知道概率分布理论,有些人将他们的数学技能与深厚的生物或医学知识相结合,有些人知道商业,金融或市场营销,有些人知道优化算法,有些人知道建模和模拟,有些人知道各种深度学习方法,有些人拥有高超的编码技能。
旁注 1:我必须说,在制药行业工作并领导一个非常有才华的高级学位数据分析科学家团队是一次拓展思维的经历,也是一种真正的快乐。相信我,在这些队伍中,即使有,也是非常少的刻板的书呆子或后台数字处理者。这些人理解数学,参与科学/商业问题、策略和问题,解释他们的发现,并以商业伙伴可以理解的语言交流他们的结论。
旁注 2:我使用的短语是 数据 分析型科学家,因为在科学界,“分析型科学家”这个术语已经被生物/化学人群所采用。这些人执行复杂的化验,例如,确定流体的化学成分(例如,药物 X 在血浆中的浓度)。由于他们通常被称为分析化学家或生物分析化学家,我将使用术语 数据 分析科学家来区分上面在我的分析“大帐篷”中提到的学科。
旁注 2:在我早期涉足更广泛的分析领域时,我并没有意识到上述区别。当我第一次成为礼来公司高级分析部门的领导时,我开始接到猎头的电话(我们都是这样),告诉我其他制药公司领导化学部门的工作机会。我常常困惑地说:“你一定是打错电话了,或者找错人了。无论如何,我都不是化学家。”在打了几次这样的电话后(也许我学得很慢),我意识到发生了什么。
统计
现在,为了完全公开,我是一名训练有素的生物统计学家(伴随着数学),尽管在制药行业解决实际问题几十年,我认为我的知识和观点超越了统计或统计学家的传统或刻板印象。
好的。随着我的披露澄清和我对分析的定义到位,我将进入下一个重要的定义,因为它似乎在我们目前的数据和分析世界中产生了很多困惑和恐慌。什么是统计学?尽管其他人已经对这一古老的职业做出了新的定义,特别是在“数据科学”的背景下,但我将从不同的角度来看待统计学家几个世纪以来一直在做的事情。同样,我将统计学视为数学的一个分支,我用它来对比统计学和我在下面的对联中学到的数学知识。
数学是辨别真理的科学。
统计学是一门量化什么可能是真实的科学。
谁能忘记汤姆·克鲁斯对杰克·尼克尔森大吼:“我要真相!”
(《几个好人》);阿伦·索尔金编剧;https://pbs.twimg.com/media/DUWaGNnUQAAi9Up.jpg 罗伯·莱纳
虽然关于这两种说法可以说很多,但为了简洁起见,我只提出几点。简而言之,数学是关于证明,确定性,真/假。从这个意义上说,它存在于集 {0.1} 。统计学是关于不确定性、概率/可能性和存在于真假之间灰色阴影中的证据。在这个意义上,它存在于区间 (0,1) 。**
在单位区间上捕捉到的数学与统计学的根本区别。
统计学的标志是“不确定性的量化”,它可以表示为概率、可能性、置信度或其他类似的度量。这是所有数据分析科学的关键和挑战。我这样说是因为在我们的现代世界中,如果一个人有数据(谁没有访问大量数据的权限?!)和一台电脑(谁没有接触到不可思议的计算资源?!),然后你可以把数据输入计算机,它会给你一个答案。它必须给出一个答案。这就是它的作用。这很容易。难的是评估这个答案的质量。这需要理解数据的来源及其潜在的偏差,其中一些可能相当微妙。它需要理解分析中可能的混淆因素、模型拟合和过度拟合、多重性和虚假相关性等等。一个没有经过如此深思熟虑的答案只是一个留给人一个疑问的答案,“好吧,那我该怎么做呢?”
如果你能接触到数据,并且有一台电脑,得到答案是很容易的。
评估这个答案的质量是非常困难的。
根据我的经验(请记住,这直接发生在制药行业和整个医疗保健行业),无论是研究科学家和临床医生、销售和营销主管、财务总监,甚至是业务部门的总裁,他们都想知道,“你发现的东西有多大可能是真实的?”更具体地说,他们可能会问:
研究人员:“你有多确定这种基因变异实际上是区分有反应的患者和没有反应的患者的一个因素?我是否应该再投资 4000 万美元进行临床试验来调查或证明这一点?”
营销人员:“你有多大把握对营销活动 X 的投资真的会增加销售额?如果我把下一笔 10,000,000 美元投资在这些广告、口号或推销上,投资回报是多少?”
财务:“如果我们将 25,000,000 美元从项目 X 转移到项目 Y,我们增加总收入的可能性有多大?你的预测有多准确?”
所有这些问题都隐含着对量化不确定性的渴望——而不是消除不确定性,我的所有研究或商业伙伴都理解并接受了这一点。他们需要量化他们决策的利弊。
现在,并不是所有的决定都涉及数百万美元的投资或后果。当风险很高时,数据分析学科、方法和工具的全部力量应该用于量化研究/业务领导决策的可能后果。当投资规模较小、后果不太严重时,更快、更简单的方法可能就足够了,答案可能更具猜测性。然而,即使在这种情况下,也应该传达一些关于答案的合理性或可靠性的定性评估…比如“嘿,老板,这是一个真正的赃物,但这是我们在 24 小时内所能做的最好的了”或“鉴于我们过去的经验,我们认为这是一个非常好的答案…”**
这就是“符合目的”的概念。我在很多场合听到过这句话,它也适用于这里:“既不寻求也不回避复杂性。”如果一个简单的数据分析方法给出了一个好的答案,那就这样吧。但是,如果手头的问题很难,很复杂,有大量的变量,那么就开始进行全面、深入的分析。问题是当前者被认为是后者的一个简单的出路时…当它很容易得到一个答案并说,“这是我们的数据中一些可能的关系。我做了我的工作。你的工作就是把它弄清楚。”我的商业伙伴绝不会容忍这种事。他们指望我们提供某种程度的可靠性…某种不确定性的量化,以帮助指导他们的决策。
总结
我们都知道 数据科学不仅仅是数据 。事实上,大多数数据科学都是关于分析数据,而不仅仅是操纵它(尽管这可能是由于它的起源……请继续关注这个主题的更多内容)。所以,我更喜欢用一个更贴切的描述来描述我们所做的事情——数据分析科学。**
大部分数据科学都是关于分析数据。**
所以,让我们用一个更贴切的描述词——数据分析科学。
我们的工作有没有更贴切的名称?
我喜欢把数据分析科学想象成一个大帐篷。许多专业人士使用某种形式的数学来处理和分析数据。我指的是 专业人士——那些在数据分析方法和工具方面受过正规训练的人。让我们面对它,几乎每个人都可以声称他们分析数据。谁不把事实和数字放入电子表格,并以某种方式进行排序、总结或可视化呢?我认为数据分析科学家是那些专门从事某种形式的数据分析的人,这种数据分析超出了简单的描述性或初级统计(例如线性回归)。
把数据分析科学想象成一个大帐篷。
数学、统计、比较科学、OR、Epi、PK/PD、经济学、生物信息学。
最后,分析非常容易。解读很辛苦。如果我们要成为数据分析科学的专业人士,那么我们有责任为我们的科学/商业伙伴提供一些不确定性的量化,这些不确定性是我们的结论、建议或预测的基础。至少,一些定性评估应该是强制性的。
分析很容易。解读很辛苦。
在他著名的戏剧《罗密欧与朱丽叶》中,莎士比亚写到朱丽叶对她心爱的罗密欧说:“我们称之为玫瑰的东西/不管叫它什么名字,闻起来还是一样香。”所有涉及数据分析以解决问题的学科都有好处。这种甜蜜源自数学的美丽和多功能性,以及数据驱动决策的效用。
(无署名) bwallpapers (免费使用)
分析/数据科学学员实验室工具和技术
您在数据科学学习之旅中应该了解的工具和技术
照片由 holdentrils 在 pixabay 拍摄
每个人都想成为数据科学家。互联网上有大量的学习资源。每件好事都有副作用。当我遇到那些自称为数据科学家的数据从业者时,我并不感到惊讶。纠结于基础研究方法论或者概率概念。但那是另一天的话题。今天,我们将讨论您应该知道什么,以及在开始学习数据科学或分析时可能需要使用哪些工具。最后,您还会发现一些关于设置实验室的工具的建议。
1.计算机和互联网连接
由安德里亚·b·卢卡奇在 pixabay 拍摄的照片
任何想要踏上分析或数据科学之旅的人,他们首先需要的是一台运行良好、网速适中的电脑。该机可以是笔记本,台式机,甚至花式 2in1 平板电脑也行。有人提到 iPad/Android 平板了吗?如果你有覆盆子酱,你也可以从这个开始。这里的重点是,你不需要那些高配置的工作站或疯狂的计算与花哨的 RGB 灯光游戏装备。好吧!如果你想玩所有新的 AAA 评级游戏,你需要最新一代的英伟达 GTX 或 RTX GPU 和无尽的核心(!)处理器拥有大量内存(RAM),当然还有超高速存储(硬盘)。是的,数据科学家在某些时候也需要这些,但不是一开始就需要。让我们一致认为,一台可以正常上网的电脑足以让我们开始学习。哦,是的,我们需要互联网来下载我们将用来学习的所有工具(一切都是免费或开源的)。
因此,无论你打算用什么系统来学习,强烈建议你好好了解你的机器。请不要成为那种仅仅因为笔记本电脑和他的手机有相同的发光标志而购买笔记本电脑的人。赛前了解马匹尤为重要。尤其是不管是 x86 还是 x64 还是 ARM 架构。如果您还不知道它,请转到您的系统属性并检查它。把它记下来。当我们下载学习旅程所需的软件时,它会派上用场。如果你想了解更多关于这些平台之间的区别,你可以在维基百科上找到关于这些平台的详细文章。接下来我们需要知道我们的系统有多少内存。这些信息也可以在系统属性中找到,当然你需要了解你有多少空闲空间。我们将安装软件并带来样本数据。所以,你需要非常熟悉储物单元。感谢智能手机制造商,现在就连奶奶也知道她需要一部 5tb 的手机,因为她想用 4800 万像素的超宽手机摄像头给所有的孙子孙女拍很多照片。总之,您始终需要了解处理器架构及其速度、总内存和机器的可用空间,以便有效地设置整个学习实验室环境。
2.操作系统和用户帐户类型
现在,您已经了解了机器的主要硬件。在开始讨论我们将使用哪些工具之前,让我们熟悉另一个关键部分。
照片由openclipbart-Vectors在 pixabay 上拍摄
操作系统有很多种形式。当今世界上最流行的操作系统是 Android。10 台设备中有 4 台采用安卓系统。我们可以在 Android 中进行分析吗?为什么不呢?它并不意味着像 Windows 或 OS X 或 Linux 那样的桌面计算。它日益成熟。多窗口操作和越来越多的编码环境的支持,它是非常能干的。因此,如果你拥有一部高端智能手机或平板电脑,你也可以用这款设备开始你的数据科学之旅。如果你有一台 iPad,你也可以在你的 iPad 操作系统中进行类似的编码和分析。您不需要等待笔记本电脑或台式机。在我们的例子中,最有效的操作系统将是这三个微软视窗系统、苹果 OS X 系统或任何版本的 Linux。以 Linux 为例,我最喜欢的是 Ubuntu。一旦你知道你正在运行哪个操作系统,现在你需要知道它的变体是什么——32 位还是 64 位,是哪个版本?
一旦你熟悉了所有这些术语,接下来就是故事的下一部分——你在机器上使用的是什么类型的用户账户。如果您与任何人共享设备,或者这是由您的办公室或学校提供的,那么了解您的帐户类型尤为重要。如果没有正确的权限或帐户类型,您可能无法安装或配置自己需要的所有工具。在安装或设置所有工具时,最好拥有管理员或高级用户权限。一旦一切都启动并运行,那么常规用户帐户将是极好的。当您想要更新/升级工具时,您还需要特殊权限。
3.文字编辑器
其他操作系统都有默认的文本编辑器。你日常用的 windows 机器有经典的记事本应用,Mac OS 自带文本编辑。大多数 Linux 发行版都预装了 vi 或 vim。这些都是很有能力的编辑器,可以打开、浏览数据和编写代码。由于编码人员非常依赖他们的编辑器,他们也为他们构建了编辑器。如果你每隔一天谷歌一下,你不会惊讶地发现一个新的编辑。每个作家、程序员和开发人员都有一套最喜欢的工具,就像每个木匠都有一把最喜欢的锤子,每个艺术家都有一套最喜欢的画笔。有些编辑器在所有操作系统中都可用。有些是付费的,有些是免费或开源的。Atom,Sublime Text,Notepad++是目前流行的文本编辑器中为数不多的几个。
使用文本编辑器非常简单。开始时,只需打开一个新文件,写入并以所需的文件扩展名保存。在大多数情况下,如果你不给出任何扩展名,你的编辑器将把它保存为一个普通的。txt 文件。一旦你开始每天使用它,你就会找到有效处理它的方法。像使用一些键盘快捷键会非常方便。你就越会使用它;您将开始熟悉附加组件、宏和其他功能。我们将在后面详细讨论文本编辑器。在这种情况下,我们将在所有示例中使用 Notepad++。
4.基本 CLI
照片由openclipbart-Vectors在 pixabay 上拍摄
自第一代 iPhone 问世以来,世界已经发生了变化。一切不仅好到足以基于 GUI。它需要进行触摸优化。但是世界的这一部分还不是 100%真实的。对于初学者来说,您仍然需要掌握一些基本的文件管理 CLI 技能。像创建一个新的文件夹/文件或复制,粘贴,删除一个文件夹/文件,更重要的是,要知道当前的工作目录或改变目录,最后如何使用帮助文件。对于初学者来说,这已经足够好了。使用命令行一开始可能会很吓人,但是用得越多,就越不吓人。一旦你采用了它,你就掌握了!CLI 等待您的命令。我们将讨论与学习者数据专家相关的最常见的 CLI 命令。
5.基于 GUI 的工具
每隔一段时间,奇迹就会在每个领域发生,对于所有的数据专业人员来说,Microsoft Excel 就像是来自地球上天堂的祝福。很难找到一个和数据打交道的人,而且从来没有碰到过微软的 Excel。从数据分析的初学者到大师,每个人,如果不是经常,偶尔会使用这个工具。年复一年,情况越来越好。数据清理、可视化、基本统计建模或高级探索性数据分析一切皆有可能。一旦你开始使用 add on 或者开始构建你的宏,可能性是无限的。你可以不同意将 Microsoft Excel 视为一个合适的分析工具,但它拥有完成大多数分析步骤所需的所有功能。
SAS 和 IBM SPSS 在过去是非常流行和有影响力的分析工具。它们仍然很出色,可以很好地解决大多数高级分析或预测建模问题。当您想将这些工具用于所有现代大(!)高度可扩展的生态系统。在这种情况下,Knime 和 Rapid Miner 做得非常好。您可以从今天开始学习这些工具,但是学习曲线会非常平滑。但是并不是所有的商业组织都有能力使用所有这些工具。这些工具最棒的地方在于,你可以在所有这些工具中使用你最喜欢的 python 或 R 语言。如果不提 H2o、Dataiku、DataRobot、Orange、Alteryx,这些列表就不完整。
6.程序设计语言
约翰逊·马丁在 pixabay 上的照片
我们有微软 Excel 和一个基于图形用户界面的工具。我需要学习编码吗?是也不是。如果你在一个大型团队中工作,并且你的团队中有人可以通过编码快速完成工作,而这对于架子工具是不可用的,你可以从他们那里获得帮助。不过,最好还是学习必要的编码,这样沟通才能顺畅,你也会明白他们在实现你的要求时可能面临的挑战。重点是现在;市场上没有任何工具可以开箱即用,100%解决您的数据分析问题。这将需要一些特定于行业或问题的自定义功能。在这些情况下,编码是必不可少的。
现在我们一致认为,我们需要学习一种编程语言,以便在分析的世界中导航。那么问题就是哪种语言。让我们不要卷入这场辩论;相反,我们可以选择 Python 或 r。这两种语言都能够做类似的事情。你甚至可以学习 Java 或者 Julia。哪种语言都无所谓。一旦你熟悉了一个,切换到另一个就不会花太多时间,而且总有 google 和 StackOverflow 帮助你。但是最好从拥有最大社区的语言开始。最大的社区意味着大量的教程、例子和论坛。您还可以找到许多示例项目来跟进。
7.结构化查询语言
并非所有数据都能放入 Excel 电子表格。Excel 是一个很棒的工具,毫无疑问。但是你需要把你的数据存储在一个便于组织和快速访问的地方。这是一个非常拥挤的领域——针对不同类型的数据库有大量的解决方案。但是如果你熟记标准的 SQL,你可以在帮助文件或谷歌的帮助下使用任何解决方案。要么是 Microsft SQL Server 要么是 Oracle 要么是 Impala 要么是 Google Big Query 作为数据专业人士 SQL 应该是你的第二语言。数据库和 SQL 的概念可以帮助您通过 python 或 R 进行数据准备,即使您不在任何数据库之上工作。
8.多方面的
你就快到了。现在你知道了你的硬件和所需的软件。为了以后的效率,你需要更多的工具,比如版本控制,调度器;您需要熟悉文件压缩技术,当然,还有现代基于云的工具和技术。一旦你习惯了数据专家的生活方式,你就可以学到这些,这种生活方式只对合适的人有吸引力。
2020 年中期推荐的实验室工具和技术
电脑- > CPU:酷睿 i5 或 AMD 锐龙 5 级,RAM: 16GB,HDD: 1TB SSD
**操作系统->**Ubuntu LTS 64 位或 Windows 10 64 位带 WSL Ubuntu LTS
**文本编辑器->-**记事本++本
GUI 工具- > Knime &微软 Excel
编程语言- > Python 3 Anaconda 发行版
SQL - > MySQL
FIFA 2019 球员分析!
康纳·科因在 Unsplash 上的照片
CRISP-DM 数据科学足球赛
国际足联的足球分析和建模
在本帖中,我们将按照 CRISP-DM 流程对 FIFA 2019 完整球员数据集进行简单的数据分析和建模。数据集已经收集完毕 Kaggle 。数据集包含 1 个 CSV 文件。
FIFA 2019 是作为电子艺界的 FIFA 系列的一部分开发的足球模拟视频游戏。这是 FIFA 系列的第 26 部,销量超过 2000 万部。
让我们开始吧!
在足球这样的运动中,每个球员都为团队的成功增加了重要的价值。了解球员的技能很重要。年龄如何影响球员的潜力?哪个玩家最擅长哪个侧面?该研究还侧重于根据表现指标评估球员的整体表现,以及各种模型如何对准备好的数据进行评估。
数据理解
作为 CRISP DM 的第二阶段,使用数据可视化和查询来探索数据和解决数据挖掘问题是很重要的。数据集由 89 列组成,但我们将只限于以下几列:
Index(['Name', 'Age', 'Overall', 'Potential', 'Value', 'Wage', 'Special',
'Preferred Foot', 'International Reputation', 'Weak Foot',
'Skill Moves', 'Crossing', 'Finishing', 'HeadingAccuracy',
'ShortPassing', 'Volleys', 'Dribbling', 'Curve', 'FKAccuracy',
'LongPassing', 'BallControl', 'Acceleration', 'SprintSpeed', 'Agility',
'Reactions', 'Balance', 'ShotPower', 'Jumping', 'Stamina', 'Strength',
'LongShots', 'Aggression', 'Interceptions', 'Positioning', 'Vision',
'Penalties', 'Composure', 'Marking', 'StandingTackle', 'SlidingTackle',
'GKDiving', 'GKHandling', 'GKKicking', 'GKPositioning', 'GKReflexes'],
dtype='object')
- 各方面最好的选手?
可以看出,以下选手在各自领域被评为最佳。可以看出,K. Mbappé潜力最大,c 罗技术动作最好,内多头球准确性最高等。
图 1:基于表现得分的最佳球员
2。球员最喜欢的脚?
图 2:球员最喜欢的脚
3。足球脚对球员潜力的影响
图 3:脚对球员潜力的影响
从上面的图中可以看出,球员的潜力几乎不取决于他是左脚还是右脚。
3。年龄对潜力有影响吗?
图 4:年龄与潜力
从柱状图中可以看出,随着年龄的增长,球员的潜力有下降的趋势。
建模
表现指标是属性的组合,给出了选择的细节,球员的整体表现。热图用于发现绩效指标如何影响玩家的整体绩效。
图 3:整体与其他绩效指标的相关性
从热图中可以看出,总体绩效与大多数绩效指标正相关。
CRISP-DM 的第三阶段是数据准备。对数据进行清理(处理分类数据和缺失值以预测整体性能)并为实现结果做好准备。建立线性回归模型,根据表现得分预测选手的整体表现。
估价
此外,我们将数据拟合到各种模型中——随机森林回归、K 近邻和决策树回归,并使用以下指标评估模型:
- 绝对平均误差
- r 广场
- 均方误差
图 5:各种模型的评估
结论
在本文中,我们对 FIFA 2019 完整球员数据集进行了简单的数据分析。
- 我们观察了哪个玩家擅长某个特定的性能指标。比如:l .梅西最擅长整理。
- 然后,我们研究了年龄对球员潜力的影响,即随着年龄的增长,球员的潜力下降。
- 建立一个模型来预测一个球员的整体表现,给出他在每个表现指标上的技能得分。
- 最后,我们针对 KNearestRegressor、DecisionTreeRegressor、RandomForestRegressor 评估了我们的线性回归模型
这里的发现是观察性的,还有很多分析要做:
你将如何解决这个问题?
所有代码都在我的 Github 资源库 中。
用谷歌日历和熊猫分析和跟踪自由职业者的收入
将日历数据引入 Pandas,实现自由职业者收入跟踪任务的自动化。
介绍
作为一个住在西班牙的异乡人,我的收入来源之一是给私人上英语课。2016 年开始的时候,我在一个简单的 Google Sheets 文档中手工输入了所有的私有类。我的目标是跟踪工作时间和收入,并分析我的新职业的趋势和见解。
问题是
电子表格需要手工输入类别;日期,长度,学生姓名和收入。手动更新文档花了大约 5 分钟,我喜欢每周回顾我的时间表,反思所上的课和获得的收入。然而,记住每周做一次开始变得有点乏味,几年后,有了多种收入来源,电子表格膨胀成一个不稳定的庞然大物,有过多的选项卡、数据透视表和各种原始数据来源。是时候自动化解决方案了。
解决方案
我的生活和工作日程由谷歌日历管理——这包括我所有的私人课程、自行车/摄影之旅、学术工作、政府职位、翻译工作和随机的自由职业。每一个有偿工作的“单位”都在日历中;我只需要找到一种方法来直接访问谷歌日历数据,并将我的电子表格重建成一台可持续的分析机器。在我以前的公司生活中,我专门在 Pandas 笔记本(用于分析数据的 Python 框架)的世界中工作,因此利用这些工具从 Google Calendar 访问我的课程表并利用 Pandas 处理和分析收入数据是一个自然的解决方案。
第一步:在谷歌日历和熊猫世界之间架起一座桥梁
我偶然发现了一篇很棒的文章,它解决了我的问题。使用 Google Calendar API,我可以轻松地获取我的日历事件(使用特定的“英语类”日历)并将其转换成易于分析的形式。我建议查看这篇博文,逐步了解如何使用您的帐户设置 Google Calendar API 并创建 OAuth 客户端 ID。
下一步是执行代码,该代码将生成一个 URL,该 URL 需要 google 登录和授权,以使应用程序能够访问我们的日历事件。将生成一个授权码,我们需要将它粘贴回我们的熊猫笔记本。注意:“your_calendar_id”是我想要查看的特定日历(Google 提供了创建多个日历的选项)。
(以下所有代码也可在 GitHub repo 上获得)。
*#read calendar events from google*
*#requirement: pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib*
**from** **apiclient.discovery** **import** build
**from** **google_auth_oauthlib.flow** **import** InstalledAppFlow
**import** **pickle**
scopes = ['https://www.googleapis.com/auth/calendar']
flow = InstalledAppFlow.from_client_secrets_file("client_secret.json", scopes=scopes)
credentials = flow.run_console()
*#save credentials*
pickle.dump(credentials, open("token.pkl", "wb"))
credentials = pickle.load(open("token.pkl", "rb"))
service = build('calendar', 'v3', credentials=credentials)
result = service.calendarList().list().execute()
*#specify desired calendar to access*
your_calendar_id = 'YOUR_CALENDAR_ID'
登录我们的帐户(我们已经为其创建了一个日历 API 项目),并授予我们的应用程序访问日历的权限。
在点击各个确认框后,会生成一个授权码,我们需要将它粘贴回笔记本中。我们现在可以从我们的熊猫笔记本上直接访问您的谷歌日历。
第二步:在谷歌日历中访问所需的数据,并转换成熊猫数据框架
好了,现在我们有了谷歌日历和熊猫之间的链接——下一步是正确地获取数据并将其转换成可用的形式。
我们可以使用“service.events()直接访问事件。列表()。execute()"调用,如下面的代码所示——参考日历 API 文档,以便根据我们的需求进行定制是很有帮助的。
我决定过滤日历中从我开始从事自由职业到未来一年的日期(以便正确跟踪预定时间和工作时间)。
*# Call the Calendar API*
**from** **datetime** **import** datetime
**from** **datetime** **import** timedelta
**from** **dateutil.parser** **import** parse **as** parse_date
**import** **pytz**utc=pytz.UTC
*#specify max date of calendar events you would like to access (days in future)*
days_in_future = 365
now = datetime.utcnow()
date_final = (datetime.utcnow() + timedelta(days=days_in_future)).isoformat() + 'Z'
*#start_date - earliest date of calendar events needed*
start_date_str = '09/01/19'
start_date = datetime.strptime(start_date_str, '%m/**%d**/%y').isoformat() + 'Z'
events_result = service.events().list(calendarId=your_calendar_id,
timeMin=start_date,
timeMax=date_final,
maxResults=1000,
singleEvents=**True**,
orderBy='startTime').execute()
events = events_result.get('items', [])
我们现在有一个很好的字典列表,每个字典代表一个特定的日历事件,对应于一个特定的自由职业者事件,并包含重要的数据,如开始/结束时间和事件的描述。
让我们遍历字典列表,以便解析出有用的信息,并转换成一个整洁的字典列表,很好地放入 Pandas 数据框架。我决定获取活动的开始/结束日期、持续时间,并做一点逻辑分析,看看活动是仅仅被预订了还是已经完成/支付了。结果被保存到 pandas 数据框架中,以备进一步处理和分析。
event_list = list()
**for** event **in** events:
start = parse_date(event['start'].get('dateTime'))
end = parse_date(event['end'].get('dateTime'))
event_duration = end - start
event_duration_minutes = event_duration.seconds // 60
**if** end < utc.localize(now):
status = 'PAID'
**else**:
status = 'BOOKED'
cal_entry_dict={'date': start.strftime('%Y-%m-**%d**'),
'client': event['summary'],
'minutes':event_duration_minutes,
'status' : status}
event_list.append(cal_entry_dict)
*#Convert to Pandas Dataframe*
classes_df = pd.DataFrame(event_list)
生成的数据帧如下所示:
让我们施展一些熊猫魔法,引入价格、位置和一些其他数据点,以便正确地开始分析数据。
使用一点逻辑将定价数据与主数据框架连接起来,以根据活动的长度确定收入。此外,解析我们的“旅游”日历事件,这些事件应该与类区别对待。
产生的数据框架给我的信息与我的手动电子表格完全相同;我们的电子表格的数据输入部分已经自动化了!我们努力工作的结果:
第三步:分析数据
好戏开始了!我们将整理这些数据,以获得一些一般性的见解。
显然,这里有一些季节性趋势,因为我们看到夏季收入大幅下降。让我们引入更多的历史数据,看看这种趋势能否持续。
我们看到了一些严重的收入季节性趋势。夏季的几个月里收入大幅下降——天气晴朗的时候,没人想学英语!
让我们从另一个角度来看这个问题:每年作为一条线,x 轴仅仅是月——这将有助于我们直观地看到随着月份的推移,每年的轨迹。
明显的季节性:
这些图表显示了总收入,但缺乏任何关于收入来源的信息(私人课程、政府工作、自行车旅游、翻译等)。让我们调整代码以显示“client_type ”,这样我们可以更好地了解收入来自哪里。
结果显示了收入的良好多样化:
我们应该展望未来,我们对未来的收入有什么样的预订?(所有被定义为“有偿”的工作都被视为已完成/有偿工作,所有被“预订”的工作都是对未来工作和报酬的承诺。
我们将看到 2020 年的收入大幅下降!是时候开始预订了。
一年前的这个月,我在同一时间点做得怎么样?两年前?这里有一个漂亮的图表,显示了本月迄今为止的收入(当月)逐年减少的情况。我的想法是看看我目前的收入与前几年相比如何。
(由于各种新项目,2020 年将是收入增长缓慢但个人成长迅速的一年!)
这些是我用来洞察收入活动的一些基本图表。可能性是无穷无尽的;任何阅读这篇文章的人都可以很容易地定制他们的代码来满足他们的需求。
最后的想法
自动化解决方案已被证明是一个更加强大、自动化和有效的解决方案,让我能够洞察我的收入。Pandas 是一个快速和强大的操纵/可视化数据的极好资源。我鼓励任何在电子表格中跟踪收入(并使用谷歌日历)的人开始利用熊猫来达到同样的结果。这里有一些有用的资源可以让熊猫笔记本正常运行:
- Dataquest Jupyter 笔记本教程
- Jupyter 项目
- 笔记本必备快捷键
- 谷歌“如何[在此插入您的问题]熊猫 python”并扫描相关 StackExchange 问题。
受冠状病毒影响最严重的 10 个国家和墨西哥
深入了解新冠肺炎在墨西哥的传播情况,以及十大疫情最严重的国家
墨西哥确诊病例密度分布图(Diego Hurtado)
作者:迭戈·乌尔塔多
介绍
本说明的目的是描述墨西哥与受影响最严重的国家的总体现状,这可以为人们采取有益的社会和卫生措施以阻止新冠肺炎的传播服务。
自 2019 年 12 月下旬以来,一种新型冠状病毒疾病的爆发(新冠肺炎;此前被称为 2019-nCoV)在中国武汉被报道,随后影响了全球 210 个国家。一般来说,新冠肺炎是一种急性疾病,但它也可能是致命的,病死率为 29%。截至 2020 年 1 月 19 日,墨西哥已确诊约 1.03 亿病例,超过 224 万人死亡,5730 万人康复。
Covid 案例分布(Diego Hurtado)
症状
在出现症状之前,人们可能会感染病毒 1 至 14 天。冠状病毒疾病(新冠肺炎)最常见的症状是发烧、疲劳和干咳。大多数人(约 80%)无需特殊治疗即可康复[2]。
- 咳嗽
- 发热
- 疲劳
- 呼吸困难(严重病例)
推荐
阻断人与人之间的传播,包括减少密切接触者和医护人员之间的二次感染,防止传播放大事件,并防止进一步的国际传播[3]。
- 及早识别、隔离和护理患者,包括为受感染的患者提供优化的护理;
- 识别并减少动物源传播;
- 解决关于临床严重程度、传播和感染程度、治疗方案的关键未知问题,并加快诊断、治疗和疫苗的开发;
- 向所有社区传达关键风险和事件信息,并反驳错误信息;
- 通过多部门伙伴关系将社会和经济影响降至最低
数据
自 2020 年 1 月 22 日以来的新型冠状病毒(新冠肺炎)流行病学数据。从包括 DXY.cn 世界卫生组织(世卫组织)在内的各种来源的约翰·霍普斯金 CSSE 数据仓库加载数据。数据每天更新两次。
数据中可用的字段包括省/州、国家/地区、上次更新、确认、疑似、恢复、死亡。
2020 年 3 月 23 日,发布了新的数据结构。最新时间序列数据的现有资源有:
- 时间序列 _ covid19 _ 已确认 _ 全球. csv
- 时间序列 _ covid19 _ 死亡人数 _ 全球. csv
- 时间序列 _ covid19 _ 已恢复 _ 全局. csv
confirmed_df = pd.read_csv('[https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv'](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv'))recovered_df =
pd.read_csv('[https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_recovered_global.csv'](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_recovered_global.csv'))country_df = pd.read_csv('[https://raw.githubusercontent.com/CSSEGISandData/COVID-19/web-data/data/cases_country.csv'](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/web-data/data/cases_country.csv'))
墨西哥概述🇲🇽
墨西哥🇲🇽科维德仪表板(迭戈乌尔塔多)
🇲🇽概览(迭戈·乌尔塔多)
🇲🇽墨西哥州(第三)在死亡案例中排名第三
Choropleth 图死亡率
墨西哥🇲🇽(第 3 位)死亡案例第三位(迭戈·乌尔塔多)
🇲🇽墨西哥(#3)死亡率第三(迭戈乌尔塔多)
墨西哥死亡病例的年龄分布
🇲🇽墨西哥州(第三位)在死亡率上排名第三
🇲🇽墨西哥(#3)死亡率第三(迭戈乌尔塔多)
🇲🇽墨西哥(#3)死亡率第三(迭戈乌尔塔多)
墨西哥🇲🇽(排名第三)在危急情况中排名第四
墨西哥🇲🇽(第四)在死亡病例中排名第三
🇲🇽墨西哥各州概览
墨西哥的新冠肺炎:各州确诊病例总数(迭戈·乌尔塔多)
墨西哥的新冠肺炎:各州死亡病例总数(Diego Hurtado)
死亡人数最多的州是墨西哥城
墨西哥分析🇲🇽
墨西哥霍乱地图死亡病例密度(迭戈·乌尔塔多)
墨西哥的移动🇲🇽
尽管感染人数激增,墨西哥总统在 5 月开始了“T2 新常态”以“重新激活”经济
在商店外面,顾客们在等待,没有注意到健康距离。Av。CDMX Eje Central 的华雷斯角。2020 年 5 月 21 日。**图片:**angelica Escobar/福布斯墨西哥版。
观察:
我们可以看到,5 月份确诊和死亡病例开始成倍增长!!
墨西哥确诊病例和死亡之间的关系(Diego Hurtado)
确诊病例:
时间序列确诊病例墨西哥(迭戈乌尔塔多)
死亡病例:
时间序列确诊病例墨西哥(迭戈乌尔塔多)
死亡案例最多的州(墨西哥州)的交通行为
我们可以看到,当新常态开始时,流动性在 5 月份开始增长
“新常态是一种幻觉,我们正处于流行病活动中,我认为在这个时候提议重启社会活动实际上是自杀行为,我认为这会以前所未有的水平重新激活患病和死亡人数。”——马拉奎亚斯·洛佩斯·塞万提斯
🇲🇽卫生部
由于大量肺泡损伤和进行性呼吸衰竭,严重疾病发作可能导致死亡。新冠肺炎疫情对长期血液透析患者来说是高风险的,因为他们处于免疫抑制状态,年龄较大,并且存在显著的共病,特别是心血管疾病、糖尿病等。同样值得注意的是,心血管风险因素在墨西哥人口中非常普遍,并以惊人的速度增长,心血管疾病是墨西哥的第一大死亡原因[2]。
墨西哥死亡病例的年龄分布
墨西哥死亡病例的年龄分布
死亡人数最多的州(墨西哥州)死亡病例的年龄分布
墨西哥死亡病例的年龄分布
墨西哥疫苗🇲🇽
我们可以观察到,像以色列这样的国家 58%有第一剂,而墨西哥只有 0.5 %
接种疫苗百分比最高的 10 个国家
今天,根据最保守的估计,大约有 9 亿人住在贫民窟。据估计,到 2030 年,地球上将有 1/4 的人生活在贫民窟或其他非正规居住区。让我们来参观一下世界上最大的贫民窟:
- 开普敦的哈耶利沙(南非):40 万人
- 内罗毕的基贝拉(肯尼亚):70 万人
- 孟买的达拉维(印度):100 万
- 内扎(墨西哥):120 万
- 卡拉奇的奥兰治镇(巴基斯坦):240 万人
墨西哥城
人口:110 万
虽然有些人认为内扎华尔科约特城,也被称为内扎,已经从一个贫民窟演变成了一个郊区,但砖砌的房子散布在临时搭建的棚屋中,即使以饱受毒品战争折磨的墨西哥的标准来看,这个社区也被认为是极其危险的。社区行动促使政府将土地所有权正式化,开始垃圾收集,并建设其他一些关键的基础设施。现在,大约 70%的居民在该地区工作,这是墨西哥人口最稠密的直辖市。
2016 年 9 月 30 日,墨西哥墨西哥州内扎华科约特尔(Nezahualcóyotl)的鸟瞰图。汤森路透基金会/约翰尼·米勒
观察:
*显然,新冠肺炎在墨西哥的传播速度更快,死亡率更高,生活在贫民窟的人可能是这种情况下的一个关键因素。*也许这就是墨西哥冠状病毒病例不断增加的原因。
墨西哥需要采取行动
**对墨西哥新冠肺炎的预测性监控:**新冠肺炎预测对于合理化规划和心态至关重要,但也具有挑战性,因为复杂、动态和全球化的新冠肺炎疫情作为一个典型的棘手问题。传统的预测或预报努力的目标是现在做出准确的预测,以便在未来实现,但在这种极端不确定的情况下,这种努力可能会产生误导
墨西哥与拉丁美洲国家的相互关系
我从约翰霍普金斯大学新冠肺炎数据库中提取了新冠肺炎每日新增病例和拉丁美洲死亡病例。我使用线性回归来分别检验墨西哥和拉丁美洲国家之间的相关性。相关性最强的国家是巴西。
墨西哥和巴西之间的数据关系(Diego Hurtado)
有趣的是,这两个国家由一个左翼国家执政。
强占
流行病学家和健康经济学家 Eric Feigl-Ding 将墨西哥的冠状病毒阳性病例与纽约、马德里和伦巴第等城市的病例进行了比较,并警告说,墨西哥将经历的新冠肺炎检测阳性百分比是前所未有的。
这是因为半数以上的检测对病毒呈阳性。
德雷克丁。(2020 年 6 月 21 日)
“我为墨西哥哭泣。超过 50%是阳性的百分比,超过一半的测试者是阳性的,”这位科学家在推特上谈到冠状病毒病例时说。
德雷克丁。(2020 年 6 月 21 日)
墨西哥人均病例和死亡率与美国的对比。在墨西哥很明显诊断不足,治疗也很差。56%的阳性率反映了这一点。所以是的,该死的,我们需要更多的测试。
催单
1918 年的疫情流感是近年来最严重的疫情。它是由带有禽类基因的 H1N1 病毒引起的。尽管对病毒的起源没有普遍的共识,但它在 1918-1919 年间在世界范围内传播。
全世界死亡人数估计至少为 5000 万,其中约 675,000 例发生在美国。
5 岁以下、20-40 岁和 65 岁及以上人群的死亡率较高。健康人群的高死亡率,包括 20-40 岁年龄组的人群,是疫情的一个独特特征。
流感疫情图表(Reeve 003143),国家健康和医学博物馆
疫情流感| 1918 年和 1919 年期间美洲和欧洲的死亡率。图表:“疫情流感。1918 年和 1919 年间美国和欧洲的死亡率每周因各种原因造成的死亡,以每年每 1000 人的死亡率表示。包括代表纽约、伦敦、巴黎和柏林的线条。
我们到了。
流感疫情图表(Reeve 003143),国家健康和医学博物馆
结论:
这篇文章详细分析了新冠肺炎是如何影响墨西哥和世界的,以及由此得出的见解如何用于下游分析。这些图表还可以应用于其他场景,以推断关键的数据洞察力。
我希望你们都喜欢这篇文章。所有的图表都是使用 Plotly 创建的。Plotly 是一个非常棒的可视化库,用于构建交互式的图形。他们有 Python 和 JavaScript 的图形库。
领英:【https://www.linkedin.com/in/diego-gustavo-hurtado-olivares/
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
参考
[1]徐,郑,石,李,王,杨,张,黄,李,张,陈,… &泰,杨(2020).急性呼吸窘迫综合征相关新冠肺炎的病理表现。柳叶刀呼吸内科, 8 (4),420–422。
[2]m .卡斯塞拉、m .拉杰尼克、m .科莫、a .杜勒博恩、S. C .、r .迪那不勒斯(2020 年)。冠状病毒的特征、评估和治疗(新冠肺炎)。在 Statpearls【互联网】。StatPearls 出版社。
[3]世界卫生组织。(2020).冠状病毒疾病 2019(新冠肺炎):情况报告,72。
[4]“世界上最大的贫民窟:达拉维、基贝拉、Khayelitsha & Neza。”人类家园 GB ,2018 年 9 月 7 日,www . habitatforhumanity . org . uk/blog/2017/12/the-worlds-larvi-kibera-khayelitsha-neza/。
[5]“拥有世界上最大贫民窟的 8 个城市。”美国新闻&世界报道,美国新闻&世界报道,www . us News . com/News/cities/articles/2019-09-04/the-worlds-largest-贫民窟。
[6]墨西哥。(未注明)。从 https://ddi.sutd.edu.sg/portfolio/items/448588取回
[7]美国和欧洲 1918-1919 年流感死亡率图表|奥的斯历史档案国家健康和医学博物馆(http://www . Flickr . com/photos/medical Museum/5857153474/in/set-72157614214049255),由 CC-BY-NC-SA(http://creativecommons.org/licenses/by-nc-sa/2.0/uk/)授权
[8]德雷克丁。(2020 年 6 月 21 日)。神圣的 moly-我为墨西哥哭泣。https://twitter.com/DrEricDing/status/1274816278197342209
在命令行中使用 SQL 查询 CSV
通过命令行对 CSV 文件运行 SQL 的快速指南
如果你熟悉 SQL 中的编码,你很有可能在 PgAdmin 、 MySQL 、 BigQuery 、 SQL Server 等中使用它。但是有时您只想使用您的 SQL 技能对中小型数据集进行快速分析。
使用csvkit
,您可以在命令行中对 CSV 文件运行任何 SQL。
[csvkit](https://csvkit.readthedocs.io/en/latest/)
是一套命令行工具,用于转换和使用 CSV,表格文件格式之王。一旦你安装了csvkit
,你就可以使用csvsql
来运行你的 SQL 命令。
1.装置
如果你没有安装csvkit
,点击 这里 并按照安装说明操作,或者如果你熟悉pip
你可以做以下操作。
pip install csvkit
您可以使用以下方式查看csvkit
文档。
csvsql -h
2.句法
现在您已经设置好了,您可以按照这个简单的结构来运行您的查询。需要注意的是,SQL 查询必须用引号括起来,并且必须在一行中。没有换行。
csvsql --query "ENTER YOUR SQL QUERY HERE"
FILE_NAME.csv
就是这样!遵循这个基本的代码框架,你就可以开始了。
确保您与 CSV 文件位于同一个工作目录中。
3.例子
下面是一个设置目录并启动和运行我们的第一个 SQL 命令的例子。
检查目录
pwd
设置工作目录
确保您计划使用的文件位于同一目录中。我的 CSV 文件在/Documents
文件夹中。
cd ~/Documents
运行查询
接下来,我们可以使用csvsql
运行查询
密码
输出
用 csvlook 格式化查询输出
使用| **csvlook**
管道可以改善输出的查询格式。
密码
输出
将查询输出保存到新的 CSV 文件中
使用带有**>**
的重定向,您可以将查询输出发送到一个新的文件/位置。注意运行下面的代码不会输出任何东西,因为我们将输出保存到一个新文件中。新的查询将输出保存到新的 csv 文件**store_sales.csv**
你都准备好了!现在,您可以对 CSV 文件运行 SQL,无需通过数据库就能快速了解情况。
如果您想了解更多关于 SQL 的知识,请查看我的其他文章。
使用 Python、Pandas 和 Plotly 构建的旭日图以正确的方式分析客户行为
旭日图,有时也称为环形图、多层饼图或径向树形图( Anychart,n.d. )是可视化和理解分层或顺序数据的一种极好的方式。
旭日图有两个主要用例:
- 理解整体的最大贡献者和这些组成部分的比例
- 理解流程中连续步骤之间的人员流动
为了说明旭日图的用例,我将使用我生成的数据集来模拟客户在网站上完成购买的简单路径。(如果你想复制我的例子,数据集可以在我的 Kaggle 数据集中找到)
在这个假设的用例中,我们希望了解我们的客户在我们的网站上完成购买的最常见途径是什么,并比较访问我们的客户的行为是否与通过广告平台到达的客户不同。
值得一提的是,旭日图对于时间序列或连续数据来说并不理想,但对于层次性或序列性数据来说更理想。
有了基本的方法,让我们把无聊的熊猫数据框变成一个互动的旭日图,让我们找到一些见解。
要学习本教程,您需要在当前环境中安装以下库:
- Numpy
- 熊猫
- Plolty
我的大部分工作都是在 Jupyter 笔记本和 Jupyter 实验室中完成的,但是您可以随意使用您喜欢的任何 IDE。请参考 Plotly 入门文档 *,*尤其是如果你像我一样使用 Jupyter 工具的话。在 Jupyter 中第一次使用 Plotly 时,您必须运行几行代码,但我向您保证这并不复杂。
当您确信可以显示 Plotly 图形时,您可以通过导入上述带有常用别名的库开始,Plotly 提供了一个名为 Plotly Express 的高级 API,我们将使用它。
import numpy as np
import pandas as pd
import plotly.express as px
如果你正在使用我的数据集,并把它放在同一个工作目录中,你可以用下面的方法导入它,如果你正在使用其他数据集,请随意使用你最喜欢的方法把它作为一个熊猫数据框架。
df = pd.read_csv(‘path_to_purchase.csv’)
使用 Plotly Express 构建旭日图相当简单,尤其是从熊猫数据框架。我们必须指定的关键内容是使用 data_frame 参数的数据帧、使用的列以及使用 path 参数的它们的层次结构,以及将确定我们的 sunburst 图表中各部分的大小的列
fig = px.sunburst(
data_frame = df,
path = ['Segment', 'Customer Origin', 'First Click', 'Coupon Usage'],
values = 'Customer Count'
)
fig.show()
上面的代码生成了下面的图表:
还有一些格式改进的空间,我不会深入讨论这些参数的细节,但是这些关键字清楚地表明了它们的作用,所以它们对你来说不应该是一个问题。
通过添加以下代码行,我们可以生成一个更好看的图表:
fig =px.sunburst(
data_frame = df,
path = [‘Segment’, ‘Customer Origin’, ‘First Click’, ‘Coupon Usage’],
values = ‘Customer Count’,
title = ‘Paths to purchase’,
height = 700,
template = ‘ggplot2’
)
fig.show()
与 Matplotlib 不同,Plotly 的一个优点是它生成的图表是交互式的。这增加了一个可用性层,可以增强您的探索性分析,并在演示时提供令人惊叹的因素。想想 Tableau 或 Power BI,但可以通过 Python 获得。
通过利用这种可视化和交互性,我们现在可以在图表中看到以下内容:
- 大多数顾客都是有机地来到我们的网站
- 有机到达的顾客倾向于购买更多无折扣商品,但来自平台广告的顾客更喜欢有折扣的商品
- 最重要的是,来自广告平台并购买打折商品的顾客比其他类型的顾客更倾向于使用优惠券购物
当然,这将引发更多的问题,我们可以使用这些问题来推动进一步的分析,但旭日图使我们能够对数据进行快速探索。
分析数据并在 15 分钟内为一家电子商务初创公司提供可行的见解
这篇文章帮助你戴上数据科学家的帽子,分析一家电子商务初创公司的数据,提供可操作的见解。
由于有大量的在线资源可用于学习数据科学,本科生很难将自己与其他人区分开来,因为每个人都完成了相同的课程和类似的项目。在这种情况下,努力理解数据科学项目的典型工作流并在数据科学和机器学习之间划清界限就变得势在必行。一旦我们理解了其中的区别,学生就可以构建端到端的项目(对于数据科学概要文件来说更重要),而不仅仅关注 it 的数学方面(对于机器学习概要文件来说更合适)。
岗位描述
这篇博客展示了数据科学家的典型工作流程以及所有必须遵循的步骤。
我们将使用基本的 Python 库进行数据操作,使用基本的可视化库进行数据可视化,使用简单的机器学习库进行线性回归分析。
这不是最先进的(SoTA)实施,而是说明数据科学工作流基础的直观指南。
请注意,我们将为此使用Google Colab。请“”表示回购是你喜欢的。*
项目描述
在这篇博文的范围内,假设你是一名自由职业的数据科学家,你被纽约一家专门从事服装的在线电子商务公司聘为合同工。这家电子商务公司在网上销售服装,也有店内风格和服装建议会议。顾客来到店里,与私人造型师进行会谈/会面,然后他们可以回家,在手机应用程序或网站上订购他们想要的衣服。
从 UnSplash
该公司正试图决定是将精力集中在他们的移动应用程序体验还是他们的网站上。他们雇佣你来帮助他们解决这个问题!我们开始吧!
让我们试着分析一下客户数据(这是假的,不包含任何真实的信用卡号码或电子邮件)。
你也可以在 上关注这个我的 Github 这里 。
导入包
**import** **numpy** **as** **np**
**import** **pandas** **as** **pd**
**import** **matplotlib.pyplot** **as** **plt**
**import** **seaborn** **as** **sns**
%matplotlib inline
下面是允许您将文件上传到 Colab 文件的代码片段。我们将在笔记本中使用的数据在一个 CSV 文件中。该文件位于名为“E-commerce . CSV”的同一文件夹中
**from** **google.colab** **import** files
**import** **os**
uploaded = files.upload()
all_files = [(name, os.path.getmtime(name)) **for** name **in** os.listdir()]
latest_file = sorted(all_files, key=**lambda** x: -x[1])[0][0]customers = pd.read_csv('Ecommerce Customers')
customers.head()
一旦你运行这段代码,你应该会看到这样的输出——
现在我们已经上传了数据,我们已经看到了数据的“头部”,我们将更多地使用它。
我们将使用“describe()”和“info()”函数。输出应该是这样的—
探索性数据分析
既然我们已经处理了数据,让我们来研究一下。
我们将使用“Seaborn”来创建一个联合图,并比较以下各列-“花在网站上的时间”和“每年花费的金额”
sns.jointplot(data=customers,x='Time on Website',y='Yearly Amount Spent')
相关性有意义吗?
让我们用“App 上的时间”一栏重复这个过程。
sns.jointplot(data = customers, x='Time on App', y = 'Yearly Amount Spent')
现在让我们创建一个 jointplot 来比较“在应用上的时间”和“会员的时间长度”。
sns.jointplot(x='Time on App',y='Length of Membership', kind='hex',data = customers)
我们可以选择创建一个 Pairplot 来一次执行多个比较,而不是逐个执行。
sns.pairplot(customers)
问:根据这张图,什么看起来是与每年花费金额最相关的特征?
Ans —隶属关系长度
现在,让我们也创建一个每年花费金额与会员资格时间的线性模型。
sns.lmplot(x='Length of Membership', y='Yearly Amount Spent', data = customers)
机器学习(基础部分)
现在我们已经对数据进行了一些探索,让我们继续将数据分成训练集和测试集。将变量 X 设置为客户的数字特征,将变量 y 设置为“每年花费的金额”列。
我们将使用来自 Scikit Learn 的简单线性回归来训练我们的模型。
customers.columns
y = customers['Yearly Amount Spent']
X = customers [['Time on App','Time on Website', 'Length of Membership', 'Yearly Amount Spent']]
**from** **sklearn.cross_validation** **import** train_test_split
**from** **sklearn.linear_model** **import** LinearRegression
X_train, X_test, y_train, y_test = train_test_split(
... X, y, test_size=0.4, random_state=101)lm = LinearRegression()
lm.fit(X_train,y_train)
X_trainpredictions = lm.predict(X_test)
plt.scatter(y_test,predictions)
plt.xlabel('Y Test (True Values)')
plt.ylabel('Predicted Values')
模型评估
让我们通过计算残差平方和以及解释方差得分®来评估我们的模型性能。
**from** **sklearn** **import** metrics
**import** **pandas** **as** **np**
print('MAE', metrics.mean_absolute_error(y_test,predictions))
print('MSE', metrics.mean_squared_error(y_test,predictions))metrics.explained_variance_score(y_test,predictions)
sns.distplot((y_test-predictions))
讨论:我们回答了问题吗?
我们还是想搞清楚原问题的答案,我们是把精力放在手机 app 还是网站开发上?或者这根本不重要,会员时间才是真正重要的。让我们看看我们是否能解释这些系数来得到一个想法。
cdf = pd.DataFrame(lm.coef_,X.columns,columns=['Coeff'])
cdf
解释这些系数
- 保持所有其他功能不变,平均增加 1 个单位。会话长度与 25.98 美元的总花费的增加相关联。
- 在所有其他功能不变的情况下,App 上的时间每增加 1 个单位,总花费就会增加 38.59 美元。
- 在所有其他特征不变的情况下,网站时间每增加 1 个单位,总花费就会增加 0.19 美元。
- 在保持所有其他特征不变的情况下,会员时间每增加 1 个单位,总花费就会增加 61.27 美元。
问:现在该公司应该更关注他们的移动应用还是网站?
这很棘手,因为有两种思考方式——你可以开发网站来赶上移动应用程序的性能。
或者你可以开发更多的移动应用程序,因为它运行得更好。
这个问题的答案不是二进制的。这取决于很多因素——资源的可用性是其中之一。
也许有一个大的节日销售即将到来,你想增加你的销售。
或者,你可能正在寻求新一轮融资,而投资者对该应用的下载量很感兴趣。
决定这些取舍并不是一件容易的事情,通常由产品经理/业务分析师来完成。这就是团队合作、业务目标和收入目标的由来。
结束语
本笔记本的目的是说明典型数据科学项目的工作流程,解释数据科学职能如何与产品管理/业务分析师等其他职能协同工作。
真实世界中的数据集不会那么完美,会大得多,甚至在准备好进行处理之前,也可能需要大量清理。
然而,除了所使用的工具之外,整个过程与此非常相似。
— — — — — — — — — —
在这篇文章中表达的观点是我个人的,并不代表我现在或过去的雇主的观点。
我喜欢简化技术,分解围绕它的术语。如果你喜欢阅读,你可以在媒体和 LinkedIn 上关注我。万一我犯了什么错误,请毫不犹豫地告诉我。
使用 Choropleth 图分析全球 COVID 19 数据
Python 中与 Plotly 和 Folium 的比较
亚当·尼西奥鲁克在 Unsplash 上拍摄的照片
新冠肺炎无需介绍——它是最近席卷全球的传染病。那么,你有没有想过在过去的几个月里世界发生了怎样的变化?我们能想象几个月内不同国家的这种变化吗?
太多的问题,但我们有一个简单的答案——我们可以很容易地使用 Choropleth 地图,我会用最少的编码要求使它变得简单。
所以事不宜迟,让我们开始吧:
这将是我们今天的议程:
- 什么是 Choropleth 地图
- 叶子简介
- 使用叶绘制的 Choropleth 图
- 关于 plotly 的简介
- 使用 plotly 绘制 Choropleth 地图
- choropleth 映射的一些限制
1.什么是 Choropleth 地图
Choropleth 是基于统计变量或数据变量划分不同地理区域的地图或显示。这是一种专题地图,根据所考虑的变量和该变量在一个区域中所占的比例,对不同的区域进行着色。例如:考虑下面的图 1,它显示了不同国家的人均 GDP:
图 1:人均 GDP:作者图片
该地图使用与人均 GDP 相关的色阶来表示上图中的不同国家。
因此,创建 choropleth 地图需要两件重要的事情:
a)具有地理边界的地理空间数据,如 geo json 文件和
b)颜色编码的变量或数据点
2.叶子简介
Folium 是 Python 中的一个库,可用于可视化地理空间数据。fleed . js 是一个用于创建地图的 java 脚本库,为了创建漂亮的交互式地图,它将 fleed 的功能与 python 的数据处理能力(即清理复杂的数据集并将其转换为简单的格式)相结合。
follow 有助于绑定数据以创建 choropleth 之类的地图,还支持 HTML 可视化的标记功能。
不同的地图投影也可以像正交,自然地球等和不同的地图瓷砖像地图框,雄蕊调色剂等。
现在让我们考虑全局 COVID 19 数据集来创建 choropleth 图。您可以在参考资料中获得数据集链接。
3.使用叶绘制的 Choropleth 图
a)首先,我们需要生成基本地图。以下代码可用于此:
m = folium.Map(tiles = 'Stamen Terrain',min_zoom = 1.5)
display(m)
我们将得到这样的输出:
图 2:作者的底图
b)我们必须从 this 链接获取地理数据,然后生成 choropleth 地图层,如下所示:
url = '[https://raw.githubusercontent.com/python-visualization/folium/master/examples/data'](https://raw.githubusercontent.com/python-visualization/folium/master/examples/data')
country_shapes = f'{url}/world-countries.json'folium.Choropleth(
geo_data = country_shapes,
min_zoom=2,
name='Covid-19',
data=df,
columns=['Country', 'Confirmed'],
key_on='feature.properties.name',
fill_color='OrRd',
nan_fill_color='black',
legend_name = 'Total Confirmed COVID cases',
).add_to(m)
m
c)现在,我们将为具有该代码的每个国家添加带有确诊病例详细信息的标记。标记可以定制,我们在这里使用圆形标记:
def plotDot(point):
folium.CircleMarker(location = (point.latitude, point.longitude),
radius = 5,
weight = 2,
popup = [point.Country, point.Confirmed, point.Recovered],
fill_color = '#000000').add_to(m)covid_df.apply(plotDot, axis = 1)
m.fit_bounds(m.get_bounds())
m
这是带有已确认和已恢复病例标记的最终输出。我们可以将鼠标悬停在标记周围,按国家查看确诊和恢复病例的数量。在下图中,突出显示了印度的标记:
图 3:带有标记的 Choropleth 叶地图:作者提供的图片
现在,我们可以使用 plotly 创建一个类似的地图。
4.关于 plotly 的简介
Plotly 是一个开源的 Python 可视化库。它也可以用来创建 html 可视化的伟大的动画。与 leav 一样,这些图形是交互式的,并带有动画特性。它构建在 plotly.js 之上,可视化也可以保存为图像。它还提供了许多定制和样式选项,实现非常简单。它还与 dash 兼容,这使得它很容易嵌入到博客或其他网络应用程序中。
Dash 是一个用于构建分析应用程序的开源框架,不需要 Java 脚本,并且与 Plotly 图形库紧密集成。点击了解更多。
随着更多的观察,plotly 可能会导致性能问题。建议离线使用。
5.使用 Plotly 绘制 Choropleth 地图
现在让我们用 plotly 来构造 choropleth 图。这可以通过使用具有相同数据集的简单代码来实现,如下所示:
fig = px.choropleth(df , locations = 'Country', locationmode = 'country names', color = 'Confirmed'
,animation_frame = 'Date')
fig.update_layout(title_text = 'Global spread of Covid19')
fig.show()
输出如下所示:
图 4: Plotly Choropleth 地图(作者图片)
在这里,我们可以看到按日期排列的动画窗格,它提供了几个月来确诊病例如何在不同国家传播以及病例增长率的视图。
动画冠状动脉分布图:数月来冠状病毒的全球传播(作者作者
地图的 HTML 可视化可以使用一行代码保存,您可以在这里访问地图的 HTML 版本。
import plotly.offline as py# html file
py.offline.plot(fig, filename='C:/plotlyplots/Global_covid.html')
总结:
我们今天学习了如何使用两个不同的 python 库来创建带有新冠肺炎数据的 choropleth 地图。Plotly 在地图中通过简单的缩放、过滤和动画选项在该领域真正得分。但是,没有添加自定义标记的选项。叶尤其有助于 choropleth 和其他地图。自定义选项,如自定义弹出窗口、自定义平铺、标记和其他功能,使 Folium 成为一个可行的竞争者。此外,Folium 是专为可视化地理空间数据而构建的,而 Plotly 的用途要广泛得多。
Choropleth 地图上最后几个字:
Choropleth 地图有利于整体观察,但一个国家/地区内的一些变化可能会被遗漏,因为它假设整个区域具有相同的值。很少有其他 限制 为好,比如:
a)使用绝对计数有时会产生误导,最好使用标准化的测量单位,如比例/比率
b)边界可能不连续,大面积可能会占据显示屏。
c)由于关于数据如何分类的分类问题,可能存在准确性问题。具有图形值的未分类 choropleth 图可以消除分类中的信息损失。
尽管有这些限制,但 choropleth 图仍是进行实证研究和地理空间分析的一种非常有用的方法。
如果你有任何问题,请联系我,并留下你的意见。
完整的代码可以在 Github 上获得。
可以通过媒体、 LinkedIn 或 Twitter 联系到我。
参考文献 :
[1] Jochen Schiewe,关于 Choropleth 地图中空间模式视觉感知的实证研究 (2019),Springer
[2] Jeffrey S. Torguson, Choropleth 地图 (2017),威利在线图书馆
[3]Robert G . Cromley 和 Ellen K Cromley, Choropleth 地图图例设计用于可视化社区健康差异 (2009 年),《国际卫生地理杂志》
[3]Python 中的 Choropleth 地图,Plotly 文档
[4]Python 中的 Choropleth 地图,leav 文档
[5]约翰·霍普斯金大学,新冠肺炎数据集参考文献
分析纽约时报新冠肺炎数据集
创建一个简单的 Python 类来分析和可视化来自纽约时报的新冠肺炎数据集。
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
介绍
自第二次世界大战以来最大的全球性危机和自 1918-1919 年西班牙流感以来最大的全球性疫情今天就在我们面前。
每个人都在关注死亡人数的每日上升,以及这种新型病毒的快速指数传播。
有一些非常丰富的数据可视化和分析仪表板来跟踪世界各地发生的事情。
仪表盘从 开始
然而,如果能够自己编写简单的 Python 代码,并为不断出现的所有这些数据绘制趋势线或条形图,岂不是很棒?你想并排比较美国各州的趋势吗?你如何验证华盛顿的封锁和社交距离措施是否奏效?
在本文中,我们将快速展示如何从易于访问的数据集中创建阳性病例和死亡人数的快速图表。
注意:这不是一个预测模型,将来也不会是。这个项目的目标是只做视觉分析。没有扎实的流行病学知识或没有合作,人们不应该仅仅从时间序列数据中建立任何预测模型。
纽约时报数据集
《纽约时报》是新闻业的一个神圣的名字,它正在做他们最擅长的事情——在新冠肺炎问题上带来高质量、数据驱动、客观的分析、事实和观点。 他们制作了所有与新冠肺炎相关的文章,供世界上的任何人免费阅读 ,也就是说,把它们从付费墙后面拿出来。
专注于美国各州和县,他们也一直维护一个简单而全面的数据集,用于他们的日常地图。
然而,如果能够自己编写简单的 Python 代码,并为不断出现的所有这些数据绘制趋势线或条形图,岂不是很棒?你想并排比较美国各州的趋势吗?
包含重要信息的简单数据集
NYT 数据集易于使用和探索,因为它只列出了大多数人感兴趣的数据片段,
- 案例数量
- 死亡人数
并且,它包含了自 1 月下旬以来的数据,即华盛顿州首次报告病例的时间。
但是,我们将会看到,利用这组简单的数据,可以创建相当多有趣的可视化效果。
没有恢复数据
你可能会问为什么它不记录恢复的次数。这听起来可能是明智之举,但要记录这个数字却非常困难。这是因为许多病例,甚至是未报告的病例,都属于这一类——人们无需去医院就能自动康复。在大多数这样的情况下,数据没有得到适当的维护(如果这个人住院的话就会这样)。
因此,我们不应该太担心没有这些数据,因为在没有适当控制的收集相关信息的方式的情况下,这些数据不应该用于简单的绘图和模型中。
只有累积数据
《纽约时报》数据集的一个缺陷是,它仅以累积的方式获取新冠肺炎病例和死亡数据。然而,当谈到可视化时,人们对累积的和每天的数据都感兴趣。
尽管累积数据提供了病毒总体影响/传播的感觉,但每天的新病例数据提供了传播速度的良好指示,并可以告诉我们它是否显示出任何放缓的迹象。
所谓的“疫情高峰”只能在新增病例或死亡的逐日图表中看到,因为累积图表只会显示单调增加的趋势。
因此,我们处理数据集来提取这些信息。
我们的 Python 脚本
简单的面向对象设计
为了保持面向对象软件设计的良好实践,我们决定编写一个 Python 类,它可以将原始数据和实用方法封装在一个容器中。
直接从纽约时报 Github 获取数据
这个想法是要与时俱进,因为全国的情况每天(事实上,每小时)都在变化。《纽约时报》的人似乎每天都在某个时间更新数据集,并在他们的 Github repo 上保持相同的文件名。因此,我们有一个简单的方法直接从他们的 Github repo 中提取数据并更新内部数据集。
查看数据集
一个简单的 peek 方法可以让我们在进一步处理之前快速查看原始数据。请记住,“病例”和“死亡”列仍然是此时的累积数据。
创建州级和县级数据集
《纽约时报》的默认数据集是一个平面 CSV 文件,其中有一列是州或县的名称,但它不适合绘制新冠肺炎病例或比率(按州或县)。
我们使用简单的 Pandas 过滤技术创建内部字典来存储每个州和县的数据。更重要的是,这是动态的,并且与最新版本的数据相关联。因此,如果某个县今天出现了第一例病例,那么该县只会在今天出现在我们的内部数据集中,而不会在此之前出现。
也是在这种州级和县级数据中,我们提取了每天的新增病例和新增死亡病例。第一行将显示 NaN,因为在此之前没有数据。
尽管累积数据提供了病毒总体影响/传播的感觉,但每天的新病例数据提供了传播速度的良好指示,并可以告诉我们它是否显示出任何放缓的迹象。
条形图
现在,是时候将这些州级或县级数据可视化为时间序列了。同样,Jupyter 笔记本中给出了函数的详细信息。用户可以简单地传递一个州的名称,
- 累积案例
- 累积死亡人数
- 每天新病例
- 每天新增死亡人数
仅最近 30 天的数据
用户还可以选择只绘制最近 30 天的数据,而不是绘制 1 月下旬以来的所有数据。
比较线图
统计数据中最受争议和关注的一个问题是,各州对新冠肺炎病例的处理情况如何。我们提供了一个简单的函数来并排绘制任意数量的状态。用户必须传递一个州名列表。
各州排名
尽管听起来很可怕,但毫无疑问,我们总是在辩论各州在阳性病例和死亡的严峻统计数据方面的排名。
一个简单的方法允许你绘制排名靠前的州的条形图。此外,您可以选择一个特定的日期来创建这个排名图,这样您就可以检查各州的相对位置是如何随时间变化的。
例如,我们在下图中绘制了 2020 年 3 月 22 日排名前 4 的州。
更多待添加
本文的主要目标是展示任何人,即使是对 Python 数据分析有初步了解的人,都可以快速完成一个小项目,从基于 web 的来源提取数据并创建方便的可视化。
又一个重要的提示。
这不是一个预测模型,将来也不会是。这个脚本的目标是只做可视化分析。没有扎实的流行病学知识或没有合作,人们不应该仅仅从时间序列数据中建立任何预测模型。
这是一项正在进行的工作,更多的可视化可以稍后添加。也欢迎其他数据科学家同事利用这种方法,使用我的代码并对其进行扩展。请让我知道你是否用它来进行分析和可视化。
再次, 演示 Jupyter 笔记本在这里 。
如果您有任何问题或想法要分享,请通过tirthajyoti【AT】Gmail . com联系作者。此外,您还可以查看作者的 GitHub 知识库,获取机器学习和数据科学方面的代码、思想和资源。如果你和我一样,对人工智能/机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我或在 Twitter 上关注我。
[## Tirthajyoti Sarkar - Sr .首席工程师-半导体、人工智能、机器学习- ON…
通过写作使数据科学/ML 概念易于理解:https://medium.com/@tirthajyoti 开源和有趣…
www.linkedin.com](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)