Первичный анализ данных: инструменты pandas и numpy
Основные подходы к исследованию данных
Как получить общее представление о наборе данных с помощью pandas?
Наиболее эффективный способ начать анализ - использовать комбинацию методов .info(), .describe() и .head(). Эти функции дают сведения о типах столбцов, количестве непустых значений, базовых статистиках и первых строках.
import pandas as pd
import numpy as np
# загрузка данных (пример с датасетом tips из seaborn)
df = sns.load_dataset('tips')
print(df.info())
print(df.describe(include='all'))
print(df.head())Python для анализа данных (python для анализа данных)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 244 entries, 0 to 243
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 total_bill 244 non-null float64
1 tip 244 non-null float64
2 sex 244 non-null object
3 smoker 244 non-null object
4 day 244 non-null object
5 time 244 non-null object
6 size 244 non-null int64
dtypes: float64(2), int64(1), object(4)
memory usage: 13.4+ KB
анализ больших данных python (анализ больших данных в python)
Пояснение: .info() показывает типы данных и количество непустых записей, что помогает заранее выявить пропуски. .describe() с параметром include='all' выводит статистики для всех столбцов (включая категориальные). .head() позволяет визуально проверить формат данных.
Типичные ошибки:
- Забывают указать include='all' в describe(), тогда категориальные столбцы игнорируются.
- При большом наборе данных вызов .head() без ограничения числа строк может быть неинформативен - лучше использовать .sample(10).
- Если в данных есть столбцы с типом object, но на самом деле они числовые, pandas не сможет правильно рассчитать статистики. Решение: применить pd.to_numeric() после очистки.
Как быстро проверить количество пропущенных значений?
Метод .isnull().sum() возвращает число пропусков по каждому столбцу.
print(df.isnull().sum())
Python анализ данных excel (анализ данных excel в python)
Для визуализации пропусков полезно использовать библиотеку missingno.
import missingno as msno
msno.matrix(df)анализ данных python pdf (анализ данных pdf в python)
Проблема: пропуски могут быть закодированы как 'NA', '?', 0. Решение: предварительно привести их к NaN с помощью pd.read_csv(..., na_values=['NA','?']).
Как выявить дубликаты строк?
Функция .duplicated() возвращает булеву маску. Суммарное количество дубликатов:
print(df.duplicated().sum())
# просмотр дубликатов
print(df[df.duplicated()])Python анализ данных и машинное обучение (анализ данных и машинное обучение на python)
Важно: дубликаты могут быть неполными (например, одинаковые данные, но разные индексы). Для точного удаления используется .drop_duplicates(). Если дубликаты нежелательны, их удаляют, но перед этим стоит убедиться, что они не являются значимыми (например, повторные измерения).
Как проанализировать распределение числовых столбцов?
Для быстрой визуализации гистограмм всех числовых признаков применяют метод .hist().
import matplotlib.pyplot as plt
df.hist(bins=20, figsize=(10,8))
plt.tight_layout()анализ данных с использованием python (анализ данных с использованием python)
Если нужно изучить выбросы, строят boxplot с помощью seaborn или pandas.
import seaborn as sns
sns.boxplot(data=df, x='day', y='total_bill')Python анализ текстовых данных (анализ текстовых данных в python)
Ошибка: при большом количестве столбцов гистограммы налезают друг на друга. Решение: увеличить figsize или строить отдельные графики для ключевых признаков. Для категориальных признаков гистограмма не подходит - используют countplot.
Как оценить корреляцию между признаками?
Матрица корреляции вычисляется методом .corr(). Для визуализации - тепловая карта.
corr_matrix = df[['total_bill','tip','size']].corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')аналитик данных python sql (аналитик данных python sql)
Пояснение: .corr() по умолчанию считает корреляцию Пирсона. Для ранговой корреляции (Спирмена) указывают method='spearman'.
Проблема: если в данных есть пропуски, корреляция не будет рассчитана (возвращается NaN). Решение: удалить строки с пропусками или использовать метод .corr(min_periods=1).
Как быстро получить уникальные значения категориальных признаков?
Метод .value_counts() показывает частоту каждого значения.
print(df['day'].value_counts())Python библиотеки numpy и pandas (библиотеки numpy и pandas в python)
Для просмотра уникальных значений без подсчёта - .unique().
print(df['sex'].unique())Ошибка: если категориальный признак содержит пробелы или разный регистр, value_counts() может показать одно и то же значение как разные. Решение: стандартизировать строки (lower(), strip()).
Расширенные примеры первичного анализа с использованием продвинутых возможностей pandas и numpy.
Пример 1: Анализ пропусков с визуализацией и матрицей
import pandas as pd
import numpy as np
import missingno as msno
import matplotlib.pyplot as plt
# создание искусственных данных с пропусками
np.random.seed(42)
data = {
'A': np.random.randn(100),
'B': np.random.randn(100),
'C': np.random.choice([np.nan, 1, 2, 3], size=100, p=[0.2, 0.3, 0.3, 0.2]),
'D': np.random.choice(['x','y','z'], size=100),
'E': np.random.randn(100)
}
data['A'][::5] = np.nan # каждый пятый элемент в A пропущен
data['E'][::10] = np.nan
df = pd.DataFrame(data)
# матрица пропусков
msno.matrix(df)
plt.show()
# статистика пропусков в процентах
missing_percent = (df.isnull().sum() / len(df)) * 100
print("Процент пропусков по столбцам:\n", missing_percent)
# отбор столбцов с пропусками более 30%
cols_to_drop = missing_percent[missing_percent > 30].index
print("Столбцы с высоким процентом пропусков:", cols_to_drop.tolist())Процент пропусков по столбцам:
A 20.0
B 0.0
C 19.0
D 0.0
E 10.0
dtype: float64
Столбцы с высоким процентом пропусков: []
Пояснение: missingno визуализирует расположение пропусков (белые полосы). Расчёт процента помогает принять решение об удалении столбцов.
Пример 2: Групповой первичный анализ с groupby и agg
import seaborn as sns
df = sns.load_dataset('tips')
# средние значения чаевых по дням и времени обеда
grouped = df.groupby(['day', 'time'])['tip'].agg(['mean', 'std', 'count'])
print(grouped.round(2))
# дополнительно: медиана и IQR
def iqr(x):
return x.quantile(0.75) - x.quantile(0.25)
grouped2 = df.groupby('sex').agg({
'total_bill': ['mean', 'std', iqr],
'tip': ['median', 'max']
})
print(grouped2.round(2))mean std count
day time
Thur Lunch 2.39 1.38 5
Dinner 4.19 0.00 1
Fri Lunch 2.33 0.73 3
Dinner 3.05 1.21 12
...
Пояснение: группировка позволяет выявить различия в подгруппах. Использование собственной функции (iqr) даёт гибкость.
Пример 3: Использование numpy для быстрых статистик
import numpy as np
import pandas as pd
# создание большого массива
arr = np.random.randn(10000, 5)
df = pd.DataFrame(arr, columns=['x1','x2','x3','x4','x5'])
# numpy статистики по столбцам
means = np.mean(df.values, axis=0)
stds = np.std(df.values, axis=0)
perc_90 = np.percentile(df.values, 90, axis=0)
result = pd.DataFrame({
'mean': means,
'std': stds,
'90th_perc': perc_90
}, index=df.columns)
print(result.head())mean std 90th_perc
x1 -0.0079 0.9987 1.2876
x2 -0.0012 1.0039 1.2878
...
Пояснение: для числовых массивов numpy работает быстрее pandas, особенно при 10 000+ строк. Но pandas удобнее для работы с пропусками и метками.
Пример 4: Проверка нормальности распределения с помощью статистических тестов
from scipy import stats
import pandas as pd
import numpy as np
# датасет с нормальным и ненормальным распределением
np.random.seed(0)
normal_data = np.random.normal(0, 1, 1000)
skewed_data = np.random.exponential(2, 1000)
df = pd.DataFrame({'normal': normal_data, 'skewed': skewed_data})
# тест Шапиро-Уилка
for col in df.columns:
stat, p = stats.shapiro(df[col])
print(f"{col}: W={stat:.4f}, p={p:.4f}")
if p > 0.05:
print(f" Данные нормально распределены (не отвергаем H0)")
else:
print(f" Данные не являются нормальными (отвергаем H0)")normal: W=0.9986, p=0.6090
Данные нормально распределены (не отвергаем H0)
skewed: W=0.8144, p=0.0000
Данные не являются нормальными (отвергаем H0)
Пояснение: тест Шапиро-Уилка чувствителен к размеру выборки, для больших (>5000) предпочтителен тест Андерсона-Дарлинга.
Пример 5: Обнаружение выбросов методом IQR и Z-score с визуализацией
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# генерация данных с выбросами
np.random.seed(42)
data = np.random.normal(50, 10, 1000)
data[:10] = np.random.uniform(100, 200, 10) # явные выбросы
df = pd.DataFrame({'value': data})
# метод IQR
Q1 = df['value'].quantile(0.25)
Q3 = df['value'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers_iqr = df[(df['value'] < lower_bound) | (df['value'] > upper_bound)]
print(f"Выбросов по IQR: {len(outliers_iqr)}")
# метод Z-score
from scipy import stats
z_scores = np.abs(stats.zscore(df['value']))
outliers_z = df[z_scores > 3]
print(f"Выбросов по Z-score (|z|>3): {len(outliers_z)}")
# визуализация
fig, axes = plt.subplots(1,2, figsize=(10,4))
df.boxplot(ax=axes[0])
axes[0].set_title('Boxplot')
axes[1].hist(df['value'], bins=30, edgecolor='k')
axes[1].axvline(lower_bound, color='r', linestyle='--')
axes[1].axvline(upper_bound, color='r', linestyle='--')
plt.show()Выбросов по IQR: 10
Выбросов по Z-score (|z|>3): 10
Пояснение: оба метода дали одинаковый результат. IQR устойчив к сильным выбросам, Z-score лучше для нормальных данных. Визуализация помогает проверить корректность границ.