动手学数据分析
通过动手学数据分析这门课程来了解数据分析的基本流程以及python的基本使用。
第一部分 数据载入以及初步观察
1.1加载数据
数据集下载地址:https://www.kaggle.com/c/titanic/overview
1.1.1导入numpy和pandas
import numpy as np
import pandas as pd
提示:如果导入第三方库失败,可能python编译器中没有安装该第三方库,通过pip或者conda进行安装,如果出现时间超时等情况,可以通过镜像进行安装
pip install numpy -i https://pypi.douban.com/simple/
pip install pandas -i https://pypi.douban.com/simple/
1.1.2载入数据
(1)使用相对路径加载数据
data = pd.read_csv('train.csv')
data
(2)使用绝对路径加载数据
data = pd.read_csv(r'C:\Users\Administrator\Desktop\jupyter\train.csv')
data
思考:pd.read_csv()与pd.read_table()的不同,通过什么方法使得两者效果相同? ‘.tsv’与’.csv’的区别,如何加载这两种数据集?
解析:
- pd.read_csv()读取是以’,‘分割的文件到DataFrame的,而pd.read_table()读取是以’/t’分割的文件到DataFrame的。实际上两个函数是通用的,可以通过函数参数中的sep参数来控制对文件的读取。如下:
data = pd.read_table('train.csv')
data
data = pd.read_table('train.csv',sep = ',')
data
2.’.tsv’和’.csv’都属于文本文件,但是两者文件的字段分隔不同,’.tsv’文件是由制表符隔开的,而’.csv’文件是由逗号隔开。
两种格式的文件都可以通过pd.read_csv()或者pd.read_table()进行读取,只是在sep参数上进行选择。
1.1.3逐块读取文件,每1000行为一个数据模块
#逐块读取文件通过chunksize参数进行设置
chunker = pd.read_csv('train.csv',chunksize = 1000)
for piece in chunker:
print(piece)
使用逐块读取的原因是因为当使用pandas处理大文件时,通过将文件逐步分成一个小片段来进行处理能够提高pandas处理文件的效率。
1.1.4将表头改为中文,索引改为乘客ID
#方法一,通过data.columns进行修改
data.columns = ['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄','堂兄弟/妹个数','父母 与小孩个数','船票信息','票价','客舱','登船港口']
#方法二,通过data.rename进行修改
data.rename(columns={'PassengerId':'乘客ID','Survived':'是否幸存','Pclass':'乘客等级(1/2/3等舱位)',
'Name':'乘客姓名','Sex':'性别','Age':'年龄','SibSp':'堂兄弟/妹个数','Parch':'父母与小孩个数',
'Ticket':'船票信息','Fare':'票价','Cabin':'客舱','Embarked':'登船港口'},inplace = True)
1.2初步观察数据
导入数据后,对数据的整体进行概览
1.2.1查看数据的基本信息
- data.describe(): # 描述性统计信息
- data.index: # 标签
- data.index: # 标签
- data.index.values: # 标签
- data.values: # 数据
- data.to_numpy(): # 数据 (推荐)
- data.head(n): # 前n个
- data.tail(n): # 尾n个
- data.memory_usage(): # 占用内存(字节B)
- data.name: # 名字
- data.dtype: # 类型
data.discribe()
data
1.2.2查看数据的前10行和后15行
data.head(10)
data.tail(15)
1.2.3判断数据是否为空,空的地方返回True,其余地方返回False
pandas的空值判断的函数有pd.isnull,pd.isna
其中pd.isnull可以对数值型空值、字符串空值以及python的None进行判断,pd.isna则可以对数值型空值、字符串空值、时间类型空值以及python的None进行判断。
pd.isna(data)
思考:还可以从哪些方面对数据进行分析
个人解析:可以从数据的变化幅度以及数据对于问题的相关性进行分析。
1.3保存数据
#将中文表头的数据保存
data.to_csv('train_chinese.csv',index = False)
注意:在保存数据时,为了防止pandas自己帮忙加上行和列的名称,一般会将index参数设置为Fales
第二部分 pandas基础
1.4 知道你的数据叫什么
通过第一章使用pandas读取的csv文件后的数据,我们知道读取出来的数据类型为DataFrame类型
1.4.1 pandas中有两种数据类型,分别是DataFrame和Series数据类型,这两种数据类型有什么区别
1.Series和数组numpy.array类似
s1 = pd.Series([1,2,3,4,5,6])
可以看出Series是有索引的,如果未指定索引,则会以数字自动生成
s2 = pd.Series([1,2,3,4,5,6],index=['a','b','c','d','e','f'])
2.Seies还可以看成是一个定长的有序字典
s3 = pd.Series({'a':1,'b':2,'c':3,'d':4,'e':5,'f':6})
3.DataFrame相当于有表格,有行表头和列表头
构建DataFrame最常用的方法就是直接传入一个等长列表或者数组组成的字典
data = {'name':['jack','roob','koma','niko'],
'age':[16,24,32,23],
'ins':['game','reading','sleeping','game']}
frame = pd.DataFrame(data)
frame
1.4.2载入上一章的train.csv文件
data = pd.read_csv('train.csv')
1.4.3查看DataFrame数据的每列的项
data.columns
1.4.4查看’cabin’列的所有项
data['Cabin'].head(5)
data.Cabin.head(5)
1.4.5加载"test_1.csv"文件,然后对比"train.csv",查看是否有多余的列,并删除
test_data = pd.read_csv('test_1.csv')
test_data.head(5)
可以看出相比于train.csv文件中,test_1.csv文件中多出了一列a,所以要将该列删除
del test_data['a']
test_data.head(5)
思考:还有其他删除了的方法吗?
解析:除了上面使用del方法删除列以外还可以使用drop方法,drop方法的使用如下:
1.不改变内存,就是再次读取该数据时还是原始数据。
drop_test_data = test_data.drop('a',axis=1)
drop_test_data.head(5)
2.改变内存,再次读取test_data数据时显示改变后的数据
test_data.drop('a',axis=1,inplace=True)
test_data.head(5)
1.4.6将[‘PassengerId’,‘Name’,‘Age’,‘Ticket’]这几列元素隐藏
对于隐藏部分列元素,则可以使用上诉的drop函数,但是要使用不修改内存的方式。
data.drop(['PassengerId','Name','Age','Ticket'],axis=1).head(5)
相比于1.4.5中删除某一列元素的方法,在第二个方法中也是使用的drop方法,但是如果要彻底删除的话,则需要添加参数inplace为True。如果没有使用这个参数的话,原数据就不会覆盖。
1.5筛选逻辑
1.5.1以"Age"为筛选条件,显示年龄为10岁以下的乘客信息
data_age_down_10 = data[data["Age"] < 10]
data_age_down_10.head(5)
1.5.2以"Age"为筛选条件,显示10岁以上50岁以下的乘客信息,并命名为midage
midage = data[(data["Age"]>10) & (data["Age"]<50)]
midage.head(5)
1.5.3将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
其中这第100行是针对midage这个数据的,所以要先对这个midage数据重新设置索引。不然在后面索引某行的话容易出现逻辑错误。
midage = midage.reset_index(drop=True)
midage.head(5)
其中drop=True是将index列隐藏
然后读取100行数据中的Pclass和Sex列,因为要读取的列都是有对应标签的,所以使用loc方法更为合适。
midage.loc[[100],['Pclass','Sex']]
1.5.4使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
midage.loc[[100,105,108],['Pclass','Name','Sex']]
1.5.5使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
使用iloc方法,则填入的参数为所要查看数据对应的位置
midage.iloc[[100,105,108],[2,3,4]]
第三部分 探索性数据分析
导入numpy和pandas库以及"train_chinese.csv"数据
import numpy as np
import pandas as pd
train_chinese_data = pd.read_csv('train_chinese.csv')
train_chinese_data.head(5)
1.6了解数据
教材《Python for Data Analysis》第五章
1.6.1利用pandas对示例数据进行排序,要求升序
#自己构建一个DataFrame对象
data = np.arange(8).reshape((2,4))
df = pd.DataFrame(data,index=['2','1'],columns=['d','a','b','c'])
df
根据某一列的值进行升序排列
df.sort_values(by='a',ascending=True)
其中by=的参数就是针对所要排序的列,ascending为True表明排序为升序,False为降序
对于DataFrame数据的排序,可以通过值排序,也可以通过索引进行排序
1.通过行索引进行升序排序
df.sort_index()
2.通过列索引进行升序排序
df.sort_index(axis=1)
3.通过列索引进行降序排序
df.sort_index(axis=1,ascending=False)
4.通过任意选择两列数据同时降序排序
df.sort_value(by=['a','d'],ascending=False)
1.6.2对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列),从这个数据中你可以分析出什么?
#对票价和年龄进行降序排序,并查看前20数据
train_chinese_data.sort_values(by=['票价','年龄'],ascending=False).head(5)
思考:对于根据列排序时,如果将票价放在第一位,那么会首先根据票价进行排序,如果将年龄放第一位会根据年龄大小进行排序。
train_chinese_data.sort_values(by=['年龄','票价'],ascending=False).head(5)
通过这两中不同的排序方式可以看出,票价高的船舱位置可能更好,逃生机会更大,所以存活率更高。年龄过大的,由于身体原因存活率很低,根据票价排序中也可以看出,部分票价高的,但是由于年龄较大二没能存活下来。
1.6.3利用Pandas进行算术计算,计算两个DataFrame数据相加结果
#创建两个DataFrame数据
frame1_a = pd.DataFrame(np.arange(9).reshape(3,3),
columns=['a','b','c'],
index=['one','two','three'])
frame1_b = pd.DataFrame(np.arange(12).reshape(4,3),
columns=['a','e','c'],
index=['first','one','two','second'])
frame1_a
frame1_b
将frame1_a和frame1_b进行相加
new_frame = frame1_a + frame1_b
new_frame
DataFrame相加是对应的行和列相加,如果没有对应的行和列则变为NaN
1.6.4通过泰坦尼克号数据如何计算出在船上最大的家族有多少人?
'''
最大家族人数是兄弟姐妹个数+父母子女个数
'''
family_numbers = train_chinese_data['堂兄弟/妹个数'] + train_chinese_data['父母与小孩个数']
max_family = max(family_numbers)
max_family
1.6.5 学会使用Pandas describe()函数查看数据基本统计信息
构建一个简单的DataFrame数据
frame2 = pd.DataFrame([[2.5,3,np.nan],
[3,np.nan,5],
[5,6,3]],
index=['a','b','c'],columns=['one','two','three'])
frame2
调用describe函数,查看frame2的基本信息
frame2.describe()
1.6.6分别看看泰坦尼克号数据集中 票价、父母子女 这列数据的基本统计数据,你能发现什么?
'''
看看泰坦尼克号数据集中 票价 这列数据的基本统计数据
'''
select_data = train_chinese_data[['票价','父母与小孩个数']]
select_data.describe()
从这两列数据的基本统计中可以看出票价的标准差很大,最大值为512.32920,有百分之七十五的人票价低于31.通过票价大概能够评估出该乘客所在船舱的好坏,间接反映逃生几率,所以票价能够作为一个有效的特征。而父母与小孩个数这一个特征,标准差为0.806057,其他统计数据中大部分都为0,所以将该特征作为一个输入特征并不理想。
以上便是Datawhale动手学数据分析第一章的内容,新手学习,有错误的请理解理解,哈哈!!
同时感谢Datawhale团队的付出。