这篇文章适合给谁看?
我是一名从能源转行做数分的研二学生,看了近4个月python,之前对计算机接近0基础(c语言都考不过),首先这篇适合给那些跟我一样转行的朋友,转行不易,坚持第一!其次这篇文章也适合给那些准备面试的朋友,了解数据分析的大概流程,粗数据如何处理,这点比能多调用一个学习包更有作用~这篇文章大部分都是我从别的博客上引用的,感谢网路上的各位大神~
项目概述:
这是一个二分类问题,提供的特征有Pclass,Sex,SibSp,Parch,Embarked这类的离散值(包含离散的数字和文本),Age这类连续的数字以及Name,Fare,Ticket这类的文本,其中包含有缺失值;最后要对乘客进行0,1预测(1表示生还)。
对粗数据进行观察:
- 观察样本特征:使用.head()方法
- 观察缺失数据:使用.info()方法
- 观察数字特征:使用.describe()方法,可以得到平均值,中位数,平均生还率等等
- 观察字符串特征:使用.describe(include=[‘O’]),可以得到分类数,频率较高值等等
利用图表对数据进行观察:
- 对于离散的特征,利用表格观察其与分类间的关系,比如:
print train_df[['Pclass','Survived']].groupby(['Pclass'],as_index=False).mean().sort_values(by='Survived',ascending=False)
生成结果:
Pclass Survived
0 1 0.629630
1 2 0.472826
2 3 0.242363
Sex Survived
0 female 0.742038
1 male 0.188908
SibSp Survived
1 1 0.535885
2 2 0.464286
0 0 0.345395
3 3 0.250000
4 4 0.166667
5 5 0.000000
6 8 0.000000
Parch Survived
3 3 0.600000
1 1 0.550847
2 2 0.500000
0 0 0.343658
5 5 0.200000
4 4 0.000000
6 6 0.000000
由此可见:一等舱的乘客、女性、有1个兄弟姐妹或配偶(SibSp)以及有三个子女或父母(Parch)的乘客生还几率最大,这有利于之后做特征
- 对于连续的特征,利用直方图观察其与分类间的关系,比如:
g = sns.FacetGrid(train_df, col='Survived')#sns为seaborn模块
g.map(plt.hist, 'Age', bins=4)#bins指把数值区间分成几块
plt.show()
生成结果:
由此可见:年龄与生还率有很大的关系,小孩生还的几率更大,这表明,年龄与生还率并不是简单的线性关系,这一点如果要给年龄切片做哑变量时会用到
进行简单的特征工程:
之所以称之为简单,是因为把一些看上去没什么用的特征直接删除了,比如Ticket以及Cabin,这两者都是看上去杂乱无章的。
- 对缺失值进行填充处理,可以用0填充,也可以用平均值,中位数等等,比如:
dataset['Title'] = dataset['Title'].fillna(0)
#fillna()用来填充缺失值,此处用0取代缺失值,也可以fillna('missing')
guess_ages = np.zeros((2,3))
#根据sex与pclass来对age进行更精确的填充
for dataset in combine:
for i in range(0, 2):
for j in range(0, 3):
guess_df = dataset[(dataset['Sex'] == i) & \
(dataset['Pclass'] == j + 1)]['Age'].dropna() #dropna()用来删除缺失数据
# if(i==1)&(j==1):
# print guess_df
# age_mean = guess_df.mean() #平均值
# age_std = guess_df.std()#标准差
# age_guess = rnd.uniform(age_mean - age_std, age_mean + age_std) #给出随机数的最小值和最大值,随机生成中间值
age_guess = guess_df.median() #中位数
# Convert random age float to nearest .5 age
guess_ages[i, j] = int(age_guess / 0.5 + 0.5) * 0.5
for i in range(0, 2):
for j in range(0, 3):
dataset.loc[(dataset.Age.isnull()) & (dataset.Sex == i) & (dataset.Pclass == j + 1), \
'Age'] = guess_ages[i, j]
- 将连续的数字型特征离散化:
如何选择切割的点呢?可以简单粗暴地均分:
#对于age进行数字上的切割,将连续变幻的量变成离散值
train_df['AgeBand']=pd.cut(train_df['Age'],5)
print train_df[['AgeBand','Survived']].groupby(['AgeBand'],as_index=False).mean().sort_values(by='AgeBand',ascending=True)
结果如下:
AgeBand Survived
0 (-0.08, 16] 0.550000
1 (16, 32] 0.337374
2 (32, 48] 0.412037
3 (48, 64] 0.434783
4 (64, 80] 0.090909
然后就可以为不同年龄段打上标签:
for dataset in combine:
dataset.loc[dataset['Age']<=16,'Age']=0
dataset.loc[(dataset['Age']>16)&(dataset['Age']<=32),'Age']