MII/mai/lab2.ipynb

92 KiB
Raw Permalink Blame History

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

Вариант - 9

Датасеты - магазины

  1. Цены на кофе https://www.kaggle.com/datasets/mayankanand2701/starbucks-stock-price-dataset
  2. Цены на акции https://www.kaggle.com/datasets/nancyalaswad90/yamana-gold-inc-stock-price
  3. Цены на золото https://www.kaggle.com/datasets/sid321axn/gold-price-prediction-dataset
In [7]:
import numpy as np
import pandas as pd
from sklearn.feature_selection import mutual_info_regression
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import ADASYN
from imblearn.under_sampling import RandomUnderSampler
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv("data/Diamonds.csv")
print(df.columns)

noisy_features = []
for col in df.columns:
  if df[col].isnull().sum() / len(df) > 0.1:  # Если более 10% пропусков
    noisy_features.append(col)
print(f"Зашумленные столбцы: {noisy_features}")

cut_mapping = {'Fair': 0, 'Good': 1, 'Very Good': 2, 'Premium': 3, 'Ideal': 4}
df['cut'] = df['cut'].map(cut_mapping)

color_mapping = {'J': 0, 'I': 1, 'H': 2, 'G': 3, 'F': 4, 'E': 5, 'D': 6} 
df['color'] = df['color'].map(color_mapping)

clarity_mapping = {'I1': 0, 'SI2': 1, 'SI1': 2, 'VS2': 3, 'VS1': 4, 'VVS2': 5, 'VVS1': 6, 'IF': 7} 
df['clarity'] = df['clarity'].map(clarity_mapping)

skewness = df.skew()
print(f"Смещение: {skewness}")

skewed_features = skewness[abs(skewness) > 1].index.tolist()
print(f"Сильно смещенные столбцы: {skewed_features}")

for col in df.select_dtypes(include=['number']).columns:
    if col == 'id':
        continue
    Q1 = df[col].quantile(0.25)
    Q3 = df[col].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    outliers = df[col][(df[col] < lower_bound) | (df[col] > upper_bound)]
    print(f"Выбросы в столбце '{col}':\n{outliers}\n")

numeric_cols = df.select_dtypes(include=['number']).columns
numeric_cols = [col for col in numeric_cols if col != 'id']

plt.figure(figsize=(12, 8))

