In [37]:
import pandas as pd
%matplotlib inline
In [8]:
# 如果不知道函数名是什么,可以只敲击函数前几个,然后按tab键,就会有下拉框提示
titanic = pd.read_csv('train.csv')
In [5]:
titanic.head()
Out[5]:
单词 | 翻译 |
---|---|
pclass | 社会阶层(1,精英;2,中层;3,船员/劳苦大众) |
survived | 是否幸存 |
name | 名字 |
sex | 性别 |
age | 年龄 |
sibsp | 兄弟姐妹配偶个数 sibling spouse |
parch | 父母儿女个数 |
ticket | 船票号 |
fare | 船票价钱 |
cabin | 船舱 |
embarked | 登船口 |
In [6]:
titanic.info()
In [7]:
# 把所有数值类型的数据做一个简单的统计
titanic.describe()
Out[7]:
In [13]:
# 统计None值个数
titanic.isnull().sum()
Out[13]:
In [18]:
# 可以填充整个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()
In [22]:
# 做简单的汇总统计,经常用到
titanic.Sex.value_counts()
Out[22]:
In [34]:
# 生还者中,男女的人数
survived = titanic[titanic.Survived==1].Sex.value_counts()
In [29]:
# 未生还者中,男女的人数
dead = titanic[titanic.Survived==0].Sex.value_counts()
In [45]:
df = pd.DataFrame([survived, dead], index=['survived', 'dead'])
df.plot.bar()
Out[45]:
In [46]:
# 绘图成功,但是不是我们想要的效果
# 把dataframe转置一下,就是行列替换
df = df.T
df.plot.bar() # df.plot(kind='bar') 等价的
Out[46]:
In [48]:
# 仍然不是我们想要的结果
df.plot(kind='bar', stacked=True)
Out[48]:
In [58]:
# 男女中生还者的比例情况
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)
Out[58]:
通过上面图片可以看出:性别特征对是否生还的影响还是挺大的
In [63]:
# 简单统计
# titanic.Age.value_counts()
In [71]:
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)
Out[71]:
In [73]:
# 直方图柱子显示多一点
df.plot.hist(stacked=True, bins=30)
# 中间很高的柱子,是因为我们把空值都替换为了中位数
Out[73]:
In [74]:
# 密度图, 更直观一点
df.plot.kde()
Out[74]:
In [75]:
# 可以查看年龄的分布,来绝对我们图片横轴的取值范围
titanic.Age.describe()
Out[75]:
In [77]:
# 限定范围
df.plot.kde(xlim=(0,80))
Out[77]:
In [96]:
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)
Out[96]:
In [97]:
# 男女中生还者的比例情况
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)
Out[97]:
In [105]:
# 票价跟年龄特征相似
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()
Out[105]:
In [106]:
# 设定xlim范围,先查看票价的范围
titanic.Fare.describe()
Out[106]:
In [107]:
df.plot(kind='kde', xlim=(0,513))
Out[107]:
可以看出低票价的人的生还率比较低
In [111]:
# 比如同时查看年龄和票价对生还率的影响
import matplotlib.pyplot as plt
plt.scatter(titanic[titanic.Survived==0].Age, titanic[titanic.Survived==0].Fare)
Out[111]:
In [138]:
# 不美观
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')
Out[138]:
In [141]:
titanic.Name.describe()
Out[141]:
In [147]:
titanic['title'] = titanic.Name.apply(lambda name: name.split(',')[1].split('.')[0].strip())
In [146]:
s = 'Williams, Mr. Howard Hugh "Harry"'
s.split(',')[-1].split('.')[0].strip()
Out[146]:
In [149]:
titanic.title.value_counts()
# 比如有一个人被称为 Mr,而年龄是不知道的,这个时候可以用 所有 Mr 的年龄平均值来替代,而不是用我们之前最简单的所有数据的中位数
Out[149]:
In [151]:
# 夜光图,简单用灯光图的亮度来模拟gdp
In [152]:
titanic.head()
Out[152]:
In [153]:
titanic['family_size'] = titanic.SibSp + titanic.Parch + 1
In [155]:
titanic.family_size.value_counts()
Out[155]:
In [156]:
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)
In [158]:
titanic.family_type.value_counts()
Out[158]:
In [ ]: