Apa yang Abbas Kuasai di Bulan Ini

Konteks Bulan 8: Setelah menguasai statistik inferensial di Bulan 7, Abbas kini belajar dari mana data itu berasal. Kualitas analisis sangat bergantung pada kualitas pengumpulan data. Bulan ini membahas metodologi riset secara menyeluruh, dari desain penelitian hingga pembuatan survey yang baik dan analisis hasilnya dengan Python.

Kompetensi yang Dicapai

  • Memahami jenis-jenis desain penelitian, termasuk perbedaan penelitian kuantitatif dan kualitatif, serta penelitian observasional dan eksperimental.
  • Memilih metode sampling yang sesuai dengan konteks penelitian, antara random sampling, stratified sampling, systematic sampling, dan cluster sampling.
  • Mengidentifikasi dan memitigasi bias dalam proses pengumpulan data, termasuk selection bias, response bias, dan confirmation bias.
  • Merancang pertanyaan survey yang valid, meliputi jenis pertanyaan (Likert scale, multiple choice, open-ended) dan urutan yang tidak mengarahkan responden.
  • Menggunakan Google Forms dan tools lainnya untuk membangun, menyebarkan, dan mengumpulkan data survey secara sistematis.
  • Menganalisis data survey dengan Python dan Pandas, termasuk membersihkan data respons, menghitung distribusi jawaban, dan membuat visualisasi hasil survey.
  • Memahami konsep validitas dan reliabilitas dalam konteks instrumen pengukuran, termasuk cara menguji Cronbach's Alpha untuk konsistensi internal.
  • Menyusun laporan hasil survey yang ringkas, akurat, dan dapat dikomunikasikan kepada audiens non-teknis, sebagai persiapan proyek P4: Mini Survey.
Tips Belajar Bulan Ini: Metodologi riset terasa abstrak jika hanya dibaca. Abbas disarankan langsung membuat survey nyata tentang topik yang relevan, misalnya kebiasaan belajar teman-teman di sekolah, pola jajan di kantin, atau preferensi media sosial. Data nyata akan membuat setiap konsep terasa konkret dan mudah diingat.
Minggu 1
Desain Penelitian
Jenis penelitian, sampling methods, dan bias
Minggu 2
Desain Survey yang Baik
Struktur pertanyaan, Likert scale, dan Google Forms
Minggu 3
Analisis Data Survey
Pandas untuk respons survey, Cronbach's Alpha
Minggu 4
Proyek P4: Mini Survey
Rancang, sebarkan, analisis, dan presentasikan

Minggu 1: Desain Penelitian

Minggu pertama membangun fondasi metodologi riset. Abbas memahami bagaimana peneliti memilih pendekatan yang tepat sebelum mengumpulkan satu pun data, dan mengapa keputusan awal ini menentukan seluruh kualitas penelitian.

Hari 1
Jenis-Jenis Penelitian: Peta Besar Metodologi
Baca ringkasan perbedaan penelitian kuantitatif (angka, statistik, generalisasi) vs kualitatif (makna, konteks, wawancara mendalam). Catat dua contoh nyata masing-masing dari kehidupan sekolah.
Pelajari perbedaan penelitian observasional (peneliti hanya mengamati, tidak intervensi) vs eksperimental (peneliti memberi perlakuan dan mengukur dampaknya). Buat diagram perbandingan sederhana di buku catatan.
Identifikasi penelitian mana yang cocok untuk pertanyaan berikut: "Apakah metode belajar aktif meningkatkan nilai ujian?" Tulis alasannya minimal 3 kalimat.
Eksplorasi satu studi kasus dari data BPS Indonesia: pilih laporan survei nasional (misalnya Susenas) dan identifikasi jenis penelitiannya beserta metode pengumpulan datanya.
# Simulasi: membuat dataset penelitian observasional vs eksperimental
import pandas as pd
import numpy as np

np.random.seed(42)

# Observasional: kita hanya mencatat apa yang sudah ada
observasional = pd.DataFrame({
    'siswa_id': range(1, 31),
    'metode_belajar': np.random.choice(['aktif', 'pasif'], 30),
    'nilai_ujian': np.random.randint(60, 100, 30)
})

# Eksperimental: kita ASSIGN kelompok secara random (RCT)
eksperimental = pd.DataFrame({
    'siswa_id': range(1, 31),
    'kelompok': ['treatment']*15 + ['control']*15,
    'nilai_sebelum': np.random.randint(60, 80, 30),
    'nilai_sesudah': np.concatenate([
        np.random.randint(75, 100, 15),  # treatment: lebih tinggi
        np.random.randint(60, 85, 15)    # control: tidak banyak berubah
    ])
})

print("=== Dataset Observasional ===")
print(observasional.groupby('metode_belajar')['nilai_ujian'].mean())

print("\n=== Dataset Eksperimental ===")
eksperimental['peningkatan'] = eksperimental['nilai_sesudah'] - eksperimental['nilai_sebelum']
print(eksperimental.groupby('kelompok')['peningkatan'].mean())
Refleksi: Abbas sudah sering melihat berita yang mengatakan "penelitian membuktikan X menyebabkan Y". Setelah belajar hari ini, penelitian seperti apa yang bisa membuktikan kausalitas? Dan mengapa sebagian besar penelitian di berita sebenarnya hanya menunjukkan korelasi?
Hari 2
Sampling Methods: Cara Memilih Siapa yang Diteliti
Pahami konsep populasi (seluruh kelompok yang ingin dipelajari) vs sampel (subset yang benar-benar diteliti). Catat: mengapa tidak semua penelitian bisa meneliti seluruh populasi.
Pelajari empat metode sampling utama: Simple Random Sampling (setiap anggota punya peluang sama), Stratified Sampling (dibagi per kelompok, lalu random di tiap kelompok), Systematic Sampling (pilih setiap ke-N anggota), dan Cluster Sampling (pilih kelompok utuh secara random).
Implementasikan keempat metode di Python menggunakan dataset sekolah simulasi. Bandingkan karakteristik tiap sampel yang dihasilkan (mean, distribusi kelas).
Tentukan metode mana yang paling tepat jika Abbas ingin meneliti kebiasaan belajar siswa SMA seluruh Indonesia dengan anggaran terbatas. Jelaskan alasannya.
import pandas as pd
import numpy as np

np.random.seed(7)

# Populasi: 500 siswa dari 5 kelas
populasi = pd.DataFrame({
    'id': range(1, 501),
    'kelas': np.repeat(['X-A', 'X-B', 'X-C', 'XI-A', 'XI-B'], 100),
    'nilai': np.concatenate([
        np.random.normal(75, 10, 100),  # X-A
        np.random.normal(78, 8, 100),   # X-B
        np.random.normal(72, 12, 100),  # X-C
        np.random.normal(80, 9, 100),   # XI-A
        np.random.normal(82, 7, 100),   # XI-B
    ]).clip(0, 100)
})

n = 50  # ukuran sampel target

# 1. Simple Random Sampling
srs = populasi.sample(n=n, random_state=1)
print(f"SRS mean nilai: {srs['nilai'].mean():.2f}")

# 2. Stratified Sampling (proporsional: 10 per kelas)
stratified = populasi.groupby('kelas', group_keys=False).apply(
    lambda x: x.sample(n=10, random_state=1)
)
print(f"Stratified mean nilai: {stratified['nilai'].mean():.2f}")

# 3. Systematic Sampling (setiap ke-10)
interval = len(populasi) // n
start = np.random.randint(0, interval)
systematic = populasi.iloc[start::interval].head(n)
print(f"Systematic mean nilai: {systematic['nilai'].mean():.2f}")

# Bandingkan dengan populasi asli
print(f"\nPopulasi mean nilai: {populasi['nilai'].mean():.2f}")
Tantangan: Implementasikan Cluster Sampling untuk dataset di atas: pilih 2 kelas secara random, lalu ambil seluruh siswa di kedua kelas tersebut sebagai sampel. Hitung mean nilainya dan bandingkan dengan tiga metode lain. Metode mana yang paling mendekati mean populasi? Mengapa hasilnya bisa berbeda jauh?
Hari 3
Bias dalam Penelitian: Musuh Tersembunyi Data
Pelajari Selection Bias: terjadi saat sampel tidak mewakili populasi. Contoh klasik: survei online tentang penggunaan internet akan selalu bias karena hanya menjangkau orang yang sudah online. Cari satu contoh nyata dari konteks Indonesia.
Pelajari Response Bias (juga disebut social desirability bias): responden memberikan jawaban yang "terlihat baik" bukan jawaban jujur. Identifikasi tiga pertanyaan survey yang rentan terhadap bias ini.
Pelajari Confirmation Bias: peneliti (secara tidak sadar) mencari atau menginterpretasikan data yang mendukung hipotesis awal mereka. Diskusikan cara mitigasinya: blind study, peer review, dan pre-registration.
Simulasikan dampak selection bias di Python: buat dataset populasi lengkap, lalu sampling dengan bias (hanya ambil nilai tinggi), dan bandingkan kesimpulan yang berbeda dari dua dataset tersebut.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(99)

# Populasi: 1000 siswa dengan berbagai nilai
populasi = pd.DataFrame({
    'id': range(1, 1001),
    'nilai_mat': np.random.normal(70, 15, 1000).clip(0, 100),
    'jam_belajar': np.random.normal(3, 1.5, 1000).clip(0, 10)
})

# Korelasi sesungguhnya
corr_pop = populasi['nilai_mat'].corr(populasi['jam_belajar'])
print(f"Korelasi populasi: {corr_pop:.3f}")

# Sampel TANPA bias: random sampling
sampel_fair = populasi.sample(n=100, random_state=1)
corr_fair = sampel_fair['nilai_mat'].corr(sampel_fair['jam_belajar'])
print(f"Korelasi sampel fair: {corr_fair:.3f}")

# Sampel DENGAN selection bias: hanya ambil siswa nilai > 75
# (misalnya: survei hanya disebarkan di kelas unggulan)
sampel_bias = populasi[populasi['nilai_mat'] > 75].sample(n=100, random_state=1)
corr_bias = sampel_bias['nilai_mat'].corr(sampel_bias['jam_belajar'])
print(f"Korelasi sampel bias (nilai > 75): {corr_bias:.3f}")

print("\n--- Kesimpulan yang bisa berbeda ---")
print(f"Dari sampel fair: jam belajar {'berkorelasi' if corr_fair > 0.1 else 'tidak berkorelasi'} kuat dengan nilai")
print(f"Dari sampel bias: jam belajar {'berkorelasi' if corr_bias > 0.1 else 'tidak berkorelasi'} kuat dengan nilai")
Refleksi: Abbas pernah membaca atau mendengar hasil survei yang terasa aneh atau tidak sesuai dengan pengalaman sehari-hari? Dengan pengetahuan tentang bias hari ini, apa yang mungkin salah dengan survei tersebut? Siapa yang disurvei, bagaimana caranya, dan siapa yang mendanai penelitian itu?
Hari 4
Hipotesis: Cara Bertanya yang Bisa Diuji
Pahami perbedaan antara pertanyaan penelitian (broad question) dan hipotesis (pernyataan spesifik yang bisa diuji secara empiris). Contoh: "Apakah tidur memengaruhi nilai?" vs "Siswa yang tidur lebih dari 7 jam memiliki rata-rata nilai ujian lebih tinggi daripada yang tidur kurang."
Pelajari konsep Null Hypothesis (H0) dan Alternative Hypothesis (H1). H0 selalu menyatakan "tidak ada efek/perbedaan", sedangkan H1 menyatakan adanya efek. Proses pengujian statistik bekerja dengan mencoba menolak H0.
Tulis pasangan H0 dan H1 untuk tiga skenario penelitian berikut: (a) pengaruh sarapan terhadap konsentrasi belajar, (b) perbedaan nilai antara siswa yang ikut les dan yang tidak, (c) hubungan antara jarak rumah ke sekolah dan kehadiran.
Review materi uji hipotesis dari Bulan 7 (t-test, chi-square) dan hubungkan kembali: uji mana yang sesuai untuk tiap skenario di atas?
import pandas as pd
import numpy as np
from scipy import stats

np.random.seed(21)

# Skenario: Apakah tidur cukup (>=7 jam) meningkatkan nilai?
# H0: mean nilai tidur_cukup == mean nilai tidur_kurang
# H1: mean nilai tidur_cukup > mean nilai tidur_kurang

tidur_cukup = np.random.normal(78, 10, 60)   # 60 siswa tidur >= 7 jam
tidur_kurang = np.random.normal(72, 12, 40)  # 40 siswa tidur < 7 jam

# One-sided t-test (H1: cukup > kurang)
t_stat, p_value = stats.ttest_ind(tidur_cukup, tidur_kurang, alternative='greater')

alpha = 0.05
print("=== Pengujian Hipotesis ===")
print(f"H0: Tidur cukup tidak meningkatkan nilai (mean sama)")
print(f"H1: Tidur cukup meningkatkan nilai (mean lebih tinggi)")
print(f"\nRata-rata tidur cukup: {tidur_cukup.mean():.2f}")
print(f"Rata-rata tidur kurang: {tidur_kurang.mean():.2f}")
print(f"t-statistic: {t_stat:.4f}")
print(f"p-value: {p_value:.4f}")
print(f"\nKesimpulan (alpha={alpha}):")
if p_value < alpha:
    print("Tolak H0: Ada bukti bahwa tidur cukup meningkatkan nilai.")
else:
    print("Gagal tolak H0: Tidak cukup bukti untuk mendukung H1.")
Tantangan: Buat satu pertanyaan penelitian yang relevan dengan kehidupan sekolah Abbas, lalu tulis pasangan H0 dan H1-nya. Simulasikan data untuk skenario tersebut di Python dan jalankan uji hipotesis yang sesuai. Interpretasikan hasilnya dalam satu paragraf seolah Abbas melaporkan ke guru.
Hari 5
Etika Penelitian dan Review Minggu 1
Pelajari prinsip-prinsip etika penelitian yang melibatkan manusia: informed consent (responden harus tahu dan setuju ikut serta), anonimitas dan konfidensialitas (data pribadi tidak boleh tersebar), serta hak mengundurkan diri kapan pun tanpa konsekuensi.
Rancang formulir informed consent sederhana untuk survei Abbas tentang kebiasaan belajar teman sekolahnya. Pastikan mencantumkan: tujuan survei, data yang dikumpulkan, cara penyimpanan data, dan kontak yang bisa dihubungi.
Review seluruh materi Minggu 1: buat mind map yang menghubungkan konsep desain penelitian, jenis sampling, jenis bias, dan hipotesis. Gunakan warna berbeda untuk tiap kategori.
Kerjakan kuis mini: 10 pertanyaan pilihan ganda tentang materi Minggu 1. Buat pertanyaannya sendiri berdasarkan poin-poin yang sudah dipelajari, lalu jawab tanpa melihat catatan.
# Ringkasan: checklist desain penelitian yang baik
checklist = {
    'Pertanyaan Penelitian': [
        'Pertanyaan sudah spesifik dan bisa diuji?',
        'H0 dan H1 sudah dirumuskan dengan jelas?',
        'Variabel independen dan dependen sudah diidentifikasi?'
    ],
    'Sampling': [
        'Populasi target sudah didefinisikan?',
        'Metode sampling sesuai dengan sumber daya?',
        'Ukuran sampel cukup untuk analisis statistik?'
    ],
    'Potensi Bias': [
        'Cara rekrut responden bisa menyebabkan selection bias?',
        'Pertanyaan survey netral, tidak mengarahkan?',
        'Ada mekanisme untuk meminimalkan response bias?'
    ],
    'Etika': [
        'Informed consent sudah disiapkan?',
        'Data anonimitas terjaga?',
        'Responden tahu hak untuk mengundurkan diri?'
    ]
}

for kategori, items in checklist.items():
    print(f"\n[{kategori}]")
    for item in items:
        print(f"  [ ] {item}")

print("\n--- Gunakan checklist ini sebelum mulai survei apapun ---")
Tips untuk Minggu Depan: Abbas akan mulai merancang survey sungguhan di Minggu 2. Mulai sekarang, pikirkan satu topik yang benar-benar ingin Abbas teliti dari lingkungan sekolahnya. Topik terbaik adalah yang Abbas sendiri penasaran jawabannya, bukan yang hanya terasa "tepat" untuk diserahkan ke guru.

Minggu 2: Desain Survey yang Baik

Minggu ini Abbas belajar seni dan sains merancang survey. Survey yang buruk menghasilkan data yang tidak bisa dipercaya, sekuat apapun analisis statistiknya. Abbas akan berlatih menulis pertanyaan yang tepat, memilih skala pengukuran yang sesuai, dan menggunakan Google Forms untuk mengumpulkan data secara nyata.

Hari 1
Anatomi Survey yang Efektif
Pelajari struktur standar survey yang baik: pembukaan (tujuan, waktu pengisian, jaminan anonimitas), bagian screening (pastikan responden sesuai kriteria), pertanyaan utama (dari umum ke spesifik), dan penutup (terima kasih dan kontak).
Analisis dua contoh survey nyata: satu survey yang buruk (pertanyaan ambigu, terlalu panjang, urutan tidak logis) dan satu yang baik. Identifikasi minimal lima perbedaan konkret antara keduanya.
Pelajari konsep survey fatigue: responden menjadi lelah dan menjawab sembarangan jika survey terlalu panjang. Riset menunjukkan completion rate turun drastis setelah 10 menit pengisian. Rencanakan survey Abbas agar bisa selesai dalam 5 menit.
Draft outline pertama survey Abbas: tentukan topik, identifikasi 3-5 hal utama yang ingin diketahui, dan estimasikan jumlah pertanyaan yang dibutuhkan.
# Analisis panjang survey vs completion rate (simulasi berdasarkan riset)
import pandas as pd
import matplotlib.pyplot as plt

data = {
    'jumlah_pertanyaan': [5, 10, 15, 20, 25, 30, 40, 50],
    'completion_rate': [0.92, 0.85, 0.76, 0.65, 0.55, 0.45, 0.30, 0.20],
    'waktu_menit': [2, 4, 6, 8, 10, 12, 16, 20]
}

df = pd.DataFrame(data)
print("Hubungan Panjang Survey dan Completion Rate:")
print(df.to_string(index=False))

# Titik optimal
optimal = df[df['completion_rate'] >= 0.75]
print(f"\nUntuk completion rate >= 75%:")
print(f"  Maksimal pertanyaan: {optimal['jumlah_pertanyaan'].max()}")
print(f"  Maksimal waktu: {optimal['waktu_menit'].max()} menit")
print(f"\nRekomendasi: Survey Abbas sebaiknya 10-15 pertanyaan (4-6 menit)")
Prinsip Desain Survey: Survey yang baik bukan yang paling lengkap, tapi yang paling fokus. Setiap pertanyaan harus bisa Abbas jelaskan: "Saya perlu tahu ini karena..." Jika tidak bisa dijawab, hapus pertanyaan tersebut.
Hari 2
Jenis Pertanyaan Survey dan Kapan Menggunakannya
Pelajari Skala Likert: skala 1-5 atau 1-7 yang mengukur tingkat setuju/tidak setuju, frekuensi, atau kepuasan. Pahami mengapa skala ganjil (5 atau 7 poin) lebih disukai daripada genap, dan kapan skala genap (forced choice) lebih tepat digunakan.
Pelajari pertanyaan Multiple Choice (pilih satu) vs Checkbox (pilih beberapa): keduanya menghasilkan data kategorikal yang mudah dianalisis, tapi harus memastikan pilihan jawaban mutually exclusive dan exhaustive (MECE).
Pelajari pertanyaan Open-ended: memberikan fleksibilitas tapi sulit dianalisis kuantitatif. Pelajari teknik analisis teks dasar untuk open-ended: word frequency, tema, dan kategorisasi manual.
Tulis masing-masing 2 contoh pertanyaan untuk tiap jenis (Likert, multiple choice, open-ended) yang relevan dengan topik survey Abbas, lalu analisis kelebihan dan kekurangan tiap pilihan format.
import pandas as pd
import numpy as np
from collections import Counter

np.random.seed(15)
n = 100

# Simulasi respons berbagai jenis pertanyaan
respons_survey = pd.DataFrame({
    # Likert (1-5): "Seberapa sering Abbas belajar di luar jam sekolah?"
    'frekuensi_belajar': np.random.choice([1,2,3,4,5], n,
                          p=[0.05, 0.15, 0.35, 0.30, 0.15]),

    # Multiple choice: "Metode belajar yang paling sering digunakan"
    'metode_belajar': np.random.choice(
        ['Membaca buku', 'Video YouTube', 'Les privat', 'Diskusi teman'],
        n, p=[0.25, 0.40, 0.20, 0.15]
    ),

    # Open-ended: disimulasikan kata kunci
    'kesulitan_belajar': np.random.choice(
        ['matematika sulit', 'kurang fokus', 'tidak ada waktu',
         'bahan terlalu banyak', 'bosan', 'tidak mengerti'],
        n
    )
})

# Analisis Likert: distribusi frekuensi + mean
print("=== Likert: Frekuensi Belajar (1=tidak pernah, 5=setiap hari) ===")
print(respons_survey['frekuensi_belajar'].value_counts().sort_index())
print(f"Mean: {respons_survey['frekuensi_belajar'].mean():.2f}")

# Analisis Multiple Choice
print("\n=== Multiple Choice: Metode Belajar ===")
print(respons_survey['metode_belajar'].value_counts())

# Analisis Open-ended: word frequency sederhana
print("\n=== Open-ended: Kata Kunci Kesulitan Belajar ===")
all_words = ' '.join(respons_survey['kesulitan_belajar']).split()
word_freq = Counter(all_words).most_common(10)
for word, count in word_freq:
    print(f"  {word}: {count}x")
Tantangan: Ubah pertanyaan open-ended "Apa kesulitan terbesar Abbas dalam belajar?" menjadi sebuah pertanyaan Likert DAN sebuah pertanyaan multiple choice. Tulis kedua versinya, lalu diskusikan: informasi apa yang hilang dan apa yang bertambah saat melakukan konversi tersebut?
Hari 3
Menulis Pertanyaan yang Tidak Menyesatkan
Pelajari jenis-jenis pertanyaan buruk yang harus dihindari: leading questions (menggiring jawaban tertentu), double-barreled questions (menanyakan dua hal sekaligus), ambiguous questions (istilah tidak jelas), dan loaded questions (mengasumsikan sesuatu yang belum terbukti).
Identifikasi masalah dalam 5 pertanyaan survey yang diberikan, lalu tulis ulang versi yang lebih baik: (1) "Apakah Abbas setuju bahwa metode belajar aktif lebih efektif?", (2) "Berapa sering Abbas belajar dan mengerjakan PR?", (3) "Apakah Abbas sudah berhenti menghabiskan waktu untuk bermain game?", (4) "Seberapa bagus nilai matematika Abbas?", (5) "Apakah teman-teman Abbas juga malas belajar seperti yang banyak remaja lakukan?"
Pelajari pentingnya urutan pertanyaan: pertanyaan sensitif (pendapatan keluarga, nilai jelek, masalah pribadi) sebaiknya di akhir setelah responden merasa nyaman. Pertanyaan umum sebelum spesifik.
Revisi draft survey Abbas berdasarkan prinsip hari ini. Minta satu orang (anggota keluarga atau teman) untuk membaca setiap pertanyaan dan memberitahu mana yang terasa membingungkan atau tidak nyaman.
# Checklist kualitas pertanyaan survey
def evaluasi_pertanyaan(pertanyaan: str, pilihan: list = None) -> dict:
    """
    Checklist sederhana untuk mengevaluasi kualitas satu pertanyaan survey.
    Dalam praktiknya, Abbas mengisi ini secara manual untuk setiap pertanyaan.
    """
    hasil = {
        'pertanyaan': pertanyaan,
        'checklist': {}
    }

    checklist_items = [
        ('Satu fokus', 'Pertanyaan hanya menanyakan SATU hal, bukan dua sekaligus'),
        ('Netral', 'Tidak ada kata yang menggiring ke jawaban tertentu'),
        ('Jelas', 'Semua istilah dalam pertanyaan sudah didefinisikan/dipahami'),
        ('Tidak mengasumsikan', 'Tidak ada asumsi yang embedded dalam pertanyaan'),
        ('Pilihan lengkap', 'Semua kemungkinan jawaban tercakup (termasuk N/A jika perlu)'),
        ('Pilihan eksklusif', 'Pilihan jawaban tidak tumpang tindih'),
    ]

    for kode, deskripsi in checklist_items:
        hasil['checklist'][kode] = {'deskripsi': deskripsi, 'status': '[ ] Belum diperiksa'}

    return hasil

# Contoh penggunaan
pertanyaan_test = "Apakah Abbas setuju bahwa belajar di pagi hari lebih efektif?"
hasil = evaluasi_pertanyaan(pertanyaan_test)

print(f"Pertanyaan: {hasil['pertanyaan']}")
print("\nChecklist Evaluasi:")
for kode, detail in hasil['checklist'].items():
    print(f"  {detail['status']} [{kode}] {detail['deskripsi']}")

print("\n--- Isi checklist ini untuk setiap pertanyaan di survey Abbas ---")
Refleksi: Abbas mungkin pernah mengisi survey online dan merasa ada pertanyaan yang "aneh" atau memaksanya menjawab dengan cara tertentu. Sekarang Abbas tahu mengapa itu terjadi. Apa dampaknya terhadap data yang dikumpulkan peneliti tersebut? Dan apakah Abbas pikir penelitinya sadar melakukan itu atau tidak?
Hari 4
Google Forms: Dari Rancangan ke Survei Nyata
Buka Google Forms (forms.google.com) dan buat survey baru. Eksplorasi semua jenis pertanyaan yang tersedia: short answer, paragraph, multiple choice, checkboxes, dropdown, linear scale (Likert), multiple choice grid, dan date. Coba buat satu pertanyaan di setiap format.
Pelajari fitur sections di Google Forms: gunakan untuk memisahkan bagian survey (pembukaan, pertanyaan utama, demografis). Tambahkan juga logika percabangan: jika responden menjawab "tidak pernah belajar mandiri", arahkan ke bagian pertanyaan berbeda dari yang menjawab "sering".
Implementasikan survey final Abbas di Google Forms berdasarkan semua revisi dari Hari 1-3. Pastikan ada: judul yang jelas, deskripsi singkat, pernyataan anonimitas, dan ucapan terima kasih di akhir.
Ekspor respons Google Forms ke Google Sheets, lalu unduh sebagai CSV. Buka di Python dan identifikasi struktur kolomnya: tipe data apa saja yang akan Abbas terima, dan preprocessing apa yang diperlukan.
import pandas as pd
import numpy as np

# Simulasi: data seperti yang diekspor Google Forms ke CSV
# Kolom pertama selalu "Timestamp", lalu tiap pertanyaan jadi satu kolom

np.random.seed(33)
n = 50

data_forms = pd.DataFrame({
    'Timestamp': pd.date_range('2024-01-15 08:00', periods=n, freq='15min'),
    'Berapa lama Abbas belajar per hari? (jam)': np.random.choice(
        ['Kurang dari 1', '1-2 jam', '2-3 jam', 'Lebih dari 3 jam'], n
    ),
    'Metode belajar utama Abbas (pilih semua yang berlaku)': np.random.choice(
        ['Baca buku;Video;', 'Diskusi teman;', 'Les privat;Baca buku;', 'Video;'], n
    ),
    'Seberapa puas Abbas dengan hasil belajar? (1=tidak puas, 5=sangat puas)': np.random.randint(1, 6, n),
    'Apa hambatan terbesar dalam belajar?': np.random.choice(
        ['Sulit fokus', 'Materi susah', 'Tidak ada waktu', 'Kurang motivasi'], n
    )
})

print("=== Preview Data Google Forms ===")
print(data_forms.head(3).to_string())

print("\n=== Info Dataset ===")
print(f"Jumlah respons: {len(data_forms)}")
print(f"Kolom: {list(data_forms.columns)}")

# Perhatikan: kolom checkbox berisi string dengan titik koma sebagai separator
print("\n=== Contoh Parsing Kolom Checkbox ===")
metode_col = 'Metode belajar utama Abbas (pilih semua yang berlaku)'
all_choices = data_forms[metode_col].str.split(';').explode()
all_choices = all_choices[all_choices.str.strip() != '']
print(all_choices.value_counts())
Catatan Teknis Google Forms: Kolom checkbox di Google Forms mengekspor semua pilihan yang dipilih dalam satu sel, dipisahkan koma atau titik koma. Abbas perlu mem-parse kolom ini sebelum bisa menganalisisnya di Python. Ini adalah langkah cleaning data yang sangat umum dalam analisis survey.
Hari 5
Pre-test Survey dan Rencana Distribusi
Lakukan cognitive interview dengan 3-5 orang: minta mereka mengisi survey sambil bersuara keras tentang apa yang mereka pikirkan saat membaca setiap pertanyaan. Ini adalah teknik terbaik untuk menemukan pertanyaan yang ambigu sebelum disebarkan secara massal.
Ukur waktu pengisian rata-rata dari pre-test. Jika lebih dari 7 menit, pertimbangkan untuk memotong pertanyaan yang paling sedikit memberikan informasi baru.
Rencanakan strategi distribusi survey: siapa yang akan disurvei (pastikan sesuai dengan populasi target yang sudah didefinisikan), berapa target respons minimal, saluran distribusi (WhatsApp grup, langsung tatap muka, atau link di papan pengumuman digital), dan batas waktu pengisian.
Hitung ukuran sampel minimal menggunakan rumus sederhana Slovin atau kalkulator ukuran sampel online. Untuk populasi 200 siswa dengan margin of error 10%, berapa minimal responden yang dibutuhkan?
import math

def hitung_sampel_slovin(N: int, e: float = 0.05) -> int:
    """
    Hitung ukuran sampel minimal dengan rumus Slovin.
    N = ukuran populasi
    e = margin of error (default 5% = 0.05)
    """
    n = N / (1 + N * e**2)
    return math.ceil(n)

def hitung_sampel_proporsi(p: float = 0.5, e: float = 0.05, z: float = 1.96) -> int:
    """
    Hitung ukuran sampel untuk estimasi proporsi (populasi besar/tidak diketahui).
    p = proporsi perkiraan (0.5 = paling konservatif)
    e = margin of error
    z = z-score (1.96 untuk confidence level 95%)
    """
    n = (z**2 * p * (1 - p)) / e**2
    return math.ceil(n)

# Contoh: sekolah Abbas punya 800 siswa
populasi = 800

print("=== Ukuran Sampel Minimal (Rumus Slovin) ===")
for margin in [0.05, 0.08, 0.10]:
    n = hitung_sampel_slovin(populasi, margin)
    print(f"  Margin error {margin*100:.0f}%: minimal {n} responden")

print("\n=== Ukuran Sampel Estimasi Proporsi (populasi besar) ===")
for margin in [0.05, 0.08, 0.10]:
    n = hitung_sampel_proporsi(e=margin)
    print(f"  Margin error {margin*100:.0f}%: minimal {n} responden")

print("\n--- Untuk survey sekolah biasanya cukup pakai Slovin dengan e=10% ---")
Tantangan Akhir Minggu: Survey Abbas sudah siap untuk disebarkan. Sebelum itu, buat dokumen satu halaman yang mencakup: (1) judul penelitian dan tujuannya, (2) definisi populasi target, (3) metode sampling yang dipilih beserta alasannya, (4) ukuran sampel minimal dan bagaimana cara mencapainya, (5) jadwal distribusi dan batas waktu, serta (6) rencana analisis awal setelah data terkumpul. Dokumen ini adalah "research brief" pertama Abbas sebagai data analyst.

Minggu 3: Analisis Data Survey

Survey sudah disebarkan dan data sudah terkumpul. Minggu ini Abbas belajar mengolah data respons mentah menjadi insight yang bisa dikomunikasikan. Mulai dari pembersihan data, analisis distribusi jawaban, hingga pengujian konsistensi instrumen dengan Cronbach's Alpha.

Hari 1
Membaca dan Membersihkan Data Survey Mentah
Impor file CSV hasil Google Forms ke Pandas. Periksa struktur awal: jumlah baris, nama kolom, tipe data tiap kolom, dan jumlah missing values. Catat semua anomali yang ditemukan sebelum mulai membersihkan.
Bersihkan kolom Timestamp: pastikan tipe data sudah datetime, lalu ekstrak informasi tambahan seperti hari pengisian dan jam pengisian. Analisis apakah ada pola waktu yang mencurigakan (misalnya banyak respons masuk dalam rentang 1 menit, bisa mengindikasikan bot atau satu orang mengisi berkali-kali).
Tangani duplikat: identifikasi baris yang kemungkinan diisi oleh orang yang sama dengan cara membandingkan kombinasi kolom demografis. Putuskan apakah akan dihapus atau dipertahankan, dan dokumentasikan keputusan tersebut beserta alasannya.
Standardisasi jawaban teks: ubah variasi penulisan menjadi format seragam (misalnya "Laki-laki", "laki laki", "L" semuanya diubah menjadi "Laki-laki"). Buat kamus mapping untuk tiap kolom yang perlu distandarisasi.
import pandas as pd
import numpy as np

# Simulasi data mentah Google Forms yang belum bersih
np.random.seed(55)
n = 80

raw_data = pd.DataFrame({
    'Timestamp': pd.to_datetime(
        pd.date_range('2024-02-01 07:00', periods=n, freq='18min').tolist()
    ).astype(str),
    'Nama (opsional)': [''] * n,
    'Jenis Kelamin': np.random.choice(
        ['Laki-laki', 'Perempuan', 'L', 'P', 'laki-laki', 'perempuan',
         'LAKI-LAKI', None], n
    ),
    'Kelas': np.random.choice(['X', 'XI', 'XII', 'kelas 10', 'kelas 11', '10', '11'], n),
    'Kepuasan Belajar (1-5)': np.random.choice([1, 2, 3, 4, 5, None], n,
                                                p=[0.05, 0.10, 0.30, 0.35, 0.15, 0.05]),
})

print('=== Data Mentah ===')
print(raw_data.head(8).to_string())
print(f'\nShape: {raw_data.shape}')
print(f'\nMissing values:\n{raw_data.isnull().sum()}')

# Bersihkan Timestamp
raw_data['Timestamp'] = pd.to_datetime(raw_data['Timestamp'])
raw_data['hari_pengisian'] = raw_data['Timestamp'].dt.day_name()
raw_data['jam_pengisian'] = raw_data['Timestamp'].dt.hour

# Standardisasi Jenis Kelamin
mapping_gender = {
    'L': 'Laki-laki', 'laki-laki': 'Laki-laki', 'LAKI-LAKI': 'Laki-laki',
    'P': 'Perempuan', 'perempuan': 'Perempuan'
}
raw_data['Jenis Kelamin'] = raw_data['Jenis Kelamin'].replace(mapping_gender)

print('\n=== Setelah Standardisasi Gender ===')
print(raw_data['Jenis Kelamin'].value_counts(dropna=False))
Refleksi: Abbas mungkin menemukan respons yang terasa tidak serius, misalnya jawaban "aaaaaa" di kolom nama, atau pola pilihan yang tidak masuk akal. Kapan sebuah respons layak dihapus dan kapan sebaiknya dipertahankan? Apa yang terjadi pada hasil analisis jika Abbas terlalu agresif menghapus data?
Hari 2
Analisis Distribusi Jawaban: Dari Angka ke Cerita
Hitung distribusi frekuensi untuk setiap pertanyaan kategoris dan Likert. Buat tabel ringkasan yang menampilkan jumlah dan persentase untuk setiap pilihan jawaban. Urutkan berdasarkan frekuensi agar mudah dibaca.
Untuk skala Likert, hitung mean, median, dan modus. Identifikasi apakah distribusinya condong ke kiri (positif), kanan (negatif), atau simetris. Buat histogram untuk setiap pertanyaan Likert.
Lakukan cross-tabulation: bandingkan distribusi jawaban antar kelompok demografis. Contoh: apakah kepuasan belajar berbeda antara siswa kelas X dan XII? Gunakan pd.crosstab() dan visualisasikan sebagai heatmap atau grouped bar chart.
Identifikasi satu insight menarik dari data yang Abbas temukan saat analisis. Tuliskan dalam satu kalimat yang jelas: "Abbas menemukan bahwa siswa yang [X] cenderung [Y] dibandingkan yang [Z]."
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(77)
n = 100

df = pd.DataFrame({
    'kelas': np.random.choice(['X', 'XI', 'XII'], n, p=[0.35, 0.40, 0.25]),
    'kepuasan_belajar': np.random.choice([1,2,3,4,5], n, p=[0.05,0.15,0.30,0.35,0.15]),
    'jam_belajar_hari': np.random.choice(['<1', '1-2', '2-3', '>3'], n, p=[0.10,0.40,0.35,0.15]),
    'metode_utama': np.random.choice(
        ['Baca buku', 'Video', 'Les privat', 'Diskusi'], n, p=[0.20,0.45,0.15,0.20]
    )
})

# Distribusi frekuensi Likert
print('=== Kepuasan Belajar (1-5) ===')
freq = df['kepuasan_belajar'].value_counts().sort_index()
pct = df['kepuasan_belajar'].value_counts(normalize=True).sort_index() * 100
ringkasan_likert = pd.DataFrame({'Jumlah': freq, 'Persen (%)': pct.round(1)})
print(ringkasan_likert)
print(f"Mean: {df['kepuasan_belajar'].mean():.2f} | Median: {df['kepuasan_belajar'].median()}")

# Cross-tabulation: kepuasan vs kelas
print('\n=== Cross-tab: Rata-rata Kepuasan per Kelas ===')
print(df.groupby('kelas')['kepuasan_belajar'].agg(['mean', 'count']).round(2))

# Crosstab distribusi metode belajar per kelas
print('\n=== Cross-tab: Metode Belajar per Kelas ===')
ct = pd.crosstab(df['kelas'], df['metode_utama'], normalize='index') * 100
print(ct.round(1))
Tantangan: Buat visualisasi gabungan dalam satu figure dengan tiga subplot: (1) pie chart distribusi metode belajar, (2) bar chart distribusi Likert kepuasan belajar per kelas, (3) heatmap crosstab metode belajar vs kelas. Tambahkan judul yang jelas dan label yang informatif untuk setiap subplot.
Hari 3
Analisis Teks Open-ended: Menemukan Tema dari Kata-Kata
Pelajari teknik analisis teks dasar untuk open-ended responses: word frequency (kata apa yang paling sering muncul), bigram analysis (pasangan dua kata yang sering bersamaan), dan manual thematic coding (kelompokkan respons ke dalam beberapa tema utama secara manual).
Lakukan preprocessing teks minimal: lowercase, hapus tanda baca, dan hapus stopwords (kata umum seperti "dan", "yang", "di", "untuk" yang tidak informatif). Buat daftar stopwords Bahasa Indonesia sendiri dari minimal 20 kata paling umum.
Kategorisasikan respons open-ended secara manual ke dalam 4-6 tema. Buat kolom baru di DataFrame untuk menyimpan hasil kategorisasi. Hitung proporsi setiap tema dan buat bar chart horizontal untuk memvisualisasikannya.
Pilih 3 respons yang paling representatif untuk setiap tema. Kutipan ini akan digunakan sebagai "supporting quotes" dalam laporan akhir survey untuk memperkuat temuan kuantitatif dengan suara responden yang nyata.
import pandas as pd
import re
from collections import Counter

# Stopwords Bahasa Indonesia (daftar minimal)
STOPWORDS_ID = {
    'yang', 'dan', 'di', 'ke', 'dari', 'untuk', 'dengan', 'ini', 'itu',
    'adalah', 'ada', 'tidak', 'saya', 'aku', 'kamu', 'mereka', 'kita',
    'sudah', 'akan', 'bisa', 'juga', 'lebih', 'atau', 'tapi', 'karena',
    'jadi', 'saat', 'kalau', 'sangat', 'masih', 'dalam', 'sering', 'pernah'
}

respons_teks = [
    'matematika terlalu sulit dan soalnya membingungkan',
    'kurang waktu karena banyak kegiatan ekstrakurikuler',
    'tidak ada buku yang cocok untuk belajar mandiri',
    'matematika susah apalagi bagian aljabar',
    'banyak tugas menumpuk dari berbagai mata pelajaran',
    'waktu belajar sedikit karena pulang sekolah sudah malam',
    'guru menjelaskan terlalu cepat sehingga sulit diikuti',
    'tidak ada teman yang bisa diajak diskusi materi sulit',
    'buku pelajaran tidak tersedia di perpustakaan',
    'terlalu banyak tugas sehingga tidak sempat memahami materi',
]

def preprocess(teks):
    teks = teks.lower()
    teks = re.sub(r'[^\w\s]', '', teks)
    kata = teks.split()
    return [k for k in kata if k not in STOPWORDS_ID and len(k) > 2]

# Word frequency
semua_kata = []
for r in respons_teks:
    semua_kata.extend(preprocess(r))

word_freq = Counter(semua_kata).most_common(15)
print('=== 15 Kata Terbanyak (setelah preprocessing) ===')
for kata, count in word_freq:
    bar = '#' * count
    print(f'  {kata:<20} {bar} ({count})')

# Kategorisasi manual
def kategorikan(respons):
    r = respons.lower()
    if any(w in r for w in ['matematika', 'aljabar', 'soal', 'sulit', 'susah']):
        return 'Kesulitan Materi'
    elif any(w in r for w in ['waktu', 'malam', 'tugas', 'menumpuk', 'banyak']):
        return 'Manajemen Waktu'
    elif any(w in r for w in ['buku', 'perpustakaan', 'tersedia']):
        return 'Akses Sumber Belajar'
    elif any(w in r for w in ['guru', 'menjelaskan', 'cepat']):
        return 'Metode Pengajaran'
    elif any(w in r for w in ['teman', 'diskusi']):
        return 'Lingkungan Sosial'
    return 'Lainnya'

df_teks = pd.DataFrame({'respons': respons_teks})
df_teks['tema'] = df_teks['respons'].apply(kategorikan)
print('\n=== Distribusi Tema ===')
print(df_teks['tema'].value_counts())
Catatan Metode: Kategorisasi manual teks rentan terhadap bias peneliti. Untuk meningkatkan reliabilitas, idealnya dua peneliti mengkategorikan secara independen lalu hasilnya dibandingkan. Tingkat kesepakatan antar peneliti (inter-rater reliability) bisa diukur dengan Cohen's Kappa.
Hari 4
Validitas dan Reliabilitas: Cronbach's Alpha
Pahami perbedaan validitas (apakah instrumen mengukur apa yang seharusnya diukur) dan reliabilitas (apakah instrumen menghasilkan jawaban yang konsisten jika diulang). Keduanya berbeda namun sama-sama diperlukan untuk survey yang berkualitas.
Pelajari Cronbach's Alpha: koefisien yang mengukur konsistensi internal kelompok pertanyaan Likert yang seharusnya mengukur konstruk yang sama. Nilai alpha antara 0.7-0.9 dianggap baik. Di bawah 0.6 artinya pertanyaan- pertanyaan tersebut tidak mengukur hal yang sama dan perlu direvisi.
Hitung Cronbach's Alpha untuk kelompok pertanyaan Likert dalam survey Abbas. Identifikasi pertanyaan mana yang jika dihapus akan meningkatkan nilai alpha (gunakan teknik "alpha if item deleted"). Pertanyaan dengan kontribusi negatif perlu dievaluasi ulang.
Pelajari konsep construct validity lebih jauh: bandingkan jawaban responden di pertanyaan yang seharusnya berkorelasi (misalnya "frekuensi belajar" dan "kepuasan nilai") menggunakan korelasi Pearson.
import pandas as pd
import numpy as np

np.random.seed(88)
n = 100

# Simulasi: 5 pertanyaan Likert yang mengukur "Motivasi Belajar"
# Q1-Q4 benar-benar terkait motivasi, Q5 adalah pertanyaan asing
base = np.random.normal(3, 0.8, n)

