[PYTHON] Résolution d'exercices dans le cours de formation GCI Data Scientist Chapitre 7

Cours de formation GCI Data Scientist

"GCI Data Scientist Training Course" est proposé par l'Université de Tokyo (laboratoire Matsuo) "* Données pratiques Le contenu de la partie exercice est publié au format Jupyter NoteBook (CC-BY-NC-ND) dans le cours de formation scientifique et le cours d'apprentissage en profondeur </ u> * ". Le chapitre 7 s'intitule «** Visualisation des données à l'aide de Matplotlib **», et en plus du nuage de points, du graphique linéaire et de l'histogramme appris au chapitre 2, vous apprendrez le graphique à barres, le graphique circulaire, le graphique à bulles et le graphique en bougies. Au lieu du bouton "J'aime" pour le matériel pédagogique précieux et merveilleux que vous pouvez apprendre en japonais, je publierai les réponses que vous avez résolues. Veuillez signaler toute erreur.

Le problème général à la fin du chapitre était extrêmement difficile. Je me demande si je comprends l'intention du problème en premier lieu ...

Chapitre 7 Visualisation des données à l'aide de Matplotlib

7.1 Visualisation des données

7.1.1 Bases de la visualisation des données

** <Pratique 1> ** Utilisez les données sur les élèves (student-mat.csv) que vous avez traitées auparavant pour représenter graphiquement les raisons du choix d'une école (raison) et calculer le pourcentage de chacune.

import matplotlib.pyplot as plt
student_data_math = pd.read_csv("student-mat.csv",sep=";")

allCount = len(student_data_math["reason"])
reasonCount = student_data_math["reason"].value_counts()
reasonRatio = reasonCount / allCount
plt.pie(reasonRatio.values, labels=reasonRatio.index, autopct='%1.1f%%', startangle=90, counterclock=False)
plt.axis('equal')

711-1

** <Pratique 2> ** Avec les mêmes données que ci-dessus, affichez la valeur moyenne de la note finale G3 de chaque mathématique dans un graphique à barres, centré sur le plus haut-si vous souhaitez recevoir un enseignement supérieur (binaire: oui ou non). Y a-t-il quelque chose que vous pouvez deviner d'ici?

import matplotlib.pyplot as plt
student_data_math = pd.read_csv("student-mat.csv",sep=";")

x = student_data_math["higher"].unique()
y = []
for x_ in x:
    y.append(student_data_math["G3"][student_data_math["higher"] == x_].mean())

plt.bar(x, y)

711-2

** <Pratique 3> Avec les mêmes données que ci-dessus, veuillez afficher la valeur moyenne de la note finale G3 de chaque mathématique dans un graphique à barres horizontales avec le temps de parcours comme axe. Y a-t-il quelque chose que vous pouvez deviner?

import matplotlib.pyplot as plt
student_data_math = pd.read_csv("student-mat.csv",sep=";")

x = student_data_math["traveltime"].unique()
y = []
for x_ in x:
    y.append(student_data_math["G3"][student_data_math["traveltime"] == x_].mean())

plt.barh(x,y)

711-3

7.1.2 Application: visualisation des données financières

7.2 Réfléchissons à la manière d'afficher les résultats de l'analyse

7.2.1 Points pour créer des matériaux

7.3 Problème global

** 7.3.1 Analyse des données de séries chronologiques ** Ici, traitons des données de séries chronologiques en utilisant les pandas et scipy que nous avons appris dans ce chapitre.

(1) (Acquisition et confirmation des données) Téléchargez dow_jones_index.zip depuis le site suivant, lisez les données en utilisant dow_jones_index.data à l'intérieur, et affichez les 5 premières lignes. Vérifiez également les informations de colonne de chaque donnée et vérifiez s'il y a une valeur nulle.

https://archive.ics.uci.edu/ml/machine-learning-databases/00312/dow_jones_index.zip

# (1)
# import requests, zipfile
# from io import StringIO
# import io
# zip_file_url = "https://archive.ics.uci.edu/ml/machine-learning-databases/00312/dow_jones_index.zip"
# r = requests.get(zip_file_url, stream=True)
# z = zipfile.ZipFile(io.BytesIO(r.content))
# z.extractall()

data = pd.read_csv("dow_jones_index.data")
data[:5]

731-1

(2) (Traitement des données) Les données telles que open, high, low, close dans la colonne ont une marque $ devant le nombre, alors supprimez-le. De plus, si la date et l'heure ne sont pas lues comme type de date, convertissez-les en type de date.

# (2)
data.open = data.open.str.strip("$").astype(float)
data.high = data.high.str.strip("$").astype(float)
data.low = data.low.str.strip("$").astype(float)
data.close = data.close.str.strip("$").astype(float)
data.date = pd.to_datetime(data.date)
data[:5]

731-2

