AIM-PIbd-31-Bakalskaya-E-D/lab_2/lab2.ipynb

177 KiB
Raw Blame History

Уф.. начинаем длинную тяжелую лабу...

3 набора данных, с которыми будет проводиться работа:

  1. Объекты вокруг Земли

    Ссылка
  2. Оценки студентов на экзамене

    Ссылка
  3. Прогноз цены мобильного телефона

    Ссылка

Информация о первом датасете:

О наборе данных
Контекст
В космическом пространстве существует бесконечное количество объектов. Некоторые из них находятся ближе, чем мы думаем. Хотя нам может казаться, что расстояние в 70 000 км не может причинить нам вред, в астрономическом масштабе это очень маленькое расстояние, которое может нарушить многие природные явления. Таким образом, эти объекты/астероиды могут причинить вред. Поэтому разумно знать, что нас окружает и что может причинить нам вред. Таким образом, этот набор данных содержит список сертифицированных НАСА астероидов, которые классифицируются как ближайшие к Земле объекты.


Информация о втором датасете:

О наборе данных
Контекст
Оценки, полученные студентами
Содержание
Этот набор данных состоит из оценок, полученных учениками по различным предметам.
Благодарности
http://roycekimmons.com/tools/generated_data/exams
Вдохновение
Понять влияние предыстории родителей, подготовки к тестированию и т.д. На успеваемость учащихся


Информация о третьем датасете:

О наборе данных
Этот набор данных был собран путём сбора данных с онлайн-сайтов. Столбцы выглядят следующим образом.

Название: в этом столбце содержится название мобильного телефона.

Рейтинг: в этом столбце указаны оценки, выставленные телефону. Минимальная оценка — 0, максимальная — 5.

Spec_score: в этом столбце указана оценка телефона на основе его характеристик. Минимальное значение — 0, максимальное — 100.

No_of_sim: в этом столбце указано, поддерживает ли телефон две SIM-карты, 3G, 4G, 5G, LTE.

Оперативная память: В этом столбце содержится информация о оперативной памяти телефона

Аккумулятор: В этой колонке представлена информация о характеристиках аккумулятора телефона.

Дисплей: В этом столбце содержится информация о размере экрана телефона.

Камера: В этой колонке представлена информация о камере, задней и фронтальной.

Внешняя_память: этот столбец содержит информацию о том, поддерживает ли устройство внешнюю память и какой объём памяти.

Android_version: этот столбец сообщает нам о версии Android на телефоне.

Цена: Цена телефона.

Компания: Компания, которой принадлежит телефон.

Встроенная_память: в этом столбце представлена информация о встроенной памяти телефона.

быстрая_зарядка: показывает, поддерживает ли устройство быструю зарядку. Если да, то насколько.

Screen_resolution: Это описывает разрешение экрана телефона.

Процессор: В этом столбце приведена информация о процессоре телефона.

Имя_процессора: в этом столбце описывается название процессора.

начинаем...
первое...
Проблемная область: Это данные о ближайших к Земле объектах (астероиды и кометы), которые могут угрожать нашей планете. Важно анализировать их траектории, размеры и скорость для предотвращения потенциальных катастроф.
Объекты наблюдения: Астероиды, кометы и другие объекты.
Атрибуты: 'id', 'name', 'est_diameter_min', 'est_diameter_max', 'relative_velocity', 'miss_distance', 'orbiting_body', 'sentry_object', 'absolute_magnitude', 'hazardous'
Связи между объектами: Нет явных связей между объектами, но можно изучать корреляции между размером, скоростью и расстоянием объекта.

In [1]:
import pandas as pd

data = pd.read_csv("./csv/1.csv", sep=",")
print("вот столько колонОчек", data.columns.size)
print("вот такие колонОчки:", data.columns.tolist())
вот столько колонОчек 10
вот такие колонОчки: ['id', 'name', 'est_diameter_min', 'est_diameter_max', 'relative_velocity', 'miss_distance', 'orbiting_body', 'sentry_object', 'absolute_magnitude', 'hazardous']

Получение сведений о пропущенных данных
Типы пропущенных данных:
None - представление пустых данных в Python
NaN - представление пустых данных в Pandas
'' - пустая строка

In [2]:
# Проверим, есть ли пропущенные значения
print(data.isnull().sum(), "\n")

# Есть ли пустые значения признаков
print(data.isnull().any(), "\n")
id                    0
name                  0
est_diameter_min      0
est_diameter_max      0
relative_velocity     0
miss_distance         0
orbiting_body         0
sentry_object         0
absolute_magnitude    0
hazardous             0
dtype: int64 

