Έχω το ακόλουθο πλαίσιο δεδομένων pandas Top15
:
Δημιουργώ μια στήλη που εκτιμά τον αριθμό των παραπομπών ανά άτομο:
Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']
Θέλω να μάθω τη συσχέτιση μεταξύ του αριθμού των αναφερόμενων εγγράφων ανά άτομο και της παροχής ενέργειας ανά άτομο. Έτσι χρησιμοποιώ τη μέθοδο .corr()
(συσχέτιση Pearson's):
data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')
Θέλω να επιστρέψω έναν απλό αριθμό, αλλά το αποτέλεσμα είναι:
Χωρίς πραγματικά δεδομένα είναι δύσκολο να απαντήσω στο ερώτημα, αλλά υποθέτω ότι ψάχνετε για κάτι τέτοιο:
Top15['Citable docs per Capita'].corr(Top15['Energy Supply per Capita'])
Αυτό υπολογίζει τη συσχέτιση μεταξύ των δύο στηλών σας 'Citable docs per Capita'
και 'Energy Supply per Capita'
.
Για να δώσω ένα παράδειγμα:
import pandas as pd
df = pd.DataFrame({'A': range(4), 'B': [2*i for i in range(4)]})
A B
0 0 0
1 1 2
2 2 4
3 3 6
Τότε
df['A'].corr(df['B'])
δίνει 1
όπως αναμενόταν.
Τώρα, αν αλλάξετε μια τιμή, π.χ.
df.loc[2, 'B'] = 4.5
A B
0 0 0.0
1 1 2.0
2 2 4.5
3 3 6.0
η εντολή
df['A'].corr(df['B'])
επιστρέφει
0.99586
το οποίο εξακολουθεί να είναι κοντά στο 1, όπως αναμενόταν.
Αν εφαρμόσετε το .corr
απευθείας στο πλαίσιο δεδομένων σας, θα επιστρέψει όλες τις κατά ζεύγη συσχετίσεις μεταξύ των στηλών σας- γι' αυτό παρατηρείτε στη συνέχεια 1
στη διαγώνιο του πίνακα σας (κάθε στήλη συσχετίζεται τέλεια με τον εαυτό της).
df.corr()
θα επιστρέψει επομένως
A B
A 1.000000 0.995862
B 0.995862 1.000000
Στο γράφημα που παρουσιάζετε, αναπαρίσταται μόνο η πάνω αριστερή γωνία του πίνακα συσχέτισης (υποθέτω).
Μπορεί να υπάρχουν περιπτώσεις, όπου έχετε NaN
στη λύση σας - δείτε αυτό το post για ένα παράδειγμα.
Αν θέλετε να φιλτράρετε τις καταχωρήσεις πάνω/κάτω από ένα συγκεκριμένο όριο, μπορείτε να ελέγξετε αυτή την ερώτηση. Αν θέλετε να σχεδιάσετε έναν χάρτη θερμότητας των συντελεστών συσχέτισης, μπορείτε να ελέγξετε αυτή την απάντηση και αν στη συνέχεια αντιμετωπίσετε το πρόβλημα με τις επικαλυπτόμενες ετικέτες των αξόνων, ελέγξτε την επόμενη δημοσίευση.
Αντιμετώπισα το ίδιο πρόβλημα.
Φάνηκε ότι το Citable Documents per Person
ήταν ένα float, και η python το προσπερνάει με κάποιο τρόπο από προεπιλογή. Όλες οι άλλες στήλες του πλαισίου δεδομένων μου ήταν σε numpy-formats, οπότε το έλυσα μετατρέποντας τη στήλη σε np.float64
.
Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])
Θυμηθείτε ότι είναι ακριβώς η στήλη που υπολογίσατε μόνοι σας
Αν θέλετε τις συσχετίσεις μεταξύ όλων των ζευγών στηλών, θα μπορούσατε να κάνετε κάτι τέτοιο:
import pandas as pd
import numpy as np
def get_corrs(df):
col_correlations = df.corr()
col_correlations.loc[:, :] = np.tril(col_correlations, k=-1)
cor_pairs = col_correlations.stack()
return cor_pairs.to_dict()
my_corrs = get_corrs(df)
# and the following line to retrieve the single correlation
print(my_corrs[('Citable docs per Capita','Energy Supply per Capita')])