нейропоток
КейсыПрактик

AI для анализа данных: разбираю таблицу с Claude и Python за 10 минут

Показываю как подключить Claude к pandas через API и задавать вопросы к данным на русском. Без дата-сайентиста, без SQL — просто таблица и вопрос.

Павел·5 мин чтения
AI для анализа данных: разбираю таблицу с Claude и Python за 10 минут
Поделиться:TelegramVK

У меня накопился Excel с данными о трафике блога за квартал. Нужно было понять: какие статьи работают лучше, где просадки CTR, что коррелирует с позицией. Раньше это занимало полчаса в Excel. Теперь — 5 минут с Python и Claude API.

Статья для тех, кто работает с табличными данными и хочет задавать вопросы на человеческом языке. Нужен базовый Python — установить пакеты и запустить скрипт.

Идея: натуральный язык как интерфейс к данным

Обычный путь к ответу на вопрос «почему упали продажи в марте?»: открыть Excel → написать формулы → построить сводную таблицу → 30 минут ушло.

С Claude API другой подход: описываете структуру данных и задаёте вопрос на русском. Claude анализирует и отвечает напрямую — с цифрами, выводами, рекомендациями.

Разберём два варианта: прямой анализ данных и генерация pandas-кода.

Установка

bash
pip install anthropic pandas openpyxl python-dotenv
# .env ANTHROPIC_API_KEY=sk-ant-...

Подход 1: Claude анализирует данные напрямую

Самый простой способ. Отдаём данные в виде CSV-текста, спрашиваем — получаем ответ.

python
import anthropic import pandas as pd from dotenv import load_dotenv load_dotenv() client = anthropic.Anthropic() def ask_about_data(df: pd.DataFrame, question: str) -> str: """Отправляет данные и вопрос в Claude, получает ответ.""" # Конвертируем в CSV-строку csv_data = df.to_csv(index=False) prompt = f"""Вот данные в CSV-формате: {csv_data} Вопрос: {question} Ответь конкретно, приведи цифры из данных, объясни вывод.""" message = client.messages.create( model="claude-sonnet-4-6", max_tokens=2048, messages=[{"role": "user", "content": prompt}] ) return message.content[0].text # Загружаем данные df = pd.read_csv("data.csv") # или pd.read_excel("data.xlsx") # Задаём вопросы print(ask_about_data(df, "Какой месяц показал наибольшую выручку?")) print(ask_about_data(df, "Топ-5 товаров по количеству продаж?")) print(ask_about_data(df, "Есть ли аномалии в данных?"))

Ограничение этого подхода: объём данных. Claude может обработать до ~100-200 тысяч токенов контекста, что примерно соответствует 1000-2000 строкам CSV. Для больших таблиц нужен другой подход.

Совет

Если данных много — передайте не всё, а только агрегированную статистику: df.describe(), топ-10 строк, итоги по группам. Claude поймёт структуру и ответит точнее.

Подход 2: Claude пишет pandas-код, вы запускаете

Для больших датасетов лучше работает другой сценарий: Claude описывает, какой код нужно написать, а вы его копируете и запускаете вручную.

python
def get_analysis_code(df: pd.DataFrame, question: str) -> str: """Просит Claude написать pandas-код для ответа на вопрос.""" # Описываем структуру датафрейма без самих данных schema = f"""Датафрейм `df`: - Строк: {len(df)} - Столбцы: {df.dtypes.to_string()} - Пример (3 строки): {df.head(3).to_string()}""" prompt = f"""У тебя есть pandas датафрейм `df`. {schema} Напиши код Python/pandas для ответа на вопрос: {question} Правила: - Только Python-код - Используй только pandas, никаких лишних импортов - Результат выводи через print() - Добавь комментарии к ключевым шагам""" message = client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, messages=[{"role": "user", "content": prompt}] ) return message.content[0].text # Claude вернёт готовый код code = get_analysis_code(df, "Какой канал продаж показывает лучший средний чек?") print(code) # Копируете код и запускаете в своём ноутбуке или скрипте

