1 概述
这门课程得主要目的是通过真实的数据,以实战的方式了解数据分析的流程和熟悉数据分析python的基本操作。知道了课程的目的之后,我们接下来我们要正式的开始数据分析的实战教学,完成kaggle上泰坦尼克的任务,实战数据分析全流程。
这里有两份资料:
教材《Python for Data Analysis》和 baidu.com &
google.com(善用搜索引擎)
2 数据载入及初步观察
2.1 载入数据
数据集下载 https://www.kaggle.com/c/titanic/overview
-
导入模块
1
2import numpy as nnp
import pandas as pd
2.2 加载数据
-
相对路径
1
'./train.csv', encoding = 'utf-8') data = pd.read_csv(
-
绝对路径
1
r"D:\Demo\University\XMU\Python\Artificial-intelligence\Data analysis\第一单元项目集合\train.csv", encoding = 'utf-8') data = pd.read_csv(
-
read_table
读取1
2# 设置 sep
'./train.csv', sep = ',') data = pd.read_table( -
获取当前路径
1
2
3
4import os
print(os.getcwd())
D:\Demo\University\XMU\Python\Artificial-intelligence\Data analysis\第一单元项目集合 -
逐块读取
每500行为一个数据模块,逐块读取
1
2
3
4
5
6
7# 设置 chunksize 参数
'train.csv', chunksize=500) chunker = pd.read_csv(
for df in chunker:
print(type(df), df.shape)
<class 'pandas.core.frame.DataFrame'> (500, 12)
<class 'pandas.core.frame.DataFrame'> (391, 12)
2.3 数据预处理
2.3.1 更改表头
索引改为乘客ID(对于某些英文资料,我们可以通过翻译来更直观的熟悉我们的数据):
PassengerId => 乘客ID
Survived => 是否幸存
Pclass => 乘客等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别
Age => 年龄
SibSp => 堂兄弟/妹个数
Parch => 父母与小孩个数
Ticket => 船票信息
Fare => 票价
Cabin => 客舱
Embarked => 登船港口
-
方式一
1
2
3
4
5'PassengerId': '乘客ID', 'Survived': '是否幸存', 'Pclass': '乘客等级(1/2/3等舱位)', maps = {
'Name': '乘客姓名', 'Sex': '性别', 'Age': '年龄', 'SibSp': '堂兄弟/妹个数',
'Parch': '父母与小孩个数', 'Ticket': '船票信息', 'Fare': '票价',
'Cabin': '客舱', 'Embarked': '登船港口'}
True) data.rename(columns=maps, inplace= -
方式二
1
2
3
4'./train.csv', encoding = 'utf-8') data = data = pd.read_csv(
'乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数', columns = [
'父母子女个数','船票信息','票价','客舱','登船港口']
data.columns = columns -
方式三
1
2
3
4'train.csv', df = pd.read_csv(
names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄', '兄弟姐妹个数',
'父母子女个数','船票信息','票价','客舱','登船港口'],
index_col='乘客ID',header=0)
2.3.2 初步观察
导入数据后,你可能要对数据的整体结构和样例进行概览,比如说,数据大小、有多少列,各列都是什么格式的,是否包含null等。
-
查看信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 乘客ID 891 non-null int64
1 是否幸存 891 non-null int64
2 仓位等级 891 non-null int64
3 姓名 891 non-null object
4 性别 891 non-null object
5 年龄 714 non-null float64
6 兄弟姐妹个数 891 non-null int64
7 父母子女个数 891 non-null int64
8 船票信息 891 non-null object
9 票价 891 non-null float64
10 客舱 204 non-null object
11 登船港口 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB -
开头和结尾
1
10) data.head(
乘客ID 是否幸存 仓位等级 姓名 性别 年龄 兄弟姐妹个数 父母子女个数 船票信息 票价 客舱 登船港口 0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S 3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S 4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S 5 6 0 3 Moran, Mr. James male NaN 0 0 330877 8.4583 NaN Q 6 7 0 1 McCarthy, Mr. Timothy J male 54.0 0 0 17463 51.8625 E46 S 7 8 0 3 Palsson, Master. Gosta Leonard male 2.0 3 1 349909 21.0750 NaN S 8 9 1 3 Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) female 27.0 0 2 347742 11.1333 NaN S 9 10 1 2 Nasser, Mrs. Nicholas (Adele Achem) female 14.0 1 0 237736 30.0708 NaN C 1
15) data.tail(
乘客ID 是否幸存 仓位等级 姓名 性别 年龄 兄弟姐妹个数 父母子女个数 船票信息 票价 客舱 登船港口 876 877 0 3 Gustafsson, Mr. Alfred Ossian male 20.0 0 0 7534 9.8458 NaN S 877 878 0 3 Petroff, Mr. Nedelio male 19.0 0 0 349212 7.8958 NaN S 878 879 0 3 Laleff, Mr. Kristo male NaN 0 0 349217 7.8958 NaN S 879 880 1 1 Potter, Mrs. Thomas Jr (Lily Alexenia Wilson) female 56.0 0 1 11767 83.1583 C50 C 880 881 1 2 Shelley, Mrs. William (Imanita Parrish Hall) female 25.0 0 1 230433 26.0000 NaN S 881 882 0 3 Markun, Mr. Johann male 33.0 0 0 349257 7.8958 NaN S 882 883 0 3 Dahlberg, Miss. Gerda Ulrika female 22.0 0 0 7552 10.5167 NaN S 883 884 0 2 Banfield, Mr. Frederick James male 28.0 0 0 C.A./SOTON 34068 10.5000 NaN S 884 885 0 3 Sutehall, Mr. Henry Jr male 25.0 0 0 SOTON/OQ 392076 7.0500 NaN S 885 886 0 3 Rice, Mrs. William (Margaret Norton) female 39.0 0 5 382652 29.1250 NaN Q 886 887 0 2 Montvila, Rev. Juozas male 27.0 0 0 211536 13.0000 NaN S 887 888 1 1 Graham, Miss. Margaret Edith female 19.0 0 0 112053 30.0000 B42 S 888 889 0 3 Johnston, Miss. Catherine Helen "Carrie" female NaN 1 2 W./C. 6607 23.4500 NaN S 889 890 1 1 Behr, Mr. Karl Howell male 26.0 0 0 111369 30.0000 C148 C 890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.7500 NaN Q -
判断是否为空
1
data.isnull().head()
乘客ID 是否幸存 仓位等级 姓名 性别 年龄 兄弟姐妹个数 父母子女个数 船票信息 票价 客舱 登船港口 0 False False False False False False False False False False True False 1 False False False False False False False False False False False False 2 False False False False False False False False False False True False 3 False False False False False False False False False False False False 4 False False False False False False False False False False True False -
描述性统计
1
data.describe()
乘客ID 是否幸存 仓位等级 年龄 兄弟姐妹个数 父母子女个数 票价 count 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000 mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208 std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429 min 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000 25% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400 50% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200 75% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000 max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200 -
重复
1
2
3
4
5
6
7
8
9
10
11
12
13
14data.duplicated()
0 False
1 False
2 False
3 False
4 False
...
886 False
887 False
888 False
889 False
890 False
Length: 891, dtype: bool
2.4 保存数据
1 | 'train_chinese.csv', encoding = 'ansi') df.to_csv( |
【总结】数据的加载以及入门,接下来就要接触数据本身的运算,我们将主要掌握numpy和pandas在工作和项目场景的运用。
3 探索性数据分析
复习: 前面已经学习了Pandas基础,知道利用Pandas读取csv数据的增删查改。这一章节学习的是 探索性数据分析,主要介绍如何利用Pandas进行排序、算术计算以及计算描述函数describe()的使用。
3.1 加载数据
1 | #载入之前保存的train_chinese.csv数据,关于泰坦尼克号的任务,我们就使用这个数据 |
�˿�ID | �Ƿ��Ҵ� | ��λ�ȼ� | ���� | �Ա� | ����.1 | �ֵܽ��ø��� | ��ĸ��Ů���� | ��Ʊ��Ϣ | Ʊ�� | �Ͳ� | �Ǵ��ۿ� | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.25 | NaN | S |
可以发现直接读取会产生乱码,因此需要设置编码格式
1 | 'train_chinese.csv', encoding = 'ansi') data = pd.read_csv( |
乘客ID | 是否幸存 | 仓位等级 | 姓名 | 性别 | 年龄 | 兄弟姐妹个数 | 父母子女个数 | 船票信息 | 票价 | 客舱 | 登船港口 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
3.2 了解数据
详细请参考教材《Python for Data Analysis》第五章
3.2.1 排序
-
理论
具体请看《利用Python进行数据分析》第五章 排序和排名 部分
1
2
3
4
5# 构建数据
8).reshape((2, 4)), frame = pd.DataFrame(np.arange(
index=['2', '1'],
columns=['d', 'a', 'b', 'c'])
framed a b c 2 0 1 2 3 1 4 5 6 7 1
# 索引升序frame.sort_index(axis = 0, ascending = True)
d a b c 1 4 5 6 7 2 0 1 2 3 Note:
axis
: 控制索引的维度,默认为axis = 0
即行索引。将axis
设置为1
可以更改为按列排序.ascending
: 控制升序 / 降序。默认为ascending = True
,即升序排列。- 此外,可以通过设置
by
参数,选择多列进行排序。如by = ['a', 'c']
。
-
实操
对
data
数据按票价和年龄两列进行综合排序(降序排列)1
'票价', '年龄'], ascending=False).head(3) data.sort_values(by=[
乘客ID 是否幸存 仓位等级 姓名 性别 年龄 兄弟姐妹个数 父母子女个数 船票信息 票价 客舱 登船港口 679 680 1 1 Cardeza, Mr. Thomas Drake Martinez male 36.0 0 1 PC 17755 512.3292 B51 B53 B55 C 258 259 1 1 Ward, Miss. Anna female 35.0 0 0 PC 17755 512.3292 NaN C 737 738 1 1 Lesurer, Mr. Gustave J male 35.0 0 0 PC 17755 512.3292 B101 C 排序后,如果我们仅仅关注年龄和票价两列。根据常识我知道发现票价越高的应该客舱越好,所以我们会明显看出,票价前20的乘客中存活的高达14人。
3.2.2 算数计算
具体参照《利用Python进行数据分析》第五章 算术运算与数据对齐部分
1 | 9.).reshape(3, 3), frame1_a = pd.DataFrame(np.arange( |
1 | frame1_a |
a | b | c | |
---|---|---|---|
one | 0.0 | 1.0 | 2.0 |
two | 3.0 | 4.0 | 5.0 |
three | 6.0 | 7.0 | 8.0 |
1 | frame1_b |
a | e | c | |
---|---|---|---|
first | 0.0 | 1.0 | 2.0 |
one | 3.0 | 4.0 | 5.0 |
two | 6.0 | 7.0 | 8.0 |
second | 9.0 | 10.0 | 11.0 |
-
加法
1
2# 将frame_a和frame_b进行相加
frame1_a + frame1_ba b c e first NaN NaN NaN NaN one 3.0 NaN 7.0 NaN second NaN NaN NaN NaN three NaN NaN NaN NaN two 9.0 NaN 13.0 NaN
3.2.3 极值
查看最大的家族有多少人(‘兄弟姐妹个数’+‘父母子女个数’)
1 | max(data['兄弟姐妹个数'] + data['父母子女个数']) |
1 | '父母子女个数'].describe() data[ |
4 Pandas 基础
-
DataFrame and Series
1
2
3
4
5
6
7
8
9'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000} sdata = {
example_1 = pd.Series(sdata)
example_1
Ohio 35000
Texas 71000
Oregon 16000
Utah 5000
dtype: int641
2
3
4'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], temp = {
'year': [2000, 2001, 2002, 2001, 2002, 2003],'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
example_2 = pd.DataFrame(temp)
example_2state year pop 0 Ohio 2000 1.5 1 Ohio 2001 1.7 2 Ohio 2002 3.6 3 Nevada 2001 2.4 4 Nevada 2002 2.9 5 Nevada 2003 3.2
4.1 数据特征
-
列名称
1
2
3data_en.columns
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype='object') -
查看某些的信息
1
2
3'Cabin'].head(3) data_en[
0 NaN1 C852 NaNName: Cabin, dtype: object1
2
33) data_en.Cabin.head(
0 NaN1 C852 NaNName: Cabin, dtype: object
4.2 删除多余的列
1 | 'test_1.csv') test_1 = pd.read_csv( |
Unnamed: 0 | PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | a | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S | 100 |
1 | 1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C | 100 |
2 | 2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S | 100 |
经过我们的观察发现一个测试集 test_1.csv
有两列是多余的,需要将多余的列删去。
-
del
1
2
3# 删除多余的列
del test_1['a']
3) test_1.head(Unnamed: 0 PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked 0 0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 1 1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 2 2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S -
drop
1
'a', axis = 1, inplace = True)# test_1 = test_1.drop('a', axis = 1)test_1.head(3) test_1.drop(
Unnamed: 0 PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked 0 0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 1 1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 2 2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S Note:
inplace
:是否替换原始的数据,也可以使用第二行的代码进行替代或存储为新的变量。默认为False
,即不替换axis
:在行/列的维度进行操作。- 0: Row
- 1: Column
-
Replace
1
1:-2] test_1 = test_1.iloc[:,
可以通过
loc
和iloc
方法进行取位置来替换原始的数据。
4.3 隐藏信息
1 | 'PassengerId','Name','Age','Ticket'],axis=1).head(3) data_en.drop([ |
Survived | Pclass | Sex | SibSp | Parch | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|
0 | 0 | 3 | male | 1 | 0 | 7.2500 | NaN | S |
1 | 1 | 1 | female | 1 | 0 | 71.2833 | C85 | C |
2 | 1 | 3 | female | 0 | 0 | 7.9250 | NaN | S |
上述也可用下述代码实现:
1 | 'PassengerId','Name','Age','Ticket'])data_en.drop(columns, axis=1).head(3) columns = data_en.columns.drop([ |
PassengerId | Name | Age | Ticket | |
---|---|---|---|---|
0 | 1 | Braund, Mr. Owen Harris | 22.0 | A/5 21171 |
1 | 2 | Cumings, Mrs. John Bradley (Florence Briggs Th... | 38.0 | PC 17599 |
2 | 3 | Heikkinen, Miss. Laina | 26.0 | STON/O2. 3101282 |
Note:
drop
方法将数据从原数据中去掉,如果不设置 inplace = True
参数的话,默认是用一个临时变量存储新得到的数据。
4.3.1 数据筛选
表格数据中,最重要的一个功能就是要具有可筛选的能力,选出我所需要的信息,丢弃无用的信息。
-
判别式
1
"Age"]<10].head(3) data_en[data_en[
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked 7 8 0 3 Palsson, Master. Gosta Leonard male 2.0 3 1 349909 21.075 NaN S 10 11 1 3 Sandstrom, Miss. Marguerite Rut female 4.0 1 1 PP 9549 16.700 G6 S 16 17 0 3 Rice, Master. Eugene male 2.0 4 1 382652 29.125 NaN Q 1
2"Age"]>10) & (data_en["Age"]<50)] midage = data_en[(data_en[
3) midage.head(PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked 0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
4.3.2 数据提取
将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
1 | True) midage = midage.reset_index(drop= |
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
Note:
reset_index()
的作用是重置索引值,drop
参数表示是否去掉原始的索引值。
-
loc
方法1
100],['Pclass','Sex']] midage.loc[[
Pclass Sex 100 2 male 1
100,105,108],['Pclass','Name','Sex']] midage.loc[[
Pclass Name Sex 100 2 Byles, Rev. Thomas Roussel Davids male 105 3 Cribb, Mr. John Hatfield male 108 3 Calic, Mr. Jovo male -
iloc
方法1
100,105,108],[2,3,4]] midage.iloc[[
Pclass Name Sex 100 2 Byles, Rev. Thomas Roussel Davids male 105 3 Cribb, Mr. John Hatfield male 108 3 Calic, Mr. Jovo male
【总结】: loc
方法的操作对象是 label
标签,而 iloc
方法的操作对象是标签的索引值。
此外如果要对 DataFrame
对象中的数据进行重赋值操作的话,如果使用的是 loc
方法,当赋值的 label
在数据表中不存在时,会默认新建一列,而 iloc
方法只能在数据表中现有的索引内容中进行覆写,索引值不能超过现有的 shape
值。