id                    False
name                  False
est_diameter_min      False
est_diameter_max      False
relative_velocity     False
miss_distance         False
orbiting_body         False
sentry_object         False
absolute_magnitude    False
hazardous             False
dtype: bool 

Тут понятно, что пропущенных значений нет, поэтому заполнять пустые места не нужно
И еще на сайте видно, что колонки "orbiting_body" и "sentry_object" не имеют никаких значений кроме "Земля" и "false" соответственно. Значит удалим их

In [3]:
data = data.drop(columns=['sentry_object'])
data = data.drop(columns=['orbiting_body'])
print(data.columns)
Index(['id', 'name', 'est_diameter_min', 'est_diameter_max',
       'relative_velocity', 'miss_distance', 'absolute_magnitude',
       'hazardous'],
      dtype='object')

при просмотре типа данных на сайте kaggle выяснилось, что числовые колонки - это 3-7. По ним и будем просматриватьвыбросы и усреднять значения

In [4]:
numeric_columns = ['est_diameter_min', 'est_diameter_max', 'relative_velocity', 'miss_distance', 'absolute_magnitude']
for column in numeric_columns:
    if pd.api.types.is_numeric_dtype(data[column]):  # Проверяем, является ли колонка числовой
        q1 = data[column].quantile(0.25)  # Находим 1-й квартиль (Q1)
        q3 = data[column].quantile(0.75)  # Находим 3-й квартиль (Q3)
        iqr = q3 - q1  # Вычисляем межквартильный размах (IQR)

        # Определяем границы для выбросов
        lower_bound = q1 - 1.5 * iqr  # Нижняя граница
        upper_bound = q3 + 1.5 * iqr  # Верхняя граница

        # Подсчитываем количество выбросов
        outliers = data[(data[column] < lower_bound) | (data[column] > upper_bound)]
        outlier_count = outliers.shape[0]

        # Устраняем выбросы: заменяем значения ниже нижней границы на саму нижнюю границу, а выше верхней — на верхнюю
        data[column] = data[column].apply(lambda x: lower_bound if x < lower_bound else upper_bound if x > upper_bound else x)

        print(f"Колонка {column}:")
        print(f"  Есть выбросы: {'Да' if outlier_count > 0 else 'Нет'}")
        if(outlier_count > 0) :
            print(f"  Количество выбросов: {outlier_count}")
            print(f"  Минимальное значение: {data[column].min()}")
            print(f"  Максимальное значение: {data[column].max()}")
            print(f"  1-й квартиль (Q1): {q1}")
            print(f"  3-й квартиль (Q3): {q3}\n")
Колонка est_diameter_min:
  Есть выбросы: Да
  Количество выбросов: 8306
  Минимальное значение: 0.0006089126
  Максимальное значение: 0.32962154705
  1-й квартиль (Q1): 0.0192555078
  3-й квартиль (Q3): 0.1434019235

Колонка est_diameter_max:
  Есть выбросы: Да
  Количество выбросов: 8306
  Минимальное значение: 0.00136157
  Максимальное значение: 0.7370561859
  1-й квартиль (Q1): 0.0430566244
  3-й квартиль (Q3): 0.320656449

Колонка relative_velocity:
  Есть выбросы: Да
  Количество выбросов: 1574
  Минимальное значение: 203.34643253
  Максимальное значение: 114380.48061454494
  1-й квартиль (Q1): 28619.02064490995
  3-й квартиль (Q3): 62923.60463276395

Колонка miss_distance:
  Есть выбросы: Нет
Колонка absolute_magnitude:
  Есть выбросы: Да
  Количество выбросов: 101
  Минимальное значение: 14.8
  Максимальное значение: 32.239999999999995
  1-й квартиль (Q1): 21.34
  3-й квартиль (Q3): 25.7

так, теперь мы построим диаграммы, чтобы найти зависимость значения "опасен ли объект" от других колонок

In [5]:
import matplotlib.pyplot as plt

# Список числовых колонок, для которых мы будем строить графики
numeric_columns = ['est_diameter_min', 'est_diameter_max', 'relative_velocity', 'miss_distance', 'absolute_magnitude']

# Создание диаграмм зависимости
for column in numeric_columns:
    plt.figure(figsize=(4, 8))  # Установка размера графика
    plt.scatter(data['hazardous'], data[column], alpha=0.5)  # Создаем диаграмму рассеяния
    plt.title(f'Зависимость {column} от hazardous')
    plt.xlabel('hazardous (0 = не опасно, 1 = опасно)')
    plt.ylabel(column)
    plt.xticks([0, 1])  # Установка меток по оси X
    plt.grid()  # Добавление сетки для удобства восприятия
    plt.show()  # Отображение графика
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
In [ ]:

In [ ]: