Вступление
Вы когда-нибудь открывали CSV-файл и с ужасом обнаруживали пропуски, дубликаты, странные форматы дат и выбросы, которые искажают всю картину? Знакомая ситуация: аналитик тратит 80% времени на очистку данных, и лишь 20% — на сам анализ. А потом приходит стейкхолдер и спрашивает: «Почему продажи упали?» — и вы понимаете, что данных для ответа недостаточно.
В 2026 году мы можем автоматизировать рутину с помощью больших языковых моделей. Но чтобы получить качественный результат, нужны правильные промты. В этой статье я собрал 11 проверенных сценариев — от первичной очистки до визуализаций, которые убедят даже самого скептичного руководителя. Каждый промт содержит задачу, готовый текст для копирования и пример результата.
Я тестировал эти промты на реальных проектах: датасеты по продажам, логи веб-сервера, опросы клиентов. Все примеры кода рабочие, используют актуальные версии pandas 2.2+, plotly 5.18+.
1. Быстрый аудит грязного датасета
Задача: за 2 минуты понять, какие проблемы есть в данных, прежде чем писать код.
Промт:
Проанализируй датасет
sales.csvс колонками:order_id,date,customer_email,amount,product_category,region. Напиши функции на Python, которые выведут: количество пропусков, уникальные значения для категориальных полей, распределение числовых колонок, примеры строк с аномалиями. Используй pandas и numpy.
Пример результата:
import pandas as pd
import numpy as np
df = pd.read_csv('sales.csv')
print('Пропуски:')
print(df.isnull().sum())
print('\nУникальные категории:')
for col in df.select_dtypes(include='object'):
print(f'{col}: {df[col].nunique()} значений, примеры: {df[col].unique()[:5]}')
print('\nЧисловые распределения:')
print(df.describe())
# Аномалии: отрицательные суммы
anomalies = df[df['amount'] < 0]
print(f'\nОтрицательные amount: {len(anomalies)} строк')
Этот промт экономит часы ручного исследования. LLM сгенерирует код, который сразу покажет «болевые точки».
2. Очистка пропусков с умом
Задача: не просто удалить NaN, а выбрать стратегию: заполнить средним, медианой, интерполяцией или оставить как есть.
Промт:
В датасете
dfесть пропуски в колонкахage(числовая),income(числовая),education(категориальная). Предложи оптимальные методы заполнения для каждой колонки, обоснуй выбор и напиши код с использованием pandas. Учти, что пропуски вincomeмогут быть не случайными (MNAR).
Пример результата:
LLM предложит: для age — медиану (устойчива к выбросам), для income — не заполнять, а создать индикатор пропуска, для education — моду. Код:
df['age'] = df['age'].fillna(df['age'].median())
df['income_missing'] = df['income'].isna().astype(int)
df['education'] = df['education'].fillna(df['education'].mode()[0])
3. Борьба с дубликатами и почти-дубликатами
Задача: найти точные и нечёткие дубликаты (например, «ООО Ромашка» и «Ромашка ООО»).
Промт:
Напиши функцию для поиска почти-дубликатов в колонке
company_nameс помощью нечёткого сравнения (fuzzy matching). Используй библиотекуthefuzz(илиrapidfuzz). Порог сходства 85%. Выведи пары и предложи, как их объединить.
Пример результата:
from rapidfuzz import fuzz, process
def find_duplicates(names, threshold=85):
matches = []
for i, name in enumerate(names):
for j in range(i+1, len(names)):
score = fuzz.ratio(name, names[j])
if score >= threshold:
matches.append((name, names[j], score))
return matches
duplicates = find_duplicates(df['company_name'].unique())
print(duplicates[:5])
4. Приведение типов и парсинг дат
Задача: автоматически преобразовать строки в datetime, числа, категории, обработать ошибки.
Промт:
В датасете
dfколонкаdateсодержит даты в разных форматах: '2025-01-15', '15/01/2025', 'Jan 15, 2025'. Колонкаprice— строки с '$' и запятыми. Напиши код для приведения к правильным типам с обработкой ошибок и логированием проблемных строк.
Пример результата:
df['date'] = pd.to_datetime(df['date'], format='mixed', errors='coerce')
df['price'] = df['price'].str.replace(r'[$,]', '', regex=True).astype(float)
# Логирование неудачных преобразований
failed_dates = df[df['date'].isna()]
if not failed_dates.empty:
print(f'Не удалось распарсить {len(failed_dates)} дат:')
print(failed_dates[['date']].head())
5. Обработка выбросов: не удалять, а анализировать
Задача: выявить выбросы и решить, что с ними делать — удалить, заменить или оставить для отдельного анализа.
Промт:
Предложи методы обнаружения выбросов в колонке
transaction_amount(IQR, Z-score, Isolation Forest). Напиши код для визуализации выбросов с помощью plotly и выведи статистику: сколько выбросов, какова их доля, какие значения. Обоснуй, стоит ли их удалять.
Пример результата:
import plotly.express as px
Q1 = df['transaction_amount'].quantile(0.25)
Q3 = df['transaction_amount'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = df[(df['transaction_amount'] < lower) | (df['transaction_amount'] > upper)]
print(f'Выбросов: {len(outliers)} ({len(outliers)/len(df)*100:.2f}%)')
fig = px.box(df, y='transaction_amount', title='Распределение сумм транзакций')
fig.show()
6. Feature engineering: создаём новые признаки
Задача: из существующих колонок извлечь максимум пользы для модели или анализа.
Промт:
На основе колонок
date,amount,categoryсоздай новые признаки: день недели, месяц, квартал, признак выходного, логарифм суммы, отношение суммы к средней по категории. Напиши код на pandas.
Пример результата:
df['day_of_week'] = df['date'].dt.dayofweek
df['month'] = df['date'].dt.month
df['is_weekend'] = df['day_of_week'].isin([5,6]).astype(int)
df['log_amount'] = np.log1p(df['amount'])
df['amount_vs_category_avg'] = df['amount'] / df.groupby('category')['amount'].transform('mean')
7. Группировка и агрегация для бизнес-метрик
Задача: быстро посчитать ключевые показатели по группам.
Промт:
Сгруппируй данные по
regionиproduct_category, посчитай: общую сумму продаж, средний чек, количество заказов, долю от общей суммы. Отсортируй по убыванию суммы. Выведи топ-10 групп.
Пример результата:
grouped = df.groupby(['region', 'product_category']).agg(
total_sales=('amount', 'sum'),
avg_check=('amount', 'mean'),
orders=('order_id', 'count')
).reset_index()
grouped['share'] = grouped['total_sales'] / grouped['total_sales'].sum() * 100
grouped = grouped.sort_values('total_sales', ascending=False)
print(grouped.head(10))
8. Визуализация трендов с plotly
Задача: показать динамику продаж по месяцам с разбивкой по категориям.
Промт:
Построй интерактивный линейный график продаж по месяцам с разбивкой по категориям. Используй plotly.express. Добавь скользящее среднее за 3 месяца. Настрой подсказки и легенду.
Пример результата:
import plotly.express as px
df['month'] = df['date'].dt.to_period('M').astype(str)
monthly = df.groupby(['month', 'product_category'])['amount'].sum().reset_index()
monthly['rolling_avg'] = monthly.groupby('product_category')['amount'].transform(lambda x: x.rolling(3).mean())
fig = px.line(monthly, x='month', y='amount', color='product_category',
title='Динамика продаж по месяцам', markers=True)
fig.add_scatter(x=monthly['month'], y=monthly['rolling_avg'],
mode='lines', name='Скользящее среднее (3 мес)', line=dict(dash='dash'))
fig.show()
9. Сравнение сегментов: A/B-анализ
Задача: проверить, есть ли статистически значимая разница между контрольной и тестовой группой.
Промт:
У меня есть данные A/B-теста:
group(control/treatment),conversion(0/1). Напиши код для расчёта конверсии в группах, t-теста для пропорций и визуализации доверительных интервалов. Используй scipy и plotly.
Пример результата:
from scipy import stats
import plotly.graph_objects as go
control = df[df['group'] == 'control']['conversion']
treatment = df[df['group'] == 'treatment']['conversion']
conv_control = control.mean()
conv_treatment = treatment.mean()
# Z-тест для пропорций
from statsmodels.stats.proportion import proportions_ztest
count = np.array([treatment.sum(), control.sum()])
nobs = np.array([len(treatment), len(control)])
zstat, pval = proportions_ztest(count, nobs)
print(f'p-value: {pval:.4f}')
fig = go.Figure()
fig.add_trace(go.Bar(x=['Control', 'Treatment'], y=[conv_control, conv_treatment],
error_y=dict(type='data', array=[1.96*np.sqrt(conv_control*(1-conv_control)/len(control)),
1.96*np.sqrt(conv_treatment*(1-conv_treatment)/len(treatment))])))
fig.show()
10. Автоматический EDA-отчёт
Задача: сгенерировать комплексный отчёт по данным за минуты.
Промт:
Создай функцию, которая для любого датасета выводит: shape, типы колонок, пропуски, описательные статистики, корреляционную матрицу (для числовых), топ-5 частых значений (для категориальных), и сохраняет всё в HTML-файл с помощью pandas-profiling (ydata-profiling).
Пример результата:
from ydata_profiling import ProfileReport
def generate_eda_report(df, output_file='eda_report.html'):
profile = ProfileReport(df, title='EDA Report', explorative=True)
profile.to_file(output_file)
print(f'Отчёт сохранён: {output_file}')
generate_eda_report(df)
11. Промт для интерпретации результатов и сторителлинга
Задача: превратить сухие цифры в убедительную историю для стейкхолдеров.
Промт:
На основе следующих результатов анализа (вставьте сводку) сформулируй 3 ключевых вывода для руководства. Используй язык, понятный неспециалистам. Предложи 2 рекомендации на основе данных. Избегай жаргона, добавь метафору для наглядности.
Пример результата:
LLM может выдать: «Продажи в регионе X упали на 15% по сравнению с прошлым кварталом. Это похоже на то, как если бы магазин потерял каждого седьмого покупателя. Рекомендуем проверить работу местного отдела продаж и запустить локальную акцию».
Заключение
Эти 11 промтов покрывают полный цикл анализа данных: от знакомства с грязным датасетом до презентации результатов. Главное преимущество — вы не пишете шаблонный код вручную, а делегируете рутину LLM, оставляя за собой стратегические решения. Попробуйте применить их в следующем проекте — и вы удивитесь, насколько быстрее пойдёт работа. А если хотите систематизировать знания, изучите наши курсы по анализу данных и Python — там мы разбираем реальные кейсы и учим писать код, который приносит бизнес-результат.
Комментарии