df_alpha = pd.DataFrame({
    'Q1_target_belajar':    (base + np.random.normal(0, 0.3, n)).clip(1, 5).round(),
    'Q2_semangat_sekolah':  (base + np.random.normal(0, 0.4, n)).clip(1, 5).round(),
    'Q3_rajin_pr':          (base + np.random.normal(0, 0.35, n)).clip(1, 5).round(),
    'Q4_suka_belajar':      (base + np.random.normal(0, 0.3, n)).clip(1, 5).round(),
    'Q5_jarak_ke_sekolah':  np.random.randint(1, 6, n).astype(float),
})

def cronbach_alpha(df):
    # Hitung Cronbach's Alpha dari DataFrame pertanyaan Likert
    k = df.shape[1]
    var_items = df.var(axis=0, ddof=1).sum()
    var_total = df.sum(axis=1).var(ddof=1)
    return (k / (k - 1)) * (1 - var_items / var_total)

# Alpha keseluruhan
alpha_all = cronbach_alpha(df_alpha)
print(f"Cronbach's Alpha (semua 5 pertanyaan): {alpha_all:.4f}")

# Alpha jika satu pertanyaan dihapus
print('\n=== Alpha If Item Deleted ===')
for col in df_alpha.columns:
    df_tanpa = df_alpha.drop(columns=[col])
    alpha_tanpa = cronbach_alpha(df_tanpa)
    delta = alpha_tanpa - alpha_all
    arah = 'naik' if delta > 0 else 'turun'
    print(f'  Tanpa {col}: {alpha_tanpa:.4f} ({arah} {abs(delta):.4f})')

print('\n--- Q5 yang tidak terkait akan meningkatkan alpha jika dihapus ---')
Tantangan: Tambahkan pertanyaan keenam yang seharusnya berkorelasi kuat dengan Q1-Q4 (masih tentang motivasi belajar). Hitung ulang alpha dan "alpha if item deleted". Bandingkan hasilnya dengan dan tanpa Q5. Apa yang dapat Abbas simpulkan tentang cara memilih dan menguji pertanyaan survey sebelum disebarkan?
Hari 5
Visualisasi Hasil Survey: Dashboard Ringkasan
Buat figure ringkasan hasil survey yang terdiri dari 4-6 visualisasi: distribusi demografis responden, distribusi jawaban untuk pertanyaan utama, perbandingan antar kelompok, dan satu chart yang menampilkan insight paling penting dari seluruh survey.
Pastikan setiap visualisasi punya: judul yang jelas, label sumbu yang informatif, satuan atau persentase yang eksplisit, dan anotasi pada titik data penting. Warna yang digunakan konsisten dan ramah akses untuk pengguna buta warna.
Buat ringkasan statistik dalam format tabel: jumlah responden, completion rate (jika ada pertanyaan opsional), mean dan standar deviasi untuk semua skala Likert, dan top-3 pilihan untuk setiap pertanyaan kategoris.
Ekspor seluruh visualisasi ke file PNG dengan resolusi tinggi (dpi=150). Susun dalam satu PDF atau folder yang rapi untuk digunakan dalam laporan Minggu 4.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

np.random.seed(42)
n = 100

df = pd.DataFrame({
    'kelas': np.random.choice(['X', 'XI', 'XII'], n, p=[0.33, 0.40, 0.27]),
    'jk': np.random.choice(['Laki-laki', 'Perempuan'], n, p=[0.48, 0.52]),
    'kepuasan': np.random.choice([1,2,3,4,5], n, p=[0.05,0.12,0.28,0.38,0.17]),
    'metode': np.random.choice(['Baca', 'Video', 'Les', 'Diskusi'], n),
    'jam_belajar': np.random.choice(['<1j', '1-2j', '2-3j', '>3j'], n,
                                     p=[0.10, 0.38, 0.35, 0.17])
})

fig = plt.figure(figsize=(14, 10))
fig.suptitle('Ringkasan Hasil Survey: Kebiasaan Belajar Siswa', fontsize=14, fontweight='bold')
gs = gridspec.GridSpec(2, 3, figure=fig, hspace=0.45, wspace=0.35)

# Panel 1: Distribusi kelas
ax1 = fig.add_subplot(gs[0, 0])
df['kelas'].value_counts().sort_index().plot(kind='bar', ax=ax1, color='#4C72B0', edgecolor='white')
ax1.set_title('Distribusi Kelas Responden', fontsize=10)
ax1.set_ylabel('Jumlah'); ax1.set_xlabel('')
ax1.tick_params(axis='x', rotation=0)

# Panel 2: Distribusi Likert kepuasan
ax2 = fig.add_subplot(gs[0, 1])
counts = df['kepuasan'].value_counts().sort_index()
bars = ax2.bar(counts.index, counts.values, color='#55A868', edgecolor='white')
ax2.set_title('Kepuasan Belajar (1-5)', fontsize=10)
ax2.set_xlabel('Skor'); ax2.set_ylabel('Jumlah')
for bar, val in zip(bars, counts.values):
    ax2.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.5,
             str(val), ha='center', va='bottom', fontsize=9)

# Panel 3: Metode belajar
ax3 = fig.add_subplot(gs[0, 2])
df['metode'].value_counts().plot(kind='barh', ax=ax3, color='#C44E52', edgecolor='white')
ax3.set_title('Metode Belajar Utama', fontsize=10)
ax3.set_xlabel('Jumlah')

# Panel 4: Kepuasan per kelas
ax4 = fig.add_subplot(gs[1, :2])
crosstab = pd.crosstab(df['kelas'], df['kepuasan'], normalize='index') * 100
crosstab.plot(kind='bar', ax=ax4, colormap='RdYlGn', edgecolor='white', width=0.7)
ax4.set_title('Distribusi Kepuasan Belajar per Kelas (%)', fontsize=10)
ax4.set_xlabel('Kelas'); ax4.set_ylabel('Persentase (%)')
ax4.tick_params(axis='x', rotation=0)
ax4.legend(title='Skor', bbox_to_anchor=(1.01, 1), loc='upper left', fontsize=8)

# Panel 5: Jam belajar
ax5 = fig.add_subplot(gs[1, 2])
urutan = ['<1j', '1-2j', '2-3j', '>3j']
jam_ct = df['jam_belajar'].value_counts().reindex(urutan)
ax5.pie(jam_ct.values, labels=urutan, autopct='%1.0f%%',
        colors=['#FDD878', '#F4A261', '#E76F51', '#C44E52'], startangle=90)
ax5.set_title('Jam Belajar per Hari', fontsize=10)

plt.savefig('/tmp/survey_ringkasan.png', dpi=150, bbox_inches='tight')
print('Dashboard disimpan ke /tmp/survey_ringkasan.png')
Persiapan Minggu 4: Abbas sekarang punya semua bahan untuk laporan: data bersih, analisis distribusi, analisis teks, nilai Cronbach's Alpha, dan visualisasi ringkasan. Minggu depan Abbas akan menyusun semuanya menjadi laporan yang bisa dipresentasikan kepada audiens nyata.

Minggu 4: Pelaporan Hasil Survey

Minggu terakhir Bulan 8 adalah tentang mengomunikasikan temuan. Data yang sudah dianalisis tidak bernilai jika tidak bisa dipahami oleh orang lain. Abbas akan belajar menyusun laporan yang jelas, membuat presentasi yang persuasif, dan menyelesaikan Proyek P4: Mini Survey sebagai puncak dari bulan ini.

Hari 1
Struktur Laporan Penelitian Survey
Pelajari struktur standar laporan survey: Pendahuluan (latar belakang dan tujuan penelitian), Metode (populasi, sampling, instrumen, periode pengumpulan data), Hasil (statistik deskriptif dan temuan utama), Diskusi (interpretasi, keterbatasan, implikasi), dan Kesimpulan.
Buat outline laporan Abbas berdasarkan struktur di atas. Untuk setiap bagian, tulis dua sampai tiga kalimat yang akan menjadi isi dari bagian tersebut. Outline ini adalah kerangka kerja sebelum Abbas menulis teks penuh.
Pahami perbedaan antara Hasil (fakta dari data, tanpa interpretasi) dan Diskusi (interpretasi, penjelasan kemungkinan, hubungan dengan teori atau penelitian sebelumnya). Banyak laporan pemula mencampur keduanya dalam satu bagian.
Identifikasi tiga keterbatasan penelitian Abbas: aspek apa dari metodologi atau proses pengumpulan data yang bisa memengaruhi validitas temuan. Keterbatasan ini harus ditulis jujur di bagian Diskusi, bukan disembunyikan.
# Template struktur laporan (panduan penulisan)

laporan_template = {
    'judul': 'Analisis Kebiasaan Belajar Siswa SMA: Studi Survey 2024',

    'pendahuluan': {
        'latar_belakang': '[Mengapa topik ini penting? Apa yang belum diketahui?]',
        'tujuan_penelitian': '[3-4 tujuan spesifik dalam bentuk poin]',
        'pertanyaan_penelitian': '[2-3 pertanyaan yang dijawab oleh survey ini]'
    },

    'metode': {
        'populasi': '[Definisi populasi target]',
        'sampel': '[Jumlah responden, metode sampling, kriteria inklusi/eksklusi]',
        'instrumen': '[Jumlah pertanyaan, jenis skala, cara validasi]',
        'periode': '[Tanggal mulai dan selesai pengumpulan data]',
        'analisis': '[Metode analisis yang digunakan]'
    },

    'hasil': {
        'profil_responden': '[Demografis: kelas, jenis kelamin, distribusi]',
        'temuan_utama': [
            'Temuan 1: [fakta dari data tanpa interpretasi]',
            'Temuan 2: [fakta dari data tanpa interpretasi]',
            'Temuan 3: [fakta dari data tanpa interpretasi]'
        ],
        'reliabilitas_instrumen': '[Nilai Cronbach Alpha dan interpretasinya]'
    },

    'diskusi': {
        'interpretasi': '[Mengapa temuan bisa seperti ini?]',
        'keterbatasan': [
            'Keterbatasan 1: [aspek metodologi yang membatasi generalisasi]',
            'Keterbatasan 2: [potensi bias yang tidak bisa dihilangkan]',
            'Keterbatasan 3: [hal lain yang perlu diakui jujur]'
        ],
        'implikasi': '[Apa yang bisa dilakukan berdasarkan temuan ini?]'
    },

    'kesimpulan': '[Rangkuman 3-5 kalimat tentang apa yang ditemukan]'
}

for bagian, isi in laporan_template.items():
    print(f'\n[{bagian.upper()}]')
    if isinstance(isi, dict):
        for sub, val in isi.items():
            preview = str(val)[:60] + '...' if len(str(val)) > 60 else str(val)
            print(f'  {sub}: {preview}')
    else:
        print(f'  {isi}')
Prinsip Laporan yang Baik: Setiap klaim harus didukung oleh angka. Setiap angka harus didukung oleh konteks. "Sebagian besar responden memilih video" lemah. "67 dari 100 responden (67%) menyatakan video YouTube sebagai metode belajar utama mereka, lebih tinggi dari metode lainnya" kuat.
Hari 2
Menulis Laporan: Bagian Metode dan Hasil
Tulis bagian Metode secara penuh: minimal 300 kata yang mendeskripsikan populasi dan sampel, instrumen survey (jumlah dan jenis pertanyaan), cara distribusi dan pengumpulan data, serta metode analisis yang digunakan. Cukup detail sehingga orang lain bisa mereplikasi penelitian ini jika diperlukan.
Tulis bagian Profil Responden: tabel atau narasi yang mendeskripsikan siapa responden survei ini (kelas, jenis kelamin, atau variabel demografis lain yang dikumpulkan). Sertakan visualisasi yang sesuai dan sudah dibuat di Minggu 3.
Tulis bagian Hasil Utama: untuk setiap pertanyaan penelitian, tulis satu paragraf yang memaparkan temuan faktual dengan angka spesifik. Rujuk visualisasi yang sudah dibuat sebagai "Gambar 1", "Gambar 2", dst.
Sertakan satu kutipan langsung dari respons open-ended yang paling mewakili setiap tema utama. Format kutipan dengan benar: "teks kutipan" (Responden, Kelas XI). Kutipan membuat laporan lebih hidup dan meyakinkan.
import pandas as pd
import numpy as np

np.random.seed(22)
n = 87

df = pd.DataFrame({
    'kelas': np.random.choice(['X', 'XI', 'XII'], n, p=[0.34, 0.41, 0.25]),
    'jk': np.random.choice(['Laki-laki', 'Perempuan'], n, p=[0.46, 0.54]),
    'kepuasan': np.random.choice([1,2,3,4,5], n, p=[0.05,0.12,0.28,0.38,0.17]),
    'metode': np.random.choice(
        ['Baca buku', 'Video', 'Les privat', 'Diskusi'], n,
        p=[0.20, 0.46, 0.14, 0.20]
    )
})

# Otomatisasi teks profil responden
total = len(df)
per_kelas = df['kelas'].value_counts().sort_index()
per_jk = df['jk'].value_counts()

print('=== PROFIL RESPONDEN ===\n')
print(f'Total responden yang memenuhi syarat: {total} orang.')
for kls, jumlah in per_kelas.items():
    pct = jumlah / total * 100
    print(f'  Kelas {kls}: {jumlah} responden ({pct:.1f}%)')

print()
for jk, jumlah in per_jk.items():
    pct = jumlah / total * 100
    print(f'  {jk}: {jumlah} responden ({pct:.1f}%)')

print('\n=== TEMUAN UTAMA ===\n')
top_metode = df['metode'].value_counts().idxmax()
top_pct = df['metode'].value_counts(normalize=True).max() * 100
mean_kepuasan = df['kepuasan'].mean()

print(f"Metode belajar yang paling banyak dipilih adalah '{top_metode}'")
print(f'dengan {top_pct:.1f}% responden memilihnya sebagai metode utama.')
print()
kategori = 'cukup puas' if mean_kepuasan >= 3 else 'kurang puas'
print(f'Rata-rata kepuasan belajar: {mean_kepuasan:.2f} dari skala 1-5 ({kategori}).')
Refleksi: Abbas sedang menulis laporan penelitian pertama. Bagian mana yang terasa paling sulit untuk ditulis: Metode, Hasil, atau Diskusi? Kesulitan di bagian Metode biasanya menandakan penelitian yang kurang terencana dari awal. Kesulitan di Diskusi sering berarti data belum cukup dipahami secara mendalam. Apa pelajaran yang Abbas ambil untuk penelitian berikutnya?
Hari 3
Diskusi, Keterbatasan, dan Rekomendasi
Tulis bagian Diskusi: interpretasikan setiap temuan utama. Ajukan pertanyaan "mengapa?" untuk setiap angka yang ditemukan. Kaitkan dengan teori atau logika sehari-hari yang masuk akal. Hindari mengulang angka yang sudah ada di bagian Hasil.
Tulis bagian Keterbatasan dengan jujur dan spesifik: bukan hanya "sampel kecil" tetapi "sampel 87 responden dari satu sekolah membatasi kemampuan generalisasi ke populasi siswa SMA yang lebih luas." Keterbatasan yang ditulis dengan baik justru menunjukkan kedewasaan sebagai peneliti.
Tulis bagian Rekomendasi: berikan 3-5 rekomendasi konkret dan actionable berdasarkan temuan. Rekomendasi harus ditujukan kepada pihak tertentu (guru, sekolah, siswa, atau orang tua) dan harus bisa dilaksanakan secara realistis.
Tulis bagian Kesimpulan: rangkum 3-5 kalimat yang menjawab pertanyaan penelitian awal secara langsung. Tidak perlu angka baru, cukup simpulan dari keseluruhan temuan dan diskusi.
# Panduan menulis diskusi: template pertanyaan pemandu

pertanyaan_diskusi = {
    '46% responden memilih video sebagai metode belajar utama': [
        'Mengapa video lebih populer dari metode lain?',
        'Apa implikasi bagi guru yang masih menggunakan metode ceramah?',
        'Apakah ada penjelasan alternatif selain yang paling obvious?'
    ],
    'Mean kepuasan belajar 3.42 dari 5': [
        'Apa yang membuat siswa merasa belum sangat puas?',
        'Apakah ada perbedaan kepuasan antar kelas atau jenis kelamin?',
        'Faktor apa dari open-ended yang mungkin menjelaskan angka ini?'
    ],
    'Tema Manajemen Waktu paling dominan di open-ended': [
        'Mengapa waktu menjadi hambatan utama, bukan materi yang sulit?',
        'Apakah ini terkait dengan beban ekstrakurikuler atau jadwal sekolah?',
        'Rekomendasi apa yang bisa diberikan kepada siswa dan sekolah?'
    ]
}

print('=== TEMPLATE PANDUAN DISKUSI ===\n')
for temuan, pertanyaan in pertanyaan_diskusi.items():
    print(f'TEMUAN: {temuan}')
    print('Pertanyaan untuk dikembangkan menjadi paragraf diskusi:')
    for i, q in enumerate(pertanyaan, 1):
        print(f'  {i}. {q}')
    print()

print('--- Setiap pertanyaan bisa menjadi 2-3 kalimat dalam paragraf diskusi ---')
Tantangan: Tulis satu paragraf diskusi yang lengkap (minimal 150 kata) untuk temuan paling menarik dari survey Abbas. Paragraf tersebut harus mencakup: pernyataan temuan, interpretasi mengapa ini bisa terjadi, hubungan dengan temuan lain dalam survey yang sama, dan satu rekomendasi konkret yang mengikuti dari temuan ini.
Hari 4
Presentasi Hasil: Dari Laporan ke Slide
Pelajari prinsip data storytelling: bukan semua angka perlu ditampilkan, pilih 3-5 temuan terkuat yang membentuk narasi yang koheren. Setiap slide harus punya satu pesan utama yang bisa dibaca dalam 5 detik.
Susun 8-10 slide presentasi dengan struktur: (1) judul dan konteks, (2) tujuan dan pertanyaan penelitian, (3) profil responden, (4) temuan utama 1 dengan visualisasi, (5) temuan utama 2 dengan visualisasi, (6) temuan utama 3 dengan visualisasi, (7) insight dari open-ended, (8) rekomendasi, (9) keterbatasan, (10) penutup dan tanya jawab.
Pilih satu visualisasi yang akan menjadi "hero chart" dari presentasi: satu gambar yang paling kuat merepresentasikan keseluruhan temuan. Buat versi yang lebih besar dan lebih detail dari chart tersebut khusus untuk presentasi.
Latihan presentasi 5 menit dengan timer. Ukur berapa slide yang berhasil disampaikan dalam 5 menit. Jika terlalu panjang, identifikasi bagian yang bisa dipotong tanpa mengurangi pesan utama.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(11)
n = 87

df = pd.DataFrame({
    'kepuasan': np.random.choice([1,2,3,4,5], n, p=[0.05,0.12,0.28,0.38,0.17]),
    'kelas': np.random.choice(['X', 'XI', 'XII'], n, p=[0.34, 0.41, 0.25])
})

# Hero chart: kepuasan per kelas dengan anotasi
fig, ax = plt.subplots(figsize=(9, 5))

kelas_means = df.groupby('kelas')['kepuasan'].mean().sort_index()
kelas_sem = df.groupby('kelas')['kepuasan'].sem()

colors = ['#4C72B0', '#55A868', '#C44E52']
bars = ax.bar(kelas_means.index, kelas_means.values, color=colors,
              edgecolor='white', linewidth=1.5, width=0.55,
              yerr=kelas_sem.values, capsize=5,
              error_kw={'ecolor': '#333', 'linewidth': 1})

ax.set_ylim(0, 5.5)
ax.set_ylabel('Rata-rata Kepuasan Belajar (1-5)', fontsize=11)
ax.set_xlabel('Kelas', fontsize=11)
ax.set_title(
    'Kepuasan Belajar Meningkat Seiring Jenjang Kelas\n(n=87, error bar = SEM)',
    fontsize=12, fontweight='bold', pad=12
)

grand_mean = df['kepuasan'].mean()
ax.axhline(y=grand_mean, color='gray', linestyle='--', linewidth=1, alpha=0.7)
ax.text(2.6, grand_mean + 0.08,
        f'Rata-rata keseluruhan: {grand_mean:.2f}',
        fontsize=9, color='gray')

for bar, mean_val in zip(bars, kelas_means.values):
    ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.18,
            f'{mean_val:.2f}', ha='center', fontsize=11, fontweight='bold')

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tight_layout()
plt.savefig('/tmp/hero_chart.png', dpi=150, bbox_inches='tight')
print('Hero chart disimpan ke /tmp/hero_chart.png')
Prinsip Slide yang Baik: Judul slide harus menjadi kesimpulan, bukan label. "Kepuasan Belajar per Kelas" adalah label. "Kepuasan Belajar Meningkat Seiring Jenjang Kelas" adalah kesimpulan. Audiens bisa memahami pesan utama hanya dari membaca judul slide, bahkan tanpa melihat chart-nya.
Hari 5
P4: Mini Survey -- Finalisasi dan Refleksi Proyek
Selesaikan dan kumpulkan seluruh deliverable Proyek P4: (1) file survey Google Forms (link atau tangkapan layar), (2) dataset mentah dalam CSV, (3) notebook Python dengan seluruh proses analisis dari cleaning hingga visualisasi akhir, (4) laporan tertulis lengkap (minimal 800 kata), dan (5) file presentasi slide.
Lakukan self-review akhir: bandingkan proyek yang diselesaikan dengan checklist penelitian dari Hari 5 Minggu 1. Berapa banyak item yang berhasil dipenuhi? Item mana yang tidak sempat dipenuhi dan mengapa?
Tulis retrospektif proyek: satu halaman yang menjawab tiga pertanyaan: Apa yang berjalan baik? Apa yang akan dilakukan berbeda jika mengulang proyek ini dari awal? Skill apa yang terasa paling baru atau paling berguna dari seluruh Bulan 8?
Buat dokumen ringkasan satu halaman dari Proyek P4 yang bisa disimpan sebagai portofolio: judul, deskripsi singkat metodologi, tiga temuan utama, dan link ke notebook serta laporan lengkap. Ini adalah item pertama di portofolio data analyst Abbas.
# Checklist akhir Proyek P4: Mini Survey

deliverables = {
    'Survey Instrument': {
        'item': 'File Google Forms (link aktif atau PDF)',
        'kriteria': 'Semua pertanyaan terbaca jelas, ada disclaimer anonimitas'
    },
    'Dataset Mentah': {
        'item': 'File CSV hasil ekspor (anonim, tidak ada nama lengkap)',
        'kriteria': 'Minimal 30 responden, semua kolom header jelas'
    },
    'Notebook Analisis': {
        'item': 'File .ipynb dengan kode berjalan dari awal hingga akhir',
        'kriteria': 'Setiap sel punya output, ada komentar penjelasan'
    },
    'Laporan Tertulis': {
        'item': 'Dokumen dengan 5 bagian standar (Pendahuluan sampai Kesimpulan)',
        'kriteria': 'Minimal 800 kata, setiap klaim didukung angka'
    },
    'Presentasi': {
        'item': 'File slide (PPT, Google Slides, atau PDF) 8-10 slide',
        'kriteria': 'Setiap slide punya satu pesan utama, visualisasi terbaca jelas'
    },
    'Retrospektif': {
        'item': 'Dokumen refleksi satu halaman',
        'kriteria': 'Menjawab: apa yang baik, apa yang akan diubah, pelajaran terbesar'
    }
}

print('=== CHECKLIST DELIVERABLE P4: MINI SURVEY ===\n')
for nama, detail in deliverables.items():
    print(f'[ ] {nama}')
    print(f"    File    : {detail['item']}")
    print(f"    Kriteria: {detail['kriteria']}")
    print()

print('=' * 50)
print('Semua item di atas harus selesai sebelum Abbas')
print('melanjutkan ke Bulan 9: Machine Learning.')
print('=' * 50)

print('\n=== KOMPETENSI YANG DIPEROLEH DI BULAN 8 ===')
capaian = [
    'Merancang penelitian: memilih jenis, metode sampling, dan hipotesis',
    'Mendeteksi dan memitigasi berbagai jenis bias dalam penelitian',
    'Membuat survey yang valid dengan pertanyaan Likert dan open-ended',
    'Menggunakan Google Forms untuk pengumpulan data secara profesional',
    'Membersihkan data survey mentah dengan Pandas',
    'Menganalisis distribusi jawaban dan melakukan cross-tabulation',
    'Menganalisis teks open-ended dengan word frequency dan kategorisasi',
    "Menghitung dan menginterpretasikan Cronbach's Alpha",
    'Menulis laporan penelitian lengkap dengan struktur standar',
    'Membuat presentasi berbasis data dengan data storytelling'
]
for i, item in enumerate(capaian, 1):
    print(f'  {i:2d}. {item}')
Ke Bulan 9: Abbas sudah memiliki seluruh fondasi untuk menjadi data analyst yang solid: Python, statistik, spreadsheet, SQL, Pandas, visualisasi, inferensial, dan sekarang research methods. Bulan 9 akan membawa Abbas ke wilayah yang lebih canggih: Machine Learning. Semua yang dipelajari hingga kini akan menjadi bekal yang sangat berguna di sana.

Buku Pendukung Bulan 08

Empat referensi ini memperdalam pemahaman Abbas tentang metodologi riset dan analisis survey, dari level praktis hingga konseptual.

B1
Survey Research Methods
Floyd J. Fowler Jr.
Referensi klasik yang membahas desain survey secara komprehensif: dari formulasi pertanyaan, pemilihan sampel, hingga analisis non-response. Bahasa teknis tapi sangat sistematis. Cocok dibaca secara bertahap bersamaan dengan praktik langsung di Minggu 1 dan 2.
Survey Design Sampling Non-response
B2
Designing Effective Questionnaires
Ian Brace
Panduan praktis yang fokus pada penulisan pertanyaan survey yang efektif dan tidak menyesatkan. Berisi banyak contoh pertanyaan baik dan buruk beserta penjelasan mengapa. Relevan langsung dengan materi Hari 3 Minggu 2 tentang leading questions dan double-barreled questions.
Questionnaire Design Question Wording Bias Reduction
B3
Storytelling with Data
Cole Nussbaumer Knaflic
Meski bukan tentang survey secara spesifik, buku ini sangat relevan untuk Minggu 4: mengomunikasikan hasil analisis kepada audiens non-teknis. Membahas pemilihan chart yang tepat, penghilangan noise visual, dan cara membangun narasi dari data. Ini adalah buku yang bisa digunakan sepanjang karir Abbas sebagai data analyst.
Data Communication Visualization Storytelling
B4
Research Methods in Education
Louis Cohen, Lawrence Manion, Keith Morrison
Teks komprehensif metodologi penelitian dalam konteks pendidikan, sangat relevan dengan survey sekolah yang Abbas kerjakan. Membahas validitas, reliabilitas, mixed methods, dan etika penelitian secara menyeluruh. Bab tentang survey dan questionnaire design bisa langsung diaplikasikan ke Proyek P4. Tersedia versi PDF gratis di banyak repositori universitas.
Education Research Validity Ethics

Tools yang Digunakan

Enam tools utama yang mendukung seluruh proses riset dan analisis survey di Bulan 8.

Forms
Google Forms
Platform utama pembuatan dan distribusi survey. Gratis, mudah digunakan, dan mengekspor data langsung ke Google Sheets atau CSV. Fitur percabangan logika dan berbagai jenis pertanyaan membuatnya cukup untuk kebutuhan survey sekolah maupun survey profesional skala menengah.
Pandas
Python + Pandas
Tulang punggung analisis data survey: membersihkan data mentah, menghitung distribusi, melakukan crosstab, dan mengekspor hasil. Semua kode analisis di Minggu 3 menggunakan Pandas sebagai library utama.
SciPy
SciPy + NumPy
Digunakan untuk pengujian hipotesis (t-test dari Minggu 1 Hari 4) dan kalkulasi statistik inferensial. NumPy mendukung operasi array yang cepat untuk simulasi data dan komputasi Cronbach's Alpha di Minggu 3 Hari 4.
MPL
Matplotlib
Library visualisasi utama untuk membuat dashboard ringkasan survey, hero chart presentasi, dan semua plot distribusi di Minggu 3. Kontrol penuh atas tampilan chart memungkinkan Abbas membuat visualisasi yang siap presentasi tanpa perlu tools tambahan.
Sheets
Google Sheets
Jembatan antara Google Forms dan Python. Respons survey tersimpan otomatis di Sheets, lalu bisa diunduh sebagai CSV. Juga berguna untuk inspeksi data cepat sebelum analisis mendalam di Python, atau untuk berbagi data mentah dengan anggota tim yang tidak menggunakan Python.
Slides
Google Slides / PowerPoint
Digunakan di Minggu 4 untuk menyusun presentasi hasil survey. Chart yang sudah dibuat di Matplotlib diekspor sebagai PNG dan dimasukkan ke slide. Memahami prinsip desain slide yang baik adalah bagian dari kompetensi komunikasi data analyst yang profesional.

Tips Praktis dan Jebakan Pemula

Berikut adalah pelajaran yang sering dipelajari dengan cara yang susah oleh para peneliti pemula. Abbas bisa belajar lebih awal dan menghindari kesalahan yang sama.

Tip 1: Survey Buruk vs Survey Baik
Pertanyaan yang buruk menggiring jawaban responden. Contoh pertanyaan buruk: "Seberapa parah masalah sampah di sekolah kamu?" Kata "parah" sudah menanamkan asumsi bahwa ada masalah. Versi yang lebih baik: "Bagaimana kondisi kebersihan di sekolah kamu?" dengan pilihan jawaban yang netral: sangat bersih, cukup bersih, cukup kotor, sangat kotor. Pertanyaan netral menghasilkan data yang jauh lebih bisa dipercaya.
Jebakan 1: Leading Questions (Pertanyaan Menggiring)
Hindari frasa seperti "apakah kamu setuju bahwa...", "bukankah lebih baik jika...", atau "mengingat bahwa X sudah terbukti buruk, apa pendapat kamu?". Semua frasa ini sudah menanamkan jawaban yang diinginkan. Dalam analisis data, bias ini tidak bisa dikoreksi setelah data terkumpul karena sudah melekat pada cara pertanyaan diajukan.
Tip 2: Template Pertanyaan Survey yang Teruji
Abbas bisa menggunakan pola pertanyaan berikut sebagai kerangka dasar:

Untuk mengukur frekuensi: "Seberapa sering Abbas melakukan X dalam 1 bulan terakhir?" dengan skala: Tidak pernah / 1-2 kali / 3-5 kali / Lebih dari 5 kali.

Untuk mengukur tingkat kepuasan: Skala Likert 1 hingga 5, di mana 1 = Sangat Tidak Puas dan 5 = Sangat Puas. Selalu cantumkan label di kedua ujung skala agar responden tidak salah tafsir.

Untuk pertanyaan terbuka: Taruh di bagian akhir survey. Responden yang sudah menjawab pertanyaan tertutup lebih siap menulis jawaban panjang di akhir daripada di awal.
Jebakan 2: Ukuran Sampel yang Terlalu Kecil
Survey dengan 10 responden tidak bisa dijadikan dasar kesimpulan yang kuat. Sebagai panduan praktis untuk Abbas: minimal 30 responden untuk analisis dasar, 100 responden untuk analisis yang bisa dibagi ke subkelompok (misalnya membandingkan laki-laki vs perempuan), dan 400 responden untuk margin of error di bawah 5% dengan confidence level 95%. Kalau sampel terlalu kecil, sebut keterbatasannya secara eksplisit di laporan.
Tip 3: Urutan Pertanyaan yang Efektif
Mulai dengan pertanyaan yang mudah dan tidak mengancam (demografi umum, pertanyaan faktual). Lanjut ke pertanyaan inti topik di bagian tengah, saat responden sudah masuk ke "mode menjawab". Taruh pertanyaan sensitif (pendapatan, opini kontroversial) di akhir bagian tengah, bukan di awal. Akhiri dengan pertanyaan terbuka atau pesan penutup. Urutan ini meningkatkan completion rate dan kualitas jawaban.
Jebakan 3: Double-Barreled Questions
Pertanyaan seperti "Apakah kamu puas dengan fasilitas dan pelayanan sekolah?" adalah satu pertanyaan yang menanyakan dua hal sekaligus. Kalau jawabannya "tidak puas", Abbas tidak tahu apakah responden tidak puas dengan fasilitas, pelayanan, atau keduanya. Solusinya: pecah menjadi dua pertanyaan terpisah. Ini aturan paling sering dilanggar dalam survey pemula.
Tip 4: Pilot Test sebelum Deploy
Sebelum menyebar survey ke seluruh responden target, coba ke 3-5 orang terlebih dahulu dan minta mereka bicara keras tentang apa yang mereka pikirkan saat membaca setiap pertanyaan. Abbas akan terkejut betapa banyak pertanyaan yang ternyata ambigu atau membingungkan. Pilot test menghemat waktu dan menjaga kualitas data jauh lebih efektif daripada merevisi setelah data sudah terkumpul.
Tip 5: Panduan Singkat Menulis Laporan Penelitian
Struktur laporan yang diterima secara luas: (1) Pendahuluan, latar belakang dan tujuan penelitian. (2) Metodologi, siapa yang diteliti, berapa sampelnya, bagaimana cara pengumpulan data, dan alat apa yang dipakai. (3) Hasil, sajikan data secara objektif dengan tabel dan chart, tanpa interpretasi dulu. (4) Diskusi, interpretasi hasil, bandingkan dengan teori atau penelitian sebelumnya, akui keterbatasan. (5) Kesimpulan, jawab pertanyaan penelitian awal secara singkat. Jangan campurkan Hasil dan Diskusi karena akan membuat pembaca bingung mana fakta dan mana interpretasi Abbas.

