Расчет и визуализация корреляционной матрицы с пандами

35

У меня есть фрейм данных Pandas с несколькими записями, и я хочу рассчитать корреляцию между доходами магазинов определенного типа. Есть ряд магазинов с данными о доходах, классификацией области деятельности (театр, магазины одежды, продукты питания ...) и другими данными.

Я попытался создать новый фрейм данных и вставить столбец с доходами всех видов магазинов, принадлежащих к той же категории, а в возвращаемом фрейме данных заполнен только первый столбец, а в остальных - NaN. Код, который мне надоел:

corr = pd.DataFrame()
for at in activity:
    stores.loc[stores['Activity']==at]['income']

Я хочу сделать это, поэтому я могу использовать, .corr()чтобы дать матрицу корреляции между категориями магазинов.

После этого я хотел бы знать, как я могу построить матричные значения (от -1 до 1, так как я хочу использовать корреляцию Пирсона) с matplolib.

gdlm
источник

Ответы:

24

Я предлагаю какую-то игру на следующем:

Используя данные UCI Abalone для этого примера ...

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# Read file into a Pandas dataframe
from pandas import DataFrame, read_csv
f = 'https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data'
df = read_csv(f)
df=df[0:10]
df

введите описание изображения здесь

Функция построения корреляционной матрицы:

# Корреляционная матричная функция построения

def correlation_matrix(df):
    from matplotlib import pyplot as plt
    from matplotlib import cm as cm

    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    cmap = cm.get_cmap('jet', 30)
    cax = ax1.imshow(df.corr(), interpolation="nearest", cmap=cmap)
    ax1.grid(True)
    plt.title('Abalone Feature Correlation')
    labels=['Sex','Length','Diam','Height','Whole','Shucked','Viscera','Shell','Rings',]
    ax1.set_xticklabels(labels,fontsize=6)
    ax1.set_yticklabels(labels,fontsize=6)
    # Add colorbar, make sure to specify tick locations to match desired ticklabels
    fig.colorbar(cax, ticks=[.75,.8,.85,.90,.95,1])
    plt.show()

correlation_matrix(df)

введите описание изображения здесь

Надеюсь это поможет!

AN6U5
источник
Вторая часть была действительно очень полезной, но у меня все еще есть первая проблема, и мне нужно решить ее, прежде чем перейти ко второй части
gdlm
Очень сложно понять, что вы хотите в первой части без каких-либо данных. Можете ли вы добавить некоторые данные, чтобы проиллюстрировать другую часть, о которой у вас есть вопрос. Я считаю, что это тривиально решается на основе того, что вы упомянули. Просто напишите 10 строк данных и до и после того, что у вас есть и чего вы хотите.
AN6U5
1
Линия import numpy as npне нужна, не так ли?
Мартин Тома
1
Вы не используете cbar, так почему вы назначаете это?
Мартин Тома
1
@Martin Thoma - Вы правы, что numpy не используется. Я думал, что .corr () - это просто функция, но это панды. Я использую цветовую панель, но вы правы, что мне не нужно было назначать ее для cbar. Я отредактировал ответ на основе ваших комментариев. Благодарность!
AN6U5
29

Другой альтернативой является использование функции тепловой карты в морском заливе для построения ковариации. В этом примере используется набор данных Auto из пакета ISLR в R (так же, как в примере, который вы показали).

import pandas.rpy.common as com
import seaborn as sns
%matplotlib inline

# load the R package ISLR
infert = com.importr("ISLR")

# load the Auto dataset
auto_df = com.load_data('Auto')

# calculate the correlation matrix
corr = auto_df.corr()

# plot the heatmap
sns.heatmap(corr, 
        xticklabels=corr.columns,
        yticklabels=corr.columns)

введите описание изображения здесь

Если вы хотите быть еще более модным, вы можете использовать Pandas Style , например:

cmap = cmap=sns.diverging_palette(5, 250, as_cmap=True)

def magnify():
    return [dict(selector="th",
                 props=[("font-size", "7pt")]),
            dict(selector="td",
                 props=[('padding', "0em 0em")]),
            dict(selector="th:hover",
                 props=[("font-size", "12pt")]),
            dict(selector="tr:hover td:hover",
                 props=[('max-width', '200px'),
                        ('font-size', '12pt')])
]

corr.style.background_gradient(cmap, axis=1)\
    .set_properties(**{'max-width': '80px', 'font-size': '10pt'})\
    .set_caption("Hover to magify")\
    .set_precision(2)\
    .set_table_styles(magnify())

введите описание изображения здесь

mrandrewandrade
источник
Впервые увидим использование пакета R в Python. Многие функции R можно использовать сейчас. Отлично
Diansheng
Версии Pandas> 0.19 не содержат rpyмодуль. Вам нужно использовать автономный проект rpy2. Смотрите предупреждение от панд здесь .
n1k31t4
7

Почему бы просто не сделать это:

import seaborn as sns
import pandas as pd

data = pd.read_csv('Dataset.csv')

plt.figure(figsize=(40,40)) 
# play with the figsize until the plot is big enough to plot all the columns
# of your dataset, or the way you desire it to look like otherwise

sns.heatmap(data.corr())

Вы можете изменить цветовую палитру с помощью cmapпараметра:

sns.heatmap(data.corr(), cmap='BuGn')
Kristada673
источник