Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待

4999元包邮

去购买 >

本次主要围绕Iris数据集进行一个简单的数据分析, 另外在数据的可视化部分进行了重点介绍.

环境

win8, python3.7, jupyter notebook

正文

1. 项目背景

鸢尾属(拉丁学名:Iris L.), 单子叶植物纲, 鸢尾科多年生草本植物, 开的花大而美丽, 观赏价值很高. 鸢尾属约300种, Iris数据集中包含了其中的三种: 山鸢尾(Setosa), 杂色鸢尾(Versicolour), 维吉尼亚鸢尾(Virginica), 每种50个数据, 共含150个数据. 在每个数据包含四个属性: 花萼长度,花萼宽度,花瓣长度,花瓣宽度, 可通过这四个属性预测鸢尾花卉属于 (山鸢尾, 杂色鸢尾, 维吉尼亚鸢尾) 哪一类.

2. 数据概览

数据来源: https://www.kaggle.com/benhamner/python-data-visualizations/data

2.1 读取数据

数据为csv文件, 读取数据:

importpandas as pd

df_Iris= pd.read_csv('Iris.csv')

2.2 查看前/后5行数据

#前5行

df_Iris.head()#后5行

df_Iris.tail()

通过这10行数据也就大致确定数据维度150行X6列以及各特征内的基本信息:

Id: 鸢尾花编号

SepaLengthCm: 花萼长度, 单位cm

SepalWidthCm: 花萼宽度, 单位cm

PetalLengthCm: 花瓣长度, 单位cm

PetalWidthCm; 花瓣宽度, 单位cm

Species: 鸢尾花种类.

2.3 查看数据整体信息

#查看数据整体信息

df_Iris.info()

RangeIndex: 150 entries, 0 to 149

Data columns (total 6 columns):

Id 150 non-null int64

SepalLengthCm 150 non-null float64

SepalWidthCm 150 non-null float64

PetalLengthCm 150 non-null float64

PetalWidthCm 150 non-null float64

Species 150 non-null object

dtypes: float64(4), int64(1), object(1)

memory usage: 7.1+ KB

得出信息: 150行, 6列,4个64位浮点数, 1个64位整型, 1个python对象, 数据中无缺失值.

2.4 描述性统计

df_Iris.describe()

花萼长度最小值4.30, 最大值7.90, 均值5.84, 中位数5.80, 右偏

花萼宽度最小值2.00, 最大值4.40, 均值3.05, 中位数3.00, 右偏

花瓣长度最小值1.00, 最大值6.90, 均值3.76, 中位数4.35, 左偏

花瓣宽度最小值0.10, 最大值2.50, 均值1.20, 中位数1.30, 左偏

按中位数来度量: 花萼长度 > 花瓣长度 > 花萼宽度 > 花瓣宽度

#注意这里是大写的字母O, 不是数字0.

df_Iris.describe(include =['O']).T

总数150, 3个种类, 最大频数为50, 也就是每种都为50个. 注意top里的指的不是Iris-versicolor最多, 是在频数相同的基础上按照字符串长度进行排名.

可以通过这样对每种进行计数:

df_Iris.Species.value_counts()

Iris-versicolor 50

Iris-virginica 50

Iris-setosa 50

Name: Species, dtype: int64

通过以上, 大致了解数据的基本信息, 现想把Species特征中的'Iris-'字符去掉, 进入特征工程环节.

3. 特征工程

3.1 数据清洗

去掉Species特征中的'Iris-'字符.

#第一种方法: 替换#df_Iris['Species']= df_Iris.Species.str.replace('Iris-','')#第二种方法: 分割

df_Iris['Species']= df_Iris.Species.apply(lambda x: x.split('-')[1])

df_Iris.Species.unique()

array(['setosa', 'versicolor', 'virginica'], dtype=object)

3.2 数据可视化

Seaborn是一个python的可视化库, 它基于matplotlib, 这使得它能与pandas紧密结合, 并且提供了高级绘图界面, 能更方便地完成探索性分析.

我想在这个项目上对seaborn多加练习, 因此, 会对这部分内容着重介绍.

3.2.1 relplot

importseaborn as snsimportmatplotlib.pyplot as plt#sns初始化

sns.set()#设置散点图x轴与y轴以及data参数

sns.relplot(x='SepalLengthCm', y='SepalWidthCm', data =df_Iris)

plt.title('SepalLengthCm and SepalWidthCm data analysize')

花萼的长度和宽度在散点图上分了两个簇, 而且两者各自都有一定的关系. 鸢尾花又分为三个品种, 不妨看看关于这三个品种的分布.

#hue表示按照Species对数据进行分类, 而style表示每个类别的标签系列格式不一致.

sns.relplot(x='SepalLengthCm', y='SepalWidthCm', hue='Species', style='Species', data=df_Iris )

plt.title('SepalLengthCm and SepalWidthCm data by Species')

可以看到setosa这种花的花萼长度和宽度有明显的线性关系, 当然其他两种也存在一定的关系, 花萼的属性看完了, 看下花瓣的:

#花瓣长度与宽度分布散点图

sns.relplot(x='PetalLengthCm', y='PetalWidthCm', hue='Species', style='Species', data=df_Iris )

plt.title('PetalLengthCm and PetalWidthCm data by Species')

花的品种和花瓣的长度, 宽度之间存在一定的关系.

另外, 还可以对比花萼与花瓣的长度, 花萼与花瓣的宽度之间的关系.

#花萼与花瓣长度分布散点图#sns.relplot(x='SepalLengthCm', y='PetalLengthCm', hue='Species', style='Species', data=df_Iris )#plt.title('SepalLengthCm and PetalLengthCm data by Species')#花萼与花瓣宽度分布散点图

sns.relplot(x='SepalWidthCm', y='PetalWidthCm', hue='Species', style='Species', data=df_Iris )

plt.title('SepalWidthCm and PetalWidthCm data by Species')

花萼的长度与花瓣的宽度, 花萼的宽度与花瓣的长度之间应当也存在某种关系:

#花萼的长度与花瓣的宽度分布散点图#sns.relplot(x='SepalLengthCm', y='PetalWidthCm', hue='Species', style='Species', data=df_Iris )#plt.title('SepalLengthCm and PetalWidthCm data by Species')#花萼的宽度与花瓣的长度分布散点图

sns.relplot(x='SepalWidthCm', y='PetalLengthCm', hue='Species', style='Species', data=df_Iris )

plt.title('SepalWidthCm and PetalLengthCm data by Species')

Id编号与花萼长度, 花萼宽度, 花瓣长度, 花瓣宽度之间有没有关系呢:

#花萼长度与Id之间关系图

sns.relplot(x="Id", y="SepalLengthCm",hue="Species", style="Species",kind="line", data=df_Iris)

plt.title('SepalLengthCm and Id data analysize')#花萼宽度与Id之间关系图

sns.relplot(x="Id", y="SepalWidthCm",hue="Species", style="Species",kind="line", data=df_Iris)

plt.title('SepalWidthCm and Id data analysize')#花瓣长度与Id之间关系图

sns.relplot(x="Id", y="PetalLengthCm",hue="Species", style="Species",kind="line", data=df_Iris)

plt.title('PetalLengthCm and Id data analysize')#花瓣宽度与Id之间关系图

sns.relplot(x="Id", y="PetalWidthCm",hue="Species", style="Species",kind="line", data=df_Iris)

plt.title('PetalWidthCm and Id data analysize')

可以得到信息: Id中前50个为setosa, 51到100为versicolour, 101到150为Virginica, 以及每个种类对应属性值的范围, 每个种类中的属性与其对应的Id没有明确的关系.

3.2.2 jointplot

sns.jointplot(x='SepalLengthCm', y='SepalWidthCm', data=df_Iris)

sns.jointplot(x='PetalLengthCm', y='PetalWidthCm', data=df_Iris)

散点图和直方图同时显示, 可以直观地看出哪组频数最大, 哪组频数最小.

对于频数的值, 在散点图上数点的话, 显然效率太低, 还易出错, 下面引出distplot

3.2.3 distplot

#绘制直方图, 其中kde=False表示不显示核函数估计图,这里为了更方便去查看频数而设置它为False.#sns.distplot(df_Iris.SepalLengthCm,bins=8, hist=True, kde=False)#sns.distplot(df_Iris.SepalWidthCm,bins=13, hist=True, kde=False)#sns.distplot(df_Iris.PetalLengthCm, bins=5, hist=True, kde=False)

sns.distplot(df_Iris.PetalWidthCm, bins=5, hist=True, kde=False)

我这里的分组是按照上面jointplot里的组数进行设置, 现在就很直观地看到各组对应的频数

前面我们已经通过describe()方法计算出四个属性所对应的四分位数, 最大值以及最小值等统计量. 这些均是以表格的形式展示, 我们下面就介绍怎么以图样的形式展示四分位数.

3.2.4 boxplot

boxplot所绘制的就是箱线图, 它能显示出一组数据的最大值, 最小值, 四分位数以及异常点.

对于异常点的定义: 区间[Q1-1.5IQR, Q3+1.5IQR]之外的点, 其中Q1下四分位数(25%), Q3上四分位数(75%), IQR=Q3-Q1

在seaborn.boxplot中, 箱线图的画法分两种情况

如果数据中无异常点, 那么箱线图的下边缘就是数据中的最小值, 上边缘就是数据中的最大值, 即下图的实线部分(虚线以及红点部分不会显示)

如果数据中有异常点, 那么箱线图的下边缘Limit1指的是区间[Q1-1.5IQR, Q3+1.5IQR]内的最小值, 上边缘Limit2指的是区间内的最大值, 即下图的实线部分(虚线以及红点部分不会显示)

#比如数据中的SepalLengthCm属性

sns.boxplot(x='SepalLengthCm', data=df_Iris)#比如数据中的SepalWidthCm属性

sns.boxplot(x='SepalWidthCm', data=df_Iris)

为了更直观地对比四个属性之间的关系, 我将四个属性对应的数值合并在新的DataFrame Iris中.

#对于每个属性的data创建一个新的DataFrame

Iris1 = pd.DataFrame({"Id": np.arange(1,151), 'Attribute': 'SepalLengthCm', 'Data':df_Iris.SepalLengthCm, 'Species':df_Iris.Species})

Iris2= pd.DataFrame({"Id": np.arange(151,301), 'Attribute': 'SepalWidthCm', 'Data':df_Iris.SepalWidthCm, 'Species':df_Iris.Species})

Iris3= pd.DataFrame({"Id": np.arange(301,451), 'Attribute': 'PetalLengthCm', 'Data':df_Iris.PetalLengthCm, 'Species':df_Iris.Species})

Iris4= pd.DataFrame({"Id": np.arange(451,601), 'Attribute': 'PetalWidthCm', 'Data':df_Iris.PetalWidthCm, 'Species':df_Iris.Species})#将四个DataFrame合并为一个.

Iris =pd.concat([Iris1, Iris2, Iris3, Iris4])#绘制箱线图

sns.boxplot(x='Attribute', y='Data', data=Iris)

对下图做一下简单分析: 就中位数来说, SepalLenthCm > PetalLengthCm > SepalWidthCm > PetalWidthCm; 就波动程度来说, PetalLengthCm > PetalWidthCm > SepalLengthCm > SepalWidthCm; 就异常值来说, 只有SepalWidthCm中存在异常值.

将鸢尾花的三种种类再加入到箱线图中:

sns.boxplot(x='Attribute', y='Data',hue='Species', data=Iris)

这样就很容易能够对比三个种类在四个属性中的表现状况:

除了SepalWidthCm属性外, 中位数在其他属性的三种花中均表现为: Virginica > versicolour > setosa

除了setosa种类外, 中位数在其他种类的四个属性中均表现为: SepalLengthCm > PetalLengthCm > SepalWidthCm > PetalWidthCm

下面将介绍一种更高级的四分位数展示方式: violinplot

3.2.5 violinplot

violinplot绘制的是琴图, 是箱线图与核密度图的结合体, 既可以展示四分位数, 又可以展示任意位置的密度.

sns.violinplot(x='Attribute', y='Data', hue='Species', data=Iris )

上图中具体细节显示不是很明显, 对于PetalWidthCm都有些模糊了, 下面将拆分成四个小图, 另外为了和箱线图对比, 将箱线图也绘制出来.

#花萼长度#sns.boxplot(x='Species', y='SepalLengthCm', data=df_Iris)#sns.violinplot(x='Species', y='SepalLengthCm', data=df_Iris)#plt.title('SepalLengthCm data by Species')#花萼宽度#sns.boxplot(x='Species', y='SepalWidthCm', data=df_Iris)#sns.violinplot(x='Species', y='SepalWidthCm', data=df_Iris)#plt.title('SepalWidthCm data by Species')#花瓣长度#sns.boxplot(x='Species', y='PetalLengthCm', data=df_Iris)#sns.violinplot(x='Species', y='PetalLengthCm', data=df_Iris)#plt.title('PetalLengthCm data by Species')#花瓣宽度

sns.boxplot(x='Species', y='PetalWidthCm', data=df_Iris)

sns.violinplot(x='Species', y='PetalWidthCm', data=df_Iris)

plt.title('PetalWidthCm data by Species')

可以明显看出, 琴图中的白点就是中位数, 黑色矩形的上短边则是上四分位数Q3, 黑色下短边则是下四分位数Q1; 而贯穿矩形的黑线的上端点则代表最小非异常值, 下端点则代表最大非异常值; 黑色矩形外部形状则表示核概率密度估计.

最后介绍一种图形, 它能直接显示各个特征之间的不同关系

3.2.6 pairplot

#删除Id特征, 绘制分布图

sns.pairplot(df_Iris.drop('Id', axis=1), hue='Species')#保存图片, 由于在jupyter notebook中太大, 不能一次截图

plt.savefig('pairplot.png')

plt.show()

综上, 花萼的长度, 花萼的宽度, 花瓣的长度, 花瓣的宽度与花的种类之间均存在一定的相关性, 且对于这三个种类的分布, satosa在任何一种分布中较其他两者集中; 就同一种花的平均水平来看, 其花萼的长度最长, 花瓣的宽度最短; 就同一属性的平均水平来看, 三种花在除了花萼的宽度外的属性中平均水平均表现为: Virginica > versicolour > setosa.

4. 构建模型

采用决策树分类算法.

from sklearn.model_selection importtrain_test_splitfrom sklearn.tree importDecisionTreeClassifier

X= df_Iris[['SepalLengthCm','SepalWidthCm','PetalLengthCm','PetalWidthCm']]

y= df_Iris['Species']#将数据按照8:2的比例随机分为训练集, 测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)#初始化决策树模型

dt =DecisionTreeClassifier()#训练模型

dt.fit(X_train, y_train)#用测试集评估模型的好坏

dt.score(X_test, y_test)

0.9666666666666667

在测试集上准确率达到97%,也还不错, 此次没有对决策树模型设置参数, 如果参数设置好了, 想必准确率会更高.

参考:

https://www.kaggle.com/benhamner/python-data-visualizations/notebook

原文链接:https://www.cnblogs.com/star-zhao/p/9847082.html

python数据统计_Python数据分析--Iris数据集实战相关推荐

  1. python 股票数据挖掘_python数据分析之股票实战

    原标题:python数据分析之股票实战 数据挖掘入门与实战 公众号: datadw 对于股票的研究我想,无论是专业人士还是非专业人士都对其垂涎已久,因为我们都有赌徒的心态,我们都希望不花太多的时间但是 ...

  2. python数据分析软件_Python数据分析工具

    Numpy Python没有提供数组功能,虽然列表可以完成基本的数组功能,但他不是真正的数组.Numpy内置函数处理速度是c语言级别,因此尽量使用内置函数,避免出现效率瓶颈的现象. Numpy的安装: ...

  3. python 数据归一化_python 实现对数据集的归一化的方法(0-1之间)

    python 实现对数据集的归一化的方法(0-1之间) 多数情况下,需要对数据集进行归一化处理,再对数据进行分析 #首先,引入两个库 ,numpy,sklearn from sklearn.prepr ...

  4. python人口统计_python数据分析实例-人口统计折线图

    一.前言 最近一直在学python数据科学的相关课程,主要看了<数据科学入门>这本动物书,但这本书是真的只入个门,把数据科学相关的各方面知识介绍了一下,真的只是介绍了一下,想要系统地学习还 ...

  5. python分组统计_python数据分析8:数据分组统计

    1.根据给定的条件将数据拆分成组 2.每个组都可以独立应用函数(如求和,求平均值) 3.将结果合并到一个数据结构中 DataFrame.groupby(by=None,axis=0,level=Non ...

  6. python数据预处理_Python数据分析——数据预处理的方法

    前言 1. 关于数据集 数据来源:日月光华老师的<Python数据分析从入门到机器学习>的 lianjia 数据. 数据概况: cjtaoshu:成交套数 mendian:门店 cjzon ...

  7. python数据分析图_Python数据分析:手把手教你用Pandas生成可视化图表的教程

    大家都知道,Matplotlib 是众多 Python 可视化包的鼻祖,也是Python最常用的标准可视化库,其功能非常强大,同时也非常复杂,想要搞明白并非易事.但自从Python进入3.0时代以后, ...

  8. python数据挖掘教材_Python数据分析与挖掘实战

    领取成功 您已领取成功! 您可以进入Android/iOS/Kindle平台的多看阅读客户端,刷新个人中心的已购列表,即可下载图书,享受精品阅读时光啦! - | 回复不要太快哦~ 回复内容不能为空哦 ...

  9. Python预测之美 数据分析与算法实战(一)

    Python预测之美 数据分析与算法实战 声明:本文旨在对这本书进行简单的整理,列出大致得内容框架,不做具体而又深入的分析.想要深入了解的小伙伴们,自行解决吧. 第一篇 预测入门 第二篇 预测算法 第 ...

最新文章

  1. SVN服务器搭建--Subversio与TortoiseSVN的配置安装
  2. idea 设置单行注释样式(不在行首注释)
  3. Questasim10.6c下载与安装教程
  4. 如何成为一个合格的算法工程师?这对你来说也许并不是很困难
  5. 内存泄漏快速定位方法
  6. java绘制半透明图片_如何使绘制的图像在Java中透明
  7. #3120. 「CTS2019 | CTSC2019」珍珠
  8. 面试—每日一题(4)
  9. 何钦铭c语言程序设计第三版课本,C语言程序设计(第3版)
  10. 去掉高德api上的logo图标
  11. esp32的MQTT物联网开发记录
  12. 基于ASP.NET的助学贷款管理系统_WEB管理系统_SQLServer数据库应用
  13. csv excel 对比
  14. QtWebApp的使用【在Qt中搭建HTTP服务器】(一)
  15. 怎么开通附近小程序-微信小程序开发-视频教程20
  16. 角度前方交会点坐标计算完整步骤
  17. 抑郁症可以学计算机吗,AI能从人的话语中察觉到抑郁症吗?目前还为时过早
  18. 直播电商平台开发,点击让窗口抖动动画效果
  19. Linux查看DNS地址以及端口,nslookup命令以及更强大的dig命令
  20. linux安装xbox无线手柄,ROS配置和使用Xbox One无线手柄

热门文章

  1. vue-cli3搭建项目之webpack配置
  2. linux6.5能安装的firefox,CentOS 6.5 更新到最新firefox的方法
  3. Vue3.0中如何引入jQuery并使用
  4. Linux里etc没有passwd,Linux:没事莫动/etc/passwd文件!
  5. win10 卸载干净 docker
  6. 专访小米科技 VR 产品总监马杰思:VR 产品的迭代和技术瓶颈
  7. 转载:程序员面试→如何巧妙的谈薪资?
  8. Kafka、zookeeper集群一键启动、一键关闭
  9. myBase7试用到期 破解步骤
  10. 黑马程序员 骑士飞行棋源码