AIM-PIbd-32-Chernyshev-G-Y/lab_2/Lab2.ipynb
2024-10-18 20:05:31 +04:00

393 KiB
Raw Blame History

Проблемная область: аналитика рынка видеоигр (в данном случае на площадке Steam)

Объект наблюдения: игры на площадке steam. Атрибутами являются характеристики игры (название, дата выпуска, цена, наличие игры на разных игровых платформах (пк, консоли)) и её оценка игроками (рейтинг, отзывы) В данном датасете только 1 объект, но можно указать следующую связь: Игра связана со множеством отзывов

Бизнес-цель: Определить, как основные характеристики влияют на оценку игры steam, чтобы разработчики и издатели игр знали, во что следует вкладывать больше временных и денежных ресуров. Эффект для бизнеса: увеличение шансов на успех игры, снижение рисков финансовых потерь

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

In [296]:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
df1 = pd.read_csv("..//static//csv//games.csv")

print(df1.columns)
Index(['app_id', 'title', 'date_release', 'win', 'mac', 'linux', 'rating',
       'positive_ratio', 'user_reviews', 'price_final', 'price_original',
       'discount', 'steam_deck'],
      dtype='object')

Оценка всех числовых признаков показывает, что в датасете довольно много выбросов.

По столбцу positive_ratio есть игры, у которых очень мало позитивных отзывов, однако в случае игр важно знать и игры, у которых больше негативных отзывов, чем положительных, т.е. это полезный шум. Данные же смещены в сторону игр с бОльшим количеством положительных отзывов (более 60%), чем отрицательных. Однако данный столбец может влиять на столбец со строковыми значениями rating, поэтому в дальнейшем его можно считать просто шумом

В столбце user_reviews есть серьёзный выброс с крайне большим количеством отзывов, однако сам столбец можно считать шумом, т.к. в данной ситуации количество отзывов не так важно, как рейтинг игры.

Столбец price_final зависит от столбцов price_original и discount. В данном случае не стоит учитывать скидки на игры и их цену после скидки, поэтому столбцы price_final и discount можно считать шумом.

В столбце price_original есть много выбросов, которые находятся выше средних значений. Для анализа желательны разные цены игр, однако игры с ценами более 150$ можно удалить, т.к. вероятность настолько дорогой игры крайне мала и из-за таких игр модель может обучиться некорректно. Данные же в столбце смещены в сторону игр до 25$

In [297]:
numeric_cols = df1.select_dtypes(include=['number']).columns

#все столбцы, кроме app_id
numeric_cols = [col for col in numeric_cols if col != 'app_id']

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

for i, col in enumerate(numeric_cols, 1):
    if col == 'id':
        continue
    Q1 = df1[col].quantile(0.25)
    Q3 = df1[col].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    outliers = df1[col][(df1[col] < lower_bound) | (df1[col] > upper_bound)]
    plt.subplot(len(numeric_cols) // 3 + 1, 3, i) 
    plt.boxplot(x=df1[col])
    plt.title(f'Boxplot for {col}')

plt.tight_layout()
plt.show()
No description has been provided for this image

Для проверки на просачивание данных, рейтинг игры, представленный в датасете в виде строковых значений, необходимо перевести в числовую шкалу. Было бы логично перевести игры в 5-бальную шкалу или 10-бальную, но всего разных строковых рейтингов 9, что не делится на 5 и 10. Поэтому для равномерного распределения строковых рейтингов они были переведены в 3-бальную шкалу. С этой шкалой сильно коррелирует только столбец с отношением положительных отзывов к отрицательным (positive_ratio), что логично, т.к. от этого столбца зависит столбец rating, на основе которого и был создан столбец rating_stars с 5-бальной шкалой. Однако признак positive_ratio не будет входным, поэтому просачивания данных не будет.

In [298]:
#просмотр того, какие рейтинги игр есть в таблице
print(df1['rating'].unique())

#преобразование строковых значений рейтинга в числовые оценки от 1 до 5
# rating_mapping = {'Overwhelmingly Positive': 5, 
#                   'Very Positive': 5, 
#                   'Positive': 4, 
#                   'Mostly Positive': 4, 
#                   'Mixed': 3, 
#                   'Mostly Negative': 3, 
#                   'Negative': 2, 
#                   'Very Negative': 2,
#                   'Overwhelmingly Negative': 1
#                   } 
# rating_mapping = {'Overwhelmingly Positive': 10, 
#                   'Very Positive': 9, 
#                   'Positive': 8, 
#                   'Mostly Positive': 7, 
#                   'Mixed': 6, 
#                   'Mostly Negative': 5, 
#                   'Negative': 4, 
#                   'Very Negative': 3,
#                   'Overwhelmingly Negative': 2
#                   } 
rating_mapping = {'Overwhelmingly Positive': 3, 
                  'Very Positive': 3, 
                  'Positive': 3, 
                  'Mostly Positive': 2, 
                  'Mixed': 2, 
                  'Mostly Negative': 2, 
                  'Negative': 1, 
                  'Very Negative': 1,
                  'Overwhelmingly Negative': 1
                  } 
df1['rating_stars'] = df1['rating'].map(rating_mapping)


#проверка кореляции (просачивания данных)
main_col = 'rating_stars'
for col1 in numeric_cols:
    if col1 != main_col:
        correlation = df1[col1].corr(df1[main_col])
        if abs(correlation) > 0.7:
            print(f"Просачивание данных: Высокая корреляция ({correlation:.2f}) между столбцами '{col1}' и '{main_col}'")
['Very Positive' 'Positive' 'Mixed' 'Mostly Positive'
 'Overwhelmingly Positive' 'Negative' 'Mostly Negative'
 'Overwhelmingly Negative' 'Very Negative']
Просачивание данных: Высокая корреляция (0.82) между столбцами 'positive_ratio' и 'rating_stars'

Данный датасет не совсем информативный, т.к. нет данных о жанре игры и об издателе, что вполне может повлиять на оценку игры. Тем не менее в нём есть данные об отзывах и оценке, дате выхода, цене и доступных платформах, что так же может влиять на оценку игры.

Покрытие у датасета хорошее, т.к. содержится 50000 записей об играх с 1997 по 2023 год, однако важных данных об играх текущего года здесь нет. Данные также могут быть неактуальны, т.к. с последней даты выхода игры прошёл год, за который отзывы на игры могли измениться.

Метки согласованы, однако метку final_price можно принять за окончательную цену игры после её выпуска, что неверно, т.к. это на самом деле означает цену после применения скидки

In [299]:
print(df1.columns)
print(f"Количество записей: {df1.shape[0]}")
#даты выхода игр
df1['date_release'] = pd.to_datetime(df1['date_release'])
df_sorted = df1.sort_values(by='date_release')
print(df_sorted['date_release'].unique())
Index(['app_id', 'title', 'date_release', 'win', 'mac', 'linux', 'rating',
       'positive_ratio', 'user_reviews', 'price_final', 'price_original',
       'discount', 'steam_deck', 'rating_stars'],
      dtype='object')
Количество записей: 50872
<DatetimeArray>
['1997-06-30 00:00:00', '1997-11-14 00:00:00', '1998-11-08 00:00:00',
 '1999-04-01 00:00:00', '1999-09-08 00:00:00', '1999-11-01 00:00:00',
 '2000-11-01 00:00:00', '2001-06-01 00:00:00', '2002-08-28 00:00:00',
 '2003-05-01 00:00:00',
 ...
 '2023-10-12 00:00:00', '2023-10-13 00:00:00', '2023-10-15 00:00:00',
 '2023-10-16 00:00:00', '2023-10-17 00:00:00', '2023-10-18 00:00:00',
 '2023-10-19 00:00:00', '2023-10-20 00:00:00', '2023-10-23 00:00:00',
 '2023-10-24 00:00:00']
Length: 4292, dtype: datetime64[ns]

Во всех столбцах нет пропущенных данных, поэтому данную проблему устранять не надо

In [300]:
columns_with_nulls = []
for col in df1.columns:
  if df1[col].isnull().sum() > 0:  
    columns_with_nulls.append(col)
print(f"Cтолбцы, в которых пропущены значения: {columns_with_nulls}")
олбцы, в которых пропущены значения: []

РАЗБИЕНИЕ НА ВЫБОРКИ

train_data - обучающая выборка

val_data - контрольная выборка

test_data - тестовая выборка

Заметно, что в обучающую выборку попало слишком мало игр с низким рейтингом. Необходимо прирастить данные для таких игр через oversampling

In [301]:
from sklearn.model_selection import train_test_split
data=df1[['date_release', 'win', 'linux', 'mac', 'price_original', 'rating_stars']].copy()
# сначала разделение записей на 80% и 20%, где 80% - обучающая выборка
train_data, temp_data = train_test_split(data, test_size=0.2, random_state=42)

# потом разделение остальных 20% поровну на контрольную и тестовую выборки
val_data, test_data = train_test_split(temp_data, test_size=0.5, random_state=42)

# Проверка размеров выборок
print("Размер обучающей выборки:", len(train_data))
print("Размер контрольной выборки:", len(val_data))
print("Размер тестовой выборки:", len(test_data))


# построение столбчатой диаграммы по столбцу rating_stars (сбалансированность обучающей выборки)
rating_counts = train_data['rating_stars'].value_counts().sort_index()

plt.bar(rating_counts.index, rating_counts.values)
plt.xlabel('Rating Stars')
plt.ylabel('Count')
plt.show()

print(train_data["rating_stars"].value_counts().sort_index())
Размер обучающей выборки: 40697
Размер контрольной выборки: 5087
Размер тестовой выборки: 5088
No description has been provided for this image
rating_stars
1      296
2    18144
3    22257
Name: count, dtype: int64

ПРИРАЩЕНИЕ ДАННЫХ (oversampling)

После приращения данных по играм с отрицательными отзывами стало гораздо больше. Теперь распределение игр стало гораздо сбалансированнее

In [302]:
from imblearn.over_sampling import ADASYN
ada = ADASYN(n_neighbors=3)
#ada = ADASYN()


#Преобразование нечисленных значений к численным для возиожности работы с oversampling
train_data['date_release'] = pd.to_datetime(df1['date_release']).astype('int64')/ 10**9
train_data['mac'] = train_data["mac"].astype(int)
train_data['win'] = train_data["mac"].astype(int)
train_data['linux'] = train_data["linux"].astype(int)

X_resampled, y_resampled = ada.fit_resample(train_data, train_data["rating_stars"])
train_data_adasyn = pd.DataFrame(X_resampled)


rating_counts_adasyn = train_data_adasyn['rating_stars'].value_counts().sort_index()

plt.bar(rating_counts_adasyn.index, rating_counts_adasyn.values)
plt.xlabel('Rating Stars')
plt.ylabel('Count')
plt.show()

print(train_data_adasyn["rating_stars"].value_counts().sort_index())
No description has been provided for this image
rating_stars
1    22234
2    20308
3    22257
Name: count, dtype: int64

ДАТАСЕТ 2

https://www.kaggle.com/datasets/dewangmoghe/mobile-phone-price-prediction

Проблемная область: рынок мобильных телефонов

Объекты наблюдения: мобильные телефоны

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

  • Name: Название

  • Rating: оценка телефона (от 0 до 5).

  • Spec_score: оценка телефона на основе его основных характеристик (от 0 до 100)

  • No_of_sim: поддерживает ли телефон две SIM-карты, 3G, 4G, 5G, Volte

  • RAM: кол-во оперативной памяти

  • Battery: хар-ки аккумулятора

  • Display: размере экрана телефона

  • Camera: хар-ки передней и задней камерах

  • External_Memory: поддерживает ли внешнюю память и сколько

  • Android_version: версия Android телефона

  • Price: цена

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

  • Inbuilt_memory: встроенная память телефона

  • fast_charging: поддерживает ли быструю зарядку или нет и насколько ватт.

  • Screen_resolution: разрешение экрана

  • Processor: описание процессора

  • Processor_name: название процессора

Связи между объектами: Между ценой телефона и его другими хар-ками (чем лучше хар-ки, тем дороже должен быть телефон)

Бизнес-цель: помочь производителям и продавцам определить оптимальную цену для новых телефонов на основе конкурентов. Эффект для бизнеса: Улучшение конкурентоспособности на рынке, потенциальное увеличение прибыли

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

In [303]:
df2 = pd.read_csv("..//static//csv//mobiles.csv")
print(df2.columns)
print(df2.info())
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')
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1370 entries, 0 to 1369
Data columns (total 18 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   Unnamed: 0         1370 non-null   int64  
 1   Name               1370 non-null   object 
 2   Rating             1370 non-null   float64
 3   Spec_score         1370 non-null   int64  
 4   No_of_sim          1370 non-null   object 
 5   Ram                1370 non-null   object 
 6   Battery            1370 non-null   object 
 7   Display            1370 non-null   object 
 8   Camera             1370 non-null   object 
 9   External_Memory    1370 non-null   object 
 10  Android_version    927 non-null    object 
 11  Price              1370 non-null   object 
 12  company            1370 non-null   object 
 13  Inbuilt_memory     1351 non-null   object 
 14  fast_charging      1281 non-null   object 
 15  Screen_resolution  1368 non-null   object 
 16  Processor          1342 non-null   object 
 17  Processor_name     1370 non-null   object 
dtypes: float64(1), int64(2), object(15)
memory usage: 192.8+ KB
None

В столбце Ram есть шум в виде значений, которые явно не относятся к значению оперативной памяти ('Helio G90T', '128 GB inbuilt' '6000 mAh Battery with 22.5W Fast Charging' '256 GB inbuilt' '512 GB inbuilt'). Строки с этими значениями можно удалить, т.к. у них значения съехали с других столбцов, а значит и в другом столбце будет неверное значение.

Также было обнаружено, что не все цены указаны верно, т.к. у некоторых значений было 2 запятые. Для преобразования значений в числа запятые были заменены на точки, а в строках, где стало 2 точки, первая точка удалена.

Актуальность данных проверить нельзя, т.к. в датасете нет даты релиза смартфона

Покрытие данных очень хорошее, т.к. представлено большое количество смартфон разной ценовой категории

In [304]:
for col in df2.columns:
  print(df2[col].unique())

#Преобразование категориальных данных в числа
#Удаление подстроки 'GB RAM', чтобы остались только числа
df2['Ram'] = df2['Ram'].replace(' GB RAM', '', regex=True)

import re
# Удаление строк, у кот. в Ram какое-то неверное значение (оставление только строк, где число)
df2 = df2[df2['Ram'].apply(lambda x: bool(re.match(r'^\d+(\.\d+)?$', str(x))))]

#Исправление батареи. Удаление подстроки 'mAh Battery', чтобы остались только числа
df2['Battery'] = df2['Battery'].replace(' mAh Battery', '', regex=True)

#Исправление диагонали. Удаление подстроки 'inches'
df2['Display'] = df2['Display'].replace(' inches', '', regex=True)

#Исправление встроенной памяти на числа
df2['Inbuilt_memory'] = df2['Inbuilt_memory'].replace(' GB inbuilt', '', regex=True)
df2['Inbuilt_memory'] = df2['Inbuilt_memory'].replace('TB inbuilt', '024', regex=True)
df2['Inbuilt_memory'] = df2['Inbuilt_memory'].replace(' ', '', regex=True)
[   0    1    2 ... 1367 1368 1369]
['Samsung Galaxy F14 5G' 'Samsung Galaxy A11' 'Samsung Galaxy A13' ...
 'TCL 50 XE NxtPaper 5G' 'TCL 40 NxtPaper 5G' 'TCL Trifold']
[4.65 4.2  4.3  4.1  4.4  4.05 4.5  4.25 4.75 4.15 4.35 4.45 4.6  4.
 4.55 4.7  3.95 3.75 3.9  3.85]
[68 63 75 73 69 76 71 85 78 72 74 79 80 62 81 82 87 86 88 84 83 89 91 90
 96 93 92 95 65 59 42 67 60 61 54 66 70 51 64 53 77 94 98 97 58 57 49 46
 56 55]
['Dual Sim, 3G, 4G, 5G, VoLTE, ' 'Dual Sim, 3G, 4G, VoLTE, '
 'Dual Sim, 3G, 4G, 5G, VoLTE, Vo5G, ' 'Single Sim, 3G, 4G, 5G, VoLTE, '
 'Dual Sim, 3G, 4G, ' 'Single Sim, 3G, 4G, VoLTE, ' 'No Sim Supported, '
 'Single Sim, 3G, 4G, 5G, VoLTE, Vo5G, ' 'Dual Sim, 3G, VoLTE, ']
['4 GB RAM' '2 GB RAM' '6 GB RAM' '8 GB RAM' '12 GB RAM' '1 GB RAM'
 '3 GB RAM' '16 GB RAM' 'Helio G90T' '24 GB RAM' '18 GB RAM' '1.5 GB RAM'
 '128 GB inbuilt' '6000 mAh Battery with 22.5W Fast Charging'
 '256 GB inbuilt' '512 GB inbuilt']
['6000 mAh Battery ' '4000 mAh Battery ' '5000 mAh Battery '
 '6000 mAh Battery' '3500 mAh Battery' '4500 mAh Battery '
 '3400 mAh Battery ' '3300 mAh Battery ' '4050 mAh Battery '
 '3900 mAh Battery ' '4300 mAh Battery ' '4800 mAh Battery '
 '4200 mAh Battery ' '3700 mAh Battery ' '4400 mAh Battery '
 '3500 mAh Battery ' '4320 mAh Battery ' '4030 mAh Battery'
 '1900 mAh Battery' '5000 mAh Battery' '2650 mAh Battery'
 '3000 mAh Battery' '4600 mAh Battery ' '4100 mAh Battery '
 '5500 mAh Battery ' '4830 mAh Battery ' '4700 mAh Battery '
 '4810 mAh Battery ' '5100 mAh Battery ' '5400 mAh Battery '
 '4870 mAh Battery ' '5700 mAh Battery ' '4730 mAh Battery '
 '5100 mAh Battery' '6 GB RAM, 64 GB inbuilt' '5200 mAh Battery '
 '5240 mAh Battery ' '5050 mAh Battery ' '4310 mAh Battery '
 '4350 mAh Battery ' '4880 mAh Battery ' '4520 mAh Battery '
 '4260 mAh Battery ' '4820 mAh Battery ' '4805 mAh Battery '
 '5160 mAh Battery ' '5080 mAh Battery ' '5065 mAh Battery '
 '10500 mAh Battery ' '5200 mAh Battery' '5800 mAh Battery '
 '5300 mAh Battery ' '5450 mAh Battery ' '5600 mAh Battery '
 '3000 mAh Battery ' '2800 mAh Battery ' '4620 mAh Battery '
 '4385 mAh Battery ' '4410 mAh Battery ' '4355 mAh Battery '
 '4492 mAh Battery ' '4575 mAh Battery ' '5003 mAh Battery '
 '4821 mAh Battery ' '4000 mAh Battery' '7000 mAh Battery '
 '3900 mAh Battery' '3760 mAh Battery ' '2600 mAh Battery'
 '4900 mAh Battery ' '4020 mAh Battery ' '4450 mAh Battery '
 '4610 mAh Battery ' '3800 mAh Battery ' '3440 mAh Battery '
 '2510 mAh Battery ' '6100 mAh Battery ' '2100 mAh Battery'
 '4030 mAh Battery ' '5020 mAh Battery ' '4980 mAh Battery '
 '4250 mAh Battery ' '6.75 inches, 720 x 1600 px Display '
 '4460 mAh Battery ' '4815 mAh Battery ' '4750 mAh Battery '
 '5330 mAh Battery ' '5010 mAh Battery ' '4500 mAh Battery']
['6.6 inches' '6.4 inches' '6.5 inches' '6.1 inches' '6.7 inches'
 '6.21 inches' '6.67 inches' '6.58 inches' '6.71 inches' '6.78 inches'
 '6.8 inches' '6.56 inches' '6.3 inches' '7.45 inches' '6.2 inches'
 '8.2 inches' '7.6 inches' '8 inches' '7.63 inches' '6.22 inches'
 '4.5 inches' '6.51 inches' '6.53 inches' '6.35 inches' '6.55 inches'
 '6.64 inches' '5.2 inches' '5.5 inches' '6.72 inches' '6.44 inches'
 '6.82 inches' '6.68 inches' '7 inches' '6.74 inches' '8.03 inches'
 '8.02 inches' '7.8 inches' '6.52 inches' '6.59 inches' '6.43 inches'
 '4300 mAh Battery with 30W Fast Charging' '6.62 inches' '6.57 inches'
 '6.73 inches' '6.83 inches' '7.1 inches' '7.4 inches' '7.56 inches'
 '7.82 inches' '6.38 inches' '6.79 inches' '6.61 inches' '6.69 inches'
 '12.1 inches' '6.77 inches' '6.75 inches' '6.81 inches' '7.2 inches'
 '7.71 inches' '7.92 inches' '6.76 inches' '7.9 inches' '5.6 inches'
 '5.7 inches' '6.34 inches' '6.14 inches' '6.03 inches' '8.3 inches'
 '5.9 inches' '5.92 inches' '6 inches' '6.26 inches' '6.09 inches'
 '5.99 inches' '6.92 inches' '5 inches' '6.45 inches' '6.9 inches'
 '6.47 inches' '6.28 inches' '6.49 inches' '6.08 inches' '7.85 inches'
 '7.11 inches' '6.95 inches'
 '48 MP + 5 MP + 2 MP Triple Rear &amp; 8 MP Front Camera' '6.94 inches'
 '7.09 inches' '10 inches']
['50 MP + 2 MP Dual Rear &amp; 13 MP Front Camera'
 '13 MP + 5 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '50 MP Quad Rear &amp; 8 MP Front Camera'
 '48 MP Quad Rear &amp; 13 MP Front Camera'
 '13 MP + 2 MP + 2 MP Triple Rear &amp; 5 MP Front Camera'
 '50 MP + 2 MP Dual Rear &amp; 5 MP Front Camera'
 '48 MP + 8 MP + 5 MP Triple Rear &amp; 20 MP Front Camera'
 '48 MP Quad Rear &amp; 8 MP Front Camera'
 '50 MP + 2 MP + 2 MP Triple Rear &amp; 13 MP Front Camera'
 '50 MP + 5 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '50 MP + 8 MP + 2 MP Triple Rear &amp; 13 MP Front Camera'
 '50 MP + 8 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '48 MP + 8 MP + 5 MP Triple Rear &amp; 25 MP Front Camera'
 '50 MP + 13 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '64 MP Quad Rear &amp; 20 MP Front Camera'
 '64 MP + 8 MP + 5 MP Triple Rear &amp; 32 MP Front Camera'
 '13 MP + 2 MP Dual Rear &amp; 16 MP Front Camera'
 '50 MP + 2 MP Dual Rear &amp; 16 MP Front Camera'
 '50 MP + 5 MP + 2 MP Triple Rear &amp; 13 MP Front Camera'
 '64 MP + 8 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '12 MP + 12 MP + 8 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 8 MP + 5 MP Triple Rear &amp; 13 MP Front Camera'
 '48 MP Quad Rear &amp; 32 MP Front Camera'
 '64 MP Quad Rear &amp; 32 MP Front Camera'
 '50 MP + 8 MP + 2 MP Triple Rear &amp; 50 MP Front Camera'
 '64 MP + 12 MP + 5 MP Triple Rear &amp; 10 MP Front Camera'
 '24 MP + 10 MP + 5 MP Triple Rear &amp; 24 MP Front Camera'
 '50 MP + 12 MP + 5 MP Triple Rear &amp; 32 MP Front Camera'
 'Foldable Display, Dual Display'
 '108 MP + 8 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 8 MP Dual Rear &amp; 13 MP Front Camera'
 '50 MP + 12 MP + 8 MP Triple Rear &amp; 10 MP Front Camera'
 '108 MP Quad Rear &amp; 32 MP Front Camera'
 '50 MP + 12 MP + 10 MP Triple Rear &amp; 12 MP Front Camera'
 '12 MP Quad Rear &amp; 10 MP Front Camera'
 '64 MP + 12 MP + 12 MP Triple Rear &amp; 10 MP Front Camera'
 '48 MP + 12 MP + 5 MP Triple Rear &amp; 16 MP Front Camera'
 '25 MP + 8 MP Dual Rear &amp; 13 MP Front Camera'
 '50 MP + 12 MP + 12 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 12 MP + 10 MP Triple Rear &amp; 10 MP Front Camera'
 '48 MP + 8 MP + 5 MP Triple Rear &amp; 32 MP Front Camera'
 '108 MP Quad Rear &amp; 12 MP + 8 MP Dual Front Camera'
 '12 MP + 12 MP Dual Rear &amp; 8 MP Front Camera'
 '200 MP Quad Rear &amp; 12 MP Front Camera'
 '108 MP Quad Rear &amp; 40 MP Front Camera'
 '13 MP + 0.08 MP Dual Rear &amp; 5 MP Front Camera'
 '13 MP + 2 MP Dual Rear &amp; 8 MP Front Camera'
 '5 MP Rear &amp; 2 MP Front Camera' '8 MP Rear &amp; 5 MP Front Camera'
 '13 MP Rear &amp; 5 MP Front Camera'
 '50 MP + 0.08 MP Dual Rear &amp; 8 MP Front Camera'
 '13 MP + 2 MP Dual Rear &amp; 5 MP Front Camera'
 '16 MP + 8 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '13 MP + 2 MP Dual Rear &amp; 13 MP Front Camera'
 '50 MP + 2 MP Dual Rear &amp; 8 MP Front Camera'
 '13 MP + 8 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '13 MP + 2 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '50 MP + 2 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '13 MP Rear &amp; 16 MP Front Camera'
 '16 MP + 8 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '64 MP + 2 MP Dual Rear &amp; 16 MP Front Camera'
 '50 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 8 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '64 MP + 2 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 8 MP Dual Rear &amp; 50 MP Front Camera'
 '108 MP + 8 MP + 2 MP Triple Rear &amp; 50 MP + 8 MP Dual Front Camera'
 '64 MP + 8 MP + 2 MP Triple Rear &amp; 44 MP Front Camera'
 '50 MP + 13 MP + 2 MP Triple Rear &amp; 50 MP Front Camera'
 '64 MP + 8 MP + 2 MP Triple Rear &amp; 44 MP + 8 MP Dual Front Camera'
 '64 MP + 8 MP + 2 MP Triple Rear &amp; 50 MP Front Camera'
 '50 MP + 8 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 50 MP Dual Rear &amp; 50 MP Front Camera'
 '64 MP + 8 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '64 MP + 2 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 50 MP + 50 MP Triple Rear &amp; 50 MP Front Camera'
 '108 MP + 64 MP + 50 MP Triple Rear &amp; 50 MP Front Camera'
 '50 MP + 13 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '108 MP + 8 MP + 2 MP Triple Rear &amp; 44 MP + 8 MP Dual Front Camera'
 '50 MP + 12 MP + 8 MP Triple Rear &amp; 50 MP Front Camera'
 '64 MP + 50 MP + 50 MP Triple Rear &amp; 50 MP Front Camera'
 '200 MP + 8 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 13 MP + 8 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 13 MP + 13 MP Triple Rear &amp; 32 MP Front Camera'
 '200 MP + 64 MP + 50 MP Triple Rear &amp; 50 MP Front Camera'
 '50 MP + 12 MP + 12 MP Triple Rear &amp; 32 MP Front Camera'
 '64 MP + 50 MP + 50 MP Triple Rear &amp; 32 MP Front Camera'
 '108 MP + 8 MP + 2 MP Triple Rear &amp; 50 MP Front Camera'
 '50 MP Quad Rear &amp; 50 MP Front Camera'
 '50 MP Quad Rear &amp; 32 MP Front Camera'
 '50 MP + 50 MP + 50 MP Triple Rear &amp; 32 MP Front Camera'
 '108 MP + 32 MP + 12 MP Triple Rear &amp; 32 MP Front Camera'
 '50.3 MP + 50 MP + 50 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP Quad Rear &amp; 16 MP Front Camera'
 '50 MP + 50 MP + 12 MP Triple Rear &amp; 32 MP Front Camera'
 '200 MP + 50 MP + 50 MP Triple Rear &amp; 50 MP Front Camera'
 '200 MP + 50 MP + 50 MP Triple Rear &amp; 32 MP Front Camera'
 '200 MP Quad Rear &amp; 60 MP Front Camera'
 '50.3 MP Quad Rear &amp; 32 MP Front Camera'
 '12 MP Quad Rear &amp; 13 MP Front Camera'
 '50 MP + Depth Sensor Dual Rear &amp; 8 MP Front Camera'
 '50 MP + 2 MP + 0.3 MP Triple Rear &amp; 8 MP Front Camera'
 '50 MP + 0.08 MP Dual Rear &amp; 5 MP Front Camera'
 '50 MP + 0.3 MP Dual Rear &amp; 5 MP Front Camera'
 '50 MP + 2 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '64 MP + 2 MP Dual Rear &amp; 8 MP Front Camera'
 '48 MP + 2 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '13 MP Quad Rear &amp; 8 MP Front Camera'
 '108 MP + 2 MP Dual Rear &amp; 8 MP Front Camera'
 '50 MP Rear &amp; 8 MP Front Camera'
 '48 MP + 8 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '64 MP Quad Rear &amp; 16 MP Front Camera'
 '108 MP + 2 MP Dual Rear Camera'
 '13 MP + Depth Sensor Dual Rear &amp; 5 MP Front Camera'
 '13 MP + 0.3 MP Dual Rear &amp; 5 MP Front Camera'
 '48 MP + 2 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '13 MP + 8 MP Dual Rear &amp; 5 MP Front Camera'
 '6.5 inches, 1080 x 2400 px, 90 Hz Display with Punch Hole'
 '108 MP + 2 MP Dual Rear &amp; 16 MP Front Camera'
 '50 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '108 MP + 8 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 8 MP Dual Rear &amp; 32 MP Front Camera'
 '108 MP Quad Rear &amp; 16 MP Front Camera'
 '64 MP + 5 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '64 MP Quad Rear &amp; 32 MP + 8 MP Dual Front Camera'
 '50 MP + 50 MP + 32 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 32 MP + 8 MP Triple Rear &amp; 16 MP Front Camera'
 '64 MP + 50 MP + 8 MP Triple Rear &amp; 32 MP Front Camera'
 '64 MP + 13 MP + 13 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 50 MP + 8 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 50 MP + 3 MP Triple Rear &amp; 32 MP Front Camera'
 '200 MP + 64 MP + 32 MP Triple Rear &amp; 32 MP Front Camera'
 '200 MP + 64 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 50 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 2 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 48 MP + 32 MP Triple Rear &amp; 32 MP Front Camera'
 '108 MP + 13 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '100 MP + 2 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '48 MP Quad Rear &amp; 16 MP Front Camera'
 '16 MP Quad Rear &amp; 16 MP Front Camera'
 '64 MP + 32 MP + 8 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 32 MP + 8 MP Triple Rear &amp; 32 MP Front Camera'
 '108 MP + 2 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 50 MP + 32 MP Triple Rear &amp; 50 MP Front Camera'
 '108 MP + 5 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 32 MP + 32 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 2 MP + Ultra Wide Triple Rear &amp; 32 MP Front Camera'
 '48 MP + 13 MP + 12 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 50 MP + 13 MP Triple Rear &amp; 32 MP Front Camera'
 'Dual Display'
 '48 MP + 48 MP + 13 MP Triple Rear &amp; 32 MP Front Camera'
 '64 MP + 2 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '64 MP + 12 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 8 MP Dual Rear &amp; 16 MP Front Camera'
 '48 MP + 13 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '108 MP + 13 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '64 MP + 8 MP Dual Rear &amp; 32 MP Front Camera'
 '64 MP + 13 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 50 MP Dual Rear &amp; 16 MP Front Camera'
 '50 MP + 13 MP + 13 MP Triple Rear &amp; 16 MP Front Camera'
 '48 MP + 13 MP + 13 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 13 MP + 8 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 50 MP + 12 MP Triple Rear &amp; 16 MP Front Camera'
 '64 MP + 50 MP + 50 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 50 MP + 14.6 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 50 MP + 13 MP Triple Rear &amp; 16 MP Front Camera'
 '108 MP + 50 MP + 32 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 50 MP + 16 MP Triple Rear &amp; 16 MP Front Camera'
 '200 MP + 50 MP + 50 MP Triple Rear &amp; 60 MP Front Camera'
 '8 MP + 0.08 MP Dual Rear &amp; 5 MP Front Camera'
 '50 MP Dual Rear &amp; 5 MP Front Camera'
 '8 MP Dual Rear &amp; 5 MP Front Camera'
 '50 MP Dual Rear &amp; 8 MP Front Camera'
 '13 MP Rear &amp; 8 MP Front Camera'
 '50 MP Dual Rear &amp; 13 MP Front Camera'
 '64 MP + 8 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '48 MP + 8 MP + 2 MP Triple Rear &amp; 13 MP Front Camera'
 '64 MP Quad Rear &amp; 13 MP Front Camera'
 '64 MP Quad Rear &amp; 20 MP + 2 MP Dual Front Camera'
 '64 MP + 8 MP + 2 MP Triple Rear &amp; 20 MP Front Camera'
 '64 MP + 8 MP + 5 MP Triple Rear &amp; 16 MP Front Camera'
 '8 MP Rear &amp; 8 MP Front Camera'
 '50 MP + 8 MP + 5 MP Triple Rear &amp; 32 MP Front Camera'
 '48 MP + 2 MP + Depth Sensor Triple Rear &amp; 8 MP Front Camera'
 '50 MP + 2 MP + 2 MP Triple Rear &amp; 5 MP Front Camera'
 '108 MP + 2 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '108 MP + 5 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '100 MP + 5 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 13 MP Dual Rear &amp; 16 MP Front Camera'
 '108 MP + 5 MP + 2 MP Triple Rear &amp; 50 MP Front Camera'
 '50 MP + 12 MP Dual Rear &amp; 50 MP Front Camera'
 '50 MP + 12 MP Dual Rear &amp; 16 MP Front Camera'
 '64 MP + 5 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '200 MP + 12 MP + 2 MP Triple Rear &amp; 50 MP Front Camera'
 '54 MP + 50 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '160 MP + 8 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 32 MP + 12 MP Triple Rear &amp; 50 MP + 2 MP Dual Front Camera'
 '54 MP + 8 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '108 MP + 5 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '54 MP + 50 MP + 8 MP Triple Rear &amp; 50 MP Front Camera'
 '160 MP + 50 MP + 2 MP Triple Rear &amp; 50 MP + 2 MP Dual Front Camera'
 '108 MP + 32 MP + 12 MP Triple Rear &amp; 50 MP + 2 MP Dual Front Camera'
 '40 MP + 12 MP + 8 MP Triple Rear &amp; 32 MP + 8 MP Dual Front Camera'
 '50 MP + 16 MP + 8 MP Triple Rear &amp; 32 MP + 8 MP Dual Front Camera'
 '200 MP + 50 MP + 8 MP Triple Rear &amp; 50 MP Front Camera'
 '200 MP + 32 MP + 12 MP Triple Rear &amp; 50 MP + 2 MP Dual Front Camera'
 '180 MP + 50 MP + 50 MP Triple Rear &amp; 50 MP Dual Front Camera'
 '50 MP Quad Rear &amp; 12 MP + TOF 3D Dual Front Camera'
 '54 MP Quad Rear &amp; 12 MP Front Camera'
 '50 MP Quad Rear &amp; 12 MP Dual Front Camera'
 '50 MP Penta Rear &amp; 12 MP + Depth Sensor Dual Front Camera'
 '50 MP Quad Rear &amp; 13 MP Dual Front Camera'
 '50 MP + 50 MP Dual Rear &amp; 32 MP Front Camera'
 '64 MP + 50 MP Dual Rear &amp; 32 MP Front Camera'
 '64 MP + 50 MP + 32 MP Triple Rear &amp; 32 MP Front Camera'
 '12.2 MP Rear &amp; 8 MP Front Camera'
 '16 MP + 12.2 MP Dual Rear &amp; 8 MP + TOF 3D Dual Front Camera'
 '16 MP + 12.2 MP Dual Rear &amp; 8 MP Front Camera'
 '64 MP + 13 MP Dual Rear &amp; 13 MP Front Camera'
 '12.2 MP + 12 MP Dual Rear &amp; 8 MP Front Camera'
 '50 MP + 12 MP Dual Rear &amp; 10.8 MP Front Camera'
 '108 MP + 13 MP Dual Rear &amp; 13 MP Front Camera'
 '50 MP + 8 MP Dual Rear &amp; 12 MP Front Camera'
 '50 MP + 48 MP + 12 MP Triple Rear &amp; 10.8 MP Front Camera'
 '50 MP + 12 MP Dual Rear &amp; 10.5 MP Front Camera'
 '16 MP + 16 MP + 12 MP Triple Rear &amp; 16 MP Front Camera'
 '64 MP + 48 MP + 12 MP Triple Rear &amp; 10.8 MP Front Camera'
 '50 MP + 48 MP + 48 MP Triple Rear &amp; 10.5 MP Front Camera'
 '50 MP + 48 MP + 12 MP Triple Rear &amp; 12 MP Front Camera'
 '8 MP + 2 MP + 0.3 MP Triple Rear &amp; 8 MP Front Camera'
 '13 MP Dual Rear &amp; 8 MP Front Camera'
 '50 MP + 12 MP + 5 MP Triple Rear &amp; 12 MP Front Camera'
 '64 MP + 13 MP + 5 MP Triple Rear &amp; 24 MP Front Camera'
 '50 MP + 12 MP Dual Rear &amp; 12 MP Front Camera'
 '50 MP + 13 MP Dual Rear &amp; 32 MP Front Camera'
 '50 MP + 13 MP + 5 MP Triple Rear &amp; 12 MP Front Camera'
 '50 MP + 13 MP + 5 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 32 MP + 13 MP Triple Rear &amp; 32 MP Front Camera'
 '108 MP + 13 MP + 5 MP Triple Rear &amp; 12 MP Front Camera'
 '48 MP + 8 MP + 5 MP Triple Rear &amp; 16 MP Front Camera'
 '13 MP + 5 MP Dual Rear &amp; 8 MP Front Camera'
 '16 MP + 2 MP Dual Rear &amp; 8 MP Front Camera'
 '64 MP + 13 MP Dual Rear &amp; 16 MP Front Camera'
 '64 MP + 16 MP Dual Rear &amp; 44 MP Front Camera'
 '64 MP + 16 MP Dual Rear &amp; 20 MP Front Camera'
 '16 MP Rear &amp; 13 MP Front Camera'
 '13 MP Dual Rear &amp; 5 MP Front Camera'
 '16 MP + 5 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '48 MP + 2 MP Dual Rear &amp; 5 MP Front Camera'
 '64 MP Quad Rear &amp; 50 MP Front Camera'
 '64 MP + 13 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 5 MP + 2 MP Triple Rear &amp; 50 MP Front Camera'
 '48 MP + 8 MP + 5 MP Triple Rear &amp; 13 MP Front Camera'
 '64 MP + 12 MP + 5 MP Triple Rear &amp; 32 MP Front Camera'
 '200 MP + 12 MP + 12 MP Triple Rear &amp; 60 MP Front Camera'
 '108 MP + 12 MP + 12 MP Triple Rear &amp; 12 MP Front Camera'
 '13 MP + 8 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '108 MP + 2 MP Dual Rear &amp; 32 MP Front Camera'
 '64 MP + 8 MP Dual Rear &amp; 50 MP Front Camera'
 '50 MP + 50 MP + 12 MP Triple Rear &amp; 50 MP Front Camera'
 '100 MP + 2 MP Dual Rear &amp; 16 MP Front Camera'
 '50 MP + 50 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '64 MP + 50 MP + 3 MP Triple Rear &amp; 32 MP Front Camera'
 '16 MP Rear &amp; 5 MP Front Camera'
 '16 MP + 5 MP Dual Rear &amp; 12 MP Front Camera'
 '50 MP + Macro Dual Rear &amp; 8 MP Front Camera'
 '48 MP + 2 MP Dual Rear &amp; 8 MP Front Camera'
 '50 MP Rear &amp; 5 MP Front Camera'
 '16 MP + 2 MP + 2 MP Triple Rear &amp; 5 MP Front Camera'
 '16 MP + 2 MP Dual Rear &amp; 5 MP Front Camera'
 '16 MP + 2 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '64 MP + 13 MP Dual Rear &amp; 32 MP Front Camera'
 '50 MP + 5 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '108 MP + 13 MP Dual Rear &amp; 32 MP Front Camera'
 '108 MP + 16 MP + 8 MP Triple Rear &amp; 32 MP Front Camera'
 '48 MP + 8 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 13 MP + 10 MP Triple Rear &amp; 50 MP Front Camera'
 '50 MP + 50 MP + 2 MP Triple Rear &amp; 60 MP Front Camera'
 '50 MP + 50 MP + 12 MP Triple Rear &amp; 60 MP Front Camera'
 '108 MP + 13 MP + 5 MP Triple Rear &amp; 32 MP Front Camera'
 '108 MP + 16 MP + 8 MP Triple Rear &amp; 25 MP Front Camera'
 '50 MP + 13 MP + 2 MP Triple Rear &amp; 32 MP + 16 MP Dual Front Camera'
 '200 MP + 50 MP + 12 MP Triple Rear &amp; 60 MP Front Camera'
 '50 MP + 50 MP + 2 MP Triple Rear &amp; 60 MP + 60 MP Triple Front Camera'
 '64 MP + 16 MP + 2 MP Triple Rear &amp; 16 MP + 8 MP Dual Front Camera'
 '50 MP + 50 MP + 50 MP Triple Rear &amp; 60 MP Front Camera'
 '100 MP + 50 MP + 50 MP Triple Rear &amp; 50 MP Front Camera'
 '200 MP + 50 MP + 2 MP Triple Rear &amp; 60 MP Front Camera'
 '108 MP + 2 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '13 MP + 2 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '48 MP + 16 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '48 MP + 2 MP Dual Rear &amp; 16 MP Front Camera'
 '50 MP + 16 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '48 MP + 16 MP + 12 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 48 MP + 8 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 48 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 48 MP + 32 MP Triple Rear &amp; 16 MP Front Camera'
 '64 MP + 50 MP + 48 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 13 MP + 5 MP Triple Rear &amp; 16 MP Front Camera'
 '108 MP + 50 MP + 48 MP Triple Rear &amp; 32 MP Front Camera'
 '200 MP + 50 MP + 48 MP Triple Rear &amp; 32 MP Front Camera'
 '48 MP + 16 MP + 8 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 2 MP + 0.08 MP Triple Rear &amp; 8 MP Front Camera'
 '8 MP + Depth Sensor Dual Rear &amp; 5 MP Front Camera'
 '50 MP + Depth Sensor Dual Rear &amp; 5 MP Front Camera'
 '13 MP Rear Camera' '50 MP Quad Rear &amp; 13 MP Front Camera'
 '48 MP + 8 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 8 MP Dual Rear &amp; 20 MP Front Camera'
 '200 MP + 8 MP + 2 MP Triple Rear &amp; 16 MP Front Camera'
 '64 MP + 8 MP + 5 MP Triple Rear &amp; 20 MP Front Camera'
 'Foldable Display' '50 MP + 8 MP Dual Rear &amp; 60 MP Front Camera'
 'Memory Card (Hybrid)' '50 MP + 2 MP Triple Rear &amp; 5 MP Front Camera'
 '100 MP + 8 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '48 MP + 5 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '50 MP + 8 MP + 2 MP Triple Rear &amp; 60 MP Front Camera'
 '108 MP + 8 MP Dual Rear &amp; 60 MP + 8 MP Dual Front Camera'
 '50 MP + 8 MP Dual Rear &amp; 60 MP + 8 MP Dual Front Camera'
 '50 MP + 8 MP + 2 MP Triple Rear &amp; 60 MP + 8 MP Dual Front Camera'
 '50 MP + 13 MP Dual Rear &amp; 13 MP Front Camera'
 '48 MP + 13 MP + 12 MP Triple Rear &amp; 13 MP Front Camera'
 '50 MP + 13 MP + 12 MP Triple Rear &amp; 13 MP Front Camera'
 '50 MP + 50 MP + 40 MP Triple Rear &amp; 13 MP Front Camera'
 '50 MP + 48 MP + 12.5 MP Triple Rear &amp; 13 MP Front Camera'
 '48 MP + 48 MP + 13 MP Triple Rear &amp; 13 MP Front Camera'
 '50 MP + 50 MP + 50 MP Triple Rear &amp; 16 MP Dual Front Camera'
 '40 MP Quad Rear &amp; 32 MP Dual Front Camera'
 '50 MP + 48 MP + 12 MP Triple Rear &amp; 13 MP Dual Front Camera'
 '64 MP + 50 MP + 13 MP Triple Rear &amp; 13 MP Front Camera'
 '50 MP + 32 MP + 12 MP Triple Rear &amp; 13 MP Front Camera'
 '48 MP + 48 MP + 40 MP Triple Rear &amp; 13 MP Front Camera'
 '50 MP + 20 MP + 12 MP Triple Rear &amp; 13 MP Dual Front Camera'
 '50 MP Penta Rear &amp; 13 MP Dual Front Camera'
 '50 MP Quad Rear &amp; 32 MP Dual Front Camera'
 '108 MP + 13 MP + 12 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + Depth Sensor Triple Rear &amp; 5 MP Front Camera'
 '100 MP + 2 MP Dual Rear &amp; 8 MP Front Camera'
 '108 MP + 0.08 MP Dual Rear &amp; 8 MP Front Camera'
 '50 MP Dual Rear &amp; 16 MP Front Camera'
 '50 MP + 0.08 MP Dual Rear &amp; 32 MP Front Camera'
 '13 MP Triple Rear &amp; 5 MP Front Camera'
 '48 MP + 0.08 MP Dual Rear &amp; 16 MP Front Camera'
 '50 MP Triple Rear &amp; 8 MP Front Camera'
 '13 MP + 2 MP Triple Rear &amp; 8 MP Front Camera'
 '50 MP + 5 MP Dual Rear &amp; 8 MP Front Camera'
 '50 MP + 5 MP + 2 MP Triple Rear &amp; 32 MP Front Camera']
['Memory Card Supported, upto 1 TB' 'Memory Card Supported, upto 512 GB'
 'Memory Card Supported' 'Memory Card (Hybrid), upto 1 TB'
 'Memory Card Not Supported' 'Memory Card (Hybrid)'
 '12 MP + 12 MP Dual Rear &amp; 10 MP Front Camera' 'Android v13'
 'Android v10' 'Android v12' 'Memory Card (Hybrid), upto 512 GB'
 '50 MP + 12 MP + 5 MP Triple Rear &amp; 10 MP + 4 MP Dual Front Camera'
 '200 MP Quad Rear &amp; 12 MP + 12 MP Dual Front Camera'
 '50 MP + 12 MP + 10 MP Triple Rear &amp; 10 MP + 4 MP Dual Front Camera'
 '50 MP + 12 MP + 10 MP Triple Rear &amp; 12 MP + 12 MP Dual Front Camera'
 'Memory Card Supported, upto 256 GB' 'Memory Card Supported, upto 128 GB'
 'Android v11' 'Android v15' 'Android v14'
 '50 MP + 12 MP Dual Rear &amp; 32 MP Front Camera'
 '50 MP + 50 MP + 50 MP Triple Rear &amp; 32 MP + 32 MP Dual Front Camera'
 '200 MP + 12 MP + 12 MP Triple Rear &amp; 32 MP + 32 MP Dual Front Camera'
 '50 MP Quad Rear &amp; 16 MP Front Camera'
 '64 MP + 50 MP + 50 MP Triple Rear &amp; 32 MP + 32 MP Dual Front Camera'
 '50 MP Quad Rear &amp; 16 MP + 16 MP Dual Front Camera'
 '48 MP + 48 MP + 10 MP Triple Rear &amp; 16 MP Front Camera'
 '200 MP + 12 MP Dual Rear &amp; 32 MP Front Camera'
 '50 MP + 12 MP + 12 MP Triple Rear &amp; 16 MP + 16 MP Dual Front Camera'
 '64 MP + 12 MP + 12 MP Triple Rear &amp; 32 MP Front Camera'
 'Memory Card Supported, upto 2 TB' 'Memory Card (Hybrid), upto 2 TB'
 '48 MP Quad Rear &amp; 16 MP Front Camera'
 '50 MP + 48 MP + 32 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 8 MP Dual Rear &amp; 32 MP Front Camera'
 '50 MP + 48 MP + 32 MP Triple Rear &amp; 32 MP + 32 MP Dual Front Camera'
 '108 MP + 50 MP Dual Rear &amp; 32 MP Front Camera'
 '64 MP + 10 MP + 8 MP Triple Rear &amp; 32 MP Front Camera'
 '64 MP + 16 MP + 12 MP Triple Rear &amp; 16 MP Front Camera'
 '108 MP + 50 MP + 32 MP Triple Rear &amp; 32 MP + 32 MP Dual Front Camera'
 '64 MP + 48 MP + 48 MP Triple Rear &amp; 32 MP + 20 MP Dual Front Camera'
 'Memory Card (Hybrid), upto 256 GB'
 '50 MP + 12 MP Dual Rear &amp; 8 MP Front Camera'
 '50 MP + 20 MP + 12 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 32 MP + 8 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 32 MP + 10 MP Triple Rear &amp; 16 MP Front Camera'
 '50 MP + 50 MP + 20 MP Triple Rear &amp; 16 MP Front Camera'
 '54 MP + 50 MP + 8 MP Triple Rear &amp; 16 MP Front Camera'
 '108 MP + 8 MP + 5 MP Triple Rear &amp; 16 MP Front Camera'
 'Android v9.0 (Pie)' '48 MP + 12 MP Dual Rear &amp; 10 MP Front Camera'
 '48 MP + 10.8 MP + 10.8 MP Triple Rear &amp; 9.5 MP + 8 MP Dual Front Camera'
 '50 MP + 10.8 MP + 10.8 MP Triple Rear &amp; 12 MP + 12 MP Dual Front Camera'
 'Memory Card Supported, upto 32 GB'
 '64 MP + 13 MP + 8 MP Triple Rear &amp; 32 MP Front Camera'
 '50 MP + 13 MP + 5 MP Triple Rear &amp; 12 MP Front Camera'
 '64 MP + 13 MP + 0.3 MP Triple Rear &amp; 10 MP Front Camera'
 '50 MP + 50 MP Dual Rear &amp; 16 MP Front Camera'
 '64 MP + 13 MP Dual Rear &amp; 32 MP Front Camera' 'Android v10.0'
 '64 MP + 13 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '13 MP + 12 MP Dual Rear &amp; 32 MP Front Camera'
 '50 MP + 50 MP Dual Rear &amp; 32 MP Front Camera'
 '50 MP + 13 MP Dual Rear &amp; 32 MP Front Camera'
 '50 MP + 13 MP + 2 MP Triple Rear &amp; 32 MP Front Camera'
 '16 MP Rear &amp; 5 MP Front Camera' 'Android v12.1' 'No FM Radio'
 '50 MP + 50 MP + 13 MP Triple Rear &amp; 32 MP + 16 MP Dual Front Camera'
 '50 MP + 50 MP + 32 MP Triple Rear &amp; 32 MP + 32 MP Dual Front Camera'
 '50 MP Hexa Rear &amp; 32 MP Front Camera' 'Android' 'HarmonyOS v4'
 'EMUI v14' 'HarmonyOS v3.0' 'HarmonyOS' 'HarmonyOS v4.0' 'HarmonyOS v5.0'
 'HarmonyOS v2.0'
 '48 MP + 20 MP + 13 MP Triple Rear &amp; 10.7 MP Front Camera'
 'HarmonyOS v4.2' 'HarmonyOS v5'
 '50 MP Quad Rear &amp; 10.7 MP Front Camera'
 '50 MP + 13 MP Dual Rear &amp; 12 MP Front Camera'
 '50 MP + 48 MP + 8 MP Triple Rear &amp; 32 MP Front Camera']
['13' '10' '12' '11' '15' '10.0' '9.0 (Pie)' '14' nan '7.1.1 (Nougat)'
 '8.0 (Oreo)' '8.1 (Oreo)' '5.1 (Lollipop)' '6.0 (Marshmallow)' '9 (Pie)'
 '3' '2' '4.0' '3.0 (Honeycomb)' '2.0' '3.0' '3.1' '5.0' '4.1']
['9,999' '9,990' '11,999' '11,990' '11,599' '12,298' '14,999' '14,990'
 '14,949' '19,999' '19,990' '19,799' '19,499' '18,999' '18,990' '20,999'
 '29,999' '28,990' '30,500' '30,999' '39,999' '39,990' '38,900' '37,999'
 '41,289' '41,790' '42,990' '42,999' '49,999' '49,990' '49,000' '47,990'
 '44,999' '44,990' '51,999' '54,990' '54,999' '59,999' '57,990' '64,999'
 '65,690' '69,990' '69,999' '70,000' '1,99,990' '1,84,999' '1,79,990'
 '1,77,999' '1,64,999' '1,59,999' '1,54,999' '1,39,999' '1,30,376'
 '1,29,999' '6,990' '6,999' '7,499' '7,999' '8,033' '8,199' '8,490'
 '9,499' '10,199' '10,499' '11,899' '11,580' '11,490' '11,390' '10,999'
 '12,350' '12,490' '15,050' '29,990' '29,799' '30,739' '31,398' '31,990'
 '38,990' '38,799' '37,990' '40,990' '49,940' '48,990' '46,990' '45,990'
 '45,210' '50,999' '56,990' '58,990' '62,990' '63,999' '64,990' '65,490'
 '71,990' '74,899' '76,990' '79,999' '80,990' '1,39,990' '1,18,990'
 '1,15,990' '1,13,990' '1,10,990' '1,09,990' '1,07,990' '1,06,990'
 '99,990' '94,999' '89,999' '89,990' '82,990' '6,950' '7,199' '7,450'
 '7,480' '7,790' '7,815' '7,850' '7,919' '7,920' '7,945' '7,950' '7,980'
 '9,893' '9,820' '10,299' '10,390' '11,910' '11,749' '11,499' '12,251'
 '14,844' '14,499' '13,999' '15,299' '15,329' '15,749' '15,990' '19,783'
 '20,499' '20,500' '20,599' '30,049' '29,996' '28,979' '28,339' '31,089'
 '38,999' '36,999' '36,990' '35,999' '34,999' '34,990' '33,999' '33,990'
 '15,499' '20,699' '20,990' '28,900' '30,200' '30,900' '35,990' '45,999'
 '47,999' '49,499' '50,990' '78,990' '79,990' '84,990' '84,999' '94,990'
 '1,34,999' '1,29,990' '1,19,900' '1,14,990' '10,990' '12,899' '12,990'
 '13,499' '13,990' '15,999' '17,990' '17,999' '21,838' '22,486' '22,990'
 '22,999' '28,999' '26,990' '25,999' '25,990' '30,990' '32,990' '43,990'
 '52,652' '52,999' '57,999' '72,990' '76,429' '7,299' '7,580' '7,890'
 '7,972' '7,990' '8,499' '8,689' '8,990' '8,999' '9,799' '9,690' '9,249'
 '10,330' '10,880' '11,539' '12,194' '12,999' '13,267' '13,290' '13,490'
 '14,899' '14,950' '15,590' '16,999' '17,945' '19,490' '21,990' '21,999'
 '24,499' '24,990' '25,890' '26,499' '27,990' '27,999' '27,199' '31,999'
 '55,990' '56,999' '66,499' '67,990' '77,990' '1,02,999' '1,87,990'
 '1,24,999' '1,04,999' '1,03,999' '23,999' '40,299' '40,999' '32,999'
 '43,999' '46,999' '59,990' '62,999' '74,990' '1,01,999' '1,08,999'
 '1,25,990' '1,46,990' '1,59,990' '7,190' '7,309' '7,394' '63,990'
 '70,990' '71,999' '72,999' '74,999' '1,09,900' '82,999' '81,990' '7,124'
 '7,290' '9,099' '7,599' '9,490' '7,899' '8,899' '8,690' '11,110' '11,450'
 '11,000' '10,631' '10,900' '10,490' '12,332' '13,429' '13,599' '14,199'
 '15,982' '16,990' '17,900' '17,499' '24,999' '22,863' '27,899' '26,690'
 '25,171' '21,499' '21,390' '26,899' '22,492' '36,880' '33,779' '32,883'
 '33,499' '35,499' '41,740' '1,24,990' '89,748' '99,999' '81,999'
 '1,05,999' '1,03,000' '8,980' '8,489' '8,660' '12,749' '13,950' '16,499'
 '16,299' '17,995' '15,190' '23,499' '25,299' '21,490' '20,198' '30,799'
 '36,199' '31,899' '45,215' '68,899' '63,490' '8,349' '7,820' '8,890'
 '9,478' '9,764' '9,489' '8,744' '9,800' '11,049' '10,190' '10,466'
 '10,750' '10,899' '12,877' '13,374' '12,499' '12,900' '13,489' '15,323'
 '18,708' '16,485' '18,398' '18,577' '16,400' '16,949' '17,949' '16,998'
 '17,789' '16,500' '21,828' '27,875' '21,477' '23,880' '23,900' '20,615'
 '23,649' '29,004' '22,799' '26,999' '24,150' '33,900' '52,990' '1,04,990'
 '7,998' '7,090' '14,989' '18,928' '23,990' '41,990' '88,990' '1,49,999'
 '20,000' '16,899' '18,879' '16,134' '24,454' '20,065' '22,592' '26,674'
 '22,499' '35,609' '39,888' '42,437' '43,889' '40,108' '47,998' '43,299'
 '58,699' '55,999' '63,359' '7,699' '9,190' '7,900' '7,689' '9,998'
 '11,159' '11,350' '10,269' '11,489' '11,425' '10,949' '12,120' '12,239'
 '12,428' '15,898' '18,377' '20,075' '17,975' '16,890' '18,390' '18,499'
 '22,297' '28,517' '24,329' '20,048' '26,479' '24,890' '24,449' '36,898'
 '44,949' '69,899' '53,990' '83,999' '93,990' '2,14,990' '1,34,990'
 '1,21,999' '1,91,999' '92,990' '25,499' '7,319' '10,749' '10,489' '8,799'
 '8,346' '7,949' '1,19,990']
['Samsung' 'Vivo' 'Realme' 'OPPO' 'Oppo' 'iQOO' 'IQOO' 'Poco' 'POCO'
 'Honor' 'Nothing' 'Google' 'itel' 'Itel' 'Asus' 'LG' 'Lenovo' 'Gionee'
 'Motorola' 'OnePlus' 'Xiaomi' 'Tecno' 'Huawei' 'Lava' 'Coolpad' 'TCL']
[' 128 GB inbuilt' ' 32 GB inbuilt' ' 64 GB inbuilt' ' 256 GB inbuilt'
 ' 1 TB inbuilt' ' 512 GB inbuilt' ' 16 GB inbuilt' ' Octa Core'
 ' 258 GB inbuilt' ' 8 GB inbuilt' nan]
[' 25W Fast Charging' ' 15W Fast Charging' nan ' 18W Fast Charging'
 ' 30W Fast Charging' ' Fast Charging' ' 45W Fast Charging'
 ' 33W Fast Charging' ' 67W Fast Charging' ' 80W Fast Charging'
 ' 10W Fast Charging' ' 44W Fast Charging' ' 66W Fast Charging'
 ' 100W Fast Charging' ' 120W Fast Charging' ' 150W Fast Charging'
 ' 55W Fast Charging' ' 200W Fast Charging' ' 65W Fast Charging'
 ' 60W Fast Charging' ' 20W Fast Charging' ' 50W Fast Charging'
 ' 57W Fast Charging' ' 240W Fast Charging' ' 125W Fast Charging'
 ' 68W Fast Charging' ' 250W Fast Charging' ' 27W Fast Charging'
 ' 35W Fast Charging' ' 22.5W Fast Charging' ' 40W Fast Charging'
 ' 90W Fast Charging' ' 08W Fast Charging' ' 68.2W Fast Charging'
 ' 135W Fast Charging' ' 70W Fast Charging' ' Water Drop Notch'
 ' 88W Fast Charging' ' 7.5W Fast Charging']
[' 2408 x 1080 px Display with Water Drop Notch'
 ' 720 x 1560 px Display with Punch Hole'
 ' 1080 x 2408 px Display with Water Drop Notch' ' 720 x 1600 px'
 ' 720 x 1600 px Display with Water Drop Notch'
 ' 1080 x 2340 px Display with Water Drop Notch'
 ' 720 x 1560 px Display with Water Drop Notch' ' 1080 x 2408 px'
 ' 1080 x 2400 px Display with Water Drop Notch' ' 1080 x 2340 px'
 ' 1080 x 2400 px' ' 720 x 1520 px Display with Water Drop Notch'
 ' 1080 x 2400 px Display with Punch Hole' ' 1440 x 3200 px'
 ' 1080 x 2340 px Display with Punch Hole' ' 1080 x 2640 px'
 ' 1080 x 2412 px' ' 1440 x 3040 px Display with Punch Hole'
 ' 1080 x 2400 px Display' ' 1080 x 2460 px Display with Punch Hole'
 ' 1440 x 3040 px Display' ' 1440 x 2960 px Display' ' 1812 x 2176 px'
 ' 1440 x 3120 px' ' 1440 x 3080 px' ' 720 x 1612 px'
 ' 480 x 854 px Display' ' 720 x 1544 px Display with Water Drop Notch'
 ' 720 x 1612 px Display with Water Drop Notch' ' 1600 x 720 px'
 ' 1080 x 2388 px Display with Water Drop Notch' ' 720 x 1280 px Display'
 ' 1612 x 720 px' ' 1080 x 2376 px' ' 1800 x 3200 px'
 ' 1080 x 2400 px Display with Small Notch' ' 1080 x 2388 px'
 ' 1260 x 2800 px' ' 1260 x 2712 px' ' 1080 x 2256 px Display'
 ' 1080 x 2520 px' ' 2200 x 2480 px' ' 1916 x 2160 px' ' 1768 x 2208 px'
 ' 1600 x 720 px Display with Water Drop Notch' ' 720 x 1604 px'
 ' 1080 x 2460 px' ' 720 x 1600 px Display with Punch Hole' nan
 ' 1264 x 2780 px' ' 1240 x 2772 px'
 ' 1440 x 3200 px Display with Punch Hole' ' 2400 x 1080 px'
 ' 1864 x 3820 px' ' 1440 x 3216 px' ' 1080 x 2732 px' ' 1440 x 3168 px'
 ' 1200 x 2400 px' ' 1792 x 1920 px' ' 1800 x 3400 px'
 ' 1440 x 3200 px Display' ' 2268 x 2440 px'
 ' 1080 x 2388 px Display with Punch Hole' ' 1800 x 3440 px'
 ' 720 x 1650 px' ' 720 x 1650 px Display with Water Drop Notch'
 ' 720 x 1680 px Display with Water Drop Notch' ' 720 x 1680 px'
 ' 1220 x 2712 px' ' 1600 x 2560 px' ' 1080 x 2404 px' ' 1220 x 3200 px'
 ' 1200 x 2400 px Display with Water Drop Notch' ' 1220 x 2652 px'
 ' 1080 x 2412 px Display with Small Notch' ' 1200 x 2664 px'
 ' 1224 x 2700 px' ' 1200 x 2652 px'
 ' 1080 x 2400 px Display with Dual Punch Hole' ' 1264 x 2800 px'
 ' 1280 x 2800 px' ' 2016 x 2348 px' ' 1312 x 2848 px' ' 2156 x 2344 px'
 ' 1224 x 2688 px' ' 1344 x 2772 px' ' 1984 x 2272 px'
 ' 2200 x 2480 px Display' ' 1084 x 2412 px' ' 1084 x 2728 px'
 ' 1080 x 2220 px Display' ' 1080 x 2280 px Display' ' 1344 x 2992 px'
 ' 1940 x 3120 px' ' 1840 x 2208 px'
 ' 1600 x 720 px Display with Punch Hole' ' 720 x 1640 px'
 ' 1080 x 2448 px' ' 2340 x 1080 px'
 ' 1080 x 2460 px Display with Water Drop Notch' ' 1080 x 1920 px Display'
 ' 720 x 1440 px Display' ' 720 x 1600 px Display with Large Notch'
 ' 1080 x 2400 px Display with Large Notch' ' 540 x 960 px Display'
 ' 1440 x 3088 px' ' 1080 x 2408 px Display with Punch Hole'
 ' Full HD+ Display with Punch Hole'
 ' 1080 x 2246 px Display with Large Notch' ' 2460 x 1080 px'
 ' 1080 x 1920 px' ' 720 x 1612 px Display with Punch Hole'
 ' 1200 x 2780 px' ' 876 x 2142 px Display with Large Notch'
 ' 1440 x 2780 px' ' 1440 x 3412 px' ' 1440 x 3120 px Display'
 ' 576 x 1440 px Display' ' 720 x 1650 px Display with Punch Hole'
 ' 1080 x 2280 px Display with Water Drop Notch' ' 1080 x 2480 px'
 ' 2000 x 2296 px' ' 1596 x 2296 px Display' ' 1080 x 2160 px'
 ' 1224 x 2776 px' ' 1220 x 2700 px' ' 1260 x 2844 px' ' 1212 x 2616 px'
 ' 1256 x 2760 px' ' 1176 x 2400 px Display with Large Notch'
 ' 1860 x 3220 px' ' 1216 x 2688 px' ' 1260 x 2720 px'
 ' 1344 x 2772 px Display' ' 1200 x 2640 px' ' 1136 x 2690 px'
 ' 1188 x 2790 px' ' 1080 x 2388 px Display'
 ' 1080 x 2412 px Display with Punch Hole' ' 540 x 1092 px Display'
 ' 480 x 960 px Display' ' 720 x 1640 px Display with Water Drop Notch']
[' Octa Core Processor' ' 1.8 GHz Processor' ' 2 GHz Processor'
 ' Octa Core' nan ' Quad Core' ' Nine-Cores' ' Nine Core' ' Nine Cores'
 ' Deca Core Processor' ' 1.3 GHz Processor' ' 1.6 GHz Processor'
 ' 2.3 GHz Processor' ' Deca Core' ' 128 GB inbuilt']
['Exynos 1330' 'Octa Core' 'Helio G88' 'Helio P35' 'Dimensity 700'
 'Exynos 9611' 'Exynos  850' 'Exynos 1280' 'Snapdragon 695' 'Exynos 850'
 'Helio P65' 'Octa Core Processor' 'Snapdragon 680' 'Helio G80'
 'Samsung Exynos 7884' 'Dimensity 6100 Plus' 'Dimensity 700 5G'
 'Snapdragon  680' 'Snapdragon 888' 'Exynos 1380' 'Snapdragon 865'
 'Exynos 980' 'Snapdragon 730' 'Snapdragon 675' 'Snapdragon 7 Gen1'
 'Snapdragon 750G' 'Snapdragon 855+' 'Snapdragon 870' 'Snapdragon 710'
 'Exynos 1480' 'Snapdragon  720G ' 'Snapdragon 778g' 'Exynos 2200'
 'Snapdragon 7+ Gen2' 'Snapdragon 8 Gen 2' 'Exynos 9825'
 'Snapdragon 7s Gen2' 'Exynos 2100' 'Dimensity 1300' 'Snapdragon 778G+'
 'Snapdragon 778G' 'Exynos 2300' 'Snapdragon 8+ Gen1' 'Snapdragon 8 Gen3'
 'Snapdragon  8+ Gen1' 'Snapdragon  8 Gen1' 'Exynos 990' 'Snapdragon 855'
 'Exynos 8895' 'Exynos  2100' 'Exynos 9810' 'Snapdragon 8 Gen2'
 'Helio G85' 'Helio P22' 'Helio MT6580' 'Snapdragon  439 ' 'Helio'
 'Snapdragon  675' 'Snapdragon 450' 'Dimensity 6020' 'Helio  P22'
 'Helio G70' 'Snapdragon 680 ' 'Snapdragon 460' 'Snapdragon 430'
 'Helio  P70  ' 'Snapdragon MSM8937' 'Snapdragon 6 Gen1'
 'Snapdragon 7 Gen2' 'Dimensity 7200' 'Snapdragon 4 Gen2' 'Snapdragon 685'
 'Helio G99' 'Dimensity 1200' 'Dimensity 800U ' 'Snapdragon'
 'Snapdragon 765G ' 'Dimensity 8200' 'Snapdragon 7 Gen3' 'Snapdragon 782G'
 'Dimensity 9300' 'Dimensity 9200' 'Dimensity 1100' 'Dimensity  8200'
 'Dimensity 9000 Plus' 'Dimensity 8300' 'Dimensity 9300 Plus'
 'Dimensity  9200 Plus' 'Snapdragon  888+' 'Dimensity  9000'
 'Dimensity 9400' 'Snapdragon 888 ' 'Snapdragon 8 Gen1' 'Unisoc SC9863A'
 'Helio G35' 'Tiger T612' 'Unisoc T610' 'SC9863A' 'Unisoc  SC9863A'
 'Snapdragon  665' 'Unisoc T612' 'Tiger  T616' 'Tiger  T610' 'Helio G96'
 'Helio G36' 'Snapdragon 662' 'Helio  G35' 'Dimensity 6300' 'Helio G85 '
 'Helio  G95' 'Helio G95' 'Dimensity 810 5G' 'Dimensity  810 5G' 'No Wifi'
 'Dimensity 7025' 'Dimensity  700 5G' 'Snapdragon 712' 'Dimensity 7050'
 'Snapdragon 720G ' 'Snapdragon  7 Gen1' 'Snapdragon 7+ Gen3'
 'Snapdragon  695' 'Dimensity  8100' 'Snapdragon  778G' 'Dimensity 1000+'
 'Snapdragon 7s Gen3' 'Dimensity 6080' 'Snapdragon  888 '
 'Snapdragon 8s Gen3' 'Snapdragon 8 Gen4' 'Snapdragon 8 Gen1 Plus'
 'Dimensity 7020' 'Snapdragon  730G' 'Snapdragon 480' 'Snapdragon 662 '
 'Dimensity 800U' 'Snapdragon  765G ' 'Dimensity 900'
 'Dimensity  1200 Max' 'Dimensity 8100 Max' 'Dimensity 8100-Max'
 'Dimensity 9200 Plus' 'Snapdragon 765G' 'Snapdragon  865 '
 'Dimensity 9000' 'Snapdragon  4 Gen 1' 'Snapdragon  695 '
 'Snapdragon 480+' 'Snapdragon 6 Gen 1' 'Snapdragon  778G Plus'
 'Snapdragon  870' 'Helio  G85' 'Helio A22' 'Helio G25' 'Helio G37'
 'Helio G91' 'Snapdragon 720G' 'Snapdragon 665' 'Snapdragon  732G'
 'Snapdragon 695 ' 'Dimensity 920' 'Snapdragon 7s Gen 2'
 'Dimensity 8300 Ultra' 'Dimensity 8100' 'Snapdragon  480+'
 'Dimensity 7030' 'Dimensity  1100'
 'Snapdragon 7 Gen 1 Accelerated Edition' 'Dimensity 8000' 'Exynos 1080'
 'Snapdragon 8 Gen 1' 'Dimensity 7200 Pro' 'Snapdragon 778G Plus'
 'Qualcomm Snapdragon 670' 'Tensor G2' 'Google  Tensor' 'Google Tensor G2'
 'Tensor G3' 'Google Tensor 4' 'Google  Tensor G2' 'Google Tensor G4'
 'Google Tensor 2' 'Quad Core' 'Unisoc T606' 'Unisoc T603' ' Unisoc T606'
 'Snapdragon  8 Gen1 Plus' 'Snapdragon 865+' 'Snapdragon  765G'
 'Snapdragon  865' 'Helio P25' 'Qualcomm Snapdragon 450' 'Helio P60'
 'Tiger T610' 'Tiger T310' 'Unisoc  SC9836A' 'Snapdragon  439'
 'Unisoc  T606' 'Helio MT6737T' 'Snapdragon  450 ' 'Exynos 1280 ' 'Exynos'
 'Snapdragon  750G' 'Exynos  1280' 'Dimensity 1080' 'Exynos 2400'
 'Snapdragon  480 ' 'Helio P35 ' 'Snapdragon 4 Gen1' 'Dimensity  900'
 'Tiger T616' 'Tiger T606' 'Snapdragon 636' 'Helio  G37' 'Helio  G99'
 'Snapdragon SM4375' 'Dimensity 8020' 'Snapdragon  7+ Gen2'
 'Snapdragon  778G ' 'Snapdragon 888+ ' 'Snapdragon  750G '
 'Snapdragon 888+' ' Dimensity 7030' 'Snapdragon  6 Gen 1'
 'Dimensity 1050' 'Snapdragon 8+ Gen2' 'Dimensity 930' 'Snapdragon (4 nm)'
 'Snapdragon 460 ' 'Snapdragon  782G' 'Snapdragon 695 5G' 'Snapdragon 690'
 'Dimensity  1300' 'Snapdragon  855+' 'Dimensity  1200 AI'
 'Snapdragon  8 Gen4' 'Snapdragon  8 Gen2' 'Helio  G25' 'Unisoc SC9832E'
 'Snapdragon 4 Gen 1' 'Snapdragon  712' 'Dimensity 700 '
 'Snapdragon  662 ' 'Helio  G96' 'Snapdragon 732G' 'Snapdragon 732G '
 'Snapdragon 678' 'Dimensity 8200 Ultra ' 'Dimensity 7200 Ultra'
 'Dimensity  920 5G' 'Helio G99 Ultra' 'Dimensity (4 nm)' 'Dimensity 8050'
 'Kirin 710A' 'Kirin  710A' 'Snapdragon (6 nm)' 'Snapdragon 778G 4G'
 '4 GB RAM' 'Sanpdragon 680' 'Kirin  710F' 'Kirin 830' 'Kirin 9000S'
 'Kirin' 'Snapdragon 8+ Gen 1' 'Kirin 9010' 'Snapdragon 8+ Gen 1 '
 'Kirin  990' 'Kirin 9000E' 'Kirin  9000' 'Kirin 990' ' Helio G36'
 'Snapdragon  888' 'Tiger   T616' 'Tiger  T616 ' 'Helio  A22' 'Helio A25']
In [305]:
# Проверка количества запятых в каждой строке
df2['comma_count'] = df2['Price'].apply(lambda x: x.count(','))
# Удаление строк, где больше одной запятой
df2 = df2[df2['comma_count'] <= 1]
# Удаление вспомогательного столбца
df2 = df2.drop(columns=['comma_count'])
df2['Price'] = df2['Price'].replace(',', '.', regex=True)


df2['Price'] = pd.to_numeric(df2['Price'], errors='coerce')

По boxplotам видно, что данные о телефонах смещены в сторону недорогих телефонов до 40 долларов с экранами до 7 дюймов и встроенной памятью до 256 Гб.

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

In [306]:
df2['Ram'] = pd.to_numeric(df2['Ram'])
df2['Battery'] = pd.to_numeric(df2['Battery'])
df2['Display'] = pd.to_numeric(df2['Display'])
df2['Inbuilt_memory'] = pd.to_numeric(df2['Inbuilt_memory'])

numeric_cols = df2[['Ram', 'Battery', 'Display', 'Inbuilt_memory', 'Price']].columns

numeric_cols = [col for col in numeric_cols]

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

for i, col in enumerate(numeric_cols, 1):
    if col == 'id':
        continue
    Q1 = df2[col].quantile(0.25)
    Q3 = df2[col].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    outliers = df2[col][(df2[col] < lower_bound) | (df2[col] > upper_bound)]
    print(f"Выбросы в столбце '{col}':\n{outliers}\n")
    plt.subplot(len(numeric_cols) // 3 + 1, 3, i) 
    plt.boxplot(x=df2[col])
    plt.title(f'Boxplot for {col}')

plt.tight_layout()
plt.show()
Выбросы в столбце 'Ram':
1        2.0
39      12.0
49      12.0
54      12.0
65      12.0
        ... 
1312    12.0
1344     2.0
1346     2.0
1348     2.0
1351     2.0
Name: Ram, Length: 267, dtype: float64

Выбросы в столбце 'Battery':
0       6000
1       4000
3       6000
6       6000
9       6000
        ... 
1344    3000
1346    3000
1349    3000
1350    3000
1364    4000
Name: Battery, Length: 296, dtype: int64

Выбросы в столбце 'Display':
15       6.10
21       6.21
53       6.10
64       6.10
65       6.10
72       7.45
74       6.20
75       6.20
91       4.50
122      5.20
125      5.50
197      8.03
208      7.80
391      7.10
393      7.10
538     12.10
571      7.20
597      7.71
600      7.92
606      7.80
627      7.80
628      5.60
629      5.70
631      6.10
632      6.14
635      6.10
636      6.03
637      6.10
639      6.20
640      6.20
641      6.20
643      6.10
662      5.90
663      5.90
665      5.92
669      6.00
687      6.09
688      5.20
689      6.09
690      5.99
701      6.20
715      5.70
719      5.00
779      6.10
789      6.20
797      6.20
923      8.00
938      6.20
1142     5.00
1158     6.08
1226     7.85
1227     7.85
1228     7.90
1229     7.11
1316     7.09
1344     6.00
1346     6.00
1349     6.00
1350     6.10
Name: Display, dtype: float64

Выбросы в столбце 'Inbuilt_memory':
178      512
212      512
299      512
315      512
325     1024
329      512
372      512
448      512
454      512
525      512
532      512
548      512
573      512
598      512
599      512
604      512
605      512
623      512
664      512
670      512
673      512
674      512
675      512
677      512
679      512
699      512
794      512
855      512
1012     512
1031     512
1034     512
1038     512
1041     512
1051     512
1115     512
1123     512
1218     512
1226     512
1227     512
1276     512
Name: Inbuilt_memory, dtype: int64

Выбросы в столбце 'Price':
196     79.999
197     80.990
206     99.990
207     99.990
208     99.990
         ...  
1280    79.990
1281    99.990
1288    82.990
1290    92.990
1291    79.990
Name: Price, Length: 67, dtype: float64

No description has been provided for this image

Просачивания данных нет, т.к. никакой столбец не коррелирует с целевым признаком более, чем на 0,7

In [307]:
#Проверка кореляции
price_col = 'Price'  # Имя столбца с ценой
for col1 in numeric_cols:
    if col1 != price_col:
        correlation = df2[col1].corr(df2[price_col])
        if abs(correlation) > 0.7:
            print(f"Просачивание данных: Высокая корреляция ({correlation:.2f}) между столбцами '{col1}' и '{price_col}'")

Пропущенные значения есть в 3-х столбцах. Для этих столбцов возможно только задать какое-то константное значение, например "Unknown"

In [308]:
# Проверка наличия пропущенных значений
columns_with_nulls = []
for col in df2.columns:
  if df2[col].isnull().sum() > 0:  
    columns_with_nulls.append(col)
print(f"Столбцы с null: {columns_with_nulls}")

# Замена значений null на "Unknown" в столбцах с пропусками
for col in columns_with_nulls:
    df2[col].fillna("Unknown", inplace=True)
Столбцы с null: ['Android_version', 'fast_charging', 'Processor']
C:\Users\ujijrujijr\AppData\Local\Temp\ipykernel_10056\2788500696.py:10: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.
The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.

For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.


  df2[col].fillna("Unknown", inplace=True)

РАЗБИЕНИЕ НА ВЫБОРКИ

Обучающая выборка сбалансрована, т.к. график идёт достаточно ровно и нет "перекоса" количества телефонов в каком-то диапазоне цен. Поэтому аугментация данных не требуется

In [309]:
data=df2[['Ram', 'Battery', 'Display','Price', 'Inbuilt_memory']].copy()
data['Price'] = pd.to_numeric(data['Price'], errors='coerce')
# сначала разделение записей на 80% и 20%, где 80% - обучающая выборка
train_data, temp_data = train_test_split(data, test_size=0.2, random_state=42)

# потом разделение остальных 20% поровну на контрольную и тестовую выборки
val_data, test_data = train_test_split(temp_data, test_size=0.5, random_state=42)

# Проверка размеров выборок
print("Размер обучающей выборки:", len(train_data))
print("Размер контрольной выборки:", len(val_data))
print("Размер тестовой выборки:", len(test_data))


sort_train_data=train_data.sort_values(by='Price')['Price'].values
plt.figure(figsize=(10, 5))
plt.plot(sort_train_data)
plt.title('Отсортированные цены в обучающей выборке')
Размер обучающей выборки: 1035
Размер контрольной выборки: 129
Размер тестовой выборки: 130
Out[309]:
Text(0.5, 1.0, 'Отсортированные цены в обучающей выборке')
No description has been provided for this image

ДАТАСЕТ 3

https://www.kaggle.com/datasets/shivam2503/diamonds

Проблемная оласть: цены на бриллианты

Объект наблюдения: бриллиант

Атрибуты:

  • carat: Вес в каратах
  • cut: Качество огранки
  • color: Цвет
  • clarity: Чистота
  • depth: Процент глубины
  • table: Процент ширины
  • price: Цена в долларах
  • x: Длина в миллиметрах
  • y: Ширина в миллиметрах
  • z: Глубина в миллиметрах

Объект только 1, но в нём есть связь между ценой и всеми остальными характеристиками (чем лучше какая-либо характеристика, тем дороже бриллиант)

Бизнес-цель: Предсказать оптимальную стоимость бриллианта на основе его характеристик. Эффект для бизнеса: ювелиры смогут предлагать конкурентоспособные цены, что потенциально увеличить прибыль.

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

In [290]:
df3 = pd.read_csv("..//static//csv//diamonds.csv")
print(df3.columns)
Index(['Unnamed: 0', 'carat', 'cut', 'color', 'clarity', 'depth', 'table',
       'price', 'x', 'y', 'z'],
      dtype='object')

Оценка всех числовых признаков показывает, что в датасете довольно много шума. В большинстве своём он полезные, т.к. бриллианты могут иметь абсолютно разные значения характеристик, и их важно учитывать. Однако есть одиночные выбросы, из-за которых модель может некорректно обучиться. Это данные, у которых значение:

  • по параметру table больше 90
  • по параметру x около 0
  • по параметру y значение более 30 и около 0
  • по параметру z значение более 30

Имеет смысл удалить данные выбросы.

Большинство данных смещено в следующую сторону:

  • меньше 3 карат
  • по проценту глубины между 50 и 70
  • по проценту ширины между 50 и 60
  • по длине между 4 и 9 мм
  • по ширине между 5 и 10 мм
  • по глубине между 2 и 5 мм
In [291]:
numeric_cols = df3.select_dtypes(include=['number']).columns

#все столбцы, кроме Unnamed (с индексом)
numeric_cols = [col for col in numeric_cols if 'Unnamed' not in col]

# столбец 'id' также исключен
numeric_cols = [col for col in numeric_cols if col != 'id']

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

for i, col in enumerate(numeric_cols, 1):
    if col == 'id':
        continue
    Q1 = df3[col].quantile(0.25)
    Q3 = df3[col].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    outliers = df3[col][(df3[col] < lower_bound) | (df3[col] > upper_bound)]
    plt.subplot(len(numeric_cols) // 3 + 1, 3, i) 
    plt.boxplot(x=df3[col])
    plt.title(f'Boxplot for {col}')

plt.tight_layout()
plt.show()
No description has been provided for this image

По числовым данным видно, что цена имеет прямую зависимость от веса и размеров бриллианта. Такая корреляции между столбцами carat, x, y, z и price является естественной и ожидаемой, так как чем больше бриллиант, тем он дороже

In [292]:
#Проверка кореляции

price_col = 'price'  # Имя столбца с ценой
for col1 in numeric_cols:
    if col1 != price_col:
        correlation = df3[col1].corr(df3[price_col])
        if abs(correlation) > 0.7:
            print(f"Просачивание данных: Высокая корреляция ({correlation:.2f}) между столбцами '{col1}' и '{price_col}'")
Просачивание данных: Высокая корреляция (0.92) между столбцами 'carat' и 'price'
Просачивание данных: Высокая корреляция (0.88) между столбцами 'x' и 'price'
Просачивание данных: Высокая корреляция (0.87) между столбцами 'y' и 'price'
Просачивание данных: Высокая корреляция (0.86) между столбцами 'z' и 'price'

Набор данных информативный, т.к. содержит основные характеристики бриллиантов, которые влияют на их цену

Степень покрытия высокая, т.к. содержатся сведения о более 50000 бриллиантах

Все метки согласованы, но 'depth' и 'x', 'y', 'z' могли быть названы немного подробнее

In [293]:
print(f"Количество записей: {df3.shape[0]}")
Количество записей: 53940

Столбцов со значениями null нет, поэтому решать проблему пропущенных данных не надо

In [294]:
columns_with_nulls = []
for col in df3.columns:
  if df3[col].isnull().sum() > 0:  
    columns_with_nulls.append(col)
print(f"Столбцы с null: {columns_with_nulls}")
Столбцы с null: []

РАЗБИЕНИЕ НА ВЫБОРКИ

train_data - обучающая выборка

val_data - контрольная выборка

test_data - тестовая выборка

Обучающая выборка сбалансрована, т.к. график идёт достаточно ровно и нет "перекоса" количества бриллиантов в каком-то диапазоне цен. Поэтому аугментация данных не требуется

In [295]:
#приведение категориальных данных в числовые
print(df3['cut'].unique())
cut_mapping = {'Fair': 1, 
               'Good': 2, 
               'Very Good': 3, 
               'Premium': 4, 
               'Ideal': 5}
df3['cut'] = df3['cut'].map(cut_mapping)

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


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



data=df3.copy()


# сначала разделение записей на 80% и 20%, где 80% - обучающая выборка
train_data, temp_data = train_test_split(data, test_size=0.2, random_state=42)

# потом разделение остальных 20% поровну на контрольную и тестовую выборки
val_data, test_data = train_test_split(temp_data, test_size=0.5, random_state=42)

# Проверка размеров выборок
print("Размер обучающей выборки:", len(train_data))
print("Размер контрольной выборки:", len(val_data))
print("Размер тестовой выборки:", len(test_data))


sort_train_data=train_data.sort_values(by='price')['price'].values
plt.figure(figsize=(10, 5))
plt.plot(sort_train_data)
plt.title('Отсортированные цены в обучающей выборке')
['Ideal' 'Premium' 'Good' 'Very Good' 'Fair']
['E' 'I' 'J' 'H' 'F' 'G' 'D']
['SI2' 'SI1' 'VS1' 'VS2' 'VVS2' 'VVS1' 'I1' 'IF']
Размер обучающей выборки: 43152
Размер контрольной выборки: 5394
Размер тестовой выборки: 5394
Out[295]:
Text(0.5, 1.0, 'Отсортированные цены в обучающей выборке')
No description has been provided for this image