Seaborn – дополнение Matplotlib с API как для быстрого построения красивых графиков, так и для детальной кастомизации картинок для презентации.
In [1]:
%matplotlib inline
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (10, 6)
Посмотрим на Seaborn сразу в действии на данных по моделям месяца по версии журнала Playboy.
In [2]:
girls = pd.read_csv('../data/girls.csv')
girls.head(10)
Out[2]:
In [3]:
girls.describe(include='all')
Out[3]:
Гистограммы. Метод distplot
In [4]:
girls['Waist'].hist(bins=15);
In [5]:
sns.distplot(girls['Waist'], kde=True);
In [6]:
ax = sns.distplot(girls['Height'], kde=False)
ax.set(xlabel='Playboy girls height', ylabel='Frequency')
sns.set_style('darkgrid')
Метод boxplot В наборе данных все признаки численные, так что создадим категорию "weight_cat" из 3 типов веса.
In [7]:
def weight_category(weight):
return 'heavier' if weight > 54\
else 'lighter' if weight < 49 else 'median'
girls['weight_cat'] = girls['Weight'].apply(weight_category)
sns.boxplot(x='weight_cat', y='Height', data=girls);
Метод pairplot
In [8]:
sns.set_palette(sns.color_palette("RdBu"))
sns.pairplot(girls[['Bust', 'Waist', 'Hips', 'Height', 'Weight']]);
In [9]:
girls.corr()
Out[9]:
In [10]:
girls.head()
Out[10]:
Метод countplot
In [11]:
def height_category(height):
return 'high' if height > 175\
else 'small' if height < 160 else 'median'
girls['height_cat'] = girls['Height'].apply(height_category)
sns.countplot(x='height_cat', hue='weight_cat', data=girls);
In [12]:
pd.crosstab(girls['weight_cat'], girls['height_cat'])
Out[12]:
Метод jointplot
In [13]:
sns.jointplot(x='Weight', y='Height',
data=girls, kind='reg');
В 1968 году была опубликована статья под названием "Correlation of Performance Test Scores with Tissue Concentration of Lysergic Acid Diethylamide in Human Subjects".
К статье приложен небольшой набор данных всего из 7 наблюдений.
In [14]:
data_types = {'Drugs': float,
'Score': float}
df = pd.read_csv('../data/drugs-and-math.csv',
index_col=0, sep=',', dtype=data_types)
In [15]:
print(df.shape)
print(df.columns)
print(df.index)
In [16]:
df
Out[16]:
Таблица уже отсортирована по колонке Drugs, сделаем сортировку по Score.
In [17]:
df.sort_values('Score',
ascending=False,
inplace=True)
In [18]:
df.describe().T # Иногда так лучше
Out[18]:
In [19]:
df.plot(kind='box');
In [20]:
df.plot(x='Drugs', y='Score', kind='bar');
In [21]:
df.plot(x='Drugs', y='Score', kind='scatter');
Видна тенденция...
In [22]:
df.corr(method='pearson')
Out[22]:
Не советуем строить регрессию по 7 наблюдениям :)
In [23]:
sns.jointplot(x='Drugs', y='Score',
data=df, kind='reg');