用數據可視化直觀理解數據--iris數據集爲例

原文:https://www.kaggle.com/benhamner/d/uciml/iris/python-data-visualizations 
See Kaggle Datasets for other datasets to try visualizing. The World Food Facts data is an especially rich one for visualization.

完整版代碼,可直接下載:http://download.csdn.net/download/u013527419/9806632 
seaborn 庫的一些簡單用法,可以見:http://blog.csdn.net/longgb123/article/details/53228256 
裏面有幾篇文章是介紹這個庫的

比較常用的圖表有:

  • 查看目標變量的分佈。當分佈不平衡時,根據評分標準和具體模型的使用不同,可能會嚴重影響性能。 
    -iris[“Species”].value_counts()
  • 對 Numerical Variable,可以用 Box Plot 來直觀地查看它的分佈。 
    -sns.boxplot(x=”Species”, y=”PetalLengthCm”, data=iris)
  • 對於座標類數據,可以用 Scatter Plot 來查看它們的分佈趨勢和是否有離羣點的存在。 
    -iris.plot(kind=”scatter”, x=”SepalLengthCm”, y=”SepalWidthCm”) 
    -sns.jointplot(x=”SepalLengthCm”, y=”SepalWidthCm”, data=iris, size=5)
  • 對於分類問題,將數據根據 Label 的不同着不同的顏色繪製出來,這對 Feature 的構造很有幫助。 
    -sns.FacetGrid(iris,hue=”Species”,size=5).map(plt.scatter,”SepalLengthCm”,”SepalWidthCm”).add_legend()
  • 繪製變量之間兩兩的分佈和相關度圖表。 
    -sns.pairplot(iris, hue=”Species”, size=3) 
    -sns.pairplot(iris, hue=”Species”, size=3, diag_kind=”kde”)

詳細例子說明

# coding=utf-8
import pandas as pd
from sklearn.datasets import load_iris

# 載入seaborn,因爲載入時會有警告出現,因此先載入warnings,忽略警告。
import warnings 
warnings.filterwarnings("ignore")
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="white", color_codes=True)

iris = pd.DataFrame(load_iris().data)
iris.columns = ['SepalLengthCm','SepalWidthCm','PetalLengthCm','PetalWidthCm']
iris['Species'] = load_iris().target
# 首先探索一下數據集的大體情況,多少個樣本,每一個樣本多少個特徵等
print iris.shape
print iris.head()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

這裏寫圖片描述

# 探索一下是否爲均衡分類
# 分幾類?每一類多少個樣本?
# 可以從結果看出,很均勻。。。若爲不均衡分類,則可參照此文https://www.svds.com/learning-imbalanced-classes/進行處理。
print iris["Species"].value_counts()
  • 1
  • 2
  • 3
  • 4

這裏寫圖片描述

# plot是畫圖的最主要方法,Series和DataFrame都有plot方法。
# plot默認生成是曲線圖,你可以通過kind參數生成其他的圖形,可選的值爲:line, bar(柱狀圖), barh, 
# kde, density, scatter(散點圖)。
# 對於座標類數據,可以用 Scatter Plot 來查看它們的分佈趨勢和是否有離羣點的存在
iris.plot(kind="scatter", x="SepalLengthCm", y="SepalWidthCm")
  • 1
  • 2
  • 3
  • 4
  • 5

這裏寫圖片描述

# 用seaborn庫來畫出與上面相似的圖
# seaborn 的 jointplot 函數可以在同一個圖中畫出二變量的散點圖和單變量的柱狀圖
sns.jointplot(x="SepalLengthCm", y="SepalWidthCm", data=iris, size=5)
  • 1
  • 2
  • 3

這裏寫圖片描述

# 上面的兩個散點圖並不能顯示每一個點所屬的類別
# 所以,接下來用 seaborn 的 FacetGrid 函數按照Species花的種類來在散點圖上標上不同的顏色,hue英文是色彩的意思。
sns.FacetGrid(iris, hue="Species", size=5).map(plt.scatter, "SepalLengthCm", "SepalWidthCm").add_legend()
  • 1
  • 2
  • 3

這裏寫圖片描述

# 通過箱線圖來查看單個特徵的分佈
# 對 Numerical Variable,可以用 Box Plot 來直觀地查看不同花類型的分佈。
sns.boxplot(x="Species", y="PetalLengthCm", data=iris)
  • 1
  • 2
  • 3

這裏寫圖片描述

# 下面的操作,將每一個Species所屬的點加到對應的位置,加上散點圖,
# 振動值jitter=True 使各個散點分開,要不然會是一條直線
# 注意此處要將座標圖用ax先保存起來,這樣第二次纔會在原來的基礎上加上散點圖
ax = sns.boxplot(x="Species", y="PetalLengthCm", data=iris)
ax = sns.stripplot(x="Species", y="PetalLengthCm", data=iris, jitter=True, edgecolor="gray")
  • 1
  • 2
  • 3
  • 4
  • 5

這裏寫圖片描述

# violinplot 小提琴圖,查看密度分佈,結合了前面的兩個圖,並且進行了簡化
# 數據越稠密越寬,越稀疏越窄
sns.violinplot(x="Species", y="PetalLengthCm", data=iris, size=6)

# sns.kdeplot == kernel density 核密度圖(單個變量)
sns.FacetGrid(iris, hue="Species", size=6).map(sns.kdeplot, "PetalLengthCm").add_legend()

# pairplot 任意兩個變量間的關係
sns.pairplot(iris, hue="Species", size=3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

這裏寫圖片描述

# 上圖中,中間對角線的部分圖形也可以用kde顯示
sns.pairplot(iris, hue="Species", size=3, diag_kind="kde")
  • 1
  • 2

這裏寫圖片描述

# 下面的用Pandas自帶的畫圖
# We can quickly make a boxplot with Pandas on each feature split out by species
iris.boxplot(by="Species", figsize=(12, 6))

# Andrews Curves 用樣本的各個屬性作爲傅里葉級數的係數然後畫出來
# Andrews Curves 將高維的點化爲二維的曲線,曲線是一條傅里葉函數的樣子,參數項爲不# 同的特徵值,臆想出來了自變量t,這樣每個點都是一條曲線
from pandas.tools.plotting import andrews_curves
andrews_curves(iris, "Species")
#
# Another multivariate visualization technique pandas has is parallel_coordinates
# Parallel coordinates 將每個特徵作爲單獨的一列畫,然後用線將每一個樣本的特徵連接起來
from pandas.tools.plotting import parallel_coordinates
parallel_coordinates(iris, "Species")

# Which puts each feature as a point on a 2D plane, and then simulates
# having each sample attached to those points through a spring weighted by the 
# relative value for that feature
from pandas.tools.plotting import radviz
radviz(iris, "Species")

plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章