πŸ“ˆ Data Engineering/πŸ“Š Data Analysis

[Data Analysis] λ°μ΄ν„°μ˜ μ’…λ₯˜μ™€ 속성 & 데이터 탐색 (EDA)

Bigbread1129 2024. 7. 18. 00:03

λ°μ΄ν„°μ˜ μ’…λ₯˜μ™€ 속성

λ°μ΄ν„°μ˜ μ’…λ₯˜μ™€ 속성에 λ°ν•˜μ—¬ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ •λŸ‰μ  데이터 (Quantitative Data)

  • μ •λŸ‰μ  λ°μ΄ν„°λŠ” 수치둜 ν‘œν˜„λ˜λŠ” λ°μ΄ν„°λ‘œ, 양적 츑정이 κ°€λŠ₯ν•œ λ°μ΄ν„°μž…λ‹ˆλ‹€.
  • μ˜ˆμ‹œ: λ‚˜μ΄, μ†Œλ“, νŒλ§€λŸ‰ λ“±μ˜ λ°μ΄ν„°μž…λ‹ˆλ‹€.
  • νŠΉμ§•:
    • 수치 데이터λ₯Ό 톡해 톡계 뢄석과 예츑 λͺ¨λΈλ§μ΄ κ°€λŠ₯νž™λ‹ˆλ‹€.
    • μˆ˜μΉ˜ν˜• 데이터와 λ²”μ£Όν˜• 데이터, 두 κ°€μ§€ μ£Όμš” ν˜•νƒœλ‘œ λ‚˜λ‰©λ‹ˆλ‹€.

 

정성적 데이터 (Qualitative Data)

  • μˆ˜μΉ˜κ°€ μ•„λ‹Œ μ˜λ―Έμ™€ νŠΉμ„±μœΌλ‘œ λΆ„λ₯˜λ˜λŠ” λ°μ΄ν„°μž…λ‹ˆλ‹€.
  • μ˜ˆμ‹œ: λŒ“κΈ€, λ™μ˜μƒ, μŒμ„± λ“±.
  • νŠΉμ§•:
    • ν…μŠ€νŠΈ, 이미지, λ™μ˜μƒ λ“± λ‹€μ–‘ν•œ ν˜•μ‹μ„ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ •λŸ‰μ  데이터와 달리 톡계 뢄석이 μ–΄λ ΅μŠ΅λ‹ˆλ‹€.
  • μš©λ„: ν…μŠ€νŠΈ 뢄석, 감정 뢄석, μ½˜ν…μΈ  뢄석 등에 μ‚¬μš©λ©λ‹ˆλ‹€.

 

μˆ˜μΉ˜ν˜• 데이터 (Numerical Data)

  • μˆ˜μΉ˜ν˜• λ°μ΄ν„°λŠ” κ°’μ˜ λ²”μœ„κ°€ λ¬΄ν•œν•˜κ³ , μΈ‘μ • κ°€λŠ₯ν•œ λ°μ΄ν„°μž…λ‹ˆλ‹€.
  • μ˜ˆμ‹œ: μ˜¨λ„, 무게, 거리 λ“±μ˜ λ°μ΄ν„°μž…λ‹ˆλ‹€.
  • νŠΉμ§•:
    • μ—°μ†ν˜• 데이터 (Continuous Data): 값이 νŠΉμ • λ²”μœ„ λ‚΄μ—μ„œ λ¬΄ν•œν•œ 값을 κ°€μ§ˆ 수 μžˆλŠ” λ°μ΄ν„°μž…λ‹ˆλ‹€. 예: μ˜¨λ„, 무게.
    • μ΄μ‚°ν˜• 데이터 (Discrete Data): 값이 νŠΉμ • λ²”μœ„ λ‚΄μ—μ„œ μœ ν•œν•œ 값을 κ°€μ§€λŠ” λ°μ΄ν„°μž…λ‹ˆλ‹€. 예: 학생 수, 판맀된 μ œν’ˆ 개수.
  • μš©λ„: 연속 λ³€μˆ˜μ—μ„œμ˜ κ²½ν–₯μ„± 뢄석, λ³€μˆ˜λ“€ κ°„μ˜ 상관관계λ₯Ό νŒŒμ•…ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€.

 

λ²”μ£Όν˜• 데이터 (Categorical Data)

  • μ œν•œλœ λ²”μœ„μ˜ 값을 κ°€μ§€λ©°, 일반적으둜 λ ˆμ΄λΈ” ν˜•νƒœλ‘œ μ œκ³΅λ˜λŠ” λ°μ΄ν„°μž…λ‹ˆλ‹€.
  • μ˜ˆμ‹œ: 결혼 μƒνƒœ, ν•™λ ₯, 직업 μœ ν˜• λ“±μ˜ λ°μ΄ν„°μž…λ‹ˆλ‹€.
  • νŠΉμ§•:
    • λͺ…λͺ©ν˜• 데이터 (Nominal Data): μˆœμ„œκ°€ μ—†λŠ” λ²”μ£Όν˜• 데이터. 예: 성별, κ΅­κ°€.
    • μˆœμœ„ν˜• 데이터 (Ordinal Data): μˆœμ„œκ°€ μžˆλŠ” λ²”μ£Όν˜• 데이터. 예: ꡐ윑 μˆ˜μ€€, 고객 λ§Œμ‘±λ„ 평가.
  • μš©λ„: 인ꡬ 톡계학적 뢄석, 고객 μ„ΈλΆ„ν™”, μΉ΄ν…Œκ³ λ¦¬ κ°„μ˜ 비ꡐ와 뢄석을 ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

