Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Γεια σου Χαμπρ!

Σήμερα θα εργαστούμε για την ικανότητα χρήσης εργαλείων για ομαδοποίηση και οπτικοποίηση δεδομένων στην Python. Στα προβλεπόμενα σύνολο δεδομένων στο Github Ας αναλύσουμε πολλά χαρακτηριστικά και ας δημιουργήσουμε ένα σύνολο οπτικοποιήσεων.

Σύμφωνα με την παράδοση, στην αρχή, ας ορίσουμε τους στόχους:

  • Ομαδοποιήστε δεδομένα ανά φύλο και έτος και οπτικοποιήστε τη συνολική δυναμική του ποσοστού γεννήσεων και των δύο φύλων.
  • Βρείτε τα πιο δημοφιλή ονόματα όλων των εποχών.
  • Διαχωρίστε ολόκληρη τη χρονική περίοδο στα δεδομένα σε 10 μέρη και για το καθένα, βρείτε το πιο δημοφιλές όνομα κάθε φύλου. Για κάθε όνομα που βρέθηκε, οραματιστείτε τη δυναμική του ανά πάσα στιγμή.
  • Για κάθε έτος, υπολογίστε πόσα ονόματα καλύπτουν το 50% των ανθρώπων και οραματιστείτε (θα δούμε την ποικιλία των ονομάτων για κάθε έτος).
  • Επιλέξτε 4 έτη από ολόκληρο το διάστημα και εμφανίστε για κάθε έτος την κατανομή με το πρώτο γράμμα στο όνομα και με το τελευταίο γράμμα στο όνομα.
  • Κάντε μια λίστα με πολλά διάσημα πρόσωπα (πρόεδροι, τραγουδιστές, ηθοποιοί, χαρακτήρες ταινιών) και αξιολογήστε την επιρροή τους στη δυναμική των ονομάτων. Δημιουργήστε μια οπτικοποίηση.

Λιγότερα λόγια, περισσότερος κώδικας!

Και, πάμε.

Ας ομαδοποιήσουμε τα δεδομένα ανά φύλο και έτος και ας οπτικοποιήσουμε τη συνολική δυναμική του ποσοστού γεννήσεων και των δύο φύλων:

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

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Ας βρούμε τα πιο δημοφιλή ονόματα στην ιστορία:

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)

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Ας χωρίσουμε ολόκληρη τη χρονική περίοδο στα δεδομένα σε 10 μέρη και για το καθένα θα βρούμε το πιο δημοφιλές όνομα κάθε φύλου. Για κάθε όνομα που βρέθηκε, απεικονίζουμε τη δυναμική του ανά πάσα στιγμή:

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

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Για κάθε χρόνο, υπολογίζουμε πόσα ονόματα καλύπτουν το 50% των ανθρώπων και οπτικοποιούμε αυτά τα δεδομένα:

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

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Ας επιλέξουμε 4 έτη από ολόκληρο το διάστημα και ας εμφανίσουμε για κάθε έτος την κατανομή με το πρώτο γράμμα στο όνομα και με το τελευταίο γράμμα στο όνομα:

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

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Ας κάνουμε μια λίστα με πολλά διάσημα πρόσωπα (πρόεδροι, τραγουδιστές, ηθοποιοί, χαρακτήρες ταινιών) και ας αξιολογήσουμε την επιρροή τους στη δυναμική των ονομάτων:

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

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Εργασία για την ικανότητα χρήσης ομαδοποίησης και οπτικοποίησης δεδομένων στην Python

Για εκπαίδευση, μπορείτε να προσθέσετε την περίοδο ζωής της διασημότητας στην οπτικοποίηση από το τελευταίο παράδειγμα, προκειμένου να αξιολογήσετε με σαφήνεια την επιρροή τους στη δυναμική των ονομάτων.

Με αυτό, όλοι οι στόχοι μας επιτεύχθηκαν και εκπληρώθηκαν. Έχουμε αναπτύξει την ικανότητα χρήσης εργαλείων για ομαδοποίηση και οπτικοποίηση δεδομένων στην Python και θα συνεχίσουμε να εργαζόμαστε με δεδομένα. Ο καθένας μπορεί να βγάλει συμπεράσματα με βάση έτοιμα, οπτικοποιημένα δεδομένα.

Γνώση σε όλους!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο