2024-10-31 04:19:52 +04:00

54 KiB
Raw Blame History

Лабораторная работа №2

Описание датасетов

Первый датасет: Diamonds Prices

Описание: Данный набор данных включает информацию о 53 940 бриллиантах круглой огранки и содержит 10 уникальных характеристик, которые описывают бриллиант с разных сторон. Большинство переменных являются числовыми, однако характеристики огранка, цвет и чистота представлены в виде категорий. Цена указана в долларах США.

Объект исследования: Объектом исследования данного датасета являются круглые бриллианты с разными характеристиками, которые влияют на их стоимость.

Атрибуты объекта:

  1. id - Уникальный идентификатор каждого бриллианта

  2. carat - Вес бриллианта в каратах. Карат — это мера массы, где один карат равен 0,2 грамма.

  3. cut - Оценка огранки бриллианта, которая влияет на его способность отражать свет.

  4. color - Цвет бриллианта, который оценивается по шкале, где более высокие уровни означают меньший оттенок желтого и более высокую ценность.

  5. clarity - Чистота бриллианта, измеряемая по количеству и размеру внутренних дефектов или внешних недостатков.

  6. depth - Общая глубина бриллианта, выраженная как процент от его среднего диаметра.

  7. table - Ширина верхней плоской грани бриллианта ("стола"), выраженная как процент от его среднего диаметра.

  8. price - Цена бриллианта в долларах США.

  9. X - Длина бриллианта в миллиметрах.

  10. Y - Ширина бриллианта в миллиметрах.

  11. Z - Глубина бриллианта в миллиметрах.

Цель исследования: Анализ взаимосвязей между различными характеристиками бриллиантов (такими как карат, чистота и огранка) и их ценой. Этот анализ может помочь определить, какие атрибуты оказывают наибольшее влияние на стоимость бриллианта и предоставить информацию для прогнозирования цен на основе параметров.

Ссылка на датасет: https://www.kaggle.com/datasets/nancyalaswad90/diamonds-prices

Второй датасет: Forbes 2022 Billionaires data

Описание: Этот набор данных содержит ежегодный рейтинг миллиардеров с самыми высокими состояниями, составленный журналом Forbes. Информация включает чистую стоимость активов каждого человека, оцененную в долларах США на основе подтвержденных активов за вычетом долгов. Исключены лица, чье богатство не может быть задокументировано, а также представители монархий и диктатуры, чье богатство зависит от их положения. Методология сбора данных включает интервьюирование миллиардеров, анализ публичных данных и оценку активов по рыночным ценам.

Объект исследования: Объектом исследования данного датасета являются документально подтверждённые состояния миллиардеров по всему миру на 2022 год.

Атрибуты объекта:

  1. Rank - Ранг в списке миллиардеров Forbes, который показывает позицию человека по величине состояния среди всех миллиардеров, начиная с самого богатого.

  2. Name - Имя и фамилия миллиардера.

  3. Networth - Чистая стоимость активов миллиардера, выраженная в миллиардах долларов США.

  4. Age - Возраст миллиардера на момент составления рейтинга.

  5. Country - Страна проживания миллиардера, которая показывает национальную принадлежность или основное место жительства.

  6. Source - Источник состояния, указывающий на основные компании, отрасли или типы бизнеса, благодаря которым было накоплено богатство.

  7. Industry - Отрасль, к которой относится основной источник дохода миллиардера.

Цель исследования: Определить распределение и влияние различных факторов (например, происхождения состояния, географического региона) на величину состояния. Это поможет выявить тренды в распределении богатства и дать более глубокое понимание ключевых факторов, влияющих на богатство миллиардеров.

Ссылка на датасет: https://www.kaggle.com/datasets/surajjha101/forbes-billionaires-data-preprocessed

Третий датасет: Tesla Insider Trading

Описание: Этот датасет представляет собой небольшой фрагмент данных о торговле акциями компании Tesla с участием инсайдеров и содержит записи крупных сделок с ноября 2021 года по июль 2022 года. Включает в себя информацию о личности, совершившей сделку, её должности, типе транзакции (покупка, продажа или опцион), стоимости и количестве акций, дате и общей стоимости сделки. Дополнительно указана дата подачи отчета в SEC (Форма 4).

Объект исследования: Объектом исследования данного датасета являются транзакции с акциями Tesla, совершенные инсайдерами компании в период с ноября 2021 года по июль 2022 года.

Атрибуты объекта:

  1. Insider Trading - Лицо, совершившее транзакцию.

  2. Relationship - Статус этого лица в компании.

  3. Date - Дата, когда транзакция была завершена.

  4. Transaction - Тип транзакции.

  5. Cost - Стоимость акций в этой транзакции.

  6. Shares - Сколько акций участвует в транзакции.

  7. Value ($) - Общая стоимость транзакции.

  8. Shares Total - Общее количество акций лица на данный момент.

  9. SEC Form 4 - Дата, когда транзакция была зарегистрирована.

Цель исследования: Анализ инсайдерских сделок, выявление трендов в покупке или продаже акций инсайдерами, а также определение потенциального влияния этих действий на стоимость акций Tesla. Информация может быть полезной для прогнозирования динамики акций компании и принятия инвестиционных решений на основе анализа действий крупных держателей акций.

Ссылка на датасет: https://www.kaggle.com/datasets/ilyaryabov/tesla-insider-trading

Работа с наборами данных

Загрузим три датасета и оценим их структуру

In [5]:
import pandas as pd 
df = pd.read_csv("..//static//csv//DiamondsPrices2022.csv")
df2 = pd.read_csv("..//static//csv//ForbesBillionaires.csv")
df3 = pd.read_csv("..//static//csv//TSLA.csv")

df.info()
df2.info()
df3.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 53943 entries, 0 to 53942
Data columns (total 11 columns):
 #   Column      Non-Null Count  Dtype  
---  ------      --------------  -----  
 0   Unnamed: 0  53943 non-null  int64  
 1   carat       53943 non-null  float64
 2   cut         53943 non-null  object 
 3   color       53943 non-null  object 
 4   clarity     53943 non-null  object 
 5   depth       53943 non-null  float64
 6   table       53943 non-null  float64
 7   price       53943 non-null  int64  
 8   x           53943 non-null  float64
 9   y           53943 non-null  float64
 10  z           53943 non-null  float64
dtypes: float64(6), int64(2), object(3)
memory usage: 4.5+ MB
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2600 entries, 0 to 2599
Data columns (total 7 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   Rank      2600 non-null   int64  
 1   Name      2600 non-null   object 
 2   Networth  2600 non-null   float64
 3   Age       2600 non-null   int64  
 4   Country   2600 non-null   object 
 5   Source    2600 non-null   object 
 6   Industry  2600 non-null   object 
dtypes: float64(1), int64(2), object(4)
memory usage: 142.3+ KB
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 156 entries, 0 to 155
Data columns (total 9 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   Insider Trading  156 non-null    object 
 1   Relationship     156 non-null    object 
 2   Date             156 non-null    object 
 3   Transaction      156 non-null    object 
 4   Cost             156 non-null    float64
 5   Shares           156 non-null    object 
 6   Value ($)        156 non-null    object 
 7   Shares Total     156 non-null    object 
 8   SEC Form 4       156 non-null    object 
dtypes: float64(1), object(8)
memory usage: 11.1+ KB

Получение сведений о пропущенных данных

Типы пропущенных данных:

  • None - представление пустых данных в Python
  • NaN - представление пустых данных в Pandas
  • ' ' - пустая строка
In [10]:
# цены на бриллианты
print("Цены на бриллианты")
# Количество пустых значений признаков
print(df.isnull().sum())

print()

# Есть ли пустые значения признаков
print(df.isnull().any())

print()

# Процент пустых значений признаков
for i in df.columns:
    null_rate = df[i].isnull().sum() / len(df) * 100
    if null_rate > 0:
        print(f"{i} процент пустых значений: %{null_rate:.2f}\n")

# рейтинг миллиардеров с Forbes 
print("Рейтинг миллиардеров с Forbes")
# Количество пустых значений признаков
print(df2.isnull().sum())

print()

# Есть ли пустые значения признаков
print(df2.isnull().any())

print()

# Процент пустых значений признаков
for i in df2.columns:
    null_rate = df2[i].isnull().sum() / len(df2) * 100
    if null_rate > 0:
        print(f"{i} процент пустых значений: %{null_rate:.2f}\n")


# Инсайдерские акции компании Tesla
print("Торговля акциями компании Tesla")
# Количество пустых значений признаков
print(df3.isnull().sum())

print()

# Есть ли пустые значения признаков
print(df3.isnull().any())

print()

# Процент пустых значений признаков
for i in df3.columns:
    null_rate = df3[i].isnull().sum() / len(df3) * 100
    if null_rate > 0:
        print(f"{i} процент пустых значений: %{null_rate:.2f}\n")
Цены на бриллианты
Unnamed: 0    0
carat         0
cut           0
color         0
clarity       0
depth         0
table         0
price         0
x             0
y             0
z             0
dtype: int64

Unnamed: 0    False
carat         False
cut           False
color         False
clarity       False
depth         False
table         False
price         False
x             False
y             False
z             False
dtype: bool

Рейтинг миллиардеров с Forbes
Rank        0
Name        0
Networth    0
Age         0
Country     0
Source      0
Industry    0
dtype: int64

Rank        False
Name        False
Networth    False
Age         False
Country     False
Source      False
Industry    False
dtype: bool

Торговля акциями компании Tesla
Insider Trading    0
Relationship       0
Date               0
Transaction        0
Cost               0
Shares             0
Value ($)          0
Shares Total       0
SEC Form 4         0
dtype: int64

Insider Trading    False
Relationship       False
Date               False
Transaction        False
Cost               False
Shares             False
Value ($)          False
Shares Total       False
SEC Form 4         False
dtype: bool

В результате проверки на пустые строки и значения мы видим, что таковых не обнаружено

Проверка набора данных на аномальные распределения

Проверим датасет по числовым данным, для выявления аномальных распределений

In [44]:
print(df.describe())
print(df2.describe())
print(df3.describe())
         Unnamed: 0         carat         depth         table         price  \
count  53943.000000  53943.000000  53943.000000  53943.000000  53943.000000   
mean   26972.000000      0.797935     61.749322     57.457251   3932.734294   
std    15572.147122      0.473999      1.432626      2.234549   3989.338447   
min        1.000000      0.200000     43.000000     43.000000    326.000000   
25%    13486.500000      0.400000     61.000000     56.000000    950.000000   
50%    26972.000000      0.700000     61.800000     57.000000   2401.000000   
75%    40457.500000      1.040000     62.500000     59.000000   5324.000000   
max    53943.000000      5.010000     79.000000     95.000000  18823.000000   

                  x             y             z  
count  53943.000000  53943.000000  53943.000000  
mean       5.731158      5.734526      3.538730  
std        1.121730      1.142103      0.705679  
min        0.000000      0.000000      0.000000  
25%        4.710000      4.720000      2.910000  
50%        5.700000      5.710000      3.530000  
75%        6.540000      6.540000      4.040000  
max       10.740000     58.900000     31.800000  
             Rank      Networth          Age
count  2600.000000  2600.000000  2600.000000
mean   1269.570769     4.860750    64.271923
std     728.146364    10.659671    13.220607
min       1.000000     1.000000    19.000000
25%     637.000000     1.500000    55.000000
50%    1292.000000     2.400000    64.000000
75%    1929.000000     4.500000    74.000000
max    2578.000000   219.000000   100.000000
              Cost
count   156.000000
mean    478.785641
std     448.922903
min       0.000000
25%      50.522500
50%     240.225000
75%     934.107500
max    1171.040000

Здесь можно определить, что в некоторых областях присутствует аномальное распределение. Следовательно аномальное рапределение будем искать по z-индексу. Он показывает нам, насколько далеко значение находится от среднего в стандартных отклонениях. Значения Z-индекса больше 3 или меньше -3 обычно считаются аномальными.

In [45]:
from scipy import stats
# Вычисляем Z-индексы только для числовых столбцов
df_zscores = df.select_dtypes(include=['float64', 'int64']).apply(stats.zscore, nan_policy='omit')
df2_zscores = df2.select_dtypes(include=['float64', 'int64']).apply(stats.zscore, nan_policy='omit')
df3_zscores = df3.select_dtypes(include=['float64', 'int64']).apply(stats.zscore, nan_policy='omit')

# Порог для поиска аномалий
threshold = 3

def find_anomalies(zscores, data):
    for column in zscores.columns:
        # Проверка на присутствие аномалии 
        anomalies = data[column][(zscores[column].abs() > threshold)]
        if not anomalies.empty:
            print(f"В атрибуте '{column}' обнаружены аномалии: {anomalies.tolist()}")

try:
    print("Аномалии в наборе данных Diamonds Prices:")
    find_anomalies(df_zscores, df)

    print("\nАномалии в наборе данных Forbes Billionaires:")
    find_anomalies(df2_zscores, df2)

    print("\nАномалии в наборе данных Tesla:")
    find_anomalies(df3_zscores, df3)

except Exception as e:
    print(f"Произошла ошибка: {e}")
Аномалии в наборе данных Diamonds Prices:
В атрибуте 'carat' обнаружены аномалии: [2.22, 2.27, 2.49, 3.0, 2.22, 2.25, 2.32, 2.72, 2.23, 2.25, 2.27, 2.3, 2.31, 2.5, 3.01, 3.0, 2.33, 2.68, 2.25, 2.5, 2.34, 2.5, 2.74, 2.28, 2.25, 2.68, 2.43, 3.11, 3.01, 2.52, 2.77, 2.63, 3.05, 2.46, 3.02, 2.63, 2.22, 2.38, 3.01, 3.0, 2.24, 2.32, 2.3, 2.25, 2.25, 2.34, 2.34, 2.26, 2.36, 2.29, 3.0, 2.72, 2.33, 3.65, 2.45, 2.45, 2.24, 2.4, 2.5, 2.54, 2.31, 2.36, 3.24, 2.3, 2.38, 2.31, 2.4, 2.3, 2.58, 2.22, 3.22, 3.5, 2.23, 2.54, 2.28, 2.23, 2.29, 2.26, 2.48, 2.28, 2.23, 2.27, 2.3, 2.34, 2.44, 2.23, 2.26, 2.75, 2.29, 3.0, 2.33, 2.5, 2.5, 2.33, 2.22, 2.3, 2.41, 2.22, 2.25, 2.32, 2.29, 2.22, 2.22, 2.29, 2.29, 2.22, 2.61, 2.26, 2.24, 2.31, 2.52, 2.26, 2.28, 2.28, 2.26, 2.23, 2.3, 2.3, 2.22, 2.29, 2.23, 2.36, 2.35, 2.5, 2.51, 2.3, 2.28, 3.01, 2.27, 2.51, 2.23, 2.22, 2.7, 2.25, 2.28, 2.55, 2.27, 2.35, 2.22, 2.54, 2.29, 2.5, 2.51, 2.51, 2.3, 2.22, 2.38, 2.5, 2.53, 2.22, 2.32, 2.32, 2.33, 2.54, 2.43, 2.23, 2.3, 2.58, 2.55, 2.25, 2.33, 2.31, 2.37, 2.23, 3.0, 2.27, 2.47, 2.43, 2.48, 2.8, 2.22, 2.33, 2.35, 2.53, 2.22, 4.01, 4.01, 2.56, 2.5, 2.41, 2.25, 2.24, 2.41, 2.31, 2.51, 3.04, 2.29, 2.24, 2.54, 2.25, 2.28, 2.75, 2.26, 2.47, 2.3, 2.24, 2.22, 2.26, 2.27, 2.24, 2.46, 2.48, 2.52, 2.27, 2.34, 2.4, 2.24, 2.39, 2.4, 2.5, 3.4, 4.0, 2.5, 2.3, 2.53, 2.25, 2.37, 2.23, 3.01, 2.28, 2.37, 2.3, 2.24, 2.24, 2.31, 2.38, 2.43, 2.28, 2.3, 2.28, 3.67, 2.58, 2.42, 2.42, 2.42, 2.32, 2.66, 2.66, 2.26, 2.26, 2.38, 2.4, 2.51, 2.24, 2.4, 2.65, 2.3, 2.35, 2.54, 2.54, 2.28, 2.22, 2.51, 2.28, 2.59, 2.46, 2.47, 2.44, 3.01, 2.22, 2.24, 2.28, 2.25, 2.45, 2.28, 2.38, 2.24, 2.39, 2.4, 2.22, 2.36, 2.24, 2.53, 2.48, 2.51, 2.37, 2.39, 2.4, 2.31, 2.23, 2.48, 2.42, 2.51, 2.26, 2.63, 2.49, 2.53, 2.37, 2.28, 2.5, 2.28, 3.0, 3.0, 2.41, 2.27, 2.31, 2.26, 2.6, 2.5, 2.4, 2.27, 2.32, 2.31, 2.53, 2.57, 2.22, 2.25, 2.71, 2.27, 2.22, 2.22, 2.51, 2.74, 2.42, 2.42, 2.74, 2.56, 2.3, 2.6, 2.61, 2.31, 2.52, 2.25, 2.42, 2.35, 2.35, 2.26, 4.13, 2.54, 2.39, 2.5, 2.64, 2.48, 2.31, 2.51, 2.44, 2.33, 2.32, 2.52, 2.36, 2.29, 2.36, 2.53, 2.48, 2.52, 2.39, 2.29, 2.28, 2.32, 2.52, 2.31, 2.56, 2.72, 2.36, 2.43, 2.32, 2.28, 2.48, 2.39, 2.41, 2.57, 2.4, 2.39, 2.24, 2.54, 2.35, 2.25, 5.01, 2.51, 2.32, 2.32, 2.26, 2.51, 2.25, 2.25, 2.51, 2.28, 2.29, 2.32, 2.51, 2.3, 2.45, 2.33, 2.23, 2.52, 2.3, 2.3, 3.01, 3.01, 3.01, 3.01, 3.01, 2.52, 2.53, 2.51, 2.24, 2.3, 2.51, 2.5, 2.49, 2.27, 2.22, 2.6, 2.32, 2.4, 2.26, 2.29, 2.44, 2.22, 2.5, 2.57, 2.66, 2.32, 2.37, 2.38, 2.22, 4.5, 2.32, 2.4, 2.4, 3.04, 2.38, 3.01, 2.29, 2.42, 2.29, 2.67, 2.43, 2.48, 3.51, 2.22, 3.01, 3.01, 2.36, 2.61, 2.55, 2.8, 2.29, 2.29]
В атрибуте 'depth' обнаружены аномалии: [56.9, 55.1, 66.3, 67.9, 57.2, 55.1, 67.4, 67.3, 66.4, 68.1, 55.0, 56.0, 53.1, 57.2, 66.7, 53.3, 53.0, 67.8, 67.9, 66.1, 56.9, 55.8, 67.6, 68.2, 67.7, 66.3, 69.5, 56.9, 56.6, 56.3, 66.9, 67.0, 56.0, 67.1, 66.4, 69.3, 66.2, 55.4, 66.8, 66.8, 66.1, 66.1, 68.1, 67.0, 66.6, 55.9, 57.3, 57.3, 57.3, 68.2, 57.4, 66.6, 67.0, 67.0, 68.3, 57.2, 66.8, 57.3, 66.3, 66.1, 68.5, 69.3, 57.4, 56.2, 57.4, 66.1, 56.3, 56.5, 56.1, 56.2, 66.5, 67.6, 66.1, 68.4, 66.2, 69.7, 56.9, 66.6, 57.1, 66.4, 68.7, 66.5, 57.4, 56.7, 66.1, 56.6, 66.8, 66.4, 66.1, 68.6, 71.6, 68.7, 67.3, 66.7, 56.7, 67.7, 66.6, 43.0, 68.8, 66.7, 66.1, 67.1, 67.4, 66.5, 66.1, 57.1, 57.1, 67.8, 67.5, 57.2, 66.4, 67.7, 66.3, 69.0, 57.4, 55.2, 68.2, 68.9, 66.8, 57.4, 56.7, 69.6, 57.4, 56.9, 57.3, 57.4, 66.1, 57.0, 56.4, 56.0, 57.4, 66.1, 68.3, 66.5, 56.8, 66.8, 57.3, 44.0, 57.4, 67.0, 66.1, 56.8, 57.2, 56.4, 56.9, 56.8, 56.8, 57.1, 66.2, 56.9, 66.9, 56.5, 55.2, 66.3, 56.8, 66.3, 56.3, 57.3, 67.8, 56.7, 66.8, 57.1, 66.2, 66.3, 56.8, 66.4, 56.4, 67.2, 57.4, 55.9, 68.8, 66.2, 68.3, 67.1, 70.1, 57.0, 71.3, 66.2, 57.4, 70.6, 69.8, 66.9, 56.7, 66.5, 69.8, 56.5, 71.8, 66.6, 66.4, 66.8, 66.8, 57.0, 57.1, 66.6, 66.9, 67.5, 57.1, 57.4, 69.7, 68.4, 67.6, 56.5, 56.9, 55.9, 66.3, 66.1, 69.7, 66.7, 66.9, 57.2, 43.0, 53.8, 66.1, 66.4, 56.3, 66.1, 56.7, 57.4, 69.5, 66.8, 66.7, 55.9, 56.9, 56.9, 66.6, 56.9, 53.2, 67.0, 56.5, 56.8, 56.3, 70.0, 67.3, 66.2, 55.9, 56.8, 57.2, 56.9, 57.4, 68.5, 57.4, 68.9, 68.9, 57.2, 66.6, 69.4, 57.2, 55.8, 66.6, 56.6, 67.6, 57.3, 66.6, 56.7, 66.7, 67.8, 67.4, 55.9, 57.3, 56.3, 67.0, 67.6, 57.3, 68.0, 69.8, 66.9, 57.0, 67.3, 66.6, 69.0, 57.4, 57.0, 67.0, 66.8, 57.4, 68.1, 57.4, 57.4, 57.3, 66.3, 70.2, 57.1, 66.4, 68.0, 68.0, 66.3, 66.9, 57.1, 67.7, 66.1, 68.5, 70.1, 66.2, 67.4, 56.7, 67.7, 50.8, 66.5, 55.6, 70.5, 68.2, 68.0, 57.4, 56.5, 67.6, 56.9, 57.4, 55.9, 68.6, 71.0, 68.4, 67.4, 55.6, 56.1, 67.2, 68.8, 55.8, 56.8, 69.6, 57.1, 56.3, 66.1, 56.7, 66.3, 56.6, 66.5, 66.8, 67.1, 66.8, 67.3, 66.5, 68.3, 56.2, 66.1, 67.1, 69.1, 56.0, 56.3, 67.5, 56.9, 68.7, 57.2, 57.4, 57.2, 57.2, 57.2, 67.1, 68.3, 66.6, 66.9, 57.0, 66.3, 67.7, 55.2, 66.2, 66.5, 66.9, 56.7, 56.1, 66.7, 57.0, 67.9, 66.7, 66.4, 55.3, 56.9, 57.0, 56.2, 57.2, 67.1, 56.8, 56.2, 67.4, 57.1, 56.8, 66.3, 57.3, 66.3, 56.3, 57.0, 56.7, 57.3, 57.2, 56.5, 67.0, 66.5, 66.6, 66.9, 56.7, 67.2, 70.2, 56.2, 66.7, 66.3, 66.1, 66.8, 66.9, 56.9, 56.8, 67.7, 67.5, 67.6, 56.9, 70.6, 55.2, 67.6, 56.3, 66.2, 66.2, 68.6, 56.9, 56.5, 66.4, 57.0, 66.8, 57.1, 55.3, 56.7, 54.2, 57.0, 67.9, 56.5, 66.8, 68.6, 56.2, 57.1, 56.6, 66.3, 55.2, 57.1, 67.0, 51.0, 66.9, 66.8, 67.3, 67.3, 66.7, 57.4, 57.2, 56.0, 66.9, 56.6, 56.3, 57.4, 68.3, 66.9, 66.3, 70.8, 66.5, 56.4, 66.5, 54.2, 57.1, 66.9, 54.6, 53.2, 54.0, 54.4, 66.3, 56.9, 66.3, 66.5, 55.2, 70.8, 66.5, 56.7, 56.8, 57.3, 67.5, 66.8, 56.3, 56.6, 66.2, 68.6, 66.5, 67.1, 66.2, 56.5, 66.5, 57.1, 56.5, 67.1, 66.6, 66.3, 57.3, 57.1, 68.6, 56.3, 66.5, 56.5, 66.9, 52.3, 67.3, 66.1, 57.2, 56.8, 57.2, 66.4, 66.1, 55.5, 66.5, 57.2, 56.3, 56.8, 56.7, 66.9, 56.3, 57.4, 67.6, 78.2, 57.4, 66.1, 71.2, 55.8, 67.0, 56.2, 52.7, 66.5, 57.3, 57.2, 66.7, 57.4, 56.3, 55.8, 54.3, 57.4, 66.1, 66.8, 55.3, 56.4, 66.3, 57.0, 55.3, 69.3, 66.9, 57.2, 57.4, 56.1, 56.4, 57.2, 56.7, 66.4, 67.0, 57.1, 56.3, 56.9, 56.9, 55.1, 56.0, 66.1, 66.2, 67.6, 71.6, 66.9, 69.7, 69.2, 68.0, 56.9, 66.9, 57.3, 66.1, 67.8, 68.9, 55.8, 56.6, 57.2, 67.2, 68.5, 73.6, 56.9, 68.6, 56.2, 67.4, 67.2, 66.1, 57.0, 55.0, 70.6, 56.2, 57.1, 55.3, 52.2, 67.4, 57.4, 68.4, 67.3, 57.4, 56.1, 67.3, 67.6, 57.0, 57.1, 66.9, 57.2, 57.1, 56.6, 57.4, 67.3, 57.0, 57.2, 55.5, 57.1, 69.9, 56.6, 68.4, 57.4, 57.0, 55.8, 53.4, 56.9, 56.7, 66.3, 57.0, 66.7, 68.5, 57.3, 68.0, 66.1, 66.5, 68.8, 57.1, 70.2, 55.9, 68.2, 67.2, 66.4, 66.5, 56.1, 57.4, 67.8, 67.3, 55.6, 66.3, 66.7, 66.6, 67.8, 56.2, 66.3, 66.2, 66.4, 55.9, 67.1, 57.2, 66.4, 67.7, 57.3, 72.2, 57.4, 56.8, 57.2, 56.9, 57.0, 66.2, 56.9, 56.7, 66.4, 67.3, 55.5, 67.8, 69.0, 66.6, 66.8, 66.3, 57.4, 66.2, 57.1, 66.1, 66.5, 66.5, 79.0, 79.0, 67.7, 56.5, 66.7, 57.0, 67.6, 66.9, 72.9, 54.7, 57.3, 66.9, 55.6, 55.4, 68.7, 66.8]
В атрибуте 'table' обнаружены аномалии: [65.0, 69.0, 67.0, 66.0, 70.0, 66.0, 68.0, 67.0, 67.0, 65.0, 70.0, 69.0, 65.0, 66.0, 67.0, 67.0, 66.0, 65.0, 66.0, 67.0, 66.0, 66.0, 65.0, 66.0, 65.0, 65.0, 67.0, 65.0, 66.0, 65.0, 68.0, 65.0, 66.0, 66.0, 66.0, 50.1, 65.0, 65.0, 66.0, 66.0, 65.0, 65.0, 67.0, 65.0, 65.0, 65.0, 65.0, 65.0, 66.0, 65.0, 65.0, 67.0, 66.0, 68.0, 65.0, 65.0, 65.0, 66.0, 66.0, 65.0, 49.0, 65.0, 66.0, 66.0, 67.0, 67.0, 65.0, 67.0, 66.0, 65.0, 66.0, 67.0, 65.0, 65.0, 65.0, 65.0, 50.0, 65.0, 66.0, 67.0, 65.0, 68.0, 66.0, 65.0, 65.0, 65.0, 65.0, 66.0, 65.0, 67.0, 66.0, 66.0, 66.0, 68.0, 65.0, 67.0, 65.0, 66.0, 66.0, 65.0, 68.0, 65.0, 43.0, 65.0, 65.0, 66.0, 67.0, 65.0, 65.0, 65.0, 65.0, 65.0, 65.0, 68.0, 67.0, 66.0, 65.0, 65.0, 67.0, 65.0, 66.0, 65.0, 65.0, 65.0, 65.0, 67.0, 65.0, 66.0, 67.0, 66.0, 69.0, 65.0, 65.0, 65.0, 66.0, 68.0, 66.0, 66.0, 65.0, 65.0, 69.0, 65.0, 66.0, 65.0, 65.0, 66.0, 67.0, 66.0, 49.0, 68.0, 65.0, 70.0, 66.0, 65.0, 67.0, 68.0, 65.0, 66.0, 65.0, 68.0, 68.0, 66.0, 65.0, 66.0, 69.0, 66.0, 65.0, 95.0, 66.0, 65.0, 66.0, 50.0, 65.0, 66.0, 66.0, 65.0, 65.0, 66.0, 65.0, 65.0, 65.0, 66.0, 69.0, 65.0, 65.0, 65.0, 65.0, 65.0, 66.0, 65.0, 66.0, 66.0, 65.0, 67.0, 66.0, 67.0, 65.0, 65.0, 66.0, 65.0, 44.0, 68.0, 65.0, 65.0, 67.0, 67.0, 66.0, 65.0, 65.0, 66.0, 65.0, 65.0, 66.0, 66.0, 65.0, 69.0, 65.0, 65.0, 66.0, 67.0, 68.0, 65.0, 68.0, 65.0, 70.0, 66.0, 65.0, 65.0, 66.0, 66.0, 65.0, 68.0, 65.0, 64.3, 65.0, 66.0, 69.0, 65.0, 66.0, 65.0, 70.0, 65.0, 65.0, 65.0, 71.0, 66.0, 67.0, 68.0, 67.0, 67.0, 67.0, 66.0, 66.0, 70.0, 67.0, 67.0, 65.0, 67.0, 65.0, 67.0, 65.0, 66.0, 66.0, 65.0, 66.0, 66.0, 66.0, 64.2, 68.0, 66.0, 66.0, 66.0, 66.0, 65.0, 66.0, 65.0, 65.0, 66.0, 65.0, 73.0, 66.0, 65.0, 65.0, 65.0, 67.0, 65.0, 65.0, 68.0, 65.0, 66.0, 65.4, 65.0, 65.0, 65.0, 66.0, 79.0, 65.0, 68.0, 70.0, 66.0, 65.0, 65.0, 67.0, 66.0, 65.0, 65.0, 76.0, 73.0, 65.0, 65.0, 66.0, 66.0, 65.0, 65.0, 65.0, 65.0, 70.0, 65.0, 66.0, 65.0, 70.0, 69.0, 67.0, 67.0, 73.0, 73.0, 66.0, 68.0, 66.0, 65.0, 65.0, 67.0, 67.0, 65.0, 65.0, 65.0]
В атрибуте 'price' обнаружены аномалии: [15907, 15908, 15913, 15915, 15917, 15917, 15917, 15919, 15919, 15919, 15920, 15922, 15923, 15928, 15930, 15930, 15931, 15934, 15937, 15938, 15939, 15939, 15941, 15941, 15941, 15942, 15946, 15948, 15948, 15949, 15949, 15952, 15955, 15957, 15959, 15959, 15962, 15964, 15965, 15966, 15968, 15970, 15970, 15974, 15977, 15977, 15983, 15984, 15984, 15984, 15984, 15987, 15987, 15990, 15991, 15992, 15992, 15992, 15992, 15992, 15992, 15993, 15996, 15996, 16003, 16004, 16013, 16018, 16021, 16023, 16025, 16031, 16036, 16037, 16041, 16043, 16048, 16049, 16052, 16055, 16059, 16062, 16062, 16064, 16064, 16064, 16068, 16068, 16073, 16073, 16075, 16077, 16080, 16082, 16085, 16086, 16086, 16087, 16091, 16092, 16097, 16098, 16100, 16104, 16104, 16111, 16112, 16112, 16116, 16123, 16126, 16128, 16129, 16130, 16131, 16137, 16140, 16146, 16147, 16148, 16149, 16149, 16151, 16169, 16169, 16169, 16170, 16171, 16171, 16174, 16179, 16181, 16183, 16187, 16187, 16188, 16189, 16190, 16191, 16192, 16193, 16195, 16198, 16198, 16198, 16206, 16210, 16215, 16219, 16220, 16223, 16224, 16231, 16231, 16232, 16234, 16235, 16235, 16237, 16239, 16239, 16239, 16240, 16240, 16241, 16241, 16241, 16242, 16253, 16253, 16256, 16256, 16261, 16262, 16273, 16274, 16277, 16278, 16280, 16280, 16286, 16287, 16287, 16287, 16290, 16291, 16294, 16294, 16295, 16297, 16300, 16300, 16304, 16304, 16304, 16309, 16309, 16311, 16314, 16316, 16316, 16316, 16319, 16319, 16319, 16323, 16329, 16336, 16337, 16339, 16340, 16340, 16343, 16353, 16353, 16357, 16357, 16358, 16363, 16364, 16364, 16368, 16369, 16370, 16378, 16380, 16383, 16384, 16386, 16389, 16390, 16392, 16392, 16395, 16397, 16397, 16398, 16400, 16402, 16404, 16406, 16407, 16407, 16409, 16410, 16412, 16420, 16422, 16425, 16426, 16427, 16427, 16427, 16431, 16437, 16439, 16442, 16446, 16450, 16451, 16459, 16462, 16462, 16465, 16466, 16466, 16469, 16472, 16479, 16479, 16483, 16484, 16485, 16492, 16499, 16499, 16505, 16506, 16506, 16507, 16512, 16512, 16513, 16518, 16519, 16520, 16521, 16530, 16532, 16533, 16538, 16544, 16544, 16545, 16547, 16547, 16551, 16558, 16558, 16558, 16560, 16562, 16564, 16565, 16570, 16575, 16575, 16580, 16582, 16582, 16583, 16587, 16589, 16592, 16593, 16599, 16601, 16603, 16611, 16613, 16616, 16617, 16618, 16624, 16626, 16626, 16626, 16626, 16628, 16628, 16629, 16629, 16629, 16632, 16636, 16641, 16642, 16643, 16643, 16650, 16650, 16650, 16656, 16657, 16665, 16669, 16670, 16677, 16683, 16687, 16687, 16688, 16689, 16690, 16693, 16694, 16694, 16700, 16703, 16704, 16704, 16707, 16709, 16709, 16709, 16715, 16716, 16716, 16716, 16717, 16718, 16718, 16723, 16723, 16728, 16731, 16733, 16733, 16733, 16733, 16733, 16733, 16736, 16737, 16742, 16747, 16750, 16754, 16768, 16769, 16776, 16776, 16778, 16778, 16778, 16778, 16778, 16778, 16778, 16779, 16779, 16779, 16783, 16783, 16783, 16783, 16786, 16787, 16789, 16789, 16789, 16790, 16791, 16792, 16793, 16793, 16797, 16800, 16801, 16803, 16804, 16805, 16807, 16808, 16811, 16813, 16817, 16819, 16820, 16823, 16824, 16826, 16842, 16842, 16854, 16857, 16861, 16872, 16872, 16874, 16878, 16879, 16881, 16881, 16889, 16896, 16900, 16900, 16900, 16901, 16904, 16914, 16914, 16914, 16914, 16915, 16916, 16921, 16922, 16929, 16931, 16934, 16937, 16941, 16942, 16944, 16945, 16948, 16954, 16955, 16955, 16956, 16956, 16957, 16960, 16960, 16960, 16969, 16970, 16970, 16975, 16985, 16985, 16987, 16988, 16992, 16994, 16996, 17000, 17001, 17003, 17005, 17006, 17009, 17010, 17012, 17014, 17016, 17017, 17019, 17024, 17024, 17027, 17028, 17028, 17028, 17029, 17036, 17038, 17039, 17041, 17042, 17045, 17045, 17049, 17049, 17050, 17051, 17051, 17052, 17053, 17057, 17057, 17062, 17063, 17065, 17066, 17068, 17068, 17068, 17068, 17068, 17073, 17073, 17076, 17078, 17079, 17081, 17084, 17094, 17095, 17095, 17096, 17099, 17100, 17103, 17108, 17111, 17114, 17114, 17115, 17116, 17118, 17123, 17125, 17126, 17127, 17136, 17138, 17141, 17143, 17143, 17146, 17149, 17151, 17153, 17153, 17156, 17160, 17162, 17164, 17166, 17168, 17168, 17172, 17172, 17175, 17176, 17179, 17179, 17182, 17184, 17186, 17191, 17191, 17192, 17193, 17193, 17194, 17197, 17197, 17203, 17203, 17204, 17204, 17206, 17209, 17209, 17213, 17214, 17216, 17218, 17219, 17219, 17220, 17221, 17223, 17224, 17227, 17228, 17231, 17233, 17235, 17235, 17237, 17240, 17244, 17245, 17247, 17250, 17254, 17256, 17258, 17262, 17263, 17263, 17265, 17265, 17265, 17267, 17273, 17278, 17279, 17294, 17294, 17294, 17294, 17297, 17312, 17313, 17313, 17315, 17317, 17323, 17323, 17327, 17329, 17329, 17330, 17334, 17338, 17339, 17343, 17347, 17351, 17353, 17353, 17357, 17358, 17360, 17360, 17365, 17365, 17366, 17374, 17377, 17379, 17381, 17383, 17392, 17393, 17393, 17400, 17403, 17403, 17403, 17403, 17405, 17405, 17407, 17408, 17414, 17416, 17422, 17425, 17433, 17433, 17434, 17436, 17441, 17442, 17447, 17448, 17449, 17451, 17452, 17455, 17458, 17460, 17469, 17469, 17472, 17473, 17474, 17475, 17476, 17485, 17489, 17492, 17492, 17496, 17497, 17499, 17504, 17509, 17513, 17514, 17515, 17516, 17521, 17522, 17523, 17525, 17530, 17533, 17534, 17534, 17535, 17539, 17545, 17548, 17552, 17553, 17554, 17555, 17569, 17569, 17570, 17574, 17579, 17581, 17582, 17590, 17591, 17592, 17595, 17597, 17597, 17598, 17600, 17604, 17605, 17606, 17607, 17607, 17608, 17609, 17614, 17614, 17617, 17634, 17640, 17642, 17649, 17650, 17658, 17659, 17662, 17663, 17666, 17667, 17672, 17673, 17673, 17674, 17676, 17676, 17685, 17688, 17688, 17689, 17689, 17692, 17694, 17710, 17712, 17713, 17714, 17715, 17716, 17723, 17724, 17729, 17730, 17740, 17742, 17746, 17747, 17751, 17752, 17753, 17759, 17759, 17760, 17760, 17760, 17760, 17760, 17760, 17761, 17765, 17766, 17772, 17773, 17776, 17778, 17784, 17798, 17801, 17803, 17803, 17804, 17805, 17805, 17811, 17816, 17820, 17825, 17825, 17826, 17829, 17835, 17837, 17838, 17840, 17841, 17849, 17849, 17849, 17849, 17856, 17864, 17869, 17871, 17871, 17877, 17882, 17887, 17888, 17889, 17891, 17891, 17892, 17892, 17892, 17893, 17893, 17893, 17894, 17895, 17898, 17902, 17904, 17904, 17905, 17909, 17916, 17917, 17920, 17923, 17924, 17930, 17932, 17934, 17936, 17936, 17938, 17949, 17952, 17952, 17953, 17955, 17955, 17957, 17975, 17983, 17986, 17987, 17988, 17989, 17995, 17996, 17999, 17999, 18001, 18002, 18003, 18005, 18007, 18014, 18017, 18018, 18020, 18023, 18026, 18026, 18026, 18026, 18027, 18027, 18028, 18029, 18029, 18034, 18034, 18034, 18037, 18041, 18050, 18055, 18055, 18057, 18059, 18062, 18062, 18066, 18067, 18068, 18069, 18071, 18077, 18077, 18077, 18077, 18080, 18090, 18102, 18104, 18107, 18107, 18108, 18112, 18113, 18114, 18115, 18115, 18115, 18117, 18118, 18119, 18120, 18120, 18124, 18124, 18125, 18127, 18128, 18128, 18128, 18128, 18139, 18139, 18149, 18149, 18152, 18153, 18159, 18164, 18166, 18168, 18172, 18172, 18176, 18178, 18179, 18179, 18181, 18183, 18186, 18186, 18188, 18188, 18190, 18193, 18193, 18193, 18198, 18206, 18207, 18207, 18211, 18215, 18231, 18231, 18232, 18236, 18236, 18236, 18236, 18239, 18242, 18242, 18242, 18242, 18242, 18251, 18252, 18252, 18254, 18255, 18257, 18259, 18274, 18275, 18276, 18279, 18279, 18281, 18281, 18286, 18291, 18293, 18294, 18295, 18295, 18296, 18299, 18304, 18306, 18308, 18310, 18312, 18318, 18318, 18320, 18324, 18325, 18325, 18340, 18342, 18342, 18343, 18344, 18358, 18359, 18363, 18364, 18369, 18371, 18371, 18371, 18371, 18374, 18374, 18376, 18377, 18392, 18394, 18395, 18398, 18398, 18398, 18405, 18407, 18416, 18419, 18421, 18423, 18426, 18426, 18426, 18429, 18430, 18430, 18430, 18431, 18432, 18435, 18439, 18440, 18440, 18442, 18443, 18445, 18447, 18447, 18458, 18462, 18462, 18468, 18470, 18472, 18474, 18475, 18477, 18480, 18481, 18483, 18485, 18487, 18489, 18493, 18495, 18500, 18507, 18507, 18508, 18508, 18509, 18515, 18522, 18524, 18525, 18526, 18528, 18531, 18531, 18532, 18535, 18541, 18541, 18542, 18552, 18557, 18559, 18559, 18559, 18561, 18561, 18565, 18571, 18572, 18574, 18575, 18578, 18593, 18594, 18598, 18599, 18604, 18607, 18611, 18614, 18615, 18625, 18630, 18640, 18640, 18648, 18653, 18656, 18659, 18663, 18674, 18678, 18678, 18680, 18682, 18686, 18691, 18692, 18692, 18693, 18700, 18700, 18701, 18705, 18706, 18707, 18709, 18710, 18710, 18717, 18718, 18729, 18730, 18731, 18735, 18736, 18741, 18741, 18741, 18745, 18756, 18757, 18759, 18760, 18766, 18768, 18777, 18779, 18780, 18781, 18784, 18787, 18788, 18791, 18791, 18795, 18795, 18797, 18803, 18804, 18806, 18818, 18823]
В атрибуте 'x' обнаружены аномалии: [0.0, 0.0, 0.0, 9.23, 9.1, 9.11, 9.15, 9.24, 9.26, 9.11, 9.54, 9.38, 9.17, 9.53, 9.44, 9.49, 9.65, 0.0, 9.42, 9.44, 9.32, 10.14, 10.02, 9.14, 0.0, 9.42, 10.01, 9.25, 9.86, 9.3, 9.13, 10.0, 10.74, 0.0, 9.36, 10.23, 9.51, 9.44, 9.66, 9.35, 9.41, 0.0, 0.0]
В атрибуте 'y' обнаружены аномалии: [0.0, 0.0, 9.25, 9.38, 9.31, 9.48, 58.9, 9.4, 9.42, 9.59, 0.0, 9.26, 9.37, 9.19, 10.1, 9.94, 0.0, 9.34, 9.94, 9.2, 9.81, 9.85, 10.54, 0.0, 9.31, 10.16, 9.46, 9.38, 9.63, 9.22, 9.32, 31.8, 0.0, 0.0]
В атрибуте 'z' обнаружены аномалии: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.07, 0.0, 5.77, 5.76, 5.67, 5.97, 1.41, 5.98, 5.73, 5.66, 5.91, 5.79, 6.38, 8.06, 5.85, 5.92, 6.03, 0.0, 0.0, 6.17, 6.24, 5.75, 0.0, 6.16, 0.0, 6.27, 6.31, 5.69, 6.13, 5.86, 5.72, 0.0, 6.43, 6.98, 0.0, 0.0, 5.9, 5.9, 5.77, 5.77, 6.72, 6.03, 0.0, 31.8, 0.0, 0.0, 0.0]

Аномалии в наборе данных Forbes Billionaires:
В атрибуте 'Networth' обнаружены аномалии: [219.0, 171.0, 158.0, 129.0, 118.0, 111.0, 107.0, 106.0, 91.4, 90.7, 90.0, 82.0, 81.2, 74.8, 67.3, 66.2, 65.7, 65.3, 65.0, 65.0, 60.0, 60.0, 59.6, 55.1, 50.0, 49.2, 47.3, 47.1, 44.8, 43.6, 41.4, 40.4, 37.3, 37.2]
В атрибуте 'Age' обнаружены аномалии: [19]

Аномалии в наборе данных Tesla:

Разбиение набора данных на выборки

Следующим этапом разбиваем набор данных на выборки. Прежде всего стоит избавиться от большого количества уникальных значений в столбцах с целевыми признаками. Для этого добавим новый столбец в датасет Forbes Billionaires с малым количеством значений.

In [46]:
df2['networth_segment'] = pd.cut(df2['Networth'], bins=[0,10,80,250], labels=['Ultra High Networth','High Networth','Medium Networth'], include_lowest=True)
In [47]:
from sklearn.model_selection import train_test_split
def split_data(data, target_column, test_size=0.2, random_state=42):
    # Разделяем данные на обучающую и временную выборки
    X_train, X_temp, y_train, y_temp = train_test_split(data.drop(columns=[target_column]), 
                                                        data[target_column], 
                                                        test_size=test_size, 
                                                        random_state=random_state, 
                                                        stratify=data[target_column])
    # Делим временную выборку на контрольную и тестовую
    X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, 
                                                      test_size=0.5, 
                                                      random_state=random_state, 
                                                      stratify=y_temp)
    
    return X_train, X_val, X_test, y_train, y_val, y_test

# Для набора данных Diamonds Prices
df_train, df_val, df_test, df_train_labels, df_val_labels, df_test_labels = split_data(df, 'cut')

# Для набора данных Forbes Billionaires
df2_train, df2_val, df2_test, df2_train_labels, df2_val_labels, df2_test_labels = split_data(df2, 'networth_segment')

# Для набора данных Tesla
df3_train, df3_val, df3_test, df3_train_labels, df3_val_labels, df3_test_labels = split_data(df3, 'Transaction')
def check_balance(y_train, y_val, y_test):
    print("Обучающая выборка:")
    print(y_train.value_counts(normalize=True))
    print("\nКонтрольная выборка:")
    print(y_val.value_counts(normalize=True))
    print("\nТестовая выборка:")
    print(y_test.value_counts(normalize=True))

print("Набор данных Diamonds Prices:")
check_balance(df_train_labels, df_val_labels, df_test_labels)

print("\nНабор данных Forbes Billionaires:")
check_balance(df2_train_labels, df2_val_labels, df2_test_labels)

print("\nНабор данных Tesla:")
check_balance(df3_train_labels, df3_val_labels, df3_test_labels)
Набор данных Diamonds Prices:
Обучающая выборка:
cut
Ideal        0.399523
Premium      0.255689
Very Good    0.223989
Good         0.090953
Fair         0.029847
Name: proportion, dtype: float64

Контрольная выборка:
cut
Ideal        0.399518
Premium      0.255654
Very Good    0.223953
Good         0.091027
Fair         0.029848
Name: proportion, dtype: float64

Тестовая выборка:
cut
Ideal        0.399444
Premium      0.255792
Very Good    0.224096
Good         0.090825
Fair         0.029842
Name: proportion, dtype: float64

Набор данных Forbes Billionaires:
Обучающая выборка:
networth_segment
Ultra High Networth    0.924519
High Networth          0.070192
Medium Networth        0.005288
Name: proportion, dtype: float64

Контрольная выборка:
networth_segment
Ultra High Networth    0.926923
High Networth          0.069231
Medium Networth        0.003846
Name: proportion, dtype: float64

Тестовая выборка:
networth_segment
Ultra High Networth    0.923077
High Networth          0.073077
Medium Networth        0.003846
Name: proportion, dtype: float64

Набор данных Tesla:
Обучающая выборка:
Transaction
Sale               0.637097
Option Exercise    0.362903
Name: proportion, dtype: float64

Контрольная выборка:
Transaction
Sale               0.625
Option Exercise    0.375
Name: proportion, dtype: float64

Тестовая выборка:
Transaction
Sale               0.625
Option Exercise    0.375
Name: proportion, dtype: float64

