Ozon · декабрь 2025

Тех собес на junior Аналитик Данных в Ozon

junior Тех собес 12 вопросов 5 задач
1

Мат стат

1. Что такое нормальное распределение и каковы его основные свойства?

2. Что такое доверительный интервал, и как он используется в анализе данных?

3. Объясни разницу между корреляцией и причинно-следственной связью. Можешь привести пример?

2

Базы данных

4. Что такое репликация? Что такое партиционирование? Что такое шардирование?

5. Чем различаются команды DELETE, TRUNCATE и DROP в SQL?

6. Что такое нормализация и зачем она нужна?

7. Объясните разницу между HAVING и WHERE в SQL.

3

Python

8. Что выведет следующий код:

import pandas as pd

df = pd.DataFrame({
    'col1': [1, 2, 2, 3],
    'col2': ['A', 'B', 'A', 'B']
})
result = df.groupby('col2')['col1'].sum()
print(result)

9. Что выведет следующий код:

def make_counter():
    count = [0]
    def increment():
        count[0] += 1
        return count[0]
    return increment

counter = make_counter()
print(counter())
print(counter())

10. Что выведет следующий код:

import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})
df['C'] = df.apply(lambda row: row['A'] * row['B'], axis=1)
print(df)

11. Что выведет следующий код:

try:
    x = int("hello")
except ValueError:
    print("Caught ValueError")
finally:
    print("Finally block executed")

12. Что выведет следующий код:

def modify_list(lst):
    lst.append(4)
    lst = [1, 2, 3]
    return lst

my_list = [0]
result = modify_list(my_list)
print(my_list)
print(result)
4

SQL

Условие

Таблица Activity:

player_id device_id event_date games_played
1 2 2016-03-01 5
1 2 2016-03-02 6
2 3 2017-06-25 1
3 1 2016-03-02 0
3 4 2018-07-03 5

13. Задача: Нужно найти долю игроков, которые вошли в игру на следующий день после первого входа. Результат необходимо округлить до двух знаков после запятой. Важно подсчитать, сколько игроков вошли в игру хотя бы два дня подряд, начиная с их первого дня, и разделить это количество на общее количество игроков.

WITH next_day_players AS (
  SELECT DISTINCT player_id AS next_day_player
  FROM activity a1 JOIN activity a2 ON a1.event_date=a2.event_date - INTERVAL '1 day' AND a1.player_id=a2.player_id
)

SELECT COUNT(next_day_player)
FROM activity
WITH next_day_players AS (
  SELECT player_id, event_date, LEAD(event_date) OVER(PARTITION BY player_id) as next_playdate, ROW_NUMBER() OVER(PARTITION BY player_id ORDER BY event_date) as rnk
  FROM activity
)

SELECT COUNT(DISTINCT player_id) FILTER(WHERE next_playdate - INTERVAL '1 day' = event_date) / COUNT(DISTINCT player_id)
FROM next_day_players
WHERE rnk=1
5

Python

Условие

Вам предоставлен набор данных о продажах продуктов в различных магазинах за последние 5 лет. Данные содержат информацию о дате покупки, категории товара, количестве проданных единиц и общей сумме продаж.

14. Задача: Проверьте датасет на аномальные значения, если они есть то предложите пример решения проблемы.

15. Задача: Проведите исследовательский анализ данных (EDA): оцените изменение продаж по месяцам, выявите категории с наибольшими и наименьшими объемами продаж, постройте график сезонных колебаний продаж, определите наличие статистически значимых различий в среднем объеме продаж между городами.

16. Задача: Постройте дашборд с основными метриками (выручка, количество заказов, средний чек).

17. Задача: Сформулируйте рекомендации по увеличению продаж на основе проведенного анализа.

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('/content/sales_data.csv', sep=';')
df.head()

Дополнительно

Тестирование состоит из 4 частей: вопросы по мат. стат. и БД (1 задание), Python (5 заданий), SQL (1 задание) и аналитическая задача. Максимальное количество баллов: 20, продолжительность 90 минут. Позиция предполагает работу в команде продуктовой аналитики ИТ Маркетплейса или в команде HR-аналитики.