Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Hey Habr!

Heute werden wir an der Fähigkeit arbeiten, Tools zum Gruppieren und Visualisieren von Daten in Python zu verwenden. Im bereitgestellten Datensatz auf Github Lassen Sie uns mehrere Merkmale analysieren und eine Reihe von Visualisierungen erstellen.

Traditionell definieren wir zu Beginn die Ziele:

  • Gruppieren Sie Daten nach Geschlecht und Jahr und visualisieren Sie die Gesamtdynamik der Geburtenrate beider Geschlechter.
  • Finden Sie die beliebtesten Namen aller Zeiten.
  • Teilen Sie den gesamten Zeitraum in den Daten in 10 Teile auf und ermitteln Sie für jeden Teil den beliebtesten Namen jedes Geschlechts. Visualisieren Sie für jeden gefundenen Namen seine Dynamik im Laufe der Zeit.
  • Berechnen Sie für jedes Jahr, wie viele Namen 50 % der Menschen abdecken, und visualisieren Sie sie (wir werden die Namensvielfalt für jedes Jahr sehen);
  • Wählen Sie 4 Jahre aus dem gesamten Intervall aus und zeigen Sie für jedes Jahr die Verteilung nach dem ersten Buchstaben im Namen und nach dem letzten Buchstaben im Namen an;
  • Erstellen Sie eine Liste mehrerer berühmter Personen (Präsidenten, Sänger, Schauspieler, Filmfiguren) und bewerten Sie deren Einfluss auf die Dynamik von Namen. Erstellen Sie eine Visualisierung.

Weniger Wörter, mehr Code!

Und los geht's.

Lassen Sie uns die Daten nach Geschlecht und Jahr gruppieren und die Gesamtdynamik der Geburtenrate beider Geschlechter visualisieren:

import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt

years = np.arange(1880, 2011, 3)
datalist = 'https://raw.githubusercontent.com/wesm/pydata-book/2nd-edition/datasets/babynames/yob{year}.txt'
dataframes = []
for year in years:
    dataset = datalist.format(year=year)
    dataframe = pd.read_csv(dataset, names=['name', 'sex', 'count'])
    dataframes.append(dataframe.assign(year=year))

result = pd.concat(dataframes)
sex = result.groupby('sex')
births_men = sex.get_group('M').groupby('year', as_index=False)
births_women = sex.get_group('F').groupby('year', as_index=False)
births_men_list = births_men.aggregate(np.sum)['count'].tolist()
births_women_list = births_women.aggregate(np.sum)['count'].tolist()

fig, ax = plt.subplots()
fig.set_size_inches(25,15)

index = np.arange(len(years))
stolb1 = ax.bar(index, births_men_list, 0.4, color='c', label='Мужчины')
stolb2 = ax.bar(index + 0.4, births_women_list, 0.4, alpha=0.8, color='r', label='Женщины')

ax.set_title('Рождаемость по полу и годам')
ax.set_xlabel('Года')
ax.set_ylabel('Рождаемость')
ax.set_xticklabels(years)
ax.set_xticks(index + 0.4)
ax.legend(loc=9)

fig.tight_layout()
plt.show()

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Lassen Sie uns die beliebtesten Namen der Geschichte finden:

years = np.arange(1880, 2011)

dataframes = []
for year in years:
    dataset = datalist.format(year=year)
    dataframe = pd.read_csv(dataset, names=['name', 'sex', 'count'])
    dataframes.append(dataframe)

result = pd.concat(dataframes)
names = result.groupby('name', as_index=False).sum().sort_values('count', ascending=False)
names.head(10)

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Teilen wir den gesamten Zeitraum in den Daten in 10 Teile auf und finden für jeden den beliebtesten Namen jedes Geschlechts. Für jeden gefundenen Namen visualisieren wir seine Dynamik über die Zeit:

years = np.arange(1880, 2011)
part_size = int((years[years.size - 1] - years[0]) / 10) + 1
parts = {}
def GetPart(year):
    return int((year - years[0]) / part_size)
for year in years:
    index = GetPart(year)
    r = years[0] + part_size * index, min(years[years.size - 1], years[0] + part_size * (index + 1))
    parts[index] = str(r[0]) + '-' + str(r[1])

dataframe_parts = []
dataframes = []
for year in years:
    dataset = datalist.format(year=year)
    dataframe = pd.read_csv(dataset, names=['name', 'sex', 'count'])
    dataframe_parts.append(dataframe.assign(years=parts[GetPart(year)]))
    dataframes.append(dataframe.assign(year=year))
    
result_parts = pd.concat(dataframe_parts)
result = pd.concat(dataframes)

result_parts_sums = result_parts.groupby(['years', 'sex', 'name'], as_index=False).sum()
result_parts_names = result_parts_sums.iloc[result_parts_sums.groupby(['years', 'sex'], as_index=False).apply(lambda x: x['count'].idxmax())]
result_sums = result.groupby(['year', 'sex', 'name'], as_index=False).sum()

for groupName, groupLabels in result_parts_names.groupby(['name', 'sex']).groups.items():
    group = result_sums.groupby(['name', 'sex']).get_group(groupName)
    fig, ax = plt.subplots(1, 1, figsize=(18,10))

    ax.set_xlabel('Года')
    ax.set_ylabel('Рождаемость')
    label = group['name']
    ax.plot(group['year'], group['count'], label=label.aggregate(np.max), color='b', ls='-')
    ax.legend(loc=9, fontsize=11)

    plt.show()

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Wir berechnen für jedes Jahr, wie viele Namen 50 % der Menschen abdecken und visualisieren diese Daten:

dataframe = pd.DataFrame({'year': [], 'count': []})
years = np.arange(1880, 2011)
for year in years:
    dataset = datalist.format(year=year)
    csv = pd.read_csv(dataset, names=['name', 'sex', 'count'])
    names = csv.groupby('name', as_index=False).aggregate(np.sum)
    names['sum'] = names.sum()['count']
    names['percent'] = names['count'] / names['sum'] * 100
    names = names.sort_values(['percent'], ascending=False)
    names['cum_perc'] = names['percent'].cumsum()
    names_filtered = names[names['cum_perc'] <= 50]
    dataframe = dataframe.append(pd.DataFrame({'year': [year], 'count': [names_filtered.shape[0]]}))

fig, ax1 = plt.subplots(1, 1, figsize=(22,13))
ax1.set_xlabel('Года', fontsize = 12)
ax1.set_ylabel('Разнообразие имен', fontsize = 12)
ax1.plot(dataframe['year'], dataframe['count'], color='r', ls='-')
ax1.legend(loc=9, fontsize=12)

plt.show()

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Wählen wir aus dem gesamten Intervall 4 Jahre aus und zeigen wir für jedes Jahr die Verteilung nach dem ersten Buchstaben im Namen und nach dem letzten Buchstaben im Namen an:

from string import ascii_lowercase, ascii_uppercase

fig_first, ax_first = plt.subplots(1, 1, figsize=(14,10))
fig_last, ax_last = plt.subplots(1, 1, figsize=(14,10))

index = np.arange(len(ascii_uppercase))
years = [1944, 1978, 1991, 2003]
colors = ['r', 'g', 'b', 'y']
n = 0
for year in years:
    dataset = datalist.format(year=year)
    csv = pd.read_csv(dataset, names=['name', 'sex', 'count'])
    names = csv.groupby('name', as_index=False).aggregate(np.sum)
    count = names.shape[0]

    dataframe = pd.DataFrame({'letter': [], 'frequency_first': [], 'frequency_last': []})
    for letter in ascii_uppercase:
        countFirst = (names[names.name.str.startswith(letter)].count()['count'])
        countLast = (names[names.name.str.endswith(letter.lower())].count()['count'])

        dataframe = dataframe.append(pd.DataFrame({
            'letter': [letter],
            'frequency_first': [countFirst / count * 100],
            'frequency_last': [countLast / count * 100]}))

    ax_first.bar(index + 0.3 * n, dataframe['frequency_first'], 0.3, alpha=0.5, color=colors[n], label=year)
    ax_last.bar(index + bar_width * n, dataframe['frequency_last'], 0.3, alpha=0.5, color=colors[n], label=year)
    n += 1

ax_first.set_xlabel('Буква алфавита')
ax_first.set_ylabel('Частота, %')
ax_first.set_title('Первая буква в имени')
ax_first.set_xticks(index)
ax_first.set_xticklabels(ascii_uppercase)
ax_first.legend()

ax_last.set_xlabel('Буква алфавита')
ax_last.set_ylabel('Частота, %')
ax_last.set_title('Последняя буква в имени')
ax_last.set_xticks(index)
ax_last.set_xticklabels(ascii_uppercase)
ax_last.legend()

fig_first.tight_layout()
fig_last.tight_layout()

plt.show()

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Lassen Sie uns eine Liste mehrerer berühmter Personen (Präsidenten, Sänger, Schauspieler, Filmfiguren) erstellen und ihren Einfluss auf die Dynamik von Namen bewerten:

celebrities = {'Frank': 'M', 'Britney': 'F', 'Madonna': 'F', 'Bob': 'M'}
dataframes = []
for year in years:
    dataset = datalist.format(year=year)
    dataframe = pd.read_csv(dataset, names=['name', 'sex', 'count'])
    dataframes.append(dataframe.assign(year=year))

result = pd.concat(dataframes)

for celebrity, sex in celebrities.items():
    names = result[result.name == celebrity]
    dataframe = names[names.sex == sex]
    fig, ax = plt.subplots(1, 1, figsize=(16,8))

    ax.set_xlabel('Года', fontsize = 10)
    ax.set_ylabel('Рождаемость', fontsize = 10)
    ax.plot(dataframe['year'], dataframe['count'], label=celebrity, color='r', ls='-')
    ax.legend(loc=9, fontsize=12)
        
    plt.show()

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Arbeiten an der Fähigkeit, Gruppierung und Datenvisualisierung in Python zu verwenden

Zur Schulung können Sie der Visualisierung aus dem letzten Beispiel den Lebensabschnitt des Prominenten hinzufügen, um dessen Einfluss auf die Namensdynamik anschaulich einzuschätzen.

Damit wurden alle unsere Ziele erreicht und erfüllt. Wir haben die Fähigkeit entwickelt, Tools zum Gruppieren und Visualisieren von Daten in Python zu verwenden, und wir werden weiterhin mit Daten arbeiten. Jeder kann aus vorgefertigten, visualisierten Daten selbst Rückschlüsse ziehen.

Wissen an alle!

Source: habr.com

Kommentar hinzufügen