Набор данных Diamonds Prices

  • Пропорция классов в обучающей выборке довольно сбалансирована, хотя класс Ideal составляет 39.95%, что значительно больше, чем у остальных классов. Остальные классы представлены следующим образом: Premium (25.57%), Very Good (22.40%), Good (9.10%) и Fair (2.98%).

  • Если модель будет обучаться только на этих данных, она может показать высокую точность, просто предсказывая, что большинство объектов относятся к классу Ideal, что может привести к снижению её способности определять менее представленные классы, такие как Fair.

Набор данных Forbes Billionaires

  • Пропорция классов в этом наборе данных крайне несбалансирована: Ultra High Networth составляет 92.45%, в то время как High Networth и Medium Networth составляют лишь 7.02% и 0.53% соответственно.

  • В случае обучения модели на этих данных, она может иметь высокую точность, просто предсказывая, что все объекты принадлежат классу Ultra High Networth. Это негативно скажется на способности модели правильно классифицировать более редкие классы, такие как Medium Networth.

Набор данных Tesla

  • Пропорция классов в обучающей выборке менее выражена, чем в предыдущих примерах, но все же классы не являются полностью сбалансированными: класс Sale составляет 63.71%, а класс Option Exercise — 36.29%.

  • Модель может научиться распознавать оба класса, однако если точность по классу Option Exercise будет низкой, стоит рассмотреть применение методов аугментации данных или выборки для улучшения её производительности на этом классе.

