EDA zbioru danych o wyścigu kosmicznym

May 08 2023
Kto? Gdy? Za ile?
Przedstawiamy wysiłki ludzkości związane z „wystrzeleniem rakiety”. Przekonajmy się „jak” w jak długim czasie tak naprawdę próbujemy niewiarygodnie skomplikowanej sztuki „wystrzeliwania rakiet”, skąd wolimy wystrzeliwać te szczenięta, kim w ogóle jest to „my” i ile to tak naprawdę kosztuje ? 1.

Przedstawiamy wysiłki ludzkości związane z „wystrzeleniem rakiety”. Dowiedzmy
się „jak” w jak długim czasie tak naprawdę próbujemy niewiarygodnie skomplikowanej sztuki „wystrzeliwania rakiet”, skąd wolimy wystrzeliwać te szczenięta, kim w ogóle jest to „my” i ile to tak naprawdę kosztuje cały koszt?

1.0 Zawodnicy

Pierwsza porcja informacji. Wordcloud rysuje krajobraz i przedstawia firmy tak skutecznie, jak to tylko możliwe.

Brakuje mu jednak poczucia głębi, więc przyjrzymy się również bardziej tradycyjnemu wykresowi, który pozwoli dodać do miksu kilka konkretnych liczb.

from wordcloud import WordCloud

company_counts = df['Company Name'].value_counts()
company_dict = company_counts.to_dict()
wordcloud = WordCloud(width=800, height=400, background_color='white', colormap='viridis').generate_from_frequencies(company_dict)

plt.figure(figsize=(16, 6))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
plt.figure(figsize=(16,6))
sns.countplot(data=df, x="Company Name", order=df["Company Name"].value_counts().index)
plt.xticks(rotation=90)
plt.ylabel("Cummulative Missions")
plt.show()

Rosjanie nieustannie dążą do udanej misji lądowania na Księżycu. Ale… czy to naprawdę cała historia?

1.1 Harmonogram działań misyjnych

def extract_year(datum):
  parts = datum.split(" ")
  year = parts[3].strip()
  year = int(year)
  return year

df['Year'] = df['Datum'].apply(extract_year)
plt.figure(figsize=(7,11))
sns.scatterplot(data=df, y="Company Name", x="Year", hue="Status Mission")
plt.show()

— RVSN ZSRR już dawno przestał wystrzeliwać rakiety. Poszerzmy głębię, dodając do miksu intensywność całorocznych wysiłków

Wykres rozrzutu przedstawiający szczegółowo wysiłki każdej oddzielnej firmy | Największe kropki oznaczają >80 misji

cumulative_entries = df.groupby(['Year', 'Company Name']).cumcount() + 1
df_cumulative = df[['Year', 'Company Name']].copy()
df_cumulative['Cumulative Entries'] = cumulative_entries

plt.figure(figsize=(7, 11))
sns.scatterplot(data=df, y="Company Name", x="Year", hue="Status Mission", size=df_cumulative['Cumulative Entries'], size_norm=None)
handles, labels = plt.gca().get_legend_handles_labels()
plt.title('Space Missions by Company and Year')
plt.show()

Intensywność wysiłku ze strony nowych uczestników gry Rocket Launch jest dobrze widoczna na powyższym wykresie liniowym.

1.2 „Gdzie”

Przyjrzyjmy się stronom startowym i krajom, w których często się uruchamiano.

W tej wizualizacji uwzględniono tylko kraje z ponad 10 premierami.

country_missions = df.groupby('Country').size().reset_index(name='Total Missions')
filtered_countries = country_missions[country_missions['Total Missions'] > 10]['Country']
filtered_df = df[df['Country'].isin(filtered_countries)]
yearly_missions = filtered_df.groupby(['Year', 'Country']).size().reset_index(name='Missions')
yearly_missions['Cumulative Missions'] = yearly_missions.groupby('Country')['Missions'].cumsum()


fig, ax = plt.subplots(figsize=(13, 7.6))
sns.lineplot(x='Year', y='Cumulative Missions', hue='Country', style='Country', data=yearly_missions)
plt.title('Countries and their utilization as a Launch Location')
plt.show()

Perspektywa znajduje się również poniżej.

colors = ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b']
cmap = ListedColormap(colors)

worldmap = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres"))
country_missions.loc[country_missions['Country'] == 'USA', 'Country'] = 'United States of America'
worldmap['Country'] = worldmap['name']
merged_worldmap = worldmap.merge(country_missions, on='Country', how='left')
fig, ax = plt.subplots(figsize=(12, 6))

merged_worldmap.plot(column='Total Missions', cmap=cmap, linewidth=0.8, edgecolor='0.8', legend=True, ax=ax, legend_kwds={'label': "Total Missions"}, missing_kwds={'color': "white"})

ax.set_title('Countries and their utilization as a Launch Location')
ax.set_xlabel('Longitude')
ax.set_ylabel('Latitude')

plt.show()

Jak często misja kończy się sukcesem? Czy to jest bezpieczne?

Skumulowany wykres słupkowy :: Szczegółowy wskaźnik sukcesu | barplot morski

Dobrze..

launch_counts = df.groupby(['Year', 'Status Mission']).size().reset_index(name='Count')
pivot_counts = launch_counts.pivot(index='Year', columns='Status Mission', values='Count').fillna(0)


sns.set_style('whitegrid')
plt.figure(figsize=(14, 5.6))
sns.barplot(x=pivot_counts.index, y=pivot_counts['Success'], color='g', label='Success')
sns.barplot(x=pivot_counts.index, y=pivot_counts['Failure'], bottom=pivot_counts['Success'], color='r', label='Failure')

plt.xlabel('Year')
plt.ylabel('Number of Launches')
plt.title('Number of Successful vs. "Failure" Launches Each Year')
plt.xticks(rotation=45)
plt.legend()

plt.show()

      
                
Companies and their track record | 4 row subplotted barplot

Patrząc na powyższy rozkład sukcesów, uprzejmie zauważ, że Marynarka Wojenna Stanów Zjednoczonych próbowała wystrzelić rakietę tylko na samym początku (lata pięćdziesiąte). Po zakończeniu tej części przyjrzyjmy się kosztowi $.

1.4 Koszt

def millions_formatter(x):
    return f"{round(x * 1e-3):,.0f}B$"
grouped_data = df.groupby('Company Name')[' Rocket'].sum().reset_index()
fig.update_layout(title='Distribution of Rocket Costs by Company')
fig.show()

from matplotlib.ticker import FuncFormatter
grouped_data = df.groupby('Year')[' Rocket'].sum().reset_index()
grouped_data[' Rocket'] = grouped_data[' Rocket'] / 1000
plt.figure(figsize=(12, 8))
sns.barplot(x='Year', y=' Rocket', data=grouped_data, color="b")
plt.xticks(rotation=45)
plt.xlabel('Year')
plt.ylabel('Expenditure in USD')
plt.title('Sum of Documented* expenses per Year')
def billions_formatter(x, pos):
    return f"{x * 1000000000 :,.0f}$"

ax = plt.gca()
ax.yaxis.set_major_formatter(FuncFormatter(billions_formatter))

plt.show()

Wydawanie miliardów dolarów może wydawać się dużą inwestycją.

To jednak nic w porównaniu z szacunkową kwotą 1,42 biliona dolarów wygenerowaną przez rynek farmaceutyczny w samym 2021 roku (to prawda — phara jest znana z „drukowania pieniędzy” w niektórych przypadkach). Co więcej, przemysł motoryzacyjny wygenerował około 2,86 biliona dolarów przychodów w 2021 roku. Transport kosmiczny ma zatem jeszcze sporo do zrobienia.

1.5 Dane źródłowe

df.head(100) — Zdjęcie autorstwa autora

nextspaceflight.com

Start! Dziękuje za przeczytanie.

# U S E D   L I B R A R I E S

import pandas as pd
import geopandas as gpd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
from wordcloud import WordCloud
import plotly.graph_objects as go