Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

Hei Habr!

I dag skal vi jobbe med ferdighetene til å bruke verktøy for gruppering og visualisering av data i Python. I det oppgitte datasett på Github La oss analysere flere egenskaper og bygge et sett med visualiseringer.

I henhold til tradisjonen, la oss i begynnelsen definere målene:

  • Grupper data etter kjønn og år og visualiser den generelle dynamikken i fødselsraten til begge kjønn;
  • Finn de mest populære navnene gjennom tidene;
  • Del opp hele tidsperioden i dataene i 10 deler, og finn det mest populære navnet på hvert kjønn for hver. For hvert navn funnet, visualiser dets dynamikk gjennom tidene;
  • Beregn for hvert år hvor mange navn som dekker 50 % av mennesker og visualiser (vi vil se variasjonen av navn for hvert år);
  • Velg 4 år fra hele intervallet og vis fordelingen for hvert år med den første bokstaven i navnet og den siste bokstaven i navnet;
  • Lag en liste over flere kjente personer (presidenter, sangere, skuespillere, filmkarakterer) og vurder deres innflytelse på dynamikken til navn. Bygg en visualisering.

Mindre ord, mer kode!

Og la oss gå.

La oss gruppere dataene etter kjønn og år og visualisere den generelle dynamikken i fødselsraten til begge kjønn:

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

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

La oss finne de mest populære navnene 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)

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

La oss dele opp hele tidsperioden i dataene i 10 deler, og for hver vil vi finne det mest populære navnet på hvert kjønn. For hvert navn som er funnet, visualiserer vi dets dynamikk gjennom tidene:

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

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

For hvert år beregner vi hvor mange navn som dekker 50 % av mennesker og visualiserer disse dataene:

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

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

La oss velge 4 år fra hele intervallet og vise fordelingen for hvert år med den første bokstaven i navnet og den siste bokstaven i navnet:

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

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

La oss lage en liste over flere kjente personer (presidenter, sangere, skuespillere, filmkarakterer) og vurdere deres innflytelse på dynamikken til navn:

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

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

Arbeider med ferdighetene til å bruke gruppering og datavisualisering i Python

For trening kan du legge til kjendisens livsperiode til visualiseringen fra det siste eksemplet for å tydelig vurdere deres innflytelse på dynamikken til navn.

Med dette ble alle våre mål nådd og oppfylt. Vi har utviklet ferdighetene til å bruke verktøy for gruppering og visualisering av data i Python, og vi vil fortsette å jobbe med data. Alle kan selv trekke konklusjoner basert på ferdige, visualiserte data.

Kunnskap til alle!

Kilde: www.habr.com

Legg til en kommentar