学过数据分析的朋友们肯定都知道鸢尾花数据集。作为一个简简单单只有 4 个特征的150 行数据,经常被拖出来在数据处理和聚类算法课上作为例子。
今天我们就再一次请出鸢尾花数据集,做数据可视化探索。
何为数据探索?
数据探索为什么还要用到可视化?
数据探索是数据分析的第一步,拿到一份数据,我们首先要去了解一下数据的基本分布特征、变量之间的相关性等等。通过探索分析,我们才能进一步的确定分析方向。即便是我们在拿到数据之前已经有了一个大致方向,数据探索这个步骤也是必不可少的,他能帮我们发现我们之前没有想到或者顾及到的一些细节问题。
探索就探索,为啥还要对这个过程进行可视化呢?
1. 首先,Python 为我们提供了非常多且便捷的可视化方案,基本上三两行代码便能实现;
2. 字不如图,如果看文字信息,比如说相关系数、平均值、分布方差等数据,我们并不一定能第一时间很直观的看出数据之间的关联;
3. 有图表更加方便我们展示,或者做报告。
话不多说上代码
# 导入一些我们我们需要使用到的库
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
# 读取鸢尾花数据集
data = load_iris()
# 将数据用 DataFrame 格式处理拼接
iris = np.concatenate([data.data,data.target.reshape(-1,1)],axis=1)
iris = pd.DataFrame(iris
,columns=['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)','tpye'])
# 展示数据
iris.head()
首先,把数据整理好后,我们用 head() 方法先看看前 5 行数据。整体数据记录整鸢尾花的花瓣长度、花瓣宽度、花萼长度、花萼宽度。并且在 type 标明了每条记录的鸢尾花类型。
0:setosa
1:versicolor
2:virginica
# 设置画布信息
plt.figure(figsize=(14,4)
,dpi=120)
# 提取字段列名
names = iris.columns.values.tolist()
# 循环画图
for i in np.arange(iris.shape[1]-1):
plt.subplot(1,4,i+1)
plt.hist(iris.iloc[:,i]
,bins=10
,color='k')
plt.title(np.array(names)[i])
# 设置画布信息
plt.figure(figsize=(14,4)
,dpi=120)
# 循环画图
for i in np.arange(iris.shape[1]-1):
plt.subplot(1,4,i+1)
plt.hist(iris.iloc[:,i]
,bins=20
,color='k')
plt.title(np.array(names)[i])
plt.show()
我们分别对四个特征值做了分布直方图,并且设置了 10 个分组和 20 个分组。
# 设置画布信息
plt.figure(figsize=(14,8)
,dpi=120)
# 整合每个箱子的数据
boxplot_dt = [iris.iloc[:,0],iris.iloc[:,1],iris.iloc[:,2],iris.iloc[:,3]]
# 绘制箱线图
plt.boxplot(boxplot_dt
,labels=('sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)'))
plt.show()
# 设置画布信息
plt.figure(figsize=(14,16)
,dpi=120)
# 获取不同类型数据列表
iris_name = ['Setosa','Versicolour','Virginica']
# 循环绘制箱线图
for i in np.arange(iris.iloc[:,-1].nunique()):
boxplot_dt1=iris[iris.iloc[:,-1]==i]
boxplot_dt1 = [boxplot_dt1.iloc[:,0],boxplot_dt1.iloc[:,1],boxplot_dt1.iloc[:,2],boxplot_dt1.iloc[:,3]]
plt.subplot(3,1,i+1)
plt.boxplot(boxplot_dt1
,labels=('sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)'))
plt.title(iris_name[i])
plt.show()
# 设置画布信息
plt.figure(figsize=(14,8)
,dpi=120)
for i in np.arange(iris.shape[1]-1):
plt.subplot(2,2,i+1)
sns.ecdfplot(iris.iloc[:,i])
经验累积分布图
熊猫寄语:祝大家也能写出如诗般的代码。下课!