如何进行数据分析(以kaggle新手赛为例)-1:

这篇文章适合给谁看?

我是一名从能源转行做数分的研二学生,看了近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()

生成结果:
hist图
由此可见:年龄与生还率有很大的关系,小孩生还的几率更大,这表明,年龄与生还率并不是简单的线性关系,这一点如果要给年龄切片做哑变量时会用到

进行简单的特征工程:

之所以称之为简单,是因为把一些看上去没什么用的特征直接删除了,比如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']
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值