认识数据:pandas和matplotlib学习

本文重点在认识数据,不在于数据分析,更不是可视化什么东西

扯扯一些概念

这个博客主要用于基础的数据分析,比较适合机器学习做特征工程前,查看如何认识数据提取特征,用可视化的形式去思考肯定是很好的一种方式
http://blog.csdn.net/han_xiaoyang/article/details/49797143

主要学习pyplot的包的使用,所以说这篇总结并不是为了画出美丽的图,而是看出数据如何更好的变成特征,认识数据

import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd

首先要注意的就是pandas里面内置的是matplotlib包的,这个可以查看pandas的源码,先不管pandas,直接用matplot画图,是这个样子的

# 通过rcParams设置全局横纵轴字体大小
mpl.rcParams['xtick.labelsize'] = 2
mpl.rcParams['ytick.labelsize'] = 24

一些基础的常见函数要记得:

# 一定要加上这句才能让画好的图显示在屏幕上
plt.show()
# 将当前figure的图保存到文件result.png
plt.savefig('result.png')

比较重要的是常见的图和其英文名称要对应上:

# 散点图两种形式
# '.'标明画散点图,每个散点的形状是个圆
plt.plot(x, y_data, '.')
# scatter可以更容易地生成散点图
plt.scatter(x, y_data)


# 折线图
# 画模型的图,plot函数默认画连线图
plt.plot(x, y)

#饼状图
plt.pie()

#条形图
#竖着的条
plt.bar()
#横着的条
plt.barh()

#盒形图
plt.box()

#直方图
plt.hist()

#核密度估计图
kde

#地区图
area

有可能会出现中文显示不出来的情况,解决思路:

font = FontProperties(fname=r"/Library/Fonts/Songti.ttc", size=8)
......
plt.title(u"获救情况 (1为获救)", fontproperties=font)  # 标题
plt.ylabel(u"人数", fontproperties=font)
具体做图,千万记住要以pandas为主体,不要凌驾于pandas,

直接用matplot会很累,pandas基本算是装python的默认包之一。
Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
pandas常用函数查询
a

做图流程

1.下面这三句话可以作为做项目和比赛的开端,

data_train = pd.read_csv("train.csv")
print(data_train.info())
print(data_train.describe())

上面这两个方法其实已经能看出很多东西,均值、标准差和一些基本的数据特征,这些可以作为你具体做图的前提条件,让你知道你想做那些特征的图

2. 做图

首先声明一些铺垫,而且你要明白有时候你想看的直接是数据的分布,有些是数据统计的分布,而且不要为了画图而画图,要想好你的x,你的y,如果做对比的话,还要想清楚z

fig = plt.figure()
fig.set(alpha=0.2)  # 设定图表颜色alpha参数
fig.suptitle("总标题", fontsize=16, x=0.5,y=0.05)

一般用子图放在一张图里,保存下来,这个有很多种方法,

  • 套路1:x关于y的分布,取出一列数据看x的统计分布,data——value_counts——plot定义图的类型
    data_train['Survived'].value_counts().plot(kind='pie')
  • 套路2:拥有x,y两种数据,散点图或者kde的密度图看原始分布
    plt.scatter(data_train.Survived, data_train.Age)
  • 套路3:不同的x关于y的分布,
    data_train.Age[data_train.Pclass == 1].plot(kind='kde')
    data_train.Age[data_train.Pclass == 2].plot(kind='kde')
    data_train.Age[data_train.Pclass == 3].plot(kind='kde')
# 
plt.subplot2grid((2, 3), (0, 0))
data_train['Survived'].value_counts().plot(kind='pie')
plt.title(u"获救情况 (1为获救)", fontproperties=font)  # 标题
plt.ylabel(u"人数", fontproperties=font)

plt.subplot2grid((2, 3), (0, 1))
data_train.Pclass.value_counts().plot(kind="bar")
plt.ylabel(u"人数", fontproperties=font)
plt.title(u"乘客等级分布", fontproperties=font)

plt.subplot2grid((2, 3), (0, 2))
plt.scatter(data_train.Survived, data_train.Age)
plt.ylabel(u"年龄", fontproperties=font)  # 设定纵坐标名称
plt.grid(b=True, which='major', axis='y')
plt.title(u"按年龄看获救分布 (1为获救)", fontproperties=font)

plt.subplot2grid((2, 3), (1, 0), colspan=2)
data_train.Age[data_train['Pclass'] == 1].plot(kind='kde')
data_train.Age[data_train.Pclass == 2].plot(kind='kde')
data_train.Age[data_train.Pclass == 3].plot(kind='kde')
plt.xlabel(u"年龄", fontproperties=font)  # lots an axis lable
plt.ylabel(u"密度", fontproperties=font)
plt.title(u"各等级的乘客年龄分布", fontproperties=font)
plt.legend((u'1', u'2', u'3'))  # sets our legend for our graph.

plt.subplot2grid((2, 3), (1, 2))
plt.scatter(data_train.Fare, data_train.Survived)

plt.xlabel('nfare')
plt.ylabel('num')
plt.title('fare与survive的关系', fontproperties=font)

这个方法一定要用,不然布局很扯淡

plt.tight_layout(pad=1, w_pad=1, h_pad=1)
plt.show()

3.合并在一起的图

上面的kde图还是原始分布图放在一起,如果是统计分布放在一起就是下面这种套路,需要使用pd.DataFrame,然后放在一起

fig = plt.figure()
fig.set(alpha=0.2)  # 设定图表颜色alpha参数

Survived_0 = data_train.Embarked[data_train.Survived == 0].value_counts()
Survived_1 = data_train.Embarked[data_train.Survived == 1].value_counts()
df=pd.DataFrame({u'获救':Survived_1, u'未获救':Survived_0})
df.plot(kind='bar', stacked=True)
plt.title(u"各登录港口乘客的获救情况")
plt.xlabel(u"登录港口") 
plt.ylabel(u"人数") 

plt.show()

4.分组查看分布

这种手段也不错,但是需要对数据有想象力,就是看到数字要形成画面感

g = data_train.groupby(['SibSp','Survived'])
df = pd.DataFrame(g.count()['PassengerId'])
print(df)

缺失值作为一个维度统计

fig = plt.figure()
fig.set(alpha=0.2)  # 设定图表颜色alpha参数

Survived_cabin = data_train.Survived[pd.notnull(data_train.Cabin)].value_counts()
Survived_nocabin = data_train.Survived[pd.isnull(data_train.Cabin)].value_counts()
df=pd.DataFrame({u'有':Survived_cabin, u'无':Survived_nocabin}).transpose()
df.plot(kind='bar', stacked=True)
plt.title(u"按Cabin有无看获救情况")
plt.xlabel(u"Cabin有无") 
plt.ylabel(u"人数")
plt.show()

到这基本可以做到对数据从各种角度去看其统计分布,相关性分布等等,然后形成坐特征工程的思路。

发表评论

电子邮件地址不会被公开。