Приращение наборов данных

Заключительным этапом проводим приращение наборов данных методами выборки с избытком (oversampling) и выборки с недостатком (undersampling)

  • Oversampling (приращение данных): Увеличение числа примеров для меньшинства классов.

  • Undersampling (уменьшение данных): Уменьшение числа примеров для большинства классов.

In [48]:
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler

# Oversampling для Diamonds Prices
X_df = df.drop('cut', axis=1) 
y_df = df['cut']                

ros_df = RandomOverSampler(random_state=42)
X_df_resampled, y_df_resampled = ros_df.fit_resample(X_df, y_df)
df_resampled = pd.DataFrame(X_df_resampled, columns=X_df.columns)
df_resampled['cut'] = y_df_resampled

print("Oversampling для Diamonds Prices:")
print(df_resampled['cut'].value_counts())


X_df2 = df2.drop('networth_segment', axis=1)
y_df2 = df2['networth_segment']

# Undersampling для Forbes Billionaires
rus_df2 = RandomUnderSampler(random_state=42)
X_df2_resampled_under, y_df2_resampled_under = rus_df2.fit_resample(X_df2, y_df2)
df2_resampled_under = pd.DataFrame(X_df2_resampled_under, columns=X_df2.columns)
df2_resampled_under['networth_segment'] = y_df2_resampled_under

print("\nUndersampling для Forbes Billionaires:")
print(df2_resampled_under['networth_segment'].value_counts())

# Oversampling для Tesla
X_df3 = df3.drop('Transaction', axis=1)
y_df3 = df3['Transaction']

ros_df3 = RandomOverSampler(random_state=42)
X_df3_resampled, y_df3_resampled = ros_df3.fit_resample(X_df3, y_df3)
df3_resampled = pd.DataFrame(X_df3_resampled, columns=X_df3.columns)
df3_resampled['Transaction'] = y_df3_resampled

print("\nOversampling для Tesla:")
print(df3_resampled['Transaction'].value_counts())
Oversampling для Diamonds Prices:
cut
Ideal        21551
Premium      21551
Good         21551
Very Good    21551
Fair         21551
Name: count, dtype: int64

Undersampling для Forbes Billionaires:
networth_segment
Ultra High Networth    13
High Networth          13
Medium Networth        13
Name: count, dtype: int64

Oversampling для Tesla:
Transaction
Sale               99
Option Exercise    99
Name: count, dtype: int64