데이터 ν’ˆμ§ˆμ˜ μš”μ†Œ

데이터 ν’ˆμ§ˆμ˜ μš”μ†ŒλŠ” μ •ν™•μ„±, μ™„μ „μ„±, 일관성, 타당성, μ΄λ ‡κ²Œ 4κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€. ν•˜λ‚˜ν•˜λ‚˜ μ„€λͺ…ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

  • μ •ν™•μ„± (Accuracy)
    • 데이터가 μ‹€μ œ κ°’κ³Ό μ–Όλ§ˆλ‚˜ μΌμΉ˜ν•˜λŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ§€ν‘œμž…λ‹ˆλ‹€. μ •ν™•ν•œ λ°μ΄ν„°λŠ” μ˜¬λ°”λ₯Έ 결정을 λ‚΄λ¦¬λŠ” 데 ν•„μˆ˜μ μž…λ‹ˆλ‹€.
    • μ˜ˆμ‹œ: 고객의 λ‚˜μ΄λ₯Ό κΈ°λ‘ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ λ‚˜μ΄κ°€ 30세인 고객을 40μ„Έλ‘œ κΈ°λ‘ν•˜λ©΄ λ°μ΄ν„°μ˜ 정확성이 λ–¨μ–΄μ§‘λ‹ˆλ‹€.
  • μ™„μ „μ„± (Completeness)
    • ν•„μš”ν•œ λͺ¨λ“  데이터가 빠짐없이 μ‘΄μž¬ν•˜λŠ”μ§€λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 데이터가 λΆˆμ™„μ „ν•˜λ©΄ 뢄석 결과에 μ™œκ³‘μ΄ 생길 수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ˜ˆμ‹œ: 고객 μ—°λ½μ²˜ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 일뢀 고객의 이메일 μ£Όμ†Œκ°€ λˆ„λ½λœ 경우, λ°μ΄ν„°μ˜ 완전성이 λ–¨μ–΄μ§‘λ‹ˆλ‹€.
  • 일관성 (Consistency)
    • 데이터가 μ—¬λŸ¬ λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ λ°μ΄ν„°μ…‹μ—μ„œ λ™μΌν•˜κ²Œ μœ μ§€λ˜λŠ”μ§€λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μΌκ΄€λ˜μ§€ μ•Šμ€ λ°μ΄ν„°λŠ” μ‹ λ’°ν•  수 μ—†λŠ” κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ˜ˆμ‹œ: μ œν’ˆμ˜ 가격이 μ—¬λŸ¬ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ λ‹€λ₯΄κ²Œ κΈ°λ‘λ˜μ–΄ μžˆλ‹€λ©΄ λ°μ΄ν„°μ˜ 일관성이 λ–¨μ–΄μ§‘λ‹ˆλ‹€.
  • 타당성 (Validity)
    • 데이터가 νŠΉμ • κΈ°μ€€μ΄λ‚˜ κ·œμΉ™μ„ μΆ©μ‘±ν•˜λŠ”μ§€λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. νƒ€λ‹Ήν•œ λ°μ΄ν„°λŠ” νŠΉμ • ν˜•μ‹μ΄λ‚˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    • μ˜ˆμ‹œ: 고객의 λ‚˜μ΄λ₯Ό κΈ°λ‘ν•˜λŠ” ν•„λ“œμ— μŒμˆ˜κ°€ μž…λ ₯된 경우, λ°μ΄ν„°μ˜ 타당성이 λ–¨μ–΄μ§‘λ‹ˆλ‹€.

데이터 μ „μ²˜λ¦¬μ˜ μ€‘μš”μ„±

높은 ν’ˆμ§ˆμ˜ λ°μ΄ν„°λŠ” 뢄석 결과의 신뒰성을 보μž₯ν•©λ‹ˆλ‹€.
  • 데이터 μ „μ²˜λ¦¬λŠ” 데이터λ₯Ό λΆ„μ„ν•˜κΈ° 전에 데이터λ₯Ό μ •μ œν•˜κ³  μ€€λΉ„ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€.
  • λ°μ΄ν„°μ˜ ν’ˆμ§ˆμ΄ λ†’μ„μˆ˜λ‘ 뢄석 결과의 신뒰성이 λ†’μ•„μ§‘λ‹ˆλ‹€.
  • μ˜ˆμ‹œ: κ²°μΈ‘μΉ˜μ™€ μ΄μƒμΉ˜κ°€ ν¬ν•¨λœ 데이터λ₯Ό λΆ„μ„ν•˜λ©΄, κ²°κ³Όκ°€ μ™œκ³‘λ  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ „μ²˜λ¦¬ κ³Όμ •

  • κ²°μΈ‘μΉ˜κ°€ μžˆλŠ” 데이터λ₯Ό κ·ΈλŒ€λ‘œ λΆ„μ„ν•˜λ©΄ κ²°κ³Όκ°€ μ™œκ³‘λ  수 μžˆμŠ΅λ‹ˆλ‹€.
  • κ²°μΈ‘μΉ˜λŠ” μ œκ±°ν•˜κ±°λ‚˜ μ μ ˆν•œ κ°’μœΌλ‘œ λŒ€μ²΄ν•΄μ•Ό ν•©λ‹ˆλ‹€.
# 결츑치 제거
df.dropna(inplace=True)

# 결츑치 λŒ€μ²΄
df.fillna(df.mean(), inplace=True)

 

 

