数据分析师——可能是所有数据专业人员中最直接的职位。破译数据分析师的工作并不需要太多思考。叫我显而易见的队长吧:数据分析师分析数据。
当然,他们需要多种技能,如数据可视化、分析思维、沟通和商业智能。
但为了充分利用这些技能,他们必须以某种方式处理和分析数据。处理大型数据集需要掌握一两种编程语言。数据分析中最流行的两种语言可能是SQL和Python。
(相关资料图)
在大多数数据分析工作中,您每天都会用到它们。难怪这些职位的面试主要围绕着测试你的SQL和Python技能。
让我向你展示几个典型的面试例子,测试对任何数据分析师都有用的不同技术概念。这在CPDA数据分析师的课程中,经常使用到,非常的实用!
数据分析师SQL面试问题
问题1:第一名的日子(PostgreSQL)
“找出美国歌曲在美国和全球排名中保持第一的天数。在第一个位置输出赛道名称和天数。按音轨名称的字母顺序排列输出。
如果数据集中出现“US”区域,则应将其包含在全球排名中。”
这是问题的链接,如果你想跟我一起看的话。
技术概念
这个问题需要你了解以下SQL概念:
•数据聚合
•子查询
•case声明
•窗口函数
•连接
•数据过滤
•数据分组
•数据排序
这些也是数据分析师最常使用的概念。
解决方案与输出
熟悉下面的代码,然后我将解释它。此代码是用PostgreSQL编写的。
SELECT
trackname,
MAX(n_days_on_n1_position) AS n_days_on_n1_position
FROM
(
SELECT
us.trackname,
SUM(
CASE WHEN world.position = 1 THEN 1 ELSE 0 END
) OVER(PARTITION BY us.trackname) AS n_days_on_n1_position
FROM
spotify_daily_rankings_2017_us us
INNER JOIN spotify_worldwide_daily_song_ranking world ON world.trackname = us.trackname
AND world.date = us.date
WHERE
us.position = 1
) tmp
GROUP BY
trackname
ORDER BY
trackname;
我将从子查询开始解释。它的目的是寻找在美国和全球排名第一的歌曲。
这个子查询使用CASE语句设置条件,该语句搜索全球第一个位置的音轨。该语句是SUM()窗口函数的一部分。它返回满足条件的每个轨道作为第一名花费的天数。
为此,您需要使用来自两个可用表的数据,并且需要join。在本例中,它是INNER JOIN,因为您只对来自两个表的音轨感兴趣。在曲目名称和日期上联接表。
问题要求您只输出排名第一的曲目。您需要使用WHERE子句来过滤数据以获得该值。
然后在主SELECT语句中使用子查询。主查询引用子查询,并使用MAX()聚合函数和GROUP BY按轨道返回第一个位置上最长的条带。
最后,结果按曲目名称的字母顺序排序。
trackname | n_days_on_n1_position |
Bad and Boujee (feat. Lil Uzi Vert) | 1 |
HUMBLE. | 3 |
如果你需要更多关于如何处理这个数据分析师面试问题的说明,我和我的团队准备了一个演练视频,可能会有所帮助。
问题2:旅程和用户(MySQL)
“取消率的计算方法是将当天取消的(客户端或驱动程序)未禁用用户的请求数量除以当天未禁用用户的请求总数。
编写一个SQL查询,计算从“2013-10-01”到“2013-10-03”期间,每天未禁用用户(客户端和驱动程序都不能禁用)的请求取消率。四舍五入取消率到两位小数点。
以任意顺序返回结果表。
查询结果格式如下所示。
如果你想跟随我,这里是这个数据分析师面试问题的链接。
技术概念
要解决这个问题,您将需要前面使用的大部分概念。然而,也有一些额外的:
•cte
•四舍五入
•转换数据类型
解决方案与输出
解决方案是用MySQL编写的。
WITH stats AS
(SELECT request_at,
t.status <>"completed" AS canceled
FROM trips t
JOIN users c ON (client_id = c.users_id
AND c.banned = "no")
JOIN users d ON (driver_id = d.users_id
AND d.Banned = "no")
WHERE request_at BETWEEN "2013-10-01" AND "2013-10-03" )
SELECT request_at AS Day,
ROUND(CAST(SUM(canceled) AS FLOAT)/CAST(COUNT(*) AS FLOAT), 2) AS "Cancellation Rate"
FROM stats
GROUP BY Day
ORDER BY Day;
我们先来看CTE;这个叫stats。它是一个SELECT语句,返回请求的日期及其状态,其中状态不是“completed”。换句话说,请求被取消。
客户端或驱动程序都可以取消请求。因此这个查询需要JOIN两次。第一次,旅行与用户联合起来,让未被禁止的客户端取消请求。另一个JOIN使用相同的表来获取被驱动程序取消的请求。
这个数据分析师面试问题要求只包括特定的日期,这个标准在WHERE从句中说明了。
现在是另一个引用CTE的SELECT语句。它将取消的请求数除以请求总数。这是使用两个聚合函数完成的:SUM()和COUNT()。此外,比率必须更改为十进制数,并四舍五入到小数点后两位。
最后,输出按天分组并排序
Day | Cancellation Rate |
2013-10-01 | 0.33 |
2013-10-02 | 0 |
2013-10-03 | 0.5 |
数据分析师Python面试问题
问题3:产品族
“首席营销官感兴趣的是了解不同产品系列的销售如何受到促销活动的影响。为此,对于每个产品系列,显示销售的总数量,以及在销售的总数量中有有效促销的销售单位的百分比。如果结果中有null,则将它们替换为零。促销是有效的,如果它不是空的,它包含在促销表中。”
这是问题的链接,如果你想跟我一起看的话。
技术概念
用Python进行数据分析是数据分析师非常欣赏的技能之一,通常是强制性的技能。虽然Python为数据分析提供了很多可能性,但这通常是不够的。您还必须使用不同的数据分析库,如Pandas和NumPy。
在解决这个数据分析师面试问题时,您需要熟练使用以下概念:
•合并()
•lambda函数
•isna ()
•独特的()
•groupby ()
•数据聚合
•使用数据框架
解决方案与输出
下面是如何在Python中解决这个问题。
import pandas as pd
merged = facebook_sales.merge(
right=facebook_products, how="outer", on="product_id"
)
merged["valid_promotion"] = merged.promotion_id.map(
lambda x: not pd.isna(x)
and x in facebook_sales_promotions.promotion_id.unique()
)
valid_promotion = merged[merged.valid_promotion]
invalid_promotion = merged[~merged.valid_promotion]
result_valid = (
valid_promotion.groupby("product_family")["units_sold"]
.sum()
.to_frame("valid_solds")
.reset_index()
)
result_invalid = (
invalid_promotion.groupby("product_family")["units_sold"]
.sum()
.to_frame("invalid_solds")
.reset_index()
)
result = result_valid.merge(
result_invalid, how="outer", on="product_family"
).fillna(0)
result["total"] = result["valid_solds"] + result["invalid_solds"]
result["valid_solds_percentage"] = (
result["valid_solds"] / result["total"] * 100
)
result = result[
["product_family", "total", "valid_solds_percentage"]
].fillna(0)
让我们看一下代码。首先,我使用正确的外部方法合并facebook_sales和facebook_products。
然后我使用新的列valid_promotion来查找在有效促销下的销售。换句话说,在销售和促销数据中找到促销ID。
之后,我将输出分成有效销售和无效销售。这两种类型的销售按产品族进行汇总和分组。
这两个dataframe再次合并,以按产品类型显示有效和无效的销售。NA值替换为0。
现在我得到了这些值,我可以找到有效销售额的百分比。
最后,输出显示产品族、总销售额和有效销售额百分比。
product_family | total | valid_solds_percentage |
CONSUMABLE | 103 | 100 |
GADGET | 86 | 76.744 |
ACCESSORY | 0 | 0 |
这里有一个关于这个解决方案的视频演练。
问题4:3最接近的和
给定一个长度为n的整数数组nums和一个整数目标,在nums中找到三个整数,使它们的和最接近目标。
返回三个整数的和。
你可以假设每个输入都只有一个解。”
这是问题的链接,如果你想跟我一起看的话。
技术概念
数据分析师不需要经常编写算法。但当他们这样做时,这可能有助于他们进行数据分析。这个数据分析师面试问题就是这样一个例子,因为它要求你找到最接近目标的和。这或类似的东西是用Excel中的求解器完成的。
但为什么不更复杂一点呢?这种复杂性需要了解以下概念:
•定义函数
•定义数据类型
•数据排序
•for循环
•范围()
•莱恩()
•abs ()
解决方案与输出
这个算法是这样写的。
class Solution:
def threeSumClosest(self, nums: List[int], target: int) ->int:
diff = float("inf")
nums.sort()
for i in range(len(nums)):
lo, hi = i + 1, len(nums) - 1
while lo < hi:
sum = nums[i] + nums[lo] + nums[hi]
if abs(target - sum) < abs(diff):
diff = target - sum
if sum < target:
lo += 1
else:
hi -= 1
if diff == 0:
break
return target - diff
首先,定义函数threesumnearest。输入、输出和差异数据必须是整数,因此将它们定义为整数并对输入数组进行排序。
然后创建for循环并定义当前位置和指针。之后是为循环设置标准。
当lo指针在hi指针下面时,它们的和是它们的和加上当前位置。
如果目标值与结果差值的绝对值小于绝对值差值,则将差值设置为target - sum。
如果结果低于目标值,则将lo指针加1。如果不是,则将hi指针减少1。如果差值为零,则结束循环并显示输出,即目标值减去差值。
这是情形1和算法输出。
Input |
nums = [-1,2,1,-4] |
target = 1 |
Output |
2 |
And for Case 2:
Input |
nums = [0,0,0] |
target = 1 |
Output |
0 |
总结
这四个数据分析师面试问题只是例子。当然,这些并不是你在面试前需要回答的唯一问题。
然而,它们是你可以期待的很好的例子。此外,我仔细选择了它们,以便它们涵盖了数据分析师需要的大部分SQL和Python概念。
剩下的就靠你了!练习用SQL和Python编写代码,并尽可能多地解决实际的数据分析师面试问题。但也不要忘记使用其他资源和练习其他数据分析技能。
编码很重要,但不是一切。