Kaksiulotteinen ja korrelaatioanalyysi
Tutkikaa sarakeparien välisiä suhteita piste- ja laatikkokaavioilla sekä korrelaatiolämpökartalla.
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.
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
- Tietoaineiston profiloinnin tarkistuslista
- Yksiulotteinen analyysi
- Kaksiulotteinen ja korrelaatioanalyysi
- Tulosten kokoaminen raportiksi