Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Tere, Habr!

Täna keskendume andmete rühmitamise ja visualiseerimisevahendite oskuse arendamisele Pythonis. Antud datasett GitHubis analüüsime mitmeid omadusi ja loome visuaalsete esituste kogumi.

Käesolevates harjutustes määrame alguses eesmärgid:

  • Rühmitame andmed soo ja aasta järgi ning visualiseerime mõlema soo sündimuse üldist dünaamikat;
  • Leiame kõige populaarsemad nimed läbi ajaloo;
  • Jagame kogu ajavahemiku andmetes 10 osaks ja igaühe jaoks leiame kõige populaarseima nime igast soost. Iga leitud nime dünaamika visualiseerimine ajas;
  • Kalkuleerime iga aasta kohta, kui palju nimesid katab 50% inimesi ja visualiseerime (näeme igas aasta jooksul nimede mitmekesisust);
  • Valime 4 aastat kogu ajavahemikust ja kuvame iga aasta jaoks jaotuse esimese ja viimase tähtede järgi nimes;
  • Koostame loetelu tuntud inimestest (presidendid, lauljad, näitlejad, filmikangelased) ja hindame nende mõju nimede dünaamikale. Loome selge visuaali.

Vähem sõnu, rohkem koodi!

Nüüd saame hakata.

Rühmitame andmed soo ja aasta järgi ning visualiseerime üldise sündimuse dünaamika mõlemas soost:

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='Mehed')
stolb2 = ax.bar(index + 0.4, births_women_list, 0.4, alpha=0.8, color='r', label='Naised')

ax.set_title('Sündimus soo ja aastate järgi')
ax.set_xlabel('Aastad')
ax.set_ylabel('Sündimus')
ax.set_xticklabels(years)
ax.set_xticks(index + 0.4)
ax.legend(loc=9)

fig.tight_layout()
plt.show()

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Otsime välja kõige populaarsemad nimed kogu ajaloo jooksul:

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)

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Jagame kogu ajavahemiku andmed 10 osaks ja leiame iga soo kohta kõige populaarsema nime. Iga leitud nime dünaamikat visualiseerime kogu aja jooksul:

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('Aastad')
    ax.set_ylabel('Sünnid')
    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()

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Iga aasta kohta arvutame, kui palju nimesid katab 50% inimesi ja visualiseerime need andmed:

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('Aastad', fontsize = 12)
ax1.set_ylabel('Nimede mitmekesisus', fontsize = 12)
ax1.plot(dataframe['year'], dataframe['count'], color='r', ls='-')
ax1.legend(loc=9, fontsize=12)

plt.show()

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Valime 4 aastat kogu vahemikust ja kuvame iga aasta kohta jaotuse nime esimesest ja viimases tähest:

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('Tähe täht')
ax_first.set_ylabel('Sagedus, %')
ax_first.set_title('Esimene täht nimes')
ax_first.set_xticks(index)
ax_first.set_xticklabels(ascii_uppercase)
ax_first.legend()

ax_last.set_xlabel('Tähe täht')
ax_last.set_ylabel('Sagedus, %')
ax_last.set_title('Viimane täht nimes')
ax_last.set_xticks(index)
ax_last.set_xticklabels(ascii_uppercase)
ax_last.legend()

fig_first.tight_layout()
fig_last.tight_layout()

plt.show()

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Koostame nimekirja mitmest tuntud inimesest (presidendid, lauljad, näitlejad, filmikangelased) ja hindame nende mõju nimede dünaamikale:

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('Aastad', fontsize = 10)
    ax.set_ylabel('Sünnitusmäär', fontsize = 10)
    ax.plot(dataframe['year'], dataframe['count'], label=celebrity, color='r', ls='-')
    ax.legend(loc=9, fontsize=12)
        
    plt.show()

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Töötame välja andmete rühmitamise ja visualiseerimiseoskuse Pythonis.

Treeninguks võite viimases näites lisada visuaaliseerimisse kuulsuse eluperioodi, et paremini hinnata nende mõju nimede dünaamikale.

Sellega on kõik meie eesmärgid saavutatud ja täidetud. Oleme harjutanud andmete grupeerimise ja visualiseerimise oskust Pythonis, ning jätkame edaspidi andmetega töötamist. Valmis, visualiseeritud andmete põhjal saab igaüks ise järeldusi teha.

Kõigile teadmisi!

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster