import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sb import pingouin as pg from scipy import stats # Датасет "Рост-Вес-Возраст-Позиция" columns = ['Position', 'Height(inches)', 'Weight(pounds)', 'Age'] df = pd.read_csv('SOCR_Data_MLB_HeightsWeights.txt', sep='\t', nrows=115, usecols=columns) # Построение диаграммы Тьюки только для числовых признаков fig1, axes = plt.subplots(2, 2, figsize=(10, 10)) fig1.suptitle('Диаграммы Тьюки по признакам') # Используем только числовые столбцы для boxplot numeric_columns = ['Height(inches)', 'Weight(pounds)', 'Age'] # Первый subplot оставляем пустым или убираем axes[0,0].remove() # убираем первый subplot axes[0,1].boxplot(df['Height(inches)']) axes[0,1].set_xticklabels(['Height(inches)']) axes[0,1].set_title('Рост (дюймы)') axes[1,0].boxplot(df['Weight(pounds)']) axes[1,0].set_xticklabels(['Weight(pounds)']) axes[1,0].set_title('Вес (фунты)') axes[1,1].boxplot(df['Age']) axes[1,1].set_xticklabels(['Age']) axes[1,1].set_title('Возраст') # Альтернативный вариант: построить boxplot для Position как категориального признака fig1_pos, ax_pos = plt.subplots(figsize=(8, 6)) position_counts = df['Position'].value_counts() ax_pos.bar(position_counts.index, position_counts.values) ax_pos.set_title('Распределение по позициям') ax_pos.set_xlabel('Позиция') ax_pos.set_ylabel('Количество') plt.xticks(rotation=45) fig2, axes = plt.subplots(1, 2, figsize=(12, 5)) fig2.suptitle('Тепловые карты') # Для корреляции преобразуем Position в числовой формат df_numeric = df.copy() # Создаем числовое представление позиций для корреляции position_mapping = {pos: i for i, pos in enumerate(df['Position'].unique())} df_numeric['Position_num'] = df['Position'].map(position_mapping) # Построение тепловой карты парных коэффициентов корреляции corrMatrix = df_numeric[['Position_num', 'Height(inches)', 'Weight(pounds)', 'Age']].corr() axes[0].set_title('Тепловая карта парных коэфф. корреляции') sb.heatmap(corrMatrix, annot=True, linewidths=0.5, ax=axes[0]) # Построение тепловой карты частных коэффициентов корреляции try: pCorrMatrix = df_numeric[['Position_num', 'Height(inches)', 'Weight(pounds)', 'Age']].pcorr() axes[1].set_title('Тепловая карта частных коэфф. корреляции') sb.heatmap(pCorrMatrix, annot=True, linewidths=0.5, ax=axes[1]) except: axes[1].set_title('Частная корреляция недоступна') print("Метод pcorr() недоступен") print('Тест Колмогорова-Смирнова. Уровень значимости a = 0.05') # Тест только для числовых признаков for col in numeric_columns: x = df[col] x_mean, std = np.mean(x), np.std(x, ddof=1) x_std = (x - x_mean)/std pvalue = stats.kstest(x_std, "norm", alternative='two-sided').pvalue if pvalue > 0.05: result = 'H0 не должна быть отвергнута' else: result = 'H0 должна быть отвергнута' print('Для {}: p-value: {:.4f}, так что {}'.format(col, pvalue, result)) # Построение гистограмм fig3, axes = plt.subplots(2, 2, figsize=(10, 7)) # Гистограмма для Position (как категориальный признак) position_counts = df['Position'].value_counts() axes[0,0].bar(position_counts.index, position_counts.values) axes[0,0].set_title('Распределение по позициям') axes[0,0].tick_params(axis='x', rotation=45) axes[0,1].hist(df['Height(inches)'], bins=15, alpha=0.7, edgecolor='black') axes[0,1].set_title('Гистограмма роста') axes[1,0].hist(df['Weight(pounds)'], bins=15, alpha=0.7, edgecolor='black') axes[1,0].set_title('Гистограмма веса') axes[1,1].hist(df['Age'], bins=15, alpha=0.7, edgecolor='black') axes[1,1].set_title('Гистограмма возраста') plt.tight_layout() plt.show() # Дополнительная информация о данных print("\nИнформация о данных:") print(df.info()) print("\nПервые 5 строк:") print(df.head())