Latihan Tambahan

Latihan berikut dirancang lebih menantang dari latihan harian. Abbas bisa mengerjakannya setelah selesai minggu terkait, atau sebagai persiapan sebelum mengerjakan Proyek P4.

Latihan A Audit Survey: Temukan 7 Kesalahan

Berikut adalah survey dengan berbagai masalah desain. Tugas Abbas: identifikasi minimal 7 kesalahan, lalu tulis versi yang sudah diperbaiki untuk setiap pertanyaan.

# Survey Asli (bermasalah) - salin ke file teks, analisis manual
survey_bermasalah = [
    "1. Apakah kamu setuju bahwa media sosial merusak mental remaja? [Ya/Tidak]",
    "2. Seberapa sering kamu menggunakan media sosial dan internet setiap hari?",
    "3. Berapa lama kamu scroll TikTok, Instagram, YouTube, dan Twitter hari ini?",
    "4. Apakah orang tua kamu tidak peduli dengan penggunaan HP kamu? [Sangat Setuju - Tidak Setuju]",
    "5. Nilai pelajaran apa yang turun karena terlalu banyak main HP?",
    "6. Usia kamu berapa?",  # pertanyaan ini ditaruh di nomor 6, bukan di awal
    "7. Apakah kamu pernah merasa bahwa media sosial, games, dan YouTube membuat kamu tidak fokus belajar dan tidur larut?",
]

# Panduan analisis: untuk setiap pertanyaan, cek:
# - Apakah ada leading words? (merusak, tidak peduli, terlalu banyak)
# - Apakah menanyakan dua hal sekaligus?
# - Apakah urutan logis?
# - Apakah skala jawaban konsisten dan netral?
# - Apakah ada asumsi yang tidak perlu?

print("Identifikasi kesalahan pada setiap nomor, lalu tulis perbaikannya.")
Kunci jawaban singkat: Nomor 1 (leading question, skala terlalu sempit), Nomor 2 (double-barreled), Nomor 3 (terlalu banyak platform sekaligus, cognitive load tinggi), Nomor 4 (leading + skala tidak simetris), Nomor 5 (pertanyaan terbuka di tengah, ambigu), Nomor 6 (demografi di akhir, harusnya di awal), Nomor 7 (tiga hal sekaligus, terlalu panjang).
Latihan B Analisis Data Survey Lengkap dengan Pandas

Abbas akan melakukan siklus analisis survey penuh: load data, bersihkan, hitung statistik deskriptif, crosstab, deteksi outlier, lalu simpulkan temuan.

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

# Simulasi data survey 120 responden
np.random.seed(7)
n = 120

df = pd.DataFrame({
    'id': range(1, n+1),
    'kelas': np.random.choice(['X', 'XI', 'XII'], n, p=[0.35, 0.35, 0.30]),
    'jenis_kelamin': np.random.choice(['Laki-laki', 'Perempuan'], n, p=[0.48, 0.52]),
    'jam_medsos_harian': np.random.exponential(scale=3, size=n).clip(0, 12).round(1),
    'kepuasan_sekolah': np.random.choice([1,2,3,4,5], n, p=[0.05,0.10,0.25,0.40,0.20]),
    'motivasi_belajar': np.random.choice([1,2,3,4,5], n, p=[0.08,0.15,0.30,0.32,0.15]),
    'ikut_ekskul': np.random.choice(['Ya', 'Tidak'], n, p=[0.60, 0.40]),
})

# --- LANGKAH 1: Explorasi awal ---
print("=== Info Dataset ===")
print(df.info())
print("
=== Missing Values ===")
print(df.isnull().sum())

# --- LANGKAH 2: Statistik deskriptif variabel numerik ---
print("
=== Statistik Deskriptif ===")
print(df[['jam_medsos_harian', 'kepuasan_sekolah', 'motivasi_belajar']].describe().round(2))

# --- LANGKAH 3: Distribusi frekuensi variabel kategorik ---
print("
=== Distribusi Kelas ===")
print(df['kelas'].value_counts(normalize=True).mul(100).round(1).astype(str) + '%')

# --- LANGKAH 4: Crosstab - kepuasan sekolah per kelas ---
print("
=== Rata-rata Kepuasan per Kelas ===")
crosstab_kepuasan = df.groupby('kelas')['kepuasan_sekolah'].agg(['mean', 'std', 'count'])
print(crosstab_kepuasan.round(2))

# --- LANGKAH 5: Korelasi jam medsos vs motivasi belajar ---
corr = df['jam_medsos_harian'].corr(df['motivasi_belajar'])
print(f"
Korelasi jam medsos vs motivasi belajar: {corr:.3f}")
if abs(corr) < 0.1:
    print("Interpretasi: hampir tidak ada hubungan linear")
elif abs(corr) < 0.3:
    print("Interpretasi: hubungan lemah")
else:
    print("Interpretasi: hubungan cukup kuat")

# --- LANGKAH 6: Deteksi outlier jam medsos (metode IQR) ---
Q1 = df['jam_medsos_harian'].quantile(0.25)
Q3 = df['jam_medsos_harian'].quantile(0.75)
IQR = Q3 - Q1
batas_bawah = Q1 - 1.5 * IQR
batas_atas  = Q3 + 1.5 * IQR
outlier = df[(df['jam_medsos_harian'] < batas_bawah) | (df['jam_medsos_harian'] > batas_atas)]
print(f"
Outlier jam medsos: {len(outlier)} dari {n} responden")
print(outlier[['id', 'kelas', 'jam_medsos_harian']])

# --- LANGKAH 7: Visualisasi distribusi kepuasan ---
fig, axes = plt.subplots(1, 2, figsize=(12, 4))

df['kepuasan_sekolah'].value_counts().sort_index().plot(
    kind='bar', ax=axes[0], color='steelblue', edgecolor='white'
)
axes[0].set_title('Distribusi Kepuasan Sekolah')
axes[0].set_xlabel('Skor (1=Sangat Tidak Puas, 5=Sangat Puas)')
axes[0].set_ylabel('Jumlah Responden')
axes[0].tick_params(axis='x', rotation=0)

df.boxplot(column='jam_medsos_harian', by='kelas', ax=axes[1])
axes[1].set_title('Jam Medsos per Kelas')
axes[1].set_xlabel('Kelas')
axes[1].set_ylabel('Jam per hari')
plt.suptitle('')  # hapus judul otomatis dari boxplot

plt.tight_layout()
plt.savefig('hasil_survey_sekolah.png', dpi=150, bbox_inches='tight')
print("
Chart disimpan sebagai hasil_survey_sekolah.png")
Tantangan lanjutan: Tambahkan chi-square test untuk menguji apakah ada perbedaan kepuasan yang signifikan antara kelas X, XI, dan XII. Gunakan scipy.stats.kruskal karena data ordinal, bukan ANOVA biasa. Jelaskan mengapa Kruskal-Wallis lebih tepat untuk data skala Likert.
Latihan C Hitung Cronbach's Alpha secara Manual

Cronbach's Alpha mengukur konsistensi internal sebuah skala. Kalau Abbas membuat 5 pertanyaan untuk mengukur "motivasi belajar", alpha yang tinggi (di atas 0.7) berarti kelima pertanyaan itu benar-benar mengukur hal yang sama.

import pandas as pd
import numpy as np

# 5 pertanyaan motivasi belajar, 50 responden (skor 1-5)
np.random.seed(99)
n_resp = 50

# Simulasi: buat responden yang punya "motivasi sejati" laten
motivasi_laten = np.random.normal(3, 0.8, n_resp)

# Setiap pertanyaan mengukur motivasi + sedikit noise
data_skala = pd.DataFrame({
    'Q1_target_belajar': (motivasi_laten + np.random.normal(0, 0.5, n_resp)).clip(1,5).round(),
    'Q2_semangat_pagi':  (motivasi_laten + np.random.normal(0, 0.6, n_resp)).clip(1,5).round(),
    'Q3_tidak_mudah_nyerah': (motivasi_laten + np.random.normal(0, 0.4, n_resp)).clip(1,5).round(),
    'Q4_suka_tantangan': (motivasi_laten + np.random.normal(0, 0.7, n_resp)).clip(1,5).round(),
    'Q5_bangga_hasil':   (motivasi_laten + np.random.normal(0, 0.5, n_resp)).clip(1,5).round(),
})

# Hitung Cronbach's Alpha
def cronbach_alpha(df):
    k = df.shape[1]                     # jumlah item
    var_items = df.var(axis=0, ddof=1)  # varians tiap item
    var_total = df.sum(axis=1).var(ddof=1)  # varians skor total
    alpha = (k / (k - 1)) * (1 - var_items.sum() / var_total)
    return alpha

alpha = cronbach_alpha(data_skala)
print(f"Cronbach's Alpha: {alpha:.3f}")

# Interpretasi standar
if alpha >= 0.9:
    print("Konsistensi: Excellent (sangat baik untuk instrumen klinis)")
elif alpha >= 0.8:
    print("Konsistensi: Good (baik untuk riset akademis)")
elif alpha >= 0.7:
    print("Konsistensi: Acceptable (cukup untuk riset eksplorasi)")
elif alpha >= 0.6:
    print("Konsistensi: Questionable (perlu perbaikan pertanyaan)")
else:
    print("Konsistensi: Poor (pertanyaan tidak mengukur hal yang sama)")

# Alpha jika item dihapus: bantu identifikasi pertanyaan lemah
print("
=== Alpha jika item dihapus ===")
for col in data_skala.columns:
    df_tanpa = data_skala.drop(columns=[col])
    alpha_tanpa = cronbach_alpha(df_tanpa)
    delta = alpha_tanpa - alpha
    tanda = "+" if delta > 0 else ""
    print(f"  Tanpa {col}: alpha={alpha_tanpa:.3f} ({tanda}{delta:.3f})")
    if delta > 0.02:
        print(f"    -> Pertimbangkan hapus {col}, menurunkan konsistensi skala.")
Kapan perlu hitung Alpha: Setiap kali Abbas membuat skala multi-item (lebih dari satu pertanyaan untuk mengukur satu konstruk seperti kepuasan, motivasi, atau kepercayaan diri). Ini adalah validasi minimum sebelum menganalisis atau melaporkan hasil. Tanpa cek Alpha, Abbas tidak bisa memastikan pertanyaan-pertanyaan itu memang kompak mengukur hal yang sama.