การคำนวณและการแสดงเมทริกซ์สหสัมพันธ์ด้วยนุ่น


35

ฉันมีกรอบข้อมูลแพนด้ากับหลายรายการและฉันต้องการคำนวณความสัมพันธ์ระหว่างรายได้ของร้านค้าบางประเภท มีร้านค้าหลายแห่งที่มีข้อมูลรายได้การจำแนกประเภทของกิจกรรม (โรงละครร้านผ้าอาหาร ... ) และข้อมูลอื่น ๆ

ฉันพยายามสร้าง data frame ใหม่และแทรกคอลัมน์ที่มีรายได้ของร้านค้าทุกประเภทที่อยู่ในหมวดหมู่เดียวกันและ data frame ที่ส่งคืนมีเพียงคอลัมน์แรกที่เต็มไปและคอลัมน์ที่เหลือเต็มไปด้วย NaN รหัสที่ฉันเหนื่อย:

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

ฉันต้องการทำเช่นนั้นดังนั้นฉันสามารถใช้.corr()เพื่อให้เมทริกซ์สหสัมพันธ์ระหว่างหมวดหมู่ของร้านค้า

หลังจากนั้นฉันอยากรู้ว่าฉันสามารถพล็อตค่าเมทริกซ์ (-1 ถึง 1 ได้อย่างไรเนื่องจากฉันต้องการใช้สหสัมพันธ์ของเพียร์สัน) กับ matplolib


คำตอบ:


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)

ป้อนคำอธิบายรูปภาพที่นี่

หวังว่านี่จะช่วยได้!


ส่วนที่สองมีประโยชน์มากจริง ๆ แต่ฉันยังคงมีปัญหาแรกและฉันต้องแก้ไขก่อนที่จะไปส่วนที่สอง
gdlm

มันยากที่จะเข้าใจสิ่งที่คุณต้องการในส่วนแรกโดยไม่มีข้อมูล คุณสามารถเพิ่มข้อมูลเพื่อแสดงชิ้นส่วนอื่นที่คุณมีคำถามได้หรือไม่ ฉันเชื่อว่านี่จะแก้ไขได้เล็กน้อยตามสิ่งที่คุณพูดถึง เพียงเขียนชื่อไฟล์ 10 แถวและก่อนและหลังสิ่งที่คุณมีและต้องการ
AN6U5

1
สายimport numpy as npไม่จำเป็นหรือไม่
Martin Thoma

1
คุณไม่ได้ใช้งานcbarทำไมคุณกำหนดมัน
Martin Thoma

1
@Martin Thoma - คุณถูกต้องที่ไม่ได้ใช้จำนวนมาก ฉันคิดว่า. cor () เป็นฟังก์ชัน numpy แต่เป็นนุ่น ฉันใช้ colorbar แต่คุณถูกต้องว่าฉันไม่จำเป็นต้องกำหนดให้กับ cbar ฉันแก้ไขข้อความตอบกลับตามความคิดเห็นของคุณ ขอบคุณ!
AN6U5

29

อีกทางเลือกหนึ่งคือการใช้ฟังก์ชัน heatmap ในท้องทะเลเพื่อวางแผนความแปรปรวนร่วม ตัวอย่างนี้ใช้ชุดข้อมูลอัตโนมัติจากแพ็คเกจ 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 package ในหลาม สามารถใช้ฟังก์ชั่น 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')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.