zoukankan      html  css  js  c++  java
  • Deep_into_iris

    具体ipynb文件请移步Github
    #各种所需要的库函数首先加载
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sb
    import warnings
    warnings.filterwarnings('ignore')
    %matplotlib inline
    
    # Part 1.iris深入认识
    
    ### 这是什么数据,加载后请分析?
    
    iris=pd.read_csv('data/iris-data.csv')
    iris.head()
    
    iris.shape
    
    iris.columns.tolist()
    
    iris.count()
    
    iris.info()
    
    iris.describe()
    
    iris.isnull().sum()
    
    #又是class列名惹的祸
    iris.rename(columns={'class':'species'},inplace=True)
    iris['species'].value_counts()
    
    #### 初步探索:
    #数据共有150行数据,每行5列;
    #前4列为两个二元组,即花萼长宽、花瓣长宽;
    #第五列为花的种类,由于列名不一致,所以列出了5中,但只有三种。
    #空值数据为petal_width_cm,有5个空值
    #类别名称不要用class,命名产生冲突
    
    ### 解决第一步遇到的问题
    #1.解决类名不一致
    #2.解决空值
    
    #### 以上发现了类名有问题,即列名不一致。
    #某列的名字需要改:data_df.rename(columns={'class':'Species'},inplace=True)
    #某列中的类别需要改:data_df['Species'].replace(['versicolor','Iris-setossa'],['Iris-versicolor','Iris-setosa'],inplace=True)
    
    iris['species'].replace(['versicolor','Iris-setossa'],['Iris-versicolor','Iris-setosa'],inplace=True)
    iris['species'].value_counts()
    
    #### 解决空值问题,由于空值少,所以可以用均值填充,如果缺失值太多,那么可以剔除,但要保留数据到备份。
    #### 特别注意,空值是属于哪一类的,不要拿所有类的均值填充!!!
    #### pd.loc是用[], excuse me ?
    
    #average=iris['petal_width_cm'].mean()#skipna : boolean, default True
    #iris['petal_width_cm'].fillna(average)
    iris.isnull().sum()
    df_part=iris[iris['petal_width_cm'].isnull()==True]
    df_part
    #注意到空值的所有数据都是Iris-setosa的数据,所以用这个数据填充
    average=iris.loc[iris['species']=='Iris-setosa','petal_width_cm' ].mean()
    iris.loc[(iris['species']=='Iris-setosa') & (iris['petal_width_cm'].isnull()),'petal_width_cm']
    
    iris.loc[(iris['species']=='Iris-setosa') & (iris['petal_width_cm'].isnull()),'petal_width_cm']=average
    iris.isnull().sum()
    
    # Part 2.各种图表分析
    
    sb.pairplot(iris,hue='species')
    
    #### seaborn的二元plot绘图很好用,两两组合,对角线是hist图表。
    #### 以上观察第一列的黄点和第二列观察到蓝色是离群点。再用柱状图进一步分析:
    #### 以下发现Iris-versicolor中的  sepal_length_cm有问题
    
    iris[iris['species']=='Iris-versicolor'].hist()
    
    iris[iris['sepal_length_cm']<2.5]
    
    iris.loc[(iris['species']=='Iris-versicolor') & (iris['sepal_length_cm']>2.5), 'sepal_length_cm' ].mean()
    
    iris.loc[(iris['species']=='Iris-versicolor') & (iris['sepal_length_cm']<2.5), 'sepal_length_cm' ].mean()
    
    #### 对比发现,两种数据相差100倍,所以根据业务场景分析,应该是单位cm与 m 导致的错误,所以纠正数据而不是drop数据。
    #### 此处用到了 *=  的精髓, 将原来的数据扩大或缩小倍数
    
    iris.loc[(iris['species']=='Iris-versicolor') & (iris['sepal_length_cm']<2.5), 'sepal_length_cm' ] *=100
    
    #### 接下来观察蓝色离群点,即Iris-setosa,绘制以下图表后发现:
    #### 其sepal_width_cm异常
    
    iris.loc[iris['species']=='Iris-setosa','sepal_width_cm'].hist()
    
    iris.loc[(iris['species']=='Iris-setosa') & (iris['sepal_width_cm']<2.5)]
    
    iris.loc[(iris['species']=='Iris-setosa') & (iris['sepal_width_cm']>2.5),'sepal_width_cm'].describe()
    
    (2.9-2.3)/2.3
    (3.44-2.3)/3.44
    
    #就该异常点来看:(2.9-2.3)%2.3=0.26086956521739135,
    #它本身就离群中心较远,而且比离他最近的都小了较大的一部分。由于没有具体场景分析调整,所以drop掉
    
    iris = iris.loc[(iris['species'] != 'Iris-setosa') | (iris['sepal_width_cm'] >= 2.5)]
    iris.loc[iris['species'] == 'Iris-setosa', 'sepal_width_cm'].hist()
    ;
    
    sb.pairplot(iris,hue='species')
    
    #### 清洗完数据后就可以保存干净的数据到新的csv文件中了。
    
    iris.to_csv('iris-data-clean.csv', index=False)
    iris_data_clean = pd.read_csv('iris-data-clean.csv')
    
    ## Testing our data
    
    # We know that we should only have three classes
    assert len(iris_data_clean['species'].unique()) == 3
    
    # We know that sepal lengths for 'Iris-versicolor' should never be below 2.5 cm
    assert iris_data_clean.loc[iris_data_clean['species'] == 'Iris-versicolor', 'sepal_length_cm'].min() >= 2.5
    
    # We know that our data set should have no missing measurements
    assert len(iris_data_clean.loc[(iris_data_clean['sepal_length_cm'].isnull()) |
                                   (iris_data_clean['sepal_width_cm'].isnull()) |
                                   (iris_data_clean['petal_length_cm'].isnull()) |
                                   (iris_data_clean['petal_width_cm'].isnull())]) == 0
    
    sb.pairplot(iris_data_clean)#没有 hue参数,所以全都是一类,都是同一颜色
    ;
    
    sb.pairplot(iris_data_clean,hue='species')
    ;
    
    花瓣的尺寸可以很容易地区分Iris-setosa和其他类型的鸢尾。鉴于Iris-versicolor和鸢尾-virginica的测量值有多少重叠,区分它们将变得更加困难。 花瓣长度和花瓣宽度,以及萼片长度和萼片宽度之间也存在相关性。 田野生物学家向我们保证,这是可以预料的:花瓣越长,往往越宽,萼片也一样。 我们也可以把数据绘制成小提琴图来比较各个班级的测量分布。
    
    plt.figure(figsize=(10, 10))
    
    for column_index, column in enumerate(iris_data_clean.columns):
        
        if column == 'species':
            continue
            
        #print('column_index=',column_index) column_index是0序
        plt.subplot(2, 2, column_index + 1)
        sb.violinplot(x='species', y=column, data=iris_data_clean)
  • 相关阅读:
    Android 修改应用程序字体
    Activity A 跳转到Activity B 生命周期
    Android调用系统设置
    最近遇到adb connection 问题,总结一下
    今日写一篇散文 Textview settext 方法不能放入 int 参数 不然报错!
    计时线程Runnable和Handler的结合
    JMF 下载安装与测试 测试成功
    基本数据类型的介绍及转换,基本数据类型与字符串之间转换,字符串与字符数组之间转换以及字符串与字节数组之间转换
    超实用的Eclipse快捷键大全(解密为什么他们的代码写的又快又好~)
    JDK的下载、安装及Eclipse安装详细教程(内附:网盘win64版JDK安装包)
  • 原文地址:https://www.cnblogs.com/the-wolf-sky/p/10309507.html
Copyright © 2011-2022 走看看