(3) Calculez les statistiques récapitulatives pour chaque stock pour la clôture de la colonne.

# (3)
data.groupby("stock").close.describe()

731-3

(4) Pour la fermeture de la colonne, émettez une matrice de corrélation qui calcule la corrélation de chaque stock. Aussi, dessinons une carte thermique de la matrice de corrélation en utilisant la carte thermique de Seaborn. (Astuce: utilisez pandas corr ().)

# (4) 
#Du coup, la question est inamicale ...
# "stock"Chaque"date(Variable explicative)"Contre"close(Variable objectif)"Quand on regarde la valeur de
# "close"Corréler avec la transition de"stock"Vous voulez chercher?
import seaborn as sns
pv = data.pivot(index="date", columns="stock", values="close")
cr = pv.corr()
sns.heatmap(cr, square=True, vmax=1, vmin=-1, center=0)

731-4

(5) Extraire la combinaison d'actions avec le coefficient de corrélation le plus élevé dans la matrice de corrélation calculée en (4). En outre, extrayez la paire avec le coefficient de corrélation le plus élevé et dessinez un graphique de série chronologique pour chacune.

# (5)
#Qu'est-ce qu'une paire avec un coefficient de corrélation plus élevé parmi des combinaisons avec un coefficient de corrélation plus élevé?
#combinaison=paire?
cr = data.pivot(index="date", columns="stock", values="close").corr()
cr[cr==cr[cr<1].max().max()]
# --
plt.plot(pv.index, pv.CSCO, label="CSCO")
plt.plot(pv.index, pv.MSFT, label="MSFT")
plt.xlabel("date")
plt.ylabel("close")
plt.legend()

731-5-1

731-5-2

(6) Utilisez la fonction de roulement et de fenêtre de pandas (fonction de fenêtre) pour calculer les données de série chronologique moyenne mobile des 5 dernières périodes (5 semaines) de clôture pour chaque stock utilisé ci-dessus.

# (6)
pv.rolling(5).mean().dropna()

731-6

(7) Utilisez shift () of pandas pour calculer les données de séries chronologiques logarithmiques du ratio proche de la période précédente (il y a 1 semaine) pour chaque stock utilisé ci-dessus. De plus, extrayez l'action avec la volatilité la plus élevée (écart-type) et l'action avec la volatilité la plus faible, et tracez un graphique de taux de variation logarithmique.

# (7)
pv_lgrt = np.log(pv/pv.shift()).dropna()
print(pv_lgrt.std()[pv_lgrt.std()==pv_lgrt.std().max()])
print(pv_lgrt.std()[pv_lgrt.std()==pv_lgrt.std().min()])
# --
plt.plot(pv_lgrt.index, pv_lgrt.CSCO)
plt.plot(pv_lgrt.index, pv_lgrt.KO)
> Max stock
> CSCO    0.041205
> dtype: float64
> Min stock
> KO    0.01623
> dtype: float64

731-7

** 7.3.2 Analyse marketing ** Voici les données d'achat qui sont souvent utilisées dans l'analyse marketing. Bien qu'il s'agisse des données d'achat d'une entreprise différentes de celles des utilisateurs généraux, l'axe à analyser est fondamentalement le même.

(1) Veuillez lire les données avec les pandas à partir de l'URL suivante (cela prendra du temps car le nombre de données est de 500000 ou plus et il est relativement grand.)

"http://archive.ics.uci.edu/ml/machine-learning-databases/00352/Online%20Retail.xlsx"

(Indice) Utilisez pd.ExcelFile pour spécifier la feuille dans .parse ('Vente en ligne').

De plus, étant donné que la cible d'analyse est cette fois uniquement les enregistrements contenant des données dans l'ID client, veuillez effectuer le traitement pour cela. De plus, si le numéro de facture de la colonne a un C devant le numéro, il sera annulé, veuillez donc supprimer ces données. S'il y a autre chose qui doit être supprimé en tant que données, veuillez le traiter de manière appropriée. Ci-dessous, nous analyserons sur la base de ces données.

# (1)
import requests
import pandas as pd

# xlsx_file_url = "http://archive.ics.uci.edu/ml/machine-learning-databases/00352/Online%20Retail.xlsx"
# r = requests.get(xlsx_file_url, stream=True)
# with open("Online%20Retail.xlsx", 'wb') as saveFile:
#     saveFile.write(r.content)

book = pd.ExcelFile("Online%20Retail.xlsx")
data = book.parse("Online Retail")
# --
data_ = data.dropna(subset = ["CustomerID"])
mask = data_['InvoiceNo'].str.startswith('C', na=False)
data_ = data_[~mask]

data_.head()

732-1

(2) Les colonnes de ces données incluent la date et l'heure d'achat, le nom du produit, la quantité, le nombre de fois, l'identifiant de l'acheteur, etc. Trouvez ici le nombre d'acheteurs uniques (CustomerID), le nombre de paniers (numéro unique de InvoiceNo) et le type de produit (numéro unique basé sur StockCode et Description).

