Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Này Habr!

Hôm nay chúng ta sẽ học kỹ năng sử dụng các công cụ để nhóm và trực quan hóa dữ liệu trong Python. Trong được cung cấp tập dữ liệu trên Github Hãy phân tích một số đặc điểm và xây dựng một bộ hình ảnh trực quan.

Theo truyền thống, ngay từ đầu chúng ta hãy xác định mục tiêu:

  • Nhóm dữ liệu theo giới tính và năm và trực quan hóa động lực chung về tỷ lệ sinh của cả hai giới;
  • Tìm những cái tên phổ biến nhất mọi thời đại;
  • Chia toàn bộ khoảng thời gian trong dữ liệu thành 10 phần và với mỗi phần, hãy tìm tên phổ biến nhất của mỗi giới tính. Đối với mỗi tên được tìm thấy, hãy hình dung động lực của nó theo thời gian;
  • Mỗi năm, hãy tính xem có bao nhiêu tên chiếm 50% dân số và hình dung (chúng ta sẽ thấy sự đa dạng của các tên cho mỗi năm);
  • Chọn 4 năm trong toàn bộ khoảng thời gian và hiển thị phân bổ theo từng năm theo chữ cái đầu tiên trong tên và chữ cái cuối cùng trong tên;
  • Lập danh sách một số người nổi tiếng (tổng thống, ca sĩ, diễn viên, nhân vật điện ảnh) và đánh giá ảnh hưởng của họ đối với động lực của tên tuổi. Xây dựng một hình ảnh trực quan.

Ít từ hơn, nhiều mã hơn!

Và, đi thôi.

Hãy nhóm dữ liệu theo giới tính và năm rồi hình dung diễn biến chung về tỷ lệ sinh của cả hai giới:

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

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Hãy cùng tìm những cái tên phổ biến nhất trong lịch sử:

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)

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Hãy chia toàn bộ khoảng thời gian trong dữ liệu thành 10 phần và với mỗi phần chúng ta sẽ tìm ra tên phổ biến nhất của từng giới tính. Đối với mỗi tên được tìm thấy, chúng tôi trực quan hóa động lực của nó theo thời gian:

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

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Mỗi năm, chúng tôi tính toán có bao nhiêu cái tên chiếm 50% dân số và trực quan hóa dữ liệu này:

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

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Hãy chọn 4 năm trong toàn bộ khoảng thời gian và hiển thị cho mỗi năm sự phân bổ theo chữ cái đầu tiên trong tên và chữ cái cuối cùng trong tên:

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

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Hãy lập danh sách một số người nổi tiếng (tổng thống, ca sĩ, diễn viên, nhân vật điện ảnh) và đánh giá ảnh hưởng của họ đối với động lực của tên tuổi:

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

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Rèn luyện kỹ năng sử dụng nhóm và trực quan hóa dữ liệu trong Python

Để đào tạo, bạn có thể thêm thời gian sống của người nổi tiếng vào hình ảnh trực quan từ ví dụ trước để đánh giá rõ ràng ảnh hưởng của họ đối với động lực của tên.

Với điều này, tất cả các mục tiêu của chúng tôi đã đạt được và hoàn thành. Chúng tôi đã phát triển kỹ năng sử dụng các công cụ để nhóm và trực quan hóa dữ liệu trong Python và chúng tôi sẽ tiếp tục làm việc với dữ liệu. Mọi người đều có thể tự mình đưa ra kết luận dựa trên dữ liệu trực quan, được tạo sẵn.

Kiến thức tới mọi người!

Nguồn: www.habr.com

Thêm một lời nhận xét