Pandas & NumPy Academy · Oppitunti

Kaksiulotteinen ja korrelaatioanalyysi

Tutkikaa sarakeparien välisiä suhteita piste- ja laatikkokaavioilla sekä korrelaatiolämpökartalla.

Oppitunti 3/413 vaihetta

Kaksiulotteinen ja korrelaatioanalyysi on ilmainen Pandas & NumPy Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Pandas & NumPy Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.

Yhdestä muuttujasta kahteen

Bivariaattisessa analyysissä tarkastellaan täsmälleen kahden sarakkeen välistä suhdetta kerrallaan. Kun olette profiloinut kunkin sarakkeen erikseen (univariaattinen analyysi), kysytte: miten nämä kaksi muuttujaa liittyvät toisiinsa? Analyysimenetelmä riippuu muuttujatyyppien yhdistelmästä: numeerinen vs. numeerinen (sirontakaavio + korrelaatio), kategorinen vs. numeerinen (laatikko- tai viulukaavio) tai kategorinen vs. kategorinen (ristiintaulukointi + khiin neliö -testi). Kukin yhdistelmä vaatii oman tekniikkansa.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

# Relationship types present in the dataset
print('Numeric columns:', df.select_dtypes('number').columns.tolist())
print('Categorical columns:', df.select_dtypes('object').columns.tolist())
print('Boolean columns:', df.select_dtypes('bool').columns.tolist())

Numeerinen vs. numeerinen: sirontakaavio

Kahden numeerisen muuttujan tapauksessa sirontakaavio on keskeinen bivariaattinen työkalu. Se esittää jokaisen havainnon pisteenä (x, y) -koordinaateissa ja paljastaa suhteen suunnan, voimakkuuden ja muodon. Tarkastelkaa kaaviota aina ennen korrelaatiokertoimen laskemista: korrelaatio 0 voi silti kuvata voimakasta epälineaarista (kaarevaa) suhdetta, jota kerroin ei havaitse.

import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')

sns.scatterplot(data=df, x='age', y='fare', alpha=0.4)
plt.title('Age vs. Fare — Is There a Linear Relationship?')
plt.xlabel('Age')
plt.ylabel('Fare ($)')
plt.show()

Pearsonin korrelaatiokerroin

Pearsonin r mittaa kahden numeerisen muuttujan välisen lineaarisen suhteen voimakkuutta ja suuntaa. Laskekaa se komennolla df[['col1', 'col2']].corr() tai scipy.stats.pearsonr(x, y), joka palauttaa myös merkitsevyystestauksen p-arvon. Yhdistäkää r aina sirontakaavioon: muutama poikkeama voi aiheuttaa suuren r-arvon, ja sama r-arvo voi kuvata hyvin erilaisia sirontakuvioita (Anscomben kvartetti havainnollistaa tätä tunnetusti).

import pandas as pd
import seaborn as sns
from scipy import stats

df = sns.load_dataset('titanic').dropna(subset=['age', 'fare'])

# Pearson correlation
r, p = stats.pearsonr(df['age'], df['fare'])
print(f'Pearson r = {r:.3f}, p-value = {p:.4f}')

# Spearman for robustness check
rho, p_sp = stats.spearmanr(df['age'], df['fare'])
print(f'Spearman rho = {rho:.3f}, p-value = {p_sp:.4f}')

Kategorinen vs. numeerinen: laatikko- ja viulukaaviot

Kun toinen muuttuja on kategorinen ja toinen numeerinen, kysymys kuuluu: eroaako numeerinen jakauma kategorioiden välillä? Käyttäkää vertailuun laatikko- tai viulukaaviota. Vaikuttaako esimerkiksi selviytymisstatus maksettuun hintaan? Vaikuttaako matkustajaluokka ikään? Näistä kaavioista näkee heti, liittyykö kategorian jäsenyyteen numeerisen muuttujan suurempia tai pienempiä arvoja.

import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')

fig, axes = plt.subplots(1, 2, figsize=(12, 5))

sns.boxplot(data=df, x='class', y='fare',
            order=['First', 'Second', 'Third'], ax=axes[0])
axes[0].set_title('Fare by Passenger Class')

sns.violinplot(data=df, x='survived', y='age',
               inner='quartile', ax=axes[1])
axes[1].set_title('Age Distribution by Survival')

plt.tight_layout()
plt.show()

GroupBy-tilastot kategorisille ja numeerisille muuttujille

Täydentäkää visuaalista vertailua numeerisilla ryhmätilastoilla käyttämällä groupby-toimintoa. Laskekaa kullekin kategorialle keskiarvo, mediaani ja lukumäärä, jotta kaavioissa näkyvät erot voidaan määrittää numeerisesti. Tarkastelkaa kategorioita, joissa keskiarvo ja mediaani poikkeavat toisistaan (mikä viittaa ryhmän sisäisiin poikkeamiin), ja tarkistakaa, ovatko ryhmäkoot tasapainossa. Hyvin pienet ryhmät (<5 havaintoa) tekevät vertailuista epäluotettavia.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

stats = df.groupby('class')['fare'].agg(['mean', 'median', 'std', 'count'])
stats.columns = ['Mean Fare', 'Median Fare', 'Std Fare', 'Count']
print(stats.round(2))

print('\nSurvival rate by class:')
print(df.groupby('class')['survived'].mean().round(3))

Kategorinen vs. kategorinen: ristiintaulukointi

Käyttäkää kahdelle kategoriselle muuttujalle pd.crosstab(df['var1'], df['var2'])-komentoa luodaksenne frekvenssitaulukon, joka näyttää, kuinka monta havaintoa kuhunkin kategoriayhdistelmään kuuluu. Normalisoikaa rivin tai sarakkeen mukaan komennolla normalize='index' tai normalize='columns', jos haluatte lukumäärien sijaan osuudet. Tämä muodostaa perustan sen tutkimiselle, ovatko kaksi kategorista muuttujaa riippumattomia vai yhteydessä toisiinsa.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

# Frequency table
counts = pd.crosstab(df['class'], df['survived'])
counts.columns = ['Died', 'Survived']
print('Counts:')
print(counts)

# Row-normalised proportions (survival rate per class)
props = pd.crosstab(df['class'], df['survived'], normalize='index')
props.columns = ['Died', 'Survived']
print('\nSurvival Rate per Class:')
print(props.round(3))

Ristiintaulukointien esittäminen lämpökarttoina

Muuntaa ristiintaulukointi lämpökartaksi, jotta solujen frekvenssejä voi verrata nopeasti visuaalisesti. Tämä on helpommin silmäiltävissä kuin tulostettu taulukko, kun kategoriayhdistelmiä on paljon. Merkitkää kunkin solun arvo näkyviin komennolla annot=True ja valitkaa peräkkäinen värikartta, kuten 'YlOrRd', koska kaikki arvot ovat epänegatiivisia. Riveittäin normalisoitujen osuuksien lämpökartat näyttävät tehokkaasti yhden kategorian ehdollisen jakauman toisen kategorian perusteella.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')
props = pd.crosstab(df['class'], df['sex'], normalize='index')

sns.heatmap(props, annot=True, fmt='.2f', cmap='YlOrRd')
plt.title('Gender Mix by Passenger Class (Row %)')
plt.xlabel('Sex')
plt.ylabel('Class')
plt.show()

Riippumattomuuden khiin neliö -testi

Riippumattomuuden khiin neliö -testi tarkistaa, ovatko kaksi kategorista muuttujaa tilastollisesti riippumattomia. scipy.stats.chi2_contingency(crosstab) palauttaa khiin neliö -testisuureen, p-arvon, vapausasteet ja odotetut frekvenssit. Pieni p-arvo (yleensä < 0,05) tarkoittaa, että muuttujien välillä on tilastollisesti merkitsevä yhteys: toisen jakauma vaihtelee systemaattisesti toisen mukaan.

import pandas as pd
import seaborn as sns
from scipy.stats import chi2_contingency

df = sns.load_dataset('titanic')

# Test if passenger class and survival are independent
crosstab = pd.crosstab(df['class'], df['survived'])
chi2, p, dof, expected = chi2_contingency(crosstab)

print(f'Chi-squared: {chi2:.2f}')
print(f'P-value: {p:.6f}')
print(f'Degrees of freedom: {dof}')
print(f'\nConclusion: {"Significant association" if p < 0.05 else "No significant association"}')

Numeeristen sarakkeiden täydellinen korrelaatiomatriisi

Sen sijaan että tarkastelisitte pareja yksi kerrallaan, laskekaa kaikkien numeeristen sarakkeiden korrelaatiomatriisi ja esittäkää se lämpökarttana. Näin näette yhdellä silmäyksellä, mitkä muuttujaparit korreloivat voimakkaasti. Riippumattomien piirteiden suuret korrelaatiot (multikollineaarisuus) voivat aiheuttaa ongelmia regressiomalleissa. Kun tunnistatte ne ajoissa, voitte poistaa tai yhdistää tarpeettomat piirteet ennen mallintamista.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

df = sns.load_dataset('titanic')
corr = df.select_dtypes('number').corr()
mask = np.triu(np.ones_like(corr, dtype=bool))

sns.heatmap(corr, mask=mask, annot=True, fmt='.2f',
            cmap='coolwarm', vmin=-1, vmax=1,
            linewidths=0.5, square=True)
plt.title('Correlation Matrix — Titanic Numeric Columns')
plt.tight_layout()
plt.show()

Vuorovaikutukset alaryhmien välillä

Kahden muuttujan välinen yhteys voi joskus vaihdella huomattavasti alaryhmittäin — tätä ilmiötä kutsutaan Simpsonin paradoksiksi. Esimerkiksi iän ja hinnan välinen korrelaatio voi olla positiivinen ensimmäisen luokan matkustajilla mutta negatiivinen kolmannen luokan matkustajilla. Jaottele kaksiulotteinen analyysi aina keskeisten kategoristen muuttujien mukaan (käyttämällä Seabornin hue-parametria tai erillisiä groupby-aggregointeja) ja tarkista, pysyykö yhteys samana vai kääntyykö se päinvastaiseksi alaryhmissä.

import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')

# Scatter coloured by passenger class
sns.scatterplot(
    data=df.dropna(subset=['age', 'fare']),
    x='age',
    y='fare',
    hue='class',
    alpha=0.5,
    palette='deep'
)
plt.title('Age vs Fare — Does Class Change the Relationship?')
plt.legend(title='Class')
plt.yscale('log')  # log scale due to fare skewness
plt.show()

Kaksiulotteisten havaintojen dokumentointi

Kun kaksiulotteinen analyysi on valmis, dokumentoi keskeiset havainnot: mitkä muuttujaparit korreloivat (ja kuinka voimakkaasti), osoittavatko kategoriset muuttujat merkityksellisiä ryhmäeroja numeerisissa tuloksissa sekä löytyikö alaryhmien välisiä vuorovaikutuksia tai paradokseja. Näiden havaintojen tulisi ohjata piirteiden valintaa — voimakkaasti korreloivista piirrep pareista toinen voidaan joutua poistamaan, ja kohdemuuttujan vahvat kategoriset ennustajat tulisi merkitä ensisijaisiksi mallinnuksen syötteiksi.

Pikatarkistus

Testaa, miten hyvin ymmärrät tämän oppitunnin kaksiulotteisen ja korrelaatioanalyysin.

Oppitunnin yhteenveto

Tässä oppitunnissa opit, että hajontakuviot ja Pearsonin r analysoivat numeeristen muuttujien välisiä suhteita, laatikko- ja viulukuviot sekä groupby vertailevat numeerisia muuttujia kategorioiden välillä ja ristiintaulukot sekä khiin neliö -testit mittaavat kategoristen muuttujien välistä yhteyttä. Seuraavaksi käsittelemme, miten EDA-havainnot kootaan jäsennellyksi yhteenvetoraportiksi.

Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”Kaksiulotteinen ja korrelaatioanalyysi” ilmainen?

Kyllä – oppitunnin ”Kaksiulotteinen ja korrelaatioanalyysi” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Pandas & NumPy Academy-kurssin, päivitä CoddyKit PROhon. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Kaksiulotteinen ja korrelaatioanalyysi”?

Tutkikaa sarakeparien välisiä suhteita piste- ja laatikkokaavioilla sekä korrelaatiolämpökartalla. Harjoittelet Pandas & NumPy Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Pandas & NumPy Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Pandas & NumPy Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Kaksiulotteinen ja korrelaatioanalyysi”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Pandas & NumPy Academy-oppitunnilla?

Kyllä. Jokainen Pandas & NumPy Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Tietoaineiston profiloinnin tarkistuslista
  2. Yksiulotteinen analyysi
  3. Kaksiulotteinen ja korrelaatioanalyysi
  4. Tulosten kokoaminen raportiksi
← Takaisin: Pandas & NumPy Academy