import pandas as pd import matplotlib.pyplot as plt from scipy import stats as st import numpy as np import math data1 = pd.read_csv('/datasets/users_go.csv') display(data1.head(10)) display(data1.info()) display(data1.shape) display(data1.isna().sum()) data2 = pd.read_csv('/datasets/rides_go.csv') display(data2.head(10)) display(data2.info()) display(data2.shape) display(data2.isna().sum()) data3 = pd.read_csv('/datasets/subscriptions_go.csv') display(data3.head(10)) display(data3.info()) display(data3.shape) display(data3.isna().sum()) data2['date'] = pd.to_datetime(data2['date'], format='%Y-%m-%d') data2['month'] = data2['date'].dt.month data1 = data1.drop_duplicates() data1 = data1.reset_index(drop=True) data2.duplicated().sum() data3.duplicated().sum() data1['city'].value_counts().plot(kind='bar'); plt.title('Количество пользователей в каждом городе'); data1['city'].value_counts() data1['subscription_type'].value_counts().plot(kind='pie', autopct='%.1f%%'); plt.title('Количество пользователей по категориям'); print(f'Пользователей без подписки:', '54.3%') print(f'Пользователей c подпиской:', '45.7%') data1['age'].hist (bins= 100, figsize = (10,5)); plt.title('Количество пользователей по возрасту'); data2['distance'].hist(bins=100, figsize = (10,5)) plt.title('Расстояние поездок у пользователей'); plt.xlabel('Расстояние, м.'); data2['distance'].describe() data2['duration'].hist(bins=100, figsize = (10,5)) plt.title('Продолжительность аренды у пользователей'); plt.xlabel('Время, м.'); data2['duration'].describe() data4=data1.merge(data2, on='user_id', how='left') data4 data5 = data4.loc[data4['subscription_type'] == 'ultra'] data6 = data4.loc[data4['subscription_type'] == 'free'] data5['distance'].hist(bins=100, figsize = (10,5)) plt.title('Расстояние поездок у пользователей, оформивших платную подписку'); plt.xlabel('Расстояние, м.'); plt.show() data5['duration'].hist(bins=100, figsize = (10,5)) plt.title('Продолжительность поездок у пользователей, оформивших платную подписку'); plt.xlabel('Время, м.'); data6['distance'].hist(bins=100, figsize = (10,5)) plt.title('Расстояние поездок у пользователей, не оформлявших платную подписку'); plt.xlabel('Расстояние, м.'); plt.show() data6['duration'].hist(bins=100, figsize = (10,5)) plt.title('Продолжительность поездок у пользователей, не оформлявших платную подписку'); plt.xlabel('Время, м.'); i = data6[data6['duration'] < 1.0] i data4 = data4.query('duration > 1.0') data5 = data4.loc[data4['subscription_type'] == 'ultra'] data6 = data4.loc[data4['subscription_type'] == 'free'] data6['distance'].hist(bins=100, figsize = (10,5)) plt.title('Расстояние поездок у пользователей, не оформлявших платную подписку'); plt.xlabel('Расстояние, м.'); plt.show() data6['duration'].hist(bins=100, figsize = (10,5)) plt.title('Продолжительность поездок у пользователей, не оформлявших платную подписку'); plt.xlabel('Время, м.'); data4_pivot = data4.pivot_table(index=['user_id', 'month'], values=['distance', 'duration', 'name', 'subscription_type'], aggfunc={'distance':'sum', 'duration':'sum', 'name':'count', 'subscription_type': 'min'}) data4_pivot.columns = ['total_distance', 'total_duration', 'trip_count', 'subscription_type'] data4_pivot data4_pivot['total_duration'] = round(data4_pivot['total_duration'], 0) def money(row): total_distance = row['total_distance'] total_duration = row['total_duration'] trip_count = row['trip_count'] subscription_type = row['subscription_type'] if subscription_type == 'ultra': return total_duration * 6 + 199 if subscription_type == 'free': return total_duration * 8 + trip_count * 50 data4_pivot['money'] = data4_pivot.apply(money, axis=1) alpha = 0.05 results = st.ttest_ind(data5['duration'], data6['duration'], alternative = 'greater') print('p-значение:', results.pvalue) if results.pvalue < alpha: print('Отвергаем нулевую гипотезу') else: print('Не получилось отвергнуть нулевую гипотезу') print() print('Средняя продолжительность аренды у пользователей с подпиской:', round(data5['duration'].mean(), 2), 'минут, а у пользователей без подписки', round(data6['duration'].mean(), 2), 'минут') print() print('В среднем пользователи с подпиской арендуют самокат на', round(round(data5['duration'].mean(), 2) - round(data6['duration'].mean(), 2), 2), 'минут больше, чем пользователи без подписки') optimal_distance = 3130 alpha = 0.05 results = st.ttest_1samp( data5['distance'], optimal_distance, alternative='less') print('p-значение:', results.pvalue) if (results.pvalue < alpha): print('Отвергаем нулевую гипотезу') else: print('Не отвергаем нулевую гипотезу') print() print('В среднем платные пользователи проезжают', round(data5['distance'].mean(),2), 'метров') ultra = data4_pivot.query('subscription_type == "ultra"') free = data4_pivot.query('subscription_type == "free"') alpha = 0.05 results = st.ttest_ind(ultra['money'],free['money'], equal_var=False, alternative = 'greater') print('p-значение:', results.pvalue) if results.pvalue < alpha: print('Отвергаем нулевую гипотезу') else: print('Не получилось отвергнуть нулевую гипотезу') print() print('В среднем в месяц пользователи с подпиской тратят на аренду самокатов', round(ultra['money'].mean(), 2), 'руб', ', а пользователи без подписки', round(free['money'].mean(), 2), 'руб') print() print('В среднем пользователи с подпиской приносят компании на', round(round(ultra['money'].mean(), 2) - round(free['money'].mean(),2),2), 'руб больше, чем пользователи без платной подписки') Задача 6.4. Комментарий:
Для решения подобной задачи подойдет проверка гипотезы о равенстве средних для зависимых (парных) выборок, поскольку исходный датафрейм (генеральная совокупность) не изменился количественно (количество пользователей осталось прежним), но изменился качественно (появились данные о количестве обращений до и после обновления). Решить такую задачу можно методом scipy.stats.ttest_rel()