数据分析学习(一) ———— 数据基础操作

  • 基于Python的数据分析实战学习

本次数据分析的学习以kaggle上泰坦尼克项目着手,通过完成数据分析实战项目全流程,熟悉数据分析。

数据分析流程大致为三个部分:

  1. 第一部分:数据基础操作。当我们拿到数据后,首先要知道如何载入数据、查看数据,然后需要学习如何使用python中的pandas、numpy等库,并对数据进行一些探索性数据分析。
  2. 第二部分:数据清洗与重构。当我们能够较为熟练地对数据进行基本操作后,我们需要对数据进行清洗和重构,去除数据中的冗余数据或无用数据,按照分析需求构造出更可用更好用的数据,并存储起来。
  3. 第三部分:建模和评估。

今天,我对第一部分进行了学习:数据基础操作。

1 数据载入及初步观察

1.1 载入数据

泰坦尼克数据集下载 https://www.kaggle.com/c/titanic…

1.1.1 导入numpy 和 pandas
import pandas as pd
import numpy as np

【提示】如果加载失败,有可能是你的python环境没有安装numpy和pandas两个库,安装操作可参考教程

1.1.2 载入数据
# 使用相对路径载入数据
df = pd.read_csv("train.csv")
# 使用绝对路径载入数据
pd.read_csv("D://PYTHON//data_analysis//task01//train.csv")

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HfUy5S0l-1673962638271)(D:\PYTHON\data_analysis\task01\1.png)]
【提示】相对路径载入报错时,尝试使用os.getcwd()查看当前工作目录。
【思考】

1、pd.read_csv()和pd.read_table()的区别:read_csv()从文件、url、文件型对象中加载带分隔符的数据,默认分隔符为逗号;read_table()从文件、url、文件型对象中加载带分隔符的数据,默认分隔符为制表符;
2、‘.tsv’和’.csv’的不同:TSV 是Tab-separated values的缩写,即制表符分隔值。
相对来说CSV,Comma-separated values(逗号分隔值)更常见一些。

【总结】加载的数据是所有工作的第一步,我们的工作会接触到不同的数据格式(eg:.csv;.tsv;.xlsx),但是加载的方法和思路都是一样的,在以后工作和做项目的过程中,遇到之前没有碰到的问题,要多多查资料,使用googel,了解业务逻辑,明白输入和输出是什么。

1.1.3 每1000行为一个数据模块,逐块读取
#设置chunksize参数,来控制每次迭代数据的大小
chunker = pd.read_csv("train.csv",chunksize=1000)
for piece in chunker:
    print(type(piece))
    print(len(piece))

【提示】当文件过大时,若直接利用pandas读取,会给电脑造成太大的压力,可使用分块读取

1.1.4 将表头改成中文,索引改为乘客ID (对于某些英文资料,我们可以通过翻译来更直观的熟悉我们的数据)

PassengerId => 乘客ID
Survived => 是否幸存
Pclass => 乘客等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别
Age => 年龄
SibSp => 堂兄弟/妹个数
Parch => 父母与小孩个数
Ticket => 船票信息
Fare => 票价
Cabin => 客舱
Embarked => 登船港口

df.rename(columns={'PassengerId':'乘客ID','Survived':'是否幸存','Pclass':'乘客等级(1/2/3等舱位)',
'Name':'乘客姓名','Sex':'性别','Age':'年龄','SibSp':'堂兄弟/妹个数','Parch':'父母与小孩个数','Ticket':'船票信息',
'Fare':'票价','Cabin':'客舱','Embarked':'登船港口'},inplace=True)
df.head(5)

1.2初步观察

导入数据后,你可能要对数据的整体结构和样例进行概览,比如说,数据大小、有多少列,各列都是什么格式的,是否包含null等

1.2.1 查看数据的基本信息
# 获取每列数据的统计特征(eg:总行数,列数据的平均值、标准差,etc)
# 使用:dataframe.describe()即可查看每列数据的
'''
(1)总行数统计count
(2)平均值mean
(3)标准差std
(4)最小值min
(5)25%分位值“25%”
(6)50%分位值“50%”
(7)75%分位值“75%”
(8)最大值max
'''
df.describe()
# 查看每列的类型,dataframe的属性dtypes可以返回表示每列数据名称及类型的列表:
print(df.dtypes)
'''
使用方法info()来查看dataframe的简介描述
使用如下语句:
dataframe.info()
此方法打印有关dataframe的信息,包括索引dtype和列、非空值和内存使用情况。
'''
df.info()
1.2.2 观察表格前10行的数据和后15行的数据
# 表格前10行数据
df.head(10)
# 表格后15行数据
df.tail(15)
1.2.3 判断数据是否为空,为空的地方返回True,其余地方返回False
'''
1、判断数值是否为空,可以用pd.isna,pd.isnull,np.isnan;
2、判断字符串是否为空,可以用pd.isna,pd.isnull;
3、判断时间是否为空,可以用pd.isna,pd.isnull,np.isnat;
4、判断转换类型后的字符串,空值也转换成了字符串nan,所以不能用常规方法判断了,直接判断字符串是否相等即可。
'''
df.isnull().head(20)

