python计算iris数据集的均值_Iris数据集实战
本次主要圍繞Iris數(shù)據(jù)集進(jìn)行一個簡單的數(shù)據(jù)分析, 另外在數(shù)據(jù)的可視化部分進(jìn)行了重點介紹.
環(huán)境
win8, python3.7, jupyter notebook
目錄
正文
1. 項目背景
鳶尾屬(拉丁學(xué)名:Iris L.), 單子葉植物綱, 鳶尾科多年生草本植物, 開的花大而美麗, 觀賞價值很高. 鳶尾屬約300種, Iris數(shù)據(jù)集中包含了其中的三種:?山鳶尾(Setosa),??雜色鳶尾(Versicolour),?維吉尼亞鳶尾(Virginica), 每種50個數(shù)據(jù), 共含150個數(shù)據(jù). 在每個數(shù)據(jù)包含四個屬性:?花萼長度,花萼寬度,花瓣長度,花瓣寬度, 可通過這四個屬性預(yù)測鳶尾花卉屬于 (山鳶尾, 雜色鳶尾, 維吉尼亞鳶尾) 哪一類.
2. 數(shù)據(jù)概覽
數(shù)據(jù)來源: https://www.kaggle.com/benhamner/python-data-visualizations/data
2.1 讀取數(shù)據(jù)
數(shù)據(jù)為csv文件, 讀取數(shù)據(jù):
importpandas as pd
df_Iris= pd.read_csv('Iris.csv')
2.2 查看前/后5行數(shù)據(jù)
#前5行
df_Iris.head()#后5行
df_Iris.tail()
通過這10行數(shù)據(jù)也就大致確定數(shù)據(jù)維度150行X6列以及各特征內(nèi)的基本信息:
Id: 鳶尾花編號
SepaLengthCm:?花萼長度, 單位cm
SepalWidthCm:?花萼寬度, 單位cm
PetalLengthCm:?花瓣長度, 單位cm
PetalWidthCm;?花瓣寬度, 單位cm
Species: 鳶尾花種類.
2.3 查看數(shù)據(jù)整體信息
#查看數(shù)據(jù)整體信息
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位浮點數(shù), 1個64位整型, 1個python對象, 數(shù)據(jù)中無缺失值.
2.4 描述性統(tǒng)計
df_Iris.describe()
花萼長度最小值4.30, 最大值7.90, 均值5.84, 中位數(shù)5.80, 右偏
花萼寬度最小值2.00, 最大值4.40, 均值3.05, 中位數(shù)3.00, 右偏
花瓣長度最小值1.00, 最大值6.90, 均值3.76, 中位數(shù)4.35, 左偏
花瓣寬度最小值0.10, 最大值2.50, 均值1.20, 中位數(shù)1.30, 左偏
按中位數(shù)來度量: 花萼長度 > 花瓣長度 > 花萼寬度 > 花瓣寬度
#注意這里是大寫的字母O, 不是數(shù)字0.
df_Iris.describe(include =['O']).T
總數(shù)150, 3個種類, 最大頻數(shù)為50, 也就是每種都為50個. 注意top里的指的不是Iris-versicolor最多, 是在頻數(shù)相同的基礎(chǔ)上按照字符串長度進(jìn)行排名.
可以通過這樣對每種進(jìn)行計數(shù):
df_Iris.Species.value_counts()
Iris-versicolor 50
Iris-virginica 50
Iris-setosa 50
Name: Species, dtype: int64
通過以上, 大致了解數(shù)據(jù)的基本信息, 現(xiàn)想把Species特征中的'Iris-'字符去掉, 進(jìn)入特征工程環(huán)節(jié).
3. 特征工程
3.1 數(shù)據(jù)清洗
去掉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 數(shù)據(jù)可視化
Seaborn是一個python的可視化庫, 它基于matplotlib, 這使得它能與pandas緊密結(jié)合, 并且提供了高級繪圖界面, 能更方便地完成探索性分析.
我想在這個項目上對seaborn多加練習(xí), 因此, 會對這部分內(nèi)容著重介紹.
3.2.1 relplot
importseaborn as snsimportmatplotlib.pyplot as plt#sns初始化
sns.set()#設(shè)置散點圖x軸與y軸以及data參數(shù)
sns.relplot(x='SepalLengthCm', y='SepalWidthCm', data =df_Iris)
plt.title('SepalLengthCm and SepalWidthCm data analysize')
花萼的長度和寬度在散點圖上分了兩個簇, 而且兩者各自都有一定的關(guān)系. 鳶尾花又分為三個品種, 不妨看看關(guān)于這三個品種的分布.
#hue表示按照Species對數(shù)據(jù)進(jìn)行分類, 而style表示每個類別的標(biāo)簽系列格式不一致.
sns.relplot(x='SepalLengthCm', y='SepalWidthCm', hue='Species', style='Species', data=df_Iris )
plt.title('SepalLengthCm and SepalWidthCm data by Species')
可以看到setosa這種花的花萼長度和寬度有明顯的線性關(guān)系, 當(dāng)然其他兩種也存在一定的關(guān)系, 花萼的屬性看完了, 看下花瓣的:
#花瓣長度與寬度分布散點圖
sns.relplot(x='PetalLengthCm', y='PetalWidthCm', hue='Species', style='Species', data=df_Iris )
plt.title('PetalLengthCm and PetalWidthCm data by Species')
花的品種和花瓣的長度, 寬度之間存在一定的關(guān)系.
另外, 還可以對比花萼與花瓣的長度, 花萼與花瓣的寬度之間的關(guān)系.
#花萼與花瓣長度分布散點圖#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')
花萼的長度與花瓣的寬度, 花萼的寬度與花瓣的長度之間應(yīng)當(dāng)也存在某種關(guān)系:
#花萼的長度與花瓣的寬度分布散點圖#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編號與花萼長度, 花萼寬度, 花瓣長度, 花瓣寬度之間有沒有關(guān)系呢:
#花萼長度與Id之間關(guān)系圖
sns.relplot(x="Id", y="SepalLengthCm",hue="Species", style="Species",kind="line", data=df_Iris)
plt.title('SepalLengthCm and Id data analysize')#花萼寬度與Id之間關(guān)系圖
sns.relplot(x="Id", y="SepalWidthCm",hue="Species", style="Species",kind="line", data=df_Iris)
plt.title('SepalWidthCm and Id data analysize')#花瓣長度與Id之間關(guān)系圖
sns.relplot(x="Id", y="PetalLengthCm",hue="Species", style="Species",kind="line", data=df_Iris)
plt.title('PetalLengthCm and Id data analysize')#花瓣寬度與Id之間關(guān)系圖
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, 以及每個種類對應(yīng)屬性值的范圍, 每個種類中的屬性與其對應(yīng)的Id沒有明確的關(guān)系.
3.2.2 jointplot
sns.jointplot(x='SepalLengthCm', y='SepalWidthCm', data=df_Iris)
sns.jointplot(x='PetalLengthCm', y='PetalWidthCm', data=df_Iris)
散點圖和直方圖同時顯示, 可以直觀地看出哪組頻數(shù)最大, 哪組頻數(shù)最小.
對于頻數(shù)的值, 在散點圖上數(shù)點的話, 顯然效率太低, 還易出錯, 下面引出distplot
3.2.3 distplot
#繪制直方圖, 其中kde=False表示不顯示核函數(shù)估計圖,這里為了更方便去查看頻數(shù)而設(shè)置它為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里的組數(shù)進(jìn)行設(shè)置, 現(xiàn)在就很直觀地看到各組對應(yīng)的頻數(shù)
前面我們已經(jīng)通過describe()方法計算出四個屬性所對應(yīng)的四分位數(shù), 最大值以及最小值等統(tǒng)計量. 這些均是以表格的形式展示, 我們下面就介紹怎么以圖樣的形式展示四分位數(shù).
3.2.4 boxplot
boxplot所繪制的就是箱線圖,?它能顯示出一組數(shù)據(jù)的最大值, 最小值, 四分位數(shù)以及異常點.
對于異常點的定義: 區(qū)間[Q1-1.5IQR, Q3+1.5IQR]之外的點, 其中Q1下四分位數(shù)(25%), Q3上四分位數(shù)(75%), IQR=Q3-Q1
在seaborn.boxplot中, 箱線圖的畫法分兩種情況
如果數(shù)據(jù)中無異常點, 那么箱線圖的下邊緣就是數(shù)據(jù)中的最小值, 上邊緣就是數(shù)據(jù)中的最大值, 即下圖的實線部分(虛線以及紅點部分不會顯示)
如果數(shù)據(jù)中有異常點, 那么箱線圖的下邊緣Limit1指的是區(qū)間[Q1-1.5IQR, Q3+1.5IQR]內(nèi)的最小值, 上邊緣Limit2指的是區(qū)間內(nèi)的最大值, 即下圖的實線部分(虛線以及紅點部分不會顯示)
#比如數(shù)據(jù)中的SepalLengthCm屬性
sns.boxplot(x='SepalLengthCm', data=df_Iris)#比如數(shù)據(jù)中的SepalWidthCm屬性
sns.boxplot(x='SepalWidthCm', data=df_Iris)
為了更直觀地對比四個屬性之間的關(guān)系, 我將四個屬性對應(yīng)的數(shù)值合并在新的DataFrame Iris中.
#對于每個屬性的data創(chuàng)建一個新的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)
對下圖做一下簡單分析: 就中位數(shù)來說, SepalLenthCm > PetalLengthCm > SepalWidthCm > PetalWidthCm; 就波動程度來說, PetalLengthCm > PetalWidthCm > SepalLengthCm > SepalWidthCm; 就異常值來說, 只有SepalWidthCm中存在異常值.
將鳶尾花的三種種類再加入到箱線圖中:
sns.boxplot(x='Attribute', y='Data',hue='Species', data=Iris)
這樣就很容易能夠?qū)Ρ热齻€種類在四個屬性中的表現(xiàn)狀況:
除了SepalWidthCm屬性外, 中位數(shù)在其他屬性的三種花中均表現(xiàn)為:?Virginica >?versicolour >??setosa
除了setosa種類外, 中位數(shù)在其他種類的四個屬性中均表現(xiàn)為:?SepalLengthCm >?PetalLengthCm > SepalWidthCm >?PetalWidthCm
下面將介紹一種更高級的四分位數(shù)展示方式: violinplot
3.2.5?violinplot
violinplot繪制的是琴圖, 是箱線圖與核密度圖的結(jié)合體, 既可以展示四分位數(shù), 又可以展示任意位置的密度.
sns.violinplot(x='Attribute', y='Data', hue='Species', data=Iris )
上圖中具體細(xì)節(jié)顯示不是很明顯, 對于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')
可以明顯看出, 琴圖中的白點就是中位數(shù), 黑色矩形的上短邊則是上四分位數(shù)Q3, 黑色下短邊則是下四分位數(shù)Q1;? 而貫穿矩形的黑線的上端點則代表最小非異常值, 下端點則代表最大非異常值; 黑色矩形外部形狀則表示核概率密度估計.
最后介紹一種圖形, 它能直接顯示各個特征之間的不同關(guān)系
3.2.6 pairplot
#刪除Id特征, 繪制分布圖
sns.pairplot(df_Iris.drop('Id', axis=1), hue='Species')#保存圖片, 由于在jupyter notebook中太大, 不能一次截圖
plt.savefig('pairplot.png')
plt.show()
綜上, 花萼的長度, 花萼的寬度, 花瓣的長度, 花瓣的寬度與花的種類之間均存在一定的相關(guān)性, 且對于這三個種類的分布, satosa在任何一種分布中較其他兩者集中; 就同一種花的平均水平來看, 其花萼的長度最長, 花瓣的寬度最短; 就同一屬性的平均水平來看, 三種花在除了花萼的寬度外的屬性中平均水平均表現(xiàn)為: Virginica >?versicolour >??setosa.
4. 構(gòu)建模型
采用決策樹分類算法.
from sklearn.model_selection importtrain_test_splitfrom sklearn.tree importDecisionTreeClassifier
X= df_Iris[['SepalLengthCm','SepalWidthCm','PetalLengthCm','PetalWidthCm']]
y= df_Iris['Species']#將數(shù)據(jù)按照8:2的比例隨機(jī)分為訓(xùn)練集, 測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)#初始化決策樹模型
dt =DecisionTreeClassifier()#訓(xùn)練模型
dt.fit(X_train, y_train)#用測試集評估模型的好壞
dt.score(X_test, y_test)
0.9666666666666667
在測試集上準(zhǔn)確率達(dá)到97%,也還不錯, 此次沒有對決策樹模型設(shè)置參數(shù), 如果參數(shù)設(shè)置好了, 想必準(zhǔn)確率會更高.
參考:
總結(jié)
以上是生活随笔為你收集整理的python计算iris数据集的均值_Iris数据集实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: server2008 mysql数据库病
- 下一篇: CAN总线很难吗?CAN总线看不懂是不可