- 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. Комментарий:</b>
- <br> Для решения подобной задачи подойдет проверка гипотезы о равенстве средних для зависимых (парных) выборок, поскольку исходный датафрейм (генеральная совокупность) не изменился количественно (количество пользователей осталось прежним), но изменился качественно (появились данные о количестве обращений до и после обновления).
- Решить такую задачу можно методом scipy.stats.ttest_rel()
- </div>