<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 人生苦短，我用python
泰坦尼克数据处理与分析
<img src='https
Step1:  导入数据
Step2:  快速预览
Step3:  | 单词 | 翻译 
| ---
Step4:  处理空值
Step5:  尝试从性别进行分析
Step6:  通过上面图片可以看出：性别特征对是否生还的影响还是挺大的
从年龄进行分析
Step7:  分析票价
Step8:  可以看出低票价的人的生还率比较低
组合特征
Step9:  隐含特征
Step10:  gdp
<ASSISTANT_TASK:>
Python Code:
import pandas as pd
%matplotlib inline
Explanation: 人生苦短，我用python
泰坦尼克数据处理与分析
<img src='https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1502440065892&di=51db15bf76374068735a690806ad66a2&imgtype=0&src=http%3A%2F%2Fwww.pp3.cn%2Fuploads%2F201607%2F20160708007.jpg'>
End of explanation
# 如果不知道函数名是什么，可以只敲击函数前几个，然后按tab键，就会有下拉框提示
titanic = pd.read_csv('train.csv')
Explanation: 导入数据
End of explanation
titanic.head()
Explanation: 快速预览
End of explanation
titanic.info()
# 把所有数值类型的数据做一个简单的统计
titanic.describe()
# 统计None值个数
titanic.isnull().sum()
Explanation: | 单词 | 翻译 
| ---: | :--- 
| pclass | 社会阶层(1，精英；2，中层；3，船员/劳苦大众) 
| survived | 是否幸存 
| name | 名字 
| sex | 性别 
| age | 年龄 
| sibsp | 兄弟姐妹配偶个数  sibling spouse
| parch | 父母儿女个数 
| ticket | 船票号 
| fare | 船票价钱 
| cabin | 船舱 
| embarked| 登船口
End of explanation
# 可以填充整个datafram里边的空值, 可以取消注释，实验一下
# titanic.fillna(0)
# 单独选择一列进行控制填充，可以取消注释，实验一下
# titanic.Age.fillna(0)
# 年龄的中位数
titanic.Age.median()
# 按年龄的中位数去填充，此时是返回一个新的Series
# titanic.Age.fillna(titanic.Age.median())
# 直接填充，并不返回新的Series
titanic.Age.fillna(titanic.Age.median(), inplace=True)
# 再次查看Age的空值
titanic.isnull().sum()
Explanation: 处理空值
End of explanation
# 做简单的汇总统计，经常用到
titanic.Sex.value_counts()
# 生还者中，男女的人数
survived = titanic[titanic.Survived==1].Sex.value_counts()
# 未生还者中，男女的人数
dead = titanic[titanic.Survived==0].Sex.value_counts()
df = pd.DataFrame([survived, dead], index=['survived', 'dead'])
df.plot.bar()
# 绘图成功，但是不是我们想要的效果
# 把dataframe转置一下，就是行列替换
df = df.T
df.plot.bar() # df.plot(kind='bar') 等价的
# 仍然不是我们想要的结果
df.plot(kind='bar', stacked=True)
# 男女中生还者的比例情况
df['p_survived'] = df.survived / (df.survived + df.dead)
df['p_dead'] = df.dead / (df.survived + df.dead)
df[['p_survived', 'p_dead']].plot.bar(stacked=True)
Explanation: 尝试从性别进行分析
End of explanation
# 简单统计
# titanic.Age.value_counts()
survived = titanic[titanic.Survived==1].Age
dead = titanic[titanic.Survived==0].Age
df = pd.DataFrame([survived, dead], index=['survived', 'dead'])
df = df.T
df.plot.hist(stacked=True)
# 直方图柱子显示多一点
df.plot.hist(stacked=True, bins=30)
# 中间很高的柱子，是因为我们把空值都替换为了中位数
# 密度图, 更直观一点
df.plot.kde()
# 可以查看年龄的分布，来绝对我们图片横轴的取值范围
titanic.Age.describe()
# 限定范围
df.plot.kde(xlim=(0,80))
age = 16
young = titanic[titanic.Age<=age]['Survived'].value_counts()
old = titanic[titanic.Age>age]['Survived'].value_counts()
df = pd.DataFrame([young, old], index=['young', 'old'])
df.columns = ['dead', 'survived']
df.plot.bar(stacked=True)
# 男女中生还者的比例情况
df['p_survived'] = df.survived / (df.survived + df.dead)
df['p_dead'] = df.dead / (df.survived + df.dead)
df[['p_survived', 'p_dead']].plot.bar(stacked=True)
Explanation: 通过上面图片可以看出：性别特征对是否生还的影响还是挺大的
从年龄进行分析
End of explanation
# 票价跟年龄特征相似
survived = titanic[titanic.Survived==1].Fare
dead = titanic[titanic.Survived==0].Fare
df = pd.DataFrame([survived, dead], index=['survived', 'dead'])
df = df.T
df.plot.kde()
# 设定xlim范围，先查看票价的范围
titanic.Fare.describe()
df.plot(kind='kde', xlim=(0,513))
Explanation: 分析票价
End of explanation
# 比如同时查看年龄和票价对生还率的影响
import matplotlib.pyplot as plt 
plt.scatter(titanic[titanic.Survived==0].Age, titanic[titanic.Survived==0].Fare)
# 不美观
ax = plt.subplot()
# 未生还者
age = titanic[titanic.Survived==0].Age
fare = titanic[titanic.Survived==0].Fare
plt.scatter(age, fare, s=20, marker='o', alpha=0.3, linewidths=1, edgecolors='gray')
# 生还者
age = titanic[titanic.Survived==1].Age
fare = titanic[titanic.Survived==1].Fare
plt.scatter(age, fare, s=20, marker='o', alpha=0.3, linewidths=1, edgecolors='gray', c='red')
ax.set_xlabel('age')
ax.set_ylabel('fare')
Explanation: 可以看出低票价的人的生还率比较低
组合特征
End of explanation
titanic.Name.describe()
titanic['title'] = titanic.Name.apply(lambda name: name.split(',')[1].split('.')[0].strip())
s = 'Williams, Mr. Howard Hugh "Harry"'
s.split(',')[-1].split('.')[0].strip()
titanic.title.value_counts()
# 比如有一个人被称为 Mr，而年龄是不知道的，这个时候可以用 所有 Mr 的年龄平均值来替代，而不是用我们之前最简单的所有数据的中位数
Explanation: 隐含特征
End of explanation
# 夜光图，简单用灯光图的亮度来模拟gdp
titanic.head()
titanic['family_size'] = titanic.SibSp + titanic.Parch + 1
titanic.family_size.value_counts()
def func(family_size):
    if family_size == 1:
        return 'Singleton'
    if family_size<=4 and family_size>=2:
        return 'SmallFamily'
    if family_size > 4:
        return 'LargeFamily'
    
titanic['family_type'] = titanic.family_size.apply(func)
titanic.family_type.value_counts()
Explanation: gdp
End of explanation
<END_TASK>