{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Подключим необходимые фреймворки" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# фреймворк для расчетов\n", "import numpy as np \n", "# фреймворк для анализа данных\n", "import pandas as pd \n", "# фреймворк для графиков\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Прочитаем данные с помощью библиотеки `pandas`. Библиотека pandas предназначена для статистической обработки данных, по назначению близка к Excel и языку R, включая функциональность работы с базами данных и таблицами.\n", "\n", "При чтении можно указать какую колонку нужно использовать в качестве индекса (т.е. ключа) в таблице(фрейме): `index_col=0`.\n", "\n", "Мы видим таблицу со следующими колонками:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Описание набора данных:\n", "\n", "_Population_ - численность населения (в тысячах) в штате в 1975 г\n", "\n", "_Income_ - доход на душу населения в 1974 г (за год)\n", "\n", "_Illiteracy_ - уровень неграмотности в 1970 г (в процентах к населению)\n", "\n", "_Life.Exp_ - ожидаемая продолжительность жизни жителей штата в годах на 1970 г.\n", "\n", "_Murder_ - количество убитых (как умышленно, так и без умысла) на 100 тысяч населения в 1976 г.\n", "\n", "_HS.Grad_ - процент выпускников средней школы в 1970 г.\n", "\n", "_Frost_ - среднее число дней с минимальной температурой ниже нуля с 1931 по 1960 г в столице штата\n", "\n", "_state.area_ - площадь суши (в квадратных милях) штата\n", "\n", "_state.abb_ - сокращенное название (аббревиатура) штата\n", "\n", "_state.name_ - полное название штата\n", "\n", "_state.region_ - регион, к которому относится штат" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# откроем файл формата csv и создадим фрейм data\n", "data = pd.read_csv('statedata.csv')\n", "# выведем начальные строки фрейма data\n", "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Соответствующая переменная имеет тип данных `DataFrame`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type(data)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# чтобы в названиях колонок не было проблем с точками - переименуем для удобства\n", "data = data.rename({'Life.Exp':'Life_Exp', 'HS.Grad':'HS_Grad', 'state.name':'s_name', 'state.abb':'s_abr', 'state.area':'s_area', 'state.region':'s_region'}, axis='columns', inplace=False)\n", "# выведем структуру данных фрейма\n", "data.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Видно, что датасет не содержит нулевых значений, цифровые значения указаны в числовых форматах." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#для наглядности выведем все штаты и все данные по ним \n", "#data.style.bar() # можно так - информативнее\n", "#DataFrame.style requires jinja2. Use pip or conda to install Jinja2.\n", "# а можно и так - через print()\n", "data" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Данные из отдельной колонки\n", "print(data['Population'])\n", "\n", "# Данные по столбцу имеют тип данных `Series`\n", "type(data.Population)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# добавим колонку -- общий доход населения штата - перемножаем население на подушевой доход\n", "data['total_state_income'] = data['Population'] * data['Income']\n", "data.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Можно взять из фрейма только несколько колонок\n", "data[['Population', 'Income', 'total_state_income']]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Имена всех колонок\n", "print(data.columns)\n", "\n", "# cписок всех индексов таблицы (т.е. ключей)\n", "print(data.index)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Тип данных в каждой из колонок таблицы\n", "data.dtypes" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Строку таблицы, соответствующую *ключу 1*, можно получить через `loc`\n", "data.loc[1]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ввнимание! Обычный численный индекс строки равен 0. По нему можно извлекать строку с помощью `iloc`\n", "data.iloc[0]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Можно извлечь несколько строк - 0 и 1 и 2\n", "data.iloc[0:3]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Можно извлечь конкретное значение\n", "data.iloc[0]['Population']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Сортировка по столбцу\n", "data.sort_values(by='Population')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Получим средние значения по регионам в новом фрейме regions\n", "regions = data.groupby(['s_region']).mean()\n", "# и выведем фрейм regions\n", "print(regions)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# построим круговую диаграмму - соотношение уровня убийств между регионами\n", "plt.pie(regions['Murder'], labels=regions['Murder'].round(2))\n", "pass" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# построим круговую диаграмму - соотношение уровня убийств между регионами\n", "lbl=[]\n", "for i in range(len(regions)):\n", " lbl.append(regions.index[i] +'\\n' +str(regions['Murder'][i].round(2)) )\n", "expl=[0.02,0.04,0.07,0,0,0,0,0]\n", "patches, texts = plt.pie(regions['Murder'], labels= lbl, wedgeprops={'linewidth':2.0,'edgecolor':'white'}, explode=expl)\n", "for i, p in enumerate(patches):\n", " texts[i].set_color(p.get_facecolor())\n", "plt.title('Уровень криминала по регионам', fontsize=20)\n", "pass" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# построим график - распределение среднего уровня убийств по штатам на частотной гистограмме\n", "data['Murder'].hist(bins=8,grid=False,color='purple', alpha=0.7)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Посмотрим на соотношение продолжительности жизни между регионами.\n", "\n", "Посмотрим на распределение продолжительности жизни по штатам по частотной гистограмме." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ? ? ? \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Найдем топ-5 - самых холодных и теплых штатов" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Какие штаты самые холодные - с помощью сортировки\n", "Frost_top5 = data. sort_values('Frost', ascending=False). head(5)\n", "# лидеры по холоду\n", "Frost_top5\n", "# лидеры по теплу\n", "# ? ? ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Какие штаты самые холодные - с помощью выборки\n", "Frost_top = data.groupby('s_name')[['Frost']]. sum(). sort_values('Frost', ascending=False). head(5)\n", "# лидеры по холоду\n", "Frost_top\n", "# лидеры по теплу\n", "# ? ? ?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Найдем топ-5 - с лучшим средним уровнем образования и самые \"неграмотные\" штаты" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# посмотрим корреляцию между неграмотностью и уровнем убийств\n", "Illiteracy = data.groupby('s_name')[['Illiteracy']].sum().sort_values('Illiteracy', ascending=False).head(5)\n", "# лидеры по безграмотности\n", "Illiteracy\n", "# лидеры по грамотности\n", "# ? ? ?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Найдем топ-5 - самых криминальных и самых спокойных штатов." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# посмотрим по уровню убийств\n", "Murder = data.groupby('s_name')[['Murder']].sum().sort_values('Murder', ascending=False).head(5)\n", "# лидеры по убийствам\n", "Murder\n", "# анти-лидеры по убийствам\n", "# ? ? ?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Найдите топ-5 штатов для следующих показателей:\n", "- самых густонаселенных и малозаселенных штатов (плотность населения);\n", "- с самым высоким доходом населения и самых низкодоходных;\n", "- с лучшим средним уровнем образования и самые неграмотные штаты;\n", "- штатов, где люди живут дольше и где низкая продолжительность жизни;\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ? ? ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# посмотрим график зависимости продолжительности жизни от дохода и климата\n", "fig, ax = plt.subplots(1, 2, layout='constrained', figsize=(10, 3))\n", "fig.suptitle('зависимость продолжительности жизни')\n", "ax[0].scatter (x=data['Income'], y=data['Life_Exp'], marker='x')\n", "ax[0].tick_params(axis='x', labelcolor='red', labelsize=14)\n", "ax[0].set_title('от дохода')\n", "ax[1].scatter (x=data['Frost'], y=data['Life_Exp'], marker='o', color='green')\n", "ax[1].tick_params(axis='y', labelcolor='orange', labelsize=11)\n", "ax[1].set_title('от мороза')\n", "pass" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# посмотрим корреляцию между продолжительностью жизни и доходм и климатом\n", "fig, ax = plt.subplots(1, 2, layout='constrained', figsize=(10, 3))\n", "fig.suptitle('корреляция продолжительности жизни')\n", "ax[0].scatter (x=data['Income'], y=data['Life_Exp'], marker='x')\n", "ax[0].tick_params(axis='x', labelcolor='red', labelsize=14)\n", "ax[0].set_title('с доходом')\n", "# линейная регрессия - степень deg=1\n", "p1, p0 = np.polyfit(x=data['Income'], y=data['Life_Exp'], deg=1) # slope, intercept\n", "ax[0].axline(xy1=(3000, p0+3), slope=p1, color='r', lw=2)\n", "\n", "ax[1].scatter (x=data['Frost'], y=data['Life_Exp'], marker='o', color='green')\n", "ax[1].tick_params(axis='y', labelcolor='orange', labelsize=11)\n", "ax[1].set_title('с морозом')\n", "# linear regression\n", "p1, p0 = np.polyfit(x=data['Frost'], y=data['Life_Exp'], deg=1) # slope, intercept\n", "ax[1].axline(xy1=(0, p0), slope=p1, color='r', lw=2)\n", "pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Есть ли корреляция уровня преступности с уровнем образования ?\n", "\n", "Есть ли корреляция уровня преступности с климатом ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ? ? ?" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.7.6 64-bit", "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.7.6" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "aaea06cd2337f3f1a8255382ee5a8ce2e63ade4be3aa94187189b8da1d3aff1f" } } }, "nbformat": 4, "nbformat_minor": 2 }