Анализ данных с применением Python
Основные подходы к анализу данных на Python
Как загрузить данные из внешнего источника?
Основной способ: функция pandas.read_csv() для файлов CSV. Пример:
import pandas as pd
df = pd.read_csv('data.csv', encoding='utf-8', sep=',')анализ данных на языке python (анализ данных на языке python)
Параметр encoding позволяет указать кодировку, sep - разделитель. После загрузки рекомендуется проверить первые строки командой df.head().
Какие альтернативы существуют для других форматов?
pd.read_excel('file.xlsx', sheet_name='Sheet1')- для Excel.pd.read_sql(query, connection)- для баз данных.pd.read_json('data.json')- для JSON.
Каждый метод имеет схожие параметры настройки парсинга.
Типичная ошибка: неправильная кодировка приводит к UnicodeDecodeError. Решение - указать encoding='cp1251' для русскоязычных файлов Windows.
Другая проблема - пропуск разделителя. Файл может использовать точку с запятой вместо запятой. Решение - явно задать sep=';'.
Как выполнить первичный осмотр структуры данных?
Основные методы:
print(df.head(10)) # первые 10 строк
print(df.info()) # типы столбцов, количество непустых значений
print(df.describe()) # описательная статистика для числовых столбцов
info() показывает количество пропусков, describe() - среднее, медиану, квартили. Это помогает быстро выявить аномалии.
Как получить случайную выборку или проверить уникальность?
df.sample(5)- случайные строки.df['column'].unique()- уникальные значения столбца.df.shape- размер таблицы (строки, столбцы).
Распространённое заблуждение: describe() игнорирует пропуски, что может исказить средние. Рекомендуется сначала обработать пропуски.
Также типы данных могут быть распознаны неверно (например, дата как объект). Тогда следует преобразовать df['date'] = pd.to_datetime(df['date']).
Как очистить данные от пропусков и выбросов?
Удаление строк с пропусками:
df_clean = df.dropna()
df_clean = df.dropna(subset=['важный_столбец'])
Заполнение пропусков:
df['column'] = df['column'].fillna(df['column'].median())
Для категориальных признаков часто используют моду.
Какие есть альтернативные методы обработки пропусков?
SimpleImputerизsklearn.impute- стратегии mean, median, most_frequent.- Интерполяция для временных рядов:
df.interpolate(). - Модельное предсказание пропусков (например, через KNNImputer).
Выбор метода зависит от природы данных: для временных рядов оптимальна интерполяция, для случайных пропусков - медиана.
Ошибка: удаление всех строк с пропусками (dropna без аргументов) может уничтожить большую часть данных. Следует анализировать долю пропусков.
При заполнении средним значением искажаются распределение и взаимосвязи. Альтернатива - использовать модели, которые учитывают другие признаки.
Как визуализировать распределение признака?
Построение гистограммы:
import matplotlib.pyplot as plt
import seaborn as sns
plt.hist(df['age'], bins=20, edgecolor='black')
plt.xlabel('Возраст')
plt.ylabel('Частота')
plt.show()
Seaborn предлагает более удобную функцию sns.histplot(df['age'], bins=20).
Какие ещё способы визуализации распределения существуют?
- Ящик с усами (boxplot):
sns.boxplot(x=df['age'])- показывает медиану, квартили, выбросы. - График плотности:
sns.kdeplot(df['age'])- сглаженное распределение. - Совмещение гистограммы и плотности:
sns.histplot(df['age'], kde=True).
Boxplot удобен для обнаружения выбросов, kde - для формы распределения.
Проблема: неправильный выбор числа бинов ведёт к потере информации. Рекомендуется использовать правило Freedman-Diaconis или автонастройку в seaborn.
Выбросы могут сжать основную часть графика. В boxplot их видно сразу, а на гистограмме их можно убрать, ограничив диапазон осей.
Как исследовать корреляции между признаками?
Матрица корреляции:
corr = df.corr()
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.show()
Метод corr() вычисляет коэффициент Пирсона (линейная зависимость). Heatmap визуализирует силу связи.
Как оценить нелинейные зависимости?
- Ранговая корреляция Спирмена:
df.corr(method='spearman'). - Точечная диаграмма (scatter plot):
plt.scatter(df['x'], df['y']). - Парные графики:
sns.pairplot(df).
Scatter позволяет визуально увидеть нелинейные тренды, а pairplot - всю панель признаков.
Предостережение: корреляция не означает причинно-следственную связь. Высокий коэффициент может быть случайным (например, при малом размере выборки).
Также выбросы сильно влияют на корреляцию Пирсона. Перед расчётом стоит проверить данные на выбросы и, при необходимости, использовать робастные методы.
Расширенные примеры анализа данных на Python
Пример 1: Агрегация данных с помощью groupby
import pandas as pd
df = pd.DataFrame({
'Группа': ['A','A','B','B','C'],
'Значение': [10, 20, 15, 25, 30]
})
grouped = df.groupby('Группа')['Значение'].agg(['mean', 'sum', 'std'])
print(grouped)
mean sum std Группа A 15.0 30 7.071068 B 20.0 40 7.071068 C 30.0 30 NaN
Метод agg() позволяет применить несколько функций одновременно. std для группы C равно NaN, так как только одно значение.
Пример 2: Объединение таблиц (join/merge)
df1 = pd.DataFrame({'ID': [1,2,3], 'Name': ['Alice','Bob','Charlie']})
df2 = pd.DataFrame({'ID': [2,3,4], 'Score': [90,85,88]})
merged = pd.merge(df1, df2, on='ID', how='inner')
print(merged)
ID Name Score 0 2 Bob 90 1 3 Charlie 85
Параметр how (inner/outer/left/right) определяет, какие строки сохранять. Inner - только совпадения.
Пример 3: Работа с датами и временными рядами
dates = pd.date_range('2023-01-01', periods=10, freq='D')
df = pd.DataFrame({'date': dates, 'value': range(10)})
df['month'] = df['date'].dt.month
df['weekday'] = df['date'].dt.day_name()
resampled = df.resample('W', on='date')['value'].sum()
print(resampled)
date 2023-01-01 0 2023-01-08 28 Freq: W-SUN, Name: value, dtype: int64
Метод resample агрегирует по временным интервалам. Здесь суммируются значения за неделю.
Пример 4: Создание сводной таблицы (pivot table)
df = pd.DataFrame({
'Продавец': ['Anna','Bob','Anna','Bob'],
'Товар': ['A','A','B','B'],
'Продажи': [100, 150, 200, 120]
})
pivot = df.pivot_table(index='Продавец', columns='Товар', values='Продажи', aggfunc='sum', fill_value=0)
print(pivot)
Товар A B Продавец Anna 100 200 Bob 150 120
Сводная таблица показывает сумму продаж каждого продавца по товарам. fill_value заменяет NaN на 0.
Пример 5: Кластеризация методом K-Means
from sklearn.cluster import KMeans
import numpy as np
X = np.array([[1,2],[2,3],[10,12],[11,13],[5,6]])
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
print('Метки кластеров:', kmeans.labels_)
print('Центроиды:', kmeans.cluster_centers_)
Метки кластеров: [0 0 1 1 0] Центроиды: [[ 2.66666667 4.33333333] [10.5 12.5 ]]
K-Means разделяет данные на заданное количество кластеров. Центроиды - средние координаты каждой группы.
Пример 6: Понижение размерности с PCA
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# Данные с 4 признаками
X = np.random.rand(100,4)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
plt.scatter(X_pca[:,0], X_pca[:,1])
plt.xlabel('Первая главная компонента')
plt.ylabel('Вторая главная компонента')
plt.title('Проекция данных на 2 компоненты')
plt.show()
PCA позволяет визуализировать многомерные данные. Доля объяснённой дисперсии доступна через pca.explained_variance_ratio_.