1 初心
本系列笔记用于记录自己第一次参加Datawhale的组队学习。自己马上开启研究生学习生涯,因此熟练掌握数据分析这一重要技能对未来的学习能够提供很大的帮助,Datawhale团队在项目初衷里说数据分析是一个要从一堆数字中看到真相的过程。学会操作数据只是数据分析的一半功力,剩下的另一半要用我们的大脑,多多思考,多多总结,更要多动手,实打实的的敲代码。所以也希望在学习这门课时,多去推理,多去问问为什么;多多练习,确保理论实践结合起来,在课程结束的时候一定会有大收获。
因此希望自己再接下来的11天里面能够实事求是、脚踏实地完成各项任务,提高自己的硬实力。
特别喜欢一句话:也许不负光阴就是最好的努力,而努力就是最好的自己。
**学习内容:**获得要分析的数据,学会如何加载数据,查看数据,熟练掌握Pandas的基本操作,最后尝试数据的探索性分析。
2 数据加载
2.1 载入数据
泰坦尼克号的沉没是世界上最严重的海滩事故之一,通过分析数据,建立模型来分析哪些人可能成为幸存者。
数据集来自: https://www.kaggle.com/c/titanic/overview
2.1.1 导入所需要的库
导入numpy和pandas
import numpy as np
import pandas as pd
2.1.2 载入数据
这里要理解相对路径和绝对路径的概念。
掌握相对路径和绝对路径载入数据的方法,
相对路径:就是相对于自己的目标文件的位置。
绝对路径:指文件在硬盘上真正存在的路径。
(1)相对路径载入数据
df = pd.read_csv('train.csv')
df.head(3)
(2)绝对路径载入数据
df = pd.read_csv('C:\\Users\\Administrator\\Desktop\hands-on-data-analysis-master\\第一单元项目集合\\train.csv')
df.head(3)
思考:pd.read_csv()和pd.read_table()
pd.read_csv() :从文件、URL、文件型对象中加载带分隔符的数据,默认分隔符为逗号
pd.read_table() :从文件、URL、文件型对象中加载带分隔符的数据,默认分隔符为制表符(“ \t ”)
read_csv()和read_table()都是是加载带分隔符的数据,每一个分隔符作为一个数据的标志,但二者读出来的数据格式还是不一样的,read_table是以制表符 \t 作为数据的标志,也就是以行为单位进行存储。
2.1.3 载入数据
每1000行为一个数据模块,逐块读取
chunker = pd.read_csv('train.csv', chunksize=1000)
思考:什么是逐块读取?为什么要进行逐块读取?
当处理大型文件或找出正确的参数来正确处理大文件时,我们需要读入文件的一个小片段或者按小块遍历文件。
为了分块读入文件,可以指定chunksize作为每一块的行数。read_csv返回的TextParser对象允许你根据chunksize遍历文件。
2.1.4 修改表头
将表头改成中文,索引改为乘客ID [对于某些英文资料,我们可以通过翻译来更直观的熟悉我们的数据]
PassengerId => 乘客ID
Survived => 是否幸存
Pclass => 乘客等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别
Age => 年龄
SibSp => 堂兄弟/妹个数
Parch => 父母与小孩个数
Ticket => 船票信息
Fare => 票价
Cabin => 客舱
Embarked => 登船港口
df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID',header=0)
df.head()
2.2 初步观察
导入数据后,需要对数据的整体结构和样例进行概览,比如说,数据大小、有多少列,各列都是什么格式的,是否包含null等。
2.2.1 查看数据基本信息
df.info()
2.2.2 查看前10行和后15行数据
查看前10行
df.head(10)
查看 后15行
df.tail(15)
2.2.3 判断数据是否为空
为空的地方返回True,其余地方返回False
df.isnull().head()
2.3 保存数据
将你加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv
# 注意:不同的操作系统保存下来可能会有乱码。大家可以加入`encoding='GBK' 或者 ’encoding = ’uft-8‘‘`
df.to_csv('train_chinese.csv')
3 数据载入及初步观察
3.1 知道你的数据叫什么
3.1.1 查看DataFrame数据的每列的名称
df.columns
3.1.2 查看"Cabin"这列的所有值 [有多种方法]
df['Cabin'].head(3)
df.Cabin.head(3)
3.1.3 对比"test_1.csv"和"train.csv"
加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除
test_1 = pd.read_csv('test_1.csv')
test_1.head()
# 删除多余的列
del test_1['a']
test_1.head()
3.1.4 隐藏列元素
将[‘PassengerId’,‘Name’,‘Age’,‘Ticket’]这几个列元素隐藏,只观察其他几个列元素
df.drop(['PassengerId','Name','Age','Ticket'],axis=1).head(3)
思考:对比 drop 和 del 是不是使用了不一样的方法(函数),如果使用一样的函数如何完成上面的不同的要求呢?
如果想要完全的删除你的数据结构,使用inplace=True,因为使用inplace就将原数据覆盖了,所以这里没有用。
3.2 筛选
筛选出需要的信息,丢弃无用的信息
以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。
df[df['Age']<10].head()
以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage
midage = df[(df['Age']>10) & (df['Age']<50)]
midage.head()
将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
midage = midage.reset_index(drop=True)
midage.head(3)
reset_index用来重置索引,因为有时候对dataframe做处理后索引可能是乱的。
drop=True就是把原来的索引index列去掉,重置index。
drop=False就是保留原来的索引,添加重置的index。
两者的区别就是有没有把原来的index去掉。
此外还有一个参数:inplace
inplace=False(默认)表示原数组不变,对数据进行修改之后结果给新的数组。
inplace=True表示直接在原数组上对数据进行修改。
midage.loc[[100],['Pclass','Sex']]
使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
midage.loc[[100,105,108],['Pclass','Name','Sex']]
使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
midage.iloc[[100,105,108],[2,3,4]]
4 数据的探索性分析
4.1 熟悉pandas
#自己构建一个都为数字的DataFrame数据
frame = pd.DataFrame(np.arange(8).reshape((2, 4)),
index=['2', '1'],
columns=['d', 'a', 'b', 'c'])
frame
pd.DataFrame() :创建一个DataFrame对象
np.arange(8).reshape((2, 4)) : 生成一个二维数组(2*4),第一列:0,1,2,3 第二列:4,5,6,7
index=['2, 1] :DataFrame 对象的索引列
columns=[‘d’, ‘a’, ‘b’, ‘c’] :DataFrame 对象的索引行
大多时候都是想根据列的值来排序,所以将构建的DataFrame中的数据根据某一列,升序排列
frame.sort_values(by='c', ascending=True)
行索引升序排序
frame.sort_index()
列索引升序排序
frame.sort_index(axis=1)
列索引降序排序
frame.sort_index(axis=1, ascending=False)
任选两列数据同时降序排序
frame.sort_values(by=['a', 'c'], ascending=False)
4.2 探索性分析
对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列),从数据中你能发现什么?
text.sort_values(by=['票价','年龄'],ascending = False).head(20)
排序后,我们发现票价越高的客舱越好,所以我们会明显看出,票价前20的乘客中存活的有14人,因此我们后面可以进一步分析一下票价和存活之间的关系,年龄和存活之间的关系。
通过泰坦尼克号数据如何计算出在船上最大的家族有多少人?
max(text['兄弟姐妹个数'] + text['父母子女个数'])
学会使用Pandas describe()函数查看数据基本统计信息
frame2 = pd.DataFrame([[1.4, np.nan],
[7.1, -4.5],
[np.nan, np.nan],
[0.75, -1.3]
], index=['a', 'b', 'c', 'd'], columns=['one', 'two'])
frame2
frame2.describe()
'''
count : 样本数据大小
mean : 样本数据的平均值
std : 样本数据的标准差
min : 样本数据的最小值
25% : 样本数据25%的时候的值
50% : 样本数据50%的时候的值
75% : 样本数据75%的时候的值
max : 样本数据的最大值
'''
查看泰坦尼克号数据集中 票价、父母子女 这列数据的基本统计数据,你能发现什么?
text['票价'].describe()
可以看出, 一共有891个票价数据, 平均值约为:32.20, 标准差约为49.69,说明票价波动特别大, 25%的人的票价是低于7.91的,50%的人的票价低于14.45,75%的人的票价低于31.00, 票价最大值约为512.33,最小值为0。
text['父母子女个数'].describe()
可以看出, 一共有891个父母子女个数数据, 平均值约为:0.381594, 标准差约为0.806057,说明父母子女个数波动不大, 样本75%的人的父母子女个数为0,父母子女个数最大值约为6,最小值为0。
5 总结
本结学会了通过Pandas的一些内置函数对数据进行了初步统计查看,基本掌握了Pandas的基本操作和数据的探索性分析,并对数据分析有了一个基本的认识,开始对数据分析有了自己的思维,了解了数据分析前期步骤和具体工作。
PS: 本次动手学数据分析来源于Datawhale组队学习,详情可关注公众号Datawhale。