684 KiB
Начало лабораторной работы¶
Цены на автомобили¶
import pandas as pd
df = pd.read_csv("..//static//csv//car_price_prediction.csv")
print(df.columns)
Проблемная область: Данные о ценах на автомобили, включая их характеристики
Объект наблюдения: автомобиль
Атрибуты: идентификатор, цена, налог, производитель, модель, год производства, категория, наличие кожаного салона, тип топлива, объем двигателя, пробег автомобиля, количество цилиндров в двигателе, тип коробки передач, тип привода, количество дверей, расположение руля, цвет, количество подушек безопасностей.
Пример бизнес-цели:
- Анализ данных: Изучение и очистка данных для выявления закономерностей и корреляций между характеристиками автомобилей и их ценами.
- Разработка модели: Создание и обучение модели машинного обучения, которая будет прогнозировать цены на автомобили на основе их характеристик.
- Внедрение: Интеграция модели в систему ценообразования компании для автоматического расчета цен на автомобили.
Актуальность: Данный датасет является актуальным и ценным ресурсом для компаний, занимающихся продажей автомобилей, а также для исследователей и инвесторов, поскольку он предоставляет обширную информацию о ценах и характеристиках автомобилей на вторичном рынке. Эти данные могут быть использованы для разработки моделей прогнозирования цен, анализа рыночных тенденций и принятия обоснованных бизнес-решений.
import pandas as pd
import matplotlib.pyplot as plt
# Загрузка данных
df = pd.read_csv("..//static//csv//car_price_prediction.csv")
plt.figure(figsize=(10, 6))
plt.scatter(df['Prod. year'], df['Price'])
plt.xlabel('Prod. year')
plt.ylabel('Price')
plt.title('Scatter Plot of Prod. year vs Price')
plt.show()
При проверке на шум можно заметить выброс в 2000 году. Цена там запредельная.
Для удаления выбросов из датасета можно использовать метод межквартильного размаха. Зашумленность не очень высокая. Покрытие данных высокое и подошло бы для поставленной задачи по актуальности.
import pandas as pd
import matplotlib.pyplot as plt
# Загрузка данных
df = pd.read_csv("..//static//csv//car_price_prediction.csv")
# Выбор столбцов для анализа
column1 = 'Prod. year'
column2 = 'Price'
# Функция для удаления выбросов
def remove_outliers(df, column):
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
return df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]
# Удаление выбросов для каждого столбца
df_cleaned = df.copy()
for column in [column1, column2]:
df_cleaned = remove_outliers(df_cleaned, column)
# Построение точечной диаграммы после удаления выбросов
plt.figure(figsize=(10, 6))
plt.scatter(df_cleaned[column1], df_cleaned[column2], alpha=0.5)
plt.xlabel(column1)
plt.ylabel(column2)
plt.title(f'Scatter Plot of {column1} vs {column2} (After Removing Outliers)')
plt.show()
# Вывод количества строк до и после удаления выбросов
print(f"Количество строк до удаления выбросов: {len(df)}")
print(f"Количество строк после удаления выбросов: {len(df_cleaned)}")
Теперь очистим датасет от пустых строк
import pandas as pd
# Загрузка данных
df = pd.read_csv("..//static//csv//car_price_prediction.csv")
# Вывод общей информации о датасете
print("Общая информация о датасете:")
print(df.info())
# Вывод таблицы анализа пропущенных значений
missing_values = df.isnull().sum()
missing_values_percentage = (missing_values / len(df)) * 100
missing_data = pd.concat([missing_values, missing_values_percentage], axis=1, keys=['Количество пропущенных значений', 'Процент пропущенных значений'])
print("\nТаблица анализа пропущенных значений:")
print(missing_data)
Пустых строк не было обнаружено.
Теперь создадим выборки.
import pandas as pd
from sklearn.model_selection import train_test_split
# Загрузка данных
df = pd.read_csv("..//static//csv//car_price_prediction.csv")
# Выбор признаков и целевой переменной
X = df.drop('Price', axis=1) # Признаки (все столбцы, кроме 'Price')
y = df['Price'] # Целевая переменная ('Price')
# Разбиение данных на обучающую и оставшуюся часть (контрольную + тестовую)
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42)
# Разбиение оставшейся части на контрольную и тестовую выборки
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
# Вывод размеров выборок
print(f"Размер обучающей выборки: {X_train.shape[0]}")
print(f"Размер контрольной выборки: {X_val.shape[0]}")
print(f"Размер тестовой выборки: {X_test.shape[0]}")
Проанализируем сбалансированность выборок
import pandas as pd
from sklearn.model_selection import train_test_split
# Загрузка данных
df = pd.read_csv("..//static//csv//car_price_prediction.csv")
# Выбор признаков и целевой переменной
X = df.drop('Price', axis=1) # Признаки (все столбцы, кроме 'Price')
y = df['Price'] # Целевая переменная ('Price')
# Разбиение данных на обучающую и оставшуюся часть (контрольную + тестовую)
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42)
# Разбиение оставшейся части на контрольную и тестовую выборки
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
# Функция для анализа распределения и вывода результатов
def analyze_distribution(data, title):
print(f"Распределение Price в {title}:")
distribution = data.value_counts().sort_index()
print(distribution)
total = len(data)
positive_count = (data > 0).sum()
negative_count = (data < 0).sum()
positive_percent = (positive_count / total) * 100
negative_percent = (negative_count / total) * 100
print(f"Процент положительных значений: {positive_percent:.2f}%")
print(f"Процент отрицательных значений: {negative_percent:.2f}%")
print("\nНеобходима аугментация данных для балансировки классов.\n")
# Анализ распределения для каждой выборки
analyze_distribution(y_train, "обучающей выборке")
analyze_distribution(y_val, "контрольной выборке")
analyze_distribution(y_test, "тестовой выборке")
Выборки не сбалансированы, и для улучшения качества модели рекомендуется провести аугментацию данных.
import pandas as pd
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import RandomOverSampler
# Загрузка данных
df = pd.read_csv("..//static//csv//car_price_prediction.csv")
# Выбор признаков и целевой переменной
X = df.drop('Price', axis=1) # Признаки (все столбцы, кроме 'Price')
y = df['Price'] # Целевая переменная ('Price')
# Разбиение данных на обучающую и оставшуюся часть (контрольную + тестовую)
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42)
# Разбиение оставшейся части на контрольную и тестовую выборки
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
# Применение oversampling к обучающей выборке
oversampler = RandomOverSampler(random_state=42)
X_train_resampled, y_train_resampled = oversampler.fit_resample(X_train, y_train)
# Функция для анализа распределения и вывода результатов
def analyze_distribution(data, title):
print(f"Распределение Price в {title}:")
distribution = data.value_counts().sort_index()
print(distribution)
total = len(data)
positive_count = (data > 0).sum()
negative_count = (data < 0).sum()
positive_percent = (positive_count / total) * 100
negative_percent = (negative_count / total) * 100
print(f"Процент положительных значений: {positive_percent:.2f}%")
print(f"Процент отрицательных значений: {negative_percent:.2f}%")
# Анализ распределения для каждой выборки
analyze_distribution(y_train_resampled, "обучающей выборке после oversampling")
analyze_distribution(y_val, "контрольной выборке")
analyze_distribution(y_test, "тестовой выборке")
Цены на бриллианты¶
import pandas as pd
df = pd.read_csv("..//static//csv//Diamonds Prices2022.csv")
print(df.columns)
Проблемная область: ценообразование бриллиантов
Объект наблюдения: бриллиант
Атрибуты: идентификатор, вес, качество огранки, цвет, чистота, общая глубина, ширина верхней грани, цена, длина, ширина, высота.
Пример бизнес-цели:
Оптимизация ценообразования и повышение эффективности продаж: Цель: Разработка модели прогнозирования цен на бриллианты, которая позволит компаниям устанавливать конкурентоспособные цены и повысить продажи.
Повышение эффективности маркетинговых кампаний: Цель: Использование данных о бриллиантах для разработки целевых маркетинговых кампаний, направленных на конкретные сегменты рынка.
Повышение качества сервиса и удовлетворенности клиентов: Цель: Использование данных для предоставления клиентам персонализированных рекомендаций и улучшения качества обслуживания.
Актуальность: Данный датасет является актуальным и ценным ресурсом для компаний, работающих на рынке бриллиантов, а также для исследователей и инвесторов, поскольку он предоставляет обширную информацию о ценах и характеристиках бриллиантов. Эти данные могут быть использованы для разработки моделей прогнозирования цен, анализа рыночных тенденций и принятия обоснованных бизнес-решений.
import pandas as pd
import matplotlib.pyplot as plt
# Загрузка данных
df = pd.read_csv("..//static//csv//Diamonds Prices2022.csv")
plt.figure(figsize=(10, 6))
plt.scatter(df['price'], df['carat'])
plt.xlabel('price')
plt.ylabel('carat')
plt.title('Scatter Plot of price vs carat')
plt.show()
При проверке на шум можно заметить выброс при цене в 17500. Количество карат запредельно.
Для удаления выбросов из датасета можно использовать метод межквартильного размаха. Зашумленность не очень высокая. Покрытие данных высокое и подошло бы для поставленной задачи по актуальности.
import pandas as pd
import matplotlib.pyplot as plt
# Загрузка данных
df = pd.read_csv("..//static//csv//Diamonds Prices2022.csv")
# Выбор столбцов для анализа
column1 = 'carat'
column2 = 'price'
# Функция для удаления выбросов
def remove_outliers(df, column):
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
return df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]
# Удаление выбросов для каждого столбца
df_cleaned = df.copy()
for column in [column1, column2]:
df_cleaned = remove_outliers(df_cleaned, column)
# Построение точечной диаграммы после удаления выбросов
plt.figure(figsize=(10, 6))
plt.scatter(df_cleaned[column1], df_cleaned[column2], alpha=0.5)
plt.xlabel(column1)
plt.ylabel(column2)
plt.title(f'Scatter Plot of {column1} vs {column2} (After Removing Outliers)')
plt.show()
# Вывод количества строк до и после удаления выбросов
print(f"Количество строк до удаления выбросов: {len(df)}")
print(f"Количество строк после удаления выбросов: {len(df_cleaned)}")
Теперь очистим датасет от пустых строк
import pandas as pd
# Загрузка данных
df = pd.read_csv("..//static//csv//Diamonds Prices2022.csv")
# Вывод общей информации о датасете
print("Общая информация о датасете:")
print(df.info())
# Вывод таблицы анализа пропущенных значений
missing_values = df.isnull().sum()
missing_values_percentage = (missing_values / len(df)) * 100
missing_data = pd.concat([missing_values, missing_values_percentage], axis=1, keys=['Количество пропущенных значений', 'Процент пропущенных значений'])
print("\nТаблица анализа пропущенных значений:")
print(missing_data)
Пустых строк не было обнаружено.
Теперь создадим выборки.
import pandas as pd
from sklearn.model_selection import train_test_split
# Загрузка данных
df = pd.read_csv("..//static//csv//Diamonds Prices2022.csv")
# Выбор признаков и целевой переменной
X = df.drop('carat', axis=1) # Признаки (все столбцы, кроме 'carat')
y = df['carat'] # Целевая переменная ('carat')
# Разбиение данных на обучающую и оставшуюся часть (контрольную + тестовую)
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42)
# Разбиение оставшейся части на контрольную и тестовую выборки
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
# Вывод размеров выборок
print(f"Размер обучающей выборки: {X_train.shape[0]}")
print(f"Размер контрольной выборки: {X_val.shape[0]}")
print(f"Размер тестовой выборки: {X_test.shape[0]}")
Проанализируем сбалансированность выборок
import pandas as pd
from sklearn.model_selection import train_test_split
# Загрузка данных
df = pd.read_csv("..//static//csv//Diamonds Prices2022.csv")
# Выбор признаков и целевой переменной
X = df.drop('carat', axis=1) # Признаки (все столбцы, кроме 'carat')
y = df['carat'] # Целевая переменная ('carat')
# Разбиение данных на обучающую и оставшуюся часть (контрольную + тестовую)
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42)
# Разбиение оставшейся части на контрольную и тестовую выборки
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
# Функция для анализа распределения и вывода результатов
def analyze_distribution(data, title):
print(f"Распределение carat в {title}:")
distribution = data.value_counts().sort_index()
print(distribution)
total = len(data)
positive_count = (data > 0).sum()
negative_count = (data < 0).sum()
positive_percent = (positive_count / total) * 100
negative_percent = (negative_count / total) * 100
print(f"Процент положительных значений: {positive_percent:.2f}%")
print(f"Процент отрицательных значений: {negative_percent:.2f}%")
# Анализ распределения для каждой выборки
analyze_distribution(y_train, "обучающей выборке")
analyze_distribution(y_val, "контрольной выборке")
analyze_distribution(y_test, "тестовой выборке")
Цены на кофе¶
import pandas as pd
df = pd.read_csv("..//static//csv//Starbucks Dataset.csv")
print(df.columns)
Проблемная область: ценообразование кофе
Объект наблюдения: кофе
Атрибуты: дата, цена на момент открытия, максимальная цена, минимальная цена, цена на момент закрытия, скорректированная цена закрытия, объем
Пример бизнес-цели:
Анализ рыночных тенденций: Цель: Определить долгосрочные тенденции в ценах на кофе.
Прогнозирование цен: Цель: Разработать модель прогнозирования будущих цен на кофе.
Оценка рисков: Цель: Оценить риски, связанные с колебаниями цен на кофе.
Актуальность: Данные о ценах на кофе являются крайне актуальными для компаний, работающих в сфере кофейной индустрии, а также для инвесторов и трейдеров, заинтересованных в сырьевом рынке. Понимание динамики цен на кофе позволяет оптимизировать стратегии закупок, управления запасами и ценообразования, что в конечном итоге влияет на прибыльность бизнеса и эффективность инвестиций.
import pandas as pd
import matplotlib.pyplot as plt
# Загрузка данных
df = pd.read_csv("..//static//csv//Starbucks Dataset.csv")
plt.figure(figsize=(10, 6))
plt.scatter(df['Open'], df['Volume'])
plt.xlabel('Open')
plt.ylabel('Volume')
plt.title('Scatter Plot of Open vs Volume')
plt.show()
Выброс присутствует. Сделаем очистку данных.
Для удаления выбросов из датасета можно использовать метод межквартильного размаха. Зашумленность не очень высокая. Покрытие данных высокое и подошло бы для поставленной задачи по актуальности.
import pandas as pd
import matplotlib.pyplot as plt
# Загрузка данных
df = pd.read_csv("..//static//csv//Starbucks Dataset.csv")
# Функция для удаления выбросов с использованием IQR
def remove_outliers_iqr(df, column):
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
return df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]
# Удаление выбросов для столбцов 'Open' и 'Volume'
df_cleaned = remove_outliers_iqr(df, 'Open')
df_cleaned = remove_outliers_iqr(df_cleaned, 'Volume')
# Построение графика для очищенных данных
plt.figure(figsize=(10, 6))
plt.scatter(df_cleaned['Open'], df_cleaned['Volume'])
plt.xlabel('Open')
plt.ylabel('Volume')
plt.title('Scatter Plot of Open vs Volume (Cleaned)')
plt.show()
Теперь очистим датасет от пустых строк
import pandas as pd
import matplotlib.pyplot as plt
# Загрузка данных
df = pd.read_csv("..//static//csv//Starbucks Dataset.csv")
# Вывод количества строк до очистки
print(f"Количество строк до очистки: {len(df)}")
# Удаление пустых строк
df_cleaned = df.dropna()
# Функция для удаления выбросов с использованием IQR
def remove_outliers_iqr(df, column):
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
return df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]
# Удаление выбросов для столбцов 'Open' и 'Volume'
df_cleaned = remove_outliers_iqr(df_cleaned, 'Open')
df_cleaned = remove_outliers_iqr(df_cleaned, 'Volume')
# Вывод количества строк после удаления выбросов
print(f"Количество строк после удаления выбросов: {len(df_cleaned)}")
Теперь создадим выборки
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
# Загрузка данных
df = pd.read_csv("..//static//csv//Diamonds Prices2022.csv")
# Выбор столбцов для анализа
column1 = 'carat'
column2 = 'price'
# Функция для удаления выбросов
def remove_outliers(df, column):
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
return df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]
# Удаление выбросов для каждого столбца
df_cleaned = df.copy()
for column in [column1, column2]:
df_cleaned = remove_outliers(df_cleaned, column)
# Разделение данных на обучающую и тестовую выборки
X = df_cleaned[[column1]]
y = df_cleaned[column2]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Разделение обучающей выборки на обучающую и контрольную выборки
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, random_state=42)
# Вывод размеров выборок
print(f"Размер обучающей выборки: {len(X_train)}")
print(f"Размер контрольной выборки: {len(X_val)}")
print(f"Размер тестовой выборки: {len(X_test)}")
Проанализируем сбалансированность выборок
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
# Загрузка данных
df = pd.read_csv("..//static//csv//Diamonds Prices2022.csv")
# Выбор столбцов для анализа
column1 = 'carat'
column2 = 'price'
# Функция для удаления выбросов
def remove_outliers(df, column):
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
return df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]
# Удаление выбросов для каждого столбца
df_cleaned = df.copy()
for column in [column1, column2]:
df_cleaned = remove_outliers(df_cleaned, column)
# Разделение данных на обучающую и тестовую выборки
X = df_cleaned[[column1]]
y = df_cleaned[column2]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Разделение обучающей выборки на обучающую и контрольную выборки
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, random_state=42)
# Вывод размеров выборок
print(f"Размер обучающей выборки: {len(X_train)}")
print(f"Размер контрольной выборки: {len(X_val)}")
print(f"Размер тестовой выборки: {len(X_test)}")
# Построение гистограмм для каждой выборки
plt.figure(figsize=(15, 5))
# Гистограмма для обучающей выборки
plt.subplot(1, 3, 1)
plt.hist(y_train, bins=30, alpha=0.5, label='Train')
plt.xlabel('Price')
plt.ylabel('Frequency')
plt.title('Training Set')
# Гистограмма для контрольной выборки
plt.subplot(1, 3, 2)
plt.hist(y_val, bins=30, alpha=0.5, label='Validation')
plt.xlabel('Price')
plt.ylabel('Frequency')
plt.title('Validation Set')
# Гистограмма для тестовой выборки
plt.subplot(1, 3, 3)
plt.hist(y_test, bins=30, alpha=0.5, label='Test')
plt.xlabel('Price')
plt.ylabel('Frequency')
plt.title('Test Set')
plt.tight_layout()
plt.show()
# Вычисление статистических показателей
def print_stats(data, name):
print(f"\nСтатистика для {name}:")
print(f"Среднее: {data.mean()}")
print(f"Медиана: {data.median()}")
print(f"Стандартное отклонение: {data.std()}")
print_stats(y_train, 'Training Set')
print_stats(y_val, 'Validation Set')
print_stats(y_test, 'Test Set')
Мы вычислили среднее, медиану и стандартное отклонение для каждой выборки. Если эти показатели для всех выборок близки, это также указывает на сбалансированность выборок.