Такой подход безопаснее: вы видите код перед запуском и контролируете, что именно выполняется.

Реальный пример: анализ трафика блога

Я анализировал данные из Google Search Console: 57 статей, столбцы — url, clicks, impressions, ctr, position.

python
import anthropic import pandas as pd client = anthropic.Anthropic() df = pd.read_csv("gsc_data.csv") questions = [ "Какие 10 статей получили больше всего кликов?", "Есть ли статьи с высоким CTR (>5%) но низкими позициями (>10)? Это рост", "Какая средняя позиция у статей с CTR выше 3%?", "Статьи с каким типом заголовков (содержащие 'vs' или 'как') работают лучше?" ] for question in questions: print(f"\n📊 {question}") print("-" * 50) # Для анализа отдаём агрегированную статистику summary = f""" Всего статей: {len(df)} Столбцы: {', '.join(df.columns)} Статистика: {df.describe().to_string()} Топ-20 по кликам: {df.nlargest(20, 'clicks')[['url', 'clicks', 'ctr', 'position']].to_string()} """ message = client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, messages=[{ "role": "user", "content": f"{summary}\n\nВопрос: {question}\n\nОтвечай конкретно с цифрами." }] ) print(message.content[0].text)

Пример вывода:

📊 Есть ли статьи с высоким CTR но низкими позициями? Это рост Да, вижу 4 статьи с потенциалом: 1. chatgpt-vs-claude — CTR 6.2%, позиция 12.3 Высокий CTR говорит о релевантном заголовке, но позиция 12 = вторая страница. Небольшое улучшение ранжирования даст +40% кликов. 2. kak-napisat-prompt — CTR 5.8%, позиция 11.7 Аналогичная ситуация. Рекомендую добавить внутренние ссылки на эту статью. ...

За 5 минут получил инсайты, на которые раньше тратил час.

Добавляем контекстный диалог

Если хочется задавать уточняющие вопросы — несложно сделать сессию с памятью:

python
def data_session(df: pd.DataFrame): """Сессия вопросов к данным с сохранением контекста.""" # Системный контекст с описанием данных system_context = f"""Ты аналитик данных. У тебя есть датафрейм: Строк: {len(df)}, Столбцы: {', '.join(df.columns)} Статистика: {df.describe().to_string()} Первые 10 строк: {df.head(10).to_string()} Отвечай конкретно, с цифрами. Если нужно — предлагай следующие шаги.""" messages = [{"role": "user", "content": system_context}, {"role": "assistant", "content": "Данные загружены. Задавайте вопросы."}] print("Сессия анализа данных. Ctrl+C для выхода.\n") while True: question = input("Вопрос: ").strip() if not question: continue messages.append({"role": "user", "content": question}) response = client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, messages=messages ) answer = response.content[0].text messages.append({"role": "assistant", "content": answer}) print(f"\n{answer}\n") data_session(df)

Claude помнит предыдущие вопросы и ответы в рамках сессии. Можно уточнять: «покажи только первые 5», «а если исключить аномалии?».

Инфо

Каждый вопрос с полной историей тратит токены. Для длинных сессий периодически обрезайте историю: оставляйте только последние 5-10 обменов.

Что это меняет

Три месяца назад я тратил полчаса на каждый «быстрый анализ». Теперь большинство вопросов к данным закрываются за 2-3 минуты.

Важно понимать границы: это не замена dbt, Tableau или дата-сайентиста. Для EDA, регрессий, ML-моделей нужны специализированные инструменты. Но для ситуативных вопросов к небольшим данным — отлично работает.

Следующий уровень — настроить автоматическую отправку такого анализа по расписанию. Вот гайд по Make.com — там можно подключить Python-скрипт к триггеру и получать ежедневный дайджест без ручного запуска.