μ΄μƒμΉ˜ 탐지 및 제거

  • μ΄μƒμΉ˜λŠ” λ°μ΄ν„°μ˜ 일반적인 νŒ¨ν„΄μ—μ„œ λ²—μ–΄λ‚œ κ°’μœΌλ‘œ, 이λ₯Ό μ œκ±°ν•˜μ§€ μ•ŠμœΌλ©΄ 뢄석 결과에 큰 영ν–₯을 λ―ΈμΉ  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Example: IQR 방법을 μ‚¬μš©ν•œ μ΄μƒμΉ˜ 제거
# IQR 방법을 μ‚¬μš©ν•œ μ΄μƒμΉ˜ 제거
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
df = df[~((df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))).any(axis=1)]

 

데이터 μ •κ·œν™”

  • λ°μ΄ν„°μ˜ λ²”μœ„λ₯Ό μΌμ •ν•˜κ²Œ μ‘°μ •ν•˜μ—¬ λͺ¨λΈ ν•™μŠ΅μ„ μš©μ΄ν•˜κ²Œ ν•©λ‹ˆλ‹€.
  • 데이터 μ •κ·œν™”λŠ” λ°μ΄ν„°μ˜ μŠ€μΌ€μΌμ„ ν†΅μΌμ‹œμΌœ 뢄석 결과의 신뒰성을 λ†’μž…λ‹ˆλ‹€.
# μ˜ˆμ‹œ μ½”λ“œ

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)

 

λΉ„μ¦ˆλ‹ˆμŠ€ μΈμ‚¬μ΄νŠΈμ˜ μ •ν™•μ„±κ³Ό 직결

  • μ •ν™•ν•œ 데이터 μ „μ²˜λ¦¬λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ μΈμ‚¬μ΄νŠΈμ˜ μ •ν™•μ„±κ³Ό μ§κ²°λ©λ‹ˆλ‹€.
  • 잘λͺ»λœ λ°μ΄ν„°λ‘œ μΈν•œ 뢄석 κ²°κ³ΌλŠ” 잘λͺ»λœ μ˜μ‚¬κ²°μ •μ„ μ΄ˆλž˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ˜ˆμ‹œ: 고객 μ„ΈλΆ„ν™” 뢄석을 μœ„ν•΄ 데이터λ₯Ό μ •μ œν•˜κ³  μ „μ²˜λ¦¬ν•˜μ§€ μ•ŠμœΌλ©΄, 잘λͺ»λœ 고객 그룹이 λ„μΆœλ  수 있으며, μ΄λŠ” λ§ˆμΌ€νŒ… μ „λž΅μ˜ μ‹€νŒ¨λ‘œ μ΄μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

데이터 탐색 (Exploratory Data Analysis, EDA)

데이터 탐색? 즉, EDAλΌλŠ” 말은 λ¬΄μ—‡μΌκΉŒμš”? ν•œλ²ˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

  • 탐색적 데이터 뢄석(Exploratory Data Analysis, EDA)은 데이터 뢄석 초기 λ‹¨κ³„μ—μ„œ μˆ˜ν–‰λ˜λŠ” μ€‘μš”ν•œ κ³Όμ •μœΌλ‘œ, 데이터λ₯Ό μ‹œκ°ν™”ν•˜κ³  μš”μ•½ν•˜μ—¬ λ°μ΄ν„°μ˜ μ€‘μš”ν•œ νŠΉμ„±κ³Ό νŒ¨ν„΄μ„ λ°œκ²¬ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€.
  • λ˜ν•œ λ°μ΄ν„°μ˜ ꡬ쑰, μ˜ˆμ™Έ, νŒ¨ν„΄, 및 기초 톡계적 μš”μ•½μ„ μ œκ³΅ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€.
  • 이λ₯Ό 톡해, λͺ¨λΈλ§ λ°©ν–₯을 μ„€μ •ν•˜λŠ” 데 κΈ°μ—¬ν•˜λ©°, 데이터에 λŒ€ν•œ 이해도λ₯Ό ν–₯μƒμ‹œν‚€λŠ” κ³Όμ •μž…λ‹ˆλ‹€.

 

EDA의 μ£Όμš” λͺ©μ 

그러면 μ™œ 탐색적 데이터 뢄석(Exploratory Data Analysis, EDA)λ₯Ό ν•΄μ•Όν•˜λŠλƒ?
탐색적 데이터 뢄석(Exploratory Data Analysis, EDA)λ₯Ό ν•΄μ•Όν•˜λŠ” μ£Όμš” λͺ©μ μ— λ°ν•˜μ—¬ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.
  1. λ°μ΄ν„°μ˜ ꡬ쑰 이해
    • λ°μ΄ν„°μ˜ μ „λ°˜μ μΈ ꡬ쑰λ₯Ό νŒŒμ•…ν•˜κ³ , λ³€μˆ˜ κ°„μ˜ 관계λ₯Ό μ΄ν•΄ν•©λ‹ˆλ‹€.
    • λ°μ΄ν„°μ˜ 뢄포, λ²”μœ„, 쀑앙값, 평균 λ“±μ˜ 기초 ν†΅κ³„μΉ˜λ₯Ό 톡해 데이터λ₯Ό μš”μ•½ν•©λ‹ˆλ‹€.
  2. μ˜ˆμ™Έ 및 μ΄μƒμΉ˜ 탐지
    • 데이터셋 λ‚΄μ˜ μ˜ˆμ™Έκ°’μ΄λ‚˜ μ΄μƒμΉ˜λ₯Ό νƒμ§€ν•˜μ—¬ 뢄석 κ³Όμ •μ—μ„œ λ°œμƒν•  수 μžˆλŠ” 문제λ₯Ό 미리 λ°œκ²¬ν•©λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 μ΄μƒμΉ˜λ₯Ό μ œκ±°ν•˜κ±°λ‚˜ μ²˜λ¦¬ν•˜λŠ” μ „λž΅μ„ μˆ˜λ¦½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  3. νŒ¨ν„΄ 발견
    • 데이터 λ‚΄μ˜ μˆ¨κ²¨μ§„ νŒ¨ν„΄μ΄λ‚˜ νŠΈλ Œλ“œλ₯Ό λ°œκ²¬ν•©λ‹ˆλ‹€.
    • λ³€μˆ˜ κ°„μ˜ 상관관계, μ‹œκ³„μ—΄ λ°μ΄ν„°μ˜ μΆ”μ„Έ 등을 νŒŒμ•…ν•˜μ—¬ λ°μ΄ν„°μ˜ νŠΉμ„±μ„ μ΄ν•΄ν•©λ‹ˆλ‹€.
  4. 기초 톡계적 μš”μ•½ 제곡
    • λ°μ΄ν„°μ˜ 기초 ν†΅κ³„λŸ‰μ„ κ³„μ‚°ν•˜μ—¬ μš”μ•½ν•©λ‹ˆλ‹€.
    • 평균, 쀑간값, μ΅œλΉˆκ°’, λΆ„μ‚°, ν‘œμ€€νŽΈμ°¨ λ“± μ£Όμš” ν†΅κ³„μΉ˜λ₯Ό 톡해 데이터λ₯Ό μš”μ•½ν•˜κ³  μ„€λͺ…ν•©λ‹ˆλ‹€.
  5. 데이터에 λŒ€ν•œ 이해도 ν–₯상
    • 데이터에 λŒ€ν•œ μ „λ°˜μ μΈ 이해도λ₯Ό λ†’μ—¬ 이후 뢄석 κ³Όμ •μ—μ„œ 데이터에 λŒ€ν•œ 직관을 μ œκ³΅ν•©λ‹ˆλ‹€.
    • λ°μ΄ν„°μ˜ 성격을 νŒŒμ•…ν•˜κ³ , 이λ₯Ό λ°”νƒ•μœΌλ‘œ μ μ ˆν•œ 뢄석 기법을 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.
  6. λͺ¨λΈλ§ λ°©ν–₯ μ„€μ •
    • 데이터 뢄석 및 λͺ¨λΈλ§μ˜ λ°©ν–₯을 μ„€μ •ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€.
    • EDAλ₯Ό 톡해 λ°œκ²¬ν•œ νŒ¨ν„΄κ³Ό 톡계적 νŠΉμ„±μ„ λ°”νƒ•μœΌλ‘œ λͺ¨λΈλ§ μ „λž΅μ„ μˆ˜λ¦½ν•˜κ³ , λͺ¨λΈμ˜ μ„±λŠ₯을 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

 

EDA μ€‘μš”μ„±

탐색적 데이터 뢄석(Exploratory Data Analysis, EDA)의 μ€‘μš”μ„±μ— λ°ν•˜μ—¬ μ„€λͺ…ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
  • 탐색적 데이터 뢄석(Exploratory Data Analysis, EDA)λŠ” 데이터 λΆ„μ„μ˜ λ°©ν–₯κ³Ό ν’ˆμ§ˆμ„ 결정지을 수 μžˆλŠ” 핡심 λ‹¨κ³„μž…λ‹ˆλ‹€.
  • 잠재적 문제λ₯Ό 사전에 νŒŒμ•…ν•˜κ³  μˆ˜μ •ν•  기회λ₯Ό μ œκ³΅ν•˜λ©°, λ°μ΄ν„°μ˜ 질과 ꡬ쑰λ₯Ό μ΄ν•΄ν•˜μ—¬ 데이터 뢄석 결과의 정확성을 ν–₯μƒμ‹œν‚€κΈ° μœ„ν•œ λͺ©μ μ„ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜μ— λ‚΄μš©μ— 더 μžμ„Ένžˆ μ„€λͺ…ν•΄ λ†“μ•˜μŠ΅λ‹ˆλ‹€.

 

  • 데이터 λΆ„μ„μ˜ λ°©ν–₯κ³Ό ν’ˆμ§ˆ κ²°μ •
    • EDAλŠ” 데이터 뢄석 ν”„λ‘œμ νŠΈμ˜ 초기 λ‹¨κ³„μ—μ„œ μˆ˜ν–‰λ˜λ©°, 데이터 λΆ„μ„μ˜ λ°©ν–₯κ³Ό ν’ˆμ§ˆμ„ κ²°μ •μ§“λŠ” 핡심 λ‹¨κ³„μž…λ‹ˆλ‹€.
    • 이 λ‹¨κ³„μ—μ„œ λ°μ΄ν„°μ˜ μ£Όμš” νŠΉμ„±μ„ νŒŒμ•…ν•˜κ³ , 뢄석 λͺ©ν‘œλ₯Ό μ„€μ •ν•˜λŠ” 데 μ€‘μš”ν•œ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
    • μ˜ˆμ‹œ: 데이터 뢄포와 λ³€μˆ˜λ₯Ό νŒŒμ•…ν•œ ν›„, μ μ ˆν•œ 뢄석 기법을 μ„ νƒν•˜κ³  μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 잠재적 문제 사전 νŒŒμ•… 및 μˆ˜μ • 기회 제곡
    • EDAλ₯Ό 톡해 λ°μ΄ν„°μ…‹μ˜ 결츑치, μ΄μƒμΉ˜, 데이터 μž…λ ₯ 였λ₯˜ λ“± 잠재적인 문제λ₯Ό 사전에 λ°œκ²¬ν•˜κ³  μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 λ°μ΄ν„°μ˜ 신뒰성을 높이고, 뢄석 결과의 정확성을 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ˜ˆμ‹œ: κ²°μΈ‘μΉ˜λ‚˜ μ΄μƒμΉ˜λ₯Ό λ°œκ²¬ν•˜κ³  이λ₯Ό μ²˜λ¦¬ν•˜μ—¬ λ°μ΄ν„°μ˜ μ§ˆμ„ κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ°μ΄ν„°μ˜ 질과 ꡬ쑰 이해λ₯Ό ν†΅ν•œ μ •ν™•μ„± ν–₯상
    • EDAλ₯Ό 톡해 λ°μ΄ν„°μ˜ 질과 ꡬ쑰λ₯Ό 깊이 이해할 수 있으며, 이λ₯Ό 톡해 데이터 뢄석 결과의 정확성을 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • λ°μ΄ν„°μ˜ νŒ¨ν„΄, 뢄포, 관계 등을 νŒŒμ•…ν•˜μ—¬ 보닀 μ‹ λ’°μ„± μžˆλŠ” 뢄석을 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ˜ˆμ‹œ: λ°μ΄ν„°μ˜ 뢄포λ₯Ό μ΄ν•΄ν•˜κ³ , 뢄석에 μ ν•©ν•œ 데이터 μ „μ²˜λ¦¬ 방법을 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

