数据预处理 第1篇:探索数据

探索数据是指研究数据,发现数据的结构。数据集由数据对象构成,一个数据对象代表一个实体,实体由属性构成,属性是一个数据字段,表示数据对象的一个特征,通常,在数据分析和机器学习中,属性、维度、特征和变量这四个术语可以互换。

用来描述一个数据对象的一组属性,称作属性向量或者特征向量。一个属性的类型是由该属性的值决定的,属性可以是标称的、二元的、序数的和数值的。

本文使用的数据,使用以下脚本获得,案例是预测某个区域的房价,本文重点关注的是如何探索数据和对数据进行预处理。

数据预处理 第1篇:探索数据

import os
import tarfile
import urllib
import pandas as pd

DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml2/master/"
HOUSING_PATH = os.path.join("datasets", "housing")
HOUSING_URL = DOWNLOAD_ROOT + "datasets/housing/housing.tgz"

def fetch_housing_data(housing_url=HOUSING_URL, housing_path=HOUSING_PATH):
    if not os.path.isdir(housing_path):
        os.makedirs(housing_path)
    tgz_path = os.path.join(housing_path, "housing.tgz")
    urllib.request.urlretrieve(housing_url, tgz_path)
    housing_tgz = tarfile.open(tgz_path)
    housing_tgz.extractall(path=housing_path)
    housing_tgz.close()


def load_housing_data(housing_path=HOUSING_PATH):
    csv_path = os.path.join(housing_path, "housing.csv")
    return pd.read_csv(csv_path)

#get data
fetch_housing_data()
housing = load_housing_data()

View Code

快速查看数据的结构,每一行代表一个区域,共有10个属性,其中median_house_value是需要预测的属性值。

housing.head()

数据预处理 第1篇:探索数据

一,属性

属性可以分为两大类:定性属性和定量属性,还可以把属性分为离散属性和连续属性。

1,定性属性和定量属性

定性属性:

  • 标称属性:属性的值代表类别、编码或状态,因此标称属性被看作是分类属性。
  • 二元属性:属性只有两个类别或状态,0和1
  • 序数属性:属性值之间存在有意义的顺序,比如成绩等级可以分为:差、良、优,

定量属性是定量的,它的值是可度量的,用整数或实数来表示,定量属性分为标量和比率。

  • 数量属性:标量数值,比如成绩、温度、销量等
  • 比率属性:表示一个值是另一个的倍数(或比率),比如,增长率、占比等。

2,离散属性和连续属性

离散属性是指存在有限个值,或可数的值

连续属性:值的个数是不可数的

3,对housing数据按照属性进行分析

housing数据共有10个属性,其中9个属性属于标量属性,1个标称属性。

标量属性:

  • longitude 和 latitude:表示区域的经纬度,
  • housing_median_age :表示房龄中位数
  • total_rooms:区域中的总房间数量
  • total_bedrooms:区域中的总卧室数量
  • population:区域中的人口数量
  • households:区域中的家庭数量
  • median_income :区域中的人口收入中位数

标称属性:

  • ocean_proximity:近海

预测值是标量值:

  • median_house_value:房屋价值中位数

二,数据的基本统计描述

数据的基本统计描述,是对数据集的整体做一个统计描述,通常是对一个属性进行统计分析。

1,总体数量统计

值的数量、唯一值的数量

2,缺失值

属性字段是否存在缺失值

3,中心趋势分析

  • 均值
  • 中位数
  • 众数

4,离中趋势分析

值域:最小值和最大值之间的差值

方差和标准差:对同一值域的属性来说,标准差越大,数据的离散程度越大

四分位数:箱线图分析,特别是四分位数间距(IQR),它是上四分位数QU和下四分位数QL之差,其间包含全部观察值的一般,其值越大,说明数据的变异程度越大,离中趋势越明显。

5,对属性值进行基本的统计分析

使用DataFrame的describe()函数,对变量属性进行基本的统计描述分析,行索引是count :表示统计非NaN的行数,mean表示均值,std表示标准差,最大值、最小值、上四分位数(25%),中位数(50%)和下四分位数(75%)。

housing.describe()

数据预处理 第1篇:探索数据

三,属性的直方图

在Jupyter notebooks中显示属性的直方图,查看属性值的分布情况,通过DataFrame的hist(),可以对标量属性查看直方图。

%matplotlib inline
import matplotlib.pyplot as plt
housing.hist(bins=50, figsize=(20,15))
plt.show()

从直方图中可以看出,除了经纬度latitude 和 longitude之外,有5个属性households、population、total_bedrooms、total_rooms和meidan_income的直方图中出现重尾现象,呈现出左偏分布,中位数右侧的延伸比左侧要远的多,余下的2个属性 housing_median_age 和 median_house_value的直方图,最右侧都呈现出一个异常的值。

数据预处理 第1篇:探索数据

对于属性直方图中出现的重尾分布,有时需要对数据进行转换,比如计算其对数。

四,属性之间的相关性

利用相关系数查看各个属性之间的相关性,用于发现不同变量之间的关联性,关联是指数据之间变化的相似性,这可以通过相关系数来描述。发现相关性可以帮助你预测未来,而发现因果关系意味着你可以改变世界。 

由于housing的数据集不大,可以使用DataFrame.corr()方法计算出每队属性之间的标准相关系数(也称作皮尔逊r),查看median_house_value和其他属性的相关系数:

corr_matrix = housing.corr()
corr_matrix["median_house_value"].sort_values(ascending=False)

从相关系数中可以看出:median_house_value 和 median_income的相关系数是最高的,这也符合“房价和收入呈现正相”的常识。

median_house_value 1.000000
median_income 0.687160
total_rooms 0.135097
housing_median_age 0.114110
households 0.064506
total_bedrooms 0.047689
population -0.026920
longitude -0.047432
latitude -0.142724
Name: median_house_value, dtype: float64

还有一种方法用于检测属性之间的相关性,就是使用pandas的scatter_matrix函数,它会绘制出每个数值属性相对于其他数值属性的相关性。

from pandas.plotting import scatter_matrix

attributes = ["median_house_value", "median_income", "total_rooms", "housing_median_age"]
scatter_matrix(housing[attributes], figsize=(12, 8))

由于篇幅无法完全展示9个属性的散点图矩阵,下面的散点图矩阵仅仅绘制出四个属性的相关性,主对角线位置(从左上到右下)是每个属性的直方图,其他网格是都是两个属性之间的相关性。

数据预处理 第1篇:探索数据

五,属性的组合

对变量属性进行组合,通常是跟标量属性推导出比率属性,比如,根据房间总数(total_rooms)和家庭总数(household)计算每个家庭的房间的数量,或者根据房间总数计算卧室的占比,或者根据人口和家庭来计算每个家庭的人口数量:

housing["rooms_per_household"] = housing["total_rooms"]/housing["households"]
housing["bedrooms_per_room"] = housing["total_bedrooms"]/housing["total_rooms"]
housing["population_per_household"]=housing["population"]/housing["households"]

corr_matrix = housing.corr()
corr_matrix["median_house_value"].sort_values(ascending=False)

计算新加的属性跟median_house_value的相关性:

median_house_value 1.000000
median_income 0.687160
rooms_per_household 0.146285
total_rooms 0.135097
housing_median_age 0.114110
households 0.064506
total_bedrooms 0.047689
population_per_household -0.021985
population -0.026920
longitude -0.047432
latitude -0.142724
bedrooms_per_room -0.259984
Name: median_house_value, dtype: float64

 

 

参考文档:

 

发表评论

相关文章