Розрахунок та візуалізація матриці кореляції з пандами


35

У мене є кадр даних панди з декількома записами, і я хочу обчислити співвідношення між доходами певного типу магазинів. Існує ряд магазинів з даними про доходи, класифікацією сфери діяльності (театр, магазини тканин, продукти харчування ...) та іншими даними.

Я спробував створити новий кадр даних і вставити стовпчик із доходом усіх видів магазинів, що належать до однієї категорії, а у кадрі даних, що повертаються, заповнений лише перший стовпець, а решта заповнена NaN. Код, який я втомив:

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

Я хочу це зробити, тому можу використовувати, .corr()щоб дати матрицю кореляції між категоріями магазинів.

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


Відповіді:


24

Я пропоную якусь гру з наступного:

Використання даних Abalone UCI для цього прикладу ...

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)

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

Сподіваюся, це допомагає!


Друга частина справді була дуже корисною, але у мене все ще є перша проблема, і мені потрібно вирішити її, перш ніж перейти до другої частини
gdlm

Дуже важко зрозуміти, що ви хочете в першій частині, без деяких даних. Чи можете ви додати деякі дані, щоб проілюструвати інший фрагмент, щодо якого у вас є питання. Я вважаю, що це банально вирішується на основі того, що ви згадали. Просто напишіть 10 рядків фрейму даних і до і після того, що ви маєте і хочете.
AN6U5

1
Лінія import numpy as npне потрібна, чи не так?
Мартін Тома

1
Ви не використовуєте cbar, так навіщо це призначити?
Мартін Тома

1
@Martin Thoma - Ви правильні, що нуме не використовується. Я думав, що .corr () була функцією нумету, але це панди. Я використовую кольорову панель, але ви вірні, що мені не потрібно було призначати її cbar. Я відредагував відповідь на основі ваших коментарів. Спасибі!
AN6U5

29

Іншою альтернативою є використання функції теплової карти у новонароджених для побудови коваріації. У цьому прикладі використовується автоматичний набір даних з пакету 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 , наприклад:

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())

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


вперше побачити використання пакету R у python. Зараз можна використовувати багато функцій R. Великий
Діаншенг

Версії Pandas> 0.19 не містять rpyмодуля. Вам потрібно скористатися окремим проектом rpy2. Дивіться попередження Pandas тут .
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')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.