- Вопрос или проблема
- Ответ или решение
- Взаимосвязь между двумя переменными в DataFrame: Анализ диапазона кредитных оценок и новых оценок
- Введение
- Шаг 1: Подготовка данных
- Шаг 2: Создание бинов для новых кредитных оценок
- Шаг 3: Построение частотной таблицы
- Шаг 4: Анализ результатов
- Шаг 5: Дополнительные метрики
- Заключение
Вопрос или проблема
У меня есть данные в двух колонках: одна – диапазон старого кредитного рейтинга (диапазон входных оценок) и новая кредитная оценка (cvsc100). Как мне получить информацию из обоих? Где старый – это диапазон значений, а другая колонка – нет (CVSC100)
Я знаю, как вычислить корреляцию Пирсона в Python для датафрейма из двух колонок. Но я считаю, что этого должно быть недостаточно. Как мне поступить, не могли бы вы дать совет
Первый шаг будет заключаться в том, чтобы разбить cvsc100 на те же интервалы, что и у вас для входных данных, это, безусловно, поможет вашим сравнениям.
Второй шаг будет заключаться в создании таблицы частот с вашим диапазоном входных данных в колонках и разбиенным CVS100 в строках, а на пересечении – количество значений. Это поможет наблюдать, как распределен CVSC100 по сравнению с вашим входом и понять основной процесс.
Предполагая, что у вас есть оценка, которую можно записать как оценку для периода n и периода n+1, с некоторыми гипотезами о стационарности основного процесса и модулем некоторой легкой перенормализации, вы можете получить вероятности перехода и использовать эту матрицу для симуляций, чтобы получить распределение оценок для периода n+2 и так далее.
Без дополнительных данных (объясняющих переменных или фактических значений дефолта) вы не можете получить более полезные метрики.
Я опоздал, но я воспроизвел данные, чтобы визуально увидеть потенциальную взаимосвязь/корреляцию. Я попытался построить график данных из 2 колонок, используя plt.errorbar()
для лучшего понимания, следующим образом:
import matplotlib.pyplot as plt
import pandas as pd
# Очистка и структурирование извлеченного текста в формате DataFrame
data = [
("674-689", 664),
("706-719", 734),
("805-816", 823),
("658-673", 618),
("639-657", 684),
("690-705", 652),
("743-753", 733),
("674-689", 685),
("608-638", 679),
("658-673", 667),
("720-731", 748),
("840-852", 849),
("720-731", 714),
("754-767", 752),
("674-689", 676),
("658-673", 649),
("732-742", 727),
("690-705", 687),
("608-638", 639),
("732-742", 773),
("805-816", 836),
("780-792", 763),
("793-804", 778),
("840-852", 843),
("768-779", 753),
("732-742", 734),
("639-657", 714),
("732-742", 748),
("706-719", 727),
("608-638", 620),
("706-719", 706),
]
# Создание pandas DataFrame
df = pd.DataFrame(data, columns=["Score_Range", "CVSC100"])
# Извлечение числовых значений из 'Score_Range'
df[['Score_Lower', 'Score_Upper']] = df['Score_Range'].str.split('-', expand=True).astype(float)
# Исправление расчета погрешности, используя абсолютные различия
lower_error = abs(df['CVSC100'] - df['Score_Lower'])
upper_error = abs(df['Score_Upper'] - df['CVSC100'])
# Построение графика погрешностей и значений 'CVSC100' по одной оси
plt.figure(figsize=(10, 6))
# Построение графика погрешностей, проецируя их на одну ось 'CVSC100'
plt.errorbar(df['CVSC100'], df.index, xerr=[lower_error, upper_error], fmt="o", ecolor="red", capsize=5, label="CVSC100 с погрешностями")
# Добавление заголовка и меток
plt.title('Проекция значений CVSC100 и погрешности на одной оси')
plt.xlabel('CVSC100')
plt.ylabel('Индекс')
plt.grid(True)
plt.legend()
plt.show()
Я попытался разделить и создать новые колонки для концов интервалов как 'Score_Lower'
и 'Score_Upper'
и попытался создать таблицу частот:
# Шаг 1: Определите интервалы для CVSC100 на основе значений Score_Range
score_bins = []
for score_range in df['Score_Range']:
lower, upper = map(int, score_range.split('-'))
score_bins.append((lower, upper))
# Создание интервалов для CVSC100, используя границы диапазона баллов
bin_edges = sorted(set([lower for lower, upper in score_bins] + [score_bins[-1][1]]))
# Создание интервалов для CVSC100
df['CVSC100_Binned'] = pd.cut(df['CVSC100'], bins=bin_edges, right=True, labels=False)
# Шаг 2: Создание таблицы частот (контингентная таблица)
frequency_table = pd.crosstab(df['CVSC100_Binned'], df['Score_Range'])
import seaborn as sns
import matplotlib.pyplot as plt
# Построение тепловой карты для таблицы частот
plt.figure(figsize=(12, 8))
sns.heatmap(frequency_table, annot=True, cmap="YlGnBu", cbar_kws={'label': 'Частота'}, fmt="d", linewidths=0.5)
# Добавление заголовка и меток
plt.title('Тепловая карта таблицы частот CVSC100 против диапазона оценок')
plt.xlabel('Диапазон оценок')
plt.ylabel('CVSC100 Бин')
# Показать график
plt.show()
Так что я преобразовал df и построил таблицу частот, используя sns.heatmap()
, где каждая ячейка представляет собой количество случаев для конкретной комбинации разбиенных значений CVSC100
и Score_Range
:
Я не смог прокомментировать вывод тепловой карты таблицы
Ответ или решение
Взаимосвязь между двумя переменными в DataFrame: Анализ диапазона кредитных оценок и новых оценок
Введение
Ваша задача заключается в анализе данных из двух колонок: диапазона старых кредитных оценок (в формате текстовых диапазонов) и новых кредитных оценок (целочисленные значения). Данный тип анализа может предоставить ценную информацию о том, как старые и новые кредитные оценки соотносятся друг с другом. В следующем разделе мы рассмотрим несколько шагов, которые помогут вам провести углублённый анализ.
Шаг 1: Подготовка данных
Первый шаг заключается в разбиении текстового диапазона старых кредитных оценок на два числовых значения – нижнюю и верхнюю границы. Это позволит вам анализировать данные более эффективно и сопоставлять диапазоны с новыми кредитными оценками:
import pandas as pd
data = [
("674-689", 664),
("706-719", 734),
("805-816", 823),
("658-673", 618),
# ... остальные данные ...
]
df = pd.DataFrame(data, columns=["Score_Range", "CVSC100"])
df[['Score_Lower', 'Score_Upper']] = df['Score_Range'].str.split('-', expand=True).astype(float)
Шаг 2: Создание бинов для новых кредитных оценок
Следующим шагом будет создание бинов для новых кредитных оценок на основе уже существующих диапазонов старых оценок. Это позволит вам сравнить категории (биды) новых кредитных оценок с диапазонами старых:
score_bins = []
for score_range in df['Score_Range']:
lower, upper = map(float, score_range.split('-'))
score_bins.append((lower, upper))
bin_edges = sorted(set([lower for lower, upper in score_bins] + [score_bins[-1][1]]))
df['CVSC100_Binned'] = pd.cut(df['CVSC100'], bins=bin_edges, right=True, labels=False)
Шаг 3: Построение частотной таблицы
С помощью частотной таблицы (контингентной таблицы) вы сможете визуализировать распределение новых кредитных оценок относительно диапазонов старых:
frequency_table = pd.crosstab(df['CVSC100_Binned'], df['Score_Range'])
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 8))
sns.heatmap(frequency_table, annot=True, cmap="YlGnBu", cbar_kws={'label': 'Частота'}, fmt="d", linewidths=0.5)
plt.title('Частотная таблица новых оценок против старых диапазонов')
plt.xlabel('Диапазон старой оценки')
plt.ylabel('Бин новых оценок')
plt.show()
Шаг 4: Анализ результатов
Построенный график (тепловая карта) позволит вам увидеть, как новые оценки распределяются в рамках старых диапазонов. Каждый элемент матрицы будет представлять собой частоту появления новых оценок в соответствующих диапазонах. Это поможет вам выявить:
- Группы: Диапазоны старых оценок, в которых новые оценки часто оказываются выше или ниже.
- Тренды: Возможное смещение новых оценок по сравнению со старыми.
- Аномалии: Незапланированные действия потребителей, приводящие к высоким или низким оценкам.
Шаг 5: Дополнительные метрики
Для более глубокого понимания динамики между этими переменными, можно рассмотреть возможность расчетов таких метрик, как:
- Корреляция: хотя корреляция Пирсона может быть полезной, рассмотрите и другие методы, такие как Спирмен или Kendall для проверки ассоциации.
- Трансферные вероятности: Исследуйте, какие новые оценки могут возникнуть из каждого старого диапазона на основе исторических данных.
- Кластерный анализ: Для сегментации клиентов с схожими оценками.
Заключение
Анализ взаимосвязи между старой и новой кредитными оценками является многоступенчатым процессом, который требует внимательного подхода к подготовке и обработке данных, визуализации, а также интерпретации результатов. Создание частотных таблиц и тепловых карт – это только начало. Для дальнейшего анализа рекомендуется внедрять более сложные метрики и методы, что в свою очередь обеспечит получение более полной картины для принятия обоснованных решений.