# (2)
print("CustomerID unique:", data_["CustomerID"].nunique())
print("InvoiceNo unique:", data_["InvoiceNo"].nunique())
print("StockCode unique:", data_["StockCode"].nunique())
print("Description unique:", data_["Description"].nunique())
> CustomerID unique: 4339
> InvoiceNo unique: 18536
> StockCode unique: 3665
> Description unique: 3877

(3) Il y a un pays dans cette colonne de données. En utilisant cette colonne comme axe, calculez le montant total des achats (montant par unité x quantité totale) de chaque pays, classez-les par ordre décroissant et affichez les résultats des 5 premiers pays.

# (3)
data_["price"] = data_["Quantity"] * data_["UnitPrice"]
data_[["price", "Country"]].groupby("Country").sum().sort_values("price").iloc[-1:-6:-1]

732-3

(4) Pour les 5 premiers pays ci-dessus, veuillez représenter graphiquement la transition mensuelle des ventes de produits (montant total) dans chaque pays. Ici, veuillez afficher le graphique séparément.

# (4)
top5countries = data_[["price", "Country"]].groupby("Country").sum().sort_values("price").iloc[-1:-6:-1].index.to_list()
data_top5countries = data_[data_["Country"].isin(top5countries)]

data_dict={}
i=0
f, axs = plt.subplots(5,1,figsize=(6,10))
for country, df in data_top5countries.groupby("Country"):
    df.index = df.InvoiceDate
    df_ = df.resample("M").sum()
    axs[i].plot(df_.index, df_.price, label=country)
    axs[i].legend(loc="best")
    data_dict[country] = df
    i+=1

732-4

(5) Pour les 5 premiers pays ci-dessus, veuillez extraire les 5 meilleurs produits par ventes de produits dans chaque pays. Faites-leur également un graphique circulaire pour chaque pays. En outre, veuillez totaliser les produits en fonction de la «Description».

# (5)
i=0
f, axs = plt.subplots(5,1,figsize=(5,15))
for country in top5countries:
    top5descriptionData = data_dict[country][["price", "Description"]].groupby("Description").sum().sort_values("price").iloc[-1:-6:-1]
    print(country, "\n", top5descriptionData, "\n")
    axs[i].pie(top5descriptionData["price"], labels=top5descriptionData.index.to_list(), autopct='%1.1f%%', startangle=90, counterclock=False)
    axs[i].title.set_text(country)
    i+=1
> United Kingdom 
>                                          price
> Description                                  
> PAPER CRAFT , LITTLE BIRDIE         168469.60
> REGENCY CAKESTAND 3 TIER            110990.20
> WHITE HANGING HEART T-LIGHT HOLDER   94858.60
> MEDIUM CERAMIC TOP STORAGE JAR       80291.44
> JUMBO BAG RED RETROSPOT              77371.57 
> 
> Netherlands 
>                                         price
> Description                                 
> RABBIT NIGHT LIGHT                   9568.48
> ROUND SNACK BOXES SET OF4 WOODLAND   7991.40
> SPACEBOY LUNCH BOX                   7485.60
> DOLLY GIRL LUNCH BOX                 6828.60
> ROUND SNACK BOXES SET OF 4 FRUITS    4039.20 
> 
> EIRE 
>                                   price
> Description                           
> REGENCY CAKESTAND 3 TIER       7388.55
> CARRIAGE                       4875.00
> 3 TIER CAKE TIN RED AND CREAM  4235.65
> Manual                         3374.34
> JAM MAKING SET WITH JARS       2976.00 
> 
> Germany 
>                                          price
> Description                                  
> POSTAGE                              21001.00
> REGENCY CAKESTAND 3 TIER              9061.95
> ROUND SNACK BOXES SET OF4 WOODLAND    3598.95
> Manual                                2296.25
> ROUND SNACK BOXES SET OF 4 FRUITS     1982.40 
> 
> France 
>                                    price
> Description                            
> POSTAGE                        15454.00
> Manual                          9492.37
> RABBIT NIGHT LIGHT              7234.24
> REGENCY CAKESTAND 3 TIER        2816.85
> RED TOADSTOOL LED NIGHT LIGHT   2130.15 

732-5

Recommended Posts

Résolution d'exercices dans le cours de formation GCI Data Scientist Chapitre 6
Résolution d'exercices dans le cours de formation GCI Data Scientist Chapitre 7
Résolution d'exercices dans le cours de formation GCI Data Scientist Chapitre 8
Cours de formation Data Scientist Chapitre 2 Jour 2
Cours de formation Data Scientist Chapitre 3 Jour 3
Cours de formation Data Scientist Chapitre 4 Jour 1
Cours de formation Data Scientist Chapitre 3 Jour 1 + 2