def define_data_type(
    dataframe, lower_bound, upper_bound, var_definition, var_type
):
    """Define the different types of variables (e.g. categorical, numerical).

    The variables are chosen "manually" by entering the boundary values for
    selection of columns.
    This is an alternative to data typing for a more 'pythonesque' approach.
    The idea is to define a data type and use '.iloc' properties to quickly
        assign the variable range to declare them on the global scope.

    The user can select manually the range of variables and their names.
    Args:
        dataframe (object): dataframe with a range of data types to be assigned
            to the different columns. All rows by default (:).
        lower_bound (int): starting column index included in the subset
            variables. The bound is inclusive.
        upper_bound (int): ending column index in subset. Bound is exclusive.
        var_type (string): data type, as in category, integer, float, ect.

    Returns:
        object: dataframes that will each contain a data type (category,
            dependent variables, etc.)
    """
    variable_selection = (
        dataframe.iloc[:, lower_bound:upper_bound]
        .convert_dtypes(convert_integer=True)
        .astype(var_type)
    )
    print(f"\n{var_definition.capitalize()} variables selected: \n")
    print(f"\n{variable_selection.info()}\n")
    print(
        f"\n{var_definition.capitalize()} variables data summary: \n"
        f"\n{variable_selection.describe()}\n"
    )
    return variable_selection