2024-12-06 22:30:14 +04:00

79 KiB
Raw Blame History

Начало лабораторной работы

In [10]:
import pandas as pd
df1 = pd.read_csv("..//static//csv//mobile phone price prediction.csv")
df = pd.read_csv("..//static//csv//ndtv_data_final.csv")
print(df1.columns)
print(df.columns)
Index(['Unnamed: 0', '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')
Index(['Unnamed: 0', 'Name', 'Brand', 'Model', 'Battery capacity (mAh)',
       'Screen size (inches)', 'Touchscreen', 'Resolution x', 'Resolution y',
       'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera',
       'Front camera', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS',
       'Number of SIMs', '3G', '4G/ LTE', 'Price'],
      dtype='object')

Бизнес-цели:

  1. Прогнозирование цен на мобильные телефоны:

Цель: Разработать точную модель машинного обучения для прогнозирования цен на мобильные телефоны на основе характеристик.

Применение: Оптимизация ценообразования для производителей и продавцов. Помощь потребителям в принятии обоснованных решений при покупке.

  1. Оптимизация характеристик продукта:

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

Применение: Разработка новых моделей мобильных телефонов. Улучшение существующих моделей.

1. Прогнозирование цен на мобильные телефоны

In [15]:
import pandas as pd

# Загружаем набор данных
df = pd.read_csv("..//static//csv//ndtv_data_final.csv")

# Удаление пустого столбца по имени
df = df.drop('Unnamed: 0', axis=1)

# Устанавливаем случайное состояние
random_state = 42

# Рассчитываем среднее значение цены
average_price = df['Price'].mean()
print(f"Среднее значение поля 'Price': {average_price}")

# Создаем новую переменную, указывающую, превышает ли цена среднюю
df['above_average_price'] = (df['Price'] > average_price).astype(int)

# Рассчитываем волатильность (разницу между максимальной и минимальной ценой)
df['price_volatility'] = df['Price'].max() - df['Price'].min()

# Выводим первые строки измененной таблицы для проверки
print(df.head(20))
Среднее значение поля 'Price': 11465.825607064018
                              Name    Brand                   Model  \
0   OnePlus 7T Pro McLaren Edition  OnePlus  7T Pro McLaren Edition   
1                    Realme X2 Pro   Realme                  X2 Pro   
2                iPhone 11 Pro Max    Apple       iPhone 11 Pro Max   
3                        iPhone 11    Apple               iPhone 11   
4                     LG G8X ThinQ       LG               G8X ThinQ   
5                       OnePlus 7T  OnePlus                      7T   
6                   OnePlus 7T Pro  OnePlus                  7T Pro   
7          Samsung Galaxy Note 10+  Samsung         Galaxy Note 10+   
8                 Asus ROG Phone 2     Asus             ROG Phone 2   
9             Xiaomi Redmi K20 Pro   Xiaomi           Redmi K20 Pro   
10                         Oppo K3     Oppo                      K3   
11                        Realme X   Realme                       X   
12                Xiaomi Redmi K20   Xiaomi               Redmi K20   
13                   OnePlus 7 Pro  OnePlus                   7 Pro   
14              Oppo Reno 10x Zoom     Oppo           Reno 10x Zoom   
15                    Realme 3 Pro   Realme                   3 Pro   
16                  Huawei P30 Pro   Huawei                 P30 Pro   
17                Redmi Note 7 Pro   Xiaomi        Redmi Note 7 Pro   
18              Huawei Mate 20 Pro   Huawei             Mate 20 Pro   
19                    LG V40 ThinQ       LG               V40 ThinQ   

    Battery capacity (mAh)  Screen size (inches) Touchscreen  Resolution x  \
0                     4085                  6.67         Yes          1440   
1                     4000                  6.50         Yes          1080   
2                     3969                  6.50         Yes          1242   
3                     3110                  6.10         Yes           828   
4                     4000                  6.40         Yes          1080   
5                     3800                  6.55         Yes          1080   
6                     4085                  6.67         Yes          1440   
7                     4300                  6.80         Yes          1440   
8                     6000                  6.59         Yes          1080   
9                     4000                  6.39         Yes          1080   
10                    3765                  6.50         Yes          1080   
11                    3765                  6.53         Yes          1080   
12                    4000                  6.39         Yes          1080   
13                    4000                  6.67         Yes          1440   
14                    4065                  6.60         Yes          1080   
15                    4045                  6.30         Yes          1080   
16                    4200                  6.47         Yes          1080   
17                    4000                  6.30         Yes          1080   
18                    4200                  6.39         Yes          1440   
19                    3300                  6.40         Yes          1440   

    Resolution y  Processor  RAM (MB)  ...  Operating system  Wi-Fi  \
0           3120          8     12000  ...           Android    Yes   
1           2400          8      6000  ...           Android    Yes   
2           2688          6      4000  ...               iOS    Yes   
3           1792          6      4000  ...               iOS    Yes   
4           2340          8      6000  ...           Android    Yes   
5           2400          8      8000  ...           Android    Yes   
6           3120          8      8000  ...           Android    Yes   
7           3040          8     12000  ...           Android    Yes   
8           2340          8      8000  ...           Android    Yes   
9           2340          8      6000  ...           Android    Yes   
10          2340          8      6000  ...           Android    Yes   
11          2340          8      4000  ...           Android    Yes   
12          2340          8      6000  ...           Android    Yes   
13          3120          8      6000  ...           Android    Yes   
14          2340          8      6000  ...           Android    Yes   
15          2340          8      4000  ...           Android    Yes   
16          2340          8      8000  ...           Android    Yes   
17          2340          8      4000  ...           Android    Yes   
18          3120          8      6000  ...           Android    Yes   
19          3120          8      6000  ...           Android    Yes   

    Bluetooth  GPS Number of SIMs   3G 4G/ LTE   Price above_average_price  \
0         Yes  Yes              2  Yes     Yes   58998                   1   
1         Yes  Yes              2  Yes     Yes   27999                   1   
2         Yes  Yes              2  Yes     Yes  106900                   1   
3         Yes  Yes              2  Yes     Yes   62900                   1   
4         Yes  Yes              1   No      No   49990                   1   
5         Yes   No              2  Yes     Yes   34930                   1   
6         Yes  Yes              2  Yes     Yes   52990                   1   
7         Yes  Yes              2  Yes     Yes   79699                   1   
8         Yes  Yes              1  Yes     Yes   37999                   1   
9         Yes  Yes              2   No      No   23190                   1   
10        Yes  Yes              2  Yes     Yes   23990                   1   
11        Yes  Yes              2  Yes     Yes   14999                   1   
12        Yes  Yes              2  Yes     Yes   19282                   1   
13        Yes  Yes              2  Yes     Yes   39995                   1   
14        Yes  Yes              2  Yes     Yes   36990                   1   
15        Yes  Yes              2  Yes     Yes   13999                   1   
16        Yes   No              2  Yes     Yes   54280                   1   
17        Yes  Yes              2  Yes     Yes    9799                   0   
18        Yes  Yes              2  Yes     Yes   63990                   1   
19        Yes  Yes              2  Yes     Yes   29999                   1   

   price_volatility  
0            174496  
1            174496  
2            174496  
3            174496  
4            174496  
5            174496  
6            174496  
7            174496  
8            174496  
9            174496  
10           174496  
11           174496  
12           174496  
13           174496  
14           174496  
15           174496  
16           174496  
17           174496  
18           174496  
19           174496  

[20 rows x 23 columns]

2. Оптимизация характеристик продукта

In [28]:
import pandas as pd

# Загружаем набор данных
df = pd.read_csv("..//static//csv//ndtv_data_final.csv")

# Удаление пустого столбца по имени
df = df.drop('Unnamed: 0', axis=1)

# Устанавливаем случайное состояние
random_state = 42

# Рассчитываем среднюю цену для каждого значения каждого признака (Model уберем, у всех разная)
for column in ['Brand', 'Battery capacity (mAh)', 'Screen size (inches)', 'Touchscreen', 
               'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 
               'Rear camera', 'Front camera', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', 
               'Number of SIMs', '3G', '4G/ LTE']:
    print(f"Средняя цена для '{column}':")
    print(df.groupby(column)['Price'].mean())
    print()

# Рассчитываем среднюю цену для комбинаций признаков
# для комбинации 'Brand' и 'Operating system'
print("Средняя цена для комбинации 'Brand' и 'Operating system':")
print(df.groupby(['Brand', 'Operating system'])['Price'].mean())
print()

# Рассчитываем среднюю цену для комбинации 'RAM (MB)' и 'Internal storage (GB)'
print("Средняя цена для комбинации 'RAM (MB)' и 'Internal storage (GB)':")
print(df.groupby(['RAM (MB)', 'Internal storage (GB)'])['Price'].mean())
print()

# Рассчитываем среднюю цену для комбинации 'Screen size (inches)' и 'Battery capacity (mAh)'
print("Средняя цена для комбинации 'Screen size (inches)' и 'Battery capacity (mAh)':")
print(df.groupby(['Screen size (inches)', 'Battery capacity (mAh)'])['Price'].mean())
print()
Средняя цена для 'Brand':
Brand
10.or       5999.000000
Acer        6470.000000
Alcatel     9201.600000
Apple      45510.470588
Aqua        4599.000000
               ...     
Zopo        6027.916667
Zuk        29124.000000
iBall       4051.000000
iVoomi      4018.875000
mPhone      6949.000000
Name: Price, Length: 76, dtype: float64

Средняя цена для 'Battery capacity (mAh)':
Battery capacity (mAh)
1010     3499.000000
1050     4790.000000
1200     3396.000000
1250     2498.500000
1300     3338.333333
            ...     
5000    13542.530612
5020    23900.000000
5100    16999.000000
5300     8999.000000
6000    19832.333333
Name: Price, Length: 165, dtype: float64

Средняя цена для 'Screen size (inches)':
Screen size (inches)
2.40      1249.000000
2.44      6999.000000
2.45      2999.000000
2.60      5555.000000
2.80      5345.000000
            ...      
6.70     58896.428571
6.80     79699.000000
6.90     92999.000000
7.00      6199.000000
7.30    164999.000000
Name: Price, Length: 80, dtype: float64

Средняя цена для 'Touchscreen':
Touchscreen
No      5255.411765
Yes    11544.497019
Name: Price, dtype: float64

Средняя цена для 'Resolution x':
Resolution x
240       3819.888889
320       2499.000000
360       5797.500000
400       2860.500000
480       4128.602459
540       7445.848485
560      15990.000000
600       4829.000000
640       7697.200000
720       7619.360684
750      25999.000000
768       8872.000000
800       2190.000000
828      54199.500000
850       4115.000000
854       4415.666667
1024      6199.000000
1080     17165.865952
1125     75632.666667
1176     77299.000000
1242     88449.500000
1280      7144.333333
1440     34240.461538
1520      7935.000000
1536    164999.000000
1600     29950.000000
1880     20800.000000
2160     45500.000000
Name: Price, dtype: float64

Средняя цена для 'Resolution y':
Resolution y
320       3811.125000
480       4264.818182
485       3299.000000
584       4499.000000
600       6199.000000
640       4095.000000
720       8539.900000
800       4189.321429
854       4087.901316
960       6921.651163
1080      7583.800000
1136     12749.000000
1280      7449.136674
1290     14990.000000
1334     25999.000000
1440      6930.808824
1480     13596.166667
1498      4490.000000
1500      9083.125000
1520      8139.425000
1544     10010.000000
1548      8499.000000
1560      9135.750000
1580      9950.000000
1600      9476.111111
1620     21492.000000
1792     54199.500000
1820      6498.000000
1920     14698.088496
2152    164999.000000
2160     17465.194444
2220     20531.333333
2240     49990.000000
2244     18000.000000
2246     16177.200000
2248     39990.000000
2270      8961.000000
2280     19073.190476
2310     25120.000000
2316     29999.000000
2340     19768.017241
2400     32131.083333
2436     75632.666667
2520     11844.500000
2560     26501.476190
2636    174990.000000
2688     88449.500000
2880     34993.250000
2960     38425.714286
3040     81799.500000
3120     45710.000000
3200     77999.000000
3840     45500.000000
Name: Price, dtype: float64

Средняя цена для 'Processor':
Processor
1      7861.095238
2      7929.444444
4      7209.401171
6     39365.400000
8     16193.927434
10     8542.000000
Name: Price, dtype: float64

Средняя цена для 'RAM (MB)':
RAM (MB)
64        4249.000000
256       2625.625000
289       3190.000000
384       5555.000000
512       3419.847222
768       4749.500000
1000      5747.082153
2000      8645.608187
3000     11587.829787
4000     17741.965000
6000     28291.587302
8000     45080.586207
12000    99173.750000
Name: Price, dtype: float64

Средняя цена для 'Internal storage (GB)':
Internal storage (GB)
0.064        3499.000000
0.128        4999.000000
0.160        5555.000000
0.512        3390.444444
1.000        5197.000000
2.000        2399.000000
3.000        3190.000000
4.000        4513.032258
8.000        5311.654206
16.000       8379.403341
32.000      12089.644366
64.000      21208.814607
128.000     29477.043478
256.000     68682.777778
512.000    164999.000000
Name: Price, dtype: float64

Средняя цена для 'Rear camera':
Rear camera
0.0       4193.500000
0.3       3054.666667
2.0       3000.804878
3.0       4329.333333
3.2       3506.727273
5.0       4413.183486
8.0       6658.109966
8.7       8999.000000
10.0     10499.250000
12.0     28533.950980
12.2     29162.500000
12.3     30569.250000
13.0      9531.776018
13.1     32490.000000
13.2      7496.333333
15.0     88719.000000
16.0     17923.896825
18.0     19999.000000
19.0     39095.000000
20.0     23739.777778
20.7     35718.600000
21.0     14513.900000
21.5      6999.000000
23.0     31966.090909
24.0     18587.250000
25.0     13980.000000
32.0     19589.000000
40.0     61389.750000
41.0     10990.000000
48.0     24205.615385
64.0     19332.333333
108.0    92999.000000
Name: Price, dtype: float64

Средняя цена для 'Front camera':
Front camera
0.0       6799.333333
0.3       4398.430233
0.9      19999.000000
1.1      18745.000000
1.2      18579.333333
1.3       5640.352941
1.5      18748.000000
1.6      15833.000000
1.9      11246.750000
2.0       6711.995122
2.1      24839.666667
2.2      35823.333333
2.4       5061.333333
3.0       8500.000000
3.2       4660.900000
3.7      28925.000000
4.0      13519.285714
5.0       8347.064655
7.0      49061.625000
8.0      13894.422222
10.0    105114.166667
12.0     41929.500000
13.0     11380.436364
16.0     17646.113402
20.0     13498.520000
24.0     21860.562500
25.0     19182.692308
32.0     23749.782609
40.0     92999.000000
48.0     27999.000000
Name: Price, dtype: float64

Средняя цена для 'Operating system':
Operating system
Android       10989.947652
BlackBerry    10509.600000
Cyanogen       9173.600000
Sailfish       4799.000000
Tizen          4459.666667
Windows       16706.684211
iOS           45510.470588
Name: Price, dtype: float64

Средняя цена для 'Wi-Fi':
Wi-Fi
No      6334.375000
Yes    11496.211695
Name: Price, dtype: float64

Средняя цена для 'Bluetooth':
Bluetooth
No      7794.466667
Yes    11506.800595
Name: Price, dtype: float64

Средняя цена для 'GPS':
GPS
No      8316.148148
Yes    11737.740208
Name: Price, dtype: float64

Средняя цена для 'Number of SIMs':
Number of SIMs
1    16479.718062
2    10465.580018
3     4590.000000
Name: Price, dtype: float64

Средняя цена для '3G':
3G
No     11616.882759
Yes    11447.783361
Name: Price, dtype: float64

Средняя цена для '4G/ LTE':
4G/ LTE
No      7922.270893
Yes    12680.858696
Name: Price, dtype: float64

Средняя цена для комбинации 'Brand' и 'Operating system':
Brand    Operating system
10.or    Android              5999.000000
Acer     Android              6470.000000
Alcatel  Android              9201.600000
Apple    iOS                 45510.470588
Aqua     Android              4599.000000
                                 ...     
Zopo     Android              6027.916667
Zuk      Android             29124.000000
iBall    Android              4051.000000
iVoomi   Android              4018.875000
mPhone   Android              6949.000000
Name: Price, Length: 85, dtype: float64

Средняя цена для комбинации 'RAM (MB)' и 'Internal storage (GB)':
RAM (MB)  Internal storage (GB)
64        0.064                      3499.000000
          0.128                      4999.000000
256       0.512                      2287.857143
          8.000                      4990.000000
289       3.000                      3190.000000
384       0.160                      5555.000000
512       0.512                      7249.500000
          2.000                      2399.000000
          4.000                      3222.244444
          8.000                      3513.750000
768       4.000                      6500.000000
          8.000                      2999.000000
1000      1.000                      5197.000000
          4.000                      8019.187500
          8.000                      5398.572464
          16.000                     6772.263158
          32.000                     6997.000000
2000      8.000                      6458.736842
          16.000                     8518.889273
          32.000                    10155.272727
          64.000                    36999.000000
3000      16.000                     9082.082192
          32.000                    11742.751269
          64.000                    24287.833333
4000      32.000                    14827.288462
          64.000                    19201.702290
          128.000                   15408.882353
6000      64.000                    26554.636364
          128.000                   29692.000000
          256.000                   44999.000000
8000      64.000                    54990.000000
          128.000                   37177.181818
          256.000                   72408.166667
12000     128.000                   92999.000000
          256.000                   69348.500000
          512.000                  164999.000000
Name: Price, dtype: float64

Средняя цена для комбинации 'Screen size (inches)' и 'Battery capacity (mAh)':
Screen size (inches)  Battery capacity (mAh)
2.40                  2000                        1249.0
2.44                  1450                        6999.0
2.45                  1500                        2999.0
2.60                  1350                        5555.0
2.80                  1200                        3190.0
                                                  ...   
6.70                  4500                       40259.0
6.80                  4300                       79699.0
6.90                  5000                       92999.0
7.00                  3450                        6199.0
7.30                  4380                      164999.0
Name: Price, Length: 431, dtype: float64

Выбор ориентира для каждой задачи:

  1. Прогнозирование цен на мобильные телефоны: Ориентир:

R² (коэффициент детерминации): 0.75 - 0.85

MAE (средняя абсолютная ошибка): 5000 - 10000 рублей

RMSE (среднеквадратичная ошибка): 10000 - 20000 рублей

Объяснение:

R²: Значение 0.75 - 0.85 будет означать, что модель объясняет 75-85% вариации цен на мобильные телефоны, что является хорошим результатом для задачи регрессии.

MAE: Значение 5000 - 10000 рублей будет означать, что в среднем модель ошибается на 5000 - 10000 рублей при прогнозировании цен на мобильные телефоны. Учитывая диапазон цен от 9000 до 150000 рублей, этот ориентир является разумным.

RMSE: Значение 10000 - 20000 рублей будет означать, что среднеквадратичная ошибка модели составляет 10000 - 20000 рублей.

  1. Оптимизация характеристик продукта: Ориентир:

Увеличение прибыли компании: 5% - 10%

Сохранение конкурентоспособных тарифов:

Средняя цена мобильных телефонов не должна увеличиваться более чем на 5% по сравнению с текущими тарифами.

Доля клиентов, считающих цены высокими, не должна увеличиваться более чем на 2%.

Объяснение:

Увеличение прибыли компании:

Цель оптимизации характеристик продукта - максимизировать прибыль компании. Ориентир в 5% - 10% увеличения прибыли является реалистичным и достижимым.

Сохранение конкурентоспособных тарифов:

Важно, чтобы оптимизация характеристик продукта не привела к значительному увеличению цен для клиентов. Ориентир в 5% увеличения средней цены мобильных телефонов и 2% увеличения доли клиентов, считающих цены высокими, позволяет сохранить конкурентоспособность компании.

In [34]:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

# Загружаем набор данных
df = pd.read_csv("..//static//csv//ndtv_data_final.csv")

# Удаление пустого столбца по имени
df = df.drop('Unnamed: 0', axis=1)

# Преобразуем категориальные переменные в числовые
df = pd.get_dummies(df, columns=['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE'], drop_first=True)

# Разделяем данные на признаки (X) и целевую переменную (y)
X = df.drop('Price', axis=1)
y = df['Price']

# Разделяем данные на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Стандартизируем признаки
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# Обучаем модель линейной регрессии
model = LinearRegression()
model.fit(X_train, y_train)

# Делаем предсказания на тестовой выборке
y_pred = model.predict(X_test)

# Оцениваем качество модели
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = mean_squared_error(y_test, y_pred, squared=False)
r2 = r2_score(y_test, y_pred)

print(f"MAE: {mae}")
print(f"MSE: {mse}")
print(f"RMSE: {rmse}")
print(f"R²: {r2}")

# Проверяем, достигнуты ли ориентиры
if r2 >= 0.75 and mae <= 10000 and rmse <= 20000:
    print("Ориентиры для прогнозирования цены мобильных устройств достигнуты!")
else:
    print("Ориентиры для прогнозирования цены мобильных устройств не достигнуты.")

# Оптимизация тарифной сетки
# Убедитесь, что столбцы существуют
columns_to_group = ['Battery capacity (mAh)', 'Screen size (inches)', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera']

# Рассчитываем среднюю цену для каждого значения каждого признака
for column in columns_to_group:
    print(f"Средняя цена для '{column}':")
    print(df.groupby(column)['Price'].mean())
    print()

# Рассчитываем среднюю цену для комбинаций признаков
# Например, для комбинации 'Battery capacity (mAh)' и 'RAM (MB)'
print("Средняя цена для комбинации 'Battery capacity (mAh)' и 'RAM (MB)':")
print(df.groupby(['Battery capacity (mAh)', 'RAM (MB)'])['Price'].mean())
print()

# Рассчитываем среднюю цену для комбинации 'Screen size (inches)' и 'Internal storage (GB)'
print("Средняя цена для комбинации 'Screen size (inches)' и 'Internal storage (GB)':")
print(df.groupby(['Screen size (inches)', 'Internal storage (GB)'])['Price'].mean())
print()

# Рассчитываем среднюю цену для комбинации 'Rear camera' и 'Front camera'
print("Средняя цена для комбинации 'Rear camera' и 'Front camera':")
print(df.groupby(['Rear camera', 'Front camera'])['Price'].mean())
print()
MAE: 5424.128251450574
MSE: 143399695.59118932
RMSE: 11974.961193723733
R²: 0.4559750691933513
Ориентиры для прогнозирования цены мобильных устройств не достигнуты.
Средняя цена для 'Battery capacity (mAh)':
Battery capacity (mAh)
1010     3499.000000
1050     4790.000000
1200     3396.000000
1250     2498.500000
1300     3338.333333
            ...     
5000    13542.530612
5020    23900.000000
5100    16999.000000
5300     8999.000000
6000    19832.333333
Name: Price, Length: 165, dtype: float64

Средняя цена для 'Screen size (inches)':
Screen size (inches)
2.40      1249.000000
2.44      6999.000000
2.45      2999.000000
2.60      5555.000000
2.80      5345.000000
            ...      
6.70     58896.428571
6.80     79699.000000
6.90     92999.000000
7.00      6199.000000
7.30    164999.000000
Name: Price, Length: 80, dtype: float64

Средняя цена для 'RAM (MB)':
RAM (MB)
64        4249.000000
256       2625.625000
289       3190.000000
384       5555.000000
512       3419.847222
768       4749.500000
1000      5747.082153
2000      8645.608187
3000     11587.829787
4000     17741.965000
6000     28291.587302
8000     45080.586207
12000    99173.750000
Name: Price, dtype: float64

Средняя цена для 'Internal storage (GB)':
Internal storage (GB)
0.064        3499.000000
0.128        4999.000000
0.160        5555.000000
0.512        3390.444444
1.000        5197.000000
2.000        2399.000000
3.000        3190.000000
4.000        4513.032258
8.000        5311.654206
16.000       8379.403341
32.000      12089.644366
64.000      21208.814607
128.000     29477.043478
256.000     68682.777778
512.000    164999.000000
Name: Price, dtype: float64

Средняя цена для 'Rear camera':
Rear camera
0.0       4193.500000
0.3       3054.666667
2.0       3000.804878
3.0       4329.333333
3.2       3506.727273
5.0       4413.183486
8.0       6658.109966
8.7       8999.000000
10.0     10499.250000
12.0     28533.950980
12.2     29162.500000
12.3     30569.250000
13.0      9531.776018
13.1     32490.000000
13.2      7496.333333
15.0     88719.000000
16.0     17923.896825
18.0     19999.000000
19.0     39095.000000
20.0     23739.777778
20.7     35718.600000
21.0     14513.900000
21.5      6999.000000
23.0     31966.090909
24.0     18587.250000
25.0     13980.000000
32.0     19589.000000
40.0     61389.750000
41.0     10990.000000
48.0     24205.615385
64.0     19332.333333
108.0    92999.000000
Name: Price, dtype: float64

Средняя цена для 'Front camera':
Front camera
0.0       6799.333333
0.3       4398.430233
0.9      19999.000000
1.1      18745.000000
1.2      18579.333333
1.3       5640.352941
1.5      18748.000000
1.6      15833.000000
1.9      11246.750000
2.0       6711.995122
2.1      24839.666667
2.2      35823.333333
2.4       5061.333333
3.0       8500.000000
3.2       4660.900000
3.7      28925.000000
4.0      13519.285714
5.0       8347.064655
7.0      49061.625000
8.0      13894.422222
10.0    105114.166667
12.0     41929.500000
13.0     11380.436364
16.0     17646.113402
20.0     13498.520000
24.0     21860.562500
25.0     19182.692308
32.0     23749.782609
40.0     92999.000000
48.0     27999.000000
Name: Price, dtype: float64

Средняя цена для комбинации 'Battery capacity (mAh)' и 'RAM (MB)':
Battery capacity (mAh)  RAM (MB)
1010                    64           3499.0
1050                    1000         4790.0
1200                    64           4999.0
                        289          3190.0
                        512          1999.0
                                     ...   
5020                    3000        23900.0
5100                    3000        16999.0
5300                    4000         8999.0
6000                    4000        10749.0
                        8000        37999.0
Name: Price, Length: 323, dtype: float64

Средняя цена для комбинации 'Screen size (inches)' и 'Internal storage (GB)':
Screen size (inches)  Internal storage (GB)
2.40                  4.000                      1249.0
2.44                  0.512                      6999.0
2.45                  4.000                      2999.0
2.60                  0.160                      5555.0
2.80                  0.512                      7500.0
                                                 ...   
6.70                  256.000                  174990.0
6.80                  256.000                   79699.0
6.90                  128.000                   92999.0
7.00                  8.000                      6199.0
7.30                  512.000                  164999.0
Name: Price, Length: 177, dtype: float64

Средняя цена для комбинации 'Rear camera' и 'Front camera':
Rear camera  Front camera
0.0          0.0              4193.500000
0.3          0.3              3054.666667
2.0          0.0              4396.000000
             0.3              2940.937500
             1.3              2240.000000
                                 ...     
48.0         48.0            27999.000000
64.0         16.0            21499.000000
             20.0            14999.000000
             32.0            21499.000000
108.0        40.0            92999.000000
Name: Price, Length: 126, dtype: float64

d:\ULSTU\AIM2\AIM-PIbd-32-Puchkina-A-A\aimenv\Lib\site-packages\sklearn\metrics\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.
  warnings.warn(

Анализ применимости алгоритмов обучения с учителем для решения поставленных задач:

  1. Прогнозирование стоимости страховых взносов: Задача: Регрессия

Свойства алгоритмов:

Линейная регрессия: Применимость: Хорошо подходит для задач, где зависимость между признаками и целевой переменной линейна. Преимущества: Проста в реализации, интерпретируема. Недостатки: Может плохо работать, если зависимость нелинейна.

Деревья решений (регрессия): Применимость: Подходит для задач с нелинейными зависимостями. Преимущества: Может обрабатывать категориальные признаки, не требует масштабирования данных. Недостатки: Подвержены переобучению, могут давать нестабильные результаты.

Случайный лес (регрессия): Применимость: Хорошо подходит для задач с нелинейными зависимостями и большим количеством признаков. Преимущества: Устойчив к переобучению, может обрабатывать категориальные признаки. Недостатки: Менее интерпретируем, чем линейная регрессия.

Градиентный бустинг (регрессия): Применимость: Подходит для задач с нелинейными зависимостями и сложными взаимосвязями между признаками. Преимущества: Может достигать высокой точности, устойчив к переобучению. Недостатки: Сложнее в настройке, чем случайный лес, менее интерпретируем.

Нейронные сети (регрессия): Применимость: Подходит для задач с очень сложными зависимостями и большим количеством данных. Преимущества: Может моделировать очень сложные зависимости. Недостатки: Требует большого количества данных, сложнее в настройке и интерпретации.

Вывод:

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

Деревья решений и случайный лес: Подходят для задач с нелинейными зависимостями.

Градиентный бустинг: Может давать более высокую точность, чем случайный лес, но требует больше времени на настройку.

Нейронные сети: Могут быть излишними для этой задачи, если данных недостаточно много.

  1. Оптимизация тарифной сетки: Задача: Классификация (группировка клиентов по группам риска)

Свойства алгоритмов:

Логистическая регрессия: Применимость: Хорошо подходит для задач бинарной классификации, где зависимость между признаками и целевой переменной линейна. Преимущества: Проста в реализации, интерпретируема. Недостатки: Может плохо работать, если зависимость нелинейна.

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

Случайный лес (классификация): Применимость: Хорошо подходит для задач с нелинейными зависимостями и большим количеством признаков. Преимущества: Устойчив к переобучению, может обрабатывать категориальные признаки. Недостатки: Менее интерпретируем, чем линейная регрессия.

Градиентный бустинг (классификация): Применимость: Подходит для задач с нелинейными зависимостями и сложными взаимосвязями между признаками. Преимущества: Может достигать высокой точности, устойчив к переобучению. Недостатки: Сложнее в настройке, чем случайный лес, менее интерпретируем.

Нейронные сети (классификация): Применимость: Подходит для задач с очень сложными зависимостями и большим количеством данных. Преимущества: Может моделировать очень сложные зависимости. Недостатки: Требует большого количества данных, сложнее в настройке и интерпретации.

Вывод:

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

Деревья решений и случайный лес: Подходят для задач с нелинейными зависимостями.

Градиентный бустинг: Может давать более высокую точность, чем случайный лес, но требует больше времени на настройку.

Нейронные сети: Могут быть излишними для этой задачи, если данных недостаточно много.

  1. Прогнозирование стоимости страховых взносов: Выбранные модели:

Линейная регрессия

Случайный лес (регрессия)

Градиентный бустинг (регрессия)

  1. Оптимизация тарифной сетки: Выбранные модели:

Логистическая регрессия

Случайный лес (классификация)

Градиентный бустинг (классификация)

In [ ]:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, accuracy_score
import re

# Загружаем набор данных
df = pd.read_csv("..//static//csv//ndtv_data_final.csv")

# Удаление пустого столбца по имени
df = df.drop('Unnamed: 0', axis=1)

# Извлечение числовых значений из столбца Battery
df['Battery'] = df['Battery'].apply(lambda x: int(re.search(r'\d+', x).group()) if re.search(r'\d+', x) else None)
df['Ram'] = df['Ram'].apply(lambda x: int(re.search(r'\d+', x).group()) if re.search(r'\d+', x) else None)
df['Camera'] = df['Camera'].apply(lambda x: int(re.search(r'\d+', x).group()) if re.search(r'\d+', x) else None)
df['Display'] = df['Display'].apply(lambda x: int(re.search(r'\d+', x).group()) if re.search(r'\d+', x) else None)

# Преобразуем категориальные переменные в числовые
# Предположим, что 'company' и 'Processor_name' являются категориальными
df = pd.get_dummies(df, columns=['company', 'Processor_name'], drop_first=True)

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии
X_reg = df.drop('Price', axis=1)
y_reg = df['Price']

# Разделяем данные на обучающую и тестовую выборки для задачи регрессии
X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)

# Стандартизируем признаки для задачи регрессии
scaler_reg = StandardScaler()
X_train_reg = scaler_reg.fit_transform(X_train_reg)
X_test_reg = scaler_reg.transform(X_test_reg)

# Список моделей для задачи регрессии
models_reg = {
    "Linear Regression": LinearRegression(),
    "Random Forest Regression": RandomForestRegressor(),
    "Gradient Boosting Regression": GradientBoostingRegressor()
}

# Обучаем и оцениваем модели для задачи регрессии
print("Результаты для задачи регрессии:")
for name, model in models_reg.items():
    model.fit(X_train_reg, y_train_reg)
    y_pred_reg = model.predict(X_test_reg)
    mae = mean_absolute_error(y_test_reg, y_pred_reg)
    mse = mean_squared_error(y_test_reg, y_pred_reg)
    rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)
    r2 = r2_score(y_test_reg, y_pred_reg)
    print(f"Model: {name}")
    print(f"MAE: {mae}")
    print(f"MSE: {mse}")
    print(f"RMSE: {rmse}")
    print(f"R²: {r2}")
    print()

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации
# Предположим, что мы классифицируем устройства по рейтингу выше среднего
X_class = df.drop('Rating', axis=1)
y_class = (df['Rating'] > df['Rating'].mean()).astype(int)

# Разделяем данные на обучающую и тестовую выборки для задачи классификации
X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)

# Стандартизируем признаки для задачи классификации
scaler_class = StandardScaler()
X_train_class = scaler_class.fit_transform(X_train_class)
X_test_class = scaler_class.transform(X_test_class)

# Список моделей для задачи классификации
models_class = {
    "Logistic Regression": LogisticRegression(),
    "Random Forest Classification": RandomForestClassifier(),
    "Gradient Boosting Classification": GradientBoostingClassifier()
}

# Обучаем и оцениваем модели для задачи классификации
print("Результаты для задачи классификации:")
for name, model in models_class.items():
    model.fit(X_train_class, y_train_class)
    y_pred_class = model.predict(X_test_class)
    accuracy = accuracy_score(y_test_class, y_pred_class)
    print(f"Model: {name}")
    print(f"Accuracy: {accuracy}")
    print()
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[19], line 39
     37 # Стандартизируем признаки для задачи регрессии
     38 scaler_reg = StandardScaler()
---> 39 X_train_reg = scaler_reg.fit_transform(X_train_reg)
     40 X_test_reg = scaler_reg.transform(X_test_reg)
     42 # Список моделей для задачи регрессии

File d:\ULSTU\AIM2\AIM-PIbd-32-Puchkina-A-A\aimenv\Lib\site-packages\sklearn\utils\_set_output.py:316, in _wrap_method_output.<locals>.wrapped(self, X, *args, **kwargs)
    314 @wraps(f)
    315 def wrapped(self, X, *args, **kwargs):
