NASA Astronauts, 1959-Present
Which American Astronaut has spent the most time in space?
1. Prepare Data
- Alma Mater : 모교 (졸업학교인듯)
- Undergraduate Major : 학부 전공
- Graduate Major : 대학원 전공
- Military Rank : 군 계급
- Military Branch : 군 분류
- Space Flights : 우주 비행 횟수
- Space Flight (hr) : 우주 비행 총 시간
- Space Walks : 비행선 밖에서의 임무 수행 횟수 인듯
- Space Walks (hr) : 비행선 밖에서의 임무 수행 시간
In [78]:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import re
from matplotlib.pyplot import pie
In [79]:
%matplotlib inline
In [80]:
df = pd.read_csv("astronauts.csv")
df.head(3)
Out[80]:
In [81]:
df.info()
2. Changing Data Type
In [82]:
df['Year'] = df['Year'].astype(object)
df['Group'] = df['Group'].fillna(0)
df['Group'] = df['Group'].astype(int)
df['Group'] = df['Group'].astype(object)
df['Birth Date'] = pd.to_datetime(df['Birth Date'], format='%m/%d/%Y')
In [83]:
df[df['Death Date'].notnull()]['Death Date'] # strange Date
Out[83]:
In [84]:
df.ix[281,'Death Date'] = df.ix[281,'Death Date'][:6] + "20" + df.ix[281,'Death Date'][6:]
In [85]:
df['Death Date'] = pd.to_datetime(df['Death Date'], format='%m/%d/%Y')
In [86]:
df.head()
Out[86]:
3. Explore data
- 수치형 데이터 통계값 가지고오기.
- 우주 비행 횟수
- 우주 비행 시간
- 우주 비행선 밖에서의 임무 횟수
- 우주 비행선 밖에서의 임무 수행 시간
In [87]:
df.describe()
Out[87]:
3.0 남녀 성비
In [88]:
sns.factorplot('Gender',kind='count',data=df) # 남자가 비교되 안되게 많다.
Out[88]:
In [89]:
df[df['Gender']=='Female'].groupby(['Undergraduate Major']).size().sort_values(ascending=False)[:5]
Out[89]:
3.1 우주 비행 횟수 / 시간
- 비행 횟수
- 최대 7, 최소 0
- 평균 2
- 1~3회 정도 분포가 보인다.
In [90]:
df[df['Space Flights']==7] # 가장 많이 우주 비행을 한 비행사.
Out[90]:
In [91]:
plt.figure(figsize=(8,4))
sns.boxplot(df['Space Flights'])
Out[91]:
In [92]:
sns.factorplot('Space Flights',kind='count',data=df, size=6)
Out[92]:
- 비행시간
- 시간이다보니 다양한 시간이 있다.
- 평균 : 590시간
- 최대 : 12818시간
In [93]:
df[df['Space Flight (hr)']==12818]
Out[93]:
In [94]:
sns.boxplot(df['Space Flight (hr)']) # 오른쪽 꼬리
Out[94]:
In [95]:
sns.distplot(df['Space Flight (hr)'], hist=False)
Out[95]:
3.1.2 평균 비행 시간
In [96]:
Temp_df = df[["Space Flights","Space Flight (hr)"]]
In [97]:
def getAvg(x):
if x[0] != 0:
return x[1]/x[0]
else:
return 0
In [98]:
Temp_df['Ave Flights'] = Temp_df.apply(lambda x:getAvg(x), axis=1)
In [99]:
sns.distplot(Temp_df['Ave Flights'], hist=False)
Out[99]:
In [100]:
sns.boxplot(Temp_df['Ave Flights']) # 오른쪽 꼬리
Out[100]:
In [101]:
order = df.sort_values(by='Space Flight (hr)',ascending=False).head(20).index
In [102]:
sns.barplot(y='Space Flight (hr)',x=df.sort_values(by='Space Flight (hr)',ascending=False).head(20).index ,data=df.sort_values(by='Space Flight (hr)',ascending=False).head(20), order=order)
plt.xticks(rotation=90)
Out[102]:
과연 우주 비행 횟수와 밖에서 임무 수행 한 횟수가 관계가 있을까?
In [103]:
df.columns
Out[103]:
In [104]:
df[['Space Flights','Space Walks']].corr() # 0.25 그렇게 큰 상관관계가 있지는 않은걸로 판단 된다.
Out[104]:
밖으로 안나간사람의 특징
In [223]:
df[df['Space Walks'] ==0].groupby(['Graduate Major']).size().sort_values(ascending=False)[:5]
Out[223]:
In [226]:
df[df['Space Walks'] !=0].groupby(['Space Walks','Graduate Major']).size().sort_index(ascending=False)
Out[226]:
3.2 언제 가장 많이 비행사를 뽑았을까? ( 시작했을까? )
In [105]:
count_df = pd.DataFrame({'cnt':df['Year'].value_counts()}).reset_index()
count_df.columns = ['Year','Cnt']
count_df['Year'] = count_df['Year'].astype(np.int)
count_df
Out[105]:
- 1978 / 1996년이 가장 많은 우주비행사를 뽑았다. 왜???
1978 년
1996 년
In [106]:
fig, ax = plt.subplots(figsize=(10,6))
sns.barplot(x='Year', y='Cnt', data=count_df, ax=ax)
Out[106]:
3.3 어느 대학에 나온사람이 많은가?
- 그냥 그림그리기에는 대학의 종류가 너무 많다.
In [107]:
len(df['Alma Mater'].value_counts()) # 280개의 대학교. 최고 10개 대학을 뽑자.
Out[107]:
In [108]:
university_count = pd.DataFrame({'Cnt':df['Alma Mater'].value_counts()}).reset_index()
university_count = university_count.rename(columns={'index': 'Univ_Name'})
university_count.sort_values(by='Cnt',ascending=True)
university_count.head()
Out[108]:
In [109]:
_, ax = plt.subplots(figsize=(10,6))
sns.barplot(data=university_count.head(10), x='Cnt',y='Univ_Name',ax=ax,palette='GnBu_d')
plt.xticks(rotation=90)
Out[109]:
In [110]:
countCollege = df['Alma Mater'].value_counts()
plt.figure(figsize=(10,6))
sns.countplot(y='Alma Mater', data=df, order=countCollege.nlargest(10).index, palette='GnBu_d')
Out[110]:
3.4 학부 vs 대학원¶
In [111]:
df['GoToGraduate'] = df['Graduate Major'].apply(lambda x: 1 if type(x)==str else 0)
In [112]:
df['GoToGraduate'] = df['GoToGraduate'].map({0:"Under",1:'Gradu'})
In [113]:
df['GoToGraduate'].value_counts()
Out[113]:
In [114]:
GraduCount = df['GoToGraduate'].value_counts()
In [115]:
plt.figure(figsize=(7,7))
plt.rcParams['font.size'] = 16
patches, texts, autotexts = pie(GraduCount,labels = GraduCount.index, autopct='%1.1f%%' )
texts[0].set_fontsize(20)
texts[1].set_fontsize(20)
3.4.1 대학원 졸업생 중 어느 전공이 많을까?¶
- 2개 이상의 전공을 가진 사람도 꽤 있다.
In [116]:
Gradu_df = df[df['GoToGraduate']=="Gradu"].reset_index() # 대학원생 졸업.
del Gradu_df['index']
Gradu_df['Major_Cnt'] = Gradu_df['Graduate Major'].apply(lambda x:len(x.split(";")))
In [117]:
Gradu_df['Major_Cnt'].value_counts()
Out[117]:
In [118]:
sns.factorplot('Major_Cnt',kind='count',data=Gradu_df, size=5)
Out[118]:
In [119]:
Major_list = Gradu_df['Graduate Major'].str.split(";")
In [120]:
major_tmp = pd.DataFrame(Major_list.values.tolist()).reset_index()
major_tmp.columns = ['Stu_index','First','Second','Third', 'Fourth']
major_tmp = pd.melt(major_tmp,id_vars=['Stu_index'])
del major_tmp['variable']
major_tmp = major_tmp[major_tmp['value'].notnull()]
In [121]:
major_val_cnt = pd.DataFrame({'cnt':major_tmp['value'].value_counts()})
major_val_cnt.head()
Out[121]:
In [122]:
plt.figure(figsize=(10,8))
sns.set(font_scale=1.5)
sns.barplot(y=major_val_cnt.head(20).index,x='cnt',data=major_val_cnt.head(20))
plt.xlabel("Count of Major")
plt.ylabel("Name of Major")
Out[122]:
In [123]:
major_tmp['Engineering'] = major_tmp['value'].apply(lambda x:1 if 'Engineering' in x else 0)
major_tmp['Engineering'] = major_tmp['Engineering'].map({0:'Not Engineering',1:'Engineering'})
In [124]:
Engineering_Count = major_tmp['Engineering'].value_counts()
Engineering_Count
Out[124]:
In [125]:
plt.figure(figsize=(7,7))
plt.rcParams['font.size'] = 16
patches, texts, autotexts = pie(Engineering_Count,labels = Engineering_Count.index, autopct='%1.1f%%' )
texts[0].set_fontsize(20)
texts[1].set_fontsize(20)
3.5 현재 상태.
In [126]:
sns.factorplot('Status',kind='count',data=df,size=6)
Out[126]:
3.6 Group 상태¶
In [127]:
sns.factorplot('Group',kind='count',data=df,size=6)
Out[127]:
In [128]:
df['Military'] = df['Military Branch'].apply(lambda x: 1 if type(x) == str else 0)
df['Military'] = df['Military'].map({0:'Non Army',1:'Army'})
In [129]:
Mili_count = df['Military'].value_counts()
Mili_count
Out[129]:
In [130]:
plt.figure(figsize=(7,7))
plt.rcParams['font.size'] = 16
patches, texts, autotexts = pie(Mili_count,labels = Mili_count.index, autopct='%1.1f%%' )
texts[0].set_fontsize(20)
texts[1].set_fontsize(20)
3.7.2 군 구분 Count¶
In [131]:
df['Military_Branch'] = df['Military Branch'].str.replace(' \(Retired\)',"").str.strip()
In [132]:
Branch_cnt = df[df['Military_Branch'].notnull()]['Military_Branch'].value_counts()
In [133]:
plt.figure(figsize=(10,10))
plt.rcParams['font.size'] = 15
patches, texts, autotexts = pie(Branch_cnt,labels = Branch_cnt.index, autopct='%1.1f%%' )
texts[0].set_fontsize(20)
texts[1].set_fontsize(20)
3.7.3 군 계급¶
In [134]:
Mili_Rank_Count = df['Military Rank'].value_counts()
In [135]:
plt.figure(figsize=(10,10))
plt.rcParams['font.size'] = 15
patches, texts, autotexts = pie(Mili_Rank_Count,labels = Mili_Rank_Count.index, autopct='%1.1f%%' )
texts[0].set_fontsize(20)
texts[1].set_fontsize(20)
- colonel : 대령(육군)
- captain : 대령(해군 / 해안경비대)
- commander : 중령 ( 해군 / 해안경비대)
- Lieutenant Colonel : 중령 (육군)
- General 류 : 소령
In [136]:
Mili_Rank_Count.plot(kind='bar')
Out[136]:
3.8 태어난 지역¶
In [137]:
df['Birth Place'].head()
Out[137]:
In [138]:
def getPlace(x):
tmp_string = str.split(x,",")
if len(tmp_string) > 1:
return tmp_string[1]
else:
return tmp_string[0]
In [139]:
df['Born_State'] = df['Birth Place'].apply(lambda x:getPlace(x))
In [140]:
Born_count = df['Born_State'].value_counts()
In [141]:
sns.factorplot('Born_State',kind='count',data=df, order=Born_count.nlargest(10).index, palette='GnBu_d')
Out[141]:
3.9 Death Mission (참사가 일어난 현장)¶
In [142]:
DeathMission = df[df['Death Mission'].notnull()]['Death Mission'].value_counts()
In [143]:
DeathMission
Out[143]:
In [144]:
plt.figure(figsize=(6,6))
plt.rcParams['font.size'] = 15
patches, texts, autotexts = pie(DeathMission,labels = DeathMission.index, autopct='%1.1f%%' )
texts[0].set_fontsize(15)
texts[1].set_fontsize(15)
plt.title("Death Mission (total : 16)")
Out[144]:
3.10 Missions¶
- 최대 6번 까지 Mission을 했다.
In [145]:
df['Missions'] = df['Missions'].replace(np.nan, 0)
In [172]:
Mission_list = df[df['Missions'].notnull() & df['Missions']!=0]['Missions'].str.split(',')
In [173]:
df['Missions'].head(5)
Out[173]:
In [174]:
df.iloc[17]['Missions']
Out[174]:
In [175]:
def getMissionCnt(x):
if x == 0:
return 0
else:
return len(x.split(','))
In [176]:
df['Mission_cnt'] = df['Missions'].apply(lambda x:getMissionCnt(x))
In [177]:
df['Mission_cnt'].value_counts().sort_index().plot(kind='bar')
Out[177]:
In [182]:
Mission_df = pd.DataFrame(Mission_list.values.tolist()).reset_index()
In [184]:
Mission_melt_df = pd.melt(Mission_df,id_vars=['index'])
del Mission_melt_df['variable']
Mission_melt_df = Mission_melt_df[Mission_melt_df['value'].notnull()].reset_index()
del Mission_melt_df['level_0']
In [185]:
len(Mission_melt_df['value'].unique()) # 382 개 미션.
Out[185]:
In [186]:
#sns.factorplot('value',kind='count',data=Mission_melt_df,order=Mission_melt_df['value'].value_counts().nlargest(10).index, size=8)
#plt.xticks(rotation=90)
In [187]:
sns.countplot(y='value', data=Mission_melt_df, order=Mission_melt_df['value'].value_counts().nlargest(10).index, palette='GnBu_d')
Out[187]:
3.10.1 가장 많이 비행했던 우주비행선¶
In [188]:
def getSpaceShip(x):
space_shit = re.compile("\(([\w\d\-]+)\)")
SpaceShip = space_shit.findall(x)
if len(SpaceShip) > 0:
return SpaceShip[0]
else:
return x
In [190]:
Mission_melt_df['value'].apply(lambda x:getSpaceShip(x))[:5]
Out[190]:
In [191]:
Mission_melt_df['SpaceShip'] = Mission_melt_df['value'].apply(lambda x:getSpaceShip(x))
In [192]:
Mission_melt_df['SpaceShip'].unique()
Out[192]:
In [200]:
sns.countplot(y='SpaceShip', data=Mission_melt_df, order = Mission_melt_df['SpaceShip'].value_counts().nlargest(5).index)
Out[200]:
Group과 Year가 연관있다? 아마 기수로 판단됨.¶
In [209]:
df['Group'] = df['Group'].astype(int)
df['Year'] = df['Year'].fillna(0).astype(int)
In [217]:
df[(df['Group']!=0 & df['Year'])][['Group','Year']].corr()
Out[217]:
In [233]:
df['Name'].apply(lambda x:x.split(' ')[0]).value_counts()
Out[233]:
'BIGDATA > Kaggle[데이터 분석]' 카테고리의 다른 글
[Kaggle] Contrast Cancer, CT/MRI 조영제 투약 여부 분석 (Deep learning with Keras) (0) | 2017.09.04 |
---|---|
[kaggle] QVC Challenge, QVC(e-commerce) 어떠한 물건이 언제 어디서 팔릴 것 인가? (0) | 2017.09.04 |
[kaggle] School Alcohol holic problem, 어떠한 학생들이 알콜중독에 빠지는가? (0) | 2017.09.04 |
[Kaggle] IMDB 5000 Movies, 어떠한 요소가 영화 평점에 영향을 미치는가? (0) | 2017.09.04 |