데이터 λΆ„μ„μ—μ„œ EDA의 μ—­ν• 

데이터 λΆ„μ„μ—μ„œμ˜ EDA의 역할에 λ°ν•˜μ—¬ μ„€λͺ…을 ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
  • EDA κ³Όμ •μ—μ„œ λ°μ΄ν„°μ˜ 결츑치, μ΄μƒμΉ˜ 및 뢄포λ₯Ό νŒŒμ•…ν•˜μ—¬ 데이터 μ •μ œ 및 μ „μ²˜λ¦¬ κ³„νšμ„ μˆ˜λ¦½ν•©λ‹ˆλ‹€.
  • λ˜ν•œ 관련성이 높은 λ³€μˆ˜λ₯Ό μ‹λ³„ν•˜μ—¬ 더 효과적인 λ¨Έμ‹ λŸ¬λ‹ & λ”₯λŸ¬λ‹ λͺ¨λΈμ„ ꡬ좕할 수 μžˆλ„λ‘ μ§€μ›ν•©λ‹ˆλ‹€.

1. λ°μ΄ν„°μ˜ 결츑치, μ΄μƒμΉ˜ 및 뢄포 νŒŒμ•…

  • EDAλŠ” λ°μ΄ν„°μ˜ 결츑치, μ΄μƒμΉ˜ 및 뢄포λ₯Ό νŒŒμ•…ν•˜μ—¬ 데이터 μ •μ œ 및 μ „μ²˜λ¦¬ κ³„νšμ„ μˆ˜λ¦½ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 λ°μ΄ν„°μ˜ ν’ˆμ§ˆμ„ 높이고, 뢄석 κ³Όμ •μ—μ„œ λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.
  • Example Code (μ˜ˆμ‹œ μ½”λ“œ)
# 결츑치 확인
missing_values = data.isnull().sum()
print(missing_values)

# μ΄μƒμΉ˜ 탐지 (λ°•μŠ€ν”Œλ‘― μ‚¬μš©)
plt.boxplot(data['column_name'])
plt.title('Box Plot of Column Name')
plt.ylabel('Value')
plt.show()

 

 

2. 관련성이 높은 λ³€μˆ˜ 식별

  • EDAλŠ” 데이터 λ‚΄μ˜ λ³€μˆ˜λ“€ κ°„μ˜ 관계λ₯Ό νŒŒμ•…ν•˜μ—¬, 관련성이 높은 λ³€μˆ˜λ₯Ό μ‹λ³„ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 더 효과적인 λͺ¨λΈμ„ ꡬ좕할 수 있으며, λΆ„μ„μ˜ μ •ν™•μ„±κ³Ό νš¨μœ¨μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.
  • Example Code (μ˜ˆμ‹œ μ½”λ“œ)
# 상관 행렬을 ν†΅ν•œ λ³€μˆ˜ κ°„μ˜ 상관관계 뢄석
correlation_matrix = data.corr()
print(correlation_matrix)

# 히트맡 μ‹œκ°ν™”
import seaborn as sns
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix Heatmap')
plt.show()

μ£Όμš” 데이터 μ‹œκ°ν™” 기법

데이터 μ‹œκ°ν™”λ₯Ό ν•˜μ—¬ λ°μ΄ν„°μ˜ 뢄포와 관계λ₯Ό μ‹œκ°μ μœΌλ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€.
  • μ£Όμš” κΈ°λ²•μœΌλ‘œλŠ” νžˆμŠ€ν† κ·Έλž¨, λ°•μŠ€ ν”Œλ‘―, 산점도, 히트맡, 파이 μ°¨νŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€.

νžˆμŠ€ν† κ·Έλž¨ (Histogram)

  • λ°μ΄ν„°μ˜ 뢄포λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ·Έλž˜ν”„λ‘œ, 데이터λ₯Ό μΌμ •ν•œ ꡬ간(bin)으둜 λ‚˜λˆ„μ–΄ 각 ꡬ간에 μ†ν•˜λŠ” λ°μ΄ν„°μ˜ λΉˆλ„λ₯Ό μ‹œκ°ν™”ν•©λ‹ˆλ‹€.
  • μš©λ„: λ°μ΄ν„°μ˜ 뢄포 ν˜•νƒœ, 쀑앙값, 변동성 등을 νŒŒμ•…ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
