程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

使用Python對數據進行描述性統計(機器學習)

編輯:Python

使用Python對數據進行描述性統計

數據集:diabetes.csv
參考書:《Machine Learning Mastery With Python Understand Your Data, Create Accurate Models and work Projects End-to-End》
獲取鏈接:https://github.com/aoyinke/ML_learner

Additional Knowledge

  1. 當兩個變量相關時,用於評估它們因相關而產生的對應變量的影響。
    當多個變量獨立時,用方差來評估這種影響的差異。
    當多個變量相關時,用協方差來評估這種影響的差異。

總覽

  1. 一些常見的指標,例如維度,前多少行數據等
  2. 皮爾遜相關系數和偏度分別觀察多變量和單變量
  3. 直方圖,密度圖,箱線圖的代碼演示和講解
  4. 多變量的可視化

一些常見的指標

from pandas import read_csv
path = "diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path,names=names,skiprows=1)
# 觀察數據的前5行
print(data.head())
# 觀察數據的維度
print(data.shape)
"""
preg plas pres skin test mass pedi age class
0 6 148 72 35 0 33.6 0.627 50 1
1 1 85 66 29 0 26.6 0.351 31 0
2 8 183 64 0 0 23.3 0.672 32 1
3 1 89 66 23 94 28.1 0.167 21 0
4 0 137 40 35 168 43.1 2.288 33 1
(768, 9) 768行,9列
"""
# 觀測每種數據的類型
print(types)
"""
preg int64
plas int64
pres int64
skin int64
test int64
mass float64
pedi float64
age int64
class int64
"""

使用Pandas進行描述性統計

from pandas import set_option
set_option('display.width', 100)
set_option('precision', 3)
description = data.describe()
print(description)

  • count:計算的是對應屬性下,所有非null數據的條數
  • mean,max,min分別是該屬性下所有數據的平均值,最大值和最小值
  • std:觀測值的標准差
  • 注意,對於不同類型的數據會有不同的統計項目,例如對於對象類型的數據,返回的就是: count, unique, top, and freq這幾個指標
  • 可以參考官方文檔:pandas.DataFrame.describe

Class Distribution(僅限於classfication問題)

class_counts = data.groupby('class').size()
print(class_counts)
"""
class
0 500
1 268
"""

Correlation between attributes(屬性之間的關系)

  • 對於線性回歸和邏輯回歸等機器學習算法來說,如果屬性之間的相關程度過高,會導致比較糟糕的performance
  • Pearson’s Correlation Coefficient(皮爾遜積矩相關系數) 常用於計算屬性之間的相關程度,它假設所涉及的屬性呈正態分布
  • 皮爾遜相關系數是兩個變量的協方差除以其標准差的乘積
  • 0表示不相關,相關因子分布在-1-1之間,正數表示相關,負數表示無關
  • 舉個簡單的栗子,可以預期高中青少年樣本的年齡和身高的 Pearson 相關系數顯著大於 0,但小於 1(因為 1 表示不切實際的完美相關)

from pandas import set_option,read_csv
data = read_csv(filename, names=names)
set_option('display.width', 100)
set_option('precision', 3)
correlations = data.corr(method='pearson')
print(correlations)

Skew of Univariate Distributions(單變量分布的偏度)

公式中,Sk——偏度;E——期望;μ——平均值;μ3——3階中心矩;σ——標准差。 在一般情形下,當統計數據為右偏分布時,Sk>0,且Sk值越大,右偏程度越高;
當統計數據為左偏分布時,Sk< 0,且Sk值越小,左偏程度越高。當統計數據為對稱分布時,顯然有Sk= 0。

所以我們應該注意處理skew較大(絕對值)的變量

skew = data.skew()
print(skew)
"""
preg 0.901674
plas 0.173754
pres -1.843608
skin 0.109372
test 2.272251
mass -0.428982
pedi 1.919911
age 1.129597
class 0.635017
"""

Univariate Plots (單變量可視化觀察數據)


Histograms(直方圖)

# Univariate Histograms
from matplotlib.pyplot as plt
from pandas import read_csv
path = "diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path , names=names,skiprows=1)
data.hist()
plt.show()

  • age, pedi and test呈現指數分布(exponential distribution)
  • mass and pres and plas呈現或近似高斯(正態)分布(Gaussian Distribution)
  • 許多機器學習算法假定輸入為正態分布,但是我們可以看到實際並不是這樣(需要進行standardlization進一步處理)

Density Plots(密度圖)

密度圖是快速了解每個屬性分布的另一種方法

data.plot(kind=?density?, subplots=True, layout=(3,3), sharex=False)
plt.show()

Box and Whisker Plots(箱線圖)

  • 中位數(Q2 / 50th百分位數):數據集的中間值;
  • 第一個四分位數(Q1 / 25百分位數):最小數(不是“最小值”)和數據集的中位數之間的中間數;
  • 第三四分位數(Q3 / 75th Percentile):數據集的中位數和最大值之間的中間值(不是“最大值”);
  • 四分位間距(IQR):第25至第75個百分點的距離;
  • 晶須(藍色顯示)
  • 離群值(顯示為綠色圓圈)
  • “最大”:Q3 + 1.5 * IQR
  • “最低”:Q1 -1.5 * IQR

總結:

  • 箱線圖是針對連續型變量的,解讀時候重點關注平均水平、波動程度和異常值。

  • 當箱子被壓得很扁,或者有很多異常的時候,試著做對數變換。

  • 當只有一個連續型變量時,並不適合畫箱線圖,直方圖是更常見的選擇。

  • 箱線圖最有效的使用途徑是作比較,配合一個或者多個定性數據,畫分組箱線圖

    data.plot(kind=‘box’, subplots=True, layout=(3,3), sharex=False, sharey=False)
    plt.show()

Multivariate Plots(多變量觀察)


Correlation Matrix Plot(皮爾遜相關系數,變量之間的關系)

import matplotlib.pyplot as plt
import numpy as np
from pandas import read_csv
path = "diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
correlations = data.corr(method='pearson') # 得到皮爾遜相關系數
# plot correlation matrix
fig = plt.figure() # 相當於拿到一張畫布
ax = fig.add_subplot(1,1,1) # 創建一個一行一列的子圖
cax = ax.matshow(correlations, vmin=-1, vmax=1)
fig.colorbar(cax) # 將色彩變化條(右邊那一豎著的)添加到圖中
ticks = np.arange(0,9,1)
# ticks = [0 1 2 3 4 5 6 7 8] 構造一個0-8,step=1的np數組
ax.set_xticks(ticks)
ax.set_yticks(ticks)
ax.set_xticklabels(names) # 打上index,默認采用數字
ax.set_yticklabels(names)
plt.show()

Scatter Plot Matrix(散點矩陣)

from matplotlib.pyplot as plt
from pandas import read_csv
from pandas.tools.plotting import scatter_matrix
path = "diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
scatter_matrix(data)
plt.show()


Summary:

  • 對角線顯示每個屬性的直方圖。
  • 散點圖對於發現變量之間的結構化關系很有用,比如您是否可以用一條直線來總結兩個變量之間的關系。具有結構化關系的屬性也可能是相關的,可以從數據集中刪除。

寫在最後


Stay hugry, stay foolish.


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved