Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Hei Habr!

Tänään käsittelemme Pythonin tietojen ryhmittely- ja visualisointityökalujen käyttöä. Tarjotussa tietojoukko Githubissa Analysoidaan useita ominaisuuksia ja rakennetaan joukko visualisointeja.

Perinteisesti määrittelemme alussa tavoitteet:

  • Ryhmittele tiedot sukupuolen ja vuoden mukaan ja visualisoi molempien sukupuolten syntyvyyden yleinen dynamiikka;
  • Etsi historian suosituimmat nimet;
  • Jaa tiedoissa oleva koko ajanjakso 10 osaan ja etsi jokaisesta sukupuolesta suosituin nimi. Visualisoi jokaisen löydetyn nimen dynamiikka ajan mittaan.
  • Laske jokaiselle vuodelle, kuinka monta nimeä 50% ihmisistä peittää ja visualisoi (näemme kunkin vuoden eri nimet);
  • Valitse kokonaisvälistä 4 vuotta ja näytä kunkin vuoden jakautuminen nimen ensimmäisellä kirjaimella ja nimen viimeisellä kirjaimella;
  • Tee luettelo useista kuuluisista ihmisistä (presidentit, laulajat, näyttelijät, elokuvan sankarit) ja arvioi heidän vaikutustaan ​​nimien dynamiikkaan. Rakenna visualisointi.

Vähemmän sanoja, enemmän koodia!

Ja mennään.

Ryhmitetään tiedot sukupuolen ja vuoden mukaan ja visualisoidaan molempien sukupuolten syntyvyyden yleinen dynamiikka:

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

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Etsitään historian suosituimmat nimet:

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)

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Jaetaan tiedoissa oleva koko ajanjakso 10 osaan ja jokaisesta löydämme kunkin sukupuolen suosituimman nimen. Kunkin löydetyn nimen osalta visualisoimme sen dynamiikan koko ajan:

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

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Laskemme joka vuosi, kuinka monta nimeä 50 % ihmisistä peittää, ja visualisoimme nämä tiedot:

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

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Valitaan koko väliltä 4 vuotta ja näytetään kullekin vuodelle jakautuminen nimen ensimmäisellä kirjaimella ja nimen viimeisellä kirjaimella:

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

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Tehdään luettelo useista kuuluisista ihmisistä (presidentit, laulajat, näyttelijät, elokuvan sankarit) ja arvioidaan heidän vaikutustaan ​​nimien dynamiikkaan:

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

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Pythonin ryhmittelyn ja tietojen visualisoinnin käyttötaidon kehittäminen

Harjoittelua varten voit lisätä viimeisen esimerkin visualisointiin julkkiksen elämän ajanjakson, jotta voit arvioida visuaalisesti niiden vaikutusta nimien dynamiikkaan.

Tällä kaikki tavoitteemme saavutettiin ja saavutettiin. Olemme oppineet käyttämään Pythonissa datan ryhmittely- ja visualisointityökaluja ja työskentelemme datan kanssa edelleen. Jokainen voi tehdä johtopäätöksiä valmiista, visualisoidusta datasta.

Kaikki tieto!

Lähde: will.com

Lisää kommentti