{"id":21653628,"url":"https://github.com/anlbora/predictive-analysis-on-hitters-dataset","last_synced_at":"2026-05-20T06:05:28.065Z","repository":{"id":245115992,"uuid":"817310366","full_name":"anlbora/Predictive-Analysis-on-Hitters-Dataset","owner":"anlbora","description":"This project analyzes the 1987 baseball player statistics to predict salaries using machine learning. It includes data preprocessing, exploratory analysis, and model development with Random Forest regression.","archived":false,"fork":false,"pushed_at":"2024-06-19T13:12:17.000Z","size":551,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-25T06:11:21.422Z","etag":null,"topics":["data-science","dataset","machine-learning","ml","python","random-forest","randomforestregressor"],"latest_commit_sha":null,"homepage":"https://www.kaggle.com/code/anlbora/predictive-analysis-on-hitters-dataset","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anlbora.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-19T12:48:18.000Z","updated_at":"2024-06-19T13:17:32.000Z","dependencies_parsed_at":"2024-06-19T23:07:24.053Z","dependency_job_id":null,"html_url":"https://github.com/anlbora/Predictive-Analysis-on-Hitters-Dataset","commit_stats":null,"previous_names":["anlbora/predictive-analysis-on-hitters-dataset"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anlbora%2FPredictive-Analysis-on-Hitters-Dataset","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anlbora%2FPredictive-Analysis-on-Hitters-Dataset/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anlbora%2FPredictive-Analysis-on-Hitters-Dataset/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anlbora%2FPredictive-Analysis-on-Hitters-Dataset/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anlbora","download_url":"https://codeload.github.com/anlbora/Predictive-Analysis-on-Hitters-Dataset/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244552079,"owners_count":20470987,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-science","dataset","machine-learning","ml","python","random-forest","randomforestregressor"],"created_at":"2024-11-25T08:19:40.249Z","updated_at":"2026-05-20T06:05:28.033Z","avatar_url":"https://github.com/anlbora.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dataset Story\n\nThis dataset was originally taken from the StatLib library which is maintained at Carnegie Mellon University. This is part of the data that was used in the 1988 ASA Graphics Section Poster Session. The salary data were originally from Sports Illustrated, April 20, 1987. The 1986 and career statistics were obtained from The 1987 Baseball Encyclopedia Update published by Collier Books, Macmillan Publishing Company, New York.\n\n* AtBat Number of times at bat in 1986\n* Hits Number of hits in 1986\n* HmRun Number of home runs in 1986\n* Runs Number of runs in 1986\n* RBI Number of runs batted in in 1986\n* Walks Number of walks in 1986\n* Years Number of years in the major leagues\n* CAtBat Number of times at bat during his career\n* CHits Number of hits during his career\n* CHmRun Number of home runs during his * career\n* CRuns Number of runs during his career\n* CRBI Number of runs batted in during his career\n* CWalks Number of walks during his career\n* League A factor with levels A and N indicating player’s league at the end of 1986\n* Division A factor with levels E and W indicating player’s division at the end of 1986\n* PutOuts Number of put outs in 1986\n* Assists Number of assists in 1986\n* Errors Number of errors in 1986\n* Salary 1987 annual salary on opening day in thousands of dollars\n* NewLeague A factor with levels A and N indicating player’s league at the beginning of 1987\n\n# Import Necessary Libraries\n\n```\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\npd.set_option(\"display.max_columns\", None)\npd.set_option(\"display.max_rows\", None)\npd.set_option(\"display.width\", 500)\npd.set_option(\"display.float_format\", lambda x: \"%.4f\" % x)\n\nfrom sklearn.model_selection import train_test_split, cross_validate\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.metrics import mean_squared_error, mean_absolute_error\n\n!pip install joblib\nimport joblib\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n```\n\n# Import Dataset\n\n```\ndf = pd.read_csv(\"/kaggle/input/hitters\")\ndf.head()\n```\n# General Information About to Dataset\n\n```\ndef check_df(dataframe,head=5):\n  print(20*\"#\", \"Head\", 20*\"#\")\n  print(dataframe.head(head))\n  print(20*\"#\", \"Tail\", 20*\"#\")\n  print(dataframe.tail(head))\n  print(20*\"#\", \"Shape\", 20*\"#\")\n  print(dataframe.shape)\n  print(20*\"#\", \"Types\", 20*\"#\")\n  print(dataframe.dtypes)\n  print(20*\"#\", \"NA\", 20*\"#\")\n  print(dataframe.isnull().sum())\n  print(20*\"#\", \"Qurtiles\", 20*\"#\")\n  print(dataframe.describe([0, 0.05, 0.50, 0.95, 0.99, 1]).T)\n```\n\n# Analysis of Categorical and Numerical Variables\n```\ndef grab_col_names(dataframe, cat_th=10, car_th=20):\n  #Catgeorical Variable Selection\n  cat_cols = [col for col in dataframe.columns if str(dataframe[col].dtypes) in [\"category\",\"object\",\"bool\"]]\n  num_but_cat = [col for col in dataframe.columns if dataframe[col].nunique() \u003c cat_th and dataframe[col].dtypes in [\"uint8\",\"int64\",\"float64\"]]\n  cat_but_car = [col for col in dataframe.columns if dataframe[col].nunique() \u003e car_th and str(dataframe[col].dtypes) in [\"category\",\"object\"]]\n  cat_cols = cat_cols + num_but_cat\n  cat_cols = [col for col in cat_cols if col not in cat_but_car]\n\n  #Numerical Variable Selection\n  num_cols = [col for col in dataframe.columns if dataframe[col].dtypes in [\"uint8\",\"int64\",\"float64\"]]\n  num_cols = [col for col in num_cols if col not in cat_cols]\n\n  return cat_cols, num_cols, cat_but_car, num_but_cat\n```\n\n```\ncat_cols, num_cols, cat_but_car, num_but_cat = grab_col_names(df)\n\n#Print Categorical and Numerical Variables\nprint(f\"Observations: {df.shape[0]}\")\nprint(f\"Variables: {df.shape[1]}\")\nprint(f\"Cat_cols: {len(cat_cols)}\")\nprint(f\"Num_cols: {len(num_cols)}\")\nprint(f\"Cat_but_car: {len(cat_but_car)}\")\nprint(f\"Num_but_cat: {len(num_but_cat)}\"\n```\n```\ndef cat_summary(dataframe,col_name,plot=False):\n  print(pd.DataFrame({col_name: dataframe[col_name].value_counts(),\n                      'Ration': 100 * dataframe[col_name].value_counts() / len(dataframe)}))\n  print(\"##########################################\")\n  if plot:\n    sns.countplot(x=dataframe[col_name],data=dataframe)\n    plt.show(block=True)\n```\n```\ndef cat_summary_df(dataframe):\n  cat_cols, num_cols, cat_but_car, num_but_cat = grab_col_names(df)\n  for col in cat_cols:\n    cat_summary(dataframe, col, plot=True)\n```\n\n`cat_summary_df(df)`\n\n```\ndef num_summary(dataframe, num_col, plot=False):\n  print(50*\"#\", num_col ,50*\"#\")\n  quantiles = [0.01, 0.05, 0.10, 0.20, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90, 0.95, 0.99]\n  print(dataframe[num_col].describe(quantiles).T)\n\n  if plot:\n    dataframe[num_col].hist(bins=20)\n    plt.xlabel(num_col)\n    plt.ylabel(num_col)\n    plt.show(block=True)\n```\n```\ndef num_summary_df(dataframe):\n  cat_cols, num_cols, cat_but_car, num_but_cat = grab_col_names(dataframe)\n  for col in num_cols:\n    num_summary(dataframe, col, plot=True)\n```\n`num_summary_df(df)`\n```\ndef plot_num_summary(dataframe):\n  cat_cols, num_cols, cat_but_car, num_but_cat = grab_col_names(dataframe)\n  plt.figure(figsize=(12,4))\n  for index, col in enumerate(num_cols):\n    plt.subplot(3,6, index+1)\n    plt.tight_layout()\n    dataframe[col].hist(bins=20)\n    plt.title(col)\n```\n`plot_num_summary(df)`\n\n# Target Analysis\n```\ndef target_summary_with_cat(dataframe, target, categorical_col):\n  print(f\"##################### {target} -\u003e {categorical_col} #####################\")\n  print(pd.DataFrame({\"Target Mean\": dataframe.groupby(categorical_col)[target].mean()}))\n```\n\n```\ndef target_summary_with_cat_df(dataframe, target):\n    cat_cols, num_cols, cat_but_car, num_but_cat = grab_col_names(dataframe)\n    for col in cat_cols:\n        target_summary_with_cat(dataframe, target, col)\n```\n`target_summary_with_cat_df(df, \"Salary\")`\n\n# Correlation Analysis\n\n```\ndef high_correlated_cols(dataframe, corr_th = 0.90, plot=False):\n  num_cols = [col for col in dataframe.columns if dataframe[col].dtypes in [\"uint8\", \"int64\", \"float64\"]]\n  corr = dataframe[num_cols].corr()\n  corr_matrix = corr.abs()\n  upper_triangular_matrix = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))\n  drop_list = [col for col in upper_triangular_matrix.columns if any(upper_triangular_matrix[col] \u003e corr_th)]\n  if drop_list == []:\n    print(\"Aftre corelation analysis, we dont need to remove variables\")\n\n  if plot:\n    sns.set(rc={'figure.figsize': (18,13)})\n    sns.heatmap(corr, cmap='RdBu', annot=True, fmt=\".2f\")\n    plt.show()\n\n  return drop_list\n```\n`drop_list = high_correlated_cols(df, plot=True)`\n\n# Missing Value Analysis\n\n```\ndef missing_value_table(dataframe, na_names=False):\n  na_columns = [col for col in dataframe.columns if dataframe[col].isnull().sum() \u003e 0]\n  n_miss = dataframe[na_columns].isnull().sum().sort_values(ascending=False)\n  ratio = (dataframe[na_columns].isnull().sum() / dataframe.shape[0] * 100).sort_values(ascending=False)\n  missing_df = pd.concat([n_miss, np.round(ratio, 2)], axis=1, keys=[\"n_miss\", \"ratio\"])\n  print(missing_df)\n  if na_names:\n    print(\"######### Na Names ###########\")\n    return na_columns\n```\n`missing_value_table(df, na_names=True)`\n```\ndef fill_na_median(dataframe):\n  dataframe = dataframe.apply(lambda x: x.fillna(x.median()) if x.dtype not in [\"category\", \"object\", \"bool\"] else x, axis=0)\n  return dataframe\n```\n`df = fill_na_median(df)`\n\n# Encoding \u0026 Scaling\n```\ndef one_hot_encoding(dataframe, drop_first=True):\n  cat_cols, num_cols, cat_but_car, num_but_cat = grab_col_names(dataframe)\n  dataframe = pd.get_dummies(dataframe, columns=cat_cols, drop_first=drop_first)\n  return dataframe\n```\n`df = one_hot_encoding(df)`\n\n# Create a Base Model: Prediction Salary using Random Forest Algorithm\n\n```\nX = df.drop([\"Salary\"], axis=1)\ny = df[\"Salary\"]\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=1)\n```\n```\nrf_model = RandomForestRegressor(random_state=1).fit(X_train, y_train)\nmean_squared_error(y_train, rf_model.predict(X_train))\nmean_squared_error(y_test, rf_model.predict(X_test))\nnp.sqrt(mean_squared_error(y_train, rf_model.predict(X_train)))\nnp.sqrt(mean_squared_error(y_test, rf_model.predict(X_test)))\ncv_results = cross_validate(rf_model, X, y, cv=10, scoring=\"neg_mean_squared_error\")\n-cv_results['test_score'].mean()\nnp.sqrt(-cv_results['test_score'].mean())\n```\n```\ndef RF_Model(dataframe, target, test_size=0.20, cv=10, results=False, plot_importance=False, save_results=False):\n  X = dataframe.drop(target, axis=1)\n  y = dataframe[target]\n  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=1)\n  rf_model = RandomForestRegressor(random_state=1).fit(X_train, y_train)\n  if results:\n    mse_train = mean_squared_error(y_train, rf_model.predict(X_train))\n    mse_test = mean_squared_error(y_test, rf_model.predict(X_test))\n    rmse_train = np.sqrt(mse_train)\n    rmse_test = np.sqrt(mse_test)\n    mae_train = mean_absolute_error(y_train, rf_model.predict(X_train))\n    mae_test = mean_absolute_error(y_test, rf_model.predict(X_test))\n    r2_train = rf_model.score(X_train, y_train)\n    r2_test = rf_model.score(X_test, y_test)\n    cv_results_mse = cross_validate(rf_model, X, y, cv=cv, scoring=\"neg_mean_squared_error\")\n    cv_results_rmse = cross_validate(rf_model, X, y, cv=cv, scoring=\"neg_root_mean_squared_error\")\n\n    print(\"MSE Train: \", \"%.3f\" % mse_train)\n    print(\"MSE Test: \", \"%.3f\" % mse_test)\n    print(\"RMSE Train: \", \"%.3f\" % rmse_train)\n    print(\"RMSE Test: \", \"%.3f\" % rmse_test)\n    print(\"MAE Train: \", \"%.3f\" % mae_train)\n    print(\"MAE Test: \", \"%.3f\" % mae_test)\n    print(\"R2 Train: \", \"%.3f\" % r2_train)\n    print(\"R2 Test: \", \"%.3f\" % r2_test)\n    print(\"Cross Validate MSE: \", \"%.3f\" % -cv_results_mse['test_score'].mean())\n    print(\"Cross Validate RMSE: \", \"%.3f\" % -cv_results_rmse['test_score'].mean())\n\n    if plot_importance:\n      feature_imp = pd.DataFrame({'Value': rf_model.feature_importances_, 'Feature': X.columns})\n      plt.figure(figsize=(8, 6))\n      sns.barplot(x=\"Value\", y=\"Feature\", data=feature_imp.sort_values(by=\"Value\", ascending=False))\n      plt.title(\"Importance Features\")\n      plt.tight_layout()\n      plt.savefig(\"importance.jpg\")\n      plt.show()\n\n    if save_results:\n      joblib.dump(rf_model, \"rf_model.pkl\")\n```\n`RF_Model(df, \"Salary\", results=True, plot_importance=True, save_results=True)`\n```\ndef load_model(pklfile):\n  model_disc = joblib.load(pklfile)\n  return model_disc\n```\n```\nX = [300, 70, 1, 40, 50, 20, 2, 200, 70, 1, 40, 40, 20, 500, 40, 30, True, False, True]\nmodel_disc = load_model(\"rf_model.pkl\")\nmodel_disc.predict(pd.DataFrame(X).T)[0]\nX = df.drop(\"Salary\", axis=1)\nrandom_baseballer = X.sample(1, random_state=1).values.tolist()[0]\nmodel_disc.predict(pd.DataFrame(random_baseballer).T)[0]\n```\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanlbora%2Fpredictive-analysis-on-hitters-dataset","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanlbora%2Fpredictive-analysis-on-hitters-dataset","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanlbora%2Fpredictive-analysis-on-hitters-dataset/lists"}