【总结】上面的操作都是数据分析中对于数据本身的观察

1.3 保存数据

1.3.1 将你加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv
#注意:不同的操作系统保存下来可能会有乱码。大家可以加入encoding='GBK' 或者 encoding = 'utf-8'
df.to_csv('train_chinese.csv')
data = pd.read_csv('train_chinese.csv')
data.head(5)

【总结】数据的加载以及入门,接下来就要接触数据本身的运算,我们将主要掌握numpy和pandas在工作和项目场景的运用。

2 Pandas基础

我们学习pandas的基础操作,那么上一节通过pandas加载之后的数据,其数据类型是什么呢?数据类型DateFrame和Series的用法有何不同?如何查看DataFrame数据的每列的名称?。。。
此部分可通过查看网站Pandas 用户指南(中文)更全面的学习pandas对数据的具体操作。pandas的具体操作需要多学多用才能更好的掌握其中的精髓。

3 探索性数据分析

1.6了解你的数据吗

1.6.1 利用Pandas对示例数据进行排序,要求升序
'''
我们举了一个例子
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 对象的索引行
'''
data1=np.arange(8).reshape((2,4))
# print(data)
index=[2,1]
columns=['d','a','b','c']
df=pd.DataFrame(data=data1,index=index,columns=columns)
df.head(2)

【代码解析】

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.sort_values(by, ascending=True, inplace=Flase )
参数说明:
by: 字符串或者List<字符串>,单列排序或者多列排序
ascending:bool或者list,升序还是降序,如果是list对应by的多列  默认为True升序排序,为False降序排序
inplace:是否修改原始的DataFrame
'''
df.sort_values(by='a',ascending=True).head()

# 1.让行索引升序排序
df.sort_index(axis=0,ascending=True).head()
# 2.让列索引升序排序
df.sort_index(axis=1,ascending=True).head()
# 3.让列索引降序排序
df.sort_index(axis=1,ascending=False).head()
# 4.让任选两列数据同时降序排序
df.sort_values(by=['a','c'],ascending=False).head(2)
1.6.2 对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列),从这个数据中你可以分析出什么?
data.sort_values(by=['票价', '年龄'], ascending=False).head(20)

【思考】排序后,如果我们仅仅关注年龄和票价两列。根据常识我知道发现票价越高的应该客舱越好,所以我们会明显看出,票价前20的乘客中存活的有14人,这是相当高的一个比例,那么我们后面是不是可以进一步分析一下票价和存活之间的关系,年龄和存活之间的关系呢?当你开始发现数据之间的关系了,数据分析就开始了。
多列排序首先按照by[]列表和ascending[]列表中的对应顺序
和对应逻辑进行排序,首先by列表的第一个列标签根据其在ascending列表的对应逻辑进行排序,其次再用by列表第二个列标签及其ascending列表的对应逻辑进行排序,以此类推。

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'])
# 将frame_a和frame_b进行相加
df3=frame1_a.add(frame1_b)   #fill_value=0用来定义对空值使用0填充
df3.head()
# 将frame_a和frame_b进行相加,如果使用了fill_value=0用来定义对空值使用0填充
df3=frame1_a.add(frame1_b,fill_value=0)   #fill_value=0用来定义对空值使用0填充
df3.head()

【提醒】两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN。

1.6.4 通过泰坦尼克号数据如何计算出在船上最大的家族有多少人?
result=data['堂兄弟/妹个数'].add(data['父母与小孩个数'],fill_value=0)
# max(data)
max(result)
1.6.5 任务五:学会使用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'])
1.6.6 任务六:分别看看泰坦尼克号数据集中 票价、父母子女 这列数据的基本统计数据,你能发现什么?
'''
看看泰坦尼克号数据集中 票价 这列数据的基本统计数据
'''
#代码
data['票价'].describe()

【总结】学完数据分析第一部分:数据基础操作,认识到数据基础操作也细分为三个步骤:1.数据载入及初步观察 2.学会并熟悉pandas基础 3.开始探索性数据分析。通过这三个步骤,我们可以对数据进行简单的增删减改、查询、优化等操作,并通过探索性数据分析得出一些浅显的结论。