MII/mai/lab2.ipynb
2024-12-14 15:49:48 +04:00

162 KiB
Raw Permalink Blame History

Датасет 1. Цены мобильных телефонов

  1. Name: Название модели мобильного телефона.
  2. Rating: Рейтинг мобильного телефона (по отзывам пользователей).
  3. Spec_score: Оценка спецификаций телефона (возможно, по различным характеристикам).
  4. No_of_sim: Количество SIM-карт, поддерживаемых телефоном.
  5. Ram: Объем оперативной памяти (RAM) в гигабайтах.
  6. Battery: Емкость батареи в мАч.
  7. Display: Размер дисплея в дюймах.
  8. Camera: Разрешение камеры (в мегапикселях).
  9. External_Memory: Поддержка внешней памяти (да/нет).
  10. Android_version: Версия операционной системы Android.
  11. Price: Цена мобильного телефона в долларах США.
  12. Company: Производитель телефона.
  13. Inbuilt_memory: Объем встроенной памяти (в гигабайтах).
  14. Fast_charging: Наличие быстрой зарядки (да/нет).
  15. Screen_resolution: Разрешение экрана (в пикселях).
  16. Processor: Тип процессора.
  17. Processor_name: Наименование процессора.

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

  • Вход: Характеристики мобильного телефона (объем RAM, емкость батареи, качество камеры и т.д.).\
  • Целевой признак: Цена мобильного телефона.
In [3]:
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 sklearn.preprocessing import LabelEncoder
import matplotlib.pyplot as plt
import seaborn as sns

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

# Кодируем все строковые столбцы в числовые
label_encoders = {}
for col in df.select_dtypes(include=["object"]).columns:
    le = LabelEncoder()
    df[col] = le.fit_transform(df[col])
    label_encoders[col] = le

# Проверка на пропуски и "зашумленные" столбцы
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}")

# Проверка на смещение
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:
    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

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.2:
                    print(f"Просачивание данных: Высокая корреляция ({correlation:.2f}) между столбцами '{col1}' и '{col2}'")

# Логарифмирование признака 'Battery'
df["log_Battery"] = np.log(df["Battery"] + 1)

# Заполнение пропусков
df["Battery"] = df["Battery"].fillna(df["Battery"].mean())


# Функция для разбиения на train/val/test
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


# Разбиение на train/val/test
data = df[["Ram", "Price", "company"]].copy()

print("@data", data)

data = data.groupby("company").filter(
    lambda x: len(x) > 4
)  # убираем классы с одним элементом

df_train, df_val, df_test = split_stratified_into_train_val_test(
    data, stratify_colname="company", frac_train=0.60, frac_val=0.20, frac_test=0.20
)

print("Обучающая выборка: ", df_train.shape)
print(df_train["Ram"].value_counts())

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

print("Тестовая выборка: ", df_test.shape)
print(df_test["Ram"].value_counts())
Index(['id', 'Name', 'Rating', 'Spec_score', 'No_of_sim', 'Ram', 'Battery',
       'Display', 'Camera', 'External_Memory', 'Android_version', 'Price',
       'company', 'Inbuilt_memory', 'fast_charging', 'Screen_resolution',
       'Processor', 'Processor_name'],
      dtype='object')
Зашумленные столбцы: []
Смещение: id                   0.000000
Name                -0.023604
Rating              -0.066979
Spec_score          -0.739377
No_of_sim            1.664627
Ram                 -0.899798
Battery             -0.814522
Display             -0.101507
Camera              -0.259205
External_Memory     -2.033547
Android_version      0.584967
Price                0.080087
company             -0.760020
Inbuilt_memory       1.061234
fast_charging        0.217571
Screen_resolution    0.702418
Processor           -5.671454
Processor_name      -0.159994
dtype: float64
Сильно смещенные столбцы: ['No_of_sim', 'External_Memory', 'Inbuilt_memory', 'Processor']
Выбросы в столбце 'id':
Series([], Name: id, dtype: int64)

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

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

Выбросы в столбце 'Spec_score':
91      42
99      54
122     51
125     53
214     58
234     58
651     57
713     54
719     49
802     53
803     54
1142    46
1231    57
1239    56
1344    55
1346    55
1348    57
Name: Spec_score, dtype: int64

Выбросы в столбце 'No_of_sim':
394     8
628     8
644     7
951     8
967     8
971     8
1052    8
Name: No_of_sim, dtype: int64

Выбросы в столбце 'Ram':
91     0
719    1
Name: Ram, dtype: int64

Выбросы в столбце 'Battery':
0       86
1       20
3       85
6       86
9       86
        ..
1344     8
1346     7
1349     8
1350     7
1364    20
Name: Battery, Length: 247, dtype: int64

Выбросы в столбце 'Display':
76      87
78      84
91       2
122      6
125      7
197     86
198     87
199     86
200     86
201     86
202     85
204     86
205     86
264      3
397     80
538      1
600     83
607     83
608     83
609     82
610     82
612     84
628      8
629      9
648     88
650     85
662     10
663     10
665     11
688      6
715      9
719      5
923     84
1042     5
1118    80
1142     5
1226    81
1227    81
1228    82
1246     4
1369     0
Name: Display, dtype: int64

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

Выбросы в столбце 'External_Memory':
45       3
55       3
56       3
66       3
72      18
76       8
77      15
78      16
79      15
80      15
81      15
83      15
84      15
85      15
192     19
198      6
202     12
203      7
204     17
211     19
264     13
388     29
391     28
392      1
396      0
597     20
600     25
603     27
606     26
612      2
644     10
649      9
650     14
672     22
924     28
1040     4
1045     4
1046    24
1048    21
1049    24
1051    24
1052     5
1268    11
1270    11
1291    23
1369    30
Name: External_Memory, dtype: int64

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

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

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

Выбросы в столбце 'Inbuilt_memory':
2       7
3       7
4       7
6       7
7       7
       ..
1357    7
1358    7
1359    7
1363    7
1365    7
Name: Inbuilt_memory, Length: 205, dtype: int64

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

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

Выбросы в столбце 'Processor':
0       12
1        2
2        4
16      14
22      14
        ..
1322    12
1342    12
1346    13
1348    14
1350    13
Name: Processor, Length: 133, dtype: int64

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

No description has been provided for this image
Просачивание данных: Высокая корреляция (-0.26) между столбцами 'id' и 'Name'
Просачивание данных: Высокая корреляция (-0.30) между столбцами 'id' и 'company'
Просачивание данных: Высокая корреляция (-0.26) между столбцами 'Name' и 'id'
Просачивание данных: Высокая корреляция (-0.21) между столбцами 'Name' и 'Android_version'
Просачивание данных: Высокая корреляция (0.96) между столбцами 'Name' и 'company'
Просачивание данных: Высокая корреляция (-0.44) между столбцами 'Spec_score' и 'No_of_sim'
Просачивание данных: Высокая корреляция (0.49) между столбцами 'Spec_score' и 'Display'
Просачивание данных: Высокая корреляция (0.22) между столбцами 'Spec_score' и 'Camera'
Просачивание данных: Высокая корреляция (-0.46) между столбцами 'Spec_score' и 'External_Memory'
Просачивание данных: Высокая корреляция (0.35) между столбцами 'Spec_score' и 'Android_version'
Просачивание данных: Высокая корреляция (-0.27) между столбцами 'Spec_score' и 'Inbuilt_memory'
Просачивание данных: Высокая корреляция (-0.47) между столбцами 'Spec_score' и 'Screen_resolution'
Просачивание данных: Высокая корреляция (-0.44) между столбцами 'No_of_sim' и 'Spec_score'
Просачивание данных: Высокая корреляция (-0.26) между столбцами 'No_of_sim' и 'Display'
Просачивание данных: Высокая корреляция (0.20) между столбцами 'No_of_sim' и 'External_Memory'
Просачивание данных: Высокая корреляция (-0.22) между столбцами 'No_of_sim' и 'Android_version'
Просачивание данных: Высокая корреляция (0.26) между столбцами 'No_of_sim' и 'Inbuilt_memory'
Просачивание данных: Высокая корреляция (0.30) между столбцами 'No_of_sim' и 'Screen_resolution'
Просачивание данных: Высокая корреляция (-0.26) между столбцами 'Ram' и 'Display'
Просачивание данных: Высокая корреляция (0.22) между столбцами 'Ram' и 'External_Memory'
Просачивание данных: Высокая корреляция (-0.22) между столбцами 'Ram' и 'Android_version'
Просачивание данных: Высокая корреляция (-0.36) между столбцами 'Ram' и 'Inbuilt_memory'
Просачивание данных: Высокая корреляция (-0.23) между столбцами 'Ram' и 'Screen_resolution'
Просачивание данных: Высокая корреляция (0.23) между столбцами 'Battery' и 'Display'
Просачивание данных: Высокая корреляция (0.23) между столбцами 'Battery' и 'External_Memory'
Просачивание данных: Высокая корреляция (0.49) между столбцами 'Display' и 'Spec_score'
Просачивание данных: Высокая корреляция (-0.26) между столбцами 'Display' и 'No_of_sim'
Просачивание данных: Высокая корреляция (-0.26) между столбцами 'Display' и 'Ram'
Просачивание данных: Высокая корреляция (0.23) между столбцами 'Display' и 'Battery'
Просачивание данных: Высокая корреляция (0.24) между столбцами 'Display' и 'Camera'
Просачивание данных: Высокая корреляция (-0.45) между столбцами 'Display' и 'External_Memory'
Просачивание данных: Высокая корреляция (0.21) между столбцами 'Display' и 'Android_version'
Просачивание данных: Высокая корреляция (0.22) между столбцами 'Camera' и 'Spec_score'
Просачивание данных: Высокая корреляция (0.24) между столбцами 'Camera' и 'Display'
Просачивание данных: Высокая корреляция (-0.34) между столбцами 'Camera' и 'External_Memory'
Просачивание данных: Высокая корреляция (-0.46) между столбцами 'External_Memory' и 'Spec_score'
Просачивание данных: Высокая корреляция (0.20) между столбцами 'External_Memory' и 'No_of_sim'
Просачивание данных: Высокая корреляция (0.22) между столбцами 'External_Memory' и 'Ram'
Просачивание данных: Высокая корреляция (0.23) между столбцами 'External_Memory' и 'Battery'
Просачивание данных: Высокая корреляция (-0.45) между столбцами 'External_Memory' и 'Display'
Просачивание данных: Высокая корреляция (-0.34) между столбцами 'External_Memory' и 'Camera'
Просачивание данных: Высокая корреляция (-0.63) между столбцами 'External_Memory' и 'Android_version'
Просачивание данных: Высокая корреляция (-0.21) между столбцами 'External_Memory' и 'Processor_name'
Просачивание данных: Высокая корреляция (-0.21) между столбцами 'Android_version' и 'Name'
Просачивание данных: Высокая корреляция (0.35) между столбцами 'Android_version' и 'Spec_score'
Просачивание данных: Высокая корреляция (-0.22) между столбцами 'Android_version' и 'No_of_sim'
Просачивание данных: Высокая корреляция (-0.22) между столбцами 'Android_version' и 'Ram'
Просачивание данных: Высокая корреляция (0.21) между столбцами 'Android_version' и 'Display'
Просачивание данных: Высокая корреляция (-0.63) между столбцами 'Android_version' и 'External_Memory'
Просачивание данных: Высокая корреляция (0.21) между столбцами 'Android_version' и 'Price'
Просачивание данных: Высокая корреляция (-0.24) между столбцами 'Android_version' и 'company'
Просачивание данных: Высокая корреляция (0.21) между столбцами 'Price' и 'Android_version'
Просачивание данных: Высокая корреляция (-0.30) между столбцами 'company' и 'id'
Просачивание данных: Высокая корреляция (0.96) между столбцами 'company' и 'Name'
Просачивание данных: Высокая корреляция (-0.24) между столбцами 'company' и 'Android_version'
Просачивание данных: Высокая корреляция (-0.27) между столбцами 'Inbuilt_memory' и 'Spec_score'
Просачивание данных: Высокая корреляция (0.26) между столбцами 'Inbuilt_memory' и 'No_of_sim'
Просачивание данных: Высокая корреляция (-0.36) между столбцами 'Inbuilt_memory' и 'Ram'
Просачивание данных: Высокая корреляция (0.29) между столбцами 'Inbuilt_memory' и 'Screen_resolution'
Просачивание данных: Высокая корреляция (-0.47) между столбцами 'Screen_resolution' и 'Spec_score'
Просачивание данных: Высокая корреляция (0.30) между столбцами 'Screen_resolution' и 'No_of_sim'
Просачивание данных: Высокая корреляция (-0.23) между столбцами 'Screen_resolution' и 'Ram'
Просачивание данных: Высокая корреляция (0.29) между столбцами 'Screen_resolution' и 'Inbuilt_memory'
Просачивание данных: Высокая корреляция (-0.21) между столбцами 'Processor_name' и 'External_Memory'
@data       Ram  Price  company
0      10    442       19
1       6    440       19
2      10     79       19
3      10     79       19
4      10     79       19
...   ...    ...      ...
1365   10    158       20
1366   14    207       20
1367   12    199       20
1368   12    189       20
1369    2     18       20

[1370 rows x 3 columns]
Обучающая выборка:  (819, 3)
Ram
14    327
10    151
2     151
12    115
9      25
4      20
6      14
3       5
5       4
8       4
11      2
15      1
Name: count, dtype: int64
Контрольная выборка:  (273, 3)
Ram
14    98
10    56
12    49
2     43
4     10
9      8
6      4
11     1
8      1
1      1
7      1
13     1
Name: count, dtype: int64
Тестовая выборка:  (273, 3)
Ram
14    101
2      52
12     49
10     45
4      11
9       5
6       3
8       3
3       2
7       1
0       1
Name: count, dtype: int64