import matplotlib.pyplot as plt

data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
plt.hist(data, bins=5)
plt.title('Histogram')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()

μ˜ˆμ‹œ κ·Έλ¦Όμž…λ‹ˆλ‹€. μ½”λ“œ μ‹€ν–‰ κ²°κ³Όμ™€λŠ” λ‹€λ¦…λ‹ˆλ‹€.

λ°•μŠ€ ν”Œλ‘― (Box Plot)

  • λ°μ΄ν„°μ˜ 쀑앙값, μ‚¬λΆ„μœ„μˆ˜, μ΄μƒμΉ˜λ₯Ό μ‹œκ°ν™”ν•˜λŠ” κ·Έλž˜ν”„μž…λ‹ˆλ‹€.
  • μš©λ„: λ°μ΄ν„°μ˜ 뢄포, 변동성, μ΄μƒμΉ˜λ₯Ό νŒŒμ•…ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.
data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
plt.boxplot(data)
plt.title('Box Plot')
plt.ylabel('Value')
plt.show()

μ˜ˆμ‹œ κ·Έλ¦Όμž…λ‹ˆλ‹€. μ½”λ“œ μ‹€ν–‰ κ²°κ³Όμ™€λŠ” λ‹€λ¦…λ‹ˆλ‹€.

산점도 (Scatter Plot)

  • 두 λ³€μˆ˜ κ°„μ˜ 관계λ₯Ό μ‹œκ°ν™”ν•˜λŠ” κ·Έλž˜ν”„λ‘œ, 각 데이터λ₯Ό 점으둜 ν‘œμ‹œν•©λ‹ˆλ‹€.
  • μš©λ„: λ³€μˆ˜ κ°„μ˜ 상관관계, νŒ¨ν„΄, μ΄μƒμΉ˜λ₯Ό νŒŒμ•…ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
plt.scatter(x, y)
plt.title('Scatter Plot')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

μ˜ˆμ‹œ κ·Έλ¦Όμž…λ‹ˆλ‹€. μ½”λ“œ μ‹€ν–‰ κ²°κ³Όμ™€λŠ” λ‹€λ¦…λ‹ˆλ‹€.

히트맡 (Heatmap)

  • κ°’μ˜ 크기λ₯Ό μƒ‰μƒμœΌλ‘œ ν‘œν˜„ν•˜μ—¬ 데이터λ₯Ό μ‹œκ°ν™”ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.
  • μš©λ„: λ³€μˆ˜ κ°„μ˜ 상관관계, νŒ¨ν„΄μ„ μ‹œκ°μ μœΌλ‘œ ν‘œν˜„ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.
import seaborn as sns
import numpy as np

data = np.random.rand(10, 12)
sns.heatmap(data, annot=True, cmap='coolwarm')
plt.title('Heatmap')
plt.show()

μ˜ˆμ‹œ κ·Έλ¦Όμž…λ‹ˆλ‹€. μ½”λ“œ μ‹€ν–‰ κ²°κ³Όμ™€λŠ” λ‹€λ¦…λ‹ˆλ‹€.

파이 차트 (Pie Chart)

  • 전체 λ°μ΄ν„°μ—μ„œ 각 뢀뢄이 μ°¨μ§€ν•˜λŠ” λΉ„μœ¨μ„ μ‹œκ°ν™”ν•˜λŠ” μ›ν˜• κ·Έλž˜ν”„μž…λ‹ˆλ‹€.
  • μš©λ„: μΉ΄ν…Œκ³ λ¦¬ν˜• λ°μ΄ν„°μ˜ ꡬ성 λΉ„μœ¨μ„ νŒŒμ•…ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
labels = 'A', 'B', 'C', 'D'
sizes = [15, 30, 45, 10]
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=140)
plt.title('Pie Chart')
plt.show()

μ˜ˆμ‹œ κ·Έλ¦Όμž…λ‹ˆλ‹€. μ½”λ“œ μ‹€ν–‰ κ²°κ³Όμ™€λŠ” λ‹€λ¦…λ‹ˆλ‹€.


기술 톡계 (Descriptive Statistics)

기술 ν†΅κ³„λŠ” λ°μ΄ν„°μ˜ 톡계적 수치λ₯Ό κ³„μ‚°ν•˜μ—¬ λ°μ΄ν„°μ˜ κ²½ν–₯을 μš”μ•½ν•˜κ³  μ„€λͺ…ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
μ΄λŠ” 데이터λ₯Ό μ΄ν•΄ν•˜κ³  μš”μ•½ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•˜λ©°, 데이터 λΆ„μ„μ˜ 초기 λ‹¨κ³„μ—μ„œ 자주 μ‚¬μš©λ©λ‹ˆλ‹€.
  • 3κ°€μ§€ 톡계 방법인 쀑심 κ²½ν–₯ μΈ‘μ •, 뢄산도 μΈ‘μ •, μš”μ•½ 톡계에 λ°ν•˜μ—¬ μ„€λͺ…을 ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

쀑심 κ²½ν–₯ μΈ‘μ • (Measures of Central Tendency)

평균 (Mean)

  • λ°μ΄ν„°μ˜ λͺ¨λ“  값을 λ”ν•œ ν›„ λ°μ΄ν„°μ˜ 개수둜 λ‚˜λˆˆ κ°’μž…λ‹ˆλ‹€.
  • 계산 방법 μ½”λ“œ
mean_value = data['column_name'].mean()
  • μ˜ˆμ‹œ
import pandas as pd

data = pd.Series([1, 2, 3, 4, 5])
mean_value = data.mean()
print(f'평균: {mean_value}')

쀑앙값 (Median)

  • 데이터셋을 μ •λ ¬ν–ˆμ„ λ•Œ 쀑앙에 μœ„μΉ˜ν•œ κ°’μž…λ‹ˆλ‹€.
  • λ°μ΄ν„°μ˜ 절반이 이 값보닀 크고, λ‚˜λ¨Έμ§€ μ ˆλ°˜μ€ 이 값보닀 μž‘μŠ΅λ‹ˆλ‹€.
  • 계산 방법 μ½”λ“œ
median_value = data['column_name'].median()
  • μ˜ˆμ‹œ
median_value = data.median()
print(f'쀑앙값: {median_value}')

 

μ΅œλΉˆκ°’ (Mode)

  • λ°μ΄ν„°μ…‹μ—μ„œ κ°€μž₯ 자주 λ‚˜νƒ€λ‚˜λŠ” κ°’μž…λ‹ˆλ‹€.
  • 계산 방법 μ½”λ“œ
mode_value = data['column_name'].mode()[0]
  • μ˜ˆμ‹œ
mode_value = data.mode()[0]
print(f'μ΅œλΉˆκ°’: {mode_value}')

뢄산도 μΈ‘μ • (Measures of Dispersion)

뢄산도 츑정은 데이터가 μ–Όλ§ˆλ‚˜ λ„“κ²Œ 퍼져 μžˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 톡계적 μˆ˜μΉ˜μž…λ‹ˆλ‹€.
μ΄λŠ” λ°μ΄ν„°μ˜ 변동성을 μ΄ν•΄ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€.

 

ν‘œμ€€νŽΈμ°¨ (Standard Deviation)

  • λ°μ΄ν„°μ˜ 값듀이 ν‰κ· μœΌλ‘œλΆ€ν„° μ–Όλ§ˆλ‚˜ λ–¨μ–΄μ Έ μžˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ²™λ„μž…λ‹ˆλ‹€.
  • 계산 방법:
std_dev = data['column_name'].std()
  • μ˜ˆμ‹œ μ½”λ“œ
std_dev = data.std()
print(f'ν‘œμ€€νŽΈμ°¨: {std_dev}')

 

 

λΆ„μ‚° (Variance)

  • λ°μ΄ν„°μ˜ 값듀이 ν‰κ· μœΌλ‘œλΆ€ν„° μ–Όλ§ˆλ‚˜ λ–¨μ–΄μ Έ μžˆλŠ”μ§€λ₯Ό μ œκ³±ν•˜μ—¬ ν‰κ· ν•œ κ°’μž…λ‹ˆλ‹€. ν‘œμ€€νŽΈμ°¨μ˜ μ œκ³±μž…λ‹ˆλ‹€.
  • 계산 방법:
variance_value = data['column_name'].var()
  • μ˜ˆμ‹œ μ½”λ“œ
variance_value = data.var()
print(f'λΆ„μ‚°: {variance_value}')

 

λ²”μœ„ (Range)

  • λ°μ΄ν„°μ…‹μ—μ„œ κ°€μž₯ 큰 κ°’κ³Ό κ°€μž₯ μž‘μ€ κ°’μ˜ μ°¨μ΄μž…λ‹ˆλ‹€. 
  • 계산 방법
range_value = data['column_name'].max() - data['column_name'].min()
  • μ˜ˆμ‹œ μ½”λ“œ
range_value = data.max() - data.min()
print(f'λ²”μœ„: {range_value}')

 

μ‚¬λΆ„μœ„μˆ˜ λ²”μœ„ (Interquartile Range, IQR)

  • λ°μ΄ν„°μ˜ 쀑간 50%λ₯Ό ν¬ν•¨ν•˜λŠ” κ°’μ˜ λ²”μœ„λ‘œ, Q3 (3μ‚¬λΆ„μœ„μˆ˜)μ—μ„œ Q1 (1μ‚¬λΆ„μœ„μˆ˜)을 λΊ€ κ°’μž…λ‹ˆλ‹€.
  • 계산 방법
Q1 = data['column_name'].quantile(0.25)
Q3 = data['column_name'].quantile(0.75)
IQR = Q3 - Q1
  • μ˜ˆμ‹œ μ½”λ“œ
Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1
print(f'IQR: {IQR}')

μš”μ•½ 톡계 (Summary Statistics)

μš”μ•½ ν†΅κ³„λŠ” μ—¬λŸ¬ 기술 톡계λ₯Ό μ’…ν•©ν•˜μ—¬ λ°μ΄ν„°μ˜ 전체적인 κ²½ν–₯을 ν•œλˆˆμ— νŒŒμ•…ν•  수 μžˆλ„λ‘ μ œκ³΅ν•©λ‹ˆλ‹€.
  • 계산 방법
summary_statistics = data['column_name'].describe()
  • μ˜ˆμ‹œ μ½”λ“œ
summary_statistics = data.describe()
print(summary_statistics)

λ‹€λ³€λŸ‰ 뢄석

λ‹€λ³€λŸ‰ 뢄석은 μ—¬λŸ¬ λ³€μˆ˜ κ°„μ˜ 관계λ₯Ό λΆ„μ„ν•˜μ—¬ μΈμ‚¬μ΄νŠΈλ₯Ό λ„μΆœν•˜λŠ” 뢄석 κΈ°λ²•μž…λ‹ˆλ‹€.
이λ₯Ό 톡해 λ°μ΄ν„°μ˜ λ³΅μž‘ν•œ ꡬ쑰λ₯Ό μ΄ν•΄ν•˜κ³ , λ³€μˆ˜λ“€ κ°„μ˜ μƒν˜Έμž‘μš©μ„ νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ£Όμš” λ‹€λ³€λŸ‰ 뢄석 기법

