Obliczanie i wizualizacja macierzy korelacji z pandami

35

Mam ramkę danych pand z kilkoma wpisami i chcę obliczyć korelację między dochodami niektórych rodzajów sklepów. Istnieje wiele sklepów z danymi o dochodach, klasyfikacją obszaru działalności (teatr, sklepy odzieżowe, żywność ...) i innymi danymi.

Próbowałem utworzyć nową ramkę danych i wstawić kolumnę z przychodami ze wszystkich rodzajów sklepów należących do tej samej kategorii, a zwracana ramka danych ma tylko pierwszą kolumnę wypełnioną, a reszta jest pełna NaN. Kod, który zmęczyłem:

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

Chcę to zrobić, aby móc użyć .corr()macierzy korelacji między kategorią sklepów.

Następnie chciałbym wiedzieć, w jaki sposób mogę wykreślić wartości macierzy (od -1 do 1, ponieważ chcę użyć korelacji Pearsona) z matplolibem.

gdlm
źródło

Odpowiedzi:

24

Sugeruję jakiś rodzaj gry w następujących kwestiach:

Używanie danych UCI Abalone dla tego przykładu ...

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

wprowadź opis zdjęcia tutaj

Funkcja kreślenia macierzy korelacji:

# Matrycowa funkcja kreślenia korelacji

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)

wprowadź opis zdjęcia tutaj

Mam nadzieję że to pomoże!

AN6U5
źródło
Druga część była naprawdę bardzo pomocna, ale wciąż mam pierwszy problem i muszę go rozwiązać, zanim przejdę do drugiej części
gdlm
Bardzo trudno jest zrozumieć, czego chcesz w pierwszej części bez niektórych danych. Czy możesz dodać jakieś dane, aby zilustrować inny element, o który masz pytanie? Uważam, że rozwiązano to w trywialny sposób na podstawie tego, o czym wspomniałeś. Wystarczy napisać 10 wierszy ramki danych oraz przed i po tym, co masz i czego chcesz.
AN6U5
1
Linia import numpy as npnie jest konieczna, prawda?
Martin Thoma,
1
Nie używasz cbar, więc dlaczego to przypisujesz?
Martin Thoma,
1
@Martin Thoma - Masz rację, że numpy nie jest używany. Myślałem, że .corr () to funkcja numpy, ale to pandy. Używam paska kolorów, ale masz rację, że nie musiałem przypisywać go do cbar. Zredagowałem odpowiedź na podstawie twoich komentarzy. Dzięki!
AN6U5
29

Inną alternatywą jest użycie funkcji mapy cieplnej w dnie morskim do wykreślenia kowariancji. W tym przykładzie zastosowano zestaw danych Auto z pakietu ISLR w R (taki sam jak w pokazanym przykładzie).

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)

wprowadź opis zdjęcia tutaj

Jeśli chcesz być jeszcze bardziej fantazyjny, możesz użyć Pandas Style , na przykład:

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

wprowadź opis zdjęcia tutaj

mrandrewandrade
źródło
pierwszy raz zobacz używanie pakietu R w pythonie. Teraz można korzystać z wielu funkcji R. Świetnie
Diansheng,
Wersje Pand> 0,19 nie zawierają rpymodułu. Musisz użyć autonomicznego projektu rpy2. Zobacz ostrzeżenie z Pand tutaj .
n1k31t4
7

Dlaczego nie zrobić tego po prostu:

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

Możesz zmienić paletę kolorów , używając cmapparametru:

sns.heatmap(data.corr(), cmap='BuGn')
Kristada673
źródło