Wednesday, June 22, 2022

How to make a Pareto chart in Python

График Парето представляет собой отсортированную гистограмму в порядке убывания, которая показывает  совокупный итог в виде линии. Он объединяет информацию гистограммы. Графики основаны на правиле «80/20». Это правило гласит, что около 80% проблем являются следствием 20% причин. Это правило также называется «жизненно малое и тривиальное много». Опять же, идея состоит в том, что вы можете сосредоточиться на нескольких жизненно важных коренных причинах проблемы и игнорировать многие тривиальные. 

На нашем примере с морженым мы видим, что шоколад, мята и ваниль составляют 81% наших продаж. С точки зрения рекламы мы могли бы сделать какую-то скидку, связанную с этими вкусами, чтобы еще больше их увеличить. Надеюсь, вы видите преимущества использования этого графика вместо отдельной гистограммы и круговой диаграммы.

Code 1

(.env) boris@boris-All-Series:~/PARETO$ cat plotPareto3.py

import pandas as pd

import matplotlib.pyplot as plt

from matplotlib.ticker import PercentFormatter

"""

Предположим, мы проводим опрос, в котором мы попросим  3010 разных людей определить их любимую марку мороженого среди марок 'Chocolate','Vanilla','Mint','Swirl','Nut','Plump'.

Создадим следующий кадр данных pandas для хранения результатов опросa

"""

df = pd.DataFrame({'count': [1000,  650,  800,  450, 75, 35]})

df.index = ['Chocolate','Vanilla','Mint','Swirl','Nut','Plump']


# sort DataFrame by count descending

df = df.sort_values(by='count', ascending=False)


# добавим столбец для отображения совокупного процента

df['cumperc'] = df['count'].cumsum()/df['count'].sum()*100

print(df)


# matplolib code для создания диаграммы Парето

color1 = 'steelblue'

color2 = 'red'

line_size = 4


# создадим базовый столбчатый график

fig, ax = plt.subplots()

ax.bar(df.index, df['count'], color=color1)


# добавим кумулятивную процентную линию на график

ax2 = ax.twinx()

ax2.plot(df.index, df['cumperc'], color=color2, marker="D", ms=line_size)

ax2.yaxis.set_major_formatter(PercentFormatter())


# specify axis colors

ax.tick_params(axis='y', colors=color1)

ax2.tick_params(axis='y', colors=color2)

plt.show()



























Несколько другая версия кода

Code 2

import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")

df = pd.DataFrame({
    'Flavor': ['Chocolate', 'Vanilla', 'Mint', 'Swirl', 'Nut', 'Plump'],
    'Orders': [1000,  650,  800,  450,  75, 35]
})

def pareto_plot(df,x=None,y=None,title=None,show_pct_y=False,pct_format='{0:.0%}'):
    xlabel = x
    ylabel = y
    tmp = df.sort_values(y, ascending=False)
    x = tmp[x].values
    y = tmp[y].values
    weights = y / y.sum()
    cumsum = weights.cumsum()
    
    fig, ax1 = plt.subplots()
    ax1.bar(x, y)
    ax1.set_xlabel(xlabel)
    ax1.set_ylabel(ylabel)

    ax2 = ax1.twinx()
    ax2.plot(x, cumsum, '-ro', alpha=0.5)
    ax2.set_ylabel('', color='r')
    ax2.tick_params('y', colors='r')
    
    vals = ax2.get_yticks()
    ax2.set_yticklabels(['{:,.2%}'.format(x) for x in vals])

    # hide y-labels on right side
    if not show_pct_y:
        ax2.set_yticks([])
    
    formatted_weights = [pct_format.format(x) for x in cumsum]
    for i, txt in enumerate(formatted_weights):
        ax2.annotate(txt, (x[i], cumsum[i]), fontweight='heavy')    

    if title:
        plt.title(title)
    
    plt.tight_layout()
    plt.show()

pareto_plot(df,x='Flavor',y='Orders',title='Ice Cream Sales')








No comments:

Post a Comment