Correlation Analysis (상관 뢄석)

 

  • 두 λ³€μˆ˜ κ°„μ˜ 관계λ₯Ό λΆ„μ„ν•˜μ—¬ 상관 κ³„μˆ˜λ₯Ό κ³„μ‚°ν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.
  • 상관 κ³„μˆ˜λŠ” 두 λ³€μˆ˜ κ°„μ˜ μ„ ν˜• κ΄€κ³„μ˜ 강도와 λ°©ν–₯을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • μ£Όμš” 상관 κ³„μˆ˜:
    • ν”Όμ–΄μŠ¨ 상관 κ³„μˆ˜ (Pearson Correlation Coefficient): 두 λ³€μˆ˜ κ°„μ˜ μ„ ν˜• 관계λ₯Ό μΈ‘μ •ν•©λ‹ˆλ‹€.
    • μŠ€ν”Όμ–΄λ§Œ 상관 κ³„μˆ˜ (Spearman's Rank Correlation Coefficient): 두 λ³€μˆ˜μ˜ μˆœμœ„λ₯Ό 기반으둜 λΉ„μ„ ν˜• 관계λ₯Ό μΈ‘μ •ν•©λ‹ˆλ‹€.
    • 켄달 상관 κ³„μˆ˜ (Kendall's Tau): 두 λ³€μˆ˜μ˜ μˆœμœ„λ₯Ό 기반으둜 λΉ„μ„ ν˜• 관계λ₯Ό μΈ‘μ •ν•˜λ©°, μˆœμœ„ κ°„μ˜ 일관성을 ν‰κ°€ν•©λ‹ˆλ‹€.
    • Example Code.
import pandas as pd
from scipy.stats import pearsonr, spearmanr, kendalltau

data = pd.DataFrame({
    'x': [1, 2, 3, 4, 5],
    'y': [2, 3, 5, 7, 11]
})

# ν”Όμ–΄μŠ¨ 상관 κ³„μˆ˜
pearson_corr, _ = pearsonr(data['x'], data['y'])
print(f'ν”Όμ–΄μŠ¨ 상관 κ³„μˆ˜: {pearson_corr}')

# μŠ€ν”Όμ–΄λ§Œ 상관 κ³„μˆ˜
spearman_corr, _ = spearmanr(data['x'], data['y'])
print(f'μŠ€ν”Όμ–΄λ§Œ 상관 κ³„μˆ˜: {spearman_corr}')

# 켄달 상관 κ³„μˆ˜
kendall_corr, _ = kendalltau(data['x'], data['y'])
print(f'켄달 상관 κ³„μˆ˜: {kendall_corr}')

 

 

Principal Component Analysis, PCA (μ£Όμ„±λΆ„ 뢄석)

  • 닀차원 데이터λ₯Ό 차원을 μΆ•μ†Œν•˜μ—¬ μ€‘μš”ν•œ λ³€μˆ˜λ₯Ό μΆ”μΆœν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.
  • λ°μ΄ν„°μ˜ 뢄산을 μ΅œλŒ€ν•œ λ³΄μ‘΄ν•˜λ©΄μ„œ 차원을 μΆ•μ†Œν•˜μ—¬ 데이터λ₯Ό μ‹œκ°ν™”ν•˜κ±°λ‚˜ λͺ¨λΈμ˜ νš¨μœ¨μ„±μ„ λ†’μž…λ‹ˆλ‹€.
  • μš©λ„: λ°μ΄ν„°μ˜ 차원 μΆ•μ†Œ, μ‹œκ°ν™”, λ…Έμ΄μ¦ˆ 제거, λ³€μˆ˜ 선택 등에 μ‚¬μš©λ©λ‹ˆλ‹€.
  • Example Code.
import pandas as pd
from sklearn.decomposition import PCA

data = pd.DataFrame({
    'x1': [1, 2, 3, 4, 5],
    'x2': [2, 4, 6, 8, 10],
    'x3': [5, 4, 3, 2, 1]
})

pca = PCA(n_components=2)
principal_components = pca.fit_transform(data)
print(principal_components)

 

Factor Analysis (μš”μΈ 뢄석)

  • λ³€μˆ˜λ“€μ˜ μƒν˜Έ 관련성을 μ†Œμˆ˜μ˜ μš”μΈ(factor)으둜 μΆ”μΆœν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.
  • μš”μΈ 뢄석을 톡해 κ΄€μ°°λœ λ³€μˆ˜λ“€μ„ μ„€λͺ…ν•˜λŠ” μˆ¨κ²¨μ§„ μš”μΈμ„ 식별할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μš©λ„: λ³€μˆ˜ κ°„μ˜ 관계 이해, 데이터 차원 μΆ•μ†Œ, μˆ¨κ²¨μ§„ μš”μΈμ˜ 식별 등에 μ‚¬μš©λ©λ‹ˆλ‹€.
  • Example Code.
import pandas as pd
from sklearn.decomposition import FactorAnalysis

data = pd.DataFrame({
    'x1': [1, 2, 3, 4, 5],
    'x2': [2, 4, 6, 8, 10],
    'x3': [5, 4, 3, 2, 1]
})

fa = FactorAnalysis(n_components=2)
factors = fa.fit_transform(data)
print(factors)