--> 316     data_to_wrap = f(self, X, *args, **kwargs)
    317     if isinstance(data_to_wrap, tuple):
    318         # only wrap the first output for cross decomposition
    319         return_tuple = (
    320             _wrap_data_with_container(method, data_to_wrap[0], X, self),
    321             *data_to_wrap[1:],
    322         )

File d:\ULSTU\AIM2\AIM-PIbd-32-Puchkina-A-A\aimenv\Lib\site-packages\sklearn\base.py:1098, in TransformerMixin.fit_transform(self, X, y, **fit_params)
   1083         warnings.warn(
   1084             (
   1085                 f"This object ({self.__class__.__name__}) has a `transform`"
   (...)
   1093             UserWarning,
   1094         )
   1096 if y is None:
   1097     # fit method of arity 1 (unsupervised transformation)
-> 1098     return self.fit(X, **fit_params).transform(X)
   1099 else:
   1100     # fit method of arity 2 (supervised transformation)
   1101     return self.fit(X, y, **fit_params).transform(X)

File d:\ULSTU\AIM2\AIM-PIbd-32-Puchkina-A-A\aimenv\Lib\site-packages\sklearn\preprocessing\_data.py:878, in StandardScaler.fit(self, X, y, sample_weight)
    876 # Reset internal state before fitting
    877 self._reset()
--> 878 return self.partial_fit(X, y, sample_weight)

File d:\ULSTU\AIM2\AIM-PIbd-32-Puchkina-A-A\aimenv\Lib\site-packages\sklearn\base.py:1473, in _fit_context.<locals>.decorator.<locals>.wrapper(estimator, *args, **kwargs)
   1466     estimator._validate_params()
   1468 with config_context(
   1469     skip_parameter_validation=(
   1470         prefer_skip_nested_validation or global_skip_validation
   1471     )
   1472 ):
-> 1473     return fit_method(estimator, *args, **kwargs)

File d:\ULSTU\AIM2\AIM-PIbd-32-Puchkina-A-A\aimenv\Lib\site-packages\sklearn\preprocessing\_data.py:914, in StandardScaler.partial_fit(self, X, y, sample_weight)
    882 """Online computation of mean and std on X for later scaling.
    883 
    884 All of X is processed as a single batch. This is intended for cases
   (...)
    911     Fitted scaler.
    912 """
    913 first_call = not hasattr(self, "n_samples_seen_")
--> 914 X = self._validate_data(
    915     X,
    916     accept_sparse=("csr", "csc"),
    917     dtype=FLOAT_DTYPES,
    918     force_all_finite="allow-nan",
    919     reset=first_call,
    920 )
    921 n_features = X.shape[1]
    923 if sample_weight is not None:

File d:\ULSTU\AIM2\AIM-PIbd-32-Puchkina-A-A\aimenv\Lib\site-packages\sklearn\base.py:633, in BaseEstimator._validate_data(self, X, y, reset, validate_separately, cast_to_ndarray, **check_params)
    631         out = X, y
    632 elif not no_val_X and no_val_y:
--> 633     out = check_array(X, input_name="X", **check_params)
    634 elif no_val_X and not no_val_y:
    635     out = _check_y(y, **check_params)

File d:\ULSTU\AIM2\AIM-PIbd-32-Puchkina-A-A\aimenv\Lib\site-packages\sklearn\utils\validation.py:929, in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_writeable, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)
    924 if pandas_requires_conversion:
    925     # pandas dataframe requires conversion earlier to handle extension dtypes with
    926     # nans
    927     # Use the original dtype for conversion if dtype is None
    928     new_dtype = dtype_orig if dtype is None else dtype
--> 929     array = array.astype(new_dtype)
    930     # Since we converted here, we do not need to convert again later
    931     dtype = None

File d:\ULSTU\AIM2\AIM-PIbd-32-Puchkina-A-A\aimenv\Lib\site-packages\pandas\core\generic.py:6643, in NDFrame.astype(self, dtype, copy, errors)
   6637     results = [
   6638         ser.astype(dtype, copy=copy, errors=errors) for _, ser in self.items()
   6639     ]
   6641 else:
   6642     # else, only a single dtype is given
-> 6643     new_data = self._mgr.astype(dtype=dtype, copy=copy, errors=errors)
   6644     res = self._constructor_from_mgr(new_data, axes=new_data.axes)
   6645     return res.__finalize__(self, method="astype")

File d:\ULSTU\AIM2\AIM-PIbd-32-Puchkina-A-A\aimenv\Lib\site-packages\pandas\core\internals\managers.py:430, in BaseBlockManager.astype(self, dtype, copy, errors)
    427 elif using_copy_on_write():
    428     copy = False
--> 430 return self.apply(
    431     "astype",
    432     dtype=dtype,
    433     copy=copy,
    434     errors=errors,
    435     using_cow=using_copy_on_write(),
    436 )

File d:\ULSTU\AIM2\AIM-PIbd-32-Puchkina-A-A\aimenv\Lib\site-packages\pandas\core\internals\managers.py:363, in BaseBlockManager.apply(self, f, align_keys, **kwargs)
    361         applied = b.apply(f, **kwargs)
    362     else:
