Skip to content

Instantly share code, notes, and snippets.

@Keycatowo
Created March 5, 2023 00:38
Show Gist options
  • Save Keycatowo/872b2f93f42762500f9854fdd8ee592a to your computer and use it in GitHub Desktop.
Save Keycatowo/872b2f93f42762500f9854fdd8ee592a to your computer and use it in GitHub Desktop.
DAC第一次作業
# -*- coding: utf-8 -*-
"""DAC HW1_劉弘祥
Automatically generated by Colaboratory.
Original file is located at
https://colab.research.google.com/drive/1dwcMqxWb29IuwAxoX_6xn-ct64VHOLFD
# DAC-Python HW1
+ 時間:2023/03/01
+ 作者:劉弘祥
+ 授權:CC4.0
## 作業說明
作業題目:針對有考上目標學校的學生與無考上目標學校的學生分別產生兩種數列:根據研究(假的)指出有考上目標學校的學生與沒考上目標學校的學生,在校的學業成績表現分別服從平均值為 75、變異數為 25 的常態分配與平均值為 50、變異數為 225 的常態分配並四捨五入到小數點後第二位,因此你需要額外根據這兩種情境創造一個變項來使得考生符合上述情境。
+ 現有-考上與否(Final_Answer):1代表考上,0代表沒考上,2表示還沒考
+ 新增-在校成績(school_grade):服從常態分配
+ 有考上目標學校的學生:平均值為 75、變異數為 25(標準差為 5)
+ 沒有考上目標學校的學生:平均值為 50、變異數為 225(標準差為 15)
## 環境設定及資料載入
"""
# 環境設定
import pandas as pd
import numpy as np
SEED = 9527
np.random.seed(SEED)
# 資料讀取
URL = r"https://github.com/Keycatowo/dataset/raw/main/001-%E5%8F%B0%E7%81%A3%E5%BD%B1%E9%9F%BF%E5%A4%A7%E5%AD%B8%E7%94%9F%E8%BD%89%E5%AD%B8%E8%80%83%E6%88%90%E5%8A%9F%E8%80%83%E4%B8%8A%E4%B9%8B%E5%9B%A0%E7%B4%A0/transfer_data.csv"
df = pd.read_csv(URL, encoding="unicode_escape")
df.info()
# 篩選掉還沒考上的資料
df = df[df["Final_Answer"] != 2]
# 查看有考上的統計
df["Final_Answer"].value_counts()
"""## 方法1:一個一個新增"""
def generate_grade(row):
if row["Final_Answer"] == 1:
loc = 75
scale = 5
elif row["Final_Answer"] == 0:
loc = 50
scale = 15
else:
return np.nan
return np.random.normal(loc, scale)
df["school_grade_1"] = df.apply(generate_grade, axis = 1)
df["school_grade_1"].describe()
"""## 方法2:先建立所有的數列,再一次新增"""
df["school_grade_2"] = np.nan
sucess_mask = df["Final_Answer"] == 1
fail_mask = df["Final_Answer"] == 0
df.loc[sucess_mask, "school_grade_2"] = np.random.normal(75, 5, size = sucess_mask.sum())
df.loc[fail_mask, "school_grade_2"] = np.random.normal(50, 15, size = fail_mask.sum())
df["school_grade_2"].describe()
"""## 方法3:數學方法,直接讓兩種情況用同一個公式產生
❗純屬有趣,實務上可讀性低,一般情況不實用
"""
df["school_grade_3"] = df["Final_Answer"].apply(
lambda x: np.random.normal(75 * x + 50 * (1 - x), 5 * x + 15 * (1 - x))
)
df["school_grade_3"].describe()
"""## 延伸實作:檢驗是否符合題目給定的常態分配"""
df["Final_Answer"].value_counts()
"""### 檢驗方法1:繪圖檢驗"""
import seaborn as sns
import matplotlib.pyplot as plt
# 畫出school_grade_1的分布圖,以Final_Answer為分類
sns.displot(df, x = "school_grade_1", hue = "Final_Answer", kind = "kde")
# 標注出75分的位置,並且添加說明文字
plt.vlines(75, 0, 0.1, colors = "r", linestyles = "dashed")
plt.text(75, 0.1, "75", ha = "center")
# 標注出50分的位置,並且添加說明文字
plt.vlines(50, 0, 0.1, colors = "b", linestyles = "dashed")
plt.text(50, 0.1, "50", ha = "center")
# 設定圖表標題
plt.title(f"school_grade_1")
plt.show()
# 畫出school_grade_2的分布圖,以Final_Answer為分類
sns.displot(df, x = "school_grade_2", hue = "Final_Answer", kind = "kde")
# 標注出75分的位置,並且添加說明文字
plt.vlines(75, 0, 0.1, colors = "r", linestyles = "dashed")
plt.text(75, 0.1, "75", ha = "center")
# 標注出50分的位置,並且添加說明文字
plt.vlines(50, 0, 0.1, colors = "b", linestyles = "dashed")
plt.text(50, 0.1, "50", ha = "center")
# 設定圖表標題
plt.title(f"school_grade_2")
plt.show()
# 畫出school_grade_3的分布圖,以Final_Answer為分類
sns.displot(df, x = "school_grade_3", hue = "Final_Answer", kind = "kde")
# 標注出75分的位置,並且添加說明文字
plt.vlines(75, 0, 0.1, colors = "r", linestyles = "dashed")
plt.text(75, 0.1, "75", ha = "center")
# 標注出50分的位置,並且添加說明文字
plt.vlines(50, 0, 0.1, colors = "b", linestyles = "dashed")
plt.text(50, 0.1, "50", ha = "center")
# 設定圖表標題
plt.title(f"school_grade_3")
plt.show()
"""### 檢驗方法2:使用Kolmogorov-Smirnov檢定
Reference: [A Gentle Introduction to Normality Tests in Python - MachineLearningMastery.com](https://machinelearningmastery.com/a-gentle-introduction-to-normality-tests-in-python/)
"""
from scipy.stats import kstest
ALPHA = 0.05 # 用來判定的顯著水準
ks_stat, p_value = kstest(df[df["Final_Answer"] == 1]["school_grade_1"], "norm", args = (75, 5))
if p_value > ALPHA:
print(f"KS檢定結果: 統計量={ks_stat:.4f}, p值={p_value:.4f},樣本數列可能服從常態分佈(mu=75, sigma=5)")
else:
print(f"KS檢定結果: 統計量={ks_stat:.4f}, p值={p_value:.4f},樣本數列不服從常態分佈(mu=75, sigma=5)")
ks_stat, p_value = kstest(df[df["Final_Answer"] == 0]["school_grade_1"], "norm", args = (50, 15))
if p_value > ALPHA:
print(f"KS檢定結果: 統計量={ks_stat:.4f}, p值={p_value:.4f},樣本數列可能服從常態分佈(mu=50, sigma=15)")
else:
print(f"KS檢定結果: 統計量={ks_stat:.4f}, p值={p_value:.4f},樣本數列不服從常態分佈(mu=50, sigma=15)")
ks_stat, p_value = kstest(df[df["Final_Answer"] == 1]["school_grade_2"], "norm", args = (75, 5))
if p_value > ALPHA:
print(f"KS檢定結果: 統計量={ks_stat:.4f}, p值={p_value:.4f},樣本數列可能服從常態分佈(mu=75, sigma=5)")
else:
print(f"KS檢定結果: 統計量={ks_stat:.4f}, p值={p_value:.4f},樣本數列不服從常態分佈(mu=75, sigma=5)")
ks_stat, p_value = kstest(df[df["Final_Answer"] == 0]["school_grade_2"], "norm", args = (50, 15))
if p_value > ALPHA:
print(f"KS檢定結果: 統計量={ks_stat:.4f}, p值={p_value:.4f},樣本數列可能服從常態分佈(mu=50, sigma=15)")
else:
print(f"KS檢定結果: 統計量={ks_stat:.4f}, p值={p_value:.4f},樣本數列不服從常態分佈(mu=50, sigma=15)")
ks_stat, p_value = kstest(df[df["Final_Answer"] == 1]["school_grade_3"], "norm", args = (75, 5))
if p_value > ALPHA:
print(f"KS檢定結果: 統計量={ks_stat:.4f}, p值={p_value:.4f},樣本數列可能服從常態分佈(mu=75, sigma=5)")
else:
print(f"KS檢定結果: 統計量={ks_stat:.4f}, p值={p_value:.4f},樣本數列不服從常態分佈(mu=75, sigma=5)")
ks_stat, p_value = kstest(df[df["Final_Answer"] == 0]["school_grade_3"], "norm", args = (50, 15))
if p_value > ALPHA:
print(f"KS檢定結果: 統計量={ks_stat:.4f}, p值={p_value:.4f},樣本數列可能服從常態分佈(mu=50, sigma=15)")
else:
print(f"KS檢定結果: 統計量={ks_stat:.4f}, p值={p_value:.4f},樣本數列不服從常態分佈(mu=50, sigma=15)")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment