Bei der Analyse von Daten betrachten Sie die Korrelation zwischen Variablen in den angegebenen Daten. Sie können den Korrelationskoeffizienten für die Korrelation zwischen numerischen Werten überprüfen. Was ist jedoch, wenn eine oder beide Kategorien sind? Ich habe es nachgeschlagen, also werde ich es zusammenfassen.
In diesem Fall ist es berühmt und Sie können den Korrelationskoeffizienten überprüfen. Die Definition des Korrelationskoeffizienten ist wie folgt.
r=\frac{\sum_{i}(x_{i}-\bar{x})(y_{i}-\bar{y})}{\sqrt{\sum_{i}(x_{i}-\bar{x})^2}\sqrt{\sum_{i}(y_{i}-\bar{y})^2}}
Verwenden Sie die corr () -Methode von pandas.DataFrame, um den Korrelationskoeffizienten in Python zu ermitteln.
import numpy as np
import pandas as pd
x=np.random.randint(1, 10, 100)
y=np.random.randint(1, 10, 100)
data=pd.DataFrame({'x':x, 'y': y})
data.corr()
Wenn der Wert 0 ist, gibt es keine Korrelation, wenn er nahe bei 1 liegt, gibt es eine positive Korrelation, und wenn er nahe bei -1 liegt, gibt es eine negative Korrelation.
Es wird als Statistik ausgedrückt, die als Korrelationsverhältnis bezeichnet wird. Die Definition ist wie folgt.
r=\frac{\sum_{Kategorie}Kategorie件数\times(Kategorieの平均-Gesamtdurchschnitt)^2}{Summe der Quadrate der Gesamtabweichung}
Ein konkretes Beispiel finden Sie unter hier. Das Molekül repräsentiert "wie weit jede Kategorie voneinander entfernt ist". Je weiter die Kategorien entfernt sind, desto größer ist das Molekül und desto stärker ist die Korrelation.
Dieses Korrelationsverhältnis bedeutet auch keine Korrelation, wenn es 0 ist, und eine starke positive Korrelation, wenn es sich 1 nähert.
In Python wird es wie folgt berechnet (siehe hier).
def correlation_ratio(cat_key, num_key, data):
categorical=data[cat_key]
numerical=data[num_key]
mean=numerical.dropna().mean()
all_var=((numerical-mean)**2).sum() #Summe der Quadrate der Gesamtabweichung
unique_cat=pd.Series(categorical.unique())
unique_cat=list(unique_cat.dropna())
categorical_num=[numerical[categorical==cat] for cat in unique_cat]
categorical_var=[len(x.dropna())*(x.dropna().mean()-mean)**2 for x in categorical_num]
#Anzahl der Kategorien × (Durchschnitt der Kategorien-Gesamtdurchschnitt)^2
r=sum(categorical_var)/all_var
return r
Wir werden eine Statistik verwenden, die als Anzahl der Assoziationen in Klamer bezeichnet wird. Die Definition ist
r=\sqrt{\frac{\chi^2}{n(k-1)}}
$ \ Chi ^ {2} $ ist jedoch die χ-Quadrat-Verteilung, n ist die Anzahl der Datenelemente und k ist die mit der geringeren Anzahl von Kategorien. Die χ-Quadrat-Verteilung finden Sie unter hier. Grob gesagt ist es eine Größe, die ausdrückt, wie unterschiedlich die Verteilung jeder Kategorie von der Gesamtverteilung ist. Wenn es nahe bei 0 liegt, gibt es keine Korrelation, und wenn es nahe bei 1 liegt, gibt es eine positive Korrelation.
Gehen Sie wie folgt vor, um mit Python zu rechnen (hier % 83% BC% E3% 83% AB% E3% 81% AE% E9% 80% A3% E9% 96% A2% E4% BF% 82% E6% 95% B0).
import scipy.stats as st
def cramerV(x, y, data):
table=pd.crosstab(data[x], data[y])
x2, p, dof, e=st.chi2_contingency(table, False)
n=table.sum().sum()
r=np.sqrt(x2/(n*(np.min(table.shape)-1)))
return r
Und dies allein wäre das zweite Gebräu des vorherigen Artikels, daher habe ich eine Methode entwickelt, um jeden Index gemeinsam für DataFrame zu berechnen. Sie müssen es nicht einzeln nachschlagen!
def is_categorical(data, key):
col_type=data[key].dtype
if col_type=='int':
nunique=data[key].nunique()
return nunique<6
elif col_type=="float":
return False
else:
return True
def get_corr(data, categorical_keys=None):
keys=data.keys()
if categorical_keys is None:
categorical_keys=keys[[is_categorycal(data, key) for ke in keys]]
corr=pd.DataFrame({})
corr_ratio=pd.DataFrame({})
corr_cramer=pd.DataFrame({})
for key1 in keys:
for key2 in keys:
if (key1 in categorical_keys) and (key2 in categorical_keys):
r=cramerV(key1, key2, data)
corr_cramer.loc[key1, key2]=r
elif (key1 in categorical_keys) and (key2 not in categorical_keys):
r=correlation_ratio(cat_key=key1, num_key=key2, data=data)
corr_ratio.loc[key1, key2]=r
elif (key1 not in categorical_keys) and (key2 in categorical_keys):
r=correlation_ratio(cat_key=key2, num_key=key1, data=data)
corr_ratio.loc[key1, key2]=r
else:
r=data.corr().loc[key1, key2]
corr.loc[key1, key2]=r
return corr, corr_ratio, corr_cramer
Welcher Schlüssel eine kategoriale Variable ist, wird automatisch aus dem Variablentyp bestimmt, sofern nicht anders angegeben.
Wenden wir es auf Titandaten an.
data=pd.read_csv(r"train.csv")
data=data.drop(["PassengerId", "Name", "Ticket", "Cabin"], axis=1)
category=["Survived", "Pclass", "Sex", "Embarked"]
corr, corr_ratio, corr_cramer=get_corr(data, category)
corr
corr_ratio
corr_cramer
Darüber hinaus kann es mit der Seaborn Heatmap visualisiert werden.
import seaborn as sns
sns.heatmap(corr_cramer, vmin=-1, vmax=1)
Die Erklärung der einzelnen Statistiken ist unübersichtlich geworden. Weitere Informationen finden Sie auf der in der Referenz genannten Seite. Selbst wenn ich es zusammenstelle, vergesse ich es am Ende und schaue nach, also versuche ich, eine Methode zu erstellen, die so viel wie möglich automatisiert. Die Quelle dieser Methode ist auch github. Sie können sie also gerne verwenden.
[Berechnen Sie die Beziehung zwischen Variablen verschiedener Skalen (Python)](https://qiita.com/shngt/items/45da2d30acf9e84924b7#%E3%82%AF%E3%83%A9%E3%83%A1% E3% 83% BC% E3% 83% AB% E3% 81% AE% E9% 80% A3% E9% 96% A2% E4% BF% 82% E6% 95% B0) Korrelationsanalyse Korrelationsverhältnis Kai-Quadrat-Test / Cramer-Anzahl von Beziehungen
Recommended Posts