Python'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Python'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Ey Habr!

Bugün Python'da veri gruplama ve görselleştirme araçlarını kullanma becerisi üzerinde çalışacağız. Sağlanan Github'daki veri kümesi Birkaç özelliği analiz edelim ve bir dizi görselleştirme oluşturalım.

Gelenek gereği, başlangıçta hedefleri tanımlarız:

  • Verileri cinsiyete ve yıla göre gruplayın ve her iki cinsiyetin doğum oranının genel dinamiklerini görselleştirin;
  • Tarihteki en popüler isimleri bulun;
  • Verilerdeki tüm zaman aralığını 10 parçaya bölün ve her biri için her cinsiyetin en popüler adını bulun. Bulunan her isim için zaman içindeki dinamiklerini görselleştirin;
  • Her yıl için, insanların %50'sinin kaç ismin kapsadığını hesaplayın ve görselleştirin (her yıl için isim çeşitliliğini göreceğiz);
  • Toplam aralıktan 4 yıl seçin ve her yıl için dağılımı adın ilk harfine ve adın son harfine göre görüntüleyin;
  • Birkaç ünlü kişinin (başkanlar, şarkıcılar, aktörler, film kahramanları) bir listesini yapın ve isimlerin dinamikleri üzerindeki etkilerini değerlendirin. Görselleştirme oluşturun.

Daha az kelime, daha fazla kod!

Ve gidelim.

Verileri cinsiyete ve yıla göre gruplandıralım ve her iki cinsiyetin doğum oranının genel dinamiklerini görselleştirelim:

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'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Tarihteki en popüler isimleri bulalım:

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'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Verilerdeki tüm zaman dilimini 10 parçaya bölelim ve her biri için her cinsiyetin en popüler adını bulalım. Bulunan her ad için, tüm zaman boyunca dinamiklerini görselleştiririz:

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'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Python'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Python'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Python'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Python'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Python'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Python'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Python'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Python'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Python'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Her yıl için, insanların %50'sinin kaç ismin kapsadığını hesaplıyor ve bu verileri görselleştiriyoruz:

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'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Tüm aralıktan 4 yıl seçelim ve her yıl için adın ilk harfine ve adın son harfine göre dağılımını gösterelim:

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'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Python'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Birkaç ünlü kişinin (başkanlar, şarkıcılar, aktörler, film kahramanları) bir listesini yapalım ve isimlerin dinamikleri üzerindeki etkilerini değerlendirelim:

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'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Python'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Python'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Python'da gruplama ve veri görselleştirme kullanma becerisi üzerinde çalışmak

Pratik yapmak için, isimlerin dinamikleri üzerindeki etkilerini görsel olarak değerlendirmek için bir ünlünün yaşam dönemini son örnekteki görselleştirmeye ekleyebilirsiniz.

Bu konuda tüm hedeflerimize ulaşıldı ve yerine getirildi. Python'da veri gruplama ve görselleştirme araçlarının kullanımına hakim olduk ve verilerle daha fazla çalışacağız. Herkes hazır, görselleştirilmiş verilerden sonuçlar çıkarabilir.

Tüm bilgi!

Kaynak: habr.com

Yorum ekle