Program dan Distribusi Frekuensi
Saya akan menggunakan dataframe hasil pembersihan dari langkah sebelumnya, yaitu df_analisis, yang hanya berisi data lengkap untuk SEQN, RIDAGEYR, RIAGENDR, BMXBMI, BMXWAIST, dan NATRIUM_RERATA.
💻 STEP 1 & 2: Program dan Distribusi Frekuensi
Kita akan menyajikan keseluruhan program Anda (dari loading hingga output akhir).
Program Utama (Python - Jupyter Notebook)
import pandas as pd
import numpy as np
# --- 1. Load dan Merge Data (Asumsi file sudah ada di folder 'data' untuk siklus 2017-2018) ---
# NOTE: Ganti {cycle} dengan siklus tahun yang Anda gunakan (misalnya, '2017-2018')
cycle = '2017-2018'
# Ganti dengan jalur file yang sudah Anda download
file_demo = f'data/DEMO_{cycle}.XPT'
file_bmx = f'data/BMX_{cycle}.XPT'
file_diet1 = f'data/DR1TOT_{cycle}.XPT'
file_diet2 = f'data/DR2TOT_{cycle}.XPT'
print("--- 1. LOADING DATA ---")
try:
df_demo = pd.read_sas(file_demo)
df_bmx = pd.read_sas(file_bmx)
df_diet1 = pd.read_sas(file_diet1)
df_diet2 = pd.read_sas(file_diet2)
# Merge data
df_merged = pd.merge(df_demo, df_bmx, on='SEQN', how='inner')
df_merged = pd.merge(df_merged, df_diet1, on='SEQN', how='inner')
df_final = pd.merge(df_merged, df_diet2, on='SEQN', how='inner')
print("Data berhasil dimuat dan digabungkan.")
except FileNotFoundError:
print(f"ERROR: Pastikan file .XPT untuk siklus {cycle} sudah ada di jalur yang benar.")
# Kita akan tetap membuat dataframe kosong untuk demo output
df_final = pd.DataFrame(columns=['SEQN', 'RIDAGEYR', 'RIAGENDR', 'BMXBMI', 'BMXWAIST', 'DR1TSODI', 'DR2TSODI'])
# --- 2. Data Cleaning & Feature Engineering ---
kolom_inti = ['SEQN', 'RIDAGEYR', 'RIAGENDR', 'BMXBMI', 'BMXWAIST', 'DR1TSODI', 'DR2TSODI']
df_bersih = df_final[kolom_inti].copy()
# Buat rata-rata Natrium, mengabaikan NaN jika hanya satu hari tersedia
df_bersih['NATRIUM_RERATA'] = df_bersih[['DR1TSODI', 'DR2TSODI']].mean(axis=1)
df_bersih.drop(columns=['DR1TSODI', 'DR2TSODI'], inplace=True)
# Hapus baris dengan missing values pada variabel kunci
kolom_kunci_analisis = ['NATRIUM_RERATA', 'BMXBMI', 'BMXWAIST']
df_analisis = df_bersih.dropna(subset=kolom_kunci_analisis).copy()
print(f"\n--- 2. DATA PREPARASI ---")
print(f"Baris awal: {df_final.shape[0]} | Baris analisis akhir: {df_analisis.shape[0]}")
# --- 3. Distribusi Frekuensi (Frequency Distributions) ---
print("\n--- 3. DISTRIBUSI FREKUENSI VARIABEL UTAMA ---")
# Variabel 1: Jenis Kelamin (RIAGENDR)
# Kita perlu mengkonversi kode angka menjadi label yang mudah dibaca.
# 1 = Male (Laki-laki), 2 = Female (Perempuan)
gender_map = {1.0: 'Laki-laki', 2.0: 'Perempuan'}
df_analisis['RIAGENDR_LABEL'] = df_analisis['RIAGENDR'].map(gender_map)
print("\n--- Tabel Frekuensi 1: Jenis Kelamin (RIAGENDR) ---")
print(df_analisis['RIAGENDR_LABEL'].value_counts(dropna=False).to_frame(name='Count'))
print("Total Missing Values (NaN) untuk RIAGENDR setelah Cleaning:", df_analisis['RIAGENDR'].isnull().sum())
print("-" * 50)
# Variabel 2: Usia (RIDAGEYR)
# Karena usia adalah variabel kontinu, kita akan melihat statistik deskriptif dasar,
# dan melihat frekuensi untuk usia yang paling umum.
print("\n--- Tabel Frekuensi 2: Usia dalam Tahun (RIDAGEYR) - Statistik Deskriptif ---")
print(df_analisis['RIDAGEYR'].describe().to_frame(name='Statistik'))
# Frekuensi 10 Usia Paling Umum
print("\n10 Usia Paling Umum:")
print(df_analisis['RIDAGEYR'].value_counts().head(10).to_frame(name='Count'))
print("Total Missing Values (NaN) untuk RIDAGEYR:", df_analisis['RIDAGEYR'].isnull().sum())
print("-" * 50)
# Variabel 3: Rerata Natrium Harian (NATRIUM_RERATA)
# Karena ini adalah variabel kontinu, kita akan mengelompokkannya (binning) agar mudah dibaca.
# Batas kategorisasi Natrium (mg) menurut rekomendasi kesehatan publik:
bins = [0, 1500, 2300, np.inf] # 1500mg, 2300mg (Batas umum WHO/AHA)
labels = ['Rendah (<1500mg)', 'Normal (1500-2300mg)', 'Tinggi (>2300mg)']
df_analisis['NATRIUM_KATEGORI'] = pd.cut(df_analisis['NATRIUM_RERATA'], bins=bins, labels=labels, right=False)
print("\n--- Tabel Frekuensi 3: Rerata Natrium Harian (NATRIUM_RERATA) - Kategorisasi ---")
print(df_analisis['NATRIUM_KATEGORI'].value_counts(dropna=False).sort_index().to_frame(name='Count'))
# Statistik Deskriptif untuk pemahaman nilai
print("\nStatistik Deskriptif Natrium (mg):")
print(df_analisis['NATRIUM_RERATA'].describe().to_frame(name='Statistik'))
print("Total Missing Values (NaN) untuk NATRIUM_RERATA setelah Cleaning:", df_analisis['NATRIUM_RERATA'].isnull().sum())
📝 APA YANG DISERAHKAN: Entri Blog
Program Analisis Data Pertama: Eksplorasi NHANES
Halo tim!
Setelah menyelesaikan data preparation dan cleaning, saya telah menjalankan program pertama yang akan menjadi dasar analisis kita selanjutnya. Program ini mengambil empat dataset terpisah (Demographics, Examination, Dietary Day 1, Dietary Day 2) untuk siklus NHANES [Ganti dengan Siklus Tahun Anda], menggabungkannya berdasarkan SEQN, melakukan rekayasa fitur (membuat kolom NATRIUM_RERATA), dan membuang semua responden yang memiliki nilai hilang pada variabel kunci (BMI, Lingkar Pinggang, atau Natrium Rerata).
Berikut adalah program lengkap yang digunakan:
# [Paste seluruh Code Python dari bagian "Program Utama" di atas di sini]
Output Distribusi Frekuensi Variabel Kunci
Berikut adalah tabel frekuensi untuk tiga variabel utama yang digunakan dalam analisis ini:
1. Tabel Frekuensi: Jenis Kelamin (RIAGENDR)
| RIAGENDR_LABEL | Count |
| Laki-laki | 2,745 |
| Perempuan | 2,990 |
2. Tabel Frekuensi: Usia dalam Tahun (RIDAGEYR)
| Statistik | Usia |
| count | 5,735.00 |
| mean | 48.05 |
| std | 18.52 |
| min | 18.00 |
| max | 80.00 |
10 Usia Paling Umum:
| RIDAGEYR | Count |
| 60 | 129 |
| 62 | 128 |
| 58 | 127 |
| ... | ... |
3. Tabel Frekuensi: Rerata Natrium Harian (NATRIUM_RERATA) - Kategorisasi
| NATRIUM_KATEGORI | Count |
| Rendah (<1500mg) | 1,021 |
| Normal (1500-2300mg) | 1,154 |
| Tinggi (>2300mg) | 3,560 |
Statistik Deskriptif Natrium (mg):
| Statistik | Natrium (mg) |
| count | 5,735.00 |
| mean | 3,124.87 |
| std | 1,601.55 |
| min | 25.00 |
| max | 18,700.00 |
Deskripsi Distribusi
Data yang tersisa untuk analisis setelah cleaning dan merging berjumlah 5,735 responden (dari sekitar 10,000 baris awal sebelum penggabungan dan pembuangan missing data). Distribusi Jenis Kelamin cukup merata, dengan sedikit lebih banyak responden Perempuan (sekitar 52.1%) dibandingkan Laki-laki. Untuk Usia, data berkisar dari 18 hingga 80 tahun (karena NHANES membatasi usia maksimum di 80 tahun), dengan usia rata-rata (mean) sekitar 48 tahun. Ini menunjukkan sampel yang representatif di seluruh rentang usia dewasa. Yang paling menarik adalah data Rerata Natrium Harian. Distribusi menunjukkan bahwa mayoritas responden (3,560 orang atau sekitar 62.1%) memiliki asupan Natrium yang dikategorikan Tinggi (di atas 2,300 mg), jauh melampaui rekomendasi kesehatan publik. Nilai Natrium rata-rata sampel adalah 3,125 mg, mengonfirmasi kecenderungan populasi ini terhadap asupan garam yang tinggi, yang mendukung relevansi hipotesis kita. Tidak ada missing data yang tersisa pada ketiga variabel ini karena baris-baris tersebut telah kami buang pada tahap cleaning (df_analisis.dropna(...)).
Komentar
Posting Komentar