Sandrine Henry
Data Science Portfolio
Data Science Portfolio
L'idée de base était de faire un challenge Makeover Monday [https://www.makeovermonday.co.uk/].
J'ai choisi de créer une datavisaulisation suivant le nombre de morts tout au long de la série Game of Thrones.
Source : [https://data.world/datasaurusrex/game-of-thones-deaths]
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
got = pd.read_excel (r'../data/game-of-thones-deaths.xlsx')
got.columns=got.iloc[0]
got.drop(index=0, inplace=True)
#Je concatene les colonnes 'Season' et 'Episode'
got['Epi_seas'] = 'S'+got["Season"].map(str)+'E'+got["Episode"].map(str)
got.tail()
got_death_season=got.groupby(["Season"]).agg({'Death No.':'count'})
plt.style.use('fivethirtyeight')
fig = plt.figure(figsize=(12, 6))
got_death_season['Death No.'].plot.bar()
plt.title('Nb de morts par Saison')
plt.xlabel('Saisons')
plt.ylabel('Nb de morts')
Sans surprise, on voit que la Saison 8 a été la plus meurtrière. Mais évitons le Spoil.
But : Identifier l'épisode par saison le plus meutrier.
Première étape : création d'un df puis d'un pivot sur le nb de morts par saison par épisode.
got_death_epi_season=got[['Season','Episode','Allegiance']].groupby(['Season','Episode']).agg('count')
got_death_epi_season= got_death_epi_season.pivot_table(index='Episode' ,columns=['Season'] , values='Allegiance')
got_death_epi_season
Deuxième étape : Création d'un graph de type "scatter plot" où je m'assure que les points aient une taille proportionnelle au nb de morts
plt.figure(figsize=(12,6))
for x in got_death_epi_season:
ax = sns.scatterplot(x,
y=[d for d in got_death_epi_season.index],
size=got_death_epi_season[x],
sizes=(10, got_death_epi_season[x].max()),
legend=False,
label=x,
cmap="plasma")
for z in got_death_epi_season.index:
if got_death_epi_season[x][z] == got_death_epi_season[x].max():
ax.text(x+0.15, z, got_death_epi_season[x][z], horizontalalignment='left', size='medium', color='black', weight='semibold')
plt.title('Episode le plus meutrier par saison')
plt.xlabel('Saisons')
plt.ylabel('Episodes')
got_house=got[['Allegiance','Death No.','Epi_seas','Killers House']]
got_house =got_house.groupby(['Allegiance','Killers House']).agg({'Death No.':'count'})
got_house = got_house.pivot_table(index='Allegiance',columns='Killers House')
got_house = got_house.xs('Death No.', axis=1, drop_level=True)
got_house.head()
f, ax = plt.subplots(figsize=(12, 6))
sns.heatmap(got_house, annot=False, linewidths=.2, ax=ax, cmap="plasma")
Observation : 2 maisons se distinguent - la maison des Lannister et celle des Targaryen
J'identifie dans un premiers temps le top dix des armes les plus employées que je mets dans une liste
#got_weapons=got[['Death No.','Method','Season']].groupby(['Method']).agg({'Death No.':'count'}).sort_values('Death No.',ascending=False).nlargest(10,'Death No.')
list_weapons = [x for x in got[['Death No.','Method','Season']].groupby(['Method']).agg('count').sort_values('Death No.',ascending=False).nlargest(10,'Death No.').index]
death_weapons= got[got['Method'].isin(list_weapons)].groupby(['Method','Season']).agg('count')
death_weapons = death_weapons.pivot_table(index='Method',columns=['Season'],values ='Allegiance')
death_weapons
Je crée une liste vide qui contiendra les morts par armes
Je fais ensuite une itération par ligne de la df où j'utilise iloc pour accéder aux valeurs
Row_list =[]
for i in range((death_weapons.shape[0])):
Row_list.append(list(death_weapons.iloc[i, :]))
Enfin, je crée mon graph de type histogramme empilé avec une boucle for
plt.figure(figsize=(15,6))
barWidth = 0.85
season_list = death_weapons.columns.tolist() #pour obtenir le n°de saison sur l'axe des abscisses
plt.xticks(season_list, season_list)
colors=['darkcyan', 'coral', 'green', 'crimson', 'cyan','yellow','pink','brown','orange','grey']
for row,c in zip(range(10),colors):
plt.bar(season_list,Row_list[row],width=barWidth, color=c)
plt.xlabel("Nb de morts par type d'armes les plus employées")
plt.legend([armes for armes in death_weapons.index],loc=2)
list_killers = [x for x in got[['Death No.','Location','Season']].groupby(['Location']).agg('count').sort_values('Death No.',ascending=False).nlargest(10,'Death No.').index]
list_killers= got[got['Location'].isin(list_killers)].groupby(['Location','Season']).agg('count')
#list_killers = list_killers.pivot_table(index='Killer',columns=['Season'],values ='Allegiance')
#list_killers['Total of death']=list_killers.sum(axis=1)
#list_killers=list_killers.sort_values('Total of death', ascending=False)
list_killers = list_killers.pivot_table(index='Season',columns=['Location'],values ='Allegiance')
list_killers
sns.set(style="whitegrid")
location=list_killers[['Beyond the Wall','Castle Black','The Twins']]
ax = sns.boxplot(data=location, orient="h", palette="Set2")
Je cherche les 10 personnages les plus meurtriers toutes saisons confondues.
list_killers = [x for x in got[['Death No.','Killer','Season']].groupby(['Killer']).agg('count').sort_values('Death No.',ascending=False).nlargest(10,'Death No.').index]
list_killers= got[got['Killer'].isin(list_killers)].groupby(['Killer','Season']).agg('count')
#list_killers = list_killers.pivot_table(index='Killer',columns=['Season'],values ='Allegiance')
#list_killers['Total of death']=list_killers.sum(axis=1)
#list_killers=list_killers.sort_values('Total of death', ascending=False)
list_killers = list_killers.pivot_table(index='Season',columns=['Killer'],values ='Allegiance')
list_killers
Visualisation pour 2 héros Arya Stark et Jon Snow pour voir la distribution des morts au cours des 8 saisons.
sns.set(style="whitegrid")
killers=list_killers[['Arya Stark','Jon Snow']]
ax = sns.boxplot(data=killers, orient="h", palette="Set2")