单变量分析绘图
直方图
import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from scipy import stats,integrate
import pandas as pd
%matplotlib inline
sns.set(color_codes=True)
np.random.seed(sum(map(ord,"distribution")))
x = np.random.normal(size=100)
sns.distplot(x,bins=20,kde=True)
#bins: 设置分桶数
#kde控制是否画kde曲线
map()函数:
第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个集合。
把函数依次作用在list中的每一个元素上,得到一个新的list并返回。注意,map不改变原list,而是返回一个新list。
ord()函数:
ord()函数它以一个字符(长度为1的字符串)作为参数,返回对应的ASCII数值,或者Unicode数值。如果所给的Unicode字符超出了你的Python定义范围,则会引发一个TypeError的异常。
np.random.seed()函数
设置相同的seed,每次生成的随机数相同。
数据分布情况
x = np.random.gamma(6, size=200)
sns.distplot(x, kde=False, fit=stats.gamma) #实例化伽玛分布
根据均值和协方差生成数据
np.random.multivariate_normal生成一个服从多元正态分布的数组
multivariate_normal(mean, cov, size=None, check_valid=None, tol=None)
mean:均值,维度为1,必选参数;
cov:协方差矩阵,必选参数;
size: 指定生成矩阵的维度,若size=(1, 1, 2),则输出的矩阵的 shape 即形状为 1X1X2XN(N为mean的#长度);
check_valid:可取值 warn,raise以及ignore;
tol:检查协方差矩阵奇异值时的公差,float类型
mean, cov = [0, 1], [(1, .5), (.5, 1)]
#两个相关的正态分布
data = np.random.multivariate_normal(mean, cov, 200)
#依据指定的均值和协方差生成数据,生成二维数组
df = pd.DataFrame(data, columns=["x", "y"])
df.tail()
x | y | |
---|---|---|
195 | -0.885440 | -0.275349 |
196 | -0.678798 | 1.505844 |
197 | 1.601188 | 2.096382 |
198 | -0.398727 | 1.388353 |
199 | -0.051887 | 0.427285 |
观测两个变量之间的分布关系最好用散点图 (数据量较小)
sns.jointplot(x="x", y="y", data=df);
数据量较大的情况
x,y = np.random.multivariate_normal(mean,cov,1000).T
with sns.axes_style('white'):
sns.jointplot(x=x,y=y,kind='hex',color='g') #kind=’hex’——六角箱图
回归分析图
np.random.seed(sum(map(ord,'regression')))
tips = sns.load_dataset('tips') #tips为Seaborn内置数据集
#tips.head()
sns.regplot(x='total_bill',y='tip',data=tips)
sns.regplot(x='size',y='tip',data=tips)
sns.regplot(x='size',y='tip',data=tips,x_jitter=.05) #数据横向浮动0.05
多变量分析绘图
sns.set(style='whitegrid',color_codes=True)
np.random.seed(sum(map(ord,"categorical")))
titanic = sns.load_dataset('titanic')
tips = sns.load_dataset('tips')
iris = sns.load_dataset('iris')
sns.stripplot(x='day',y='total_bill',hue='day',data=tips,jitter=True)
stripplot()按照x轴里的类别进行分类
jitter=True,使集中在一起的数据往左往右偏移
hue=' day' 用不同的颜色标识分类
sns.swarmplot(x='day',y='total_bill',hue='sex',data=tips)
swarmplot()分簇散点图
盒图
IQR即统计学概念四分位距,第一四分位和第三四分位之间的距离
N = 1.5IQR 如果一个值>Q3+N,或者<Q1-N,则为离群点
sns.violinplot(x='total_bill',y='day',hue='time',data=tips)
violinplot()小提琴图,越大的地方说明数据出现在的频率越高
分类属性绘图
sns.violinplot(x='day',y='total_bill',hue='sex',data=tips,split=True)
#split 对数据进行分类
sns.violinplot(x='day',y='total_bill',data=tips,inner=None)
sns.swarmplot(x='day',y='total_bill',data=tips,color='w',alpha=.9)
显示值的集中趋势可以用条形图
sns.barplot(x='sex',y='survived',hue='class',data=titanic)
点图可以更好的描述单一变量变化趋势
sns.pointplot(x='sex',y='survived',hue='class',data=titanic)
对比不同性别活下的来概率
sns.pointplot(x='class',y='survived',hue='sex',data=titanic,
palette={'male':'g','female':'m'},
markers=['*','o'],linestyle=['-','--']);
自定义点图
多层面板分类图(最常用)
sns.factorplot(x='day',y='total_bill',hue='smoker',data=tips,kind='bar')
sns.factorplot(x='day',y='total_bill',hue='smoker',data=tips,col='time',kind='swarm')
sns.factorplot(x='time',y='total_bill',hue='smoker',data=tips,col='day',kind='box',size=4,aspect=.5)
aspect=0.5 设置长宽比
facetgrid的使用方法
tips = sns.load_dataset('tips')
g = sns.FacetGrid(tips,col='time') #实例化facetgrid
g.map(plt.hist,'tip')
g = sns.FacetGrid(tips,col='sex',hue='smoker')
g.map(plt.scatter,'total_bill','tip',alpha=.7)
g.add_legend()
scatter表示散点图
g.add_legend()加入标注
g = sns.FacetGrid(tips,row='smoker',col='time',margin_titles=True)
g.map(sns.regplot,'size','total_bill',color='.1',fit_reg=True,x_jitter=.1)
fit_reg=True 显示回归线
from pandas import Categorical
ordered_days = tips.day.value_counts().index #tips数据集中原来的顺序
ordered_days = Categorical(['Thur','Fri','Sat','Sun']) #自己设置的顺序
print(ordered_days)
g = sns.FacetGrid(tips,row='day',row_order=ordered_days,size=1.7,aspect=4)
g.map(sns.boxplot,'total_bill')
Facetgrid绘制多变量
pal = dict(Lunch='seagreen',Dinner='gray')
g = sns.FacetGrid(tips,hue='time',palette=pal,size=5)
g.map(plt.scatter,'total_bill','tip',s=20,alpha=.7,linewidth=.5,edgecolor='white')
g.add_legend()
s=20 设置图中标识圆点大小
alpha=.7设置对比度
with sns.axes_style('white'):
g = sns.FacetGrid(tips,row='sex',col='smoker',margin_titles=True,size=2.5)
g.map(plt.scatter,'total_bill','tip',color='#334488',edgecolor='white',lw=.9);
g.set_axis_labels('Total bill(US Dollars)','Tip');
g.set(xticks=[10,30,50],yticks=[2,6,10]);
g.fig.subplots_adjust(wspace=.5,hspace=.5) #设置每个子图之间的距离
这里出现四个子图的原因是:smoker和sex各种两种可能
iris = sns.load_dataset('iris')
g = sns.PairGrid(iris)
g.map(plt.scatter)
对图
g = sns.PairGrid(iris,vars=['sepal_length','sepal_width'],hue='species')
g.map(plt.scatter); #取鸢尾花数据集中两个特征进行成图