Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Hej Habr!

Idag kommer vi att arbeta med färdigheten att använda verktyg för att gruppera och visualisera data i Python. I det tillhandahållna dataset på Github Låt oss analysera flera egenskaper och bygga en uppsättning visualiseringar.

Enligt traditionen, låt oss i början definiera målen:

  • Gruppera data efter kön och år och visualisera den övergripande dynamiken i födelsetalen för båda könen;
  • Hitta de mest populära namnen genom tiderna;
  • Dela upp hela tidsperioden i data i 10 delar och för varje, hitta det mest populära namnet för varje kön. För varje namn som hittas, visualisera dess dynamik genom tiderna;
  • För varje år, beräkna hur många namn som täcker 50 % av människorna och visualisera (vi kommer att se olika namn för varje år);
  • Välj 4 år från hela intervallet och visa för varje år fördelningen med den första bokstaven i namnet och den sista bokstaven i namnet;
  • Gör en lista över flera kända personer (presidenter, sångare, skådespelare, filmkaraktärer) och utvärdera deras inflytande på namnens dynamik. Bygg en visualisering.

Mindre ord, mer kod!

Och låt oss gå.

Låt oss gruppera data efter kön och år och visualisera den övergripande dynamiken i födelsetalen för båda könen:

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()

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Låt oss hitta de mest populära namnen i historien:

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)

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Låt oss dela upp hela tidsperioden i data i 10 delar och för varje kommer vi att hitta det mest populära namnet för varje kön. För varje namn som hittas, visualiserar vi dess dynamik över tiden:

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()

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

För varje år beräknar vi hur många namn som täcker 50 % av människorna och visualiserar denna data:

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()

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Låt oss välja 4 år från hela intervallet och visa fördelningen för varje år med den första bokstaven i namnet och den sista bokstaven i namnet:

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()

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Låt oss göra en lista över flera kända personer (presidenter, sångare, skådespelare, filmkaraktärer) och utvärdera deras inflytande på namnens dynamik:

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()

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

Arbetar med färdigheten att använda gruppering och datavisualisering i Python

För träning kan du lägga till kändisens livsperiod till visualiseringen från det senaste exemplet för att tydligt bedöma deras inflytande på namnens dynamik.

Med detta uppnåddes och uppfylldes alla våra mål. Vi har utvecklat förmågan att använda verktyg för att gruppera och visualisera data i Python, och vi kommer att fortsätta arbeta med data. Alla kan själva dra slutsatser utifrån färdiga, visualiserade data.

Kunskap till alla!

Källa: will.com

Lägg en kommentar