for i, col in enumerate(numeric_cols, 1):
    plt.subplot(len(numeric_cols) // 3 + 1, 3, i) 
    sns.boxplot(data=df, x=col)
    plt.title(f'Boxplot for {col}')

plt.tight_layout()
plt.show()

if len(df.columns) >= 2:
    for col1 in df.columns:
        for col2 in df.columns:
            if col1 != col2:
                correlation = df[col1].corr(df[col2])
                if abs(correlation) > 0.9:
                    print(f"Просачивание данных: Высокая корреляция ({correlation:.2f}) между столбцами '{col1}' и '{col2}'")

df['log_carat'] = np.log(df['carat'] + 1)

df['cut'] = df['cut'].fillna('unknown')

df['carat'] = df['carat'].fillna(df['carat'].mean())

def split_stratified_into_train_val_test(
    df_input,
    stratify_colname="y",
    frac_train=0.6,
    frac_val=0.15,
    frac_test=0.25,
    random_state=None,
):
    if frac_train + frac_val + frac_test != 1.0:
        raise ValueError(
            "fractions %f, %f, %f do not add up to 1.0"
            % (frac_train, frac_val, frac_test)
        )

    if stratify_colname not in df_input.columns:
        raise ValueError("%s is not a column in the dataframe" % (stratify_colname))

    X = df_input 
    y = df_input[
        [stratify_colname]
    ]  

    df_train, df_temp, y_train, y_temp = train_test_split(
        X, y, stratify=y, test_size=(1.0 - frac_train), random_state=random_state
    )

    relative_frac_test = frac_test / (frac_val + frac_test)
    df_val, df_test, y_val, y_test = train_test_split(
        df_temp,
        y_temp,
        stratify=y_temp,
        test_size=relative_frac_test,
        random_state=random_state,
    )

    assert len(df_input) == len(df_train) + len(df_val) + len(df_test)

    return df_train, df_val, df_test

data = df[["carat", "price", "cut"]].copy()

df_train, df_val, df_test = split_stratified_into_train_val_test(
    data, stratify_colname="cut", frac_train=0.60, frac_val=0.20, frac_test=0.20
)
   
print(df_train.columns) 
   
print("Обучающая выборка: ", df_train.shape)
print(df_train.carat.value_counts()) 

print("Контрольная выборка: ", df_val.shape)
print(df_val.carat.value_counts())

print("Тестовая выборка: ", df_test.shape)
print(df_test.carat.value_counts())

ada = ADASYN()

X_resampled, y_resampled = ada.fit_resample(df_train, df_train["cut"])
df_train_adasyn = pd.DataFrame(X_resampled)

print("Обучающая выборка после oversampling: ", df_train_adasyn.shape)
print(df_train_adasyn.carat.value_counts())
Index(['id', 'carat', 'cut', 'color', 'clarity', 'depth', 'table', 'price',
       'x', 'y', 'z'],
      dtype='object')
Зашумленные столбцы: []
Смещение: id         0.000000
carat      1.116705
cut       -0.717161
color     -0.189454
clarity    0.551503
depth     -0.082187
table      0.796836
price      1.618476
x          0.378685
y          2.434233
z          1.522481
dtype: float64
Сильно смещенные столбцы: ['carat', 'price', 'y', 'z']
Данные 2022 года, возможна неактуальность
Выбросы в столбце 'carat':
12246    2.06
13002    2.14
13118    2.15
13757    2.22
13991    2.01
         ... 
27741    2.15
27742    2.04
27744    2.29
27746    2.07
27749    2.29
Name: carat, Length: 1889, dtype: float64

Выбросы в столбце 'cut':
Series([], Name: cut, dtype: int64)

Выбросы в столбце 'color':
Series([], Name: color, dtype: int64)

Выбросы в столбце 'clarity':
Series([], Name: clarity, dtype: int64)

Выбросы в столбце 'depth':
2        56.9
8        65.1
24       58.1
35       58.2
42       65.2
         ... 
53882    65.4
53886    58.0
53890    57.9
53895    57.8
53927    58.1
Name: depth, Length: 2545, dtype: float64

Выбросы в столбце 'table':
2        65.0
91       69.0
145      64.0
219      64.0
227      67.0
         ... 
53695    65.0
53697    65.0
53756    64.0
53757    64.0
53785    65.0
Name: table, Length: 605, dtype: float64

Выбросы в столбце 'price':
23820    11886
23821    11886
23822    11888
23823    11888
23824    11888
         ...  
27745    18803
27746    18804
27747    18806
27748    18818
27749    18823
Name: price, Length: 3540, dtype: int64

Выбросы в столбце 'x':
11182     0.00
11963     0.00
15951     0.00
22741     9.54
22831     9.38
23644     9.53
24131     9.44
24297     9.49
24328     9.65
24520     0.00
24816     9.42
25460     9.44
25850     9.32
25998    10.14
25999    10.02
26243     0.00
26431     9.42
26444    10.01
26534     9.86
26932     9.30
27130    10.00
27415    10.74
27429     0.00
27514     9.36
27630    10.23
27638     9.51
27649     9.44
27679     9.66
27684     9.35
27685     9.41
49556     0.00
49557     0.00
Name: x, dtype: float64

Выбросы в столбце 'y':
11963     0.00
15951     0.00
22741     9.38
22831     9.31
23644     9.48
24067    58.90
24131     9.40
24297     9.42
24328     9.59
24520     0.00
25460     9.37
25998    10.10
25999     9.94
26243     0.00
26431     9.34
26444     9.94
26534     9.81
27130     9.85
27415    10.54
27429     0.00
27514     9.31
27630    10.16
27638     9.46
27649     9.38
27679     9.63
27685     9.32
49189    31.80
49556     0.00
49557     0.00
Name: y, dtype: float64

Выбросы в столбце 'z':
2207      0.00
2314      0.00
4791      0.00
5471      0.00
10167     0.00
11182     0.00
11963     0.00
13601     0.00
14635     1.07
15951     0.00
16283     5.77
17196     5.76
19346     5.97
21758     5.98
22540     5.91
23539     5.79
23644     6.38
24067     8.06
24131     5.85
24297     5.92
24328     6.03
24394     0.00
24520     0.00
25998     6.17
25999     6.24
26100     5.75
26123     0.00
26194     6.16
26243     0.00
26431     6.27
26444     6.31
26534     6.13
26744     5.86
27112     0.00
27130     6.43
27415     6.98
27429     0.00
27503     0.00
27515     5.90
27516     5.90
27517     5.77
27518     5.77
27630     6.72
27679     6.03
27739     0.00
48410    31.80
49556     0.00
49557     0.00
51506     0.00
Name: z, dtype: float64

No description has been provided for this image
Просачивание данных: Высокая корреляция (0.92) между столбцами 'carat' и 'price'
Просачивание данных: Высокая корреляция (0.98) между столбцами 'carat' и 'x'
Просачивание данных: Высокая корреляция (0.95) между столбцами 'carat' и 'y'
Просачивание данных: Высокая корреляция (0.95) между столбцами 'carat' и 'z'
Просачивание данных: Высокая корреляция (0.92) между столбцами 'price' и 'carat'
Просачивание данных: Высокая корреляция (0.98) между столбцами 'x' и 'carat'
Просачивание данных: Высокая корреляция (0.97) между столбцами 'x' и 'y'
Просачивание данных: Высокая корреляция (0.97) между столбцами 'x' и 'z'
Просачивание данных: Высокая корреляция (0.95) между столбцами 'y' и 'carat'
Просачивание данных: Высокая корреляция (0.97) между столбцами 'y' и 'x'
Просачивание данных: Высокая корреляция (0.95) между столбцами 'y' и 'z'
Просачивание данных: Высокая корреляция (0.95) между столбцами 'z' и 'carat'
Просачивание данных: Высокая корреляция (0.97) между столбцами 'z' и 'x'
Просачивание данных: Высокая корреляция (0.95) между столбцами 'z' и 'y'
Пример оценки информативности для целевой переменной 'price'
id           8.136888
carat        1.961910
log_carat    1.961630
y            1.494661
x            1.481508
z            1.431517
clarity      0.364394
color        0.286463
cut          0.104701
table        0.052611
depth        0.034731
dtype: float64
Index(['carat', 'price', 'cut'], dtype='object')
Обучающая выборка:  (32365, 3)
carat
0.30    1503
1.01    1363
0.31    1326
0.70    1191
0.32    1136
        ... 
2.55       1
0.22       1
1.92       1
2.74       1
3.67       1
Name: count, Length: 265, dtype: int64
Контрольная выборка:  (10789, 3)
carat
0.30    555
0.31    456
0.70    438
1.01    417
0.32    380
       ... 
1.68      1
2.57      1
2.53      1
1.93      1
2.66      1
Name: count, Length: 231, dtype: int64
Тестовая выборка:  (10789, 3)
carat
0.30    546
0.31    467
1.01    462
0.70    353
0.32    324
       ... 
2.53      1
1.81      1
2.55      1
3.05      1
1.45      1
Name: count, Length: 232, dtype: int64
Обучающая выборка после oversampling:  (64069, 3)
carat
1.010000    1837
0.700000    1834
0.300000    1589
1.000000    1417
0.310000    1385
            ... 
1.335296       1
1.183497       1
1.296552       1
2.003477       1
0.780485       1
Name: count, Length: 28027, dtype: int64

Датасет 1. Цены бриллиантов

  1. carat: Вес бриллианта в каратах
  2. cut: Качество огранки.
  3. color: Цвет бриллианта
  4. clarity: Чистота бриллианта
  5. depth: Процент глубины бриллианта
  6. table: Процент ширины бриллианта
  7. price: Цена бриллианта в долларах США
  8. x: Длина бриллианта в миллиметрах
  9. y: Ширина бриллианта в миллиметрах
  10. z: Глубина бриллианта в миллиметрах

Объект наблюдения: Каждый объект представляет собой отдельный бриллиант.
Связи между объектами: Внутри одного объекта есть взаимосвязь между характеристиками и его ценой. Например, вес, цвет, чистота и огранка могут влиять на цену.
Бизнес-цель: Оптимизация продаж бриллиантов, оценка цен в зависимости от характеристик.
Эффект для бизнеса: Более точная оценка стоимости бриллиантов может помочь ювелирам предлагать конкурентоспособные цены и максимизировать прибыль.
Техническая цель: Построение модели машинного обучения для прогнозирования цены бриллианта на основе его характеристик.\

  • Вход: Характеристики бриллианта (вес, огранка, цвет, чистота, размеры).\
  • Целевой признак: Цена бриллианта.

Информативность: Высокая. Набор данных содержит важные характеристики бриллиантов, которые влияют на их цену: карат, огранка, цвет, чистота, размеры.
Степень покрытия: Высокая. В наборе данных представлено 53 940 бриллиантов, что является достаточно большим объемом для анализа.
Соответствие реальным данным: Высокая. Характеристики бриллиантов в наборе данных соответствуют реальным характеристикам бриллиантов, определяемым геммологами.
Согласованность меток: Высокая. В данном наборе данных нет проблем с несогласованностью меток, так как все данные соответствуют описанию в заголовках столбцов.

Датасет 2. Цены акций Starbucks

  1. Date: Дата торгов
  2. Open: Цена открытия торгов
  3. High: Максимальная цена акции за день
  4. Low: Минимальная цена акции за день
  5. Close: Цена закрытия торгов в данный день
  6. Adj Close: Скоректированная цена закрытия.
  7. Volume: Объем торгов акциями в данный день.

Объект наблюдения: Объектом наблюдения является торговый день на рынке акций компании Starbucks.
Связи между объектами: Временная связь между днями торгов. Важна динамика изменений цен и объемов торгов в зависимости от времени.
Бизнес-цель: Прогнозирование цен акций для управления портфелем акций.
Эффект для бизнеса: Прогнозирование позволит трейдерам принимать более информированные решения, оптимизировать инвестиции и минимизировать риски.
Техническая цель: Прогнозирование цены закрытия акций на основе временных рядов.\

  • Вход: Временные ряды с историческими данными по ценам открытия, закрытия, объёмам.\
  • Целевой признак: Цена закрытия на следующий день.

Датасет 3. Цены на золото

  1. Date: Дата
  2. Open: Цена открытия торгов
  3. High: Максимальная цена за день
  4. Low: Минимальная цена за день
  5. Close: Цена закрытия торгов
  6. Adjusted Close: Скоректированная цена закрытия
  7. Volume: Объем торгов за день

Дополнительные столбцы (факторы, влияющие на цену золота):

  1. SP_open, SP_high, SP_low, SP_close, SP_Ajclose, SP_volume: Данные индекса S&P 500.
  2. DJ_open, DJ_high, DJ_low, DJ_close, DJ_Ajclose, DJ_volume: Данные индекса Dow Jones.
  3. EG_open, EG_high, EG_low, EG_close, EG_Ajclose, EG_volume: Данные компании Eldorado Gold Corporation (EGO).
  4. EU_Price, EU_open, EU_high, EU_low, EU_Trend: Курс валютной пары EUR/USD.
  5. OF_Price, OF_Open, OF_High, OF_Low, OF_Volume, OF_Trend: Цена фьючерсов на нефть Brent.
  6. OS_Price, OS_Open, OS_High, OS_Low, OS_Trend: Цена нефти WTI.
  7. SF_Price, SF_Open, SF_High, SF_Low, SF_Volume, SF_Trend: Цена фьючерсов на серебро.
  8. USB_Price, USB_Open, USB_High, USB_Low, USB_Trend: Ставка по облигациям США.
  9. PLT_Price, PLT_Open, PLT_High, PLT_Low, PLT_Trend: Цена платины.
  10. PLD_Price, PLD_Open, PLD_High, PLD_Low, PLD_Trend: Цена палладия.
  11. RHO_PRICE: Цена родия.
  12. USDI_Price, USDI_Open, USDI_High, USDI_Low, USDI_Volume, USDI_Trend: Индекс доллара США.
  13. GDX_Open, GDX_High, GDX_Low, GDX_Close, GDX_Adj Close, GDX_Volume: Данные ETF на золотые шахты.
  14. USO_Open, USO_High, USO_Low, USO_Close, USO_Adj Close, USO_Volume: Данные ETF на нефть USO.

Объект наблюдения: Объектом наблюдения является торговый день для цены золота с дополнительными факторами влияния.
Связи между объектами: Взаимосвязь между движением цен на золото и другими экономическими показателями и активами (например, нефть, фондовые индексы). Золото часто коррелирует с другими активами в периоды нестабильности.
Бизнес-цель: Управление инвестициями в золото и связанные активы (нефть, индексы).
Эффект для бизнеса: Правильное прогнозирование цен на золото и связанных активов может помочь инвесторам защитить капитал.
Техническая цель: Построение модели для анализа взаимосвязи между ценами на золото и дополнительными факторами (нефть, фондовые индексы, валютные курсы).

  • Вход: Данные по ценам на золото и дополнительным факторам (нефть, индексы, валюты).\
  • Целевой признак: Цена закрытия золота.