Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Tere, Habr!

Täna töötame välja oskust andmete gruppimise ja visualiseerimise vahendite kasutamisel Pythonis. Antud andmekogudest Githubis analüüsime mitmeid omadusi ja koostame visualiseerimise komplekti.

Kohustuslikult alustame eesmärkide määratlemisest:

  • Grupeerida andmed soo ja aasta järgi ning visualiseerida mõlema soo sünnidünaamika;
  • Leida kõikide aegade kõige populaarsemad nimed;
  • Jagada kogu ajavahemik andmetes 10 ossa ja igas leida iga soo kõige populaarsem nimi. Visualiseerida iga leitud nime dünaamika kogu aja vältel;
  • Kalkuleerida igal aastal, mitu nime katab 50% inimesi, ja visualiseerida (näeme nimede mitmekesisust igal aastal);
  • Valida 4 aastat kogu ajavahemikust ja kujutada iga aasta andmete jaotust nime esimese ja viimase tähe järgi;
  • Koostada nimekiri mõnest tuntud inimesest (presidendid, lauljad, näitlejad, filmiinimesed) ja hinnata nende mõju nimede dünaamikale. Koostada selge visualiseerimine.

Vähem sõnu, rohkem koodi!

Ja, asume asja kallale.

Grupeerime andmed soo ja aasta järgi ning visualiseerime mõlema soo sünnidünaamika:

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ünnid soo ja aastate kaupa')
ax.set_xlabel('Aastad')
ax.set_ylabel('Sünnid')
ax.set_xticklabels(years)
ax.set_xticks(index + 0.4)
ax.legend(loc=9)

fig.tight_layout()
plt.show()

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Leidke kõikide aegade kõige populaarsemad nimed:

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)

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Jagame kogu ajavahemikku andmetes 10 ossa ja leiame igas soost 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ünnimäär')
    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()

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist 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()

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Valime 4 aastat kogu ajavahemikust ja kuvame igale aastale nime esitähe ja lõputehte jaotuse:

import string

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(string.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', 'gender', '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 string.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ähtede järjekord')
ax_first.set_ylabel('Esinemise sagedus, %')
ax_first.set_title('Esimene täht nimes')
ax_first.set_xticks(index)
ax_first.set_xticklabels(string.ascii_uppercase)
ax_first.legend()

ax_last.set_xlabel('Tähtede järjekord')
ax_last.set_ylabel('Esinemise sagedus, %')
ax_last.set_title('Viimane täht nimes')
ax_last.set_xticks(index)
ax_last.set_xticklabels(string.ascii_uppercase)
ax_last.legend()

fig_first.tight_layout()
fig_last.tight_layout()

plt.show()

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

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

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

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Areneme oskust kasutada andmete rühmitamist ja visualiseerimist Pythonis

Treeninguks võite viimasest näitest lisada visualiseerimisse kuulsuse eluaja, et illustreerida nende mõju nimede dünaamikale.

Sellega on kõik meie eesmärgid saavutatud ja täidetud. Oleme töötanud välja oskuse andmete grupi ja visualiseerimise vahendite kasutamiseks Pythonis ning jätkame andmetega töötamist. Igaüks saab järeldusi juba valmis, visualiseeritud andmete põhjal teha ise.

Kasutage teadmisi!

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster