Les valeurs agrégées pour chaque année sont résumées pour chaque 10 ans.
Définissez la classe avec cut
of pandas
et agréger avec groupby
.
Les données utilisées sont le format CSV de l'Excel de «Population par âge» publié par le Bureau des statistiques du Ministère de l'intérieur et des communications.
Pour faciliter l'utilisation, supprimez la ligne de description en haut des données, la note en bas et les lignes «100+» et «Inconnu». Le fichier ajusté est «population-by-age.csv».
Commencez par charger les modules numpy
et pandas
.
J'ai également ajouté un paramètre pour dessiner le graphique en IPython.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
pd.options.display.mpl_style = 'default'
Lisez le fichier CSV. Spécifiez la première colonne comme index. Après la lecture, vérifiez le type de données.
df = pd.read_csv('population-by-age.csv', index_col='age')
print df.dtypes
y1920 int64
y1930 int64
y1940 int64
y1950 int64
y1960 int64
y1970 int64
y1980 int64
y1990 int64
y2000 int64
y2010 int64
dtype: object
De plus, vérifions le début et la fin, et les statistiques. L'affichage est omis.
print df.head(3)
print df.tail(3)
print df.describe()
Utilisez cut
pour définir la classe.
Si vous voulez changer la largeur de la classe, ajustez le troisième argument de range
. Inclure ou ne pas inclure les deux extrémités de la classe est spécifié comme une option. Basculez entre les options * include_lowest * et * right * en conséquence.
labels = [ "{0} - {1}".format(i, i + 9) for i in range(0, 100, 10) ]
c = pd.cut(df.index, np.arange(0, 101, 10),
include_lowest=True, right=False,
labels=labels)
print df.groupby(c).sum()
y1920 y1930 y1940 y1950 y1960 y1970 y1980
0 - 9 14314635 16778220 17961607 20728122 17049068 16965066 18547450
10 - 19 11520624 13340649 15816378 17267585 20326076 16921989 17231873
20 - 29 8533259 10367140 11756837 13910662 16527810 19749434 16882381
30 - 39 7020188 7798498 9370143 10250310 13555835 16578939 19973312
40 - 49 5902331 6332741 7041270 8487529 9835689 13217564 16427887
50 - 59 4074855 5046797 5446760 6137697 7842597 9230197 12813527
60 - 69 2968342 2977915 3782574 4074610 5092019 6709761 8429928
70 - 79 1378630 1478319 1541314 1967261 2518482 3401952 5059662
80 - 89 236419 315624 338472 354836 638738 879221 1503633
90 - 99 13657 13997 18567 16258 32043 65629 118391
y1990 y2000 y2010
0 - 9 13959454 11925887 10882409
10 - 19 18533872 14034777 11984392
20 - 29 16870834 18211769 13720134
30 - 39 16791465 16891475 18127846
40 - 49 19676302 16716227 16774981
50 - 59 15813274 19176162 16308233
60 - 69 11848590 14841772 18247422
70 - 79 6835747 10051176 12904315
80 - 89 2665908 4147012 6768852
90 - 99 286141 688769 1318463
J'ai donc pu agréger les valeurs agrégées pour chaque année d'âge tous les 10 ans.
Les fonctions d'agrégation peuvent être spécifiées en plus de «sum», et plusieurs fonctions d'agrégation peuvent être spécifiées. Vérifions les résultats suivants.
print df.groupby(c).agg(['count', 'min', 'max', 'mean', 'std'])
Puisqu'il est difficile de comprendre la relation avec uniquement les nombres ci-dessus, faites un graphique pour avoir un aperçu des nombres. Disposons-les côte à côte pour comparer les options * empilées * lors du dessin.
fig, axes = plt.subplots(ncols=2)
df.groupby(c).sum().plot(kind='bar', ax=axes[0])
df.groupby(c).sum().T.plot(kind='bar', stacked=True, ax=axes[1])
Si l'on regarde les chiffres à 10 ans, la population de plus de 60 ans augmente plus récemment. En revanche, on constate que la population des jeunes est en déclin. En regardant les graphiques empilés, nous pouvons voir que la population a augmenté régulièrement de 1920 à 2000, mais a diminué jusqu'en 2010. Quant à la répartition de la production, le ratio de la partie supérieure de la barre dans le graphique augmente.
Maintenant que nous connaissons les tendances générales, nous allons dessiner chaque série de la base de données d'origine. Si vous le tracez simplement, ce sera désordonné, alors dessinons-le sous forme de graphique séparé pour chaque année. Cette fois, la variable ʻaxes` est bidimensionnelle, donc soyez prudent lorsque vous spécifiez l'index du tableau.
fig, axes = plt.subplots(nrows=5, ncols=2)
for i, y in enumerate(['y1920', 'y1930', 'y1940', 'y1950', 'y1960']):
df[y].plot(ax=axes[i, 0])
axes[i, 0].set_title(y)
if y != 'y1960':
axes[i, 0].get_xaxis().set_visible(False)
for i, y in enumerate(['y1970', 'y1980', 'y1990', 'y2000', 'y2010']):
df[y].plot(ax=axes[i, 1])
axes[i, 1].set_title(y)
if y != 'y2010':
axes[i, 1].get_xaxis().set_visible(False)
Si vous regardez les graphiques individuels, vous pouvez voir l'effet du baby-boom. On constate également que le nombre de naissances a diminué depuis le deuxième baby-boom, et que la base de personnes âgées s'est élargie (la durée de vie a été allongée) depuis 1970.
Recommended Posts