--> 363         applied = getattr(b, f)(**kwargs)
    364     result_blocks = extend_blocks(applied, result_blocks)
    366 out = type(self).from_blocks(result_blocks, self.axes)

File d:\ULSTU\AIM2\AIM-PIbd-32-Puchkina-A-A\aimenv\Lib\site-packages\pandas\core\internals\blocks.py:758, in Block.astype(self, dtype, copy, errors, using_cow, squeeze)
    755         raise ValueError("Can not squeeze with more than one column.")
    756     values = values[0, :]  # type: ignore[call-overload]
--> 758 new_values = astype_array_safe(values, dtype, copy=copy, errors=errors)
    760 new_values = maybe_coerce_values(new_values)
    762 refs = None

File d:\ULSTU\AIM2\AIM-PIbd-32-Puchkina-A-A\aimenv\Lib\site-packages\pandas\core\dtypes\astype.py:237, in astype_array_safe(values, dtype, copy, errors)
    234     dtype = dtype.numpy_dtype
    236 try:
--> 237     new_values = astype_array(values, dtype, copy=copy)
    238 except (ValueError, TypeError):
    239     # e.g. _astype_nansafe can fail on object-dtype of strings
    240     #  trying to convert to float
    241     if errors == "ignore":

File d:\ULSTU\AIM2\AIM-PIbd-32-Puchkina-A-A\aimenv\Lib\site-packages\pandas\core\dtypes\astype.py:182, in astype_array(values, dtype, copy)
    179     values = values.astype(dtype, copy=copy)
    181 else:
--> 182     values = _astype_nansafe(values, dtype, copy=copy)
    184 # in pandas we don't store numpy str dtypes, so convert to object
    185 if isinstance(dtype, np.dtype) and issubclass(values.dtype.type, str):

File d:\ULSTU\AIM2\AIM-PIbd-32-Puchkina-A-A\aimenv\Lib\site-packages\pandas\core\dtypes\astype.py:133, in _astype_nansafe(arr, dtype, copy, skipna)
    129     raise ValueError(msg)
    131 if copy or arr.dtype == object or dtype == object:
    132     # Explicit copy, or required since NumPy can't view from / to object.
--> 133     return arr.astype(dtype, copy=True)
    135 return arr.astype(dtype, copy=copy)

ValueError: could not convert string to float: '9.0 (Pie)'