目 录
0、概述
kaggle是一个数据挖掘网站,上面有许多各类数据挖掘问题与竞赛。对于数据挖掘专业的学生来说十分友好。
对我来说,无论是利用python进行数据分析还是pandas还是numpy都太枯燥了,因此选择用这个入门问题来学习一些有关数据挖掘的基本技能。
主要参考该网址的第二部分。对于大多数有一些pandas基础的人,直接看这个就可以了,我是初次接触这些,会把其中遇到的所有问题都写下来,供自己和大家查询。
1、Anaconda的准备
我这边有好几个虚拟环境,为了防止环境互相影响,决定对该问题新建一个环境。
参考网址使用Jupyter Notebook,所以在该环境里面要安装notebook。
安装好这些必须包以后,别忘了装nb_conda这个包,有了这个包才能随意在notebook里面切环境,否则只有一个默认环境没法切。如下:
不装nb_conda就只有第一个环境。
2、导入必需包和数据集
代码如下:
%matplotlib inline #notebook中的魔法函数
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore') #无视所有代码警告
train=pd.read_csv(r'F:\kaggle\titanic\train.csv') #读取训练集
test=pd.read_csv(r'F:\kaggle\titanic\test.csv') #读取测试集
PassengerId=test['PassengerId'] #读取测试集中PassengerId这一列
all_data=pd.concat([train,test],ignore_index=True) #将训练集和测试集合在一起
train.head()
上述代码的效果如下:
可以看到train已经成功保存了测试集中的数据。下面开始分析代码:
第一行的魔法函数的作用很简单,就是当我们使用plt.plot画一个函数之后,正常应该加一句plt.show才会显示图像,有了这句之后就不用再多写一句show了,plot之后直接显示图像。
之后是引入包,pandas和numpy不需要解释,seaborn是一个用于画图的库。
然后是warning的一句,这一句是隐藏所有的解释器的warning。
接下来进入正题:利用pandas的read_csv可以将csv文件的内容写入变量,作为一个类似二维数组的结构,称之为DataFrame。
如何对dataframe进行访问呢?
首先来看对列访问:
有三种形式,按行访问、按列访问、指定某元素访问。
对于按行访问:
比如说上面的第0行:
第一种:
test.iloc[0]
等价于访问“第0行”,iloc的特点是其访问的是从前往后数第几行,当然最开始的那行列名不算。
第二种:
test.loc[0]
等价于访问“序号那一列中名为0的行”,loc的特点是找左边第一列中名字与参数对得上的那一行并返回。
这俩效果都一样:
返回的都是Series。
按行访问还有一种类似切片的方式:
test[0:1]
效果如下:
相当于切下第0行,返回类型为DataFrame。
对于按列访问:
比如说对上文中的passergerId来说:
第一种:
test['PassengerId']
返回的效果如下:
其类型为Series,pandas中的一维数据结构,可以看做是字典,是序号到元素的映射。
第二种:
test[['PassengerId']]
返回的效果如下:
其类型为DataFrame,pandas中的二维数据结构。
访问某个指定元素:
可以混合使用上面的方法,毕竟返回的不是DataFrame就是Series,直接继续访问就好:
例如:
test.loc[0]['Name']
访问第0行中名为name的列。
又如:
test['Name'][0]
访问name这列中的第0个。
扯远了。接着看这里的代码。下一行就是按列访问名为PassengerId这一列,返回的是Series。
然后将测试集和训练集黏在一起,用的是concat函数。
最后访问训练集的前五行,用head,后五行则用tail。
3、数据分析
3.1 数据概览
我们既然已经将数据集导入了,那就来看看里面都是什么吧。
回想起我在数据挖掘课上刚学的那点三脚猫功夫:
列名就是每个人的属性咯,这样看来:
PassengerId为乘客序号,序数属性,没任何用——八成就是一个捞上来的顺序问题;
Survived为是否生还,二元属性,只有0和1,这是最重要的属性,是我们最后要预测的属性;
Pclass为客舱等级,数值属性,取值1,2,3,看上去应该挺重要的,是不是客舱等级越高就越容易生还?;
Name为乘客名字,标称属性,取值为人名,我觉得很难从中提取出什么属性,或许没名字代表必死?;
Sex为性别,二元属性,取值0,1,看来那个时候对于性别划分还没那么复杂;
Age为年龄,数值属性,取值整数,同样重要,老弱先行么;
SibSp为兄弟数量,数值属性;
Parch为父母与子女数量,数值属性,其值0,1,2,3等;
Ticket为船票编号,标称属性,和乘客名字差不多;
Fare为票价,数值属性,但是不是离散而是连续,应该和客舱等级有一定的联系,效果也差不多;
Cabin为房间号,标称属性,可能房间号有一定的规律;
Embarked上船的港口编号,标称属性。
知道了这些都是啥,下面来看看数据的缺失吧。很简单,使用如下指令:
train.info()
效果如下: