{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "oZmV8Uo_8ALK" }, "source": [ "# [Phystech@DataScience](https://thetahat.ru/courses/ph-ds-2025-spr)\n", "## Домашнее задание 7\n", "\n", "**Правила, прочитайте внимательно:**\n", "\n", "* Выполненную работу нужно отправить телеграм-боту `@miptstats_st_bot`. Для начала работы с ботом каждый раз отправляйте `/start`. Дождитесь подтверждения от бота, что он принял файл. Если подтверждения нет, то что-то не так. **Работы, присланные иным способом, не принимаются.**\n", "* Дедлайн см. в боте. После дедлайна работы не принимаются кроме случаев наличия уважительной причины.\n", "* Прислать нужно **ноутбук в формате `ipynb`**. Если вы строите интерактивные графики, их стоит прислать в формате html.\n", "* Следите за размером файлов. **Бот не может принимать файлы весом более 20 Мб.** Если файл получается больше, заранее разделите его на несколько.\n", "* Выполнять задание необходимо полностью самостоятельно. **При обнаружении списывания всем участникам списывания дается штраф -2 балла к итоговой оценке за семестр.**\n", "* Решения, размещенные на каких-либо интернет-ресурсах, не принимаются. Кроме того, публикация решения в открытом доступе может быть приравнена к предоставлении возможности списать.\n", "* Обратите внимание на правила использования ИИ-инструментов при решении домашнего задания.\n", "* **Код из рассказанных на занятиях ноутбуков** можно использовать без ограничений.\n", "* Для выполнения задания используйте этот ноутбук в качестве основы, ничего не удаляя из него. Можно добавлять необходимое количество ячеек.\n", "* Комментарии к решению пишите в markdown-ячейках.\n", "* Выполнение задания (ход решения, выводы и пр.) должно быть осуществлено на русском языке.\n", "* Решение проверяется системой ИИ-проверки **ThetaGrader**. Результат проверки валидируется и исправляется человеком, после чего комментарии отправляются студентам.\n", "* Если код будет не понятен проверяющему, оценка может быть снижена.\n", "* Никакой код из данного задания при проверке запускаться не будет. *Если код студента не выполнен, недописан и т.д., то он не оценивается.*\n", "\n", "Важно!!! Правила заполнения ноутбука:\n", "* Запрещается удалять имеющиеся в ноутбуке ячейки, менять местами положения задач.\n", "* Сохраняйте естественный линейный порядок повествования в ноутбуке сверху-вниз.\n", "* Отвечайте на вопросы, а также добавляйте новые ячейки в предложенных местах, которые обозначены `<...>`.\n", "* В markdown-ячейка, содержащих описание задачи, находятся специальные отметки, которые запрещается модифицировать.\n", "* При нарушении данных правил работа может получить 0 баллов.\n", "\n", "**Баллы за задание:**\n", "\n", "Легкая часть (достаточно на \"хор\"):\n", "* Задача 1 — 15 баллов\n", "* Задача 2 — 20 баллов\n", "\n", "Cложная часть (необходимо на \"отл\"):\n", "* Задача 3 — 20 баллов\n", "\n", "Легкая часть (достаточно на \"хор\"):\n", "* Задача 4 — 20 баллов\n", "* Задача 5 — 25 баллов\n", "\n", "Cложная часть (необходимо на \"отл\"):\n", "* Задача 6 — 30 баллов\n", "-----" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ps_jlDvk8ALP" }, "outputs": [], "source": [ "# Bot check\n", "\n", "# HW_ID: phds_hw7\n", "# Бот проверит этот ID и предупредит, если случайно сдать что-то не то.\n", "\n", "# Status: not final\n", "# Перед отправкой в финальном решении удали \"not\" в строчке выше.\n", "# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную.\n", "# Никакие значения в этой ячейке не влияют на факт сдачи работы." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "pwOeZYydbPOU" }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import scipy.stats as sps\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "from scipy.special import gamma, loggamma\n", "\n", "sns.set_style(\"whitegrid\")\n", "\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": { "id": "09D8CV_c8ALR" }, "source": [ "# Теоретическая часть\n", "\n", "## Легкая часть\n", "\n", "### Задача 1\n", "\n", "Найдите оценку параметра $\\theta$ методом максимального правдоподобия по выборке размера $n$ из распределения:\n", "\n", "1. Для $\\mathcal{N}(a,\\sigma^2)$ найдите ОМП в следующих случаях:\n", "
a. $\\theta = (a, \\sigma^2)$\n", "
b. $\\theta = \\sigma^2$, если $a$ известно\n", "
c. $\\theta = a$, если $\\sigma^2$ известно (для этого случая посчитайте также асимптотическую дисперсию оценки по теореме из лекции)\n", " \n", "\n", "2. $\\mathrm{Pois}(\\theta)$. Посчитайте асимптотическую дисперсию, если оценка является асимптотически нормальной по теореме из лекции." ] }, { "cell_type": "markdown", "metadata": { "id": "hBn7RIzp8ALS" }, "source": [ "### Задача 2.\n", "\n", "Пусть $X_1,...,X_n$ выборка из из распределения $U(0, \\theta)$.\n", "\n", "1. Проверьте, является ли оценка $2\\overline{X}$ состоятельной, сильно состоятельной и асимптотически нормальной.\n", "\n", "2. Постройте асимптотический доверительный интервал для $\\theta$ уровня доверия $\\alpha$." ] }, { "cell_type": "markdown", "metadata": { "id": "VZaU2tsM8ALS" }, "source": [ "## Сложная часть\n", "\n", "### Задача 3.\n", "Пусть $X_1,...,X_n$ — выборка из распределения Коши с параметром сдвига $\\theta$.\n", "\n", "\n", "1. Найдите оценку максимального правдоподобия параметра $\\theta$ для $n=1$ и $n=2$.\n", "2. Найдите асимптотическую дисперсию, которую может обещать теорема о свойствах ОМП. Что мешает применить эту теорему? Сравните с дисперсией, которая была получена для выборочной медианы.\n" ] }, { "cell_type": "markdown", "metadata": { "id": "aLe9ZNvy8ALT" }, "source": [ "# Практическая часть\n", "\n", "## Легкая часть\n", "\n", "### Задача 4\n", "\n", "**1.** Загрузите с помощью `pandas`:\n", "- **Профиль Биология** — данные из файла `Data_Cortex_Nuclear_quantile.csv` экспрессии белков у белых мышей и оставьте следующие белки для анализа:`pCAMKII_N`, `pELK_N`, `ARC_N`\n", "\n", "- **Профиль Физика** — [данные](https://www.kaggle.com/datasets/purushottamnawale/materials?resource=download) о материалах и их механических свойствах и оставьте для анализа следующие столбцы: `A5`, `Su`, `E`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "svpF9pMP8ALU" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "nicdlnH-8ALU" }, "source": [ "Выведите описательные статистики (метод `describe`) для всех признаков, для которых это имеет смысл. Округлите до второго знака после запятой." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "5M-lfTNo8ALV" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "XYmvuGfc8ALW" }, "source": [ "**2.** Подсчет выборочных квантилей" ] }, { "cell_type": "markdown", "metadata": { "id": "_u8Xqn8g8ALW" }, "source": [ "Для посчета выборочных квантилей в библиотеке `numpy` есть функция `numpy.quantile`. На вход ей передается исследуемый массив и значение квантиля.\n", "\n", "Посчитайте с помощью этой функции выборочную медиану для признака `pCAMKII_N` из датасета для биологов и `A5` из датасета для физиков" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "-u4vNI0W8ALW" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "qGSKh5958ALX" }, "source": [ "Функция должна вернуть `nan`. Проверьте столбец на наличие пропусков, выведите их количество" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "NHVERxMK8ALX" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "I430pn988ALX" }, "source": [ "Получите значение выборочной медианы, удалив пропуски" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "DCfl12q-8ALX" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "qhdyOEOf8ALY" }, "source": [ "Для работы с пропущенными значениями в `numpy` есть специальная функция `numpy.nanquantile`\n", "\n", "Посчитайте значение выборочной медианы с использованием этой функции (пропуски не удаляйте) и сравните ответы" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "I0Xj9yJ48ALY" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "bn8JQCJF8ALY" }, "source": [ "**3.** Визуализация квантилей и изучение boxplot\n", "\n", "Допишите функцию для совместной визуализации `boxplot` и гистограммы с нанесенными на нее квантилями" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "5Pj1k8H68ALY" }, "outputs": [], "source": [ "def draw_quintiles(data, alphas, ymax=0.4):\n", " '''\n", " data: pd.Series - столбец из рассматриваемого признака\n", " alphas: list[float] - массив из значений интересуемых квантилей, которые будут отрисованы\n", " ymax: float - максимальное значение для вертикальных линий на гистограмме\n", " '''\n", "\n", " title = data.name\n", " f, (ax_box, ax_hist) = plt.subplots(2, sharex=True, gridspec_kw={\"height_ratios\": (.15, .85)},figsize=(14, 8))\n", " f.suptitle(f\"Распределение {title}\")\n", "\n", " sns.boxplot(x=data, ax=ax_box, color=blue)\n", "\n", " for alpha in alphas:\n", " nearest = <подсчет выборочного квантиля>\n", " ax_hist.vlines(nearest, 0, ymax, color=\"red\", label=f'{alpha} квантиль')\n", " sns.histplot(data=data, kde=True, ax=ax_hist, stat='density')\n", "\n", " plt.legend()\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "AhKyRzTh8ALZ" }, "source": [ "Какие квантили соответствуют границам \"ящика с усами\"? Допишите их и нарисуйте графики для разных признаков" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "NZH7dID58ALZ" }, "outputs": [], "source": [ "alphas = <квантили в boxplot>" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "xvrbiGfS8ALZ" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "IvQVOc2i8ALZ" }, "source": [ "Опишите структуру `boxplot`. Какие выводы можно сделать в данном случае?" ] }, { "cell_type": "markdown", "metadata": { "id": "n7qL1wIg8ALa" }, "source": [ "**Ответ:**" ] }, { "cell_type": "markdown", "metadata": { "id": "M2lgilk58ALa" }, "source": [ "Постройте гистограммы для каждой выборки, отметьте на них положение среднего и медианы. Объясните причины полученных расхождений (в случае их наличия)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "sc7_5Etg8ALa" }, "outputs": [], "source": [ "def plot_hist(data):\n", " \"\"\"\n", " Строит гистограмму распределения данных с линией KDE,\n", " а также вертикальными линиями, обозначающими медиану и среднее значение.\n", "\n", " Параметры:\n", " ----------\n", " data :pd.Series\n", " Массив числовых данных, для которых строится гистограмма.\n", " \"\"\"\n", "\n", " plt.figure(figsize=(14,7))\n", " sns.histplot(data ,kde=True)\n", "\n", " median_value = <...>\n", " mean_value = <...>\n", "\n", " plt.vlines(median_value, 0, 120, color=red,label=r'$\\hat{\\mu}$')\n", " plt.vlines(mean_value, 0, 120, color='black',label=r'$\\overline{X}$')\n", " plt.legend()\n", " plt.show();" ] }, { "cell_type": "markdown", "metadata": { "id": "xwa9a4-o8ALa" }, "source": [ "**Ответ:**" ] }, { "cell_type": "markdown", "metadata": { "id": "A_2px24X8ALb" }, "source": [ "**4.** Устранение выбросов" ] }, { "cell_type": "markdown", "metadata": { "id": "XmmMq_yu8ALb" }, "source": [ "Межквантильным размахом `IQR` называется расстояние между первым и третим выборочным квартилем. Выбросами же принято счиать наблюдения которые находятся за пределами первого или же третьего выборочного квантиля на расстоянии более $1.5 \\times \\text{IQR}$.\n", "Выберете признак с наиболее характерными выбросами, удалите их." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "J2IXjUjh8ALb" }, "outputs": [], "source": [ "Q1 = <подсчет 0.25 квантиля>\n", "Q3 = <подсчет 0.75 квантиля>\n", "IQR = Q3 - Q1\n", "no_outliers = <...>" ] }, { "cell_type": "markdown", "metadata": { "id": "zIdj-jnY8ALb" }, "source": [ "Выведите гистограмму обработанной выборки и отметьте на нем положения среднего и медианы" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "5fc-u6qv8ALb" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "dyYcssB38ALc" }, "source": [ "А теперь постройте график на неотфильтрованный данных (как в предыдущем пункте). Для наглядности сравнения поставьте соответствующие границы для оси Ox." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "VeXJ4o_O8ALi" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "0Ie6bJnG8ALj" }, "source": [ "Объясните изменение положения оценок" ] }, { "cell_type": "markdown", "metadata": { "id": "WFarPfvZ8ALj" }, "source": [ "**Ответ:**" ] }, { "cell_type": "markdown", "metadata": { "id": "D7u0T2Fk8ALj" }, "source": [ "При подсчете этих статистик обычно предполагается, что наблюдения независимы. Выполнено ли это свойство в данном случае?" ] }, { "cell_type": "markdown", "metadata": { "id": "5-lbWnXn8ALj" }, "source": [ "**Ответ:**" ] }, { "cell_type": "markdown", "metadata": { "id": "gHyGoCap8ALk" }, "source": [ "А оно часто бывает выполнено? Как это можно проверить? Что бывает, когда оно нарушается? Какие есть количественные меры зависимости между признаками?" ] }, { "cell_type": "markdown", "metadata": { "id": "yVfgZj-W8ALk" }, "source": [ "**Ответ:**" ] }, { "cell_type": "markdown", "metadata": { "id": "2mnzBFLM8ALk" }, "source": [ "Сделайте выводы о полезности робастных статистик (устойчивых к выбросам), методах визуального анализа и о наличии независимых одинаково распределённых случайных величин в реальном мире.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "3HDMILzU8ALl" }, "source": [ "**Вывод:**" ] }, { "cell_type": "markdown", "metadata": { "id": "eHB5qNh48ALl" }, "source": [ "### Задача 5" ] }, { "cell_type": "markdown", "metadata": { "id": "kmmnNbn48ALl" }, "source": [ "Асимпотические доверительные интервалы ничего не могут гарантировать на малых размерах выборки.\n", "В этой задаче вам предстоит иллюстрировать этот факт, посчитав реальный уровень доверия для интервалов.\n", "\n", "**Реальный уровень доверия (оценка доли покрытия интервалом)** - доля случаев попадания истинного значения параметра в доверительный интервал.\n", "\n", "*Пример:* вы проводите 100 экспериментов (создаете 100 выборок), для каждой выборки рассчитываете АДИ для параметра $\\theta$. Истинный параметр попадает в 93 интервала из 100, значит реальный уровень доверия в этом случае будет 0.93.\n" ] }, { "cell_type": "markdown", "metadata": { "id": "FaLNc9Ph8ALm" }, "source": [ "Сгенерируйте набор выборок из нормального распределения $\\mathcal{N}(\\theta, 1)$ при $\\theta=0$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "A7o994cY8ALm" }, "outputs": [], "source": [ "theta = 0 # истинное значение параметра\n", "sample_size = 300\n", "sample_count = <...>\n", "X = <...>" ] }, { "cell_type": "markdown", "metadata": { "id": "U7TSc6X38ALm" }, "source": [ "Рассмотрим $\\hat{\\theta} = \\overline{X}$.\n", "\n", "Сначала получите значения $\\hat{\\theta}$ при различных размерах выборки. Вам в этом может помочь код из семинара." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "6gwXI8BzBfgf" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "oYgtsj3U8ALn" }, "source": [ "Теперь посчитаем границы доверительного интервала. Вам в этом тоже может помочь код из семинара (но на этот раз нигде не используются реальные значения параметров, а только их оценки)\n", "\n", "Напоминание из теории:\n", "$$\\hat{\\theta} - \\frac{z_{\\frac{1+\\alpha}{2}}\\hat{\\sigma}}{\\sqrt{n}} < \\theta < \\hat{\\theta} + \\frac{z_{\\frac{1+\\alpha}{2}}\\hat{\\sigma}}{\\sqrt{n}}$$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "YGli0bNR8ALn" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "SXz2uYFwBk5z" }, "source": [ "Посчитайте число реализаций доверительных интервалов, в которые попал истинный параметр $\\theta$. А тут вам может помочь метод `np.logical_and`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "mCFekjAzBlrT" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "YX_LPSW58ALn" }, "source": [ "Постройте график зависимости реального уровня доверия от размера выборки." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "b-yUnFoF8ALn" }, "outputs": [], "source": [ "plt.figure(figsize=(15, 7))\n", "\n", "plt.plot(<...>, <...>, color='g', label=\"реальный уровень доверия\")\n", "plt.ylabel('Реальный уровень доверия')\n", "plt.xlabel('Размер выборки')\n", "plt.hlines(0.95, 0, sample_size, color='r', ls='--', label=r\"$\\alpha = 0.95$\")\n", "plt.xlim((0, sample_size))\n", "plt.title(\"Зависимость реального уровня доверия от размера выборки\")\n", "plt.legend()\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "g7l51-HU8ALo" }, "source": [ "Сделайте выводы." ] }, { "cell_type": "markdown", "metadata": { "id": "6dPZD5CX8ALo" }, "source": [ "**Вывод:**" ] }, { "cell_type": "markdown", "metadata": { "id": "1UlZnPOI8ALo" }, "source": [ "## Сложная часть\n", "\n", "### Задача 6\n", "\n", "\n", "Предлагается изучить некоторые свойства распределения Коши с параметром сдвига $\\theta$, обладающего плотностью распределения $p_{\\theta}(x) = \\frac{1}{\\pi \\left(1 + \\left(x- \\theta\\right)^2\\right)}$.\n", "\n", "На высоте 1 метр от точки $\\theta$ находится источник $\\gamma$-излучения,\n", "причем направления траекторий $\\gamma$-квантов случайны, т.е. равномерно распределены по полуокружности. Тогда $X_i, i=1,...,n$ — зарегистрированные координаты точек пересечения $\\gamma$-квантов с поверхностью детекторной плоскости — образуют выборку из распределения Коши со сдвигом $\\theta$." ] }, { "cell_type": "markdown", "metadata": { "id": "20fmlZYf8ALo" }, "source": [ "**1.** На отрезке $[-7, 7]$ постройте плотность стандартного нормального распределения и стандартного распределения Коши. Не забудьте добавить легенду. Сделайте выводы о сходствах и различиях распределений" ] }, { "cell_type": "markdown", "metadata": { "id": "ha4xv00L8ALp" }, "source": [ "**Решение:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "2FrcQ3Ke8ALp" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "kAmLJql98ALp" }, "source": [ "**Вывод:**" ] }, { "cell_type": "markdown", "metadata": { "id": "alHREVuo8ALp" }, "source": [ "**2.** Чему равна асимптотическая дисперсия $\\sigma_{\\alpha}^2$ усеченного среднего $\\overline{X}_{\\alpha}$, где $0 < \\alpha < 1/2$, для распределения Коши? Помочь в ее вычислении может теорема, упомянутая на лекциях. Посчитайте асимптотическую дисперсию аналитически. Постройте график зависимости асимптотической дисперсии $\\sigma_{\\alpha}^2$ усеченного среднего $\\overline{X}_{\\alpha}$, где $0 < \\alpha < 1/2$, от $\\alpha$.\n", "\n", "Настройте видимую область графика по оси *y* так, чтобы четко была отображена информативная часть графика. Отметьте на графике минимум функции." ] }, { "cell_type": "markdown", "metadata": { "id": "amkktLF_8ALq" }, "source": [ "**Решение:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "yHzi2aNy8ALq" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "D0CSDRJR8ALq" }, "source": [ "При каком значении $\\alpha$ асимптотическая дисперсия $\\sigma^2_{\\alpha}$ минимальна и чему она равна? Ответ можно найти численно." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "5ClgW6l_8ALq" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "D7uzgFDD8ALq" }, "source": [ "**Ответ:**" ] }, { "cell_type": "markdown", "metadata": { "id": "OhueU8ap8ALr" }, "source": [ "**3.** Сгенерируйте выборку $X = \\left(X_1, \\dots, X_{1000} \\right)$ из стандартного распределения Коши. Для всех $n \\leqslant 1000$ по первым $n$ элементам выборки $X_1, \\dots, X_n$ вычислите значения следующих оценок:\n", "- $\\overline{X}$ — выборочное среднее;\n", "- $\\overline{X}_{\\alpha}$ — усеченное среднее, где $\\alpha$ — значение, на котором достигается минимум $\\sigma^2_{\\alpha}$;\n", "- $\\widehat{\\mu}$ — выборочная медиана;\n", "\n", "На графиках изобразите зависимость значений **всех оценок** от $n$ для одной реализации выборки, а на другом графики траекторий по нескольким реализациям.\n", "\n", "Постройте также график, на котором изобразите значения MSE для каждой оценки от размера выборки $n$.\n", "\n", "*Указание:* $MSE_{\\widehat{\\theta}}(\\theta) = (\\widehat{\\theta} - \\theta)^2$. В качестве $\\theta$ возьмите истинное значение для стандартного распределения Коши. Для подсчета усеченного среднего можно использовать функцию `scipy.stats.trim_mean`.\n", "\n", "Сравните асимптотические дисперсии оценок. Сделайте вывод.\n", "\n", "**Решение:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "kUxUDLpI8ALr" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "U9FXt8bg8ALr" }, "source": [ "**Вывод:**" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.6" } }, "nbformat": 4, "nbformat_minor": 0 }