в моем столбце Annual_in c не отображается графика, и я не могу понять, в чем проблема - PullRequest
0 голосов
/ 20 июня 2020
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

df=pd.read_csv("C:\\Users\\USER\\Desktop\\ML\\XYZCorp_LendingData.txt", sep='\t',low_memory=False)

df['annual_inc'].head()
'''
0    24000.0
1    30000.0
2    12252.0
3    49200.0
4    80000.0
Name: annual_inc, dtype: float64
'''

sns.set(style="whitegrid")
sns.distplot(df['annual_inc'])

фактический сюжет

Это желаемый результат, который я не могу получить:

желаемый сюжет

1 Ответ

2 голосов
/ 20 июня 2020

Доход обычно следует некоторому типу распределения Парето (Парето также известен из соответствующего правила 80-20 ). Это означает огромное количество маленьких чисел и очень редких больших чисел, некоторые из которых могут быть чрезвычайно высокими.

Такое распределение не подходит ни для гистограммы, ни для kdeplot. Почти все значения попадают в первые несколько бункеров, а редкие числа попадают в некоторые из последних бункеров.

См. этот и этот пост о том, почему даже просто попытка подогнать некоторые параметры может быть чрезвычайно сложной.

Теперь, чтобы получить разумную гистограмму, можно ограничить график только первой частью. Количество бинов необходимо увеличить (потому что большинство из них будет обрезано из-за измененных пределов).

x = np.random.pareto(1.4, size=1000)
ax = sns.distplot(x, bins=200)
ax.set_xlim(0, 10)

В качестве альтернативы, можно отрезать все высокие значения и нарисовать график распределения по умолчанию. Например, np.percentile(x, 95) вычисляет 95 th процентиль.

from matplotlib import pyplot as plt
import numpy as np
import seaborn as sns

x = np.random.pareto(1.4, size=1000)
cut_off = np.percentile(x, 95)  # get the 95th percentile
sns.distplot(x[x < cut_off])
plt.show()

пример distplot

PS: Обратите внимание, что доход по заявкам на получение кредита не соответствует строгому распределению Парето. Самые низкие доходы будут отфильтрованы до того, как дойдут до этапа подачи заявки на ссуду, а самые высокие доходы не получают ссуды стандартными способами. Тем не менее, чтобы получить более красивый график, ограничение диапазона, увеличение количества ячеек и эксперименты с полосой пропускания (kde_kws={"bw":bandwidth}) по-прежнему очень полезны.

Также для скрипичного рисунка отсечение самых высоких значений может полезно. Для блочной диаграммы было бы лучше просто ограничить x-диапазон (ax.set_xlim(0, ...). При желании вы можете попробовать ax.set_xscale('log'), чтобы отобразить график с логарифмической шкалой c.

...