因为平时经常要对数据什么的进行可视化,但又一直没有时间整理出一套完整的体系,所以不如柿子捡软的捏用最经典的数据集做一份Demo做参考。
About Iris
Iris数据集由Fisher在一九三六年整理,包含四个特征
- Sepal.Length(花萼长度)
- Sepal.Width(花萼宽度)
- Petal.Length(花瓣长度)
- Petal.Width(花瓣宽度)
特征值都为正浮点数,单位为厘米。
目标值为鸢尾花的分类,包含三类
- Iris Setosa(山鸢尾)
- Iris Versicolour(杂色鸢尾)
- Iris Virginica(维吉尼亚鸢尾)
| sepal_length | sepal_width | petal_length | petal_width | species |
|---|---|---|---|---|
| 5.1 | 3.5 | 1.4 | 0.2 | I. setosa |
| 4.9 | 3.0 | 1.4 | 0.2 | I. setosa |
| 4.7 | 3.2 | 1.3 | 0.2 | I. setosa |
| 4.6 | 3.1 | 1.5 | 0.2 | I. setosa |
| 5.0 | 3.6 | 1.4 | 0.2 | I. setosa |
| 6.1 | 2.8 | 4.7 | 1.2 | I. versicolor |
| 6.4 | 2.9 | 4.3 | 1.3 | I. versicolor |
| 6.6 | 3.0 | 4.4 | 1.4 | I. versicolor |
| 6.8 | 2.8 | 4.8 | 1.4 | I. versicolor |
| 6.7 | 3.0 | 5.0 | 1.7 | I. versicolor |
| 6.7 | 3.0 | 5.2 | 2.3 | I. virginica |
| 6.3 | 2.5 | 5.0 | 1.9 | I. virginica |
| 6.5 | 3.0 | 5.2 | 2.0 | I. virginica |
| 6.2 | 3.4 | 5.4 | 2.3 | I. virginica |
| 5.9 | 3.0 | 5.1 | 1.8 | I. virginica |
Get start
prepare
导入所需的包,其中Iris已经包含在sklearn中
import sklearn
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from pandas.tools.plotting import radviz
from pandas.tools.plotting import andrews_curves
from pandas.tools.plotting import parallel_coordinates
数据预处理
iris = load_iris()
iris_feature = pd.DataFrame(iris.data)
iris_target = pd.DataFrame(iris.target)
iris_feature.columns = ['sepal_length','sepal_width','petal_length','petal_width']
iris_target.columns = ['species']
iris_target['species'] = iris_target['species'].map({0:'I. setosa',1:'I. versicolor',2:'I. virginica'})
iris = pd.concat([iris_feature,iris_target],axis = 1)
可视化
特征间的关系
分析花瓣花萼之间长宽的关系:
sns.jointplot(x='sepal_length', y='sepal_width', data=iris, kind='reg')
sns.jointplot(x='petal_length', y='petal_width', data=iris, kind='reg')
pearsonr为皮尔森相关系数,其绝对值:
- 0.8-1.0 极强相关
- 0.6-0.8 强相关
- 0.4-0.6 中等程度相关
- 0.2-0.4 弱相关
- 0.0-0.2 极弱相关或无相关
所以说花瓣的长宽极强相关,花萼的长宽极弱相关或无相关
P值:
一般p值小于0.05就是显著了;如果小于0.01就更显著;例如p值=0.001,就是很高的显著水平了,只要显著,就可以下结论说:拒绝原假设无关,两组数据显著相关也说两者间确实有明显关系。通常需要p值小于0.1,最好小于0.05设甚至0.01,才可得出结论:两组数据有明显关系,如果p=0.5,远大于0.1,只能说明相关程度不明显甚至不相关.起码不是线性相关。
仔细分析不难发现四个特征之间两两之间相关系数可以算出六个,所以是时候画个相关系数矩阵了。
sns.heatmap(
iris_feature.corr(),
annot=True
)
plt.show()
线箱图、小提琴图
解释以及笑话
线箱图
小提琴图
(冷)笑话
iris.boxplot(by='species',grid=sns.color_palette(),figsize = (16,16))
plt.figure(figsize=(20, 10))
plt.subplot(2, 2, 1)
sns.violinplot(x='species', y='sepal_length', data=iris)
plt.subplot(2, 2, 2)
sns.violinplot(x='species', y='sepal_width', data=iris)
plt.subplot(2, 2, 3)
sns.violinplot(x='species', y='petal_length', data=iris)
plt.subplot(2, 2, 4)
sns.violinplot(x='species', y='petal_width', data=iris)
散点图与核密度估计图
散点图
sns.FacetGrid(iris, hue="species", size=5).map(plt.scatter, "sepal_length", "sepal_width").add_legend()
sns.FacetGrid(iris, hue="species", size=5).map(plt.scatter, "petal_length", "petal_width").add_legend()
核密度估计图
sns.FacetGrid(iris, hue="species", size=5).map(sns.kdeplot, 'sepal_length').add_legend()
sns.FacetGrid(iris, hue="species", size=5).map(sns.kdeplot, 'sepal_width').add_legend()
sns.FacetGrid(iris, hue="species", size=5).map(sns.kdeplot, 'petal_length').add_legend()
sns.FacetGrid(iris, hue="species", size=5).map(sns.kdeplot, 'petal_width').add_legend()
另一种方法与解释
散点图与核密度估计图还是画一起更好,顺便也粗略的解释了一下核密度估计图
sns.pairplot(iris, hue="species", size=3, diag_kind="kde")
粗略的解释
Andrews Curves
Andrews Curves
大概意思是用二维的图表示多维的特征
andrews_curves(iris, "species",color=sns.color_palette())
parallel_coordinates(iris, "species",color=sns.color_palette())
雷达图
这个有点神奇,触及了我的知识盲区……
radviz(iris, 'species',None,color=sns.color_palette())